Reviewed by Geoff.
authorap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 8 Dec 2006 18:31:53 +0000 (18:31 +0000)
committerap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 8 Dec 2006 18:31:53 +0000 (18:31 +0000)
        http://bugs.webkit.org/show_bug.cgi?id=11718
        REGRESSION: When I mouse up after dragging a selection outside of a iframe, the iframe
        continues to scroll automatically.

        Test: manual-tests/autoscroll.html

        * manual-tests/autoscroll.html: Added.

        * page/EventHandler.cpp:
        (WebCore::EventHandler::handleMousePressEvent):
        Assign to m_mousePressNode earlier, so that it is available in the superframe as well.
        Reset m_mouseDownWasInSubframe to false when starting to handle a mousedown - previously, its value
        was only defined if the event was passed down to a widget or a subframe.

        (WebCore::EventHandler::stopAutoscrollTimer):
        If the mouse down event was in a subframe, stop the subframe's timer.

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

WebCore/ChangeLog
WebCore/manual-tests/autoscroll.html [new file with mode: 0644]
WebCore/page/EventHandler.cpp

index bd10bfd8e881dca89e05f9bfd5a39b0758fbbfb1..2823fc3fe366b6dde93faff7248b11136c138426 100644 (file)
@@ -1,3 +1,24 @@
+2006-12-08  Alexey Proskuryakov  <ap@webkit.org>
+
+        Reviewed by Geoff.
+
+        http://bugs.webkit.org/show_bug.cgi?id=11718
+        REGRESSION: When I mouse up after dragging a selection outside of a iframe, the iframe
+        continues to scroll automatically.
+
+        Test: manual-tests/autoscroll.html
+
+        * manual-tests/autoscroll.html: Added.
+
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::handleMousePressEvent):
+        Assign to m_mousePressNode earlier, so that it is available in the superframe as well.
+        Reset m_mouseDownWasInSubframe to false when starting to handle a mousedown - previously, its value
+        was only defined if the event was passed down to a widget or a subframe.
+
+        (WebCore::EventHandler::stopAutoscrollTimer):
+        If the mouse down event was in a subframe, stop the subframe's timer.
+
 2006-12-08  Alexey Proskuryakov  <ap@webkit.org>
 
         Reviewed by Geoff.
diff --git a/WebCore/manual-tests/autoscroll.html b/WebCore/manual-tests/autoscroll.html
new file mode 100644 (file)
index 0000000..10f3bc5
--- /dev/null
@@ -0,0 +1,28 @@
+<head>
+<script>
+function addFrameText() {
+  frameDoc = window.frames[0].document;
+  item = frameDoc.createElement("p");
+  item.appendChild(frameDoc.createTextNode("Hello, world!"));
+  for (i = 0; i < 1000; ++i) {
+    frameDoc.body.appendChild(item.cloneNode(true));
+  }
+}
+</script>
+</head>
+
+<body onload="javascript:addFrameText()">
+
+<p>Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=11718">bug 11718</a>:
+When I mouse up after dragging a selection outside of a iframe, the iframe continues to scroll automatically.</p>
+
+<p>Make the frame autoscroll by moving the mouse pointer outside of it while selecting. 
+Autoscrolling should stop when you release the mouse button outside the frame (in the main frame, 
+in another subframe, or just outside the window).</p>
+
+<IFRAME FRAMEBORDER=1></IFRAME>
+<br>
+<IFRAME FRAMEBORDER=1></IFRAME>
+
+</body>
+</html>
index d26c41ac51ab48ea4d04a96f52b1cbf43d6780a4..8c98fcf229c68747103214e5bf796f8c9fd4d65d 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -76,6 +77,8 @@ using namespace SVGNames;
 
 const double autoscrollInterval = 0.1;
 
+static Frame* subframeForTargetNode(Node* node);
+
 EventHandler::EventHandler(Frame* frame)
     : m_frame(frame)
     , m_bMousePressed(false)
@@ -254,8 +257,6 @@ bool EventHandler::handleMousePressEvent(const MouseEventWithHitTestResults& eve
     // Careful that the drag starting logic stays in sync with eventMayStartDrag()
     m_mouseDownMayStartDrag = singleClick;
 
-    m_mousePressNode = event.targetNode();
-    
     if (passWidgetMouseDownEventToWidget(event))
         return true;
 
@@ -472,6 +473,12 @@ void EventHandler::startAutoscrollTimer()
 
 void EventHandler::stopAutoscrollTimer(bool rendererIsBeingDestroyed)
 {
+    if (m_mouseDownWasInSubframe) {
+        Frame* subframe = subframeForTargetNode(m_mousePressNode.get());
+        subframe->eventHandler()->stopAutoscrollTimer(rendererIsBeingDestroyed);
+        return;
+    }
+
     if (!rendererIsBeingDestroyed && autoscrollRenderer())
         autoscrollRenderer()->stopAutoscroll();
     setAutoscrollRenderer(0);
@@ -685,6 +692,7 @@ bool EventHandler::handleMousePressEvent(const PlatformMouseEvent& mouseEvent)
 
     m_mousePressed = true;
     m_currentMousePosition = mouseEvent.pos();
+    m_mouseDownWasInSubframe = false;
     
     MouseEventWithHitTestResults mev = prepareMouseEvent(false, true, false, mouseEvent);
 
@@ -693,6 +701,8 @@ bool EventHandler::handleMousePressEvent(const PlatformMouseEvent& mouseEvent)
         return false;
     }
 
+    m_mousePressNode = mev.targetNode();
+
     Frame* subframe = subframeForTargetNode(mev.targetNode());
     if (subframe && passMousePressEventToSubframe(mev, subframe)) {
         invalidateClick();