⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 273305 in webkit


Ignore:
Timestamp:
Feb 23, 2021, 6:34:38 AM (6 years ago)
Author:
Wenson Hsieh
Message:

[iOS] Add a watchdog timer to forcibly reset deferring gesture recognizers
​https://bugs.webkit.org/show_bug.cgi?id=222216

Reviewed by Simon Fraser.

Add a mechanism to detect and resolve situations where at least one deferring gesture recognizer
(WKDeferringGestureRecognizer) is stuck in Possible state after ending touches, but the touch event gesture
recognizer is unable to be reset (i.e. neither possible or recognizing). This state is indicative of a general
class of bugs regarding native gesture deferral, wherein our "gesture gates" never end up being lifted after
ending all touches in the view. One such example of this type of bug was fixed in r272584, where all interaction
(touch events, scrolling, tapping) due to the touch end deferrers never exiting Possible state after long
pressing to present a context menu.

To make these kinds of bugs both easier to diagnose and less fatal in the future, we introduce a watchdog timer
that dispatches after ending all touches on the content view, and checks the consistency of deferring gesture
recognizers in the view; if we detect stuck deferring gestures, we handle this by forcibly resetting the stuck
deferring gestures and logging a fault message.

I manually verified this change by reverting my fix for the aforementioned bug (r272584), and observing both (1)
a system log fault message, and (2) that interactions continued to work even without the fix in r272584, after
the watchdog timer fired. See below for more details.

  • SourcesCocoa.txt:
  • UIProcess/ios/GestureRecognizerConsistencyEnforcer.h: Copied from Source/WebKit/UIProcess/ios/WKDeferringGestureRecognizer.h.
  • UIProcess/ios/GestureRecognizerConsistencyEnforcer.mm: Added.

(WebKit::GestureRecognizerConsistencyEnforcer::GestureRecognizerConsistencyEnforcer):
(WebKit::GestureRecognizerConsistencyEnforcer::beginTracking):
(WebKit::GestureRecognizerConsistencyEnforcer::endTracking):
(WebKit::GestureRecognizerConsistencyEnforcer::reset):
(WebKit::GestureRecognizerConsistencyEnforcer::timerFired):

Add a helper class that wraps a RunLoop::Timer for the main runloop, and schedules a 1 second timer after all
deferring gestures have ended; assuming no new touches begin after this timer is scheduled, we'll perform a
consistency check over the content view's gestures and perform a log fault and force deferring gestures to end
if needed.

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

(-[WKContentView setUpInteraction]):
(-[WKContentView cleanUpInteraction]):

Make sure that we reset any extant GestureRecognizerConsistencyEnforcer if the web process crashes.

(-[WKContentView _removeDefaultGestureRecognizers]):
(-[WKContentView _addDefaultGestureRecognizers]):
(-[WKContentView _webTouchEventsRecognized:]):

Adjust a few compile-time guards so that deferring gesture recognizers exist on the view, even if
ENABLE_IOS_TOUCH_EVENTS is off. This makes some of the gesture deferral code throughout this file easier to
reason about in non-internal iOS builds, since we don't need to sprinkle as many ENABLE(IOS_TOUCH_EVENTS)
checks throughout this class.

(-[WKContentView touchEventGestureRecognizer]):
(-[WKContentView gestureRecognizerConsistencyEnforcer]):
(-[WKContentView deferringGestures]):
(-[WKContentView gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]):
(-[WKContentView deferringGestureRecognizer:willBeginTouchesWithEvent:]):

Refactor -deferringGestureRecognizer:shouldDeferGesturesAfterBeginningTouchesWithEvent: so that it returns an
enum flag indicating whether the given gesture should be allowed to begin deferring native gestures; by making
this -deferringGestureRecognizer:willBeginTouchesWithEvent:, we can now put state management logic here that's
responsible for updating the GestureRecognizerConsistencyEnforcer.

(-[WKContentView deferringGestureRecognizer:didTransitionToState:]):
(-[WKContentView deferringGestureRecognizer:didEndTouchesWithEvent:]):
(-[WKContentView _deferringGestures]): Deleted.

Rename this to -deferringGestures and expose it as a readonly property, for use by the
GestureRecognizerConsistencyEnforcer.

(-[WKContentView deferringGestureRecognizer:shouldDeferGesturesAfterBeginningTouchesWithEvent:]): Deleted.

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

(-[WKDeferringGestureRecognizer touchesBegan:withEvent:]):
(-[WKDeferringGestureRecognizer setState:]):

Add a delegate hook to inform WKContentView when the gesture recognizer state changes.

(-[WKDeferringGestureRecognizer deferringGestureDelegate]): Deleted.

  • UIProcess/mac/WKPrintingView.h:

Fix a missing include that results in a build failure due to changed unified sources.

  • WebKit.xcodeproj/project.pbxproj:
Location:
trunk/Source/WebKit
Files:
1 added
8 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r273304 r273305  
     12021-02-23  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        [iOS] Add a watchdog timer to forcibly reset deferring gesture recognizers
     4        https://bugs.webkit.org/show_bug.cgi?id=222216
     5
     6        Reviewed by Simon Fraser.
     7
     8        Add a mechanism to detect and resolve situations where at least one deferring gesture recognizer
     9        (`WKDeferringGestureRecognizer`) is stuck in Possible state after ending touches, but the touch event gesture
     10        recognizer is unable to be reset (i.e. neither possible or recognizing). This state is indicative of a general
     11        class of bugs regarding native gesture deferral, wherein our "gesture gates" never end up being lifted after
     12        ending all touches in the view. One such example of this type of bug was fixed in r272584, where all interaction
     13        (touch events, scrolling, tapping) due to the touch end deferrers never exiting Possible state after long
     14        pressing to present a context menu.
     15
     16        To make these kinds of bugs both easier to diagnose and less fatal in the future, we introduce a watchdog timer
     17        that dispatches after ending all touches on the content view, and checks the consistency of deferring gesture
     18        recognizers in the view; if we detect stuck deferring gestures, we handle this by forcibly resetting the stuck
     19        deferring gestures and logging a fault message.
     20
     21        I manually verified this change by reverting my fix for the aforementioned bug (r272584), and observing both (1)
     22        a system log fault message, and (2) that interactions continued to work even without the fix in r272584, after
     23        the watchdog timer fired. See below for more details.
     24
     25        * SourcesCocoa.txt:
     26        * UIProcess/ios/GestureRecognizerConsistencyEnforcer.h: Copied from Source/WebKit/UIProcess/ios/WKDeferringGestureRecognizer.h.
     27        * UIProcess/ios/GestureRecognizerConsistencyEnforcer.mm: Added.
     28        (WebKit::GestureRecognizerConsistencyEnforcer::GestureRecognizerConsistencyEnforcer):
     29        (WebKit::GestureRecognizerConsistencyEnforcer::beginTracking):
     30        (WebKit::GestureRecognizerConsistencyEnforcer::endTracking):
     31        (WebKit::GestureRecognizerConsistencyEnforcer::reset):
     32        (WebKit::GestureRecognizerConsistencyEnforcer::timerFired):
     33
     34        Add a helper class that wraps a `RunLoop::Timer` for the main runloop, and schedules a 1 second timer after all
     35        deferring gestures have ended; assuming no new touches begin after this timer is scheduled, we'll perform a
     36        consistency check over the content view's gestures and perform a log fault and force deferring gestures to end
     37        if needed.
     38
     39        * UIProcess/ios/WKContentViewInteraction.h:
     40        * UIProcess/ios/WKContentViewInteraction.mm:
     41        (-[WKContentView setUpInteraction]):
     42        (-[WKContentView cleanUpInteraction]):
     43
     44        Make sure that we reset any extant `GestureRecognizerConsistencyEnforcer` if the web process crashes.
     45
     46        (-[WKContentView _removeDefaultGestureRecognizers]):
     47        (-[WKContentView _addDefaultGestureRecognizers]):
     48        (-[WKContentView _webTouchEventsRecognized:]):
     49
     50        Adjust a few compile-time guards so that deferring gesture recognizers exist on the view, even if
     51        `ENABLE_IOS_TOUCH_EVENTS` is off. This makes some of the gesture deferral code throughout this file easier to
     52        reason about in non-internal iOS builds, since we don't need to sprinkle as many `ENABLE(IOS_TOUCH_EVENTS)`
     53        checks throughout this class.
     54
     55        (-[WKContentView touchEventGestureRecognizer]):
     56        (-[WKContentView gestureRecognizerConsistencyEnforcer]):
     57        (-[WKContentView deferringGestures]):
     58        (-[WKContentView gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]):
     59        (-[WKContentView deferringGestureRecognizer:willBeginTouchesWithEvent:]):
     60
     61        Refactor `-deferringGestureRecognizer:shouldDeferGesturesAfterBeginningTouchesWithEvent:` so that it returns an
     62        enum flag indicating whether the given gesture should be allowed to begin deferring native gestures; by making
     63        this `-deferringGestureRecognizer:willBeginTouchesWithEvent:`, we can now put state management logic here that's
     64        responsible for updating the `GestureRecognizerConsistencyEnforcer`.
     65
     66        (-[WKContentView deferringGestureRecognizer:didTransitionToState:]):
     67        (-[WKContentView deferringGestureRecognizer:didEndTouchesWithEvent:]):
     68        (-[WKContentView _deferringGestures]): Deleted.
     69
     70        Rename this to `-deferringGestures` and expose it as a readonly property, for use by the
     71        `GestureRecognizerConsistencyEnforcer`.
     72
     73        (-[WKContentView deferringGestureRecognizer:shouldDeferGesturesAfterBeginningTouchesWithEvent:]): Deleted.
     74        * UIProcess/ios/WKDeferringGestureRecognizer.h:
     75        * UIProcess/ios/WKDeferringGestureRecognizer.mm:
     76        (-[WKDeferringGestureRecognizer touchesBegan:withEvent:]):
     77        (-[WKDeferringGestureRecognizer setState:]):
     78
     79        Add a delegate hook to inform `WKContentView` when the gesture recognizer state changes.
     80
     81        (-[WKDeferringGestureRecognizer deferringGestureDelegate]): Deleted.
     82        * UIProcess/mac/WKPrintingView.h:
     83
     84        Fix a missing include that results in a build failure due to changed unified sources.
     85
     86        * WebKit.xcodeproj/project.pbxproj:
     87
    1882021-02-23  Per Arne Vollan  <pvollan@apple.com>
    289
  • trunk/Source/WebKit/SourcesCocoa.txt

    r273013 r273305  
    459459UIProcess/ios/AppKitSoftLink.mm
    460460UIProcess/ios/DragDropInteractionState.mm
     461UIProcess/ios/GestureRecognizerConsistencyEnforcer.mm
    461462UIProcess/ios/InputViewUpdateDeferrer.mm
    462463UIProcess/ios/PageClientImplIOS.mm
  • trunk/Source/WebKit/UIProcess/ios/GestureRecognizerConsistencyEnforcer.h

    r273304 r273305  
    11/*
    2  * Copyright (C) 2019 Apple Inc. All rights reserved.
     2 * Copyright (C) 2021 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
    … …  
    2424 */
    2525
     26#pragma once
     27
    2628#if PLATFORM(IOS_FAMILY)
    2729
    28 #import <UIKit/UIKit.h>
     30#import <wtf/FastMalloc.h>
     31#import <wtf/Noncopyable.h>
     32#import <wtf/RetainPtr.h>
     33#import <wtf/RunLoop.h>
     34#import <wtf/WeakObjCPtr.h>
    2935
     36@class WKContentView;
    3037@class WKDeferringGestureRecognizer;
    3138
    32 @protocol WKDeferringGestureRecognizerDelegate
    33 - (BOOL)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer shouldDeferGesturesAfterBeginningTouchesWithEvent:(UIEvent *)event;
    34 - (BOOL)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer didEndTouchesWithEvent:(UIEvent *)event;
    35 - (BOOL)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer shouldDeferOtherGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer;
    36 @end
     39namespace WebKit {
    3740
    38 @interface WKDeferringGestureRecognizer : UIGestureRecognizer
     41class GestureRecognizerConsistencyEnforcer {
     42    WTF_MAKE_FAST_ALLOCATED;
     43    WTF_MAKE_NONCOPYABLE(GestureRecognizerConsistencyEnforcer);
     44public:
     45    GestureRecognizerConsistencyEnforcer(WKContentView *);
     46    ~GestureRecognizerConsistencyEnforcer();
    3947
    40 - (instancetype)initWithDeferringGestureDelegate:(id <WKDeferringGestureRecognizerDelegate>)deferringGestureDelegate;
    41 - (void)setDefaultPrevented:(BOOL)defaultPrevented;
    42 - (BOOL)shouldDeferGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer;
     48    void beginTracking(WKDeferringGestureRecognizer *);
     49    void endTracking(WKDeferringGestureRecognizer *);
    4350
    44 @property (nonatomic, weak, readonly) id <WKDeferringGestureRecognizerDelegate> deferringGestureDelegate;
     51    void reset();
    4552
    46 @end
     53private:
     54    void timerFired();
     55
     56    WeakObjCPtr<WKContentView> m_view;
     57    RunLoop::Timer<GestureRecognizerConsistencyEnforcer> m_timer;
     58    HashSet<RetainPtr<WKDeferringGestureRecognizer>> m_deferringGestureRecognizersWithTouches;
     59};
     60
     61} // namespace WebKit
    4762
    4863#endif // PLATFORM(IOS_FAMILY)
  • trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h

    r273184 r273305  
    3636#import "FocusedElementInformation.h"
    3737#import "FrameInfoData.h"
     38#import "GestureRecognizerConsistencyEnforcer.h"
    3839#import "GestureTypes.h"
    3940#import "InteractionInformationAtPosition.h"
    … …  
    256257
    257258@interface WKContentView () {
    258 #if ENABLE(IOS_TOUCH_EVENTS)
    259259    RetainPtr<WKDeferringGestureRecognizer> _touchStartDeferringGestureRecognizerForImmediatelyResettableGestures;
    260260    RetainPtr<WKDeferringGestureRecognizer> _touchStartDeferringGestureRecognizerForDelayedResettableGestures;
    … …  
    263263    RetainPtr<WKDeferringGestureRecognizer> _touchEndDeferringGestureRecognizerForDelayedResettableGestures;
    264264    RetainPtr<WKDeferringGestureRecognizer> _touchEndDeferringGestureRecognizerForSyntheticTapGestures;
    265 #endif
     265    std::unique_ptr<WebKit::GestureRecognizerConsistencyEnforcer> _gestureRecognizerConsistencyEnforcer;
    266266    RetainPtr<UIWebTouchEventsGestureRecognizer> _touchEventGestureRecognizer;
    267267
    … …  
    526526@property (nonatomic, readonly) BOOL preventsPanningInXAxis;
    527527@property (nonatomic, readonly) BOOL preventsPanningInYAxis;
     528@property (nonatomic, readonly) UIWebTouchEventsGestureRecognizer *touchEventGestureRecognizer;
     529@property (nonatomic, readonly) NSArray<WKDeferringGestureRecognizer *> *deferringGestures;
     530@property (nonatomic, readonly) WebKit::GestureRecognizerConsistencyEnforcer& gestureRecognizerConsistencyEnforcer;
    528531
    529532#if ENABLE(DATALIST_ELEMENT)
  • trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm

    r273276 r273305  
    774774    [self addGestureRecognizer:_touchActionDownSwipeGestureRecognizer.get()];
    775775
    776 #if ENABLE(IOS_TOUCH_EVENTS)
    777776    _touchStartDeferringGestureRecognizerForImmediatelyResettableGestures = adoptNS([[WKDeferringGestureRecognizer alloc] initWithDeferringGestureDelegate:self]);
    778777    [_touchStartDeferringGestureRecognizerForImmediatelyResettableGestures setName:@"Touch start deferrer (immediate reset)"];
    … …  
    793792    [_touchEndDeferringGestureRecognizerForSyntheticTapGestures setName:@"Touch end deferrer (synthetic tap)"];
    794793
    795     for (WKDeferringGestureRecognizer *gesture in self._deferringGestures) {
     794    for (WKDeferringGestureRecognizer *gesture in self.deferringGestures) {
    796795        gesture.delegate = self;
    797796        [self addGestureRecognizer:gesture];
    798797    }
    799 #endif // ENABLE(IOS_TOUCH_EVENTS)
     798
     799    if (_gestureRecognizerConsistencyEnforcer)
     800        _gestureRecognizerConsistencyEnforcer->reset();
    800801
    801802    _touchEventGestureRecognizer = adoptNS([[UIWebTouchEventsGestureRecognizer alloc] initWithTarget:self action:@selector(_webTouchEventsRecognized:) touchDelegate:self]);
    … …  
    968969    [self removeGestureRecognizer:_touchEventGestureRecognizer.get()];
    969970
    970 #if ENABLE(IOS_TOUCH_EVENTS)
    971     for (WKDeferringGestureRecognizer *gesture in self._deferringGestures) {
     971    for (WKDeferringGestureRecognizer *gesture in self.deferringGestures) {
    972972        gesture.delegate = nil;
    973973        [self removeGestureRecognizer:gesture];
    974974    }
    975 #endif
     975
     976    if (_gestureRecognizerConsistencyEnforcer)
     977        _gestureRecognizerConsistencyEnforcer->reset();
    976978
    977979#if HAVE(UIKIT_WITH_MOUSE_SUPPORT)
    … …  
    10991101- (void)_removeDefaultGestureRecognizers
    11001102{
    1101 #if ENABLE(IOS_TOUCH_EVENTS)
    1102     for (WKDeferringGestureRecognizer *gesture in self._deferringGestures)
     1103    for (WKDeferringGestureRecognizer *gesture in self.deferringGestures)
    11031104        [self removeGestureRecognizer:gesture];
    1104 #endif
    11051105    [self removeGestureRecognizer:_touchEventGestureRecognizer.get()];
    11061106    [self removeGestureRecognizer:_singleTapGestureRecognizer.get()];
    … …  
    11261126- (void)_addDefaultGestureRecognizers
    11271127{
    1128 #if ENABLE(IOS_TOUCH_EVENTS)
    1129     for (WKDeferringGestureRecognizer *gesture in self._deferringGestures)
     1128    for (WKDeferringGestureRecognizer *gesture in self.deferringGestures)
    11301129        [self addGestureRecognizer:gesture];
    1131 #endif
    11321130    [self addGestureRecognizer:_touchEventGestureRecognizer.get()];
    11331131    [self addGestureRecognizer:_singleTapGestureRecognizer.get()];
    … …  
    15651563            [self.window makeKeyWindow];
    15661564
    1567 #if ENABLE(IOS_TOUCH_EVENTS)
    15681565        auto stopDeferringNativeGesturesIfNeeded = [] (NSArray<WKDeferringGestureRecognizer *> *deferringGestures) {
    15691566            for (WKDeferringGestureRecognizer *gesture in deferringGestures) {
    … …  
    15781575        if (!_page->isHandlingPreventableTouchEnd())
    15791576            stopDeferringNativeGesturesIfNeeded(self._touchEndDeferringGestures);
    1580 #endif // ENABLE(IOS_TOUCH_EVENTS)
    15811577    }
    15821578#endif // ENABLE(TOUCH_EVENTS)
    … …  
    17561752#endif
    17571753
    1758 #if ENABLE(IOS_TOUCH_EVENTS)
    1759 
    1760 - (NSArray<WKDeferringGestureRecognizer *> *)_deferringGestures
     1754- (UIWebTouchEventsGestureRecognizer *)touchEventGestureRecognizer
     1755{
     1756    return _touchEventGestureRecognizer.get();
     1757}
     1758
     1759- (WebKit::GestureRecognizerConsistencyEnforcer&)gestureRecognizerConsistencyEnforcer
     1760{
     1761    if (!_gestureRecognizerConsistencyEnforcer)
     1762        _gestureRecognizerConsistencyEnforcer = makeUnique<WebKit::GestureRecognizerConsistencyEnforcer>(self);
     1763
     1764    return *_gestureRecognizerConsistencyEnforcer;
     1765}
     1766
     1767- (NSArray<WKDeferringGestureRecognizer *> *)deferringGestures
    17611768{
    17621769    auto gestures = [NSMutableArray arrayWithCapacity:6];
    … …  
    18171824        || gesture == _touchEndDeferringGestureRecognizerForDelayedResettableGestures;
    18181825}
    1819 
    1820 #endif // ENABLE(IOS_TOUCH_EVENTS)
    18211826
    18221827static NSValue *nsSizeForTapHighlightBorderRadius(WebCore::IntSize borderRadius, CGFloat borderRadiusScale)
    … …  
    22222227- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer
    22232228{
    2224 #if ENABLE(IOS_TOUCH_EVENTS)
    2225     for (WKDeferringGestureRecognizer *gesture in self._deferringGestures) {
     2229    for (WKDeferringGestureRecognizer *gesture in self.deferringGestures) {
    22262230        if (isSamePair(gestureRecognizer, otherGestureRecognizer, _touchEventGestureRecognizer.get(), gesture))
    22272231            return YES;
    22282232    }
    2229 #endif
    22302233
    22312234    if ([gestureRecognizer isKindOfClass:WKDeferringGestureRecognizer.class] && [otherGestureRecognizer isKindOfClass:WKDeferringGestureRecognizer.class])
    … …  
    75557558#pragma mark - WKDeferringGestureRecognizerDelegate
    75567559
    7557 - (BOOL)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer shouldDeferGesturesAfterBeginningTouchesWithEvent:(UIEvent *)event
    7558 {
    7559     return ![self gestureRecognizer:deferringGestureRecognizer isInterruptingMomentumScrollingWithEvent:event];
     7560- (WebKit::ShouldDeferGestures)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer willBeginTouchesWithEvent:(UIEvent *)event
     7561{
     7562    self.gestureRecognizerConsistencyEnforcer.beginTracking(deferringGestureRecognizer);
     7563
     7564    return [self gestureRecognizer:deferringGestureRecognizer isInterruptingMomentumScrollingWithEvent:event] ? WebKit::ShouldDeferGestures::No : WebKit::ShouldDeferGestures::Yes;
     7565}
     7566
     7567- (void)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer didTransitionToState:(UIGestureRecognizerState)state
     7568{
     7569    if (state == UIGestureRecognizerStateEnded || state == UIGestureRecognizerStateFailed || state == UIGestureRecognizerStateCancelled)
     7570        self.gestureRecognizerConsistencyEnforcer.endTracking(deferringGestureRecognizer);
    75607571}
    75617572
    75627573- (void)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer didEndTouchesWithEvent:(UIEvent *)event
    75637574{
     7575    self.gestureRecognizerConsistencyEnforcer.endTracking(deferringGestureRecognizer);
     7576
    75647577    if (deferringGestureRecognizer.state != UIGestureRecognizerStatePossible)
    75657578        return;
    75667579
    7567 #if ENABLE(IOS_TOUCH_EVENTS)
    75687580    if (_page->isHandlingPreventableTouchStart() && [self _isTouchStartDeferringGesture:deferringGestureRecognizer])
    75697581        return;
    … …  
    75717583    if (_page->isHandlingPreventableTouchEnd() && [self _isTouchEndDeferringGesture:deferringGestureRecognizer])
    75727584        return;
    7573 #endif
    75747585
    75757586    if ([_touchEventGestureRecognizer state] == UIGestureRecognizerStatePossible)
  • trunk/Source/WebKit/UIProcess/ios/WKDeferringGestureRecognizer.h

    r272584 r273305  
    2828#import <UIKit/UIKit.h>
    2929
     30namespace WebKit {
     31
     32enum class ShouldDeferGestures : bool { No, Yes };
     33
     34} // namespace WebKit
     35
    3036@class WKDeferringGestureRecognizer;
    3137
    3238@protocol WKDeferringGestureRecognizerDelegate
    33 - (BOOL)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer shouldDeferGesturesAfterBeginningTouchesWithEvent:(UIEvent *)event;
    34 - (BOOL)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer didEndTouchesWithEvent:(UIEvent *)event;
    3539- (BOOL)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer shouldDeferOtherGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer;
     40- (WebKit::ShouldDeferGestures)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer willBeginTouchesWithEvent:(UIEvent *)event;
     41- (void)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer didEndTouchesWithEvent:(UIEvent *)event;
     42- (void)deferringGestureRecognizer:(WKDeferringGestureRecognizer *)deferringGestureRecognizer didTransitionToState:(UIGestureRecognizerState)state;
    3643@end
    3744
    … …  
    4249- (BOOL)shouldDeferGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer;
    4350
    44 @property (nonatomic, weak, readonly) id <WKDeferringGestureRecognizerDelegate> deferringGestureDelegate;
    45 
    4651@end
    4752
  • trunk/Source/WebKit/UIProcess/ios/WKDeferringGestureRecognizer.mm

    r272584 r273305  
    4242}
    4343
    44 - (id <WKDeferringGestureRecognizerDelegate>)deferringGestureDelegate
    45 {
    46     return _deferringGestureDelegate.get().get();
    47 }
    48 
    4944- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    5045{
     46    auto shouldDeferGestures = [_deferringGestureDelegate deferringGestureRecognizer:self willBeginTouchesWithEvent:event];
    5147    [super touchesBegan:touches withEvent:event];
    52     if ([_deferringGestureDelegate deferringGestureRecognizer:self shouldDeferGesturesAfterBeginningTouchesWithEvent:event])
    53         return;
    5448
    55     self.state = UIGestureRecognizerStateFailed;
     49    if (shouldDeferGestures == WebKit::ShouldDeferGestures::No)
     50        self.state = UIGestureRecognizerStateFailed;
    5651}
    5752
    … …  
    8782}
    8883
     84- (void)setState:(UIGestureRecognizerState)state
     85{
     86    auto previousState = self.state;
     87    [super setState:state];
     88
     89    if (previousState != self.state)
     90        [_deferringGestureDelegate deferringGestureRecognizer:self didTransitionToState:state];
     91}
     92
    8993@end
    9094
  • trunk/Source/WebKit/UIProcess/mac/WKPrintingView.h

    r271384 r273305  
    3333#import <wtf/RetainPtr.h>
    3434#import <wtf/Vector.h>
     35#import <wtf/WeakObjCPtr.h>
    3536
    3637@class WKPrintingViewData;
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r273288 r273305  
    20072007                F4BA33F225757E89000A3CE8 /* WKImageExtractionGestureRecognizer.h in Headers */ = {isa = PBXBuildFile; fileRef = F4BA33F025757E89000A3CE8 /* WKImageExtractionGestureRecognizer.h */; };
    20082008                F4CB09E5225D5A0900891487 /* WebsiteMediaSourcePolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = F4CB09E4225D5A0300891487 /* WebsiteMediaSourcePolicy.h */; };
     2009                F4CF1E9D25E40DCC000F9D73 /* GestureRecognizerConsistencyEnforcer.h in Headers */ = {isa = PBXBuildFile; fileRef = F4CF1E9B25E40DCC000F9D73 /* GestureRecognizerConsistencyEnforcer.h */; };
    20092010                F4D5F51D206087A10038BBA8 /* WKTextInputListViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = F4D5F519206087A00038BBA8 /* WKTextInputListViewController.h */; };
    20102011                F4D5F51F206087A10038BBA8 /* WKQuickboardListViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = F4D5F51B206087A10038BBA8 /* WKQuickboardListViewController.h */; };
    … …  
    58855886                F4BA33F125757E89000A3CE8 /* WKImageExtractionGestureRecognizer.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = WKImageExtractionGestureRecognizer.mm; path = ios/WKImageExtractionGestureRecognizer.mm; sourceTree = "<group>"; };
    58865887                F4CB09E4225D5A0300891487 /* WebsiteMediaSourcePolicy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebsiteMediaSourcePolicy.h; sourceTree = "<group>"; };
     5888                F4CF1E9B25E40DCC000F9D73 /* GestureRecognizerConsistencyEnforcer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GestureRecognizerConsistencyEnforcer.h; path = ios/GestureRecognizerConsistencyEnforcer.h; sourceTree = "<group>"; };
     5889                F4CF1E9C25E40DCC000F9D73 /* GestureRecognizerConsistencyEnforcer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = GestureRecognizerConsistencyEnforcer.mm; path = ios/GestureRecognizerConsistencyEnforcer.mm; sourceTree = "<group>"; };
    58875890                F4D5F519206087A00038BBA8 /* WKTextInputListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WKTextInputListViewController.h; path = ios/forms/WKTextInputListViewController.h; sourceTree = "<group>"; };
    58885891                F4D5F51A206087A10038BBA8 /* WKTextInputListViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WKTextInputListViewController.mm; path = ios/forms/WKTextInputListViewController.mm; sourceTree = "<group>"; };
    … …  
    75807583                                CDCDC99B248FE8DA00A69522 /* EndowmentStateTracker.h */,
    75817584                                CDCDC99C248FE8DA00A69522 /* EndowmentStateTracker.mm */,
     7585                                F4CF1E9B25E40DCC000F9D73 /* GestureRecognizerConsistencyEnforcer.h */,
     7586                                F4CF1E9C25E40DCC000F9D73 /* GestureRecognizerConsistencyEnforcer.mm */,
    75827587                                2DD45ADC1E5F8972006C355F /* InputViewUpdateDeferrer.h */,
    75837588                                2DD45ADD1E5F8972006C355F /* InputViewUpdateDeferrer.mm */,
    … …  
    1174511750                                BC06F44A12DBD1F5002D78DE /* GeolocationPermissionRequestManagerProxy.h in Headers */,
    1174611751                                BC06F43A12DBCCFB002D78DE /* GeolocationPermissionRequestProxy.h in Headers */,
     11752                                F4CF1E9D25E40DCC000F9D73 /* GestureRecognizerConsistencyEnforcer.h in Headers */,
    1174711753                                2DA944A41884E4F000ED86DB /* GestureTypes.h in Headers */,
    1174811754                                4614F13225DED875007006E7 /* GPUProcessConnectionParameters.h in Headers */,
Note: See TracChangeset for help on using the changeset viewer.