Title: [211121] trunk/Source/WebKit2
Revision
211121
Author
[email protected]
Date
2017-01-24 16:49:33 -0800 (Tue, 24 Jan 2017)

Log Message

Script gets touch events even after navigation swipe begins
https://bugs.webkit.org/show_bug.cgi?id=167383
<rdar://problem/22938927>

Reviewed by Simon Fraser.

* Platform/spi/ios/UIKitSPI.h:
* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _isNavigationSwipeGestureRecognizer:]):
* UIProcess/API/Cocoa/WKWebViewInternal.h:
* UIProcess/Cocoa/ViewGestureController.h:
* UIProcess/ios/ViewGestureControllerIOS.mm:
(-[WKSwipeTransitionController isNavigationSwipeGestureRecognizer:]):
(WebKit::ViewGestureController::isNavigationSwipeGestureRecognizer):
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView gestureRecognizer:shouldRequireFailureOfGestureRecognizer:]):
Require the navigation swipe gesture recognizer to fail before the
UIWebTouchEventsGestureRecognizer can recognize. This way, the page
doesn't get touch events during the swipe, which previously led to
e.g. carousels scrolling while swiping.

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (211120 => 211121)


--- trunk/Source/WebKit2/ChangeLog	2017-01-25 00:15:00 UTC (rev 211120)
+++ trunk/Source/WebKit2/ChangeLog	2017-01-25 00:49:33 UTC (rev 211121)
@@ -1,3 +1,26 @@
+2017-01-24  Tim Horton  <[email protected]>
+
+        Script gets touch events even after navigation swipe begins
+        https://bugs.webkit.org/show_bug.cgi?id=167383
+        <rdar://problem/22938927>
+
+        Reviewed by Simon Fraser.
+
+        * Platform/spi/ios/UIKitSPI.h:
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _isNavigationSwipeGestureRecognizer:]):
+        * UIProcess/API/Cocoa/WKWebViewInternal.h:
+        * UIProcess/Cocoa/ViewGestureController.h:
+        * UIProcess/ios/ViewGestureControllerIOS.mm:
+        (-[WKSwipeTransitionController isNavigationSwipeGestureRecognizer:]):
+        (WebKit::ViewGestureController::isNavigationSwipeGestureRecognizer):
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView gestureRecognizer:shouldRequireFailureOfGestureRecognizer:]):
+        Require the navigation swipe gesture recognizer to fail before the
+        UIWebTouchEventsGestureRecognizer can recognize. This way, the page
+        doesn't get touch events during the swipe, which previously led to
+        e.g. carousels scrolling while swiping.
+
 2017-01-24  Matt Rajca  <[email protected]>
 
         Pass down website autoplay policies to media elements

Modified: trunk/Source/WebKit2/Platform/spi/ios/UIKitSPI.h (211120 => 211121)


--- trunk/Source/WebKit2/Platform/spi/ios/UIKitSPI.h	2017-01-25 00:15:00 UTC (rev 211120)
+++ trunk/Source/WebKit2/Platform/spi/ios/UIKitSPI.h	2017-01-25 00:49:33 UTC (rev 211121)
@@ -742,6 +742,7 @@
 
 @interface _UINavigationInteractiveTransitionBase ()
 - (id)initWithGestureRecognizerView:(UIView *)gestureRecognizerView animator:(id<UIViewControllerAnimatedTransitioning>)animator delegate:(id<_UINavigationInteractiveTransitionBaseDelegate>)delegate;
+@property (nonatomic, weak) UIPanGestureRecognizer *gestureRecognizer;
 @property (nonatomic, assign) BOOL shouldReverseTranslation;
 @property (nonatomic, retain) _UINavigationParallaxTransition *animationController;
 @end

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (211120 => 211121)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm	2017-01-25 00:15:00 UTC (rev 211120)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm	2017-01-25 00:49:33 UTC (rev 211121)
@@ -2304,6 +2304,13 @@
     return _allowsBackForwardNavigationGestures;
 }
 
+- (BOOL)_isNavigationSwipeGestureRecognizer:(UIGestureRecognizer *)recognizer
+{
+    if (!_gestureController)
+        return NO;
+    return _gestureController->isNavigationSwipeGestureRecognizer(recognizer);
+}
+
 - (void)_navigationGestureDidBegin
 {
     // During a back/forward swipe, there's a view interposed between this view and the content view that has

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h (211120 => 211121)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h	2017-01-25 00:15:00 UTC (rev 211120)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h	2017-01-25 00:49:33 UTC (rev 211121)
@@ -114,6 +114,7 @@
 
 - (void)_navigationGestureDidBegin;
 - (void)_navigationGestureDidEnd;
+- (BOOL)_isNavigationSwipeGestureRecognizer:(UIGestureRecognizer *)recognizer;
 
 @property (nonatomic, readonly) BOOL _isBackground;
 

Modified: trunk/Source/WebKit2/UIProcess/Cocoa/ViewGestureController.h (211120 => 211121)


--- trunk/Source/WebKit2/UIProcess/Cocoa/ViewGestureController.h	2017-01-25 00:15:00 UTC (rev 211120)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/ViewGestureController.h	2017-01-25 00:49:33 UTC (rev 211121)
@@ -39,6 +39,7 @@
 OBJC_CLASS CALayer;
 
 #if PLATFORM(IOS)
+OBJC_CLASS UIGestureRecognizer;
 OBJC_CLASS UIView;
 OBJC_CLASS WKSwipeTransitionController;
 OBJC_CLASS _UINavigationInteractiveTransitionBase;
@@ -105,6 +106,7 @@
 
     bool isPhysicallySwipingLeft(SwipeDirection) const;
 #else
+    bool isNavigationSwipeGestureRecognizer(UIGestureRecognizer *) const;
     void installSwipeHandler(UIView *gestureRecognizerView, UIView *swipingView);
     void beginSwipeGesture(_UINavigationInteractiveTransitionBase *, SwipeDirection);
     void endSwipeGesture(WebBackForwardListItem* targetItem, _UIViewControllerTransitionContext *, bool cancelled);

Modified: trunk/Source/WebKit2/UIProcess/ios/ViewGestureControllerIOS.mm (211120 => 211121)


--- trunk/Source/WebKit2/UIProcess/ios/ViewGestureControllerIOS.mm	2017-01-25 00:15:00 UTC (rev 211120)
+++ trunk/Source/WebKit2/UIProcess/ios/ViewGestureControllerIOS.mm	2017-01-25 00:49:33 UTC (rev 211121)
@@ -129,6 +129,11 @@
     return [recognizer autorelease];
 }
 
+- (BOOL)isNavigationSwipeGestureRecognizer:(UIGestureRecognizer *)recognizer
+{
+    return recognizer == [_backTransitionController gestureRecognizer] || recognizer == [_forwardTransitionController gestureRecognizer];
+}
+
 @end
 
 namespace WebKit {
@@ -141,6 +146,11 @@
     [m_swipeInteractiveTransitionDelegate invalidate];
 }
 
+bool ViewGestureController::isNavigationSwipeGestureRecognizer(UIGestureRecognizer *recognizer) const
+{
+    return [m_swipeInteractiveTransitionDelegate isNavigationSwipeGestureRecognizer:recognizer];
+}
+
 void ViewGestureController::installSwipeHandler(UIView *gestureRecognizerView, UIView *swipingView)
 {
     ASSERT(!m_swipeInteractiveTransitionDelegate);

Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm (211120 => 211121)


--- trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm	2017-01-25 00:15:00 UTC (rev 211120)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm	2017-01-25 00:49:33 UTC (rev 211121)
@@ -1193,6 +1193,14 @@
     return NO;
 }
 
+- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
+{
+    if (gestureRecognizer == _touchEventGestureRecognizer && [_webView _isNavigationSwipeGestureRecognizer:otherGestureRecognizer])
+        return YES;
+
+    return NO;
+}
+
 - (void)_showImageSheet
 {
     [_actionSheetAssistant showImageSheet];
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to