Title: [279197] trunk/Source/WebKit
- Revision
- 279197
- Author
- wenson_hs...@apple.com
- Date
- 2021-06-23 16:44:02 -0700 (Wed, 23 Jun 2021)
Log Message
Add a delegate SPI to allow arbitrary gestures to ignore preventDefault() with active touch events
https://bugs.webkit.org/show_bug.cgi?id=227311
rdar://79624236
Reviewed by Tim Horton.
Add a UI delegate hook to allow internal clients to (easily) introduce gesture recognizers on WKWebView that are
capable of recognizing even if active touch events are prevented by the page. This allows Safari to stop
overriding an internal method on WKWebView, `-_isNavigationSwipeGestureRecognizer:`.
Testing this requires the ability to simulate touch events (through HID event dispatch) in API tests.
* UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView _touchEventsMustRequireGestureRecognizerToFail:]):
Note that we only consult the delegate here for gestures that are added directly to WKWebView. This is because
we already avoid deferring gestures that are added *above* WKWebView, and it's unnecessary to allow clients to
avoid deferring gestures that are internal to WebKit (i.e. added on WKContentView).
(-[WKContentView gestureRecognizer:shouldRequireFailureOfGestureRecognizer:]):
(-[WKContentView deferringGestureRecognizer:shouldDeferOtherGestureRecognizer:]):
Modified Paths
Diff
Modified: trunk/Source/WebKit/ChangeLog (279196 => 279197)
--- trunk/Source/WebKit/ChangeLog 2021-06-23 23:36:41 UTC (rev 279196)
+++ trunk/Source/WebKit/ChangeLog 2021-06-23 23:44:02 UTC (rev 279197)
@@ -1,3 +1,28 @@
+2021-06-23 Wenson Hsieh <wenson_hs...@apple.com>
+
+ Add a delegate SPI to allow arbitrary gestures to ignore preventDefault() with active touch events
+ https://bugs.webkit.org/show_bug.cgi?id=227311
+ rdar://79624236
+
+ Reviewed by Tim Horton.
+
+ Add a UI delegate hook to allow internal clients to (easily) introduce gesture recognizers on WKWebView that are
+ capable of recognizing even if active touch events are prevented by the page. This allows Safari to stop
+ overriding an internal method on WKWebView, `-_isNavigationSwipeGestureRecognizer:`.
+
+ Testing this requires the ability to simulate touch events (through HID event dispatch) in API tests.
+
+ * UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
+ * UIProcess/ios/WKContentViewInteraction.mm:
+ (-[WKContentView _touchEventsMustRequireGestureRecognizerToFail:]):
+
+ Note that we only consult the delegate here for gestures that are added directly to WKWebView. This is because
+ we already avoid deferring gestures that are added *above* WKWebView, and it's unnecessary to allow clients to
+ avoid deferring gestures that are internal to WebKit (i.e. added on WKContentView).
+
+ (-[WKContentView gestureRecognizer:shouldRequireFailureOfGestureRecognizer:]):
+ (-[WKContentView deferringGestureRecognizer:shouldDeferOtherGestureRecognizer:]):
+
2021-06-23 Martin Robinson <mrobin...@igalia.com>
[iOS 15 Regression]: scroll position resets when using scroll snap
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h (279196 => 279197)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h 2021-06-23 23:36:41 UTC (rev 279196)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h 2021-06-23 23:44:02 UTC (rev 279197)
@@ -221,6 +221,7 @@
- (BOOL)_webView:(WKWebView *)webView gestureRecognizerCouldPinch:(UIGestureRecognizer *)gestureRecognizer WK_API_AVAILABLE(ios(13.0));
- (BOOL)_webViewCanBecomeFocused:(WKWebView *)webView WK_API_AVAILABLE(ios(15.0));
+- (BOOL)_webView:(WKWebView *)webView touchEventsMustRequireGestureRecognizerToFail:(UIGestureRecognizer *)gestureRecognizer WK_API_AVAILABLE(ios(15.0));
#else // !TARGET_OS_IPHONE
Modified: trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm (279196 => 279197)
--- trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm 2021-06-23 23:36:41 UTC (rev 279196)
+++ trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm 2021-06-23 23:44:02 UTC (rev 279197)
@@ -1631,6 +1631,17 @@
#endif
}
+- (BOOL)_touchEventsMustRequireGestureRecognizerToFail:(UIGestureRecognizer *)gestureRecognizer
+{
+ auto webView = self.webView;
+ if ([webView _isNavigationSwipeGestureRecognizer:gestureRecognizer])
+ return YES;
+
+ id <WKUIDelegatePrivate> uiDelegate = static_cast<id <WKUIDelegatePrivate>>([webView UIDelegate]);
+ return gestureRecognizer.view == webView && [uiDelegate respondsToSelector:@selector(_webView:touchEventsMustRequireGestureRecognizerToFail:)]
+ && [uiDelegate _webView:webView touchEventsMustRequireGestureRecognizerToFail:gestureRecognizer];
+}
+
- (void)_webTouchEventsRecognized:(UIWebTouchEventsGestureRecognizer *)gestureRecognizer
{
if (!_page->hasRunningProcess())
@@ -2442,7 +2453,7 @@
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
- if (gestureRecognizer == _touchEventGestureRecognizer && [_webView _isNavigationSwipeGestureRecognizer:otherGestureRecognizer])
+ if (gestureRecognizer == _touchEventGestureRecognizer && [self _touchEventsMustRequireGestureRecognizerToFail:otherGestureRecognizer])
return YES;
if ([otherGestureRecognizer isKindOfClass:WKDeferringGestureRecognizer.class])
@@ -7895,7 +7906,7 @@
- (BOOL)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer shouldDeferOtherGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
#if ENABLE(IOS_TOUCH_EVENTS)
- if ([_webView _isNavigationSwipeGestureRecognizer:gestureRecognizer])
+ if ([self _touchEventsMustRequireGestureRecognizerToFail:gestureRecognizer])
return NO;
auto webView = _webView.getAutoreleased();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes