Title: [102048] trunk
Revision
102048
Author
[email protected]
Date
2011-12-05 14:33:18 -0800 (Mon, 05 Dec 2011)

Log Message

Last mouse event could be lost if a JS call to eventSender.leapForward is made
https://bugs.webkit.org/show_bug.cgi?id=73366

Patch by Hugo Parente Lima <[email protected]> on 2011-12-05
Reviewed by Kenneth Rohde Christiansen.

Tools:

Empty the entire event queue when requested besides using
sendEvent instead of postEvent to make sure all events were
delivered.

* WebKitTestRunner/qt/EventSenderProxyQt.cpp:
(WTR::EventSenderProxy::EventSenderProxy):
(WTR::EventSenderProxy::sendOrQueueEvent):
(WTR::EventSenderProxy::replaySavedEvents):

LayoutTests:

Add test to check if the test driver doesn't eat mouse events when
a JS call to eventSender.leapForward was made. This bug happened at
least on Qt version of WebKitTestRunner.

* fast/events/dont-loose-last-event-expected.txt: Added.
* fast/events/dont-loose-last-event.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (102047 => 102048)


--- trunk/LayoutTests/ChangeLog	2011-12-05 22:27:59 UTC (rev 102047)
+++ trunk/LayoutTests/ChangeLog	2011-12-05 22:33:18 UTC (rev 102048)
@@ -1,3 +1,17 @@
+2011-12-05  Hugo Parente Lima  <[email protected]>
+
+        Last mouse event could be lost if a JS call to eventSender.leapForward is made
+        https://bugs.webkit.org/show_bug.cgi?id=73366
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Add test to check if the test driver doesn't eat mouse events when
+        a JS call to eventSender.leapForward was made. This bug happened at
+        least on Qt version of WebKitTestRunner.
+
+        * fast/events/dont-loose-last-event-expected.txt: Added.
+        * fast/events/dont-loose-last-event.html: Added.
+
 2011-12-05  Julien Chaffraix  <[email protected]>
 
         TD width in precentage doesn't work.

Added: trunk/LayoutTests/fast/events/dont-loose-last-event-expected.txt (0 => 102048)


--- trunk/LayoutTests/fast/events/dont-loose-last-event-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/events/dont-loose-last-event-expected.txt	2011-12-05 22:33:18 UTC (rev 102048)
@@ -0,0 +1,3 @@
+This should test if the test driver doesn't eat the last event if there's a leapForward call beforehand.
+
+PASS

Added: trunk/LayoutTests/fast/events/dont-loose-last-event.html (0 => 102048)


--- trunk/LayoutTests/fast/events/dont-loose-last-event.html	                        (rev 0)
+++ trunk/LayoutTests/fast/events/dont-loose-last-event.html	2011-12-05 22:33:18 UTC (rev 102048)
@@ -0,0 +1,61 @@
+<html>
+<head>
+<script type="text/_javascript_">
+    var startElem;
+    var targetElem;
+    var consoleElm;
+
+    window._onload_ = function()
+    {
+        startElem = document.getElementById("startElem");
+        targetElem = document.getElementById("targetElem");
+        consoleElm = document.getElementById("console");
+
+        if (!startElem || !targetElem || !consoleElm)
+            return;
+
+        runTest();
+    }
+
+    function pass()
+    {
+        var div = document.createElement("div");
+        document.getElementById("console").appendChild(div);
+        div.innerHTML = "PASS";
+    };
+
+    function runTest()
+    {
+        if (!window.eventSender)
+            return;
+
+        if (window.layoutTestController)
+            layoutTestController.dumpAsText();
+
+        var startX = startElem.offsetLeft + 10;
+        var startY = startElem.offsetTop + startElem.offsetHeight / 2;
+        var endX = targetElem.offsetLeft + 10;
+        var endY = targetElem.offsetTop + targetElem.offsetHeight / 2;
+
+        eventSender.mouseMoveTo(startX, startY);
+        eventSender.leapForward(100);
+        eventSender.mouseMoveTo(endX, endY);
+
+        var testContainer = document.getElementById("test-container");
+        if (testContainer)
+            document.body.removeChild(testContainer);
+    }
+</script>
+</head>
+<body>
+    <p id="description">This should test if the test driver doesn't eat the last event if there's a leapForward call beforehand.</p>
+    <div id="test-container">
+        <br/><br/>
+        <div id="targetElem" style="border: 1px dashed" _onmouseover_="pass()">Pass the mouse over me.<br/><br/></div>
+        <hr/>
+        <div id="startElem">Mouse start location</div>
+        <hr/>
+    </div>
+    <div id="console"></div>
+</body>
+</html>

Modified: trunk/Tools/ChangeLog (102047 => 102048)


--- trunk/Tools/ChangeLog	2011-12-05 22:27:59 UTC (rev 102047)
+++ trunk/Tools/ChangeLog	2011-12-05 22:33:18 UTC (rev 102048)
@@ -1,3 +1,19 @@
+2011-12-05  Hugo Parente Lima  <[email protected]>
+
+        Last mouse event could be lost if a JS call to eventSender.leapForward is made
+        https://bugs.webkit.org/show_bug.cgi?id=73366
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Empty the entire event queue when requested besides using
+        sendEvent instead of postEvent to make sure all events were
+        delivered.
+
+        * WebKitTestRunner/qt/EventSenderProxyQt.cpp:
+        (WTR::EventSenderProxy::EventSenderProxy):
+        (WTR::EventSenderProxy::sendOrQueueEvent):
+        (WTR::EventSenderProxy::replaySavedEvents):
+
 2011-12-05  Adam Barth  <[email protected]>
 
         [Chromium] Remove no-longer-used forwarding headers in the WebKit API

Modified: trunk/Tools/WebKitTestRunner/qt/EventSenderProxyQt.cpp (102047 => 102048)


--- trunk/Tools/WebKitTestRunner/qt/EventSenderProxyQt.cpp	2011-12-05 22:27:59 UTC (rev 102047)
+++ trunk/Tools/WebKitTestRunner/qt/EventSenderProxyQt.cpp	2011-12-05 22:33:18 UTC (rev 102048)
@@ -50,7 +50,7 @@
 
 static WTREventQueue eventQueue[1024];
 static unsigned endOfQueue;
-static unsigned startOfQueue;
+static bool isReplayingEvents;
 
 EventSenderProxy::EventSenderProxy(TestController* testController)
     : m_testController(testController)
@@ -68,7 +68,7 @@
 {
     memset(eventQueue, 0, sizeof(eventQueue));
     endOfQueue = 0;
-    startOfQueue = 0;
+    isReplayingEvents = false;
 }
 
 static Qt::MouseButton getMouseButton(unsigned button)
@@ -398,32 +398,36 @@
 
 void EventSenderProxy::sendOrQueueEvent(QEvent* event)
 {
-    if (endOfQueue == startOfQueue && !eventQueue[endOfQueue].m_delay) {
+    if (!endOfQueue && !eventQueue[endOfQueue].m_delay) {
         m_testController->mainWebView()->sendEvent(event);
         delete event;
         return;
     }
 
     eventQueue[endOfQueue++].m_event = event;
-    eventQueue[endOfQueue].m_delay = 0;
     replaySavedEvents();
 }
 
 void EventSenderProxy::replaySavedEvents()
 {
-    if (startOfQueue < endOfQueue) {
-        while (!eventQueue[startOfQueue].m_delay && startOfQueue < endOfQueue) {
-            QEvent* ev = eventQueue[startOfQueue++].m_event;
-            m_testController->mainWebView()->postEvent(ev);
-        }
-        if (startOfQueue == endOfQueue) {
-            startOfQueue = 0;
-            endOfQueue = 0;
-        } else {
-            QTest::qWait(eventQueue[startOfQueue].m_delay);
-            eventQueue[startOfQueue].m_delay = 0;
-        }
+    if (isReplayingEvents)
+        return;
+
+    isReplayingEvents = true;
+    int i = 0;
+
+    while (i < endOfQueue) {
+        WTREventQueue& ev = eventQueue[i];
+        if (ev.m_delay)
+            QTest::qWait(ev.m_delay);
+        i++;
+        m_testController->mainWebView()->sendEvent(ev.m_event);
+        delete ev.m_event;
+        ev.m_delay = 0;
     }
+
+    endOfQueue = 0;
+    isReplayingEvents = false;
 }
 
 } // namespace WTR
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to