Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(248)

Side by Side Diff: Source/core/dom/TreeScope.cpp

Issue 1131493008: WIP: Move StyleEngine::m_activeTreeScopes to TreeScope::m_childTreeScopesWithActiveStyleSheets (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Skip TreeScopes without styleSheetCollection Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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_inActiveStyleSheetsTraversal(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_inActiveStyleSheetsTraversal(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_inActiveStyleSheetsTraversal)
101 removeFromActiveStyleSheetsTraversal();
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
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_inActiveStyleSheetsTraversal)
146 removeFromActiveStyleSheetsTraversal();
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
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::insertToActiveStyleSheetsTraversal()
kochi 2015/05/26 01:52:34 nit: insertToActiveStyleSheetsTraversal() sounds a
kojii 2015/05/26 05:21:58 Changed to setSelfOrDescendantsHaveActiveStyleShee
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_inActiveStyleSheetsTraversal = true;
kochi 2015/05/26 01:52:34 nit: maybe m_hasActiveStyleSheets? This also soun
kojii 2015/05/26 05:21:58 Changed to m_selfOrDescendantsHaveActiveStyleSheet
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_inActiveStyleSheetsTraversal)
737 break;
738 }
739 }
740
741 void TreeScope::removeFromActiveStyleSheetsTraversal()
kochi 2015/05/26 01:52:34 nit: ditto as insertToActiveStyleSheetsTraversal()
kojii 2015/05/26 05:21:58 Done.
742 {
743 ASSERT(this != m_document);
744 ASSERT(parentTreeScope());
745 ASSERT(m_inActiveStyleSheetsTraversal);
746 for (TreeScope* treeScope = this;;) {
747 TreeScope* parent = treeScope->parentTreeScope();
748 if (!parent)
749 break;
750 parent->m_childTreeScopesWithActiveStyleSheets.remove(treeScope);
751 treeScope->m_inActiveStyleSheetsTraversal = false;
752
753 // Remove parents if they were included only to traverse to this.
754 treeScope = parent;
755 if (!treeScope->m_inActiveStyleSheetsTraversal || !treeScope->m_childTre eScopesWithActiveStyleSheets.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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698