Changeset 274610 in webkit


Ignore:
Timestamp:
Mar 17, 2021 7:51:49 PM (3 years ago)
Author:
Wenson Hsieh
Message:

[iOS] Refactor some gesture deferral logic to account for image extraction
https://bugs.webkit.org/show_bug.cgi?id=223400
<rdar://problem/75502285>

Reviewed by Tim Horton.

Refactor some logic around deferring gestures. See below for more details.

  • UIProcess/ios/WKContentViewInteraction.h:
  • UIProcess/ios/WKContentViewInteraction.mm:

(-[WKContentView setUpInteraction]):

Rename a few existing deferring gestures, to better reflect that the names are deferral reasons (i.e. touch
start, touch end, or image extraction), rather than the names of the things being deferred.

(-[WKContentView deferringGestures]):
(-[WKContentView _doneDeferringTouchStart:]):
(-[WKContentView _doneDeferringTouchEnd:]):
(-[WKContentView hasSelectablePositionAtPoint:]):
(-[WKContentView textInteractionGesture:shouldBeginAtPoint:]):
(-[WKContentView deferringGestureRecognizer:shouldDeferOtherGestureRecognizer:]):
(-[WKContentView _endImageExtractionGestureDeferral:]):

  • UIProcess/ios/WKDeferringGestureRecognizer.h:

Add a property to indicate that the deferring gesture recognizer should immediately fail upon touchend.

  • UIProcess/ios/WKDeferringGestureRecognizer.mm:

(-[WKDeferringGestureRecognizer touchesEnded:withEvent:]):
(-[WKDeferringGestureRecognizer endDeferral:]):
(-[WKDeferringGestureRecognizer setDefaultPrevented:]): Deleted.

Rename -setDefaultPrevented: to -endDeferral: to decouple this terminology from Event.preventDefault() in
bindings (which is important, now that we have a new deferrer that is not associated with touch events).
Additionally, change this take an enum class instead of a BOOL to help clarify the intent of the given flag.

  • UIProcess/ios/WKImageExtractionGestureRecognizer.h:
  • UIProcess/ios/WKImageExtractionGestureRecognizer.mm:

(-[WKImageExtractionGestureRecognizer setState:]):

Add support for a new image extraction gesture delegate method which informs the client that the gesture has
transitioned to Failed state.

Location:
trunk/Source/WebKit
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r274591 r274610  
     12021-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
    1452021-03-17  Peng Liu  <peng.liu6@apple.com>
    246
  • trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h

    r274581 r274610  
    247247    RetainPtr<WKDeferringGestureRecognizer> _touchEndDeferringGestureRecognizerForDelayedResettableGestures;
    248248    RetainPtr<WKDeferringGestureRecognizer> _touchEndDeferringGestureRecognizerForSyntheticTapGestures;
     249#if ENABLE(IMAGE_EXTRACTION)
     250    RetainPtr<WKDeferringGestureRecognizer> _imageExtractionDeferringGestureRecognizer;
     251#endif
    249252    std::unique_ptr<WebKit::GestureRecognizerConsistencyEnforcer> _gestureRecognizerConsistencyEnforcer;
    250253    RetainPtr<UIWebTouchEventsGestureRecognizer> _touchEventGestureRecognizer;
     
    698701#endif
    699702
     703#if ENABLE(IMAGE_EXTRACTION)
     704- (void)_endImageExtractionGestureDeferral:(WebKit::ShouldPreventGestures)shouldPreventGestures;
     705#endif
     706
    700707@end
    701708
  • trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm

    r274581 r274610  
    775775
    776776    _touchStartDeferringGestureRecognizerForImmediatelyResettableGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]);
    777     [_touchStartDeferringGestureRecognizerForImmediatelyResettableGestures setName:@"Touch start deferrer (immediate reset)"];
     777    [_touchStartDeferringGestureRecognizerForImmediatelyResettableGestures setName:@"Deferrer for touch start (immediate reset)"];
    778778
    779779    _touchStartDeferringGestureRecognizerForDelayedResettableGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]);
    780     [_touchStartDeferringGestureRecognizerForDelayedResettableGestures setName:@"Touch start deferrer (delayed reset)"];
     780    [_touchStartDeferringGestureRecognizerForDelayedResettableGestures setName:@"Deferrer for touch start (delayed reset)"];
    781781
    782782    _touchStartDeferringGestureRecognizerForSyntheticTapGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]);
    783     [_touchStartDeferringGestureRecognizerForSyntheticTapGestures setName:@"Touch start deferrer (synthetic tap)"];
     783    [_touchStartDeferringGestureRecognizerForSyntheticTapGestures setName:@"Deferrer for touch start (synthetic tap)"];
    784784
    785785    _touchEndDeferringGestureRecognizerForImmediatelyResettableGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]);
    786     [_touchEndDeferringGestureRecognizerForImmediatelyResettableGestures setName:@"Touch end deferrer (immediate reset)"];
     786    [_touchEndDeferringGestureRecognizerForImmediatelyResettableGestures setName:@"Deferrer for touch end (immediate reset)"];
    787787
    788788    _touchEndDeferringGestureRecognizerForDelayedResettableGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]);
    789     [_touchEndDeferringGestureRecognizerForDelayedResettableGestures setName:@"Touch end deferrer (delayed reset)"];
     789    [_touchEndDeferringGestureRecognizerForDelayedResettableGestures setName:@"Deferrer for touch end (delayed reset)"];
    790790
    791791    _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
    793799
    794800    for (WKDeferringGestureRecognizer *gesture in self.deferringGestures) {
     
    17611767- (NSArray<WKDeferringGestureRecognizer *> *)deferringGestures
    17621768{
    1763     auto gestures = [NSMutableArray arrayWithCapacity:6];
     1769    auto gestures = [NSMutableArray arrayWithCapacity:7];
    17641770    [gestures addObjectsFromArray:self._touchStartDeferringGestures];
    17651771    [gestures addObjectsFromArray:self._touchEndDeferringGestures];
     1772#if ENABLE(IMAGE_EXTRACTION)
     1773    [gestures addObject:_imageExtractionDeferringGestureRecognizer.get()];
     1774#endif
    17661775    return gestures;
    17671776}
     
    17981807{
    17991808    for (WKDeferringGestureRecognizer *gesture in self._touchStartDeferringGestures)
    1800         [gesture setDefaultPrevented:preventNativeGestures];
     1809        [gesture endDeferral:preventNativeGestures ? WebKit::ShouldPreventGestures::Yes : WebKit::ShouldPreventGestures::No];
    18011810}
    18021811
     
    18041813{
    18051814    for (WKDeferringGestureRecognizer *gesture in self._touchEndDeferringGestures)
    1806         [gesture setDefaultPrevented:preventNativeGestures];
     1815        [gesture endDeferral:preventNativeGestures ? WebKit::ShouldPreventGestures::Yes : WebKit::ShouldPreventGestures::No];
    18071816}
    18081817
     
    26682677#if ENABLE(IMAGE_EXTRACTION)
    26692678    if (_elementPendingImageExtraction && _positionInformation.elementContext == _elementPendingImageExtraction)
    2670         return NO;
     2679        return YES;
    26712680#endif
    26722681
     
    27462755#if ENABLE(IMAGE_EXTRACTION)
    27472756    if (_elementPendingImageExtraction && _positionInformation.elementContext == _elementPendingImageExtraction)
    2748         return NO;
     2757        return YES;
    27492758#endif
    27502759
     
    76177626        return NO;
    76187627
     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
    76197636    auto mayDelayResetOfContainingSubgraph = [&](UIGestureRecognizer *gesture) -> BOOL {
    76207637#if USE(UICONTEXTMENU) && HAVE(LINK_PREVIEW)
     
    76287645#endif
    76297646
    7630         if ([gesture isKindOfClass:tapAndAHalfRecognizerClass()])
     7647        if (isTapAndAHalfGesture)
    76317648            return YES;
    76327649
    7633         if (gesture == [_textInteractionAssistant loupeGesture])
     7650        if (isLoupeGesture)
    76347651            return YES;
    76357652
     
    94109427
    94119428#if ENABLE(IMAGE_EXTRACTION)
     9429
     9430- (void)_endImageExtractionGestureDeferral:(WebKit::ShouldPreventGestures)shouldPreventGestures
     9431{
     9432    [_imageExtractionDeferringGestureRecognizer endDeferral:shouldPreventGestures];
     9433}
    94129434
    94139435- (void)_doAfterPendingImageExtraction:(void(^)(WebKit::ProceedWithImageExtraction proceedWithImageExtraction))block
  • trunk/Source/WebKit/UIProcess/ios/WKDeferringGestureRecognizer.h

    r273305 r274610  
    3131
    3232enum class ShouldDeferGestures : bool { No, Yes };
     33enum class ShouldPreventGestures : bool { No, Yes };
    3334
    3435} // namespace WebKit
     
    4647
    4748- (instancetype)initWithDeferringGestureDelegate:(id <WKDeferringGestureRecognizerDelegate>)deferringGestureDelegate;
    48 - (void)setDefaultPrevented:(BOOL)defaultPrevented;
     49
    4950- (BOOL)shouldDeferGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer;
     51- (void)endDeferral:(WebKit::ShouldPreventGestures)shouldPreventGestures;
     52
     53@property (nonatomic) BOOL immediatelyFailsAfterTouchEnd;
    5054
    5155@end
  • trunk/Source/WebKit/UIProcess/ios/WKDeferringGestureRecognizer.mm

    r273305 r274610  
    5555    [super touchesEnded:touches withEvent:event];
    5656
     57    if (self.immediatelyFailsAfterTouchEnd)
     58        self.state = UIGestureRecognizerStateFailed;
     59
    5760    [_deferringGestureDelegate deferringGestureRecognizer:self didEndTouchesWithEvent:event];
    5861}
     
    6467}
    6568
    66 - (void)setDefaultPrevented:(BOOL)defaultPrevented
     69- (void)endDeferral:(WebKit::ShouldPreventGestures)shouldPreventGestures
    6770{
    68     if (defaultPrevented)
     71    if (shouldPreventGestures == WebKit::ShouldPreventGestures::Yes)
    6972        self.state = UIGestureRecognizerStateEnded;
    7073    else
  • trunk/Source/WebKit/UIProcess/ios/WKImageExtractionGestureRecognizer.h

    r270332 r274610  
    3434@protocol WKImageExtractionGestureRecognizerDelegate <UIGestureRecognizerDelegate>
    3535- (void)imageExtractionGestureDidBegin:(WKImageExtractionGestureRecognizer *)gesture;
     36- (void)imageExtractionGestureDidFail:(WKImageExtractionGestureRecognizer *)gesture;
    3637@end
    3738
  • trunk/Source/WebKit/UIProcess/ios/WKImageExtractionGestureRecognizer.mm

    r270332 r274610  
    5252
    5353    auto newState = self.state;
    54     if (previousState != newState && newState == UIGestureRecognizerStateBegan)
     54    if (previousState == newState)
     55        return;
     56
     57    if (newState == UIGestureRecognizerStateBegan)
    5558        [_imageExtractionDelegate imageExtractionGestureDidBegin:self];
     59    else if (newState == UIGestureRecognizerStateFailed)
     60        [_imageExtractionDelegate imageExtractionGestureDidFail:self];
    5661}
    5762
Note: See TracChangeset for help on using the changeset viewer.