Title: [295396] trunk
Revision
295396
Author
timothy_hor...@apple.com
Date
2022-06-08 15:32:16 -0700 (Wed, 08 Jun 2022)

Log Message

App-overridden WKScrollView deceleration is reset every time WebKit commits the layer tree
https://bugs.webkit.org/show_bug.cgi?id=241436
<rdar://problem/41019318>

Reviewed by Simon Fraser.

* Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm:
(-[WKWebView scrollViewWillBeginDragging:]):
* Source/WebKit/UIProcess/ios/WKScrollView.h:
* Source/WebKit/UIProcess/ios/WKScrollView.mm:
(-[WKScrollView setDecelerationRate:]):
(-[WKScrollView _setDecelerationRateInternal:]):
Like we do for many other properties, if the client sets the deceleration rate
on WKScrollView, stop overriding it internally.

* Tools/TestWebKitAPI/Tests/ios/WKScrollViewTests.mm:
(TEST):
Add an API test.

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

Modified Paths

Diff

Modified: trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm (295395 => 295396)


--- trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm	2022-06-08 22:10:21 UTC (rev 295395)
+++ trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm	2022-06-08 22:32:16 UTC (rev 295396)
@@ -1686,9 +1686,7 @@
     // FIXME: We will want to detect whether snapping will occur before beginning to drag. See WebPageProxy::didCommitLayerTree.
     WebKit::RemoteScrollingCoordinatorProxy* coordinator = _page->scrollingCoordinatorProxy();
     ASSERT(scrollView == _scrollView.get());
-    CGFloat scrollDecelerationFactor = (coordinator && coordinator->shouldSetScrollViewDecelerationRateFast()) ? UIScrollViewDecelerationRateFast : UIScrollViewDecelerationRateNormal;
-    scrollView.horizontalScrollDecelerationFactor = scrollDecelerationFactor;
-    scrollView.verticalScrollDecelerationFactor = scrollDecelerationFactor;
+    [_scrollView _setDecelerationRateInternal:(coordinator && coordinator->shouldSetScrollViewDecelerationRateFast()) ? UIScrollViewDecelerationRateFast : UIScrollViewDecelerationRateNormal];
 
     coordinator->setRootNodeIsInUserScroll(true);
 #endif

Modified: trunk/Source/WebKit/UIProcess/ios/WKScrollView.h (295395 => 295396)


--- trunk/Source/WebKit/UIProcess/ios/WKScrollView.h	2022-06-08 22:10:21 UTC (rev 295395)
+++ trunk/Source/WebKit/UIProcess/ios/WKScrollView.h	2022-06-08 22:32:16 UTC (rev 295396)
@@ -39,6 +39,7 @@
 - (void)_setScrollEnabledInternal:(BOOL)enabled;
 - (void)_setZoomEnabledInternal:(BOOL)enabled;
 - (BOOL)_setContentScrollInsetInternal:(UIEdgeInsets)insets;
+- (void)_setDecelerationRateInternal:(UIScrollViewDecelerationRate)rate;
 
 // FIXME: Likely we can remove this special case for watchOS and tvOS.
 #if !PLATFORM(WATCHOS) && !PLATFORM(APPLETV)

Modified: trunk/Source/WebKit/UIProcess/ios/WKScrollView.mm (295395 => 295396)


--- trunk/Source/WebKit/UIProcess/ios/WKScrollView.mm	2022-06-08 22:10:21 UTC (rev 295395)
+++ trunk/Source/WebKit/UIProcess/ios/WKScrollView.mm	2022-06-08 22:32:16 UTC (rev 295396)
@@ -129,6 +129,7 @@
 
     BOOL _backgroundColorSetByClient;
     BOOL _indicatorStyleSetByClient;
+    BOOL _decelerationRateSetByClient;
 // FIXME: Likely we can remove this special case for watchOS and tvOS.
 #if !PLATFORM(WATCHOS) && !PLATFORM(APPLETV)
     BOOL _contentInsetAdjustmentBehaviorWasExternallyOverridden;
@@ -260,6 +261,20 @@
     super.indicatorStyle = indicatorStyle;
 }
 
+- (void)setDecelerationRate:(UIScrollViewDecelerationRate)rate
+{
+    _decelerationRateSetByClient = YES;
+    super.decelerationRate = rate;
+}
+
+- (void)_setDecelerationRateInternal:(UIScrollViewDecelerationRate)rate
+{
+    if (_decelerationRateSetByClient)
+        return;
+
+    super.decelerationRate = rate;
+}
+
 static inline bool valuesAreWithinOnePixel(CGFloat a, CGFloat b)
 {
     return CGFAbs(a - b) < 1;

Modified: trunk/Tools/TestWebKitAPI/Tests/ios/WKScrollViewTests.mm (295395 => 295396)


--- trunk/Tools/TestWebKitAPI/Tests/ios/WKScrollViewTests.mm	2022-06-08 22:10:21 UTC (rev 295395)
+++ trunk/Tools/TestWebKitAPI/Tests/ios/WKScrollViewTests.mm	2022-06-08 22:32:16 UTC (rev 295396)
@@ -282,4 +282,18 @@
     EXPECT_TRUE(CGColorEqualToColor([webView scrollView].backgroundColor.CGColor, whiteColor.get()));
 }
 
+TEST(WKScrollViewTests, DecelerationSetByClient)
+{
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 320, 500)]);
+
+    [webView synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"first"];
+    EXPECT_FLOAT_EQ([webView scrollView].decelerationRate, UIScrollViewDecelerationRateNormal);
+
+    [webView scrollView].decelerationRate = UIScrollViewDecelerationRateFast;
+    EXPECT_FLOAT_EQ([webView scrollView].decelerationRate, UIScrollViewDecelerationRateFast);
+
+    [webView synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"second"];
+    EXPECT_FLOAT_EQ([webView scrollView].decelerationRate, UIScrollViewDecelerationRateFast);
+}
+
 #endif // PLATFORM(IOS_FAMILY)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to