[whatwg] Proposal for separating script downloads and

>> 3. My (and Nicholas's previous) proposal: Script elements are fetched 
>> when
>> inserted into the DOM[1].  An event is dispatched when the script has 
>> been
>> fetched, eg. "onfetch" or "onpreload"[2].  A "preload" attribute is 
>> added;
>> when true, the script will not be executed when the fetch completes; call
>> script.execute() to run the script.

> I strongly prefer this proposal to either of the other two, for what
> it's worth.  Is the concern that this doesn't degrade as nicely in UAs
> that don't support preload or something?  If not, what _are_ the
> arguments against this proposal?  Links to existing discussion are fine
> if this ground was already covered.


There are several concerns which, at various times, have been brought up 
about this variation of the proposal. As Glenn stated, this was Nicholas' 
original proposal, but given those questions and concerns, he has adjusted 
his proposal several times. The adjustments he's made to his proposal have 
generally been to converge it in the direction of my proposal, at least to 
some extent.

To briefly restate some of the issues with the original proposal (as 
compared to the alternatives):

1. Not only does IE already have the functionality of my proposal 
implemented, but the spec already has this exact wording in it. The spec 
already suggests that browsers could/should do exactly this preloading, when 
the src is set but the element is not yet appended to the DOM. Moreover, my 
proposal draws on existing precedent for `readyState` and 
`onreadystatechange`, and the way that Image preloading works.

Put plainly, the original proposal is much further from:  a) existing spec 
wording; AND b) existing browser implementation; AND c) existing precedent.

The goal (from my perspective) is to come up with the simplest proposal that 
serves the use-cases. Simplest being defined in this particular situation as 
the least amount of change to the spec, AND the least amount of change to 
the browser that has by far the slowest release cycle (IE).


2. The execute() API concept had several other questions that arose, such 
as:
  a) is execute() sync or async? what does this imply about if the script 
being executed itself calls execute() on other script elements, and so on?

  b) what does it imply about whether/when the event handler(s) would be 
fired? If it's synchronous, are the event handlers also synchronous or are 
they async? Are they fired before or after the execute() actually does the 
executing of the script element?

  c) does this run the risk of going afoul of the same issue that tripped of 
Firefox with their synchronous execution of inline script elements (that 
jQuery used for global-eval)?

  d) what are the semantics of if you call execute() on a script element 
before it has finished preloading, or for a script that wasn't preloaded at 
all? Does this simply turn off preloading execution-deferral flag? Or does 
it throw an error? Would those errors be synchronous (like an actual 
exception that aborts processing) or simply bubble to the script.onerror 
handler?

  e) what happens if a script's .text is modified before execute() is 
called? What if a script element is cloned before execute() is called? What 
if it's cloned after execute() is called?


3. If in the future we want to also support preloading of other resources, 
like stylesheets for instance, which of the proposals offers the best 
precedent for that? For instance, would it make sense to add a .execute() to 
the <link> element for applying a stylesheet that had been preloaded? Or 
would the preloading style from my proposal (or even Nicholas' current 
proposal variation) fit more cleanly?

In exploring these issues and questions (and others), some contradictory 
arguments were brought up. In the end, I think Nicholas found it easier to 
simplify his proposal rather than keep going down this rabbit hole. For the 
most part, my proposal doesn't seem to suffer the same complexity of most of 
these questions. And to the extent that some of the questions are 
applicable, those questions already exist and browsers already have answers 
for the normal dynamic script append semantics.

Again, I think the spirit we all share is to find the simplest proposal that 
gets the job done, and introducing a new .execute() concept raised more 
questions than it purported to solve.

BTW, I don't necessarily claim that above to be an exhaustive distillation 
of this entire thread as it related to Nicholas' original proposal, and the 
revival of it that Glenn has been pushing for -- I'm sure I missed a few 
points in my memory recall. But I do think it's at least illustrative of how 
the conversation got a lot more complicated as we started exploring how 
.execute() would actually work.


> I sympathize with that, since they're aiming to improve the likelihood of
> being implemented--but the precedent it's drawing on seems like a bad one,
> which should be treated as a compatibility hack rather than a precedent 
> for
> new APIs.

I strongly disagree with this characterization, based solely on the fact 
that the wording of the current spec already says to do exactly as I'm 
proposing. That's not a "compatibility hack", that's further standardizing 
the wisdom that the spec writers already thought through and codified.


> I'd like to know what Opera and Webkit folks think, in terms of
> implementation difficulty.

FWIW, someone from Opera did, earlier in this thread, at least weigh in to 
suggest that they would implement the "readyState preloading" (aka, my 
proposal) completely (if they did so at all), to allay fears that Opera 
might break the assumption of the feature-detection that my proposal relies 
on.

To be clear, they didn't say they'd implement this proposal. But they did 
agree that preserving the feature-detect would be prudent, meaning they 
wouldn't change their implementation of `readyState` unless they were 
bringing it fully in line with IE's behavior (and thus my proposal).



--Kyle

Received on Wednesday, 23 February 2011 06:14:18 UTC