Double tap gesture should send dblclick event
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 3 Aug 2012 23:45:04 +0000 (23:45 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 3 Aug 2012 23:45:04 +0000 (23:45 +0000)
https://bugs.webkit.org/show_bug.cgi?id=92412

Patch by Rick Byers <rbyers@chromium.org> on 2012-08-03
Reviewed by Adam Barth.

Source/WebCore:

Propagate the tap count from PlatformGestureEvent in the derived mouse
events.

Also fixes a crash with unexpected GestureDoubleTap events by just
supressing them early.  They will probably be removed soon anyway.

Test: fast/events/touch/gesture/gesture-dblclick.html

* page/EventHandler.cpp:
(WebCore::EventHandler::handleGestureEvent):
(WebCore::EventHandler::handleGestureTap):

Source/WebKit/chromium:

Tweak comment to more completely describe the (lame) overloaded use
of deltaX in WebGestureEvent, and add a FIXME with the bug to track
cleaning it up.
* public/WebInputEvent.h:
(WebGestureEvent):

Tools:

Enable EventSender to set the tap count on tap gesture events.  The
delta X/Y parameters were not actually being used anymore (used to be
used for radius information).

* DumpRenderTree/chromium/TestRunner/EventSender.cpp:
(EventSender::gestureEvent):

LayoutTests:

Adds test for derived mouse events generated by a sequence of two tap
events.  Modeled after gesture-click.html.
* fast/events/touch/gesture/gesture-dblclick-expected.txt: Added.
* fast/events/touch/gesture/gesture-dblclick.html: Added.
* platform/chromium/fast/events/touch/gesture/gesture-dblclick-expected.txt: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@124673 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/events/touch/gesture/gesture-dblclick-expected.txt [new file with mode: 0644]
LayoutTests/fast/events/touch/gesture/gesture-dblclick.html [new file with mode: 0644]
LayoutTests/platform/chromium/fast/events/touch/gesture/gesture-dblclick-expected.txt [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/page/EventHandler.cpp
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/public/WebInputEvent.h
Tools/ChangeLog
Tools/DumpRenderTree/chromium/TestRunner/EventSender.cpp

index b9428d5..969b5ae 100644 (file)
@@ -1,3 +1,16 @@
+2012-08-03  Rick Byers  <rbyers@chromium.org>
+
+        Double tap gesture should send dblclick event
+        https://bugs.webkit.org/show_bug.cgi?id=92412
+
+        Reviewed by Adam Barth.
+
+        Adds test for derived mouse events generated by a sequence of two tap
+        events.  Modeled after gesture-click.html.
+        * fast/events/touch/gesture/gesture-dblclick-expected.txt: Added.
+        * fast/events/touch/gesture/gesture-dblclick.html: Added.
+        * platform/chromium/fast/events/touch/gesture/gesture-dblclick-expected.txt: Added.
+
 2012-08-03  Sheriff Bot  <webkit.review.bot@gmail.com>
 
         Unreviewed, rolling out r124668.
diff --git a/LayoutTests/fast/events/touch/gesture/gesture-dblclick-expected.txt b/LayoutTests/fast/events/touch/gesture/gesture-dblclick-expected.txt
new file mode 100644 (file)
index 0000000..a0c0c87
--- /dev/null
@@ -0,0 +1,10 @@
+This tests gesture callbacks for the double tap gesture.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Gesture manager not implemented on this platform.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/events/touch/gesture/gesture-dblclick.html b/LayoutTests/fast/events/touch/gesture/gesture-dblclick.html
new file mode 100644 (file)
index 0000000..d58a855
--- /dev/null
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="../../../js/resources/js-test-pre.js"></script>
+</head>
+<body onload="runTest();">
+<div id="gesture">
+
+<p id="description"></p>
+<div id="console"></div>
+
+<script>
+var expectedEvents = [
+  {type: 'mousemove', x: 10, y: 12, detail: 0 },
+  {type: 'mousedown', x: 10, y: 12, detail: 1 },
+  {type: 'mouseup', x: 10, y: 12, detail: 1 },
+  {type: 'click', x: 10, y: 12, detail: 1 },
+  {type: 'mousemove', x: 11, y: 12, detail: 0 },
+  {type: 'mousedown', x: 11, y: 12, detail: 2 },
+  {type: 'mouseup', x: 11, y: 12, detail: 2 },
+  {type: 'click', x: 11, y: 12, detail: 2 },
+  {type: 'dblclick', x: 11, y: 12, detail: 2 },
+  ];
+
+var mouseEventsReceived = 0;
+
+function gestureEventCallback(event)
+{
+    if (window.eventSender) {
+        shouldBeEqualToString('event.type', expectedEvents[mouseEventsReceived].type);
+        shouldEvaluateTo('event.clientX', expectedEvents[mouseEventsReceived].x);
+        shouldEvaluateTo('event.clientY', expectedEvents[mouseEventsReceived].y);
+        shouldEvaluateTo('event.detail', expectedEvents[mouseEventsReceived].detail);
+        mouseEventsReceived++;
+    } else {
+        debug(event.type);
+        debug(event.clientX);
+        debug(event.clientY);
+        debug(event.detail);
+    }
+}
+
+// Because we may not have a gesture recognizer, we send a key press
+// event to end the test without temporal flakiness.
+function quitKeyToEndTest(event) {
+    endTest();
+}
+
+function endTest()
+{
+    if (mouseEventsReceived < expectedEvents.length) {
+        debug('Gesture manager not implemented on this platform.');
+    }
+    // Bail.
+    isSuccessfullyParsed();
+    testRunner.notifyDone();
+}
+
+function runTest() {
+    var div = document.getElementById('gesture');
+    div.addEventListener("mousedown", gestureEventCallback, false);
+    div.addEventListener("click", gestureEventCallback, false);
+    div.addEventListener("dblclick", gestureEventCallback, false);
+    div.addEventListener("mouseup", gestureEventCallback, false);
+    div.addEventListener("mousemove", gestureEventCallback, false);
+    document.addEventListener("keydown", quitKeyToEndTest, false);
+
+    if (window.testRunner) {
+        testRunner.dumpAsText();
+        testRunner.waitUntilDone();
+    }
+
+    if (window.eventSender) {
+        description("This tests gesture callbacks for a double tap sequence of gestures.");
+        eventSender.gestureTap(10, 12);
+        eventSender.leapForward(10);
+        eventSender.gestureTap(11, 12, 2);
+        eventSender.leapForward(50);
+        eventSender.keyDown(' ');
+    } else {
+        debug("This test requires DumpRenderTree.")
+    }
+}
+</script>
+</body>
+</html>
diff --git a/LayoutTests/platform/chromium/fast/events/touch/gesture/gesture-dblclick-expected.txt b/LayoutTests/platform/chromium/fast/events/touch/gesture/gesture-dblclick-expected.txt
new file mode 100644 (file)
index 0000000..c7f666f
--- /dev/null
@@ -0,0 +1,45 @@
+This tests gesture callbacks for a double tap sequence of gestures.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS event.type is "mousemove"
+PASS event.clientX is 10
+PASS event.clientY is 12
+PASS event.detail is 0
+PASS event.type is "mousedown"
+PASS event.clientX is 10
+PASS event.clientY is 12
+PASS event.detail is 1
+PASS event.type is "mouseup"
+PASS event.clientX is 10
+PASS event.clientY is 12
+PASS event.detail is 1
+PASS event.type is "click"
+PASS event.clientX is 10
+PASS event.clientY is 12
+PASS event.detail is 1
+PASS event.type is "mousemove"
+PASS event.clientX is 11
+PASS event.clientY is 12
+PASS event.detail is 0
+PASS event.type is "mousedown"
+PASS event.clientX is 11
+PASS event.clientY is 12
+PASS event.detail is 2
+PASS event.type is "mouseup"
+PASS event.clientX is 11
+PASS event.clientY is 12
+PASS event.detail is 2
+PASS event.type is "click"
+PASS event.clientX is 11
+PASS event.clientY is 12
+PASS event.detail is 2
+PASS event.type is "dblclick"
+PASS event.clientX is 11
+PASS event.clientY is 12
+PASS event.detail is 2
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
index 97789a4..0c098e7 100644 (file)
@@ -1,3 +1,22 @@
+2012-08-03  Rick Byers  <rbyers@chromium.org>
+
+        Double tap gesture should send dblclick event
+        https://bugs.webkit.org/show_bug.cgi?id=92412
+
+        Reviewed by Adam Barth.
+
+        Propagate the tap count from PlatformGestureEvent in the derived mouse
+        events.
+
+        Also fixes a crash with unexpected GestureDoubleTap events by just
+        supressing them early.  They will probably be removed soon anyway.
+
+        Test: fast/events/touch/gesture/gesture-dblclick.html
+
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::handleGestureEvent):
+        (WebCore::EventHandler::handleGestureTap):
+
 2012-08-03  Sheriff Bot  <webkit.review.bot@gmail.com>
 
         Unreviewed, rolling out r124668.
index aeaf0f0..7a078e8 100644 (file)
@@ -2414,6 +2414,11 @@ bool EventHandler::handleGestureTapDown()
 
 bool EventHandler::handleGestureEvent(const PlatformGestureEvent& gestureEvent)
 {
+    // We don't use DoubleTap at the moment, it's mostly redundant with tap since tap now contains
+    // a tap count. FIXME: We should probably remove GestureDoubleTap (http://wkb.ug/93045).
+    if (gestureEvent.type() == PlatformEvent::GestureDoubleTap)
+        return false;
+
     Node* eventTarget = 0;
     if (gestureEvent.type() == PlatformEvent::GestureScrollEnd || gestureEvent.type() == PlatformEvent::GestureScrollUpdate)
         eventTarget = m_scrollGestureHandlingNode.get();
@@ -2474,13 +2479,28 @@ bool EventHandler::handleGestureTap(const PlatformGestureEvent& gestureEvent)
         return false;
 #endif
 
-    bool defaultPrevented = false;
-    PlatformMouseEvent fakeMouseMove(adjustedPoint, gestureEvent.globalPosition(), NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0, gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey(), gestureEvent.timestamp());
-    PlatformMouseEvent fakeMouseDown(adjustedPoint, gestureEvent.globalPosition(), LeftButton, PlatformEvent::MousePressed, /* clickCount */ 1, gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey(), gestureEvent.timestamp());
-    PlatformMouseEvent fakeMouseUp(adjustedPoint, gestureEvent.globalPosition(), LeftButton, PlatformEvent::MouseReleased, /* clickCount */ 1, gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey(), gestureEvent.timestamp());
+    PlatformMouseEvent fakeMouseMove(adjustedPoint, gestureEvent.globalPosition(),
+        NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0,
+        gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey(), gestureEvent.timestamp());
     mouseMoved(fakeMouseMove);
+
+    int tapCount = 1;
+    // FIXME: deletaX is overloaded to mean different things for different gestures.
+    // http://wkb.ug/93123
+    if (gestureEvent.deltaX() > 0)
+        tapCount = static_cast<int>(gestureEvent.deltaX());
+
+    bool defaultPrevented = false;
+    PlatformMouseEvent fakeMouseDown(adjustedPoint, gestureEvent.globalPosition(),
+        LeftButton, PlatformEvent::MousePressed, tapCount,
+        gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey(), gestureEvent.timestamp());
     defaultPrevented |= handleMousePressEvent(fakeMouseDown);
+
+    PlatformMouseEvent fakeMouseUp(adjustedPoint, gestureEvent.globalPosition(),
+        LeftButton, PlatformEvent::MouseReleased, tapCount,
+        gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey(), gestureEvent.timestamp());
     defaultPrevented |= handleMouseReleaseEvent(fakeMouseUp);
+
     return defaultPrevented;
 }
 
index 093a47a..e1805e1 100644 (file)
@@ -1,3 +1,16 @@
+2012-08-03  Rick Byers  <rbyers@chromium.org>
+
+        Double tap gesture should send dblclick event
+        https://bugs.webkit.org/show_bug.cgi?id=92412
+
+        Reviewed by Adam Barth.
+
+        Tweak comment to more completely describe the (lame) overloaded use
+        of deltaX in WebGestureEvent, and add a FIXME with the bug to track
+        cleaning it up.
+        * public/WebInputEvent.h:
+        (WebGestureEvent):
+
 2012-08-03  Dave Tu  <dtu@chromium.org>
 
         [chromium] Remove assert when getting hardware renderingStats in software mode.
index 5ea55d5..09048cd 100644 (file)
@@ -370,7 +370,11 @@ public:
     int globalX;
     int globalY;
 
-    // NOTE: |deltaX| and |deltaY| represents the amount to scroll for Scroll gesture events. For Pinch gesture events, |deltaX| represents the scaling/magnification factor.
+    // NOTE: |deltaX| and |deltaY| represents the amount to scroll for Scroll gesture events.
+    // For Pinch gesture events, |deltaX| represents the scaling/magnification factor.
+    // For a GestureTap event, |deltaX| represents the tap count.
+    // For a FlingStart event, |deltaX| and |deltaY| represent the velocity.
+    // FIXME: Avoid overloading 'delta' in this way. http://wkb.ug/93123
     float deltaX;
     float deltaY;
     WebRect boundingBox;
index d6eb3f7..9375d68 100644 (file)
@@ -1,3 +1,17 @@
+2012-08-03  Rick Byers  <rbyers@chromium.org>
+
+        Double tap gesture should send dblclick event
+        https://bugs.webkit.org/show_bug.cgi?id=92412
+
+        Reviewed by Adam Barth.
+
+        Enable EventSender to set the tap count on tap gesture events.  The
+        delta X/Y parameters were not actually being used anymore (used to be
+        used for radius information).
+
+        * DumpRenderTree/chromium/TestRunner/EventSender.cpp:
+        (EventSender::gestureEvent):
+
 2012-08-03  Ryosuke Niwa  <rniwa@webkit.org>
 
         run-perf-tests should generate JSON output and results page by default
index 5f49b8f..1ebd741 100644 (file)
@@ -1166,9 +1166,9 @@ void EventSender::gestureEvent(WebInputEvent::Type type, const CppArgumentList&
         event.y = m_currentGestureLocation.y;
         break;
     case WebInputEvent::GestureTap:
-        if (arguments.size() >= 4) {
+        if (arguments.size() >= 3) {
+            // Tap count.
             event.deltaX = static_cast<float>(arguments[2].toDouble());
-            event.deltaY = static_cast<float>(arguments[3].toDouble());
         }
         event.x = point.x;
         event.y = point.y;