Changeset 271193 in webkit
- Timestamp:
- Jan 5, 2021, 9:59:24 PM (6 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 9 edited
-
ChangeLog (modified) (1 diff)
-
UIProcess/PageClient.h (modified) (1 diff)
-
UIProcess/WebPageProxy.cpp (modified) (5 diffs)
-
UIProcess/ios/PageClientImplIOS.h (modified) (1 diff)
-
UIProcess/ios/PageClientImplIOS.mm (modified) (1 diff)
-
UIProcess/ios/WKContentViewInteraction.h (modified) (2 diffs)
-
UIProcess/ios/WKContentViewInteraction.mm (modified) (10 diffs)
-
UIProcess/ios/WKDeferringGestureRecognizer.h (modified) (1 diff)
-
UIProcess/ios/WKDeferringGestureRecognizer.mm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r271192 r271193 1 2021-01-05 Wenson Hsieh <wenson_hsieh@apple.com> 2 3 Refactor some logic around touch event deferring gesture recognizers 4 https://bugs.webkit.org/show_bug.cgi?id=220345 5 6 Reviewed by Tim Horton. 7 8 Rename `_deferringGestureRecognizerForFoo` to `_touchStartDeferringGestureRecognizerForFoo`, to make it clear 9 that these deferring gestures are only intended to defer native gestures until the "touchstart" event has been 10 handled. 11 12 This distinction becomes important once I introduce deferring gesture recognizers that defer the "touchend" 13 event, and prevent gestures that activate upon touch end (i.e. various types of tap gesture recognizers). 14 15 See below for more details. 16 17 * UIProcess/PageClient.h: 18 * UIProcess/WebPageProxy.cpp: 19 (WebKit::WebPageProxy::handlePreventableTouchEvent): 20 * UIProcess/ios/PageClientImplIOS.h: 21 * UIProcess/ios/PageClientImplIOS.mm: 22 (WebKit::PageClientImpl::doneDeferringTouchStart): 23 (WebKit::PageClientImpl::doneDeferringNativeGestures): Deleted. 24 * UIProcess/ios/WKContentViewInteraction.h: 25 * UIProcess/ios/WKContentViewInteraction.mm: 26 (-[WKContentView setUpInteraction]): 27 (-[WKContentView cleanUpInteraction]): 28 (-[WKContentView _removeDefaultGestureRecognizers]): 29 (-[WKContentView _addDefaultGestureRecognizers]): 30 (-[WKContentView _webTouchEventsRecognized:]): 31 (-[WKContentView _touchStartDeferringGestures]): 32 (-[WKContentView _doneDeferringTouchStart:]): 33 (-[WKContentView gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]): 34 (-[WKContentView deferringGestureRecognizer:shouldDeferOtherGestureRecognizer:]): 35 (-[WKContentView _deferringGestureRecognizers]): Deleted. 36 (-[WKContentView _doneDeferringNativeGestures:]): Deleted. 37 38 Rename this to `-_doneDeferringTouchStart:`. 39 40 (-[WKContentView deferringGestureRecognizer:shouldDeferGesturesAfterEndingTouchesWithEvent:]): 41 42 Deleted. This logic has been moved to WKContentView (see below). 43 44 * UIProcess/ios/WKDeferringGestureRecognizer.h: 45 * UIProcess/ios/WKDeferringGestureRecognizer.mm: 46 (-[WKDeferringGestureRecognizer touchesEnded:withEvent:]): Deleted. 47 48 Additionally refactor this code so that this fallback logic for lifting the gesture gate exists inside 49 `WKContentView` (after ending all touches), rather than inside the deferring gesture recognizer. While this 50 doesn't affect the extant touch start deferring gestures, it will ensure that touch end deferring gestures won't 51 get reset prematurely due to the web touch events gesture recognizer ending before the touch end deferring 52 gesture. 53 1 54 2021-01-05 Kate Cheney <katherine_cheney@apple.com> 2 55 -
trunk/Source/WebKit/UIProcess/PageClient.h
r270712 r271193 340 340 #endif 341 341 #if ENABLE(IOS_TOUCH_EVENTS) 342 virtual void doneDeferring NativeGestures(bool preventNativeGestures) = 0;342 virtual void doneDeferringTouchStart(bool preventNativeGestures) = 0; 343 343 #endif 344 344 -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r271174 r271193 2892 2892 if (touchEventsTrackingType == TrackingType::NotTracking) { 2893 2893 if (!isHandlingPreventableTouchStart()) 2894 pageClient().doneDeferring NativeGestures(false);2894 pageClient().doneDeferringTouchStart(false); 2895 2895 return; 2896 2896 } … … 2907 2907 didReceiveEvent(event.type(), false); 2908 2908 if (!isHandlingPreventableTouchStart()) 2909 pageClient().doneDeferring NativeGestures(false);2909 pageClient().doneDeferringTouchStart(false); 2910 2910 return; 2911 2911 } … … 2914 2914 ++m_handlingPreventableTouchStartCount; 2915 2915 Function<void(bool, CallbackBase::Error)> completionHandler = [this, protectedThis = makeRef(*this), event](bool handled, CallbackBase::Error error) { 2916 ASSERT(m_handlingPreventableTouchStartCount); 2917 if (m_handlingPreventableTouchStartCount) 2918 --m_handlingPreventableTouchStartCount; 2916 bool didFinishDeferringTouchStart = false; 2917 ASSERT_IMPLIES(event.type() == WebEvent::TouchStart, m_handlingPreventableTouchStartCount); 2918 if (event.type() == WebEvent::TouchStart && m_handlingPreventableTouchStartCount) 2919 didFinishDeferringTouchStart = !--m_handlingPreventableTouchStartCount; 2919 2920 2920 2921 bool handledOrFailedWithError = handled || error != CallbackBase::Error::None || m_handledSynchronousTouchEventWhileDispatchingPreventableTouchStart; … … 2927 2928 didReceiveEvent(event.type(), handledOrFailedWithError); 2928 2929 pageClient().doneWithTouchEvent(event, handledOrFailedWithError); 2929 if (!isHandlingPreventableTouchStart()) 2930 pageClient().doneDeferringNativeGestures(handledOrFailedWithError); 2930 2931 if (didFinishDeferringTouchStart) 2932 pageClient().doneDeferringTouchStart(handledOrFailedWithError); 2931 2933 }; 2932 2934 … … 2945 2947 pageClient().doneWithTouchEvent(event, handled); 2946 2948 if (!isHandlingPreventableTouchStart()) 2947 pageClient().doneDeferring NativeGestures(handled);2949 pageClient().doneDeferringTouchStart(handled); 2948 2950 else if (handled) 2949 2951 m_handledSynchronousTouchEventWhileDispatchingPreventableTouchStart = true; -
trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h
r270712 r271193 113 113 #endif 114 114 #if ENABLE(IOS_TOUCH_EVENTS) 115 void doneDeferring NativeGestures(bool preventNativeGestures) override;115 void doneDeferringTouchStart(bool preventNativeGestures) override; 116 116 #endif 117 117 RefPtr<WebPopupMenuProxy> createPopupMenuProxy(WebPageProxy&) override; -
trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm
r270712 r271193 448 448 #if ENABLE(IOS_TOUCH_EVENTS) 449 449 450 void PageClientImpl::doneDeferring NativeGestures(bool preventNativeGestures)451 { 452 [m_contentView _doneDeferring NativeGestures:preventNativeGestures];450 void PageClientImpl::doneDeferringTouchStart(bool preventNativeGestures) 451 { 452 [m_contentView _doneDeferringTouchStart:preventNativeGestures]; 453 453 } 454 454 -
trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h
r270901 r271193 243 243 @interface WKContentView () { 244 244 #if ENABLE(IOS_TOUCH_EVENTS) 245 RetainPtr<WKDeferringGestureRecognizer> _ deferringGestureRecognizerForImmediatelyResettableGestures;246 RetainPtr<WKDeferringGestureRecognizer> _ deferringGestureRecognizerForDelayedResettableGestures;247 RetainPtr<WKDeferringGestureRecognizer> _ deferringGestureRecognizerForSyntheticTapGestures;245 RetainPtr<WKDeferringGestureRecognizer> _touchStartDeferringGestureRecognizerForImmediatelyResettableGestures; 246 RetainPtr<WKDeferringGestureRecognizer> _touchStartDeferringGestureRecognizerForDelayedResettableGestures; 247 RetainPtr<WKDeferringGestureRecognizer> _touchStartDeferringGestureRecognizerForSyntheticTapGestures; 248 248 #endif 249 249 RetainPtr<UIWebTouchEventsGestureRecognizer> _touchEventGestureRecognizer; … … 540 540 #endif 541 541 #if ENABLE(IOS_TOUCH_EVENTS) 542 - (void)_doneDeferring NativeGestures:(BOOL)preventNativeGestures;542 - (void)_doneDeferringTouchStart:(BOOL)preventNativeGestures; 543 543 #endif 544 544 - (void)_commitPotentialTapFailed; -
trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm
r271149 r271193 765 765 766 766 #if ENABLE(IOS_TOUCH_EVENTS) 767 _ deferringGestureRecognizerForImmediatelyResettableGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]);768 [_ deferringGestureRecognizerForImmediatelyResettableGestures setName:@"Touch event deferrer (immediate reset)"];769 770 _ deferringGestureRecognizerForDelayedResettableGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]);771 [_ deferringGestureRecognizerForDelayedResettableGestures setName:@"Touch event deferrer (delayed reset)"];772 773 _ deferringGestureRecognizerForSyntheticTapGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]);774 [_ deferringGestureRecognizerForSyntheticTapGestures setName:@"Touch event deferrer (synthetic tap)"];775 776 for (WKDeferringGestureRecognizer *gesture in self._ deferringGestureRecognizers) {767 _touchStartDeferringGestureRecognizerForImmediatelyResettableGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]); 768 [_touchStartDeferringGestureRecognizerForImmediatelyResettableGestures setName:@"Touch start deferrer (immediate reset)"]; 769 770 _touchStartDeferringGestureRecognizerForDelayedResettableGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]); 771 [_touchStartDeferringGestureRecognizerForDelayedResettableGestures setName:@"Touch start deferrer (delayed reset)"]; 772 773 _touchStartDeferringGestureRecognizerForSyntheticTapGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]); 774 [_touchStartDeferringGestureRecognizerForSyntheticTapGestures setName:@"Touch start deferrer (synthetic tap)"]; 775 776 for (WKDeferringGestureRecognizer *gesture in self._touchStartDeferringGestures) { 777 777 gesture.delegate = self; 778 778 [self addGestureRecognizer:gesture]; 779 779 } 780 #endif 780 #endif // ENABLE(IOS_TOUCH_EVENTS) 781 781 782 782 _touchEventGestureRecognizer = adoptNS([[UIWebTouchEventsGestureRecognizer alloc] initWithTarget:self action:@selector(_webTouchEventsRecognized:) touchDelegate:self]); … … 954 954 955 955 #if ENABLE(IOS_TOUCH_EVENTS) 956 for (WKDeferringGestureRecognizer *gesture in self._ deferringGestureRecognizers) {956 for (WKDeferringGestureRecognizer *gesture in self._touchStartDeferringGestures) { 957 957 gesture.delegate = nil; 958 958 [self removeGestureRecognizer:gesture]; … … 1085 1085 { 1086 1086 #if ENABLE(IOS_TOUCH_EVENTS) 1087 for (WKDeferringGestureRecognizer *gesture in self._ deferringGestureRecognizers)1087 for (WKDeferringGestureRecognizer *gesture in self._touchStartDeferringGestures) 1088 1088 [self removeGestureRecognizer:gesture]; 1089 1089 #endif … … 1112 1112 { 1113 1113 #if ENABLE(IOS_TOUCH_EVENTS) 1114 for (WKDeferringGestureRecognizer *gesture in self._ deferringGestureRecognizers)1114 for (WKDeferringGestureRecognizer *gesture in self._touchStartDeferringGestures) 1115 1115 [self addGestureRecognizer:gesture]; 1116 1116 #endif … … 1549 1549 if (nativeWebTouchEvent.isPotentialTap() && self.hasHiddenContentEditable && self._hasFocusedElement && !self.window.keyWindow) 1550 1550 [self.window makeKeyWindow]; 1551 } 1552 #endif 1551 1552 #if ENABLE(IOS_TOUCH_EVENTS) 1553 if (!_page->isHandlingPreventableTouchStart()) { 1554 for (WKDeferringGestureRecognizer *gesture in self._touchStartDeferringGestures) { 1555 if (gesture.state == UIGestureRecognizerStatePossible) 1556 gesture.state = UIGestureRecognizerStateFailed; 1557 } 1558 } 1559 #endif // ENABLE(IOS_TOUCH_EVENTS) 1560 } 1561 #endif // ENABLE(TOUCH_EVENTS) 1553 1562 } 1554 1563 … … 1728 1737 #if ENABLE(IOS_TOUCH_EVENTS) 1729 1738 1730 - (NSArray<WKDeferringGestureRecognizer *> *)_ deferringGestureRecognizers1739 - (NSArray<WKDeferringGestureRecognizer *> *)_touchStartDeferringGestures 1731 1740 { 1732 1741 WKDeferringGestureRecognizer *recognizers[3]; … … 1736 1745 recognizers[count++] = recognizer.get(); 1737 1746 }; 1738 add(_ deferringGestureRecognizerForImmediatelyResettableGestures);1739 add(_ deferringGestureRecognizerForDelayedResettableGestures);1740 add(_ deferringGestureRecognizerForSyntheticTapGestures);1747 add(_touchStartDeferringGestureRecognizerForImmediatelyResettableGestures); 1748 add(_touchStartDeferringGestureRecognizerForDelayedResettableGestures); 1749 add(_touchStartDeferringGestureRecognizerForSyntheticTapGestures); 1741 1750 return [NSArray arrayWithObjects:recognizers count:count]; 1742 1751 } 1743 1752 1744 - (void)_doneDeferring NativeGestures:(BOOL)preventNativeGestures1745 { 1746 for (WKDeferringGestureRecognizer *gesture in self._ deferringGestureRecognizers)1753 - (void)_doneDeferringTouchStart:(BOOL)preventNativeGestures 1754 { 1755 for (WKDeferringGestureRecognizer *gesture in self._touchStartDeferringGestures) 1747 1756 [gesture setDefaultPrevented:preventNativeGestures]; 1748 1757 } … … 2129 2138 { 2130 2139 #if ENABLE(IOS_TOUCH_EVENTS) 2131 for (WKDeferringGestureRecognizer *gesture in self._ deferringGestureRecognizers) {2140 for (WKDeferringGestureRecognizer *gesture in self._touchStartDeferringGestures) { 2132 2141 if (isSamePair(gestureRecognizer, otherGestureRecognizer, _touchEventGestureRecognizer.get(), gesture)) 2133 2142 return YES; … … 7302 7311 } 7303 7312 7304 - (BOOL)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer shouldDeferGesturesAfterEndingTouchesWithEvent:(UIEvent *)event7305 {7306 return _page->isHandlingPreventableTouchStart();7307 }7308 7309 7313 - (BOOL)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer shouldDeferOtherGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 7310 7314 { … … 7358 7362 }; 7359 7363 7360 if ( gestureRecognizer == _doubleTapGestureRecognizer || gestureRecognizer == _singleTapGestureRecognizer)7361 return deferringGestureRecognizer == _ deferringGestureRecognizerForSyntheticTapGestures;7364 if ([gestureRecognizer isKindOfClass:WKSyntheticTapGestureRecognizer.class]) 7365 return deferringGestureRecognizer == _touchStartDeferringGestureRecognizerForSyntheticTapGestures; 7362 7366 7363 7367 if (mayDelayResetOfContainingSubgraph(gestureRecognizer)) 7364 return deferringGestureRecognizer == _ deferringGestureRecognizerForDelayedResettableGestures;7365 7366 return deferringGestureRecognizer == _ deferringGestureRecognizerForImmediatelyResettableGestures;7368 return deferringGestureRecognizer == _touchStartDeferringGestureRecognizerForDelayedResettableGestures; 7369 7370 return deferringGestureRecognizer == _touchStartDeferringGestureRecognizerForImmediatelyResettableGestures; 7367 7371 #else 7368 7372 UNUSED_PARAM(deferringGestureRecognizer); -
trunk/Source/WebKit/UIProcess/ios/WKDeferringGestureRecognizer.h
r260366 r271193 31 31 32 32 @protocol WKDeferringGestureRecognizerDelegate 33 - (BOOL)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer shouldDeferGesturesAfterEndingTouchesWithEvent:(UIEvent *)event;34 33 - (BOOL)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer shouldDeferGesturesAfterBeginningTouchesWithEvent:(UIEvent *)event; 35 34 - (BOOL)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer shouldDeferOtherGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer; -
trunk/Source/WebKit/UIProcess/ios/WKDeferringGestureRecognizer.mm
r253267 r271193 56 56 } 57 57 58 - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event59 {60 [super touchesEnded:touches withEvent:event];61 62 if (self.state != UIGestureRecognizerStatePossible)63 return;64 65 if ([_deferringGestureDelegate deferringGestureRecognizer:self shouldDeferGesturesAfterEndingTouchesWithEvent:event])66 return;67 68 self.state = UIGestureRecognizerStateFailed;69 }70 71 58 - (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 72 59 {
Note:
See TracChangeset
for help on using the changeset viewer.