Changeset 191112 in webkit
- Timestamp:
- Oct 15, 2015 8:12:39 AM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 1 added
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r191084 r191112 1 2015-10-15 Antti Koivisto <antti@apple.com> 2 3 Implement iterator for traversing composed ancestors 4 https://bugs.webkit.org/show_bug.cgi?id=150162 5 6 Reviewed by Andreas Kling. 7 8 The existing general purpose ComposedTreeIterator can traverse parent chain but not efficiently 9 (since it builds stack). Add a separate stackless iterator for ancestor chain traversal. 10 11 * WebCore.xcodeproj/project.pbxproj: 12 * dom/ComposedTreeAncestorIterator.h: Added. 13 (WebCore::ComposedTreeAncestorIterator::operator*): 14 (WebCore::ComposedTreeAncestorIterator::operator->): 15 (WebCore::ComposedTreeAncestorIterator::operator==): 16 (WebCore::ComposedTreeAncestorIterator::operator!=): 17 (WebCore::ComposedTreeAncestorIterator::operator++): 18 (WebCore::ComposedTreeAncestorIterator::get): 19 (WebCore::ComposedTreeAncestorIterator::ComposedTreeAncestorIterator): 20 (WebCore::ComposedTreeAncestorIterator::traverseParent): 21 (WebCore::ComposedTreeAncestorAdapter::ComposedTreeAncestorAdapter): 22 (WebCore::ComposedTreeAncestorAdapter::begin): 23 (WebCore::ComposedTreeAncestorAdapter::end): 24 (WebCore::ComposedTreeAncestorAdapter::first): 25 (WebCore::composedTreeAncestors): 26 * dom/ComposedTreeIterator.h: 27 * dom/ContainerNode.h: 28 (WebCore::Node::highestAncestor): 29 (WebCore::Node::isTreeScope): 30 (WebCore::Node::needsNodeRenderingTraversalSlowPath): Deleted. 31 32 With NodeRenderingTraversal::parent removed this bit is no longer used. 33 34 * dom/Element.cpp: 35 (WebCore::Element::shadowRoot): 36 (WebCore::Element::addShadowRoot): 37 (WebCore::shouldUseNodeRenderingTraversalSlowPath): Deleted. 38 (WebCore::Element::resetNeedsNodeRenderingTraversalSlowPath): Deleted. 39 * dom/Element.h: 40 (WebCore::Element::didAddUserAgentShadowRoot): 41 (WebCore::Element::alwaysCreateUserAgentShadowRoot): 42 * dom/Node.cpp: 43 (WebCore::Node::derefEventTarget): 44 (WebCore::Node::updateAncestorsForStyleRecalc): 45 (WebCore::traverseStyleParent): Deleted. 46 (WebCore::traverseFirstStyleParent): Deleted. 47 48 Switch to iterator interface. 49 50 * dom/Node.h: 51 (WebCore::Node::isDocumentFragment): 52 (WebCore::Node::isShadowRoot): 53 (WebCore::Node::isNamedFlowContentNode): 54 (WebCore::Node::hasCustomStyleResolveCallbacks): 55 (WebCore::Node::setHasCustomStyleResolveCallbacks): 56 (WebCore::Node::setTreeScope): 57 (WebCore::Node::setStyleChange): 58 (WebCore::Node::setNeedsNodeRenderingTraversalSlowPath): Deleted. 59 * dom/NodeRenderingTraversal.cpp: 60 (WebCore::NodeRenderingTraversal::traverseParent): 61 (WebCore::NodeRenderingTraversal::traverseFirstChild): 62 (WebCore::NodeRenderingTraversal::traverseLastChild): 63 (WebCore::NodeRenderingTraversal::traversePreviousSibling): 64 (WebCore::NodeRenderingTraversal::nextInScope): 65 (WebCore::NodeRenderingTraversal::previousInScope): 66 (WebCore::NodeRenderingTraversal::parentInScope): 67 (WebCore::NodeRenderingTraversal::lastChildInScope): 68 (WebCore::NodeRenderingTraversal::parentSlow): Deleted. 69 * dom/NodeRenderingTraversal.h: 70 (WebCore::NodeRenderingTraversal::parent): Deleted. 71 72 No longer used. 73 74 * html/HTMLSummaryElement.cpp: 75 * rendering/RenderNamedFlowThread.cpp: 76 (WebCore::RenderNamedFlowThread::isChildAllowed): 77 78 Switch to iterator interface. 79 80 * style/RenderTreePosition.cpp: 81 * style/StyleResolveTree.cpp: 82 (WebCore::Style::updateTextRendererAfterContentChange): 83 84 Switch to iterator interface. 85 1 86 2015-10-14 Zhuo Li <zachli@apple.com> 2 87 -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r191084 r191112 6472 6472 E4B65A5C132FACB00070E7BE /* LegacyTileLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = E4B65A5B132FACB00070E7BE /* LegacyTileLayer.h */; }; 6473 6473 E4B65A5E132FADB60070E7BE /* LegacyTileLayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4B65A5D132FADB60070E7BE /* LegacyTileLayer.mm */; }; 6474 E4BA50901BCFBD9500E34EF7 /* ComposedTreeAncestorIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = E4BA508F1BCFBD9500E34EF7 /* ComposedTreeAncestorIterator.h */; settings = {ASSET_TAGS = (); }; }; 6474 6475 E4BBED0E14F4025D003F0B98 /* PropertySetCSSStyleDeclaration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4BBED0C14F4025D003F0B98 /* PropertySetCSSStyleDeclaration.cpp */; }; 6475 6476 E4BBED0F14F4025D003F0B98 /* PropertySetCSSStyleDeclaration.h in Headers */ = {isa = PBXBuildFile; fileRef = E4BBED0D14F4025D003F0B98 /* PropertySetCSSStyleDeclaration.h */; }; … … 14311 14312 E4B65A5B132FACB00070E7BE /* LegacyTileLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LegacyTileLayer.h; sourceTree = "<group>"; }; 14312 14313 E4B65A5D132FADB60070E7BE /* LegacyTileLayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LegacyTileLayer.mm; sourceTree = "<group>"; }; 14314 E4BA508F1BCFBD9500E34EF7 /* ComposedTreeAncestorIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ComposedTreeAncestorIterator.h; sourceTree = "<group>"; }; 14313 14315 E4BBED0C14F4025D003F0B98 /* PropertySetCSSStyleDeclaration.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PropertySetCSSStyleDeclaration.cpp; sourceTree = "<group>"; }; 14314 14316 E4BBED0D14F4025D003F0B98 /* PropertySetCSSStyleDeclaration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PropertySetCSSStyleDeclaration.h; sourceTree = "<group>"; }; … … 23536 23538 6550B698099DF0270090D781 /* Comment.h */, 23537 23539 85089CC70A98C22600A275AA /* Comment.idl */, 23540 E4BA508F1BCFBD9500E34EF7 /* ComposedTreeAncestorIterator.h */, 23538 23541 E44FA1861BCA91560091B6EF /* ComposedTreeIterator.cpp */, 23539 23542 E44FA1841BCA6B5A0091B6EF /* ComposedTreeIterator.h */, … … 24670 24673 FBD6AF8815EF25C9008B7110 /* CSSBasicShapes.h in Headers */, 24671 24674 E16A84FA14C85CCC002977DF /* CSSBorderImage.h in Headers */, 24675 E4BA50901BCFBD9500E34EF7 /* ComposedTreeAncestorIterator.h in Headers */, 24672 24676 BC274B2F140EBEB200EADFA6 /* CSSBorderImageSliceValue.h in Headers */, 24673 24677 49AE2D8F134EE50C0072920A /* CSSCalculationValue.h in Headers */, … … 25573 25577 5185FCB91BB4CBF80012898F /* IDBConnectionToClient.h in Headers */, 25574 25578 516D7D721BB5F0BD00AF7C77 /* IDBConnectionToClientDelegate.h in Headers */, 25575 5185FC5B1BB4BE4C0012898F /* IDBConnectionToServer.h in Headers */,25576 25579 516D7D701BB5F0BD00AF7C77 /* IDBConnectionToServerDelegate.h in Headers */, 25577 25580 5185FC7B1BB4C4E80012898F /* IDBCursor.h in Headers */, … … 29167 29170 C585A66211D4FAC5004C3E4B /* IDBBindingUtilities.cpp in Sources */, 29168 29171 516D7D711BB5F0BD00AF7C77 /* IDBConnectionToClient.cpp in Sources */, 29169 516D7D6F1BB5F0BD00AF7C77 /* IDBConnectionToServer.cpp in Sources */,29170 29172 5185FC7A1BB4C4E80012898F /* IDBCursor.cpp in Sources */, 29171 29173 51F41A691BA73B5B002E053B /* IDBCursorBackend.cpp in Sources */, … … 31097 31099 CDC69DD71632026C007C38DF /* WebCoreFullScreenWarningView.mm in Sources */, 31098 31100 CD127DED14F3097D00E84779 /* WebCoreFullScreenWindow.mm in Sources */, 31099 411A90421BBAB47A000CF156 /* WebCoreJSBuiltins.cpp in Sources */,31100 31101 3140379C124BEA7F00AF40E4 /* WebCoreMotionManager.mm in Sources */, 31101 31102 934D9BA50B8C116B007B42A9 /* WebCoreNSStringExtras.mm in Sources */, -
trunk/Source/WebCore/dom/ComposedTreeIterator.h
r190983 r191112 24 24 */ 25 25 26 #include "HTMLSlotElement.h"27 26 #include "NodeTraversal.h" 28 27 #include "ShadowRoot.h" -
trunk/Source/WebCore/dom/ContainerNode.h
r190229 r191112 229 229 } 230 230 231 inline bool Node::needsNodeRenderingTraversalSlowPath() const232 {233 if (getFlag(NeedsNodeRenderingTraversalSlowPathFlag))234 return true;235 ContainerNode* parent = parentOrShadowHostNode();236 return parent && parent->getFlag(NeedsNodeRenderingTraversalSlowPathFlag);237 }238 239 231 inline bool Node::isTreeScope() const 240 232 { -
trunk/Source/WebCore/dom/Element.cpp
r190995 r191112 1620 1620 } 1621 1621 1622 static bool shouldUseNodeRenderingTraversalSlowPath(const Element& element)1623 {1624 return element.isShadowRoot() || element.shadowRoot();1625 }1626 1627 void Element::resetNeedsNodeRenderingTraversalSlowPath()1628 {1629 setNeedsNodeRenderingTraversalSlowPath(shouldUseNodeRenderingTraversalSlowPath(*this));1630 }1631 1622 1632 1623 void Element::addShadowRoot(Ref<ShadowRoot>&& newShadowRoot) … … 1644 1635 for (auto& target : postInsertionNotificationTargets) 1645 1636 target->finishedInsertingSubtree(); 1646 1647 resetNeedsNodeRenderingTraversalSlowPath();1648 1637 1649 1638 setNeedsStyleRecalc(ReconstructRenderTree); -
trunk/Source/WebCore/dom/Element.h
r189987 r191112 520 520 bool isUserActionElementHovered() const; 521 521 522 void resetNeedsNodeRenderingTraversalSlowPath();523 524 522 virtual void didAddUserAgentShadowRoot(ShadowRoot*) { } 525 523 virtual bool alwaysCreateUserAgentShadowRoot() const { return false; } -
trunk/Source/WebCore/dom/Node.cpp
r190995 r191112 32 32 #include "Chrome.h" 33 33 #include "ChromeClient.h" 34 #include "ComposedTreeAncestorIterator.h" 34 35 #include "ContainerNodeAlgorithms.h" 35 36 #include "ContextMenuController.h" … … 741 742 } 742 743 743 // FIXME: Factor into iterator.744 static ContainerNode* traverseStyleParent(Node& node)745 {746 auto* parent = node.parentNode();747 if (!parent) {748 if (is<ShadowRoot>(node))749 return downcast<ShadowRoot>(node).host();750 return nullptr;751 }752 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT)753 if (auto* shadowRoot = parent->shadowRoot()) {754 if (auto* assignedSlot = shadowRoot->findAssignedSlot(node))755 return assignedSlot;756 }757 #endif758 return parent;759 }760 761 static ContainerNode* traverseFirstStyleParent(Node& node)762 {763 if (is<PseudoElement>(node))764 return downcast<PseudoElement>(node).hostElement();765 return traverseStyleParent(node);766 }767 768 744 inline void Node::updateAncestorsForStyleRecalc() 769 745 { 770 if (auto* ancestor = traverseFirstStyleParent(*this)) { 771 ancestor->setDirectChildNeedsStyleRecalc(); 772 773 if (is<Element>(*ancestor) && downcast<Element>(*ancestor).childrenAffectedByPropertyBasedBackwardPositionalRules()) { 774 if (ancestor->styleChangeType() < FullStyleChange) 775 ancestor->setStyleChange(FullStyleChange); 776 } 777 778 for (; ancestor; ancestor = traverseStyleParent(*ancestor)) { 779 if (ancestor->childNeedsStyleRecalc()) 746 auto composedAncestors = composedTreeAncestors(*this); 747 auto it = composedAncestors.begin(); 748 auto end = composedAncestors.end(); 749 if (it != end) { 750 it->setDirectChildNeedsStyleRecalc(); 751 752 if (is<Element>(*it) && downcast<Element>(*it).childrenAffectedByPropertyBasedBackwardPositionalRules()) { 753 if (it->styleChangeType() < FullStyleChange) 754 it->setStyleChange(FullStyleChange); 755 } 756 757 for (; it != end; ++it) { 758 // Iterator skips over shadow roots. 759 if (auto* shadowRoot = it->shadowRoot()) 760 shadowRoot->setChildNeedsStyleRecalc(); 761 if (it->childNeedsStyleRecalc()) 780 762 break; 781 ancestor->setChildNeedsStyleRecalc();763 it->setChildNeedsStyleRecalc(); 782 764 } 783 765 } -
trunk/Source/WebCore/dom/Node.h
r190845 r191112 268 268 bool isShadowRoot() const { return isDocumentFragment() && isTreeScope(); } 269 269 270 bool needsNodeRenderingTraversalSlowPath() const;271 272 270 bool isNamedFlowContentNode() const { return getFlag(IsNamedFlowContentNodeFlag); } 273 271 bool hasCustomStyleResolveCallbacks() const { return getFlag(HasCustomStyleResolveCallbacksFlag); } … … 618 616 HasCustomStyleResolveCallbacksFlag = 1 << 20, 619 617 HasEventTargetDataFlag = 1 << 21, 620 NeedsNodeRenderingTraversalSlowPathFlag= 1 << 22,618 // HeyItIsAFreeBit = 1 << 22, 621 619 IsInShadowTreeFlag = 1 << 23, 622 620 IsMathMLFlag = 1 << 24, … … 645 643 CreateContainer = DefaultNodeFlags | IsContainerFlag, 646 644 CreateElement = CreateContainer | IsElementFlag, 647 CreatePseudoElement = CreateElement | InDocumentFlag | NeedsNodeRenderingTraversalSlowPathFlag,648 CreateShadowRoot = CreateContainer | IsDocumentFragmentFlag | NeedsNodeRenderingTraversalSlowPathFlag |IsInShadowTreeFlag,645 CreatePseudoElement = CreateElement | InDocumentFlag, 646 CreateShadowRoot = CreateContainer | IsDocumentFragmentFlag | IsInShadowTreeFlag, 649 647 CreateDocumentFragment = CreateContainer | IsDocumentFragmentFlag, 650 648 CreateStyledElement = CreateElement | IsStyledElementFlag, … … 670 668 671 669 void setHasCustomStyleResolveCallbacks() { setFlag(true, HasCustomStyleResolveCallbacksFlag); } 672 673 void setNeedsNodeRenderingTraversalSlowPath(bool flag) { setFlag(flag, NeedsNodeRenderingTraversalSlowPathFlag); }674 670 675 671 void setTreeScope(TreeScope& scope) { m_treeScope = &scope; } -
trunk/Source/WebCore/dom/NodeRenderingTraversal.cpp
r190983 r191112 35 35 namespace NodeRenderingTraversal { 36 36 37 enum ShadowRootCrossing { CrossShadowRoot, DontCrossShadowRoot }; 38 39 static ContainerNode* traverseParent(const Node* node, ShadowRootCrossing shadowRootCrossing) 37 static ContainerNode* traverseParent(const Node* node) 40 38 { 41 if ( shadowRootCrossing == DontCrossShadowRoot &&node->isShadowRoot())39 if (node->isShadowRoot()) 42 40 return nullptr; 43 41 … … 46 44 return nullptr; 47 45 48 if (!parent)49 return nullptr;50 51 if (is<ShadowRoot>(*parent))52 return shadowRootCrossing == CrossShadowRoot ? downcast<ShadowRoot>(parent)->host() : parent;53 54 46 return parent; 55 47 } 56 48 57 static Node* traverseFirstChild(const Node* node , ShadowRootCrossing shadowRootCrossing)49 static Node* traverseFirstChild(const Node* node) 58 50 { 59 51 ASSERT(node); 60 if (node->shadowRoot()) { 61 if (shadowRootCrossing == DontCrossShadowRoot) 62 return nullptr; 63 node = node->shadowRoot(); 64 } 52 if (node->shadowRoot()) 53 return nullptr; 65 54 return node->firstChild(); 66 55 } 67 56 68 static Node* traverseLastChild(const Node* node , ShadowRootCrossing shadowRootCrossing)57 static Node* traverseLastChild(const Node* node) 69 58 { 70 59 ASSERT(node); 71 if (node->shadowRoot()) { 72 if (shadowRootCrossing == DontCrossShadowRoot) 73 return nullptr; 74 node = node->shadowRoot(); 75 } 60 if (node->shadowRoot()) 61 return nullptr; 76 62 return node->lastChild(); 77 63 } … … 89 75 } 90 76 91 ContainerNode* parentSlow(const Node* node)92 {93 ASSERT(!node->isShadowRoot());94 95 return traverseParent(node, CrossShadowRoot);96 }97 98 77 Node* nextInScope(const Node* node) 99 78 { 100 if (Node* next = traverseFirstChild(node , DontCrossShadowRoot))79 if (Node* next = traverseFirstChild(node)) 101 80 return next; 102 81 if (Node* next = traverseNextSibling(node)) … … 104 83 const Node* current = node; 105 84 while (current && !traverseNextSibling(current)) 106 current = traverseParent(current , DontCrossShadowRoot);85 current = traverseParent(current); 107 86 return current ? traverseNextSibling(current) : 0; 108 87 } … … 111 90 { 112 91 if (Node* current = traversePreviousSibling(node)) { 113 while (Node* child = traverseLastChild(current , DontCrossShadowRoot))92 while (Node* child = traverseLastChild(current)) 114 93 current = child; 115 94 return current; 116 95 } 117 return traverseParent(node , DontCrossShadowRoot);96 return traverseParent(node); 118 97 } 119 98 120 99 Node* parentInScope(const Node* node) 121 100 { 122 return traverseParent(node , DontCrossShadowRoot);101 return traverseParent(node); 123 102 } 124 103 125 104 Node* lastChildInScope(const Node* node) 126 105 { 127 return traverseLastChild(node , DontCrossShadowRoot);106 return traverseLastChild(node); 128 107 } 129 108 -
trunk/Source/WebCore/dom/NodeRenderingTraversal.h
r190983 r191112 35 35 namespace NodeRenderingTraversal { 36 36 37 ContainerNode* parent(const Node*);38 39 37 Node* nextInScope(const Node*); 40 38 Node* previousInScope(const Node*); 41 39 Node* parentInScope(const Node*); 42 40 Node* lastChildInScope(const Node*); 43 44 ContainerNode* parentSlow(const Node*);45 46 inline ContainerNode* parent(const Node* node)47 {48 ASSERT(!node->isPseudoElement());49 if (node->needsNodeRenderingTraversalSlowPath())50 return parentSlow(node);51 52 ASSERT(node->parentNode() == parentSlow(node));53 return node->parentNodeGuaranteedHostFree();54 }55 41 56 42 } -
trunk/Source/WebCore/html/HTMLSummaryElement.cpp
r190840 r191112 29 29 #include "KeyboardEvent.h" 30 30 #include "MouseEvent.h" 31 #include "NodeRenderingTraversal.h"32 31 #include "PlatformMouseEvent.h" 33 32 #include "RenderBlockFlow.h" -
trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp
r189182 r191112 27 27 #include "RenderNamedFlowThread.h" 28 28 29 #include "ComposedTreeAncestorIterator.h" 29 30 #include "ExceptionCodePlaceholder.h" 30 31 #include "FlowThreadController.h" 31 32 #include "InlineTextBox.h" 32 33 #include "InspectorInstrumentation.h" 33 #include "NodeRenderingTraversal.h"34 34 #include "NodeTraversal.h" 35 35 #include "Position.h" … … 548 548 ASSERT(is<Element>(*child.node())); 549 549 550 Node* originalParent = NodeRenderingTraversal::parent(child.node());550 auto* originalParent = composedTreeAncestors(*child.node()).first(); 551 551 if (!is<Element>(originalParent) || !originalParent->renderer()) 552 552 return true; -
trunk/Source/WebCore/style/RenderTreePosition.cpp
r190983 r191112 28 28 29 29 #include "ComposedTreeIterator.h" 30 #include "NodeRenderingTraversal.h"31 30 #include "PseudoElement.h" 32 31 #include "RenderObject.h" -
trunk/Source/WebCore/style/StyleResolveTree.cpp
r190983 r191112 31 31 #include "AuthorStyleSheets.h" 32 32 #include "CSSFontSelector.h" 33 #include "ComposedTreeAncestorIterator.h" 33 34 #include "ComposedTreeIterator.h" 34 35 #include "ElementIterator.h" … … 40 41 #include "MainFrame.h" 41 42 #include "NodeRenderStyle.h" 42 #include "NodeRenderingTraversal.h"43 43 #include "NodeTraversal.h" 44 44 #include "PlatformStrategies.h" … … 328 328 void updateTextRendererAfterContentChange(Text& textNode, unsigned offsetOfReplacedData, unsigned lengthOfReplacedData) 329 329 { 330 ContainerNode* renderingParentNode = NodeRenderingTraversal::parent(&textNode);330 auto* renderingParentNode = composedTreeAncestors(textNode).first(); 331 331 if (!renderingParentNode || !renderingParentNode->renderer()) 332 332 return;
Note: See TracChangeset
for help on using the changeset viewer.