[whatwg] Avoiding synchronous iframe load

Ian Hickson ian at hixie.ch
Tue Jan 21 11:26:48 PST 2014

On Sat, 18 Jan 2014, Ryosuke Niwa wrote:
> Am I correct in assuming that load event never fires for this 
> about:blank page since it’s “both ready for post-load tasks and 
> completely loaded immediately"?
> If so, that doesn’t match the existing behaviors of major browser 
> engines.  For example, Firefox logs 1 then 2 in the following example 
> whereas Chrome and Safari log 2 and then 1:
> var iframe = document.createElement('iframe');
> iframe.onload = function () { console.log('2'); }
> document.body.appendChild(iframe);
> console.log('1’);

I encourage you to read the spec rather than rely on my interpretation of 
the spec, because if I made a mistake when writing the spec, I'm likely to 
make the same mistake when reading it, and thus it'll be missed, and doing 
what I describe in person will result in behaviour that is not 
interoperable with doing what I described in the spec.

But, with that caveat out of the way, here's what I think the spec says:

Creating the iframe does nothing interesting.
Setting the onload event listener does nothing interesting.
Appending the document triggers:

# When an iframe element is inserted into a document, the user agent must 
# create a nested browsing context, and then process the iframe attributes 
# for the "first time".
 -- http://www.whatwg.org/specs/web-apps/current-work/#the-iframe-element

This leads us to "Otherwise, if the element has no src attribute 
specified, and the user agent is processing the iframe's attributes for 
the "first time"":

# Queue a task to run the iframe load event steps.
 -- http://www.whatwg.org/specs/web-apps/current-work/#process-the-iframe-attributes

So a task is queued. At this point, script continues, and we log "1".

After the script ends, we go back to the event loop and run the 
aforementioned task; the only step that matters for the test above is:

# 4. Fire a simple event named load at the iframe element.
 -- http://www.whatwg.org/specs/web-apps/current-work/#iframe-load-event-steps

This, via the event model in the DOM spec, ends up calling the lambda, and 
thus we log "2".

Thus, the spec says that it should log "1", then log "2".

Note that things are way more involved if you have document.write()s going 
on, or a src="" attribute (even if it is set to "about:blank"), or any 
number of other wacked things that the Web platform allows.

As a side note -- the javascript: handling rewrite that was prophesied in 
my earlier message on this thread has since occurred. I haven't checked 
how it impacts the earlier question.

Ian Hickson               U+1047E                )\._.,--....,'``.    fL
http://ln.hixie.ch/       U+263A                /,   _.. \   _\  ;`._ ,.
Things that are impossible just take longer.   `._.-(,_..'--(,_..'`-.;.'

More information about the whatwg mailing list