Changeset 270130 in webkit
- Timestamp:
- Nov 20, 2020 1:21:25 PM (3 years ago)
- Location:
- trunk/Source
- Files:
-
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r270128 r270130 1 2020-11-20 Simon Fraser <simon.fraser@apple.com> 2 3 Dispatch main-thread overflow scrolls to the scrolling thread as we do for page scrolls 4 https://bugs.webkit.org/show_bug.cgi?id=219213 5 6 Reviewed by Tim Horton. 7 8 Unify the behavior of overflow scrolling and page scrolling for synchronous scrolls. 9 10 Somewhat surprisingly, synchronous page scrolls move layers via a dispatch to the scrolling thread in 11 FrameView::handleWheelEventForScrolling(), but overflow scrolls just did main thread compositing updates 12 to set the new layer positions. 13 14 A future patch will require that the "began" event for a synchronous scroll gets back to the scrolling thread, 15 so unify these code paths to have overflow scrolls also leverage handleWheelEventAfterMainThread(), via 16 RenderLayer::handleWheelEventForScrolling(). 17 18 There's some fallout from this. ThreadedScrollingTree::handleWheelEventAfterMainThread() calls into handleWheelEventWithNode(), 19 but in this special case that codepath needs to know that we're in a special "post main thread" mode that should 20 1. Behave as if the node is latched, i.e. don't propagate to parent nodes, 21 and target the node if if it's scrolled to a the min or max to allow rubberbanding 22 2. Scroll even if the node has synchronous scrolling reasons 23 This mode is represented by the EventTargeting value. 24 25 Finally, EventHandler::handleWheelEventInternal() should only clear latching state if the content has called preventDefault() 26 on the event. 27 28 * page/EventHandler.cpp: 29 (WebCore::EventHandler::handleWheelEventInternal): 30 * page/scrolling/ScrollLatchingController.cpp: 31 (WebCore::ScrollLatchingController::updateAndFetchLatchingStateForFrame): 32 * page/scrolling/ScrollingTree.cpp: 33 (WebCore::ScrollingTree::handleWheelEventWithNode): 34 * page/scrolling/ScrollingTree.h: 35 * page/scrolling/ScrollingTreeScrollingNode.cpp: 36 (WebCore::ScrollingTreeScrollingNode::canHandleWheelEvent const): 37 (WebCore::ScrollingTreeScrollingNode::handleWheelEvent): 38 * page/scrolling/ScrollingTreeScrollingNode.h: 39 * page/scrolling/ThreadedScrollingTree.cpp: 40 (WebCore::ThreadedScrollingTree::handleWheelEventAfterMainThread): 41 * page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.h: 42 * page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm: 43 (WebCore::ScrollingTreeFrameScrollingNodeMac::handleWheelEvent): 44 * page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.h: 45 * page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.mm: 46 (WebCore::ScrollingTreeOverflowScrollingNodeMac::handleWheelEvent): 47 * platform/cocoa/ScrollController.mm: 48 (WebCore::ScrollController::handleWheelEvent): 49 * rendering/RenderLayer.cpp: 50 (WebCore::RenderLayer::handleWheelEventForScrolling): 51 * rendering/RenderLayer.h: 52 1 53 2020-11-20 Zalan Bujtas <zalan@apple.com> 2 54 -
trunk/Source/WebCore/page/EventHandler.cpp
r270125 r270130 2942 2942 if (scrollableArea && scrollableArea->scrollShouldClearLatchedState()) { 2943 2943 // Web developer is controlling scrolling, so don't attempt to latch. 2944 clearLatchedState(); 2944 if (handling.containsAll({ EventHandling::DispatchedToDOM, EventHandling::DefaultPrevented })) 2945 clearLatchedState(); 2945 2946 scrollableArea->setScrollShouldClearLatchedState(false); 2946 2947 } -
trunk/Source/WebCore/page/scrolling/ScrollLatchingController.cpp
r266333 r270130 121 121 state.isOverWidget = isOverWidget; 122 122 123 LOG_WITH_STREAM(ScrollLatching, stream << "ScrollLatchingController::updateAndFetchLatchingStateForFrame() - pushing state for Frame " << &frame << " element " << state.wheelEventElement.get() << " scrollableArea " << state.scrollableArea); 123 124 m_frameStateStack.append(WTFMove(state)); 124 125 return; … … 144 145 scrollableArea = state.scrollableArea; 145 146 isOverWidget = state.isOverWidget; 147 148 LOG_WITH_STREAM(ScrollLatching, stream << "ScrollLatchingController::updateAndFetchLatchingStateForFrame() - using state for Frame " << &frame << " element " << latchedElement.get() << " scrollableArea " << scrollableArea); 146 149 } 147 150 } -
trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp
r269973 r270130 169 169 } 170 170 171 WheelEventHandlingResult ScrollingTree::handleWheelEventWithNode(const PlatformWheelEvent& wheelEvent, OptionSet<WheelEventProcessingSteps> processingSteps, ScrollingTreeNode* node )171 WheelEventHandlingResult ScrollingTree::handleWheelEventWithNode(const PlatformWheelEvent& wheelEvent, OptionSet<WheelEventProcessingSteps> processingSteps, ScrollingTreeNode* node, EventTargeting eventTargeting) 172 172 { 173 173 while (node) { 174 174 if (is<ScrollingTreeScrollingNode>(*node)) { 175 175 auto& scrollingNode = downcast<ScrollingTreeScrollingNode>(*node); 176 auto result = scrollingNode.handleWheelEvent(wheelEvent );176 auto result = scrollingNode.handleWheelEvent(wheelEvent, eventTargeting); 177 177 178 178 if (result.wasHandled) { … … 182 182 } 183 183 184 if (result.needsMainThreadProcessing() )184 if (result.needsMainThreadProcessing() || eventTargeting != EventTargeting::Propagate) 185 185 return result; 186 186 } -
trunk/Source/WebCore/page/scrolling/ScrollingTree.h
r269973 r270130 76 76 }; 77 77 78 enum class EventTargeting : uint8_t { NodeOnly, Propagate }; 79 78 80 class ScrollingTree : public ThreadSafeRefCounted<ScrollingTree> { 79 81 friend class ScrollingTreeLatchingController; … … 234 236 235 237 protected: 236 WheelEventHandlingResult handleWheelEventWithNode(const PlatformWheelEvent&, OptionSet<WheelEventProcessingSteps>, ScrollingTreeNode* );238 WheelEventHandlingResult handleWheelEventWithNode(const PlatformWheelEvent&, OptionSet<WheelEventProcessingSteps>, ScrollingTreeNode*, EventTargeting = EventTargeting::Propagate); 237 239 238 240 FloatPoint mainFrameScrollPosition() const; -
trunk/Source/WebCore/page/scrolling/ScrollingTreeScrollingNode.cpp
r270125 r270130 135 135 } 136 136 137 bool ScrollingTreeScrollingNode::canHandleWheelEvent(const PlatformWheelEvent& wheelEvent ) const137 bool ScrollingTreeScrollingNode::canHandleWheelEvent(const PlatformWheelEvent& wheelEvent, EventTargeting eventTargeting) const 138 138 { 139 139 if (!canHaveScrollbars()) … … 146 146 // We always rubber-band the latched node, or the root node. 147 147 // The stateless wheel event doesn't trigger rubber-band. 148 if (isLatchedNode() || (isRootNode() && !wheelEvent.isNonGestureEvent()))148 if (isLatchedNode() || eventTargeting == EventTargeting::NodeOnly || (isRootNode() && !wheelEvent.isNonGestureEvent())) 149 149 return true; 150 150 … … 152 152 } 153 153 154 WheelEventHandlingResult ScrollingTreeScrollingNode::handleWheelEvent(const PlatformWheelEvent& )154 WheelEventHandlingResult ScrollingTreeScrollingNode::handleWheelEvent(const PlatformWheelEvent&, EventTargeting) 155 155 { 156 156 return WheelEventHandlingResult::unhandled(); -
trunk/Source/WebCore/page/scrolling/ScrollingTreeScrollingNode.h
r269559 r270130 29 29 30 30 #include "IntRect.h" 31 #include "RectEdges.h"32 31 #include "ScrollSnapOffsetsInfo.h" 33 #include "ScrollTypes.h"34 32 #include "ScrollableArea.h" 35 #include "Scrolling Coordinator.h"33 #include "ScrollingTree.h" 36 34 #include "ScrollingTreeNode.h" 37 35 … … 56 54 void didCompleteCommitForNode() final; 57 55 58 virtual bool canHandleWheelEvent(const PlatformWheelEvent& ) const;59 virtual WheelEventHandlingResult handleWheelEvent(const PlatformWheelEvent& );56 virtual bool canHandleWheelEvent(const PlatformWheelEvent&, EventTargeting) const; 57 virtual WheelEventHandlingResult handleWheelEvent(const PlatformWheelEvent&, EventTargeting = EventTargeting::Propagate); 60 58 61 59 FloatPoint currentScrollPosition() const { return m_currentScrollPosition; } -
trunk/Source/WebCore/page/scrolling/ThreadedScrollingTree.cpp
r269973 r270130 67 67 bool ThreadedScrollingTree::handleWheelEventAfterMainThread(const PlatformWheelEvent& wheelEvent, ScrollingNodeID targetNodeID) 68 68 { 69 LOG_WITH_STREAM(Scrolling, stream << "ThreadedScrollingTree::handleWheelEventAfterMainThread " << wheelEvent );69 LOG_WITH_STREAM(Scrolling, stream << "ThreadedScrollingTree::handleWheelEventAfterMainThread " << wheelEvent << " node " << targetNodeID); 70 70 71 71 LockHolder locker(m_treeMutex); … … 73 73 SetForScope<bool> disallowLatchingScope(m_allowLatching, false); 74 74 RefPtr<ScrollingTreeNode> targetNode = nodeForID(targetNodeID); 75 auto result = handleWheelEventWithNode(wheelEvent, { }, targetNode.get() );75 auto result = handleWheelEventWithNode(wheelEvent, { }, targetNode.get(), EventTargeting::NodeOnly); 76 76 return result.wasHandled; 77 77 } -
trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.h
r269559 r270130 52 52 void commitStateAfterChildren(const ScrollingStateNode&) override; 53 53 54 WheelEventHandlingResult handleWheelEvent(const PlatformWheelEvent& ) override;54 WheelEventHandlingResult handleWheelEvent(const PlatformWheelEvent&, EventTargeting) override; 55 55 56 56 WEBCORE_EXPORT void repositionRelatedLayers() override; -
trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm
r269559 r270130 118 118 } 119 119 120 WheelEventHandlingResult ScrollingTreeFrameScrollingNodeMac::handleWheelEvent(const PlatformWheelEvent& wheelEvent )121 { 122 if (!canHandleWheelEvent(wheelEvent ))120 WheelEventHandlingResult ScrollingTreeFrameScrollingNodeMac::handleWheelEvent(const PlatformWheelEvent& wheelEvent, EventTargeting eventTargeting) 121 { 122 if (!canHandleWheelEvent(wheelEvent, eventTargeting)) 123 123 return WheelEventHandlingResult::unhandled(); 124 124 -
trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.h
r269559 r270130 54 54 void repositionRelatedLayers() override; 55 55 56 WheelEventHandlingResult handleWheelEvent(const PlatformWheelEvent& ) override;56 WheelEventHandlingResult handleWheelEvent(const PlatformWheelEvent&, EventTargeting) override; 57 57 58 58 private: -
trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.mm
r269973 r270130 74 74 } 75 75 76 WheelEventHandlingResult ScrollingTreeOverflowScrollingNodeMac::handleWheelEvent(const PlatformWheelEvent& wheelEvent )76 WheelEventHandlingResult ScrollingTreeOverflowScrollingNodeMac::handleWheelEvent(const PlatformWheelEvent& wheelEvent, EventTargeting eventTargeting) 77 77 { 78 78 #if ENABLE(SCROLLING_THREAD) 79 if (hasSynchronousScrollingReasons() )79 if (hasSynchronousScrollingReasons() && eventTargeting != EventTargeting::NodeOnly) 80 80 return { { WheelEventProcessingSteps::MainThreadForScrolling, WheelEventProcessingSteps::MainThreadForNonBlockingDOMEventDispatch }, false }; 81 81 #endif 82 82 83 if (!canHandleWheelEvent(wheelEvent ))83 if (!canHandleWheelEvent(wheelEvent, eventTargeting)) 84 84 return WheelEventHandlingResult::unhandled(); 85 85 -
trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeFrameScrollingNodeNicosia.cpp
r269909 r270130 159 159 #endif 160 160 161 WheelEventHandlingResult ScrollingTreeFrameScrollingNodeNicosia::handleWheelEvent(const PlatformWheelEvent& wheelEvent )162 { 163 if (!canHandleWheelEvent(wheelEvent ))161 WheelEventHandlingResult ScrollingTreeFrameScrollingNodeNicosia::handleWheelEvent(const PlatformWheelEvent& wheelEvent, EventTargeting eventTargeting) 162 { 163 if (!canHandleWheelEvent(wheelEvent, eventTargeting)) 164 164 return WheelEventHandlingResult::unhandled(); 165 165 -
trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeFrameScrollingNodeNicosia.h
r269579 r270130 63 63 #endif 64 64 65 WheelEventHandlingResult handleWheelEvent(const PlatformWheelEvent& ) override;65 WheelEventHandlingResult handleWheelEvent(const PlatformWheelEvent&, EventTargeting) override; 66 66 67 67 void stopScrollAnimations() override; -
trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeOverflowScrollingNodeNicosia.cpp
r269909 r270130 149 149 #endif 150 150 151 WheelEventHandlingResult ScrollingTreeOverflowScrollingNodeNicosia::handleWheelEvent(const PlatformWheelEvent& wheelEvent )152 { 153 if (!canHandleWheelEvent(wheelEvent ))151 WheelEventHandlingResult ScrollingTreeOverflowScrollingNodeNicosia::handleWheelEvent(const PlatformWheelEvent& wheelEvent, EventTargeting eventTargeting) 152 { 153 if (!canHandleWheelEvent(wheelEvent, eventTargeting)) 154 154 return WheelEventHandlingResult::unhandled(); 155 155 -
trunk/Source/WebCore/page/scrolling/nicosia/ScrollingTreeOverflowScrollingNodeNicosia.h
r269909 r270130 58 58 #endif 59 59 60 WheelEventHandlingResult handleWheelEvent(const PlatformWheelEvent& ) override;60 WheelEventHandlingResult handleWheelEvent(const PlatformWheelEvent&, EventTargeting) override; 61 61 62 62 void stopScrollAnimations() override; -
trunk/Source/WebCore/platform/cocoa/ScrollController.mm
r269659 r270130 257 257 } 258 258 } 259 260 LOG_WITH_STREAM(Scrolling, stream << "ScrollController::handleWheelEvent() - deltaX " << deltaX << " deltaY " << deltaY << " pinned " << m_client.pinnedInDirection(FloatSize(deltaX, deltaY)) << " shouldStretch " << shouldStretch); 259 261 } 260 262 -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r270023 r270130 3166 3166 } 3167 3167 3168 bool RenderLayer::handleWheelEventForScrolling(const PlatformWheelEvent& wheelEvent) 3169 { 3170 if (!isScrollableOrRubberbandable()) 3171 return false; 3172 3173 #if ENABLE(ASYNC_SCROLLING) 3174 if (usesAsyncScrolling() && scrollingNodeID()) { 3175 if (auto* scrollingCoordinator = page().scrollingCoordinator()) 3176 return scrollingCoordinator->handleWheelEventForScrolling(wheelEvent, scrollingNodeID()); 3177 } 3178 #endif 3179 3180 return ScrollableArea::handleWheelEventForScrolling(wheelEvent); 3181 } 3182 3168 3183 IntRect RenderLayer::visibleContentRectInternal(VisibleContentRectIncludesScrollbars scrollbarInclusion, VisibleContentRectBehavior) const 3169 3184 { -
trunk/Source/WebCore/rendering/RenderLayer.h
r268263 r270130 494 494 ScrollableArea* enclosingScrollableArea() const final; 495 495 496 bool handleWheelEventForScrolling(const PlatformWheelEvent&) final; 496 497 bool isScrollableOrRubberbandable() final; 497 498 bool hasScrollableOrRubberbandableAncestor() final; -
trunk/Source/WebKit/ChangeLog
r270125 r270130 1 2020-11-20 Simon Fraser <simon.fraser@apple.com> 2 3 Dispatch main-thread overflow scrolls to the scrolling thread as we do for page scrolls 4 https://bugs.webkit.org/show_bug.cgi?id=219213 5 6 Reviewed by Tim Horton. 7 8 Unify the behavior of overflow scrolling and page scrolling for synchronous scrolls. 9 10 Somewhat surprisingly, synchronous page scrolls move layers via a dispatch to the scrolling thread in 11 FrameView::handleWheelEventForScrolling(), but overflow scrolls just did main thread compositing updates 12 to set the new layer positions. 13 14 A future patch will require that the "began" event for a synchronous scroll gets back to the scrolling thread, 15 so unify these code paths to have overflow scrolls also leverage handleWheelEventAfterMainThread(), via 16 RenderLayer::handleWheelEventForScrolling(). 17 18 There's some fallout from this. ThreadedScrollingTree::handleWheelEventAfterMainThread() calls into handleWheelEventWithNode(), 19 but in this special case that codepath needs to know that we're in a special "post main thread" mode that should 20 1. Behave as if the node is latched, i.e. don't propagate to parent nodes, 21 and target the node if if it's scrolled to a the min or max to allow rubberbanding 22 2. Scroll even if the node has synchronous scrolling reasons 23 This mode is represented by the EventTargeting value. 24 25 Finally, EventHandler::handleWheelEventInternal() should only clear latching state if the content has called preventDefault() 26 on the event. 27 28 * UIProcess/RemoteLayerTree/mac/ScrollingTreeFrameScrollingNodeRemoteMac.cpp: 29 (WebKit::ScrollingTreeFrameScrollingNodeRemoteMac::handleWheelEvent): 30 * UIProcess/RemoteLayerTree/mac/ScrollingTreeFrameScrollingNodeRemoteMac.h: 31 * UIProcess/RemoteLayerTree/mac/ScrollingTreeOverflowScrollingNodeRemoteMac.cpp: 32 (WebKit::ScrollingTreeOverflowScrollingNodeRemoteMac::handleWheelEvent): 33 * UIProcess/RemoteLayerTree/mac/ScrollingTreeOverflowScrollingNodeRemoteMac.h: 34 1 35 2020-11-20 Simon Fraser <simon.fraser@apple.com> 2 36 -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/mac/ScrollingTreeFrameScrollingNodeRemoteMac.cpp
r269184 r270130 73 73 } 74 74 75 WheelEventHandlingResult ScrollingTreeFrameScrollingNodeRemoteMac::handleWheelEvent(const PlatformWheelEvent& wheelEvent )75 WheelEventHandlingResult ScrollingTreeFrameScrollingNodeRemoteMac::handleWheelEvent(const PlatformWheelEvent& wheelEvent, EventTargeting eventTargeting) 76 76 { 77 ScrollingTreeFrameScrollingNodeMac::handleWheelEvent(wheelEvent );77 ScrollingTreeFrameScrollingNodeMac::handleWheelEvent(wheelEvent, eventTargeting); 78 78 79 79 return WheelEventHandlingResult::result(m_scrollerPair->handleWheelEvent(wheelEvent)); -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/mac/ScrollingTreeFrameScrollingNodeRemoteMac.h
r262294 r270130 45 45 46 46 void commitStateBeforeChildren(const WebCore::ScrollingStateNode&) override; 47 WebCore::WheelEventHandlingResult handleWheelEvent(const WebCore::PlatformWheelEvent& ) override;47 WebCore::WheelEventHandlingResult handleWheelEvent(const WebCore::PlatformWheelEvent&, EventTargeting) override; 48 48 void repositionRelatedLayers() override; 49 49 -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/mac/ScrollingTreeOverflowScrollingNodeRemoteMac.cpp
r269184 r270130 73 73 } 74 74 75 WheelEventHandlingResult ScrollingTreeOverflowScrollingNodeRemoteMac::handleWheelEvent(const PlatformWheelEvent& wheelEvent )75 WheelEventHandlingResult ScrollingTreeOverflowScrollingNodeRemoteMac::handleWheelEvent(const PlatformWheelEvent& wheelEvent, EventTargeting eventTargeting) 76 76 { 77 ScrollingTreeOverflowScrollingNodeMac::handleWheelEvent(wheelEvent );77 ScrollingTreeOverflowScrollingNodeMac::handleWheelEvent(wheelEvent, eventTargeting); 78 78 79 79 return WheelEventHandlingResult::result(m_scrollerPair->handleWheelEvent(wheelEvent)); -
trunk/Source/WebKit/UIProcess/RemoteLayerTree/mac/ScrollingTreeOverflowScrollingNodeRemoteMac.h
r262294 r270130 45 45 46 46 void commitStateBeforeChildren(const WebCore::ScrollingStateNode&) override; 47 WebCore::WheelEventHandlingResult handleWheelEvent(const WebCore::PlatformWheelEvent& ) override;47 WebCore::WheelEventHandlingResult handleWheelEvent(const WebCore::PlatformWheelEvent&, EventTargeting) override; 48 48 void repositionRelatedLayers() override; 49 49
Note: See TracChangeset
for help on using the changeset viewer.