Don't allow drags to start after a mouse press that creates a context menu
authordcheng@chromium.org <dcheng@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 25 Mar 2013 16:47:02 +0000 (16:47 +0000)
committerdcheng@chromium.org <dcheng@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 25 Mar 2013 16:47:02 +0000 (16:47 +0000)
https://bugs.webkit.org/show_bug.cgi?id=112079

Reviewed by Tony Chang.

.:

* ManualTests/context-menu-during-drag-selection.html: Added.

Source/WebCore:

This appears to be the intent of the original code anyway (the comments in the corresponding
context menu handlers indicate that they set m_mousePressed to false in order to suppress
drags from starting). Since exact platform behavior differs quite a bit in this area, this
will also make the behavior more consistent across different WebKit implementations.

Manually testable using context-menu-during-drag-selection.html.

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

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

ChangeLog
ManualTests/context-menu-during-drag-selection.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/page/EventHandler.cpp

index e624018..1e0598a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2013-03-25  Daniel Cheng  <dcheng@chromium.org>
+
+        Don't allow drags to start after a mouse press that creates a context menu
+        https://bugs.webkit.org/show_bug.cgi?id=112079
+
+        Reviewed by Tony Chang.
+
+        * ManualTests/context-menu-during-drag-selection.html: Added.
+
 2013-03-22  Yuki Sekiguchi  <yuki.sekiguchi@access-company.com>
 
         Cannot run All Source (target WebProcess) on Xcode.
diff --git a/ManualTests/context-menu-during-drag-selection.html b/ManualTests/context-menu-during-drag-selection.html
new file mode 100644 (file)
index 0000000..4710d87
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<body>
+<p>Simple manual behavior test for the interaction between selection drags,
+context menu invocation, and actual dragging. In order to test, simply start
+selecting a span of text by clicking and dragging. During text selection, no
+drag should start. While selecting text, press and hold the right mouse button
+to invoke the context menu, then release the right mouse button over a context
+menu entry like "Copy". After this, if you keep moving the mouse around, no drag
+of the selected text should start, even though the left mouse button is still
+held down.
+</body>
+</html>
index 5d78925..e434eb5 100644 (file)
@@ -1,3 +1,20 @@
+2013-03-25  Daniel Cheng  <dcheng@chromium.org>
+
+        Don't allow drags to start after a mouse press that creates a context menu
+        https://bugs.webkit.org/show_bug.cgi?id=112079
+
+        Reviewed by Tony Chang.
+
+        This appears to be the intent of the original code anyway (the comments in the corresponding
+        context menu handlers indicate that they set m_mousePressed to false in order to suppress
+        drags from starting). Since exact platform behavior differs quite a bit in this area, this
+        will also make the behavior more consistent across different WebKit implementations.
+
+        Manually testable using context-menu-during-drag-selection.html.
+
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::handleMouseDraggedEvent):
+
 2013-03-25  Vsevolod Vlasov  <vsevik@chromium.org>
 
         Web Inspector: [Regression] Provisional breakpoints are not shown on reload.
index af03729..af5c14c 100644 (file)
@@ -705,12 +705,12 @@ bool EventHandler::handleMousePressEvent(const MouseEventWithHitTestResults& eve
 #if ENABLE(DRAG_SUPPORT)
 bool EventHandler::handleMouseDraggedEvent(const MouseEventWithHitTestResults& event)
 {
-    if (handleDrag(event, ShouldCheckDragHysteresis))
-        return true;
-
     if (!m_mousePressed)
         return false;
 
+    if (handleDrag(event, ShouldCheckDragHysteresis))
+        return true;
+
     Node* targetNode = event.targetNode();
     if (event.event().button() != LeftButton || !targetNode)
         return false;