Title: [260571] trunk/Source/WebCore
Revision
260571
Author
simon.fra...@apple.com
Date
2020-04-23 08:31:13 -0700 (Thu, 23 Apr 2020)

Log Message

In the scrolling tree, separate wheel event handling from layer updating
https://bugs.webkit.org/show_bug.cgi?id=210899

Reviewed by Antti Koivisto.

Working towards webkit.org/b/210884, it needs to be possible to have the scrolling
tree handle a wheelEvent and update its internal state about scroll positions, but not
immediately map those scroll positions onto CALayers.

To achieve this, have ScrollingTreeScrollingNode::currentScrollPositionChanged()
not call applyLayerPositions(), or notifyRelatedNodesAfterScrollPositionChange() which
just applies layer positions on related nodes.

Instead, at the end of wheel event handling, do a full scrolling tree traversal and update
all the layer positions there.

Delegated scrolling (iOS) still needs notifyRelatedNodesAfterScrollPositionChange() so it
can't be removed.

* page/scrolling/ScrollingTree.cpp:
(WebCore::ScrollingTree::handleWheelEvent):
(WebCore::ScrollingTree::applyLayerPositions):
(WebCore::ScrollingTree::applyLayerPositionsInternal):
* page/scrolling/ScrollingTree.h:
* page/scrolling/ScrollingTreeScrollingNode.cpp:
(WebCore::ScrollingTreeScrollingNode::currentScrollPositionChanged):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (260570 => 260571)


--- trunk/Source/WebCore/ChangeLog	2020-04-23 15:24:02 UTC (rev 260570)
+++ trunk/Source/WebCore/ChangeLog	2020-04-23 15:31:13 UTC (rev 260571)
@@ -1,3 +1,32 @@
+2020-04-22  Simon Fraser  <simon.fra...@apple.com>
+
+        In the scrolling tree, separate wheel event handling from layer updating
+        https://bugs.webkit.org/show_bug.cgi?id=210899
+
+        Reviewed by Antti Koivisto.
+
+        Working towards webkit.org/b/210884, it needs to be possible to have the scrolling
+        tree handle a wheelEvent and update its internal state about scroll positions, but not
+        immediately map those scroll positions onto CALayers.
+
+        To achieve this, have ScrollingTreeScrollingNode::currentScrollPositionChanged()
+        not call applyLayerPositions(), or notifyRelatedNodesAfterScrollPositionChange() which
+        just applies layer positions on related nodes.
+
+        Instead, at the end of wheel event handling, do a full scrolling tree traversal and update
+        all the layer positions there.
+
+        Delegated scrolling (iOS) still needs notifyRelatedNodesAfterScrollPositionChange() so it
+        can't be removed.
+
+        * page/scrolling/ScrollingTree.cpp:
+        (WebCore::ScrollingTree::handleWheelEvent):
+        (WebCore::ScrollingTree::applyLayerPositions):
+        (WebCore::ScrollingTree::applyLayerPositionsInternal):
+        * page/scrolling/ScrollingTree.h:
+        * page/scrolling/ScrollingTreeScrollingNode.cpp:
+        (WebCore::ScrollingTreeScrollingNode::currentScrollPositionChanged):
+
 2020-04-23  Charlie Turner  <ctur...@igalia.com>
 
         [EME][CDMProxy] Sort key status array lexicographically by key IDs

Modified: trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp (260570 => 260571)


--- trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp	2020-04-23 15:24:02 UTC (rev 260570)
+++ trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp	2020-04-23 15:31:13 UTC (rev 260571)
@@ -98,48 +98,55 @@
 
     m_latchingController.receivedWheelEvent(wheelEvent);
 
-    if (!asyncFrameOrOverflowScrollingEnabled()) {
-        if (m_rootNode)
-            return m_rootNode->handleWheelEvent(wheelEvent);
+    auto result = [&] {
+        if (!asyncFrameOrOverflowScrollingEnabled()) {
+            if (m_rootNode)
+                return m_rootNode->handleWheelEvent(wheelEvent);
 
-        return ScrollingEventResult::DidNotHandleEvent;
-    }
+            return ScrollingEventResult::DidNotHandleEvent;
+        }
 
-    if (auto latchedNodeID = m_latchingController.latchedNodeForEvent(wheelEvent)) {
-        LOG_WITH_STREAM(ScrollLatching, stream << "ScrollingTree::handleWheelEvent: has latched node " << latchedNodeID);
-        auto* node = nodeForID(latchedNodeID.value());
-        if (is<ScrollingTreeScrollingNode>(node))
-            return downcast<ScrollingTreeScrollingNode>(*node).handleWheelEvent(wheelEvent);
-    }
+        if (auto latchedNodeID = m_latchingController.latchedNodeForEvent(wheelEvent)) {
+            LOG_WITH_STREAM(ScrollLatching, stream << "ScrollingTree::handleWheelEvent: has latched node " << latchedNodeID);
+            auto* node = nodeForID(latchedNodeID.value());
+            if (is<ScrollingTreeScrollingNode>(node))
+                return downcast<ScrollingTreeScrollingNode>(*node).handleWheelEvent(wheelEvent);
+        }
+        
+        FloatPoint position = wheelEvent.position();
+        position.move(m_rootNode->viewToContentsOffset(m_treeState.mainFrameScrollPosition));
+        auto node = scrollingNodeForPoint(position);
 
-    FloatPoint position = wheelEvent.position();
-    position.move(m_rootNode->viewToContentsOffset(m_treeState.mainFrameScrollPosition));
-    auto node = scrollingNodeForPoint(position);
+        LOG_WITH_STREAM(Scrolling, stream << "ScrollingTree::handleWheelEvent found node " << (node ? node->scrollingNodeID() : 0) << " for point " << position);
 
-    LOG_WITH_STREAM(Scrolling, stream << "ScrollingTree::handleWheelEvent found node " << (node ? node->scrollingNodeID() : 0) << " for point " << position);
+        while (node) {
+            if (is<ScrollingTreeScrollingNode>(*node)) {
+                auto& scrollingNode = downcast<ScrollingTreeScrollingNode>(*node);
+                auto result = scrollingNode.handleWheelEvent(wheelEvent);
 
-    while (node) {
-        if (is<ScrollingTreeScrollingNode>(*node)) {
-            auto& scrollingNode = downcast<ScrollingTreeScrollingNode>(*node);
-            auto result = scrollingNode.handleWheelEvent(wheelEvent);
-            if (result == ScrollingEventResult::DidHandleEvent) {
-                m_latchingController.nodeDidHandleEvent(wheelEvent, scrollingNode.scrollingNodeID());
-                return ScrollingEventResult::DidHandleEvent;
+                if (result == ScrollingEventResult::DidHandleEvent)
+                    m_latchingController.nodeDidHandleEvent(wheelEvent, scrollingNode.scrollingNodeID());
+
+                if (result != ScrollingEventResult::DidNotHandleEvent)
+                    return result;
             }
-            if (result == ScrollingEventResult::SendToMainThread)
-                return ScrollingEventResult::SendToMainThread;
-        }
 
-        if (is<ScrollingTreeOverflowScrollProxyNode>(*node)) {
-            if (auto relatedNode = nodeForID(downcast<ScrollingTreeOverflowScrollProxyNode>(*node).overflowScrollingNodeID())) {
-                node = relatedNode;
-                continue;
+            if (is<ScrollingTreeOverflowScrollProxyNode>(*node)) {
+                if (auto relatedNode = nodeForID(downcast<ScrollingTreeOverflowScrollProxyNode>(*node).overflowScrollingNodeID())) {
+                    node = relatedNode;
+                    continue;
+                }
             }
+
+            node = node->parent();
         }
+        return ScrollingEventResult::DidNotHandleEvent;
+    }();
 
-        node = node->parent();
-    }
-    return ScrollingEventResult::DidNotHandleEvent;
+    if (result == ScrollingEventResult::DidHandleEvent)
+        applyLayerPositionsInternal();
+    
+    return result;
 }
 
 RefPtr<ScrollingTreeNode> ScrollingTree::scrollingNodeForPoint(FloatPoint)
@@ -322,14 +329,16 @@
     ASSERT(isMainThread());
     LockHolder locker(m_treeMutex);
 
+    applyLayerPositionsInternal();
+}
+
+void ScrollingTree::applyLayerPositionsInternal()
+{
     if (!m_rootNode)
         return;
 
-    LOG(Scrolling, "\nScrollingTree %p applyLayerPositions", this);
-
+    LOG(Scrolling, "\nScrollingTree %p applyLayerPositions (main thread %d)", this, isMainThread());
     applyLayerPositionsRecursive(*m_rootNode);
-
-    LOG(Scrolling, "ScrollingTree %p applyLayerPositions - done\n", this);
 }
 
 void ScrollingTree::applyLayerPositionsRecursive(ScrollingTreeNode& node)

Modified: trunk/Source/WebCore/page/scrolling/ScrollingTree.h (260570 => 260571)


--- trunk/Source/WebCore/page/scrolling/ScrollingTree.h	2020-04-23 15:24:02 UTC (rev 260570)
+++ trunk/Source/WebCore/page/scrolling/ScrollingTree.h	2020-04-23 15:31:13 UTC (rev 260571)
@@ -186,6 +186,8 @@
     void updateTreeFromStateNodeRecursive(const ScrollingStateNode*, struct CommitTreeState&);
     virtual void propagateSynchronousScrollingReasons(const HashSet<ScrollingNodeID>&) { }
 
+    void applyLayerPositionsInternal();
+
     void applyLayerPositionsRecursive(ScrollingTreeNode&);
     void notifyRelatedNodesRecursive(ScrollingTreeNode&);
     void traverseScrollingTreeRecursive(ScrollingTreeNode&, const VisitorFunction&);

Modified: trunk/Source/WebCore/page/scrolling/ScrollingTreeScrollingNode.cpp (260570 => 260571)


--- trunk/Source/WebCore/page/scrolling/ScrollingTreeScrollingNode.cpp	2020-04-23 15:24:02 UTC (rev 260570)
+++ trunk/Source/WebCore/page/scrolling/ScrollingTreeScrollingNode.cpp	2020-04-23 15:31:13 UTC (rev 260571)
@@ -245,9 +245,6 @@
 
 void ScrollingTreeScrollingNode::currentScrollPositionChanged()
 {
-    applyLayerPositions();
-
-    scrollingTree().notifyRelatedNodesAfterScrollPositionChange(*this);
     scrollingTree().scrollingTreeNodeDidScroll(*this);
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to