Changeset 274610 in webkit
- Timestamp:
- Mar 17, 2021 7:51:49 PM (3 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r274591 r274610 1 2021-03-17 Wenson Hsieh <wenson_hsieh@apple.com> 2 3 [iOS] Refactor some gesture deferral logic to account for image extraction 4 https://bugs.webkit.org/show_bug.cgi?id=223400 5 <rdar://problem/75502285> 6 7 Reviewed by Tim Horton. 8 9 Refactor some logic around deferring gestures. See below for more details. 10 11 * UIProcess/ios/WKContentViewInteraction.h: 12 * UIProcess/ios/WKContentViewInteraction.mm: 13 (-[WKContentView setUpInteraction]): 14 15 Rename a few existing deferring gestures, to better reflect that the names are deferral reasons (i.e. touch 16 start, touch end, or image extraction), rather than the names of the things being deferred. 17 18 (-[WKContentView deferringGestures]): 19 (-[WKContentView _doneDeferringTouchStart:]): 20 (-[WKContentView _doneDeferringTouchEnd:]): 21 (-[WKContentView hasSelectablePositionAtPoint:]): 22 (-[WKContentView textInteractionGesture:shouldBeginAtPoint:]): 23 (-[WKContentView deferringGestureRecognizer:shouldDeferOtherGestureRecognizer:]): 24 (-[WKContentView _endImageExtractionGestureDeferral:]): 25 * UIProcess/ios/WKDeferringGestureRecognizer.h: 26 27 Add a property to indicate that the deferring gesture recognizer should immediately fail upon touchend. 28 29 * UIProcess/ios/WKDeferringGestureRecognizer.mm: 30 (-[WKDeferringGestureRecognizer touchesEnded:withEvent:]): 31 (-[WKDeferringGestureRecognizer endDeferral:]): 32 (-[WKDeferringGestureRecognizer setDefaultPrevented:]): Deleted. 33 34 Rename `-setDefaultPrevented:` to `-endDeferral:` to decouple this terminology from `Event.preventDefault()` in 35 bindings (which is important, now that we have a new deferrer that is not associated with touch events). 36 Additionally, change this take an `enum class` instead of a `BOOL` to help clarify the intent of the given flag. 37 38 * UIProcess/ios/WKImageExtractionGestureRecognizer.h: 39 * UIProcess/ios/WKImageExtractionGestureRecognizer.mm: 40 (-[WKImageExtractionGestureRecognizer setState:]): 41 42 Add support for a new image extraction gesture delegate method which informs the client that the gesture has 43 transitioned to Failed state. 44 1 45 2021-03-17 Peng Liu <peng.liu6@apple.com> 2 46 -
trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h
r274581 r274610 247 247 RetainPtr<WKDeferringGestureRecognizer> _touchEndDeferringGestureRecognizerForDelayedResettableGestures; 248 248 RetainPtr<WKDeferringGestureRecognizer> _touchEndDeferringGestureRecognizerForSyntheticTapGestures; 249 #if ENABLE(IMAGE_EXTRACTION) 250 RetainPtr<WKDeferringGestureRecognizer> _imageExtractionDeferringGestureRecognizer; 251 #endif 249 252 std::unique_ptr<WebKit::GestureRecognizerConsistencyEnforcer> _gestureRecognizerConsistencyEnforcer; 250 253 RetainPtr<UIWebTouchEventsGestureRecognizer> _touchEventGestureRecognizer; … … 698 701 #endif 699 702 703 #if ENABLE(IMAGE_EXTRACTION) 704 - (void)_endImageExtractionGestureDeferral:(WebKit::ShouldPreventGestures)shouldPreventGestures; 705 #endif 706 700 707 @end 701 708 -
trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm
r274581 r274610 775 775 776 776 _touchStartDeferringGestureRecognizerForImmediatelyResettableGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]); 777 [_touchStartDeferringGestureRecognizerForImmediatelyResettableGestures setName:@" Touch start deferrer(immediate reset)"];777 [_touchStartDeferringGestureRecognizerForImmediatelyResettableGestures setName:@"Deferrer for touch start (immediate reset)"]; 778 778 779 779 _touchStartDeferringGestureRecognizerForDelayedResettableGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]); 780 [_touchStartDeferringGestureRecognizerForDelayedResettableGestures setName:@" Touch start deferrer(delayed reset)"];780 [_touchStartDeferringGestureRecognizerForDelayedResettableGestures setName:@"Deferrer for touch start (delayed reset)"]; 781 781 782 782 _touchStartDeferringGestureRecognizerForSyntheticTapGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]); 783 [_touchStartDeferringGestureRecognizerForSyntheticTapGestures setName:@" Touch start deferrer(synthetic tap)"];783 [_touchStartDeferringGestureRecognizerForSyntheticTapGestures setName:@"Deferrer for touch start (synthetic tap)"]; 784 784 785 785 _touchEndDeferringGestureRecognizerForImmediatelyResettableGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]); 786 [_touchEndDeferringGestureRecognizerForImmediatelyResettableGestures setName:@" Touch end deferrer(immediate reset)"];786 [_touchEndDeferringGestureRecognizerForImmediatelyResettableGestures setName:@"Deferrer for touch end (immediate reset)"]; 787 787 788 788 _touchEndDeferringGestureRecognizerForDelayedResettableGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]); 789 [_touchEndDeferringGestureRecognizerForDelayedResettableGestures setName:@" Touch end deferrer(delayed reset)"];789 [_touchEndDeferringGestureRecognizerForDelayedResettableGestures setName:@"Deferrer for touch end (delayed reset)"]; 790 790 791 791 _touchEndDeferringGestureRecognizerForSyntheticTapGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]); 792 [_touchEndDeferringGestureRecognizerForSyntheticTapGestures setName:@"Touch end deferrer (synthetic tap)"]; 792 [_touchEndDeferringGestureRecognizerForSyntheticTapGestures setName:@"Deferrer for touch end (synthetic tap)"]; 793 794 #if ENABLE(IMAGE_EXTRACTION) 795 _imageExtractionDeferringGestureRecognizer = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]); 796 [_imageExtractionDeferringGestureRecognizer setName:@"Deferrer for image extraction"]; 797 [_imageExtractionDeferringGestureRecognizer setImmediatelyFailsAfterTouchEnd:YES]; 798 #endif 793 799 794 800 for (WKDeferringGestureRecognizer *gesture in self.deferringGestures) { … … 1761 1767 - (NSArray<WKDeferringGestureRecognizer *> *)deferringGestures 1762 1768 { 1763 auto gestures = [NSMutableArray arrayWithCapacity: 6];1769 auto gestures = [NSMutableArray arrayWithCapacity:7]; 1764 1770 [gestures addObjectsFromArray:self._touchStartDeferringGestures]; 1765 1771 [gestures addObjectsFromArray:self._touchEndDeferringGestures]; 1772 #if ENABLE(IMAGE_EXTRACTION) 1773 [gestures addObject:_imageExtractionDeferringGestureRecognizer.get()]; 1774 #endif 1766 1775 return gestures; 1767 1776 } … … 1798 1807 { 1799 1808 for (WKDeferringGestureRecognizer *gesture in self._touchStartDeferringGestures) 1800 [gesture setDefaultPrevented:preventNativeGestures];1809 [gesture endDeferral:preventNativeGestures ? WebKit::ShouldPreventGestures::Yes : WebKit::ShouldPreventGestures::No]; 1801 1810 } 1802 1811 … … 1804 1813 { 1805 1814 for (WKDeferringGestureRecognizer *gesture in self._touchEndDeferringGestures) 1806 [gesture setDefaultPrevented:preventNativeGestures];1815 [gesture endDeferral:preventNativeGestures ? WebKit::ShouldPreventGestures::Yes : WebKit::ShouldPreventGestures::No]; 1807 1816 } 1808 1817 … … 2668 2677 #if ENABLE(IMAGE_EXTRACTION) 2669 2678 if (_elementPendingImageExtraction && _positionInformation.elementContext == _elementPendingImageExtraction) 2670 return NO;2679 return YES; 2671 2680 #endif 2672 2681 … … 2746 2755 #if ENABLE(IMAGE_EXTRACTION) 2747 2756 if (_elementPendingImageExtraction && _positionInformation.elementContext == _elementPendingImageExtraction) 2748 return NO;2757 return YES; 2749 2758 #endif 2750 2759 … … 7617 7626 return NO; 7618 7627 7628 BOOL isLoupeGesture = gestureRecognizer == [_textInteractionAssistant loupeGesture]; 7629 BOOL isTapAndAHalfGesture = [gestureRecognizer isKindOfClass:tapAndAHalfRecognizerClass()]; 7630 7631 #if ENABLE(IMAGE_EXTRACTION) 7632 if (deferringGestureRecognizer == _imageExtractionDeferringGestureRecognizer) 7633 return isLoupeGesture || isTapAndAHalfGesture || gestureRecognizer == [_textInteractionAssistant forcePressGesture]; 7634 #endif 7635 7619 7636 auto mayDelayResetOfContainingSubgraph = [&](UIGestureRecognizer *gesture) -> BOOL { 7620 7637 #if USE(UICONTEXTMENU) && HAVE(LINK_PREVIEW) … … 7628 7645 #endif 7629 7646 7630 if ( [gesture isKindOfClass:tapAndAHalfRecognizerClass()])7647 if (isTapAndAHalfGesture) 7631 7648 return YES; 7632 7649 7633 if ( gesture == [_textInteractionAssistant loupeGesture])7650 if (isLoupeGesture) 7634 7651 return YES; 7635 7652 … … 9410 9427 9411 9428 #if ENABLE(IMAGE_EXTRACTION) 9429 9430 - (void)_endImageExtractionGestureDeferral:(WebKit::ShouldPreventGestures)shouldPreventGestures 9431 { 9432 [_imageExtractionDeferringGestureRecognizer endDeferral:shouldPreventGestures]; 9433 } 9412 9434 9413 9435 - (void)_doAfterPendingImageExtraction:(void(^)(WebKit::ProceedWithImageExtraction proceedWithImageExtraction))block -
trunk/Source/WebKit/UIProcess/ios/WKDeferringGestureRecognizer.h
r273305 r274610 31 31 32 32 enum class ShouldDeferGestures : bool { No, Yes }; 33 enum class ShouldPreventGestures : bool { No, Yes }; 33 34 34 35 } // namespace WebKit … … 46 47 47 48 - (instancetype)initWithDeferringGestureDelegate:(id <WKDeferringGestureRecognizerDelegate>)deferringGestureDelegate; 48 - (void)setDefaultPrevented:(BOOL)defaultPrevented; 49 49 50 - (BOOL)shouldDeferGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer; 51 - (void)endDeferral:(WebKit::ShouldPreventGestures)shouldPreventGestures; 52 53 @property (nonatomic) BOOL immediatelyFailsAfterTouchEnd; 50 54 51 55 @end -
trunk/Source/WebKit/UIProcess/ios/WKDeferringGestureRecognizer.mm
r273305 r274610 55 55 [super touchesEnded:touches withEvent:event]; 56 56 57 if (self.immediatelyFailsAfterTouchEnd) 58 self.state = UIGestureRecognizerStateFailed; 59 57 60 [_deferringGestureDelegate deferringGestureRecognizer:self didEndTouchesWithEvent:event]; 58 61 } … … 64 67 } 65 68 66 - (void) setDefaultPrevented:(BOOL)defaultPrevented69 - (void)endDeferral:(WebKit::ShouldPreventGestures)shouldPreventGestures 67 70 { 68 if ( defaultPrevented)71 if (shouldPreventGestures == WebKit::ShouldPreventGestures::Yes) 69 72 self.state = UIGestureRecognizerStateEnded; 70 73 else -
trunk/Source/WebKit/UIProcess/ios/WKImageExtractionGestureRecognizer.h
r270332 r274610 34 34 @protocol WKImageExtractionGestureRecognizerDelegate <UIGestureRecognizerDelegate> 35 35 - (void)imageExtractionGestureDidBegin:(WKImageExtractionGestureRecognizer *)gesture; 36 - (void)imageExtractionGestureDidFail:(WKImageExtractionGestureRecognizer *)gesture; 36 37 @end 37 38 -
trunk/Source/WebKit/UIProcess/ios/WKImageExtractionGestureRecognizer.mm
r270332 r274610 52 52 53 53 auto newState = self.state; 54 if (previousState != newState && newState == UIGestureRecognizerStateBegan) 54 if (previousState == newState) 55 return; 56 57 if (newState == UIGestureRecognizerStateBegan) 55 58 [_imageExtractionDelegate imageExtractionGestureDidBegin:self]; 59 else if (newState == UIGestureRecognizerStateFailed) 60 [_imageExtractionDelegate imageExtractionGestureDidFail:self]; 56 61 } 57 62
Note: See TracChangeset
for help on using the changeset viewer.