Bug 79173 - dragover's default action should prevent drop for file drags
Summary: dragover's default action should prevent drop for file drags
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: UI Events (show other bugs)
Version: 528+ (Nightly build)
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Daniel Cheng
URL:
Keywords:
: 99791 (view as bug list)
Depends on:
Blocks: 79171
  Show dependency treegraph
 
Reported: 2012-02-21 18:00 PST by Daniel Cheng
Modified: 2012-10-31 16:44 PDT (History)
4 users (show)

See Also:


Attachments
Test case (255 bytes, text/html)
2012-02-21 18:00 PST, Daniel Cheng
no flags Details
Patch (7.37 KB, patch)
2012-10-18 23:26 PDT, Daniel Cheng
no flags Details | Formatted Diff | Diff
Patch (9.59 KB, patch)
2012-10-20 00:41 PDT, Daniel Cheng
no flags Details | Formatted Diff | Diff
Patch (12.96 KB, patch)
2012-10-21 01:25 PDT, Daniel Cheng
no flags Details | Formatted Diff | Diff
More test cases (3.12 KB, text/html)
2012-10-25 12:23 PDT, Daniel Cheng
no flags Details
Patch (13.32 KB, patch)
2012-10-26 15:42 PDT, Daniel Cheng
no flags Details | Formatted Diff | Diff
Patch (13.46 KB, patch)
2012-10-26 17:00 PDT, Daniel Cheng
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Daniel Cheng 2012-02-21 18:00:12 PST
Created attachment 128098 [details]
Test case

Per the spec, both dragenter and dragover need to be cancelled for a drop to take place.
Comment 1 Alexey Proskuryakov 2012-02-22 10:18:40 PST
See also: bug 66469.
Comment 2 Daniel Cheng 2012-10-18 23:10:09 PDT
*** Bug 99791 has been marked as a duplicate of this bug. ***
Comment 3 Daniel Cheng 2012-10-18 23:12:00 PDT
I'm not sure when this regressed, but apparently not cancelling dragover still results in drops now as well. Ick.
Comment 4 Daniel Cheng 2012-10-18 23:26:22 PDT
Created attachment 169558 [details]
Patch

I have an initial patch. I need to refine it further though; according to the spec, drop events should still happen on things like <input> and <textarea> without requiring the dragover event to be cancelled.
Comment 5 Build Bot 2012-10-19 02:05:35 PDT
Comment on attachment 169558 [details]
Patch

Attachment 169558 [details] did not pass mac-ews (mac):
Output: http://queues.webkit.org/results/14457372

New failing tests:
http/tests/security/clipboard/clipboard-file-access.html
editing/pasteboard/drag-drop-url-with-style.html
fast/events/moving-text-should-fire-drop-and-dragend-events.html
fast/events/moving-text-should-fire-drop-and-dragend-events-2.html
Comment 6 WebKit Review Bot 2012-10-19 09:33:35 PDT
Comment on attachment 169558 [details]
Patch

Attachment 169558 [details] did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/14455588

New failing tests:
fast/events/moving-text-should-fire-drop-and-dragend-events.html
platform/chromium/plugins/drag-events.html
http/tests/security/clipboard/clipboard-file-access.html
fast/events/moving-text-should-fire-drop-and-dragend-events-2.html
editing/pasteboard/drag-drop-url-with-style.html
fast/dom/shadow/drop-event-in-shadow.html
fast/events/input-element-display-none-in-dragleave-crash.html
Comment 7 Daniel Cheng 2012-10-20 00:41:55 PDT
Created attachment 169761 [details]
Patch
Comment 8 WebKit Review Bot 2012-10-20 06:35:19 PDT
Comment on attachment 169761 [details]
Patch

Attachment 169761 [details] did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/14460881

New failing tests:
fast/dom/shadow/drop-event-in-shadow.html
Comment 9 Daniel Cheng 2012-10-21 01:25:45 PDT
Created attachment 169788 [details]
Patch
Comment 10 Tony Chang 2012-10-22 10:32:07 PDT
Comment on attachment 169788 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=169788&action=review

> Source/WebCore/ChangeLog:11
> +        action of the dragover event. Otherwise, if the cursor is over a text field, editing host,
> +        or an editable element, we also consider the drag to be accepted.

Can you include information about browser compat here? E.g., This makes us match the spec, IE and Opera, but differs from Gecko.  You might also want to include the spec text that describes this behavior (maybe also link to the msdn article about behavior in IE?).

> Source/WebCore/page/DragController.h:124
> +        bool m_documentIsHandlingDrag;

Should we initialize this in the constructor?  I guess it'll always be set by dragEnteredOrUpdated before we read it in performDrag.

> LayoutTests/fast/events/only-valid-drop-targets-receive-drop-expected.txt:8
> +Dropping here should NOT result in a drop event.
> +Dropping here should result in a drop event.
> +Starting drag...
> +Drop not received
> +Starting drag...
> +Drop received

Nit: It would be nice if the text output was clear about which div is which.  E.g., 
Dropping on drop1 should NOT...
Dropping on drop2 should result...
Starting drag to drop1...
Drop not received on drop1.
Starting drag to drop2...
Drop received on drop2.

> LayoutTests/fast/events/only-valid-drop-targets-receive-drop.html:64
> +

Nit: Extra blank line.
Comment 11 Daniel Cheng 2012-10-22 17:09:55 PDT
Upon further investigation, this behavior is specific to file drags. The layout test I added actually worked without the patch.

Currently, WebKit dispatches a drop event without requiring dragenter/dragover for file drags.

Other browsers:
IE: requires dragenter/dragover to be cancelled
Firefox: requires dragenter/dragover to be cancelled
Opera: requires dragenter/dragover to be cancelled

Given that our behavior is in the minority, I'm going to go ahead and land this patch after updating the layout test and addressing the review comments. I personally dislike it as it makes builtin drop handling inconsistent (<textarea> and <input type="text"> don't require dragenter/dragover cancellation to override default drop behavior), but talking with Tony, we're going to prioritize cross-browser compatibility.
Comment 12 Daniel Cheng 2012-10-25 12:23:15 PDT
Created attachment 170709 [details]
More test cases
Comment 13 Daniel Cheng 2012-10-25 12:24:32 PDT
Comment on attachment 169788 [details]
Patch

I'm going to be updating this patch for the following items:
1. Reflect the fact that the layout test I added is only for file drags.
2. Fix the fact that simply cancelling dragover is enough to get a drop event (per the spec, unless you're the body element, you need to cancel both the dragenter/dragover event). This brings us in line with the spec and IE behavior.
Comment 14 Daniel Cheng 2012-10-26 15:42:46 PDT
Created attachment 171032 [details]
Patch

Updated patch. I need to finish testing this on another machine since DRT won't run on my Mac anymore...
Comment 15 Daniel Cheng 2012-10-26 15:42:59 PDT
(In reply to comment #10)
> (From update of attachment 169788 [details])
> View in context: https://bugs.webkit.org/attachment.cgi?id=169788&action=review
> 
> > Source/WebCore/ChangeLog:11
> > +        action of the dragover event. Otherwise, if the cursor is over a text field, editing host,
> > +        or an editable element, we also consider the drag to be accepted.
> 
> Can you include information about browser compat here? E.g., This makes us match the spec, IE and Opera, but differs from Gecko.  You might also want to include the spec text that describes this behavior (maybe also link to the msdn article about behavior in IE?).
> 

Done.

> > Source/WebCore/page/DragController.h:124
> > +        bool m_documentIsHandlingDrag;
> 
> Should we initialize this in the constructor?  I guess it'll always be set by dragEnteredOrUpdated before we read it in performDrag.
> 

Done. It should always be initialized before we read it... but just to be safe, I initialized it in the ctor.

> > LayoutTests/fast/events/only-valid-drop-targets-receive-drop-expected.txt:8
> > +Dropping here should NOT result in a drop event.
> > +Dropping here should result in a drop event.
> > +Starting drag...
> > +Drop not received
> > +Starting drag...
> > +Drop received
> 
> Nit: It would be nice if the text output was clear about which div is which.  E.g., 
> Dropping on drop1 should NOT...
> Dropping on drop2 should result...
> Starting drag to drop1...
> Drop not received on drop1.
> Starting drag to drop2...
> Drop received on drop2.
> 

Done (partially). I can't think of a good way to do this that works with manual testing, so it only says "dropX" if a drop was received.

> > LayoutTests/fast/events/only-valid-drop-targets-receive-drop.html:64
> > +
> 
> Nit: Extra blank line.

Done.
Comment 16 Daniel Cheng 2012-10-26 17:00:39 PDT
Created attachment 171051 [details]
Patch
Comment 17 WebKit Review Bot 2012-10-26 18:31:23 PDT
Comment on attachment 171051 [details]
Patch

Clearing flags on attachment: 171051

Committed r132716: <http://trac.webkit.org/changeset/132716>
Comment 18 WebKit Review Bot 2012-10-26 18:31:27 PDT
All reviewed patches have been landed.  Closing bug.
Comment 19 Roger Fong 2012-10-31 16:38:39 PDT
Hello, fast/events/only-valid-drop-targets-receive-file-drop.html, fails on the Apple-Windows port.

Here's the diff:

 Starting drag...
 Drop received in drop target 1
 Starting drag...
-Drop not received
+FAIL: navigation expected
 
Do have any hunches about what it could be? 
Thanks
Comment 20 Tony Chang 2012-10-31 16:44:44 PDT
(In reply to comment #19)
> Hello, fast/events/only-valid-drop-targets-receive-file-drop.html, fails on the Apple-Windows port.
> 
> Here's the diff:
> 
>  Starting drag...
>  Drop received in drop target 1
>  Starting drag...
> -Drop not received
> +FAIL: navigation expected
> 
> Do have any hunches about what it could be? 
> Thanks

Win DRT is already skipping many drag&drop tests.  It's not clear to me if this failure is new or if Win DRT is missing some testing functionality.

LayoutTests/platform/win/TestExpectations has a comment that points to rdar://5621244 that may provide a reason?