[prev in list] [next in list] [prev in thread] [next in thread]
List: whatwg
Subject: [whatwg] DND: spec not matching implementations
From: "Anne van Kesteren" <annevk () opera ! com>
Date: 2012-02-17 9:31:55
Message-ID: op.v9tgrhcj64w2qv () annevk-macbookpro ! local
[Download RAW message or body]
The feedback that follows is based on our implementation experience with=
=
drag & drop. The people that ought to be credited for the report below a=
re =
Pawe=C5=82 Stanek, Giorgi Chavchanidze, Wilhelm Joys Andersen, and anony=
mous; =
i.e. not me.
During our initial implementation of HTML5 drag and drop, we encountered=
=
some situations where the current specification either does not reflect =
=
useful behaviour of existing implementations, or is not yet complete =
enough to base the implementation on it (eg. synthetic events). There ar=
e =
also some limitations of the specification for which we feel a change is=
=
best. The most minor cases are listed in this message. Other messages wi=
ll =
follow with the details of more extensive changes.
* Firefox, Chrome and Opera only allow dragend to delete ranges during a=
=
'move' if the range exists within an editable element. The spec needs to=
=
change to reflect this - currently it expects this anywhere within a =
non-editable document.
* Firefox, Chrome and Opera allow dropping in all text based inputs (tex=
t =
search tel url email password number) not just text.
* Firefox, Chrome and Opera all make .effectAllowed writeable only when =
=
the data store is in read/write mode, so that only the source node has t=
he =
ability to set the effectAllowed.
* Opera and Firefox have chosen to implement modifiers at the point of =
dropEffect initialization during dragenter and dragover: initially set =
dropEffect to the default value specified in the spec table, then if the=
=
platform requests something else with a modifier, set the dropEffect to =
=
that modified value. Therefore those events see the modified dropEffect =
=
(which seems to be the intention of the spec), and can also override it =
by =
writing to the dropEffect property.
* When dragging selections, Firefox, Chrome and Opera populate text/html=
=
with the minimal markup intersected by the selection (the smallest =
possible markup that contains all of the selection, without any parent =
elements that contain both ends of the selection).
* Opera populates text/html when dragging an element. This means that it=
=
is possible to drag HTML into another application without needing =
JavaScript.
* Opera recognises dropzone on parent elements of the immediate user =
selection - the spec currently requires it to be the specific element, =
which means that child elements of the dropzone are not within the =
dropzone. This implementation is as simple as replacing this line in the=
=
specification:
"If the immediate user selection is an element with a dropzone attribute=
=
that matches the drag data store -> Set the current target element to th=
e =
immediate user selection anyway."
With this line:
"If the immediate user selection is an element with a dropzone attribute=
=
that matches the drag data store, or if the immediate user selection has=
=
an ancestor element with a dropzone attribute that matches the drag data=
=
store -> Set the current target element to the immediate user selection =
=
anyway."
* When there is no body, Opera uses the root node as the fallback target=
=
(when the immediate user selection does not cancel dragenter). If there =
is =
no root node, Opera uses null. This allows documents with no body to =
function correctly, where the spec reverts to using the document object.=
=
This means that when subsequently moving the drag over another =
non-cancelling element, it will once again fire dragenter at the documen=
t. =
And again when the mouse drags over another non-cancelling element, etc.=
=
etc.
Our proposal is to replace this:
"If the current target element is the body element"
with this:
If the current target element is the body element, or if there is no bod=
y =
element and the current target is the html element
And then replace this:
"Otherwise; Fire a DND event named dragenter at the body element, if the=
re =
is one, or at the Document object, if not. Then, and set the current =
target element to the body element, regardless of whether that event was=
=
canceled or not."
with this:
If the body element or html element exist; Fire a DND event named =
dragenter at the first of the following objects that exists, and set the=
=
current target element to that object regardless of whether that event w=
as =
canceled or not:
* The body element
* The html element [interpreted as the root node in non-html documents]
Otherwise; set the current target element to null
(Note that it is possible for a document containing an immediate user =
selection to have neither a body element nor a root element, if the =
dragenter event handler for the immediate user selection deletes the roo=
t =
element.)
-- =
Anne van Kesteren
http://annevankesteren.nl/
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic