- From: Ian Hickson <ian@hixie.ch>
- Date: Tue, 6 Oct 2009 00:38:40 +0000 (UTC)
- To: Doug Schepers <schepers@w3.org>
- Cc: "www-dom@w3.org" <www-dom@w3.org>
On Tue, 22 Sep 2009, Doug Schepers wrote: > Ian Hickson wrote (on 9/22/09 5:57 PM): > > > > Right now, the text in DOM Events for when events fire is woefully > > inadequate if we're to get full interop. > > You've made that claim before, and in response I've improved the > specificity of each event, detailed in many cases (not yet all) what the > values for each attribute are for each event type, enumerated the order > in which related events fire, and made other improvements. Let's look at 'load': # A user agent must dispatch this event when the DOM implementation # finishes loading the resource (such as the document) and any # dependent resources (such as images, style sheets, or # scripts). Dependent resources that fail to load must not prevent # this event from firing if the resource that loaded them is still # accessible via the DOM. If this event type is dispatched, # implementations are required to dispatch this event at least on the # Document node. This event differs from the DOMContentLoaded event in # that it is not dispatched until all external resources are loaded. Here are some questions that I do not believe the above adequately answers: * Which resources does the event fire for? Does it fire on a Document fetched using XMLHttpRequest? Does it fire for a favicon declared on a <link> element? Does it fire for a plugin loaded purely by type="" with no associated resource in <object>? * What element does the event fire at? Consider a <video> element with two <source> elements. When the second <source> element's URL is resolved and the video fetched, should the event fire on the <source> or the <video>? * Should the event fire synchronously or asynchronously? * Does a dynamically inserted <script> element inserted during the DOMContentLoaded event delay the 'load' event, or should the 'load' event only be delayed by resources that started loading before the document ended parsing? * If the user switches alternative style sheets while the document is loading, does the 'load' event get delayed by the loads of the alternative style sheets, only the persistent ones, or only the preferred set? * On <video> elements, should the 'load' event fire before or after networkState is set to NETWORK_LOADED? * If an <input> element with type=text has a src="" attribute, and the type is dynamically switched to "image" and back to "text" before the image has loaded, should the 'load' event fire on the <input> element once the image has loaded? If this occurs while the document is loading, should the document-wide 'load' event wait for the image? * When the 'load' event is fired at the Document, what nodes are expected to receive the event? (It actually has to be the Window object, weirdly.) * Should 'load' fire before or after the delayed 'popstate'? * Does 'load' fire before or after the <script> element's script? * Does 'load' fire before or after img.complete becomes true? * When an <iframe> contains a document, should the 'load' event be fired at the <iframe>, the inner Document/Window, or both? If both, in what order? * What should UIEvent.view be when there are multiple views? (Is 'load' really a UIEvent?) Next let's consider 'error'. The DOM3 Events spec says: # A user agent must dispatch this event when a resource failed to load, or # has been loaded but cannot be interpreted according to its semantics, # such as an invalid image, a script execution error, or non-well-formed # XML. Questions: * What resources exactly? Does this event fire for <img>? <iframe>? <object>? * What exactly is a failure to load or failure to interpret according to its semantics? Does an HTML parse error trigger 'error'? A syntax error in a scripted eval? A style sheet syntax error? An SVG conformance error? (I think all three of those are not errors, in practice.) * What does the event fire at? For example, for <video><source>, does it fire at <video>? <source>? both? * What should UIEvent.view be when there are multiple views? (Is 'error' really a UIEvent?) * When an <html manifest> fails to load, is the event fired at the <html> element? * Is the event fired asynchronously or synchronously? For example, say that you have a script that does: <script onerror="alert('A')"> var x = new Image(); x.onerror = function () { alert('1') }; x.src = 'data:,fail'; throw 'fail'; </script> ...what order do the events fire in? A then 1, or 1 then A? Or does only 1 or only A fire? Or neither? * When you have a script error, does the <body onerror=""> call get invoked as an event dispatch or a function call? Is that an 'error' event? Consider 'resize' or 'scroll': # A user agent must dispatch this event when a document view or an element # has been resized/scrolled. This event type is dispatched after the # resize/scroll has occurred. * Do these events fire synchronously, or are they queued up? * The text says that they fire at the end of the resize/scroll, but what is the end? (In particular, they seem to fire continuously in the UAs I tested.) Consider 'blur': # A user agent must dispatch this event when an event target loses focus. # The focus shall be taken from the element before the dispatch of this # event type. This event type is similar to focusout, but is dispatched # after focus is shifted, and does not bubble. * Does the event fire before or after the 'change' event fires when that is applicable? (e.g. <input type=text onchange onblur> -- which fires first when focus changes?) * Is it synchronous or asynchronous, if focus was changed programatically? Consider 'mousedown': # A user agent must dispatch this event when a pointing device button is # pressed over an element. * How do you know if you are over an element? (In particular, how does alpha transparency affect the determination? It is different in IE than Firefox, which is right?) * If you click a text field, and script cancels 'mousedown', does the text field get focused? Does 'click' fire? Does 'mouseup' fire? * If you cancel 'mousedown', can you still get a 'dragstart'? Personally I think the way to fix these problems is to change to a more explicit model whereby algorithms parallel what UAs will do, with the events fired from the algorithms, so that there is no ambiguity. For example, for mouse events, actually define a single algorithm that handles all mouse input, handling everything from managing changing coordinates to detecting drag starts to managing the down/click/up/down/click/dblclick/up sequencing, etc. Basically, implement the device input driver, in prose. This is more or less what HTML5 does with everything that fires events. > > For example, with 'submit', it didn't even say if the event was async > > or sync, > > Does this apply to all events? Please provide a pointer to the relevant > definitions and a couple of examples where you have provided adequate > detail, and I'll go from there. An example of an asynchronous event in HTML5 would be the 'load' and 'popstate' events fired after document load: http://www.whatwg.org/specs/web-apps/current-work/#delay-the-load-event The magic words here are "queue a task", which invokes a whole bunch of event loop stuff defined here: http://www.whatwg.org/specs/web-apps/current-work/#event-loops An example of a synchronous event in HTML5 would be the 'popstate' event fired during session history traversal: http://www.whatwg.org/specs/web-apps/current-work/#activating-state-object-entries However, note that this is effectively asynchronous if the algorithm itself is invoked from a task, as happens e.g. here: http://www.whatwg.org/specs/web-apps/current-work/#scroll-to-fragid (The algorithm there is queued, and in that algorithm's step 3, "Traverse the history" is synchronously invoked, and in that algorithm's step 9, "Activating state object entries" is synchronously invoked, and in that algorithm's step 2, first branch, the event is fired synchronously -- but since the whole thing is happening in a queued task, from the original script's point of view, it seems asynchronous.) HTH, -- Ian Hickson U+1047E )\._.,--....,'``. fL http://ln.hixie.ch/ U+263A /, _.. \ _\ ;`._ ,. Things that are impossible just take longer. `._.-(,_..'--(,_..'`-.;.'
Received on Tuesday, 6 October 2009 00:29:26 UTC