Changeset 246347 in webkit


Ignore:
Timestamp:
Jun 11, 2019 9:13:36 PM (5 years ago)
Author:
Alan Bujtas
Message:

LayoutTests/fast/events/touch/ios/double-tap-for-double-click* test cases are failing
https://bugs.webkit.org/show_bug.cgi?id=198764
<rdar://problem/51035459>

Reviewed by Wenson Hsieh.

Source/WebKit:

This patch replaces the existing, _doubleTapGestureRecognizerForDoubleClick based double click handling with a WebProcess based implementation using
the potentialTapAtPosition/commitPotentialTap infrastructure.

  • Shared/WebPageCreationParameters.cpp:

(WebKit::WebPageCreationParameters::encode const):
(WebKit::WebPageCreationParameters::decode):

  • Shared/WebPageCreationParameters.h:
  • UIProcess/PageClient.h:
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::creationParameters):

  • UIProcess/WebPageProxy.h:
  • UIProcess/ios/PageClientImplIOS.h:
  • UIProcess/ios/PageClientImplIOS.mm:

(WebKit::PageClientImpl::doubleTapForDoubleClickDelay):
(WebKit::PageClientImpl::doubleTapForDoubleClickRadius):

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

(-[WKContentView _ensureNonBlockingDoubleTapGestureRecognizer]):
(-[WKContentView setupInteraction]):
(-[WKContentView cleanupInteraction]):
(-[WKContentView _removeDefaultGestureRecognizers]):
(-[WKContentView _addDefaultGestureRecognizers]):
(-[WKContentView gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]):
(-[WKContentView gestureRecognizerShouldBegin:]):
(-[WKContentView _didStartProvisionalLoadForMainFrame]):
(-[WKContentView _doubleTapForDoubleClickDelay]):
(-[WKContentView _doubleTapForDoubleClickRadius]):
(-[WKContentView _doubleTapRecognizedForDoubleClick:]): Deleted.

  • UIProcess/ios/WebPageProxyIOS.mm:

(WebKit::WebPageProxy::handleDoubleTapForDoubleClickAtPoint): Deleted.

  • WebProcess/WebPage/WebPage.cpp:
  • WebProcess/WebPage/WebPage.h:
  • WebProcess/WebPage/WebPage.messages.in:
  • WebProcess/WebPage/ios/WebPageIOS.mm:

(WebKit::WebPage::handlePotentialDoubleTapForDoubleClickAtPoint):
(WebKit::WebPage::commitPotentialTap):
(WebKit::WebPage::handleDoubleTapForDoubleClickAtPoint): Deleted.

LayoutTests:

  • fast/events/touch/ios/double-tap-for-double-click1.html:
  • fast/events/touch/ios/double-tap-for-double-click2.html:
  • fast/events/touch/ios/double-tap-for-double-click3.html:
Location:
trunk
Files:
20 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r246340 r246347  
     12019-06-11  Zalan Bujtas  <zalan@apple.com>
     2
     3        LayoutTests/fast/events/touch/ios/double-tap-for-double-click* test cases are failing
     4        https://bugs.webkit.org/show_bug.cgi?id=198764
     5        <rdar://problem/51035459>
     6
     7        Reviewed by Wenson Hsieh.
     8
     9        * fast/events/touch/ios/double-tap-for-double-click1.html:
     10        * fast/events/touch/ios/double-tap-for-double-click2.html:
     11        * fast/events/touch/ios/double-tap-for-double-click3.html:
     12
    1132019-06-11  Commit Queue  <commit-queue@webkit.org>
    214
  • trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click1.html

    r244775 r246347  
    44<meta name="viewport" content="width=device-width initial-scale=1 user-scalable=no">
    55<title>This tests that we fire dblclick event on double tap</title>
    6 <script src="../../../../resources/basic-gestures.js"></script>
     6<script src="../../../../resources/ui-helper.js"></script>
    77<style>
    88#doubleTapthis {
     
    2020    testRunner.dumpAsText();
    2121
    22     await doubleTapAtPoint(doubleTapthis.offsetLeft, doubleTapthis.offsetTop);
     22    await UIHelper.humanSpeedDoubleTapAt(doubleTapthis.offsetLeft, doubleTapthis.offsetTop);
    2323}
    2424</script>
  • trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click2.html

    r244775 r246347  
    44<meta name="viewport" content="width=device-width initial-scale=1 user-scalable=no">
    55<title>This tests that we fire dblclick event on double tap when the content is replaced</title>
    6 <script src="../../../../resources/basic-gestures.js"></script>
     6<script src="../../../../resources/ui-helper.js"></script>
    77<style>
    88#doubleTapThis {
     
    3030    let y = rect.top + rect.height / 2;
    3131
    32     await doubleTapAtPoint(x, y);
     32    await UIHelper.humanSpeedDoubleTapAt(x, y);
    3333}
    3434</script>
  • trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click3.html

    r244775 r246347  
    44<meta name="viewport" content="width=device-width initial-scale=1 user-scalable=no">
    55<title>This tests that we do not fire dblclick event on double tap on node with touch-action: none</title>
    6 <script src="../../../../resources/basic-gestures.js"></script>
     6<script src="../../../../resources/ui-helper.js"></script>
    77<style>
    88#doubleTapthis {
     
    1313}
    1414#finishTest {
    15     width: 10px;
    16     height: 10px;
     15    width: 200px;
     16    height: 200px;
    1717    border: 1px solid green;
    1818}
     
    2626    testRunner.dumpAsText();
    2727
    28     await doubleTapAtPoint(doubleTapthis.offsetLeft, doubleTapthis.offsetTop);
     28    await UIHelper.humanSpeedDoubleTapAt(doubleTapthis.offsetLeft, doubleTapthis.offsetTop);
    2929
    30     await doubleTapAtPoint(finishTest.offsetLeft, finishTest.offsetTop);
     30    await UIHelper.humanSpeedDoubleTapAt(finishTest.offsetLeft + 100, finishTest.offsetTop + 100);
    3131}
    3232</script>
  • trunk/Source/WebKit/ChangeLog

    r246345 r246347  
     12019-06-11  Zalan Bujtas  <zalan@apple.com>
     2
     3        LayoutTests/fast/events/touch/ios/double-tap-for-double-click* test cases are failing
     4        https://bugs.webkit.org/show_bug.cgi?id=198764
     5        <rdar://problem/51035459>
     6
     7        Reviewed by Wenson Hsieh.
     8
     9        This patch replaces the existing, _doubleTapGestureRecognizerForDoubleClick based double click handling with a WebProcess based implementation using
     10        the potentialTapAtPosition/commitPotentialTap infrastructure.
     11
     12        * Shared/WebPageCreationParameters.cpp:
     13        (WebKit::WebPageCreationParameters::encode const):
     14        (WebKit::WebPageCreationParameters::decode):
     15        * Shared/WebPageCreationParameters.h:
     16        * UIProcess/PageClient.h:
     17        * UIProcess/WebPageProxy.cpp:
     18        (WebKit::WebPageProxy::creationParameters):
     19        * UIProcess/WebPageProxy.h:
     20        * UIProcess/ios/PageClientImplIOS.h:
     21        * UIProcess/ios/PageClientImplIOS.mm:
     22        (WebKit::PageClientImpl::doubleTapForDoubleClickDelay):
     23        (WebKit::PageClientImpl::doubleTapForDoubleClickRadius):
     24        * UIProcess/ios/WKContentViewInteraction.h:
     25        * UIProcess/ios/WKContentViewInteraction.mm:
     26        (-[WKContentView _ensureNonBlockingDoubleTapGestureRecognizer]):
     27        (-[WKContentView setupInteraction]):
     28        (-[WKContentView cleanupInteraction]):
     29        (-[WKContentView _removeDefaultGestureRecognizers]):
     30        (-[WKContentView _addDefaultGestureRecognizers]):
     31        (-[WKContentView gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]):
     32        (-[WKContentView gestureRecognizerShouldBegin:]):
     33        (-[WKContentView _didStartProvisionalLoadForMainFrame]):
     34        (-[WKContentView _doubleTapForDoubleClickDelay]):
     35        (-[WKContentView _doubleTapForDoubleClickRadius]):
     36        (-[WKContentView _doubleTapRecognizedForDoubleClick:]): Deleted.
     37        * UIProcess/ios/WebPageProxyIOS.mm:
     38        (WebKit::WebPageProxy::handleDoubleTapForDoubleClickAtPoint): Deleted.
     39        * WebProcess/WebPage/WebPage.cpp:
     40        * WebProcess/WebPage/WebPage.h:
     41        * WebProcess/WebPage/WebPage.messages.in:
     42        * WebProcess/WebPage/ios/WebPageIOS.mm:
     43        (WebKit::WebPage::handlePotentialDoubleTapForDoubleClickAtPoint):
     44        (WebKit::WebPage::commitPotentialTap):
     45        (WebKit::WebPage::handleDoubleTapForDoubleClickAtPoint): Deleted.
     46
    1472019-06-11  Andy Estes  <aestes@apple.com>
    248
  • trunk/Source/WebKit/Platform/spi/ios/UIKitSPI.h

    r246331 r246347  
    375375@property (nonatomic) CGFloat allowableMovement;
    376376@property (nonatomic, readonly) CGPoint centroid;
     377@property (nonatomic) CFTimeInterval maximumIntervalBetweenSuccessiveTaps;
    377378@end
    378379
  • trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp

    r246136 r246347  
    9999    encoder << keyboardIsAttached;
    100100    encoder << canShowWhileLocked;
     101    encoder << doubleTapForDoubleClickDelay;
     102    encoder << doubleTapForDoubleClickRadius;
    101103    encoder << overrideViewportArguments;
    102104#endif
     
    291293    if (!decoder.decode(parameters.canShowWhileLocked))
    292294        return WTF::nullopt;
     295    if (!decoder.decode(parameters.doubleTapForDoubleClickDelay))
     296        return WTF::nullopt;
     297    if (!decoder.decode(parameters.doubleTapForDoubleClickRadius))
     298        return WTF::nullopt;
    293299
    294300    Optional<Optional<WebCore::ViewportArguments>> overrideViewportArguments;
  • trunk/Source/WebKit/Shared/WebPageCreationParameters.h

    r246136 r246347  
    159159    bool keyboardIsAttached { false };
    160160    bool canShowWhileLocked { false };
     161    Seconds doubleTapForDoubleClickDelay { 350_ms };
     162    float doubleTapForDoubleClickRadius { 45 };
    161163    Optional<WebCore::ViewportArguments> overrideViewportArguments;
    162164#endif
  • trunk/Source/WebKit/UIProcess/PageClient.h

    r245807 r246347  
    414414
    415415    virtual void handleAutocorrectionContext(const WebAutocorrectionContext&) = 0;
     416
     417    virtual Seconds doubleTapForDoubleClickDelay() = 0;
     418    virtual float doubleTapForDoubleClickRadius() = 0;
    416419#endif
    417420
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r246188 r246347  
    71747174    parameters.overrideViewportArguments = m_overrideViewportArguments;
    71757175    parameters.canShowWhileLocked = m_configuration->canShowWhileLocked();
     7176    parameters.doubleTapForDoubleClickDelay = pageClient().doubleTapForDoubleClickDelay();
     7177    parameters.doubleTapForDoubleClickRadius = pageClient().doubleTapForDoubleClickRadius();
    71767178#endif
    71777179
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r246236 r246347  
    12281228    void handleTap(const WebCore::FloatPoint&, OptionSet<WebKit::WebEvent::Modifier>, uint64_t layerTreeTransactionIdAtLastTouchStart);
    12291229    void didRecognizeLongPress();
    1230     void handleDoubleTapForDoubleClickAtPoint(const WebCore::IntPoint&, OptionSet<WebEvent::Modifier>, uint64_t layerTreeTransactionIdAtLastTouchStart);
    12311230
    12321231    void inspectorNodeSearchMovedToPosition(const WebCore::FloatPoint&);
  • trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h

    r246270 r246347  
    244244    void handleAutocorrectionContext(const WebAutocorrectionContext&) final;
    245245
     246    Seconds doubleTapForDoubleClickDelay() final;
     247    float doubleTapForDoubleClickRadius() final;
     248
    246249    void didFinishProcessingAllPendingMouseEvents() final { }
    247250
  • trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm

    r246270 r246347  
    843843#endif
    844844
     845Seconds PageClientImpl::doubleTapForDoubleClickDelay()
     846{
     847    return Seconds { [m_contentView _doubleTapForDoubleClickDelay] };
     848}
     849
     850float PageClientImpl::doubleTapForDoubleClickRadius()
     851{
     852    return [m_contentView _doubleTapForDoubleClickRadius];
     853}
     854
    845855#if USE(QUICK_LOOK)
    846856void PageClientImpl::requestPasswordForQuickLookDocument(const String& fileName, WTF::Function<void(const String&)>&& completionHandler)
  • trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h

    r246229 r246347  
    214214    RetainPtr<WKSyntheticTapGestureRecognizer> _doubleTapGestureRecognizer;
    215215    RetainPtr<UITapGestureRecognizer> _nonBlockingDoubleTapGestureRecognizer;
    216     RetainPtr<UITapGestureRecognizer> _doubleTapGestureRecognizerForDoubleClick;
    217216    RetainPtr<UITapGestureRecognizer> _twoFingerDoubleTapGestureRecognizer;
    218217    RetainPtr<UITapGestureRecognizer> _twoFingerSingleTapGestureRecognizer;
     
    458457- (void)_becomeFirstResponderWithSelectionMovingForward:(BOOL)selectingForward completionHandler:(void (^)(BOOL didBecomeFirstResponder))completionHandler;
    459458- (void)_setDoubleTapGesturesEnabled:(BOOL)enabled;
     459- (double)_doubleTapForDoubleClickDelay;
     460- (float)_doubleTapForDoubleClickRadius;
    460461#if ENABLE(DATA_DETECTION)
    461462- (NSArray *)_dataDetectionResults;
  • trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm

    r246342 r246347  
    694694}
    695695
     696- (void)_ensureNonBlockingDoubleTapGestureRecognizer
     697{
     698    if (_nonBlockingDoubleTapGestureRecognizer)
     699        return;
     700    _nonBlockingDoubleTapGestureRecognizer = adoptNS([[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_nonBlockingDoubleTapRecognized:)]);
     701    [_nonBlockingDoubleTapGestureRecognizer setNumberOfTapsRequired:2];
     702    [_nonBlockingDoubleTapGestureRecognizer setDelegate:self];
     703    [_nonBlockingDoubleTapGestureRecognizer setEnabled:NO];
     704}
     705
    696706- (void)setupInteraction
    697707{
     
    740750    [self addGestureRecognizer:_singleTapGestureRecognizer.get()];
    741751
    742     _nonBlockingDoubleTapGestureRecognizer = adoptNS([[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_nonBlockingDoubleTapRecognized:)]);
    743     [_nonBlockingDoubleTapGestureRecognizer setNumberOfTapsRequired:2];
    744     [_nonBlockingDoubleTapGestureRecognizer setDelegate:self];
    745     [_nonBlockingDoubleTapGestureRecognizer setEnabled:NO];
     752    [self _ensureNonBlockingDoubleTapGestureRecognizer];
    746753    [self addGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
    747 
    748     _doubleTapGestureRecognizerForDoubleClick = adoptNS([[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_doubleTapRecognizedForDoubleClick:)]);
    749     [_doubleTapGestureRecognizerForDoubleClick setNumberOfTapsRequired:2];
    750     [_doubleTapGestureRecognizerForDoubleClick setDelegate:self];
    751     [self addGestureRecognizer:_doubleTapGestureRecognizerForDoubleClick.get()];
    752754
    753755    [self _createAndConfigureDoubleTapGestureRecognizer];
     
    893895    [self removeGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
    894896
    895     [_doubleTapGestureRecognizerForDoubleClick setDelegate:nil];
    896     [self removeGestureRecognizer:_doubleTapGestureRecognizerForDoubleClick.get()];
    897 
    898897    [_twoFingerDoubleTapGestureRecognizer setDelegate:nil];
    899898    [self removeGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
     
    968967    [self removeGestureRecognizer:_doubleTapGestureRecognizer.get()];
    969968    [self removeGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
    970     [self removeGestureRecognizer:_doubleTapGestureRecognizerForDoubleClick.get()];
    971969    [self removeGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
    972970    [self removeGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
     
    985983    [self addGestureRecognizer:_doubleTapGestureRecognizer.get()];
    986984    [self addGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
    987     [self addGestureRecognizer:_doubleTapGestureRecognizerForDoubleClick.get()];
    988985    [self addGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
    989986    [self addGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
     
    18351832        return YES;
    18361833
    1837     if (isSamePair(gestureRecognizer, otherGestureRecognizer, _singleTapGestureRecognizer.get(), _doubleTapGestureRecognizerForDoubleClick.get()))
    1838         return YES;
    1839 
    1840     if (isSamePair(gestureRecognizer, otherGestureRecognizer, _nonBlockingDoubleTapGestureRecognizer.get(), _doubleTapGestureRecognizerForDoubleClick.get()))
    1841         return YES;
    1842 
    1843     if (isSamePair(gestureRecognizer, otherGestureRecognizer, _doubleTapGestureRecognizer.get(), _doubleTapGestureRecognizerForDoubleClick.get()))
    1844         return YES;
    1845 
    18461834    if (isSamePair(gestureRecognizer, otherGestureRecognizer, _highlightLongPressGestureRecognizer.get(), _previewSecondaryGestureRecognizer.get()))
    18471835        return YES;
     
    20402028        || gestureRecognizer == _doubleTapGestureRecognizer
    20412029        || gestureRecognizer == _nonBlockingDoubleTapGestureRecognizer
    2042         || gestureRecognizer == _doubleTapGestureRecognizerForDoubleClick
    20432030        || gestureRecognizer == _twoFingerDoubleTapGestureRecognizer) {
    20442031
     
    24442431    _lastInteractionLocation = gestureRecognizer.location;
    24452432    _isDoubleTapPending = YES;
    2446 }
    2447 
    2448 - (void)_doubleTapRecognizedForDoubleClick:(UITapGestureRecognizer *)gestureRecognizer
    2449 {
    2450     _page->handleDoubleTapForDoubleClickAtPoint(WebCore::IntPoint(gestureRecognizer.location), WebKit::webEventModifierFlags(gestureRecognizerModifierFlags(gestureRecognizer)), _layerTreeTransactionIdAtLastTouchStart);
    24512433}
    24522434
     
    38263808- (void)_didStartProvisionalLoadForMainFrame
    38273809{
    3828     // Reset the double tap gesture recognizer to prevent any double click that is in the process of being recognized.
    3829     [_doubleTapGestureRecognizerForDoubleClick setEnabled:NO];
    3830     [_doubleTapGestureRecognizerForDoubleClick setEnabled:YES];
    3831     // We also need to disable the double-tap gesture recognizers that are enabled for double-tap-to-zoom and which
     3810    // We need to disable the double-tap gesture recognizers that are enabled for double-tap-to-zoom and which
    38323811    // are enabled when a single tap is first recognized. This avoids tests running in sequence and simulating taps
    38333812    // in the same location to trigger double-tap recognition.
     
    38873866    [_nonBlockingDoubleTapGestureRecognizer setEnabled:!enabled];
    38883867    [self _resetIsDoubleTapPending];
     3868}
     3869
     3870- (double)_doubleTapForDoubleClickDelay
     3871{
     3872    static double doubleTapForDoubleClickDelay = 350;
     3873    static dispatch_once_t onceToken;
     3874    dispatch_once(&onceToken, ^{
     3875        [self _ensureNonBlockingDoubleTapGestureRecognizer];
     3876        doubleTapForDoubleClickDelay = [_nonBlockingDoubleTapGestureRecognizer maximumIntervalBetweenSuccessiveTaps];
     3877    });
     3878    return doubleTapForDoubleClickDelay;
     3879}
     3880
     3881- (float)_doubleTapForDoubleClickRadius
     3882{
     3883    static float doubleTapForDoubleClickRadius = 45;
     3884    static dispatch_once_t onceToken;
     3885    dispatch_once(&onceToken, ^{
     3886        [self _ensureNonBlockingDoubleTapGestureRecognizer];
     3887        doubleTapForDoubleClickRadius = [_nonBlockingDoubleTapGestureRecognizer allowableMovement];
     3888    });
     3889    return doubleTapForDoubleClickRadius;
    38893890}
    38903891
  • trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm

    r246236 r246347  
    846846}
    847847
    848 void WebPageProxy::handleDoubleTapForDoubleClickAtPoint(const WebCore::IntPoint& point, OptionSet<WebEvent::Modifier> modifiers, uint64_t layerTreeTransactionIdAtLastTouchStart)
    849 {
    850     process().send(Messages::WebPage::HandleDoubleTapForDoubleClickAtPoint(point, modifiers, layerTreeTransactionIdAtLastTouchStart), m_pageID);
    851 }
    852 
    853848void WebPageProxy::inspectorNodeSearchMovedToPosition(const WebCore::FloatPoint& position)
    854849{
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp

    r246276 r246347  
    417417    , m_keyboardIsAttached(parameters.keyboardIsAttached)
    418418    , m_canShowWhileLocked(parameters.canShowWhileLocked)
     419    , m_doubleTapForDoubleClickDelay(parameters.doubleTapForDoubleClickDelay)
     420    , m_doubleTapForDoubleClickRadius(parameters.doubleTapForDoubleClickRadius)
    419421#endif
    420422    , m_layerVolatilityTimer(*this, &WebPage::layerVolatilityTimerFired)
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.h

    r246308 r246347  
    635635    void tapHighlightAtPosition(uint64_t requestID, const WebCore::FloatPoint&);
    636636    void didRecognizeLongPress();
    637     void handleDoubleTapForDoubleClickAtPoint(const WebCore::IntPoint&, OptionSet<WebKit::WebEvent::Modifier>, uint64_t lastLayerTreeTransactionId);
     637    bool handlePotentialDoubleTapForDoubleClickAtPoint(OptionSet<WebKit::WebEvent::Modifier>, uint64_t lastLayerTreeTransactionId);
    638638
    639639    void inspectorNodeSearchMovedToPosition(const WebCore::FloatPoint&);
     
    18491849    bool m_canShowWhileLocked { false };
    18501850    bool m_inDynamicSizeUpdate { false };
     1851    Seconds m_doubleTapForDoubleClickDelay { 350_ms };
     1852    float m_doubleTapForDoubleClickRadius { 45 };
    18511853    HashMap<std::pair<WebCore::IntSize, double>, WebCore::IntPoint> m_dynamicSizeUpdateHistory;
    18521854    RefPtr<WebCore::Node> m_pendingSyntheticClickNode;
     
    18591861    double m_lastTransactionPageScaleFactor { 0 };
    18601862    uint64_t m_lastTransactionIDWithScaleChange { 0 };
     1863    Optional<MonotonicTime> m_lastCommittedTapTimestamp;
     1864    Optional<WebCore::FloatPoint> m_lastCommittedTapLocation;
    18611865
    18621866    CompletionHandler<void(InteractionInformationAtPosition&&)> m_pendingSynchronousPositionInformationReply;
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in

    r245998 r246347  
    5858    TapHighlightAtPosition(uint64_t requestID, WebCore::FloatPoint point)
    5959    DidRecognizeLongPress()
    60     HandleDoubleTapForDoubleClickAtPoint(WebCore::IntPoint point, OptionSet<WebKit::WebEvent::Modifier> modifiers, uint64_t lastLayerTreeTransactionId)
    6160    InspectorNodeSearchMovedToPosition(WebCore::FloatPoint point)
    6261    InspectorNodeSearchEndedAtPosition(WebCore::FloatPoint point)
  • trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm

    r246311 r246347  
    801801}
    802802
    803 void WebPage::handleDoubleTapForDoubleClickAtPoint(const IntPoint& point, OptionSet<WebEvent::Modifier> modifiers, uint64_t lastLayerTreeTransactionId)
    804 {
     803bool WebPage::handlePotentialDoubleTapForDoubleClickAtPoint(OptionSet<WebEvent::Modifier> modifiers, uint64_t lastLayerTreeTransactionId)
     804{
     805    if (!m_lastCommittedTapTimestamp || !m_lastCommittedTapLocation)
     806        return false;
     807
     808    auto millisecondsSinceLastTap = (MonotonicTime::now() - *m_lastCommittedTapTimestamp).milliseconds();
     809    if (millisecondsSinceLastTap > m_doubleTapForDoubleClickDelay.milliseconds())
     810        return false;
     811
     812    auto distanceBetweenTaps = sqrtf(pow(m_potentialTapLocation.x() - m_lastCommittedTapLocation->x(), 2) + pow(m_potentialTapLocation.y() - m_lastCommittedTapLocation->y(), 2));
     813    if (distanceBetweenTaps > m_doubleTapForDoubleClickRadius)
     814        return false;
     815
    805816    FloatPoint adjustedPoint;
    806     auto* nodeRespondingToDoubleClick = m_page->mainFrame().nodeRespondingToDoubleClickEvent(point, adjustedPoint);
     817    auto* nodeRespondingToDoubleClick = m_page->mainFrame().nodeRespondingToDoubleClickEvent(m_potentialTapLocation, adjustedPoint);
    807818    if (!nodeRespondingToDoubleClick)
    808         return;
     819        return false;
    809820
    810821    auto* frameRespondingToDoubleClick = nodeRespondingToDoubleClick->document().frame();
    811822    if (!frameRespondingToDoubleClick || lastLayerTreeTransactionId < WebFrame::fromCoreFrame(*frameRespondingToDoubleClick)->firstLayerTreeTransactionIDAfterDidCommitLoad())
    812         return;
     823        return false;
    813824
    814825    bool shiftKey = modifiers.contains(WebEvent::Modifier::ShiftKey);
     
    819830    nodeRespondingToDoubleClick->document().frame()->eventHandler().handleMousePressEvent(PlatformMouseEvent(roundedAdjustedPoint, roundedAdjustedPoint, LeftButton, PlatformEvent::MousePressed, 2, shiftKey, ctrlKey, altKey, metaKey, WallTime::now(), 0, WebCore::NoTap));
    820831    if (m_isClosed)
    821         return;
     832        return false;
    822833    nodeRespondingToDoubleClick->document().frame()->eventHandler().handleMouseReleaseEvent(PlatformMouseEvent(roundedAdjustedPoint, roundedAdjustedPoint, LeftButton, PlatformEvent::MouseReleased, 2, shiftKey, ctrlKey, altKey, metaKey, WallTime::now(), 0, WebCore::NoTap));
     834    return true;
    823835}
    824836
     
    10411053void WebPage::commitPotentialTap(OptionSet<WebEvent::Modifier> modifiers, uint64_t lastLayerTreeTransactionId, WebCore::PointerID pointerId)
    10421054{
    1043     if (!m_potentialTapNode || (!m_potentialTapNode->renderer() && !is<HTMLAreaElement>(m_potentialTapNode.get()))) {
     1055    auto currentPotentialTapLocation = m_potentialTapLocation;
     1056    auto updateLastCommittedLocationAndTimestamp = [&] {
     1057        m_lastCommittedTapTimestamp = MonotonicTime::now();
     1058        m_lastCommittedTapLocation = currentPotentialTapLocation;
     1059    };
     1060
     1061    auto invalidTargetForSingleClick = !m_potentialTapNode || (!m_potentialTapNode->renderer() && !is<HTMLAreaElement>(m_potentialTapNode.get()));
     1062    if (invalidTargetForSingleClick) {
     1063        // When the node has no click eventlistener, but it may have a dblclick one.
     1064        handlePotentialDoubleTapForDoubleClickAtPoint(modifiers, lastLayerTreeTransactionId);
    10441065        commitPotentialTapFailed();
    1045         return;
     1066        return updateLastCommittedLocationAndTimestamp();
    10461067    }
    10471068
     
    10521073    if (!frameRespondingToClick || lastLayerTreeTransactionId < WebFrame::fromCoreFrame(*frameRespondingToClick)->firstLayerTreeTransactionIDAfterDidCommitLoad()) {
    10531074        commitPotentialTapFailed();
    1054         return;
     1075        return updateLastCommittedLocationAndTimestamp();
    10551076    }
    10561077
     
    10631084        } else
    10641085#endif
    1065             handleSyntheticClick(*nodeRespondingToClick, adjustedPoint, modifiers, pointerId);
     1086        {
     1087            if (handlePotentialDoubleTapForDoubleClickAtPoint(modifiers, lastLayerTreeTransactionId))
     1088                commitPotentialTapFailed();
     1089            else
     1090                handleSyntheticClick(*nodeRespondingToClick, adjustedPoint, modifiers, pointerId);
     1091        }
    10661092    } else
    10671093        commitPotentialTapFailed();
     
    10701096    m_potentialTapLocation = FloatPoint();
    10711097    m_potentialTapSecurityOrigin = nullptr;
     1098    return updateLastCommittedLocationAndTimestamp();
    10721099}
    10731100
Note: See TracChangeset for help on using the changeset viewer.