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()