Source/WebCore: preventDefault() in a mousedown in a subframe should not
authorjaphet@chromium.org <japhet@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 1 Feb 2012 18:45:17 +0000 (18:45 +0000)
committerjaphet@chromium.org <japhet@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 1 Feb 2012 18:45:17 +0000 (18:45 +0000)
prevent the scrollbar from handling mouse movements if the
cursor leaves the subframe.
https://bugs.webkit.org/show_bug.cgi?id=73097

Reviewed by Darin Adler.

Test: fast/events/scroll-div-with-prevent-default-in-subframe.html

* page/EventHandler.cpp:
(WebCore::EventHandler::handleMousePressEvent):

LayoutTests: Test for https://bugs.webkit.org/show_bug.cgi?id=73097.
Test adapted from repro case provided by zacklloyd@google.com.

Reviewed by Darin Adler.

* fast/events/resources/subframe-with-scrollable-div.html: Added.
* fast/events/scroll-div-with-prevent-default-in-subframe-expected.txt: Added.
* fast/events/scroll-div-with-prevent-default-in-subframe.html: Added.

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

LayoutTests/ChangeLog
LayoutTests/fast/events/resources/subframe-with-scrollable-div.html [new file with mode: 0644]
LayoutTests/fast/events/scroll-div-with-prevent-default-in-subframe-expected.txt [new file with mode: 0644]
LayoutTests/fast/events/scroll-div-with-prevent-default-in-subframe.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/page/EventHandler.cpp

index 7adaaf0..8af76b4 100644 (file)
@@ -1,3 +1,14 @@
+2012-02-01  Nate Chapin  <japhet@chromium.org>
+
+        Test for https://bugs.webkit.org/show_bug.cgi?id=73097.
+        Test adapted from repro case provided by zacklloyd@google.com.
+
+        Reviewed by Darin Adler.
+
+        * fast/events/resources/subframe-with-scrollable-div.html: Added.
+        * fast/events/scroll-div-with-prevent-default-in-subframe-expected.txt: Added.
+        * fast/events/scroll-div-with-prevent-default-in-subframe.html: Added.
+
 2012-02-01  Mario Sanchez Prada  <msanchez@igalia.com>
 
         [GTK] editing/inserting/4960120-2.html flaky crash
diff --git a/LayoutTests/fast/events/resources/subframe-with-scrollable-div.html b/LayoutTests/fast/events/resources/subframe-with-scrollable-div.html
new file mode 100644 (file)
index 0000000..ef0f287
--- /dev/null
@@ -0,0 +1,12 @@
+<html><body>
+<div id="scrollable" style="overflow-y:scroll;height:500px">
+  <div style="height:1000px;width:500px;">
+    Scrollable content.
+  </div>
+</div>
+<script type="text/javascript">
+document.getElementById('scrollable').addEventListener('mousedown', 
+    function(evt) { 
+        evt.preventDefault(); 
+    });
+</script></body></html>
diff --git a/LayoutTests/fast/events/scroll-div-with-prevent-default-in-subframe-expected.txt b/LayoutTests/fast/events/scroll-div-with-prevent-default-in-subframe-expected.txt
new file mode 100644 (file)
index 0000000..fa7a9f6
--- /dev/null
@@ -0,0 +1,7 @@
+PASS
+This test does the following via EventSender:
+1. Click and drag the div scrollbar to a middle point.
+2. Click and drag again, this time down and to right, with the mouseup occurring in a parent frame.
+3. Move the mouse back into the div with the scrollbar.
+Per https://bugs.webkit.org/show_bug.cgi?id=73097, because the div with the scrollbar had a mousedown event that called preventDefault(), the mouse moves would not properly be handled by the scrollbar. We pass if the div's scrollTop property is the same after all 3 steps.
diff --git a/LayoutTests/fast/events/scroll-div-with-prevent-default-in-subframe.html b/LayoutTests/fast/events/scroll-div-with-prevent-default-in-subframe.html
new file mode 100644 (file)
index 0000000..eda8c0e
--- /dev/null
@@ -0,0 +1,43 @@
+<html><body onload="scroll()">
+<script>
+function scroll() {
+    if (window.eventSender) {
+        var scrollbar = document.getElementById("subframe").contentDocument.getElementById('scrollable');
+
+        var startX = scrollbar.offsetLeft + scrollbar.offsetWidth - 5;
+        var startY = scrollbar.offsetTop + 200;
+
+        eventSender.mouseMoveTo(startX, startY - 100);
+        eventSender.mouseDown();
+        eventSender.mouseMoveTo(startX, startY);
+        eventSender.mouseUp();
+
+        eventSender.mouseDown();
+        eventSender.mouseMoveTo(startX, startY + 200);
+        eventSender.mouseMoveTo(startX + 200, startY + 200);
+        eventSender.mouseUp();
+        var scrollAfterMoveToMainFrame = scrollbar.scrollTop;
+
+        eventSender.mouseMoveTo(startX - 100, startY - 100);
+        var scrollAfterReturnToSubframe = scrollbar.scrollTop;
+        var result = scrollAfterMoveToMainFrame == scrollAfterReturnToSubframe ? "PASS" 
+            : "FAIL: scrollAfterMoveToMainFrame = " + scrollAfterMoveToMainFrame + ", scrollAfterReturnToSubframe = " + scrollAfterReturnToSubframe;
+        document.getElementById("console").appendChild(document.createTextNode(result));
+        layoutTestController.notifyDone();
+    }
+}
+
+if (window.layoutTestController) {
+    layoutTestController.dumpAsText();
+    layoutTestController.waitUntilDone();
+}
+</script>
+<div id="console"></div>
+<iframe id="subframe" width="500px" height="350" scrolling="no" marginwidth="0" marginheight="0" src="resources/subframe-with-scrollable-div.html"></iframe>
+<br>This test does the following via EventSender:<br>
+1. Click and drag the div scrollbar to a middle point.<br>
+2. Click and drag again, this time down and to right, with the mouseup occurring in a parent frame.<br>
+3. Move the mouse back into the div with the scrollbar.<br>
+Per https://bugs.webkit.org/show_bug.cgi?id=73097, because the div with the scrollbar had a mousedown event that called preventDefault(),
+the mouse moves would not properly be handled by the scrollbar. We pass if the div's scrollTop property is the same after all 3 steps.
+</body></html>
index fc7fe28..0d00a4c 100644 (file)
@@ -1,3 +1,17 @@
+2012-02-01  Nate Chapin  <japhet@chromium.org>
+
+        preventDefault() in a mousedown in a subframe should not
+        prevent the scrollbar from handling mouse movements if the
+        cursor leaves the subframe.
+        https://bugs.webkit.org/show_bug.cgi?id=73097
+
+        Reviewed by Darin Adler.
+
+        Test: fast/events/scroll-div-with-prevent-default-in-subframe.html
+
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::handleMousePressEvent):
+
 2012-02-01  Mario Sanchez Prada  <msanchez@igalia.com>
 
         [GTK] editing/inserting/4960120-2.html flaky crash
index 507a914..2fe8f04 100644 (file)
@@ -1461,7 +1461,7 @@ bool EventHandler::handleMousePressEvent(const PlatformMouseEvent& mouseEvent)
     m_frame->selection()->setCaretBlinkingSuspended(true);
 
     bool swallowEvent = dispatchMouseEvent(eventNames().mousedownEvent, targetNode(mev), true, m_clickCount, mouseEvent, true);
-    m_capturesDragging = !swallowEvent;
+    m_capturesDragging = !swallowEvent || mev.scrollbar();
 
     // If the hit testing originally determined the event was in a scrollbar, refetch the MouseEventWithHitTestResults
     // in case the scrollbar widget was destroyed when the mouse event was handled.