Having a drop handler prevents navigation on drop even if event is not cancelled
authordcheng@chromium.org <dcheng@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 2 Apr 2012 22:33:42 +0000 (22:33 +0000)
committerdcheng@chromium.org <dcheng@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 2 Apr 2012 22:33:42 +0000 (22:33 +0000)
https://bugs.webkit.org/show_bug.cgi?id=79172

Reviewed by Ryosuke Niwa.

Source/WebCore:

Only early return if the drop handler prevents the default action.

Test: fast/events/drop-handler-should-not-stop-navigate.html

* page/DragController.cpp:
(WebCore::DragController::performDrag):

LayoutTests:

* fast/events/drag-dataTransferItemList.html: Fix drop handler to prevent default.
* fast/events/drop-handler-should-not-stop-navigate-expected.txt: Added.
* fast/events/drop-handler-should-not-stop-navigate.html: Added.
* http/tests/security/clipboard/clipboard-file-access.html: Change dragover to drop handler
    to prevent bubbled events from causing navigation.

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

LayoutTests/ChangeLog
LayoutTests/fast/events/drag-dataTransferItemList.html
LayoutTests/fast/events/drop-handler-should-not-stop-navigate-expected.txt [new file with mode: 0644]
LayoutTests/fast/events/drop-handler-should-not-stop-navigate.html [new file with mode: 0644]
LayoutTests/http/tests/security/clipboard/clipboard-file-access.html
Source/WebCore/ChangeLog
Source/WebCore/page/DragController.cpp

index 821566b..8af7dc8 100644 (file)
@@ -1,3 +1,16 @@
+2012-04-02  Daniel Cheng  <dcheng@chromium.org>
+
+        Having a drop handler prevents navigation on drop even if event is not cancelled
+        https://bugs.webkit.org/show_bug.cgi?id=79172
+
+        Reviewed by Ryosuke Niwa.
+
+        * fast/events/drag-dataTransferItemList.html: Fix drop handler to prevent default.
+        * fast/events/drop-handler-should-not-stop-navigate-expected.txt: Added.
+        * fast/events/drop-handler-should-not-stop-navigate.html: Added.
+        * http/tests/security/clipboard/clipboard-file-access.html: Change dragover to drop handler
+            to prevent bubbled events from causing navigation.
+
 2012-04-02  Stephen Chenney  <schenney@chromium.org>
 
         [Chromium] Flaky SVG tests on MacOS 10.6
index bc332e9..17f0855 100644 (file)
@@ -131,6 +131,7 @@ function drop(event)
         legacyDrop(event.dataTransfer);
     else if (dropMethod.selectedIndex == 1)
         itemListDrop(event.dataTransfer);
+    event.preventDefault();
 }
 
 function runTest(dragMethodIndex, dropMethodIndex)
diff --git a/LayoutTests/fast/events/drop-handler-should-not-stop-navigate-expected.txt b/LayoutTests/fast/events/drop-handler-should-not-stop-navigate-expected.txt
new file mode 100644 (file)
index 0000000..b311908
--- /dev/null
@@ -0,0 +1,7 @@
+This tests that a drop handler's default action must be prevented in order to stop navigation. Otherwise, if event.preventDefault() is not called, navigation should occur. To test manually, simply drag and drop another link or HTML file on this page. If navigation occurs, then the test passed.
+
+Starting test
+Cancelling dragenter
+Cancelling dragover
+Not preventing default event on drop.
+PASS
diff --git a/LayoutTests/fast/events/drop-handler-should-not-stop-navigate.html b/LayoutTests/fast/events/drop-handler-should-not-stop-navigate.html
new file mode 100644 (file)
index 0000000..397fec9
--- /dev/null
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+<body>
+<div>This tests that a drop handler's default action must be prevented in order to stop navigation.
+Otherwise, if event.preventDefault() is not called, navigation should occur. To test manually,
+simply drag and drop another link or HTML file on this page. If navigation occurs, then the test
+passed.</div>
+<script>
+function log(text)
+{
+    document.body.appendChild(document.createElement('br'));
+    document.body.appendChild(document.createElement('div').appendChild(document.createTextNode(text)));
+}
+if (!window.layoutTestController)
+    return;
+window.addEventListener('beforeunload', function ()
+{
+    log('PASS');
+    layoutTestController.notifyDone();
+});
+document.body.addEventListener('dragenter', function (event)
+{
+    log('Cancelling dragenter');
+    event.preventDefault();
+});
+document.body.addEventListener('dragover', function (event)
+{
+    log('Cancelling dragover');
+    event.preventDefault();
+});
+document.body.addEventListener('drop', function (event)
+{
+    log('Not preventing default event on drop.');
+});
+layoutTestController.dumpAsText();
+layoutTestController.waitUntilDone();
+log('Starting test');
+eventSender.beginDragWithFiles(['DRTFakeFile']);
+eventSender.mouseMoveTo(document.body.offsetLeft + 10, document.body.offsetTop + 10);
+eventSender.mouseUp();
+log('FAIL');
+layoutTestController.notifyDone();
+</script>
+</body>
+</html>
index 9801223..1d23d59 100644 (file)
@@ -55,7 +55,7 @@ dragTarget.addEventListener("drop", function() {
 // Some tests don't end up dropping the draggee over the drag target. Catch any
 // leftover drop events bubbling up through the tree so they don't cause page
 // navigation.
-document.body.addEventListener("dragover", function() {
+document.body.addEventListener("drop", function() {
     event.preventDefault();
 });
 
index 128987b..2979270 100644 (file)
@@ -1,3 +1,17 @@
+2012-04-02  Daniel Cheng  <dcheng@chromium.org>
+
+        Having a drop handler prevents navigation on drop even if event is not cancelled
+        https://bugs.webkit.org/show_bug.cgi?id=79172
+
+        Reviewed by Ryosuke Niwa.
+
+        Only early return if the drop handler prevents the default action.
+
+        Test: fast/events/drop-handler-should-not-stop-navigate.html
+
+        * page/DragController.cpp:
+        (WebCore::DragController::performDrag):
+
 2012-04-02  Alexis Menard  <alexis.menard@openbossa.org>
 
         We should use CSSPropertyID rather than integers when manipulating CSS property ids.
index dfeb529..3ed90b1 100644 (file)
@@ -212,7 +212,7 @@ bool DragController::performDrag(DragData* dragData)
             preventedDefault = mainFrame->eventHandler()->performDragAndDrop(createMouseEvent(dragData), clipboard.get());
             clipboard->setAccessPolicy(ClipboardNumb); // Invalidate clipboard here for security
         }
-        if (m_isHandlingDrag || preventedDefault) {
+        if (preventedDefault) {
             m_documentUnderMouse = 0;
             return true;
         }