[webkit-changes] [WebKit/WebKit] 2699f1: Adopt alternatives for scroll view SPI: -_scrollVi...

Wenson Hsieh noreply at github.com
Mon Dec 4 09:44:07 PST 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 2699f14fcf782b29a5906b9ba8e4059d5503718a
      https://github.com/WebKit/WebKit/commit/2699f14fcf782b29a5906b9ba8e4059d5503718a
  Author: Wenson Hsieh <wenson_hsieh at apple.com>
  Date:   2023-12-04 (Mon, 04 Dec 2023)

  Changed paths:
    M Source/WebKit/SourcesCocoa.txt
    M Source/WebKit/UIProcess/API/ios/WKWebViewIOS.h
    M Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm
    M Source/WebKit/UIProcess/PageClient.h
    M Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteLayerTreeViews.h
    M Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteLayerTreeViews.mm
    M Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreeFrameScrollingNodeRemoteIOS.h
    M Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreeFrameScrollingNodeRemoteIOS.mm
    M Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreeOverflowScrollingNodeIOS.h
    M Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreeOverflowScrollingNodeIOS.mm
    M Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreePluginScrollingNodeIOS.h
    M Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreePluginScrollingNodeIOS.mm
    M Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreeScrollingNodeDelegateIOS.h
    M Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreeScrollingNodeDelegateIOS.mm
    M Source/WebKit/UIProcess/ios/PageClientImplIOS.h
    M Source/WebKit/UIProcess/ios/PageClientImplIOS.mm
    R Source/WebKit/UIProcess/ios/WKAxisLockingScrollView.h
    R Source/WebKit/UIProcess/ios/WKAxisLockingScrollView.mm
    A Source/WebKit/UIProcess/ios/WKBaseScrollView.h
    A Source/WebKit/UIProcess/ios/WKBaseScrollView.mm
    M Source/WebKit/UIProcess/ios/WKScrollView.mm
    M Source/WebKit/UIProcess/ios/WKVelocityTrackingScrollView.h
    M Source/WebKit/WebKit.xcodeproj/project.pbxproj
    M Tools/TestRunnerShared/spi/UIKitSPIForTesting.h
    M Tools/TestWebKitAPI/Tests/ios/WKScrollViewTests.mm

  Log Message:
  -----------
  Adopt alternatives for scroll view SPI: -_scrollView:asynchronouslyHandleScrollEvent:completion:
https://bugs.webkit.org/show_bug.cgi?id=265732
rdar://114330492

Reviewed by Richard Robinson.

Refactor support for handling async wheel events in WebKit, when scrolling via trackpad on iPadOS.
In place of these private scroll view delegate methods, we now have subclassing hooks on
`UIScrollView` that provide equivalent functionality.

To achieve this, we add async scroll event support to a common base class between `WKScrollView` and
`WKChildScrollView`. We rename this base class (currently, `WKAxisLockingScrollView`) into
`WKBaseScrollView` to reflect its new responsibility, and implement the new async scroll event
methods on `WKScrollingNodeScrollViewDelegate` and `WKWebView`.

For the legacy private delegate methods, we conditionalize their implementations on a new compile-
time flag (if `UISCROLLVIEW_ASYNCHRONOUS_SCROLL_EVENT_SUBCLASS_HOOKS` is off), and call through to
the new `WKBaseScrollViewDelegate` method.

* Source/WebKit/SourcesCocoa.txt:
* Source/WebKit/UIProcess/API/ios/WKWebViewIOS.h:
* Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm:
(-[WKWebView _setupScrollAndContentViews]):

Move the `-_setAllowsAsyncScrollEvent:` call into `WKBaseScrollView`, only when the
`UISCROLLVIEW_ASYNCHRONOUS_SCROLL_EVENT_SUBCLASS_HOOKS` flag isn't set.

(-[WKWebView scrollViewWillEndDragging:withVelocity:targetContentOffset:]):
(-[WKWebView _scrollView:asynchronouslyHandleScrollEvent:completion:]):

Implement these legacy methods only when `UISCROLLVIEW_ASYNCHRONOUS_SCROLL_EVENT_SUBCLASS_HOOKS` is
not set.

(-[WKWebView scrollView:handleScrollEvent:completion:]):

Implement the new `WKBaseScrollView` delegate method for handling async scroll events.

(-[WKWebView axesToPreventScrollingForPanGestureInScrollView:]):
* Source/WebKit/UIProcess/PageClient.h:
* Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteLayerTreeViews.h:
* Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteLayerTreeViews.mm:
(-[WKChildScrollView initWithFrame:]):
* Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreeFrameScrollingNodeRemoteIOS.h:
* Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreeFrameScrollingNodeRemoteIOS.mm:
(WebKit::ScrollingTreeFrameScrollingNodeRemoteIOS::scrollView const):
* Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreeOverflowScrollingNodeIOS.h:
* Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreeOverflowScrollingNodeIOS.mm:
(WebKit::ScrollingTreeOverflowScrollingNodeIOS::scrollView const):
* Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreePluginScrollingNodeIOS.h:
* Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreePluginScrollingNodeIOS.mm:
(WebKit::ScrollingTreePluginScrollingNodeIOS::scrollView const):
* Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreeScrollingNodeDelegateIOS.h:
* Source/WebKit/UIProcess/RemoteLayerTree/ios/ScrollingTreeScrollingNodeDelegateIOS.mm:
(-[WKScrollingNodeScrollViewDelegate scrollViewWillEndDragging:withVelocity:targetContentOffset:]):
(-[WKScrollingNodeScrollViewDelegate axesToPreventScrollingForPanGestureInScrollView:]):
(-[WKScrollingNodeScrollViewDelegate _scrollView:asynchronouslyHandleScrollEvent:completion:]):
(-[WKScrollingNodeScrollViewDelegate scrollView:handleScrollEvent:completion:]):
(WebKit::ScrollingTreeScrollingNodeDelegateIOS::commitStateAfterChildren):
(WebKit::ScrollingTreeScrollingNodeDelegateIOS::handleAsynchronousCancelableScrollEvent):
(WebKit::ScrollingTreeScrollingNodeDelegateIOS::scrollView const):
* Source/WebKit/UIProcess/ios/PageClientImplIOS.h:
* Source/WebKit/UIProcess/ios/PageClientImplIOS.mm:
(WebKit::PageClientImpl::handleAsynchronousCancelableScrollEvent):
* Source/WebKit/UIProcess/ios/WKBaseScrollView.h: Renamed from Source/WebKit/UIProcess/ios/WKAxisLockingScrollView.h.
* Source/WebKit/UIProcess/ios/WKBaseScrollView.mm: Renamed from Source/WebKit/UIProcess/ios/WKAxisLockingScrollView.mm.
(-[WKBaseScrollView initWithFrame:]):
(-[WKBaseScrollView addGestureRecognizer:]):
(-[WKBaseScrollView removeGestureRecognizer:]):
(-[WKBaseScrollView _updatePanGestureToPreventScrolling]):
(-[WKBaseScrollView _axesToPreventScrollingFromDelegate]):

Drive-by fix: fall back to `UIAxisNeither` instead of `UIAxisBoth` if the delegate is unset. Note
that this shouldn't actually change behavior in practice, since the delegate is always set for the
subclasses.

(-[WKBaseScrollView _subclassHandlesAsyncScrollEvent]):
(-[WKBaseScrollView _asynchronouslyHandleScrollEvent:completion:]):
(-[WKBaseScrollView gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]):
(-[WKBaseScrollView gestureRecognizerShouldBegin:]):
* Source/WebKit/UIProcess/ios/WKScrollView.mm:
(-[WKScrollView initWithFrame:]):
* Source/WebKit/UIProcess/ios/WKVelocityTrackingScrollView.h:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Tools/TestRunnerShared/spi/UIKitSPIForTesting.h:
* Tools/TestWebKitAPI/Tests/ios/WKScrollViewTests.mm:

Canonical link: https://commits.webkit.org/271491@main




More information about the webkit-changes mailing list