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