Title: [238404] trunk/Source/WebCore
Revision
238404
Author
an...@apple.com
Date
2018-11-20 08:17:44 -0800 (Tue, 20 Nov 2018)

Log Message

Update hover state in composed tree
https://bugs.webkit.org/show_bug.cgi?id=191860

Reviewed by Zalan Bujtas.

The code was already mostly switched over from render tree to composed tree.
This patch replaces the remaining common ancestor search code with a DOM based equivalent.

* dom/Document.cpp:
(WebCore::findNearestCommonComposedAncestor):
(WebCore::Document::updateHoverActiveState):
(WebCore::nearestCommonHoverAncestor): Deleted.
* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::hoverAncestor const): Deleted.
* rendering/RenderBlock.h:
* rendering/RenderElement.cpp:
(WebCore::RenderElement::hoverAncestor const): Deleted.

No longer needed.

* rendering/RenderElement.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (238403 => 238404)


--- trunk/Source/WebCore/ChangeLog	2018-11-20 15:56:57 UTC (rev 238403)
+++ trunk/Source/WebCore/ChangeLog	2018-11-20 16:17:44 UTC (rev 238404)
@@ -1,3 +1,27 @@
+2018-11-20  Antti Koivisto  <an...@apple.com>
+
+        Update hover state in composed tree
+        https://bugs.webkit.org/show_bug.cgi?id=191860
+
+        Reviewed by Zalan Bujtas.
+
+        The code was already mostly switched over from render tree to composed tree.
+        This patch replaces the remaining common ancestor search code with a DOM based equivalent.
+
+        * dom/Document.cpp:
+        (WebCore::findNearestCommonComposedAncestor):
+        (WebCore::Document::updateHoverActiveState):
+        (WebCore::nearestCommonHoverAncestor): Deleted.
+        * rendering/RenderBlock.cpp:
+        (WebCore::RenderBlock::hoverAncestor const): Deleted.
+        * rendering/RenderBlock.h:
+        * rendering/RenderElement.cpp:
+        (WebCore::RenderElement::hoverAncestor const): Deleted.
+
+        No longer needed.
+
+        * rendering/RenderElement.h:
+
 2018-11-20  Zalan Bujtas  <za...@apple.com>
 
         [LFC][IFC] Measure run with non-breakable start/end.

Modified: trunk/Source/WebCore/dom/Document.cpp (238403 => 238404)


--- trunk/Source/WebCore/dom/Document.cpp	2018-11-20 15:56:57 UTC (rev 238403)
+++ trunk/Source/WebCore/dom/Document.cpp	2018-11-20 16:17:44 UTC (rev 238404)
@@ -7136,18 +7136,22 @@
         parser->didEndYieldingParser();
 }
 
-static RenderElement* nearestCommonHoverAncestor(RenderElement* obj1, RenderElement* obj2)
+static Element* findNearestCommonComposedAncestor(Element* elementA, Element* elementB)
 {
-    if (!obj1 || !obj2)
+    if (!elementA || !elementB)
         return nullptr;
 
-    for (RenderElement* currObj1 = obj1; currObj1; currObj1 = currObj1->hoverAncestor()) {
-        for (RenderElement* currObj2 = obj2; currObj2; currObj2 = currObj2->hoverAncestor()) {
-            if (currObj1 == currObj2)
-                return currObj1;
-        }
+    if (elementA == elementB)
+        return elementA;
+
+    HashSet<Element*> ancestorChain;
+    for (auto* element = elementA; element; element = element->parentElementInComposedTree())
+        ancestorChain.add(element);
+
+    for (auto* element = elementB; element; element = element->parentElementInComposedTree()) {
+        if (ancestorChain.contains(element))
+            return element;
     }
-
     return nullptr;
 }
 
@@ -7208,19 +7212,14 @@
 
     m_hoveredElement = newHoveredElement;
 
-    // We have two different objects. Fetch their renderers.
-    RenderElement* oldHoverObj = oldHoveredElement ? oldHoveredElement->renderer() : nullptr;
-    RenderElement* newHoverObj = newHoveredElement ? newHoveredElement->renderer() : nullptr;
+    auto* commonAncestor = findNearestCommonComposedAncestor(oldHoveredElement.get(), newHoveredElement);
 
-    // Locate the common ancestor render object for the two renderers.
-    RenderElement* ancestor = nearestCommonHoverAncestor(oldHoverObj, newHoverObj);
-
     Vector<RefPtr<Element>, 32> elementsToRemoveFromChain;
     Vector<RefPtr<Element>, 32> elementsToAddToChain;
 
-    if (oldHoverObj != newHoverObj) {
+    if (oldHoveredElement != newHoveredElement) {
         for (auto* element = oldHoveredElement.get(); element; element = element->parentElementInComposedTree()) {
-            if (ancestor && ancestor->element() == element)
+            if (element == commonAncestor)
                 break;
             if (!mustBeInActiveChain || element->inActiveChain())
                 elementsToRemoveFromChain.append(element);
@@ -7227,7 +7226,7 @@
         }
         // Unset hovered nodes in sub frame documents if the old hovered node was a frame owner.
         if (is<HTMLFrameOwnerElement>(oldHoveredElement)) {
-            if (Document* contentDocument = downcast<HTMLFrameOwnerElement>(*oldHoveredElement).contentDocument())
+            if (auto* contentDocument = downcast<HTMLFrameOwnerElement>(*oldHoveredElement).contentDocument())
                 contentDocument->updateHoverActiveState(request, nullptr);
         }
     }
@@ -7244,7 +7243,7 @@
     for (auto& element : elementsToAddToChain) {
         if (allowActiveChanges)
             element->setActive(true);
-        if (ancestor && element == ancestor->element())
+        if (element == commonAncestor)
             sawCommonAncestor = true;
         if (!sawCommonAncestor) {
             // Elements after the common hover ancestor does not change hover state, but are iterated over because they may change active state.

Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (238403 => 238404)


--- trunk/Source/WebCore/rendering/RenderBlock.cpp	2018-11-20 15:56:57 UTC (rev 238403)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp	2018-11-20 16:17:44 UTC (rev 238404)
@@ -2781,13 +2781,6 @@
     return r;
 }
 
-RenderElement* RenderBlock::hoverAncestor() const
-{
-    if (auto* continuation = this->continuation())
-        return continuation;
-    return RenderBox::hoverAncestor();
-}
-
 void RenderBlock::updateDragState(bool dragOn)
 {
     RenderBox::updateDragState(dragOn);

Modified: trunk/Source/WebCore/rendering/RenderBlock.h (238403 => 238404)


--- trunk/Source/WebCore/rendering/RenderBlock.h	2018-11-20 15:56:57 UTC (rev 238403)
+++ trunk/Source/WebCore/rendering/RenderBlock.h	2018-11-20 16:17:44 UTC (rev 238404)
@@ -457,7 +457,6 @@
     LayoutRect rectWithOutlineForRepaint(const RenderLayerModelObject* repaintContainer, LayoutUnit outlineWidth) const final;
     const RenderStyle& outlineStyleForRepaint() const final;
 
-    RenderElement* hoverAncestor() const final;
     void updateDragState(bool dragOn) final;
 
     LayoutRect selectionRectForRepaint(const RenderLayerModelObject* repaintContainer, bool /*clipToVisibleContent*/) final

Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (238403 => 238404)


--- trunk/Source/WebCore/rendering/RenderElement.cpp	2018-11-20 15:56:57 UTC (rev 238403)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp	2018-11-20 16:17:44 UTC (rev 238404)
@@ -974,11 +974,6 @@
         setLayerNeedsFullRepaint();
 }
 
-RenderElement* RenderElement::hoverAncestor() const
-{
-    return parent();
-}
-
 static inline void paintPhase(RenderElement& element, PaintPhase phase, PaintInfo& paintInfo, const LayoutPoint& childPoint)
 {
     paintInfo.phase = phase;

Modified: trunk/Source/WebCore/rendering/RenderElement.h (238403 => 238404)


--- trunk/Source/WebCore/rendering/RenderElement.h	2018-11-20 15:56:57 UTC (rev 238403)
+++ trunk/Source/WebCore/rendering/RenderElement.h	2018-11-20 16:17:44 UTC (rev 238404)
@@ -97,8 +97,6 @@
     void moveLayers(RenderLayer* oldParent, RenderLayer* newParent);
     RenderLayer* findNextLayer(RenderLayer* parentLayer, RenderObject* startPoint, bool checkParent = true);
 
-    virtual RenderElement* hoverAncestor() const;
-
     virtual void dirtyLinesFromChangedChild(RenderObject&) { }
 
     bool ancestorLineBoxDirty() const { return m_ancestorLineBoxDirty; }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to