Bug 30266

Summary: REGRESSION(r47852): Crash on drag and drop
Product: WebKit Reporter: Daniel Bates <dbates>
Component: WebCore Misc.Assignee: Nobody <webkit-unassigned>
Status: RESOLVED FIXED    
Severity: Critical CC: ap, bweinstein, eric, noel.gordon, webkit, yutak
Priority: P2 Keywords: Regression
Version: 528+ (Nightly build)   
Hardware: Mac   
OS: OS X 10.5   
URL: http://decafbad.com/2009/07/drag-and-drop/api-demos.html#data_transfer
Attachments:
Description Flags
Crash dump
none
LayoutTest case
none
Self-contained test case (included in patch "LayoutTest case")
none
Layout test
none
Win Skip List Fix
none
Layout test text/plain fix
none
Layout test text/plain fix
none
Layout test text/plain fix none

Daniel Bates
Reported 2009-10-09 16:30:58 PDT
Following up on a comment by webkit@leemcdermott.co.uk on bug #23695, crash confirmed when dragging the box marked "Text" (or "Text/HTML/URI" or "Disallowed") to the drop target on the page: http://decafbad.com/2009/07/drag-and-drop/api-demos.html#data_transfer Confirmed that r47852 is at fault, <http://trac.webkit.org/changeset/47852>.
Attachments
Crash dump (34.01 KB, text/plain)
2009-10-09 16:32 PDT, Daniel Bates
no flags
LayoutTest case (4.62 KB, patch)
2009-10-09 17:56 PDT, Daniel Bates
no flags
Self-contained test case (included in patch "LayoutTest case") (9.47 KB, text/html)
2009-10-09 18:10 PDT, Daniel Bates
no flags
Layout test (5.51 KB, patch)
2009-10-16 14:26 PDT, Daniel Bates
no flags
Win Skip List Fix (1.81 KB, patch)
2009-10-19 13:00 PDT, Daniel Bates
no flags
Layout test text/plain fix (1.80 KB, patch)
2009-10-21 17:46 PDT, Daniel Bates
no flags
Layout test text/plain fix (2.29 KB, patch)
2009-11-01 21:10 PST, Daniel Bates
no flags
Layout test text/plain fix (2.28 KB, patch)
2009-11-01 21:14 PST, Daniel Bates
no flags
Daniel Bates
Comment 1 2009-10-09 16:32:24 PDT
Created attachment 40974 [details] Crash dump Crash dump with respect to r47852.
Daniel Bates
Comment 2 2009-10-09 17:56:55 PDT
Created attachment 40977 [details] LayoutTest case A DRT test case. Passes under revisions < 47852. Also works in Firefox 3.5.3.
Daniel Bates
Comment 3 2009-10-09 17:59:36 PDT
I should mention, that the crash occurs when you try to access event.dataTransfer.types on the event object passed to the ondrop event handler routine. See comment "// This line causes the crash." in the LayoutTest case patch.
Daniel Bates
Comment 4 2009-10-09 18:10:12 PDT
Created attachment 40978 [details] Self-contained test case (included in patch "LayoutTest case") For convenience, here is a self-contained version of the test case included in the patch "LayoutTest case". Note, opening the test page will not crash Safari, but performing the test (i.e. dropping and red square onto the drop target) WILL CRASH Safari.
Daniel Bates
Comment 5 2009-10-09 20:03:02 PDT
Only effects the Macintosh platform. Running the test under Windows Safari 4.0.3 (531.9.1), "event.dataTransfer.types" is NULL. Probably best to file another bug report for this.
webkit
Comment 6 2009-10-14 10:14:24 PDT
Test case no longer crashes recent WebKit nightlies. Tested on r49550, Mac OS X 10.6.
Daniel Bates
Comment 7 2009-10-16 14:26:23 PDT
Created attachment 41326 [details] Layout test Although this issue has been resolved as of nightly r49550 we should add a test case so that we can prevent a regression of this issue.
Daniel Bates
Comment 8 2009-10-16 14:34:20 PDT
Comment on attachment 41326 [details] Layout test Clearing flags on attachment: 41326 Committed r49701: <http://trac.webkit.org/changeset/49701>
Daniel Bates
Comment 9 2009-10-16 14:34:24 PDT
All reviewed patches have been landed. Closing bug.
Alexey Proskuryakov
Comment 10 2009-10-16 15:05:14 PDT
> Although this issue has been resolved as of nightly r49550 we should add a > test case so that we can prevent a regression of this issue. I think this was resolved in <http://trac.webkit.org/changeset/49513>, which already includes a test case. Is this new test different in some interesting way?
Daniel Bates
Comment 11 2009-10-16 15:36:12 PDT
There is probably overlap here. Microsoft differentiates the dataTransfer and clipboardData objects. The former is with respect to event objects and the latter with respect to the window object (see first sentence of "Data Transfer Objects" at http://msdn.microsoft.com/en-us/library/ms537658%28VS.85%29.aspx). It sounds like WebKit uses the same pipeline for handling this kind of functionality, but I have not checked. Though, it wouldn't surprise me if they did at some point since these objects share a common goal of transferring data. For your reference, this test case tests the issue with respect to event.dataTransfer. The test case <http://trac.webkit.org/browser/trunk/LayoutTests/editing/pasteboard/crash-accessing-clipboardData-types.html?rev=49513> seems to test with respect to window.clipboardData (but it even looks like window.clipboardData == event.clipboardData == event.dataTransfer - but I haven't confirmed this). We can remove the test case if you want. What are your thoughts? (In reply to comment #10) > > Although this issue has been resolved as of nightly r49550 we should add a > > test case so that we can prevent a regression of this issue. > > I think this was resolved in <http://trac.webkit.org/changeset/49513>, which > already includes a test case. Is this new test different in some interesting > way?
Alexey Proskuryakov
Comment 12 2009-10-16 15:42:04 PDT
> We can remove the test case if you want. What are your thoughts? I do not have a strong opinion - if you think that having both tests is better, we should certainly keep both.
Daniel Bates
Comment 13 2009-10-16 21:40:53 PDT
Lets leave it in for now since dataTransfer and clipboardData are for different purposes according to the aforementioned MSDN documentation. It may turn out to be that currently WebKit uses the same pipeline for both. (In reply to comment #12) > > We can remove the test case if you want. What are your thoughts? > > I do not have a strong opinion - if you think that having both tests is better, > we should certainly keep both.
Brian Weinstein
Comment 14 2009-10-19 11:16:38 PDT
The test for this inside platform/win is not passing on the bots: http://build.webkit.org/results/Windows%20Release%20(Tests)/r49789%20(5277)/fast/events/drag-and-drop-dataTransfer-types-nocrash-pretty-diff.html Re-opening the bug and adding this test to the Windows Skipped List. If this only affects Mac should we make this a Mac only test?
Daniel Bates
Comment 15 2009-10-19 12:32:30 PDT
Oops. Yes, the test should be Mac only, see bug #30527 (also mentioned in comment #5 on this bug) (In reply to comment #14) > The test for this inside platform/win is not passing on the bots: > > http://build.webkit.org/results/Windows%20Release%20(Tests)/r49789%20(5277)/fast/events/drag-and-drop-dataTransfer-types-nocrash-pretty-diff.html > > Re-opening the bug and adding this test to the Windows Skipped List. If this > only affects Mac should we make this a Mac only test?
Daniel Bates
Comment 16 2009-10-19 13:00:07 PDT
Created attachment 41442 [details] Win Skip List Fix Added a comment that explains that we need to skip this test under Windows until we resolve bug #30527. Also, minor grammatical changes.
Eric Seidel (no email)
Comment 17 2009-10-19 13:54:23 PDT
Comment on attachment 41442 [details] Win Skip List Fix Would be more useful to link to the bug here: +# This test has never passed on Windows, reopening its bug Currently that comment is just confusing, at least the reopening part.
Daniel Bates
Comment 18 2009-10-19 14:15:20 PDT
I will fix this before I land. (In reply to comment #17) > (From update of attachment 41442 [details]) > Would be more useful to link to the bug here: > +# This test has never passed on Windows, reopening its bug > > Currently that comment is just confusing, at least the reopening part.
Daniel Bates
Comment 19 2009-10-19 14:40:33 PDT
noel gordon
Comment 20 2009-10-20 08:12:09 PDT
In the layout test committed r49701, I noticed at line 43 that you call event.dataTransfer.setData() with 'text' as the first argument. Perhaps you meant to use a mine type 'text/plain', or the special value for same defined in HTML5 -- 'Text', for the data type? Some embedders are picky about the case-sensitivity of the type or will only accept the HTML5 defined special values, or mime types. Your test wont pass on Chrome for example.
Daniel Bates
Comment 21 2009-10-21 17:46:55 PDT
Created attachment 41625 [details] Layout test text/plain fix Updated the test according to Noel's comment. I don't have Chrome/Chromium. Noel, can you see if this patch makes Chrome happy?
noel gordon
Comment 22 2009-10-22 01:02:40 PDT
Test in Chrome 3 (3.0.195.27) I checked both 'Text' and 'text/plain'. Either work, but only with a small change to your test :) When text is being dragged, 'Text' _and_ 'plain/text' are both present in the event.dataTransfer.types array, in some implementation-defined order. Line 88 of your test reads: shouldBeEqualToString('event.dataTransfer.types[0]', FORMAT_TYPE); Here types[0] is assumed -- that can fail in other implementations. So maybe something like: if (event.dataTransfer.types.indexOf(FORMAT_TYPE) == -1) // Test FAILED ... else // Test PASSED ... would be better. I'll leave you to fill in the test logging details, and re- run the tests.
Daniel Bates
Comment 23 2009-10-26 02:01:59 PDT
Thanks Noel. Just want to let people know, I have not forgotten about this issue. I hope to have an updated layout test (that works in Chrome) by the end the week. (In reply to comment #22) > Test in Chrome 3 (3.0.195.27) I checked both 'Text' and 'text/plain'. Either > work, but only with a small change to your test :) ...
Daniel Bates
Comment 24 2009-11-01 21:10:31 PST
Created attachment 42296 [details] Layout test text/plain fix Works in Chrome 4.0.223.11 on Mac.
Daniel Bates
Comment 25 2009-11-01 21:14:13 PST
Created attachment 42297 [details] Layout test text/plain fix Minor change in wording for fail message.
Daniel Bates
Comment 26 2009-11-01 21:49:58 PST
Re-opening this bug so that we can make this layout test work in Chrome.
Daniel Bates
Comment 27 2009-11-01 21:50:38 PST
Comment on attachment 42297 [details] Layout test text/plain fix Marked for review.
noel gordon
Comment 28 2009-11-01 22:53:38 PST
Thanks Daniel. Works on Chrome 3.0.195.27 Vista. Eric may have some final comments, and give you an r+.
Eric Seidel (no email)
Comment 29 2009-11-01 22:57:16 PST
Comment on attachment 42297 [details] Layout test text/plain fix Is it supposed to contain both "text" and "text/plain"? Is this spec'd somewhere? I don't think Chrome and Apple WebKit should diverge here, so I'm confused as to why this change would be needed. Is the types sort-order different for chrome, or are the exposed types different?
Daniel Bates
Comment 30 2009-11-01 23:27:24 PST
Yes, there is a discrepancy between the Safari and Chrome builds for some reason that I am unclear about at the the moment (will look into). I just filed bug #31003 with regards to this issue. Do you want to hold off on this patch until we fix bug #31003? (In reply to comment #29) > (From update of attachment 42297 [details]) > Is it supposed to contain both "text" and "text/plain"? Is this spec'd > somewhere? I don't think Chrome and Apple WebKit should diverge here, so I'm > confused as to why this change would be needed. Is the types sort-order > different for chrome, or are the exposed types different?
noel gordon
Comment 31 2009-11-03 10:09:56 PST
To answer eric's questions: > Is it supposed to contain both "text" and "text/plain"? Is this spec'd > somewhere? I don't think Chrome and Apple WebKit should diverge here, so > I'm confused as to why this change would be needed. Agree, not looking to diverge here. And for the first two questions; when text is added to the dataTransfer object, format "text/plain", and the relevant Section is 7.9.2 The DragEvent and DataTransfer Interfaces of http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd Section 7.9.2 first talks about data "formats" and states that the formats are case-sensitive and that there are legacy values: 'DataTransfer objects can hold pieces of data, each associated with a unique format. Formats are generally given by MIME types, with some values special- cased for legacy reasons. For the purposes of this API, however, the format strings are opaque, case-sensitive, strings, and the empty string is a valid format string.' The data formats are used only in the Section 7.9.2 dataTransfer methods clearData(format), getData(format), and setData(format, data). These methods mention the handling of the legacy formats similarly, and setData() is a good example: 'The setData(format, data) method must add data to the data stored in the DataTransfer object, labeled as being of the type format. This must replace any previous data that had been set for that format. If format is the value "Text", then it must be treated as "text/plain". If the format is "URL", then it must be treated as "text/uri-list".' So for setData("text/plain", "foo"), I'd expect to see "text/plain" in the dataTransfer.types, and if "Text" must be treated as "text/plain", is it reasonable to conclude that setData("Text", "foo") must do likewise? I also see nothing in Section 7.9 Drag and Drop, that restricts the UA from adding other formats during drag drop initialization, and they typically do. If I select some text on the page, drag drop it on a target in the page, and enumerate the dataTransfer.types in the drop event, my results are: Safari 4 Mac OS X 0:public.utf8-plain-text 1:dyn.agu8y63n2nuuha5dbrf1ca2pxqry0wkduqf31k3pcr7u1e3basv61a3k 2:text/plain Chrome 3.0.195.27 Vista 0:Text 1:text/plain FF 3.5.3, 3.6b1 Vista 0:text/_moz_htmlcontext 1:text/_moz_htmlinfo 2:text/html 3:text/plain Hope that answers your last question about sort order etc. When I write cross-browser js for HTML5 text drag drop, I look for "text/plain" in the dataTransfer.types only. That's the only point of convergence I've found, and agrees with my understanding of the HTML5 drag drop spec.
Eric Seidel (no email)
Comment 32 2009-11-03 12:15:31 PST
*** Bug 31004 has been marked as a duplicate of this bug. ***
Eric Seidel (no email)
Comment 33 2009-11-03 12:57:51 PST
Comment on attachment 42297 [details] Layout test text/plain fix I think this is an OK fix.
Daniel Bates
Comment 34 2009-11-04 15:58:01 PST
Comment on attachment 41442 [details] Win Skip List Fix Clearing review flag so I can land the latest patch using bugzilla-tool :-). For reference, Eric r+'ed the WinSkipFix.patch.
Daniel Bates
Comment 35 2009-11-04 15:59:48 PST
Comment on attachment 42297 [details] Layout test text/plain fix Clearing flags on attachment: 42297 Committed r50532: <http://trac.webkit.org/changeset/50532>
Daniel Bates
Comment 36 2009-11-04 15:59:55 PST
All reviewed patches have been landed. Closing bug.
Note You need to log in before you can comment on or make changes to this bug.