Changeset 238404 in webkit
- Timestamp:
- Nov 20, 2018 8:17:44 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r238403 r238404 1 2018-11-20 Antti Koivisto <antti@apple.com> 2 3 Update hover state in composed tree 4 https://bugs.webkit.org/show_bug.cgi?id=191860 5 6 Reviewed by Zalan Bujtas. 7 8 The code was already mostly switched over from render tree to composed tree. 9 This patch replaces the remaining common ancestor search code with a DOM based equivalent. 10 11 * dom/Document.cpp: 12 (WebCore::findNearestCommonComposedAncestor): 13 (WebCore::Document::updateHoverActiveState): 14 (WebCore::nearestCommonHoverAncestor): Deleted. 15 * rendering/RenderBlock.cpp: 16 (WebCore::RenderBlock::hoverAncestor const): Deleted. 17 * rendering/RenderBlock.h: 18 * rendering/RenderElement.cpp: 19 (WebCore::RenderElement::hoverAncestor const): Deleted. 20 21 No longer needed. 22 23 * rendering/RenderElement.h: 24 1 25 2018-11-20 Zalan Bujtas <zalan@apple.com> 2 26 -
trunk/Source/WebCore/dom/Document.cpp
r238377 r238404 7137 7137 } 7138 7138 7139 static RenderElement* nearestCommonHoverAncestor(RenderElement* obj1, RenderElement* obj2)7140 { 7141 if (! obj1 || !obj2)7139 static Element* findNearestCommonComposedAncestor(Element* elementA, Element* elementB) 7140 { 7141 if (!elementA || !elementB) 7142 7142 return nullptr; 7143 7143 7144 for (RenderElement* currObj1 = obj1; currObj1; currObj1 = currObj1->hoverAncestor()) { 7145 for (RenderElement* currObj2 = obj2; currObj2; currObj2 = currObj2->hoverAncestor()) { 7146 if (currObj1 == currObj2) 7147 return currObj1; 7148 } 7149 } 7150 7144 if (elementA == elementB) 7145 return elementA; 7146 7147 HashSet<Element*> ancestorChain; 7148 for (auto* element = elementA; element; element = element->parentElementInComposedTree()) 7149 ancestorChain.add(element); 7150 7151 for (auto* element = elementB; element; element = element->parentElementInComposedTree()) { 7152 if (ancestorChain.contains(element)) 7153 return element; 7154 } 7151 7155 return nullptr; 7152 7156 } … … 7209 7213 m_hoveredElement = newHoveredElement; 7210 7214 7211 // We have two different objects. Fetch their renderers. 7212 RenderElement* oldHoverObj = oldHoveredElement ? oldHoveredElement->renderer() : nullptr; 7213 RenderElement* newHoverObj = newHoveredElement ? newHoveredElement->renderer() : nullptr; 7214 7215 // Locate the common ancestor render object for the two renderers. 7216 RenderElement* ancestor = nearestCommonHoverAncestor(oldHoverObj, newHoverObj); 7215 auto* commonAncestor = findNearestCommonComposedAncestor(oldHoveredElement.get(), newHoveredElement); 7217 7216 7218 7217 Vector<RefPtr<Element>, 32> elementsToRemoveFromChain; 7219 7218 Vector<RefPtr<Element>, 32> elementsToAddToChain; 7220 7219 7221 if (oldHover Obj != newHoverObj) {7220 if (oldHoveredElement != newHoveredElement) { 7222 7221 for (auto* element = oldHoveredElement.get(); element; element = element->parentElementInComposedTree()) { 7223 if ( ancestor && ancestor->element() == element)7222 if (element == commonAncestor) 7224 7223 break; 7225 7224 if (!mustBeInActiveChain || element->inActiveChain()) … … 7228 7227 // Unset hovered nodes in sub frame documents if the old hovered node was a frame owner. 7229 7228 if (is<HTMLFrameOwnerElement>(oldHoveredElement)) { 7230 if ( Document* contentDocument = downcast<HTMLFrameOwnerElement>(*oldHoveredElement).contentDocument())7229 if (auto* contentDocument = downcast<HTMLFrameOwnerElement>(*oldHoveredElement).contentDocument()) 7231 7230 contentDocument->updateHoverActiveState(request, nullptr); 7232 7231 } … … 7245 7244 if (allowActiveChanges) 7246 7245 element->setActive(true); 7247 if ( ancestor && element == ancestor->element())7246 if (element == commonAncestor) 7248 7247 sawCommonAncestor = true; 7249 7248 if (!sawCommonAncestor) { -
trunk/Source/WebCore/rendering/RenderBlock.cpp
r238359 r238404 2782 2782 } 2783 2783 2784 RenderElement* RenderBlock::hoverAncestor() const2785 {2786 if (auto* continuation = this->continuation())2787 return continuation;2788 return RenderBox::hoverAncestor();2789 }2790 2791 2784 void RenderBlock::updateDragState(bool dragOn) 2792 2785 { -
trunk/Source/WebCore/rendering/RenderBlock.h
r235358 r238404 458 458 const RenderStyle& outlineStyleForRepaint() const final; 459 459 460 RenderElement* hoverAncestor() const final;461 460 void updateDragState(bool dragOn) final; 462 461 -
trunk/Source/WebCore/rendering/RenderElement.cpp
r238071 r238404 975 975 } 976 976 977 RenderElement* RenderElement::hoverAncestor() const978 {979 return parent();980 }981 982 977 static inline void paintPhase(RenderElement& element, PaintPhase phase, PaintInfo& paintInfo, const LayoutPoint& childPoint) 983 978 { -
trunk/Source/WebCore/rendering/RenderElement.h
r232229 r238404 98 98 RenderLayer* findNextLayer(RenderLayer* parentLayer, RenderObject* startPoint, bool checkParent = true); 99 99 100 virtual RenderElement* hoverAncestor() const;101 102 100 virtual void dirtyLinesFromChangedChild(RenderObject&) { } 103 101
Note: See TracChangeset
for help on using the changeset viewer.