This week in HTML 5 – Episode 16
Welcome back to "This Week in HTML 5," where I'll try to summarize the major activity in the ongoing standards process in the WHATWG and W3C HTML Working Group.
The big news this week is r2529, which makes so many changes that I had to ask Ian to explain it to me. This is what he said:
Someone asked for
onbeforeunload
, so I started fixing it. Then I found that there was some rot in the drywall. So I took down the drywall. Then I found a rat infestation. So I killed all the rats. Then I found that the reason for the rot was a slow leak in the plumbing. So I tried fixing the plumbing, but it turned out the whole building used lead pipes. So I had to redo all the plumbing. But then I found that the town's water system wasn't quite compatible with modern plumbing techniques, and I had to dig up the entire town. And that's basically it.
"Amusing, in a quiet way," said Eeyore, "but not really helpful."
Basically, the way that scripts are defined has changed dramatically. Not in an terribly incompatible way, just a clearer definition that paves the way for better specification of certain properties of script
(and noscript
). Let's start with the new definition of a script:
A script has:
- A script execution environment
The characteristics of the script execution environment depend on the language, and are not defined by this specification.
In JavaScript, the script execution environment consists of the interpreter, the stack of execution contexts, the global code and function code and the Function objects resulting, and so forth.
- A list of code entry-points
Each code entry-point represents a block of executable code that the script exposes to other scripts and to the user agent.
Each Function object in a JavaScript script execution environment has a corresponding code entry-point, for instance.
The main program code of the script, if any, is the initial code entry-point. Typically, the code corresponding to this entry-point is executed immediately after the script is parsed.
In JavaScript, this corresponds to the execution context of the global code.
- A relationship with the script's global object
An object that provides the APIs that the code can use.
This is typically a
Window
object. In JavaScript, this corresponds to the global object.When a script's global object is an empty object, it can't do anything that interacts with the environment.
- A relationship with the script's browsing context
A browsing context that is assigned responsibility for actions taken by the script.
When a script creates and navigates a new top-level browsing context, the
opener
attribute of the new browsing context'sWindow
object will be set to the script's browsing context'sWindow
object.- A character encoding
A character encoding, set when the script is created, used to encode URLs. If the character encoding is set from another source, e.g. a document's character encoding, then the script's character encoding must follow the source, so that if the source's changes, so does the script's.
- A base URL
A URL, set when the script is created, used to resolve relative URLs. If the base URL is set from another source, e.g. a document base URL, then the script's base URL must follow the source, so that if the source's changes, so does the script's.
- Membership in a script group
A group of one or more scripts that are loaded in the same context, which are always disabled as a group. Scripts in a script group all have the same global object and browsing context.
A script group can be frozen. When a script group is frozen, any code defined in that script group will throw an exception when invoked. A frozen script group can be unfrozen, allowing scripts in that script group to run normally again.
The most interesting part of this new definition is the script group, a new concept which now governs all scripts. When a Document
is created, it gets a fresh script group, which contains all the scripts that are defined (or are later created somehow) in the document. When the user navigates away from the document, the entire script group is frozen, and browsers should not execute those scripts anymore. This sounds like an obvious statement if you think of documents as individual browser windows (or tabs), but consider the case of a document with multiple frames, or one with an embedded iframe
. Suppose that the user clicks some link within the iframe that only navigates to a new URL within the iframe (i.e. the parent document stays the same). The parent document may have some reference to functions defined in the old iframe. Should it still be able to call these functions? IE says no; other browsers say yes. HTML 5 now says no, because when the iframe navigates to a new URL, the old iframes script group is frozen -- even if there are active references to those scripts (say, from the parent document), browsers shouldn't allow the page to execute them.
The main benefit of this new concept of script groups is that it removes a number of complications faced by the non-IE browsers. For example, it prevents the problem of scripts suddenly discovering that their global object is no longer the object that they think of as the Window
object. Script groups are also frozen when calling document.open(). Freezing script groups also defines the point at which timers and other callbacks are reset, which is something that previous versions of HTML had never defined.
And after all of this ripping up and redefining, HTML 5 now defines the onbeforeunload
event, which is already supported by major browsers.
Other interesting tidbits this week:
- r2533 adds support for passing structured data between documents with
postMessage()
. [structured data discussion] - r2536 defines the
NameCreator
,NameDeleter
,NameGetter
,NameSetter
,IndexGetter
, andIndexSetter
anonymous methods, which are used by browsers internally to manage lists of named or indexed properties (e.g.form.elements
, per-element customdata
attributes, or the pixel data of acanvas
). - r2537 explains that you can not click something while you're already in the process of clicking it. (Technically speaking, it makes the
click()
method non-reentrant.) [nestedclick()
discussion] - r2538 clarifies that non-interactive elements that are not usually focusable, but that do currently have focus (via the
tabindex
attribute), should simulateonclick
events when the user presses ENTER. This may seem like a minor point, but it is important for building keyboard-accessible web applications. [onclick discussion] - r2539 notes that buttons (and their values) are not submitted with other form data unless they were the button that submitted the form. [button submission discussion]
- Silvia Pfeiffer posts thoughts on video accessibility and links to this collection of video accessibility requirements on the Mozilla wiki.
- Nine years in the making, the second major edition of the Web Content Accessibility Guidelines is now officially a W3C Recommendation. The guidelines are supplemented by a comprehensive techniques document, for example Using
alt
attributes onimg
elements. HTML 5 also includes a section on using thealt
attribute, but in general you should defer to WCAG 2.0 because it was written by experts.
Tune in next week for another exciting episode of "This Week in HTML 5."
[…] Pilgrim has a new episode of This Week in HTML 5 that covers the onbeforeunload event. To get there, a lot happened, which Hixie explained: Someone […]
[…] one over control orders, it seems that this is as nothing to the broader deterioration. As someone said in a quite different context, Someone asked for onbeforeunload, so I started fixing it. Then I found that there was some rot in […]