OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All Rights Reserved. | 2 * Copyright (C) 2011 Google Inc. All Rights Reserved. |
3 * Copyright (C) 2012 Apple Inc. All rights reserved. | 3 * Copyright (C) 2012 Apple Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 using namespace HTMLNames; | 57 using namespace HTMLNames; |
58 | 58 |
59 TreeScope::TreeScope(ContainerNode& rootNode, Document& document) | 59 TreeScope::TreeScope(ContainerNode& rootNode, Document& document) |
60 : m_rootNode(&rootNode) | 60 : m_rootNode(&rootNode) |
61 , m_document(&document) | 61 , m_document(&document) |
62 , m_parentTreeScope(&document) | 62 , m_parentTreeScope(&document) |
63 #if !ENABLE(OILPAN) | 63 #if !ENABLE(OILPAN) |
64 , m_guardRefCount(0) | 64 , m_guardRefCount(0) |
65 #endif | 65 #endif |
66 , m_idTargetObserverRegistry(IdTargetObserverRegistry::create()) | 66 , m_idTargetObserverRegistry(IdTargetObserverRegistry::create()) |
| 67 , m_selfOrDescendantsHaveActiveStyleSheets(false) |
67 { | 68 { |
68 ASSERT(rootNode != document); | 69 ASSERT(rootNode != document); |
69 #if !ENABLE(OILPAN) | 70 #if !ENABLE(OILPAN) |
70 m_parentTreeScope->guardRef(); | 71 m_parentTreeScope->guardRef(); |
71 #endif | 72 #endif |
72 m_rootNode->setTreeScope(this); | 73 m_rootNode->setTreeScope(this); |
73 } | 74 } |
74 | 75 |
75 TreeScope::TreeScope(Document& document) | 76 TreeScope::TreeScope(Document& document) |
76 : m_rootNode(document) | 77 : m_rootNode(document) |
77 , m_document(&document) | 78 , m_document(&document) |
78 , m_parentTreeScope(nullptr) | 79 , m_parentTreeScope(nullptr) |
79 #if !ENABLE(OILPAN) | 80 #if !ENABLE(OILPAN) |
80 , m_guardRefCount(0) | 81 , m_guardRefCount(0) |
81 #endif | 82 #endif |
82 , m_idTargetObserverRegistry(IdTargetObserverRegistry::create()) | 83 , m_idTargetObserverRegistry(IdTargetObserverRegistry::create()) |
| 84 , m_selfOrDescendantsHaveActiveStyleSheets(false) |
83 { | 85 { |
84 m_rootNode->setTreeScope(this); | 86 m_rootNode->setTreeScope(this); |
85 } | 87 } |
86 | 88 |
87 TreeScope::~TreeScope() | 89 TreeScope::~TreeScope() |
88 { | 90 { |
89 #if !ENABLE(OILPAN) | 91 #if !ENABLE(OILPAN) |
90 ASSERT(!m_guardRefCount); | 92 ASSERT(!m_guardRefCount); |
91 m_rootNode->setTreeScope(0); | 93 m_rootNode->setTreeScope(0); |
92 | 94 |
93 if (m_selection) { | 95 if (m_selection) { |
94 m_selection->clearTreeScope(); | 96 m_selection->clearTreeScope(); |
95 m_selection = nullptr; | 97 m_selection = nullptr; |
96 } | 98 } |
97 | 99 |
| 100 if (m_selfOrDescendantsHaveActiveStyleSheets) |
| 101 clearSelfOrDescendantsHaveActiveStyleSheets(); |
| 102 |
98 if (m_parentTreeScope) | 103 if (m_parentTreeScope) |
99 m_parentTreeScope->guardDeref(); | 104 m_parentTreeScope->guardDeref(); |
100 #endif | 105 #endif |
101 } | 106 } |
102 | 107 |
103 TreeScope* TreeScope::olderShadowRootOrParentTreeScope() const | 108 TreeScope* TreeScope::olderShadowRootOrParentTreeScope() const |
104 { | 109 { |
105 if (rootNode().isShadowRoot()) { | 110 if (rootNode().isShadowRoot()) { |
106 if (ShadowRoot* olderShadowRoot = toShadowRoot(rootNode()).olderShadowRo
ot()) | 111 if (ShadowRoot* olderShadowRoot = toShadowRoot(rootNode()).olderShadowRo
ot()) |
107 return olderShadowRoot; | 112 return olderShadowRoot; |
(...skipping 22 matching lines...) Expand all Loading... |
130 m_imageMapsByName.clear(); | 135 m_imageMapsByName.clear(); |
131 m_labelsByForAttribute.clear(); | 136 m_labelsByForAttribute.clear(); |
132 } | 137 } |
133 #endif | 138 #endif |
134 | 139 |
135 void TreeScope::setParentTreeScope(TreeScope& newParentScope) | 140 void TreeScope::setParentTreeScope(TreeScope& newParentScope) |
136 { | 141 { |
137 // A document node cannot be re-parented. | 142 // A document node cannot be re-parented. |
138 ASSERT(!rootNode().isDocumentNode()); | 143 ASSERT(!rootNode().isDocumentNode()); |
139 | 144 |
| 145 if (m_selfOrDescendantsHaveActiveStyleSheets) |
| 146 clearSelfOrDescendantsHaveActiveStyleSheets(); |
140 #if !ENABLE(OILPAN) | 147 #if !ENABLE(OILPAN) |
141 newParentScope.guardRef(); | 148 newParentScope.guardRef(); |
142 if (m_parentTreeScope) | 149 if (m_parentTreeScope) |
143 m_parentTreeScope->guardDeref(); | 150 m_parentTreeScope->guardDeref(); |
144 #endif | 151 #endif |
145 m_parentTreeScope = &newParentScope; | 152 m_parentTreeScope = &newParentScope; |
146 setDocument(newParentScope.document()); | 153 setDocument(newParentScope.document()); |
147 } | 154 } |
148 | 155 |
149 ScopedStyleResolver& TreeScope::ensureScopedStyleResolver() | 156 ScopedStyleResolver& TreeScope::ensureScopedStyleResolver() |
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 { | 568 { |
562 for (Element* element = ElementTraversal::firstWithin(rootNode()); element;
element = ElementTraversal::nextIncludingPseudo(*element)) { | 569 for (Element* element = ElementTraversal::firstWithin(rootNode()); element;
element = ElementTraversal::nextIncludingPseudo(*element)) { |
563 for (ShadowRoot* root = element->youngestShadowRoot(); root; root = root
->olderShadowRoot()) | 570 for (ShadowRoot* root = element->youngestShadowRoot(); root; root = root
->olderShadowRoot()) |
564 root->setNeedsStyleRecalcForViewportUnits(); | 571 root->setNeedsStyleRecalcForViewportUnits(); |
565 const ComputedStyle* style = element->computedStyle(); | 572 const ComputedStyle* style = element->computedStyle(); |
566 if (style && style->hasViewportUnits()) | 573 if (style && style->hasViewportUnits()) |
567 element->setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForT
racing::create(StyleChangeReason::ViewportUnits)); | 574 element->setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForT
racing::create(StyleChangeReason::ViewportUnits)); |
568 } | 575 } |
569 } | 576 } |
570 | 577 |
| 578 TreeScopeStyleSheetCollection* TreeScope::styleSheetCollection() |
| 579 { |
| 580 return document().styleEngine().styleSheetCollectionFor(*this); |
| 581 } |
| 582 |
| 583 bool TreeScope::OrderedTreeScopeSet::insert(TreeScope* treeScope) |
| 584 { |
| 585 if (m_treeScopes.isEmpty()) { |
| 586 m_treeScopes.append(treeScope); |
| 587 m_hash.add(treeScope); |
| 588 return true; |
| 589 } |
| 590 if (m_hash.contains(treeScope)) |
| 591 return false; |
| 592 |
| 593 int end = m_treeScopes.size() - 1; |
| 594 int start = 0; |
| 595 int position = 0; |
| 596 unsigned result = 0; |
| 597 |
| 598 while (start <= end) { |
| 599 position = (start + end) / 2; |
| 600 result = m_treeScopes[position]->comparePosition(*treeScope); |
| 601 |
| 602 if (result & Node::DOCUMENT_POSITION_PRECEDING) { |
| 603 end = position - 1; |
| 604 } else { |
| 605 ASSERT(result & Node::DOCUMENT_POSITION_FOLLOWING); |
| 606 start = position + 1; |
| 607 } |
| 608 } |
| 609 |
| 610 if (result & Node::DOCUMENT_POSITION_FOLLOWING) { |
| 611 ++position; |
| 612 ASSERT(static_cast<size_t>(position) == m_treeScopes.size() || (m_treeSc
opes[position]->comparePosition(*treeScope) & Node::DOCUMENT_POSITION_PRECEDING)
); |
| 613 } |
| 614 m_treeScopes.insert(position, treeScope); |
| 615 m_hash.add(treeScope); |
| 616 |
| 617 #if ENABLE(ASSERT) |
| 618 // Check whether m_treeScopes is sorted in document order or not. |
| 619 for (unsigned i = 0; i < m_treeScopes.size() - 1; ++i) { |
| 620 unsigned result = m_treeScopes[i]->comparePosition(*m_treeScopes[i + 1])
; |
| 621 ASSERT(result & Node::DOCUMENT_POSITION_FOLLOWING); |
| 622 } |
| 623 #endif |
| 624 return true; |
| 625 } |
| 626 |
| 627 bool TreeScope::OrderedTreeScopeSet::remove(TreeScope* treeScope) |
| 628 { |
| 629 if (!m_hash.contains(treeScope)) |
| 630 return false; |
| 631 size_t position = m_treeScopes.find(treeScope); |
| 632 m_treeScopes.remove(position); |
| 633 m_hash.remove(treeScope); |
| 634 return true; |
| 635 } |
| 636 |
| 637 DEFINE_TRACE(TreeScope::OrderedTreeScopeSet) |
| 638 { |
| 639 #if ENABLE(OILPAN) |
| 640 visitor->trace(m_treeScopes); |
| 641 visitor->trace(m_hash); |
| 642 #endif |
| 643 } |
| 644 |
| 645 TreeScope::TreeScopesWithActiveStyleSheetsTraversal::TreeScopesWithActiveStyleSh
eetsTraversal(TreeScope& treeScope) |
| 646 : m_current(&treeScope), m_iterator(nullptr), m_end(nullptr) |
| 647 { |
| 648 skipIfNoStyleSheetCollection(); |
| 649 } |
| 650 |
| 651 TreeScope::TreeScopesWithActiveStyleSheetsTraversal::TreeScopesWithActiveStyleSh
eetsTraversal(OrderedTreeScopeSet& treeScopes) |
| 652 : m_current(nullptr), m_iterator(treeScopes.begin()), m_end(treeScopes.end()
) |
| 653 { |
| 654 if (m_iterator != m_end) |
| 655 m_current = *m_iterator; |
| 656 skipIfNoStyleSheetCollection(); |
| 657 } |
| 658 |
| 659 void TreeScope::TreeScopesWithActiveStyleSheetsTraversal::skipIfNoStyleSheetColl
ection() |
| 660 { |
| 661 while (m_current && !m_current->styleSheetCollection()) |
| 662 next(); |
| 663 } |
| 664 |
| 665 void TreeScope::TreeScopesWithActiveStyleSheetsTraversal::nextWithStyleSheetColl
ection() |
| 666 { |
| 667 do { |
| 668 next(); |
| 669 } while (m_current && !m_current->styleSheetCollection()); |
| 670 } |
| 671 |
| 672 void TreeScope::TreeScopesWithActiveStyleSheetsTraversal::next() |
| 673 { |
| 674 if (!m_current) |
| 675 return; |
| 676 |
| 677 OrderedTreeScopeSet& children = m_current->m_childTreeScopesWithActiveStyleS
heets; |
| 678 if (!children.isEmpty()) { |
| 679 if (m_iterator) { |
| 680 ++m_iterator; |
| 681 if (m_iterator != m_end) |
| 682 m_stack.append(std::make_pair(m_iterator, m_end)); |
| 683 } |
| 684 m_iterator = children.begin(); |
| 685 m_end = children.end(); |
| 686 ASSERT(m_iterator != m_end); |
| 687 m_current = *m_iterator; |
| 688 return; |
| 689 } |
| 690 |
| 691 if (!m_iterator) { |
| 692 m_current = nullptr; |
| 693 return; |
| 694 } |
| 695 |
| 696 ++m_iterator; |
| 697 if (m_iterator != m_end) { |
| 698 m_current = *m_iterator; |
| 699 return; |
| 700 } |
| 701 |
| 702 if (m_stack.isEmpty()) { |
| 703 m_current = nullptr; |
| 704 return; |
| 705 } |
| 706 |
| 707 m_iterator = m_stack.last().first; |
| 708 m_end = m_stack.last().second; |
| 709 ASSERT(m_iterator != m_end); |
| 710 m_stack.removeLast(); |
| 711 m_current = *m_iterator; |
| 712 } |
| 713 |
| 714 DEFINE_TRACE(TreeScope::TreeScopesWithActiveStyleSheetsTraversal) |
| 715 { |
| 716 #if ENABLE(OILPAN) |
| 717 visitor->trace(m_current); |
| 718 visitor->trace(m_iterator); |
| 719 visitor->trace(m_end); |
| 720 visitor->trace(m_stack); |
| 721 #endif |
| 722 } |
| 723 |
| 724 void TreeScope::setSelfOrDescendantsHaveActiveStyleSheets() |
| 725 { |
| 726 ASSERT(this != m_document); |
| 727 for (TreeScope* treeScope = this;;) { |
| 728 TreeScope* parent = treeScope->parentTreeScope(); |
| 729 if (!parent) |
| 730 break; |
| 731 parent->m_childTreeScopesWithActiveStyleSheets.insert(treeScope); |
| 732 treeScope->m_selfOrDescendantsHaveActiveStyleSheets= true; |
| 733 |
| 734 // Make sure to include parents so that we can traverse to this from the
root treeScope. |
| 735 treeScope = parent; |
| 736 if (treeScope->m_selfOrDescendantsHaveActiveStyleSheets) |
| 737 break; |
| 738 } |
| 739 } |
| 740 |
| 741 void TreeScope::clearSelfOrDescendantsHaveActiveStyleSheets() |
| 742 { |
| 743 ASSERT(this != m_document); |
| 744 ASSERT(parentTreeScope()); |
| 745 ASSERT(m_selfOrDescendantsHaveActiveStyleSheets); |
| 746 for (TreeScope* treeScope = this;;) { |
| 747 TreeScope* parent = treeScope->parentTreeScope(); |
| 748 if (!parent) |
| 749 break; |
| 750 parent->m_childTreeScopesWithActiveStyleSheets.remove(treeScope); |
| 751 treeScope->m_selfOrDescendantsHaveActiveStyleSheets = false; |
| 752 |
| 753 // Remove parents if they were included only to traverse to this. |
| 754 treeScope = parent; |
| 755 if (!treeScope->m_selfOrDescendantsHaveActiveStyleSheets || !treeScope->
m_childTreeScopesWithActiveStyleSheets.isEmpty()) |
| 756 break; |
| 757 } |
| 758 } |
| 759 |
571 DEFINE_TRACE(TreeScope) | 760 DEFINE_TRACE(TreeScope) |
572 { | 761 { |
573 visitor->trace(m_rootNode); | 762 visitor->trace(m_rootNode); |
574 visitor->trace(m_document); | 763 visitor->trace(m_document); |
575 visitor->trace(m_parentTreeScope); | 764 visitor->trace(m_parentTreeScope); |
576 visitor->trace(m_idTargetObserverRegistry); | 765 visitor->trace(m_idTargetObserverRegistry); |
577 visitor->trace(m_selection); | 766 visitor->trace(m_selection); |
578 visitor->trace(m_elementsById); | 767 visitor->trace(m_elementsById); |
579 visitor->trace(m_imageMapsByName); | 768 visitor->trace(m_imageMapsByName); |
580 visitor->trace(m_labelsByForAttribute); | 769 visitor->trace(m_labelsByForAttribute); |
581 visitor->trace(m_scopedStyleResolver); | 770 visitor->trace(m_scopedStyleResolver); |
| 771 visitor->trace(m_childTreeScopesWithActiveStyleSheets); |
582 } | 772 } |
583 | 773 |
584 } // namespace blink | 774 } // namespace blink |
OLD | NEW |