Title: [246347] trunk
Revision
246347
Author
[email protected]
Date
2019-06-11 21:13:36 -0700 (Tue, 11 Jun 2019)

Log 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:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (246346 => 246347)


--- trunk/LayoutTests/ChangeLog	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/LayoutTests/ChangeLog	2019-06-12 04:13:36 UTC (rev 246347)
@@ -1,3 +1,15 @@
+2019-06-11  Zalan Bujtas  <[email protected]>
+
+        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.
+
+        * 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:
+
 2019-06-11  Commit Queue  <[email protected]>
 
         Unreviewed, rolling out r246320.

Modified: trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click1.html (246346 => 246347)


--- trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click1.html	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click1.html	2019-06-12 04:13:36 UTC (rev 246347)
@@ -3,7 +3,7 @@
 <head>
 <meta name="viewport" content="width=device-width initial-scale=1 user-scalable=no">
 <title>This tests that we fire dblclick event on double tap</title>
-<script src=""
+<script src=""
 <style>
 #doubleTapthis {
     width: 400px;
@@ -19,7 +19,7 @@
     testRunner.waitUntilDone();
     testRunner.dumpAsText();
 
-    await doubleTapAtPoint(doubleTapthis.offsetLeft, doubleTapthis.offsetTop);
+    await UIHelper.humanSpeedDoubleTapAt(doubleTapthis.offsetLeft, doubleTapthis.offsetTop);
 }
 </script>
 </head>

Modified: trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click2.html (246346 => 246347)


--- trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click2.html	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click2.html	2019-06-12 04:13:36 UTC (rev 246347)
@@ -3,7 +3,7 @@
 <head>
 <meta name="viewport" content="width=device-width initial-scale=1 user-scalable=no">
 <title>This tests that we fire dblclick event on double tap when the content is replaced</title>
-<script src=""
+<script src=""
 <style>
 #doubleTapThis {
     width: 400px;
@@ -29,7 +29,7 @@
     let x = rect.left + rect.width / 2;
     let y = rect.top + rect.height / 2;
 
-    await doubleTapAtPoint(x, y);
+    await UIHelper.humanSpeedDoubleTapAt(x, y);
 }
 </script>
 </head>

Modified: trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click3.html (246346 => 246347)


--- trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click3.html	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click3.html	2019-06-12 04:13:36 UTC (rev 246347)
@@ -3,7 +3,7 @@
 <head>
 <meta name="viewport" content="width=device-width initial-scale=1 user-scalable=no">
 <title>This tests that we do not fire dblclick event on double tap on node with touch-action: none</title>
-<script src=""
+<script src=""
 <style>
 #doubleTapthis {
     width: 400px;
@@ -12,8 +12,8 @@
     touch-action: none;
 }
 #finishTest {
-    width: 10px;
-    height: 10px;
+    width: 200px;
+    height: 200px;
     border: 1px solid green;
 }
 </style>
@@ -25,9 +25,9 @@
     testRunner.waitUntilDone();
     testRunner.dumpAsText();
 
-    await doubleTapAtPoint(doubleTapthis.offsetLeft, doubleTapthis.offsetTop);
+    await UIHelper.humanSpeedDoubleTapAt(doubleTapthis.offsetLeft, doubleTapthis.offsetTop);
 
-    await doubleTapAtPoint(finishTest.offsetLeft, finishTest.offsetTop);
+    await UIHelper.humanSpeedDoubleTapAt(finishTest.offsetLeft + 100, finishTest.offsetTop + 100);
 }
 </script>
 </head>

Modified: trunk/Source/WebKit/ChangeLog (246346 => 246347)


--- trunk/Source/WebKit/ChangeLog	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/ChangeLog	2019-06-12 04:13:36 UTC (rev 246347)
@@ -1,3 +1,49 @@
+2019-06-11  Zalan Bujtas  <[email protected]>
+
+        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.
+
+        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.
+
 2019-06-11  Andy Estes  <[email protected]>
 
         [Apple Pay] ASSERTION FAILED: m_state == State::Activating under WebPaymentCoordinatorProxy::showPaymentUI

Modified: trunk/Source/WebKit/Platform/spi/ios/UIKitSPI.h (246346 => 246347)


--- trunk/Source/WebKit/Platform/spi/ios/UIKitSPI.h	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/Platform/spi/ios/UIKitSPI.h	2019-06-12 04:13:36 UTC (rev 246347)
@@ -374,6 +374,7 @@
 @property (nonatomic, readonly) CGPoint location;
 @property (nonatomic) CGFloat allowableMovement;
 @property (nonatomic, readonly) CGPoint centroid;
+@property (nonatomic) CFTimeInterval maximumIntervalBetweenSuccessiveTaps;
 @end
 
 @class WebEvent;

Modified: trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp (246346 => 246347)


--- trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp	2019-06-12 04:13:36 UTC (rev 246347)
@@ -98,6 +98,8 @@
     encoder << deviceOrientation;
     encoder << keyboardIsAttached;
     encoder << canShowWhileLocked;
+    encoder << doubleTapForDoubleClickDelay;
+    encoder << doubleTapForDoubleClickRadius;
     encoder << overrideViewportArguments;
 #endif
 #if PLATFORM(COCOA)
@@ -290,6 +292,10 @@
         return WTF::nullopt;
     if (!decoder.decode(parameters.canShowWhileLocked))
         return WTF::nullopt;
+    if (!decoder.decode(parameters.doubleTapForDoubleClickDelay))
+        return WTF::nullopt;
+    if (!decoder.decode(parameters.doubleTapForDoubleClickRadius))
+        return WTF::nullopt;
 
     Optional<Optional<WebCore::ViewportArguments>> overrideViewportArguments;
     decoder >> overrideViewportArguments;

Modified: trunk/Source/WebKit/Shared/WebPageCreationParameters.h (246346 => 246347)


--- trunk/Source/WebKit/Shared/WebPageCreationParameters.h	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/Shared/WebPageCreationParameters.h	2019-06-12 04:13:36 UTC (rev 246347)
@@ -158,6 +158,8 @@
     int32_t deviceOrientation { 0 };
     bool keyboardIsAttached { false };
     bool canShowWhileLocked { false };
+    Seconds doubleTapForDoubleClickDelay { 350_ms };
+    float doubleTapForDoubleClickRadius { 45 };
     Optional<WebCore::ViewportArguments> overrideViewportArguments;
 #endif
 #if PLATFORM(COCOA)

Modified: trunk/Source/WebKit/UIProcess/PageClient.h (246346 => 246347)


--- trunk/Source/WebKit/UIProcess/PageClient.h	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/UIProcess/PageClient.h	2019-06-12 04:13:36 UTC (rev 246347)
@@ -413,6 +413,9 @@
     virtual void disableInspectorNodeSearch() = 0;
 
     virtual void handleAutocorrectionContext(const WebAutocorrectionContext&) = 0;
+
+    virtual Seconds doubleTapForDoubleClickDelay() = 0;
+    virtual float doubleTapForDoubleClickRadius() = 0;
 #endif
 
     // Auxiliary Client Creation

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (246346 => 246347)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2019-06-12 04:13:36 UTC (rev 246347)
@@ -7173,6 +7173,8 @@
     parameters.keyboardIsAttached = isInHardwareKeyboardMode();
     parameters.overrideViewportArguments = m_overrideViewportArguments;
     parameters.canShowWhileLocked = m_configuration->canShowWhileLocked();
+    parameters.doubleTapForDoubleClickDelay = pageClient().doubleTapForDoubleClickDelay();
+    parameters.doubleTapForDoubleClickRadius = pageClient().doubleTapForDoubleClickRadius();
 #endif
 
 #if PLATFORM(MAC)

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (246346 => 246347)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2019-06-12 04:13:36 UTC (rev 246347)
@@ -1227,7 +1227,6 @@
     void tapHighlightAtPosition(const WebCore::FloatPoint&, uint64_t& requestID);
     void handleTap(const WebCore::FloatPoint&, OptionSet<WebKit::WebEvent::Modifier>, uint64_t layerTreeTransactionIdAtLastTouchStart);
     void didRecognizeLongPress();
-    void handleDoubleTapForDoubleClickAtPoint(const WebCore::IntPoint&, OptionSet<WebEvent::Modifier>, uint64_t layerTreeTransactionIdAtLastTouchStart);
 
     void inspectorNodeSearchMovedToPosition(const WebCore::FloatPoint&);
     void inspectorNodeSearchEndedAtPosition(const WebCore::FloatPoint&);

Modified: trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h (246346 => 246347)


--- trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h	2019-06-12 04:13:36 UTC (rev 246347)
@@ -243,6 +243,9 @@
 
     void handleAutocorrectionContext(const WebAutocorrectionContext&) final;
 
+    Seconds doubleTapForDoubleClickDelay() final;
+    float doubleTapForDoubleClickRadius() final;
+
     void didFinishProcessingAllPendingMouseEvents() final { }
 
 #if HAVE(PENCILKIT)

Modified: trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm (246346 => 246347)


--- trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm	2019-06-12 04:13:36 UTC (rev 246347)
@@ -842,6 +842,16 @@
 }
 #endif
 
+Seconds PageClientImpl::doubleTapForDoubleClickDelay()
+{
+    return Seconds { [m_contentView _doubleTapForDoubleClickDelay] };
+}
+
+float PageClientImpl::doubleTapForDoubleClickRadius()
+{
+    return [m_contentView _doubleTapForDoubleClickRadius];
+}
+
 #if USE(QUICK_LOOK)
 void PageClientImpl::requestPasswordForQuickLookDocument(const String& fileName, WTF::Function<void(const String&)>&& completionHandler)
 {

Modified: trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h (246346 => 246347)


--- trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h	2019-06-12 04:13:36 UTC (rev 246347)
@@ -213,7 +213,6 @@
     RetainPtr<UILongPressGestureRecognizer> _longPressGestureRecognizer;
     RetainPtr<WKSyntheticTapGestureRecognizer> _doubleTapGestureRecognizer;
     RetainPtr<UITapGestureRecognizer> _nonBlockingDoubleTapGestureRecognizer;
-    RetainPtr<UITapGestureRecognizer> _doubleTapGestureRecognizerForDoubleClick;
     RetainPtr<UITapGestureRecognizer> _twoFingerDoubleTapGestureRecognizer;
     RetainPtr<UITapGestureRecognizer> _twoFingerSingleTapGestureRecognizer;
     RetainPtr<UITapGestureRecognizer> _stylusSingleTapGestureRecognizer;
@@ -457,6 +456,8 @@
 - (void)_disableInspectorNodeSearch;
 - (void)_becomeFirstResponderWithSelectionMovingForward:(BOOL)selectingForward completionHandler:(void (^)(BOOL didBecomeFirstResponder))completionHandler;
 - (void)_setDoubleTapGesturesEnabled:(BOOL)enabled;
+- (double)_doubleTapForDoubleClickDelay;
+- (float)_doubleTapForDoubleClickRadius;
 #if ENABLE(DATA_DETECTION)
 - (NSArray *)_dataDetectionResults;
 #endif

Modified: trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm (246346 => 246347)


--- trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm	2019-06-12 04:13:36 UTC (rev 246347)
@@ -693,6 +693,16 @@
     [self addGestureRecognizer:_longPressGestureRecognizer.get()];
 }
 
+- (void)_ensureNonBlockingDoubleTapGestureRecognizer
+{
+    if (_nonBlockingDoubleTapGestureRecognizer)
+        return;
+    _nonBlockingDoubleTapGestureRecognizer = adoptNS([[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_nonBlockingDoubleTapRecognized:)]);
+    [_nonBlockingDoubleTapGestureRecognizer setNumberOfTapsRequired:2];
+    [_nonBlockingDoubleTapGestureRecognizer setDelegate:self];
+    [_nonBlockingDoubleTapGestureRecognizer setEnabled:NO];
+}
+
 - (void)setupInteraction
 {
     // If the page is not valid yet then delay interaction setup until the process is launched/relaunched.
@@ -739,17 +749,9 @@
 #endif
     [self addGestureRecognizer:_singleTapGestureRecognizer.get()];
 
-    _nonBlockingDoubleTapGestureRecognizer = adoptNS([[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_nonBlockingDoubleTapRecognized:)]);
-    [_nonBlockingDoubleTapGestureRecognizer setNumberOfTapsRequired:2];
-    [_nonBlockingDoubleTapGestureRecognizer setDelegate:self];
-    [_nonBlockingDoubleTapGestureRecognizer setEnabled:NO];
+    [self _ensureNonBlockingDoubleTapGestureRecognizer];
     [self addGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
 
-    _doubleTapGestureRecognizerForDoubleClick = adoptNS([[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_doubleTapRecognizedForDoubleClick:)]);
-    [_doubleTapGestureRecognizerForDoubleClick setNumberOfTapsRequired:2];
-    [_doubleTapGestureRecognizerForDoubleClick setDelegate:self];
-    [self addGestureRecognizer:_doubleTapGestureRecognizerForDoubleClick.get()];
-
     [self _createAndConfigureDoubleTapGestureRecognizer];
 
     _twoFingerDoubleTapGestureRecognizer = adoptNS([[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_twoFingerDoubleTapRecognized:)]);
@@ -892,9 +894,6 @@
     [_nonBlockingDoubleTapGestureRecognizer setDelegate:nil];
     [self removeGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
 
-    [_doubleTapGestureRecognizerForDoubleClick setDelegate:nil];
-    [self removeGestureRecognizer:_doubleTapGestureRecognizerForDoubleClick.get()];
-
     [_twoFingerDoubleTapGestureRecognizer setDelegate:nil];
     [self removeGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
 
@@ -967,7 +966,6 @@
     [self removeGestureRecognizer:_highlightLongPressGestureRecognizer.get()];
     [self removeGestureRecognizer:_doubleTapGestureRecognizer.get()];
     [self removeGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
-    [self removeGestureRecognizer:_doubleTapGestureRecognizerForDoubleClick.get()];
     [self removeGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
     [self removeGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
     [self removeGestureRecognizer:_stylusSingleTapGestureRecognizer.get()];
@@ -984,7 +982,6 @@
     [self addGestureRecognizer:_highlightLongPressGestureRecognizer.get()];
     [self addGestureRecognizer:_doubleTapGestureRecognizer.get()];
     [self addGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
-    [self addGestureRecognizer:_doubleTapGestureRecognizerForDoubleClick.get()];
     [self addGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
     [self addGestureRecognizer:_twoFingerSingleTapGestureRecognizer.get()];
     [self addGestureRecognizer:_stylusSingleTapGestureRecognizer.get()];
@@ -1834,15 +1831,6 @@
     if (isSamePair(gestureRecognizer, otherGestureRecognizer, _highlightLongPressGestureRecognizer.get(), _nonBlockingDoubleTapGestureRecognizer.get()))
         return YES;
 
-    if (isSamePair(gestureRecognizer, otherGestureRecognizer, _singleTapGestureRecognizer.get(), _doubleTapGestureRecognizerForDoubleClick.get()))
-        return YES;
-
-    if (isSamePair(gestureRecognizer, otherGestureRecognizer, _nonBlockingDoubleTapGestureRecognizer.get(), _doubleTapGestureRecognizerForDoubleClick.get()))
-        return YES;
-
-    if (isSamePair(gestureRecognizer, otherGestureRecognizer, _doubleTapGestureRecognizer.get(), _doubleTapGestureRecognizerForDoubleClick.get()))
-        return YES;
-
     if (isSamePair(gestureRecognizer, otherGestureRecognizer, _highlightLongPressGestureRecognizer.get(), _previewSecondaryGestureRecognizer.get()))
         return YES;
 
@@ -2039,7 +2027,6 @@
     if (gestureRecognizer == _highlightLongPressGestureRecognizer
         || gestureRecognizer == _doubleTapGestureRecognizer
         || gestureRecognizer == _nonBlockingDoubleTapGestureRecognizer
-        || gestureRecognizer == _doubleTapGestureRecognizerForDoubleClick
         || gestureRecognizer == _twoFingerDoubleTapGestureRecognizer) {
 
         if (hasFocusedElement(_focusedElementInformation)) {
@@ -2445,11 +2432,6 @@
     _isDoubleTapPending = YES;
 }
 
-- (void)_doubleTapRecognizedForDoubleClick:(UITapGestureRecognizer *)gestureRecognizer
-{
-    _page->handleDoubleTapForDoubleClickAtPoint(WebCore::IntPoint(gestureRecognizer.location), WebKit::webEventModifierFlags(gestureRecognizerModifierFlags(gestureRecognizer)), _layerTreeTransactionIdAtLastTouchStart);
-}
-
 - (void)_twoFingerDoubleTapRecognized:(UITapGestureRecognizer *)gestureRecognizer
 {
     [self _resetIsDoubleTapPending];
@@ -3825,10 +3807,7 @@
 
 - (void)_didStartProvisionalLoadForMainFrame
 {
-    // Reset the double tap gesture recognizer to prevent any double click that is in the process of being recognized.
-    [_doubleTapGestureRecognizerForDoubleClick setEnabled:NO];
-    [_doubleTapGestureRecognizerForDoubleClick setEnabled:YES];
-    // We also need to disable the double-tap gesture recognizers that are enabled for double-tap-to-zoom and which
+    // We need to disable the double-tap gesture recognizers that are enabled for double-tap-to-zoom and which
     // are enabled when a single tap is first recognized. This avoids tests running in sequence and simulating taps
     // in the same location to trigger double-tap recognition.
     [self _setDoubleTapGesturesEnabled:NO];
@@ -3888,6 +3867,28 @@
     [self _resetIsDoubleTapPending];
 }
 
+- (double)_doubleTapForDoubleClickDelay
+{
+    static double doubleTapForDoubleClickDelay = 350;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        [self _ensureNonBlockingDoubleTapGestureRecognizer];
+        doubleTapForDoubleClickDelay = [_nonBlockingDoubleTapGestureRecognizer maximumIntervalBetweenSuccessiveTaps];
+    });
+    return doubleTapForDoubleClickDelay;
+}
+
+- (float)_doubleTapForDoubleClickRadius
+{
+    static float doubleTapForDoubleClickRadius = 45;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        [self _ensureNonBlockingDoubleTapGestureRecognizer];
+        doubleTapForDoubleClickRadius = [_nonBlockingDoubleTapGestureRecognizer allowableMovement];
+    });
+    return doubleTapForDoubleClickRadius;
+}
+
 // MARK: UIWebFormAccessoryDelegate protocol and accessory methods
 
 - (void)accessoryClear

Modified: trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm (246346 => 246347)


--- trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2019-06-12 04:13:36 UTC (rev 246347)
@@ -845,11 +845,6 @@
     process().send(Messages::WebPage::DidRecognizeLongPress(), m_pageID);
 }
 
-void WebPageProxy::handleDoubleTapForDoubleClickAtPoint(const WebCore::IntPoint& point, OptionSet<WebEvent::Modifier> modifiers, uint64_t layerTreeTransactionIdAtLastTouchStart)
-{
-    process().send(Messages::WebPage::HandleDoubleTapForDoubleClickAtPoint(point, modifiers, layerTreeTransactionIdAtLastTouchStart), m_pageID);
-}
-
 void WebPageProxy::inspectorNodeSearchMovedToPosition(const WebCore::FloatPoint& position)
 {
     process().send(Messages::WebPage::InspectorNodeSearchMovedToPosition(position), m_pageID);

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (246346 => 246347)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2019-06-12 04:13:36 UTC (rev 246347)
@@ -416,6 +416,8 @@
     , m_deviceOrientation(parameters.deviceOrientation)
     , m_keyboardIsAttached(parameters.keyboardIsAttached)
     , m_canShowWhileLocked(parameters.canShowWhileLocked)
+    , m_doubleTapForDoubleClickDelay(parameters.doubleTapForDoubleClickDelay)
+    , m_doubleTapForDoubleClickRadius(parameters.doubleTapForDoubleClickRadius)
 #endif
     , m_layerVolatilityTimer(*this, &WebPage::layerVolatilityTimerFired)
     , m_activityState(parameters.activityState)

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (246346 => 246347)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2019-06-12 04:13:36 UTC (rev 246347)
@@ -634,7 +634,7 @@
     void cancelPotentialTapInFrame(WebFrame&);
     void tapHighlightAtPosition(uint64_t requestID, const WebCore::FloatPoint&);
     void didRecognizeLongPress();
-    void handleDoubleTapForDoubleClickAtPoint(const WebCore::IntPoint&, OptionSet<WebKit::WebEvent::Modifier>, uint64_t lastLayerTreeTransactionId);
+    bool handlePotentialDoubleTapForDoubleClickAtPoint(OptionSet<WebKit::WebEvent::Modifier>, uint64_t lastLayerTreeTransactionId);
 
     void inspectorNodeSearchMovedToPosition(const WebCore::FloatPoint&);
     void inspectorNodeSearchEndedAtPosition(const WebCore::FloatPoint&);
@@ -1848,6 +1848,8 @@
     bool m_keyboardIsAttached { false };
     bool m_canShowWhileLocked { false };
     bool m_inDynamicSizeUpdate { false };
+    Seconds m_doubleTapForDoubleClickDelay { 350_ms };
+    float m_doubleTapForDoubleClickRadius { 45 };
     HashMap<std::pair<WebCore::IntSize, double>, WebCore::IntPoint> m_dynamicSizeUpdateHistory;
     RefPtr<WebCore::Node> m_pendingSyntheticClickNode;
     WebCore::FloatPoint m_pendingSyntheticClickLocation;
@@ -1858,6 +1860,8 @@
     Optional<DynamicViewportSizeUpdateID> m_pendingDynamicViewportSizeUpdateID;
     double m_lastTransactionPageScaleFactor { 0 };
     uint64_t m_lastTransactionIDWithScaleChange { 0 };
+    Optional<MonotonicTime> m_lastCommittedTapTimestamp;
+    Optional<WebCore::FloatPoint> m_lastCommittedTapLocation;
 
     CompletionHandler<void(InteractionInformationAtPosition&&)> m_pendingSynchronousPositionInformationReply;
 #endif

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (246346 => 246347)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2019-06-12 04:13:36 UTC (rev 246347)
@@ -57,7 +57,6 @@
     CancelPotentialTap()
     TapHighlightAtPosition(uint64_t requestID, WebCore::FloatPoint point)
     DidRecognizeLongPress()
-    HandleDoubleTapForDoubleClickAtPoint(WebCore::IntPoint point, OptionSet<WebKit::WebEvent::Modifier> modifiers, uint64_t lastLayerTreeTransactionId)
     InspectorNodeSearchMovedToPosition(WebCore::FloatPoint point)
     InspectorNodeSearchEndedAtPosition(WebCore::FloatPoint point)
     BlurFocusedElement()

Modified: trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm (246346 => 246347)


--- trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm	2019-06-12 03:18:53 UTC (rev 246346)
+++ trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm	2019-06-12 04:13:36 UTC (rev 246347)
@@ -800,16 +800,27 @@
         handleSyntheticClick(*nodeRespondingToClick, adjustedPoint, modifiers);
 }
 
-void WebPage::handleDoubleTapForDoubleClickAtPoint(const IntPoint& point, OptionSet<WebEvent::Modifier> modifiers, uint64_t lastLayerTreeTransactionId)
+bool WebPage::handlePotentialDoubleTapForDoubleClickAtPoint(OptionSet<WebEvent::Modifier> modifiers, uint64_t lastLayerTreeTransactionId)
 {
+    if (!m_lastCommittedTapTimestamp || !m_lastCommittedTapLocation)
+        return false;
+
+    auto millisecondsSinceLastTap = (MonotonicTime::now() - *m_lastCommittedTapTimestamp).milliseconds();
+    if (millisecondsSinceLastTap > m_doubleTapForDoubleClickDelay.milliseconds())
+        return false;
+
+    auto distanceBetweenTaps = sqrtf(pow(m_potentialTapLocation.x() - m_lastCommittedTapLocation->x(), 2) + pow(m_potentialTapLocation.y() - m_lastCommittedTapLocation->y(), 2));
+    if (distanceBetweenTaps > m_doubleTapForDoubleClickRadius)
+        return false;
+
     FloatPoint adjustedPoint;
-    auto* nodeRespondingToDoubleClick = m_page->mainFrame().nodeRespondingToDoubleClickEvent(point, adjustedPoint);
+    auto* nodeRespondingToDoubleClick = m_page->mainFrame().nodeRespondingToDoubleClickEvent(m_potentialTapLocation, adjustedPoint);
     if (!nodeRespondingToDoubleClick)
-        return;
+        return false;
 
     auto* frameRespondingToDoubleClick = nodeRespondingToDoubleClick->document().frame();
     if (!frameRespondingToDoubleClick || lastLayerTreeTransactionId < WebFrame::fromCoreFrame(*frameRespondingToDoubleClick)->firstLayerTreeTransactionIDAfterDidCommitLoad())
-        return;
+        return false;
 
     bool shiftKey = modifiers.contains(WebEvent::Modifier::ShiftKey);
     bool ctrlKey = modifiers.contains(WebEvent::Modifier::ControlKey);
@@ -818,8 +829,9 @@
     auto roundedAdjustedPoint = roundedIntPoint(adjustedPoint);
     nodeRespondingToDoubleClick->document().frame()->eventHandler().handleMousePressEvent(PlatformMouseEvent(roundedAdjustedPoint, roundedAdjustedPoint, LeftButton, PlatformEvent::MousePressed, 2, shiftKey, ctrlKey, altKey, metaKey, WallTime::now(), 0, WebCore::NoTap));
     if (m_isClosed)
-        return;
+        return false;
     nodeRespondingToDoubleClick->document().frame()->eventHandler().handleMouseReleaseEvent(PlatformMouseEvent(roundedAdjustedPoint, roundedAdjustedPoint, LeftButton, PlatformEvent::MouseReleased, 2, shiftKey, ctrlKey, altKey, metaKey, WallTime::now(), 0, WebCore::NoTap));
+    return true;
 }
 
 void WebPage::requestFocusedElementInformation(WebKit::CallbackID callbackID)
@@ -1040,9 +1052,18 @@
 
 void WebPage::commitPotentialTap(OptionSet<WebEvent::Modifier> modifiers, uint64_t lastLayerTreeTransactionId, WebCore::PointerID pointerId)
 {
-    if (!m_potentialTapNode || (!m_potentialTapNode->renderer() && !is<HTMLAreaElement>(m_potentialTapNode.get()))) {
+    auto currentPotentialTapLocation = m_potentialTapLocation; 
+    auto updateLastCommittedLocationAndTimestamp = [&] {
+        m_lastCommittedTapTimestamp = MonotonicTime::now();
+        m_lastCommittedTapLocation = currentPotentialTapLocation;
+    };
+
+    auto invalidTargetForSingleClick = !m_potentialTapNode || (!m_potentialTapNode->renderer() && !is<HTMLAreaElement>(m_potentialTapNode.get()));
+    if (invalidTargetForSingleClick) {
+        // When the node has no click eventlistener, but it may have a dblclick one.
+        handlePotentialDoubleTapForDoubleClickAtPoint(modifiers, lastLayerTreeTransactionId);
         commitPotentialTapFailed();
-        return;
+        return updateLastCommittedLocationAndTimestamp();
     }
 
     FloatPoint adjustedPoint;
@@ -1051,7 +1072,7 @@
 
     if (!frameRespondingToClick || lastLayerTreeTransactionId < WebFrame::fromCoreFrame(*frameRespondingToClick)->firstLayerTreeTransactionIDAfterDidCommitLoad()) {
         commitPotentialTapFailed();
-        return;
+        return updateLastCommittedLocationAndTimestamp();
     }
 
     if (m_potentialTapNode == nodeRespondingToClick) {
@@ -1062,7 +1083,12 @@
             commitPotentialTapFailed();
         } else
 #endif
-            handleSyntheticClick(*nodeRespondingToClick, adjustedPoint, modifiers, pointerId);
+        {
+            if (handlePotentialDoubleTapForDoubleClickAtPoint(modifiers, lastLayerTreeTransactionId))
+                commitPotentialTapFailed();
+            else
+                handleSyntheticClick(*nodeRespondingToClick, adjustedPoint, modifiers, pointerId);
+        }
     } else
         commitPotentialTapFailed();
 
@@ -1069,6 +1095,7 @@
     m_potentialTapNode = nullptr;
     m_potentialTapLocation = FloatPoint();
     m_potentialTapSecurityOrigin = nullptr;
+    return updateLastCommittedLocationAndTimestamp();
 }
 
 void WebPage::commitPotentialTapFailed()
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to