Title: [244775] trunk
Revision
244775
Author
[email protected]
Date
2019-04-30 09:07:48 -0700 (Tue, 30 Apr 2019)

Log Message

Source/WebCore:
Double-tapping a post to like doesn't work on Instagram.com (needs 'dblclick' event)
https://bugs.webkit.org/show_bug.cgi?id=197347
<rdar://problem/49393423>

Reviewed by Wenson Hsieh.

Tests: fast/events/touch/ios/double-tap-for-double-click1.html
       fast/events/touch/ios/double-tap-for-double-click2.html

* page/Frame.h:
* page/ios/FrameIOS.mm:
(WebCore::Frame::nodeRespondingToDoubleClickEvent):

Source/WebKit:
[iOS] Double-tapping a post to like doesn't work on Instagram.com (needs 'dblclick' event)
https://bugs.webkit.org/show_bug.cgi?id=197347
<rdar://problem/49393423>

Reviewed by Wenson Hsieh.

This patch adds support for dispatching dblclick event as the result of the double tap gesture.

1. The new double tap gesture recognizer always fires regardless of what type of action the other, existing double gesture recognizers (double-tap to zoom) trigger.
2. The dblclick event is dispatched on the node with registered dblclick event handler unless the node prohibits double tap gesture (touch-action != auto).

* UIProcess/WebPageProxy.h:
* UIProcess/ios/WKContentViewInteraction.h:
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView setupInteraction]):
(-[WKContentView cleanupInteraction]):
(-[WKContentView _removeDefaultGestureRecognizers]):
(-[WKContentView _addDefaultGestureRecognizers]):
(-[WKContentView gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]):
(-[WKContentView gestureRecognizerShouldBegin:]):
(-[WKContentView _doubleTapRecognizedForDoubleClick:]):
* UIProcess/ios/WebPageProxyIOS.mm:
(WebKit::WebPageProxy::handleDoubleTapForDoubleClickAtPoint):
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::handleDoubleTapForDoubleClickAtPoint):

LayoutTests:
Double-tapping a post to like doesn't work on Instagram.com (needs 'dblclick' event)
https://bugs.webkit.org/show_bug.cgi?id=197347
<rdar://problem/49393423>

Reviewed by Wenson Hsieh.

* fast/events/touch/ios/double-tap-for-double-click1-expected.txt: Added.
* fast/events/touch/ios/double-tap-for-double-click1.html: Added.
* fast/events/touch/ios/double-tap-for-double-click2-expected.txt: Added.
* fast/events/touch/ios/double-tap-for-double-click2.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (244774 => 244775)


--- trunk/LayoutTests/ChangeLog	2019-04-30 15:17:07 UTC (rev 244774)
+++ trunk/LayoutTests/ChangeLog	2019-04-30 16:07:48 UTC (rev 244775)
@@ -1,3 +1,16 @@
+2019-04-30  Zalan Bujtas  <[email protected]>
+
+        Double-tapping a post to like doesn't work on Instagram.com (needs 'dblclick' event)
+        https://bugs.webkit.org/show_bug.cgi?id=197347
+        <rdar://problem/49393423>
+
+        Reviewed by Wenson Hsieh.
+
+        * fast/events/touch/ios/double-tap-for-double-click1-expected.txt: Added.
+        * fast/events/touch/ios/double-tap-for-double-click1.html: Added.
+        * fast/events/touch/ios/double-tap-for-double-click2-expected.txt: Added.
+        * fast/events/touch/ios/double-tap-for-double-click2.html: Added.
+
 2019-04-30  Youenn Fablet  <[email protected]>
 
         Reject/throw when calling AudioContext methods on a stopped AudioContext

Added: trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click1-expected.txt (0 => 244775)


--- trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click1-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click1-expected.txt	2019-04-30 16:07:48 UTC (rev 244775)
@@ -0,0 +1,2 @@
+PASS if 'double click' text is shown below.
+[click][click][double click]

Added: trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click1.html (0 => 244775)


--- trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click1.html	                        (rev 0)
+++ trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click1.html	2019-04-30 16:07:48 UTC (rev 244775)
@@ -0,0 +1,42 @@
+<!DOCTYPE html><!-- webkit-test-runner [ useFlexibleViewport=true ] -->
+<html>
+<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=""
+<style>
+#doubleTapthis {
+    width: 400px;
+    height: 400px;
+    border: 1px solid green;
+}
+</style>
+<script>
+async function test() {
+    if (!window.testRunner || !testRunner.runUIScript)
+        return;
+
+    testRunner.waitUntilDone();
+    testRunner.dumpAsText();
+
+    await doubleTapAtPoint(doubleTapthis.offsetLeft, doubleTapthis.offsetTop);
+}
+</script>
+</head>
+<body _onload_="test()">
+<div id=doubleTapthis>PASS if 'double click' text is shown below.</div>
+<pre id=result></pre>
+<script>
+
+doubleTapthis.addEventListener("click", function( event ) {   
+    result.innerHTML = result.innerHTML + "[click]";
+}, false);
+
+doubleTapthis.addEventListener("dblclick", function( event ) {   
+    result.innerHTML = result.innerHTML + "[double click]";
+    if (window.testRunner)
+        setTimeout("testRunner.notifyDone()", 0);
+}, false);
+</script>
+</body>
+</html>

Added: trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click2-expected.txt (0 => 244775)


--- trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click2-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click2-expected.txt	2019-04-30 16:07:48 UTC (rev 244775)
@@ -0,0 +1 @@
+[double click]

Added: trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click2.html (0 => 244775)


--- trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click2.html	                        (rev 0)
+++ trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click2.html	2019-04-30 16:07:48 UTC (rev 244775)
@@ -0,0 +1,57 @@
+<!DOCTYPE html><!-- webkit-test-runner [ useFlexibleViewport=true ] -->
+<html>
+<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=""
+<style>
+#doubleTapThis {
+    width: 400px;
+    height: 400px;
+    border: 1px solid green;
+}
+
+#newDoubleTapThis {
+    width: 400px;
+    height: 400px;
+    border: 1px solid green;
+}
+</style>
+<script>
+async function test() {
+    if (!window.testRunner || !testRunner.runUIScript)
+        return;
+
+    testRunner.waitUntilDone();
+    testRunner.dumpAsText();
+
+    let rect = doubleTapThis.getBoundingClientRect();
+    let x = rect.left + rect.width / 2;
+    let y = rect.top + rect.height / 2;
+
+    await doubleTapAtPoint(x, y);
+}
+</script>
+</head>
+<body _onload_="test()">
+<div id=doubleTapThis>PASS if 'double click' text is shown below.</div>
+<pre id=result></pre>
+<script>
+
+doubleTapThis.addEventListener('click', function (e) {
+    doubleTapThis.remove();
+
+    let newDoubleTapThis = document.createElement("div");
+    newDoubleTapThis.id="newDoubleTapThis";
+    document.body.insertBefore(newDoubleTapThis, result);
+
+    newDoubleTapThis.addEventListener('dblclick', function (e) {
+        result.innerHTML = result.innerHTML + "[double click]";
+        if (window.testRunner)
+            setTimeout("testRunner.notifyDone()", 0);
+    });
+});
+
+</script>
+</body>
+</html>

Added: trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click3-expected.txt (0 => 244775)


--- trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click3-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click3-expected.txt	2019-04-30 16:07:48 UTC (rev 244775)
@@ -0,0 +1,2 @@
+PASS if 'double click' text is NOT shown below.
+[click][click]

Added: trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click3.html (0 => 244775)


--- trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click3.html	                        (rev 0)
+++ trunk/LayoutTests/fast/events/touch/ios/double-tap-for-double-click3.html	2019-04-30 16:07:48 UTC (rev 244775)
@@ -0,0 +1,54 @@
+<!DOCTYPE html><!-- webkit-test-runner [ useFlexibleViewport=true ] -->
+<html>
+<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=""
+<style>
+#doubleTapthis {
+    width: 400px;
+    height: 400px;
+    border: 1px solid green;
+    touch-action: none;
+}
+#finishTest {
+    width: 10px;
+    height: 10px;
+    border: 1px solid green;
+}
+</style>
+<script>
+async function test() {
+    if (!window.testRunner || !testRunner.runUIScript)
+        return;
+
+    testRunner.waitUntilDone();
+    testRunner.dumpAsText();
+
+    await doubleTapAtPoint(doubleTapthis.offsetLeft, doubleTapthis.offsetTop);
+
+    await doubleTapAtPoint(finishTest.offsetLeft, finishTest.offsetTop);
+}
+</script>
+</head>
+<body _onload_="test()">
+<div id=doubleTapthis>PASS if 'double click' text is NOT shown below.</div>
+<div id=finishTest></div>
+<pre id=result></pre>
+<script>
+
+doubleTapthis.addEventListener("click", function( event ) {   
+    result.innerHTML = result.innerHTML + "[click]";
+}, false);
+
+doubleTapthis.addEventListener("dblclick", function( event ) {   
+    result.innerHTML = result.innerHTML + "[double click]";
+}, false);
+
+finishTest.addEventListener("dblclick", function( event ) {   
+    if (window.testRunner)
+        setTimeout("testRunner.notifyDone()", 0);
+}, false);
+</script>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (244774 => 244775)


--- trunk/Source/WebCore/ChangeLog	2019-04-30 15:17:07 UTC (rev 244774)
+++ trunk/Source/WebCore/ChangeLog	2019-04-30 16:07:48 UTC (rev 244775)
@@ -1,3 +1,18 @@
+2019-04-30  Zalan Bujtas  <[email protected]>
+
+        Double-tapping a post to like doesn't work on Instagram.com (needs 'dblclick' event)
+        https://bugs.webkit.org/show_bug.cgi?id=197347
+        <rdar://problem/49393423>
+
+        Reviewed by Wenson Hsieh.
+
+        Tests: fast/events/touch/ios/double-tap-for-double-click1.html
+               fast/events/touch/ios/double-tap-for-double-click2.html
+
+        * page/Frame.h:
+        * page/ios/FrameIOS.mm:
+        (WebCore::Frame::nodeRespondingToDoubleClickEvent):
+
 2019-04-30  Youenn Fablet  <[email protected]>
 
         Reject/throw when calling AudioContext methods on a stopped AudioContext

Modified: trunk/Source/WebCore/page/Frame.h (244774 => 244775)


--- trunk/Source/WebCore/page/Frame.h	2019-04-30 15:17:07 UTC (rev 244774)
+++ trunk/Source/WebCore/page/Frame.h	2019-04-30 16:07:48 UTC (rev 244775)
@@ -219,6 +219,7 @@
 
     WEBCORE_EXPORT Node* deepestNodeAtLocation(const FloatPoint& viewportLocation);
     WEBCORE_EXPORT Node* nodeRespondingToClickEvents(const FloatPoint& viewportLocation, FloatPoint& adjustedViewportLocation, SecurityOrigin* = nullptr);
+    WEBCORE_EXPORT Node* nodeRespondingToDoubleClickEvent(const FloatPoint& viewportLocation, FloatPoint& adjustedViewportLocation);
     WEBCORE_EXPORT Node* nodeRespondingToScrollWheelEvents(const FloatPoint& viewportLocation);
 
     WEBCORE_EXPORT NSArray *wordsInCurrentParagraph() const;

Modified: trunk/Source/WebCore/page/ios/FrameIOS.mm (244774 => 244775)


--- trunk/Source/WebCore/page/ios/FrameIOS.mm	2019-04-30 15:17:07 UTC (rev 244774)
+++ trunk/Source/WebCore/page/ios/FrameIOS.mm	2019-04-30 16:07:48 UTC (rev 244775)
@@ -418,6 +418,33 @@
     return qualifyingNodeAtViewportLocation(viewportLocation, adjustedViewportLocation, WTFMove(ancestorRespondingToClickEvents), true);
 }
 
+Node* Frame::nodeRespondingToDoubleClickEvent(const FloatPoint& viewportLocation, FloatPoint& adjustedViewportLocation)
+{
+    auto&& ancestorRespondingToDoubleClickEvent = [](const HitTestResult& hitTestResult, Node* terminationNode, IntRect* nodeBounds) -> Node* {
+        if (nodeBounds)
+            *nodeBounds = IntRect();
+
+        auto* node = hitTestResult.innerNode();
+        if (!node)
+            return nullptr;
+
+        for (; node && node != terminationNode; node = node->parentInComposedTree()) {
+            if (!node->hasEventListeners(eventNames().dblclickEvent))
+                continue;
+#if ENABLE(TOUCH_EVENTS)
+            if (!node->allowsDoubleTapGesture())
+                continue;
+#endif
+            if (nodeBounds && node->renderer())
+                *nodeBounds = node->renderer()->absoluteBoundingBoxRect(true);
+            return node;
+        }
+        return nullptr;
+    };
+
+    return qualifyingNodeAtViewportLocation(viewportLocation, adjustedViewportLocation, WTFMove(ancestorRespondingToDoubleClickEvent), true);
+}
+
 Node* Frame::nodeRespondingToScrollWheelEvents(const FloatPoint& viewportLocation)
 {
     auto&& ancestorRespondingToScrollWheelEvents = [](const HitTestResult& hitTestResult, Node* terminationNode, IntRect* nodeBounds) -> Node* {

Modified: trunk/Source/WebKit/ChangeLog (244774 => 244775)


--- trunk/Source/WebKit/ChangeLog	2019-04-30 15:17:07 UTC (rev 244774)
+++ trunk/Source/WebKit/ChangeLog	2019-04-30 16:07:48 UTC (rev 244775)
@@ -1,3 +1,33 @@
+2019-04-30  Zalan Bujtas  <[email protected]>
+
+        [iOS] Double-tapping a post to like doesn't work on Instagram.com (needs 'dblclick' event)
+        https://bugs.webkit.org/show_bug.cgi?id=197347
+        <rdar://problem/49393423>
+
+        Reviewed by Wenson Hsieh.
+
+        This patch adds support for dispatching dblclick event as the result of the double tap gesture.
+
+        1. The new double tap gesture recognizer always fires regardless of what type of action the other, existing double gesture recognizers (double-tap to zoom) trigger.
+        2. The dblclick event is dispatched on the node with registered dblclick event handler unless the node prohibits double tap gesture (touch-action != auto).
+
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/ios/WKContentViewInteraction.h:
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView setupInteraction]):
+        (-[WKContentView cleanupInteraction]):
+        (-[WKContentView _removeDefaultGestureRecognizers]):
+        (-[WKContentView _addDefaultGestureRecognizers]):
+        (-[WKContentView gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]):
+        (-[WKContentView gestureRecognizerShouldBegin:]):
+        (-[WKContentView _doubleTapRecognizedForDoubleClick:]):
+        * UIProcess/ios/WebPageProxyIOS.mm:
+        (WebKit::WebPageProxy::handleDoubleTapForDoubleClickAtPoint):
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::WebPage::handleDoubleTapForDoubleClickAtPoint):
+
 2019-04-30  Antti Koivisto  <[email protected]>
 
         Tighten type of ScrollingTree:rootNode() to ScrollingTreeFrameScrollingNode

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (244774 => 244775)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2019-04-30 15:17:07 UTC (rev 244774)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2019-04-30 16:07:48 UTC (rev 244775)
@@ -1210,6 +1210,7 @@
     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/WKContentViewInteraction.h (244774 => 244775)


--- trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h	2019-04-30 15:17:07 UTC (rev 244774)
+++ trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h	2019-04-30 16:07:48 UTC (rev 244775)
@@ -221,6 +221,7 @@
     RetainPtr<UILongPressGestureRecognizer> _longPressGestureRecognizer;
     RetainPtr<WKSyntheticTapGestureRecognizer> _doubleTapGestureRecognizer;
     RetainPtr<UITapGestureRecognizer> _nonBlockingDoubleTapGestureRecognizer;
+    RetainPtr<UITapGestureRecognizer> _doubleTapGestureRecognizerForDoubleClick;
     RetainPtr<UITapGestureRecognizer> _twoFingerDoubleTapGestureRecognizer;
     RetainPtr<UITapGestureRecognizer> _twoFingerSingleTapGestureRecognizer;
     RetainPtr<UITapGestureRecognizer> _stylusSingleTapGestureRecognizer;

Modified: trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm (244774 => 244775)


--- trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm	2019-04-30 15:17:07 UTC (rev 244774)
+++ trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm	2019-04-30 16:07:48 UTC (rev 244775)
@@ -734,6 +734,12 @@
     [_nonBlockingDoubleTapGestureRecognizer setEnabled:NO];
     [self addGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
 
+    _doubleTapGestureRecognizerForDoubleClick = adoptNS([[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_doubleTapRecognizedForDoubleClick:)]);
+    [_doubleTapGestureRecognizerForDoubleClick setNumberOfTapsRequired:2];
+    [_doubleTapGestureRecognizerForDoubleClick setDelegate:self];
+    [_doubleTapGestureRecognizerForDoubleClick setEnabled:YES];
+    [self addGestureRecognizer:_doubleTapGestureRecognizerForDoubleClick.get()];
+
     [self _createAndConfigureDoubleTapGestureRecognizer];
 
     _twoFingerDoubleTapGestureRecognizer = adoptNS([[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_twoFingerDoubleTapRecognized:)]);
@@ -867,6 +873,9 @@
     [_nonBlockingDoubleTapGestureRecognizer setDelegate:nil];
     [self removeGestureRecognizer:_nonBlockingDoubleTapGestureRecognizer.get()];
 
+    [_doubleTapGestureRecognizerForDoubleClick setDelegate:nil];
+    [self removeGestureRecognizer:_doubleTapGestureRecognizerForDoubleClick.get()];
+
     [_twoFingerDoubleTapGestureRecognizer setDelegate:nil];
     [self removeGestureRecognizer:_twoFingerDoubleTapGestureRecognizer.get()];
 
@@ -940,6 +949,7 @@
     [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()];
@@ -956,6 +966,7 @@
     [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()];
@@ -1779,6 +1790,15 @@
     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;
 
@@ -1975,6 +1995,7 @@
     if (gestureRecognizer == _highlightLongPressGestureRecognizer
         || gestureRecognizer == _doubleTapGestureRecognizer
         || gestureRecognizer == _nonBlockingDoubleTapGestureRecognizer
+        || gestureRecognizer == _doubleTapGestureRecognizerForDoubleClick
         || gestureRecognizer == _twoFingerDoubleTapGestureRecognizer) {
 
         if (hasFocusedElement(_focusedElementInformation)) {
@@ -2377,6 +2398,11 @@
     _isDoubleTapPending = YES;
 }
 
+- (void)_doubleTapRecognizedForDoubleClick:(UITapGestureRecognizer *)gestureRecognizer
+{
+    _page->handleDoubleTapForDoubleClickAtPoint(WebCore::IntPoint(gestureRecognizer.location), WebKit::webEventModifierFlags(gestureRecognizerModifierFlags(gestureRecognizer)), _layerTreeTransactionIdAtLastTouchStart);
+}
+
 - (void)_twoFingerDoubleTapRecognized:(UITapGestureRecognizer *)gestureRecognizer
 {
     [self _resetIsDoubleTapPending];

Modified: trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm (244774 => 244775)


--- trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2019-04-30 15:17:07 UTC (rev 244774)
+++ trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2019-04-30 16:07:48 UTC (rev 244775)
@@ -867,6 +867,11 @@
     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.h (244774 => 244775)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2019-04-30 15:17:07 UTC (rev 244774)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2019-04-30 16:07:48 UTC (rev 244775)
@@ -622,6 +622,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);
 
     void inspectorNodeSearchMovedToPosition(const WebCore::FloatPoint&);
     void inspectorNodeSearchEndedAtPosition(const WebCore::FloatPoint&);

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (244774 => 244775)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2019-04-30 15:17:07 UTC (rev 244774)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2019-04-30 16:07:48 UTC (rev 244775)
@@ -57,6 +57,7 @@
     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 (244774 => 244775)


--- trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm	2019-04-30 15:17:07 UTC (rev 244774)
+++ trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm	2019-04-30 16:07:48 UTC (rev 244775)
@@ -722,6 +722,28 @@
         handleSyntheticClick(*nodeRespondingToClick, adjustedPoint, modifiers);
 }
 
+void WebPage::handleDoubleTapForDoubleClickAtPoint(const IntPoint& point, OptionSet<WebEvent::Modifier> modifiers, uint64_t lastLayerTreeTransactionId)
+{
+    FloatPoint adjustedPoint;
+    auto* nodeRespondingToDoubleClick = m_page->mainFrame().nodeRespondingToDoubleClickEvent(point, adjustedPoint);
+    if (!nodeRespondingToDoubleClick)
+        return;
+
+    auto* frameRespondingToDoubleClick = nodeRespondingToDoubleClick->document().frame();
+    if (!frameRespondingToDoubleClick || lastLayerTreeTransactionId < WebFrame::fromCoreFrame(*frameRespondingToDoubleClick)->firstLayerTreeTransactionIDAfterDidCommitLoad())
+        return;
+
+    bool shiftKey = modifiers.contains(WebEvent::Modifier::ShiftKey);
+    bool ctrlKey = modifiers.contains(WebEvent::Modifier::ControlKey);
+    bool altKey = modifiers.contains(WebEvent::Modifier::AltKey);
+    bool metaKey = modifiers.contains(WebEvent::Modifier::MetaKey);
+    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;
+    nodeRespondingToDoubleClick->document().frame()->eventHandler().handleMouseReleaseEvent(PlatformMouseEvent(roundedAdjustedPoint, roundedAdjustedPoint, LeftButton, PlatformEvent::MouseReleased, 2, shiftKey, ctrlKey, altKey, metaKey, WallTime::now(), 0, WebCore::NoTap));
+}
+
 void WebPage::requestFocusedElementInformation(WebKit::CallbackID callbackID)
 {
     FocusedElementInformation info;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to