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