html5/spec Overview.html,1.1840,1.1841

Update of /sources/public/html5/spec
In directory hutz:/tmp/cvs-serv4948

Modified Files:
	Overview.html 
Log Message:
Mute hashchanged until after the load event has fired, to avoid race conditions. Make pushState() objects survive a reload. (whatwg r2671)

Index: Overview.html
===================================================================
RCS file: /sources/public/html5/spec/Overview.html,v
retrieving revision 1.1840
retrieving revision 1.1841
diff -u -d -r1.1840 -r1.1841
--- Overview.html	15 Jan 2009 00:58:19 -0000	1.1840
+++ Overview.html	15 Jan 2009 22:12:00 -0000	1.1841
@@ -5107,7 +5107,8 @@
   changed to "complete" when the parser reaches the end of its input
   stream.</p><!-- XXX this should be in its own section, and we
   should define 'delay the load event' for XML parsing so that we can
-  have the "interactive" state here too. --><p>The <dfn id=dom-document-readystate title=dom-document-readyState><code>readyState</code></dfn> DOM
+  have the "interactive" state here too. also, XML parser will need to
+  fire the /pending state object/, and the 'load' event, and... --><p>The <dfn id=dom-document-readystate title=dom-document-readyState><code>readyState</code></dfn> DOM
   attribute must, on getting, return the <a href=#current-document-readiness>current document
   readiness</a>.<h4 id=dom-tree-accessors><span class=secno>3.2.4 </span><dfn>DOM tree accessors</dfn></h4><p><dfn id=the-html-element-0>The <code>html</code> element</dfn> of a document is the
   document's root element, if there is one and it's an
@@ -30837,13 +30838,7 @@
   interface state.<p>Pages can <a href=#dom-history-pushstate title=dom-history-pushState>add</a> <a href=#state-object title="state object">state objects</a> between their entry in the
   session history and the next ("forward") entry. These are then <a href=#event-popstate title=event-popstate>returned to the script</a> when the user
   (or script) goes back in the history, thus enabling authors to use
-  the "navigation" metaphor even in one-page applications.<p>Every <code>Document</code> in the session history is defined to
-  have a <dfn id=last-activated-entry>last activated entry</dfn>, which is the <a href=#state-object>state
-  object</a> entry associated with that <code>Document</code> which
-  was most recently activated. Initially, the <a href=#last-activated-entry>last activated
-  entry</a> of a <code>Document</code> must be the first entry for
-  the <code>Document</code>, representing the fact that no <a href=#state-object>state
-  object</a> entry has yet been activated.<p>At any point, one of the entries in the session history is the
+  the "navigation" metaphor even in one-page applications.<p>At any point, one of the entries in the session history is the
   <dfn id=current-entry>current entry</dfn>. This is the entry representing the
   <a href=#active-document>active document</a> of the <a href=#browsing-context>browsing
   context</a>. The <a href=#current-entry>current entry</a> is usually an entry
@@ -30868,16 +30863,7 @@
   entries that shared the same <code>Document</code> object with it
   must share the new object as well.<p>When state object entries are added, a URL can be provided. This
   URL is used to replace the state object entry if the
-  <code>Document</code> is evicted.<p>When a user agent discards the <code>Document</code> object from
-  an entry in the session history, it must also discard all the
-  entries that share that <code>Document</code> but do not have an
-  associated URL (i.e. entries that only have a <a href=#state-object>state
-  object</a>). Entries that shared that <code>Document</code>
-  object but had a state object and have a different URL must then
-  have their <em>state objects</em> removed. Removed entries are not
-  recreated if the user or script navigates back to the page. If there
-  are no state object entries for that <code>Document</code> object
-  then no entries are removed.<h4 id=the-history-interface><span class=secno>5.8.2 </span>The <code><a href=#history-1>History</a></code> interface</h4><pre class=idl>interface <dfn id=history-1>History</dfn> {
+  <code>Document</code> is evicted.<h4 id=the-history-interface><span class=secno>5.8.2 </span>The <code><a href=#history-1>History</a></code> interface</h4><pre class=idl>interface <dfn id=history-1>History</dfn> {
   readonly attribute long <a href=#dom-history-length title=dom-history-length>length</a>;
   void <a href=#dom-history-go title=dom-history-go>go</a>([Optional] in long delta);
   void <a href=#dom-history-back title=dom-history-back>back</a>();
@@ -30908,7 +30894,12 @@
    <tr><td><dfn id=dom-history-forward title=dom-history-forward><code>forward()</code></dfn></td>
     <td>Must do the same as <code title=dom-history-go><a href=#dom-history-go>go(1)</a></code></td>
    </table><p>The <dfn id=dom-history-pushstate title=dom-history-pushState><code>pushState(<var title="">data</var>, <var title="">title</var>, <var title="">url</var>)</code></dfn> method adds a state object to the
-  history.<p>When this method is invoked, the user agent must run the following steps:<ol><li>
+  history.<p>When this method is invoked, the user agent must run the following steps:<ol><li><p>Let <var title="">clone data</var> be a <a href=#structured-clone>structured
+   clone</a> of the specified <var title="">data</var>. If this
+   throws an exception, then rethrow that exception and abort these
+   steps.</li>
+
+   <li>
 
     <p>If a third argument is specified, run these substeps:</p>
 
@@ -30939,12 +30930,13 @@
    then no entries are removed.</li>
 
    <li><p>Add a state object entry to the session history, after the
-   <a href=#current-entry>current entry</a>, with the specified <var title="">data</var> as the state object, the given <var title="">title</var> as the title, and, if the third argument is
-   present, the <a href=#absolute-url>absolute URL</a> that was found in the first
-   step as the URL of the entry.</li>
+   <a href=#current-entry>current entry</a>, with <var title="">cloned data</var> as
+   the state object, the given <var title="">title</var> as the title,
+   and, if the third argument is present, the <a href=#absolute-url>absolute
+   URL</a> that was found earlier in this algorithm as the
+   <a href=#url>URL</a> of the entry.</li>
 
-   <li><p>Set this new entry as being the <a href=#last-activated-entry>last activated
-   entry</a> for the <code>Document</code>.</li>
+   <!-- XXX update the current address as per bug 6437 -->
 
    <li><p>Update the <a href=#current-entry>current entry</a> to be the this newly
    added entry.</li>
@@ -30966,20 +30958,38 @@
   history.<h4 id=activating-state-object-entries><span class=secno>5.8.3 </span><dfn title="activate the state object">Activating state object entries</dfn></h4><p>When an entry in the session history is activated (which happens
   during <a href=#traverse-the-history title="traverse the history">session traversal</a>,
   as described above), the user agent must run the following
-  steps:<ol><li><p>First, the user agent must set this new entry as being the
-   <a href=#last-activated-entry>last activated entry</a> for the <code>Document</code> to
-   which the entry belongs.</li>
+  steps:<ol><!-- only called for the first entry of a Document set and for
+  state object entries, not for frag id change entries --><li><p>If the entry is a <a href=#state-object>state object</a> entry, let <var title="">state</var> be a <a href=#structured-clone>structured clone</a> of that
+   state object. Otherwise, let <var title="">state</var> be
+   null.</li>
 
-   <li><p>If the entry is a <a href=#state-object>state object</a> entry, let <var title="">state</var> be that state object. Otherwise, the entry is
-   the first entry for the <code>Document</code>; let <var title="">state</var> be null.</li>
+   <li>
 
-   <li><p>The user agent must then fire a <dfn id=event-popstate title=event-popstate><code>popstate</code></dfn> event in no
-   namespace on <a href=#the-body-element-1>the body element</a> using the
-   <code><a href=#popstateevent>PopStateEvent</a></code> interface, with the <code title=dom-PopStateEvent-state><a href=#dom-popstateevent-state>state</a></code> attribute set to the
-   value of <var title="">state</var>. This event bubbles but is not
-   cancelable and has no default action.</li>
+    <p>Run the appropriate according to the conditions described:</p>
 
-  </ol><!-- XXX onpopstate should be defined somewhere --><pre class=idl>interface <dfn id=popstateevent>PopStateEvent</dfn> : Event {
+    <dl class=switch><dt>If the <a href=#current-document-readiness>current document readiness</a> is set to the
+     string "complete"</dt>
+
+     <dd><p><a href=#queue-a-task>Queue a task</a> to fire a <dfn id=event-popstate title=event-popstate><code>popstate</code></dfn> event in no
+     namespace on <a href=#the-body-element-1>the body element</a> using the
+     <code><a href=#popstateevent>PopStateEvent</a></code> interface, with the <code title=dom-PopStateEvent-state><a href=#dom-popstateevent-state>state</a></code> attribute set to the
+     value of <var title="">state</var>. This event must bubble but
+     not be cancelable and has no default action. The <a href=#task-source>task
+     source</a> for this task is the <a href=#dom-manipulation-task-source>DOM manipulation task
+     source</a>.</dd>
+
+     <dt>Otherwise</dt>
+
+     <dd><p>Let the <code>Document</code>'s <dfn id=pending-state-object>pending state
+     object</dfn> be <var title="">state</var>. (If there was already
+     a <a href=#pending-state-object>pending state object</a>, the previous one is
+     discarded.)</p>
+
+     <p class=note>The event will then be fired just after the <code title=event-load><a href=#event-load>load</a></code> event.</dd>
+
+    </dl></li>
+
+  </ol><p>The <a href=#pending-state-object>pending state object</a> must be initially null.</p><!-- XXX onpopstate should be defined somewhere --><pre class=idl>interface <dfn id=popstateevent>PopStateEvent</dfn> : Event {
   readonly attribute any <a href=#dom-popstateevent-state title=dom-PopStateEvent-state>state</a>;
   void <a href=#dom-popstateevent-initpopstateevent title=dom-PopStateEvent-initPopStateEvent>initPopStateEvent</a>(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in any stateArg);
   void <a href=#dom-popstateevent-initpopstateeventns title=dom-PopStateEvent-initPopStateEventNS>initPopStateEventNS</a>(in DOMString namespaceURIArg, in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in any stateArg);
@@ -31688,17 +31698,6 @@
 
     </ol></li>
 
-   <li><p>If there are any entries with state objects between the
-   <a href=#last-activated-entry>last activated entry</a> for the <code>Document</code> of
-   the <i>specified entry</i> and the <i>specified entry</i> itself
-   (not inclusive), then the user agent must iterate through every
-   entry between that <a href=#last-activated-entry>last activated entry</a> and the
-   <i>specified entry</i>, starting with the entry closest to the
-   <a href=#current-entry>current entry</a>, and ending with the one closest to the
-   <i>specified entry</i>. For each entry, if the entry is a state
-   object, the user agent must <a href=#activating-state-object-entries>activate the state
-   object</a>.</li>
-
    <li><p>If the <i>specified entry</i> is a state object or the
    first entry for a <code>Document</code>, the user agent must <a href=#activating-state-object-entries title="activate the state object">activate that
    entry</a>.</li>
@@ -31706,8 +31705,10 @@
    <li><p>If the <i>specified entry</i> has a URL that differs from
    the <a href=#current-entry>current entry</a>'s only by its fragment identifier,
    and the two share the same <code>Document</code> object, then
-   <a href=#fire-a-simple-event>fire a simple event</a> with the name <code title=event-hashchange>hashchange</code> at <a href=#the-body-element-1>the
-   <code>body</code> element</a>, and, if the new URL has a
+   first, if the <code>Document</code>'s <a href=#current-document-readiness>current document
+   readiness</a> is the string "complete", then <a href=#fire-a-simple-event>fire a simple
+   event</a> with the name <code title=event-hashchange>hashchange</code> at <a href=#the-body-element-1>the
+   <code>body</code> element</a>; and second, if the new URL has a
    fragment identifier, <a href=#scroll-to-the-fragment-identifier>scroll to the fragment
    identifier</a>.</li>
 
@@ -42709,10 +42710,24 @@
   not yet been executed.<p>The user agent must then <a href=#fire-a-simple-event>fire a simple event</a> called
   <code title=event-DOMContentLoaded>DOMContentLoaded</code> at the
   <code>Document</code>.<p>Once everything that <dfn id=delay-the-load-event title="delay the load event">delays the
-  load event</dfn> has completed, the user agent must set the
-  <a href=#current-document-readiness>current document readiness</a> to "complete", and then
-  <a href=#fire-a-load-event title="fire a load event">fire a <code title=event-load>load</code> event</a> at <a href=#the-body-element-1>the
-  <code>body</code> element</a>.</p><!-- XXX make sure things "delay the load event" --><p class=XXX>delaying the load event for things like image
+  load event</dfn> has completed, the user agent must run the
+  following steps:<ol><li><a href=#queue-a-task>Queue a task</a> to set the <a href=#current-document-readiness>current document
+   readiness</a> to "complete".</li>
+
+   <li><a href=#queue-a-task>Queue a task</a> to <a href=#fire-a-load-event title="fire a load
+   event">fire a <code title=event-load>load</code> event</a> at
+   <a href=#the-body-element-1>the <code>body</code> element</a>.
+
+   <li>If the <code>Document</code> has a <a href=#pending-state-object>pending state
+   object</a>, then <a href=#queue-a-task>queue a task</a> to fire a <code title=event-popstate><a href=#event-popstate>popstate</a></code> event in no namespace on
+   <a href=#the-body-element-1>the body element</a> using the <code><a href=#popstateevent>PopStateEvent</a></code>
+   interface, with the <code title=dom-PopStateEvent-state><a href=#dom-popstateevent-state>state</a></code> attribute set to the
+   current value of the <a href=#pending-state-object>pending state object</a>. This event
+   must bubble but not be cancelable and has no default
+   action.</li>
+
+  </ol><p>The <a href=#task-source>task source</a> for these tasks is the <a href=#dom-manipulation-task-source>DOM
+  manipulation task source</a>.</p><!-- XXX make sure things "delay the load event" --><p class=XXX>delaying the load event for things like image
   loads allows for intranet port scans (even without
   javascript!). Should we really encode that into the spec?</p><!--XXX need to handle
 http://lxr.mozilla.org/mozilla/source/parser/htmlparser/src/CNavDTD.cpp#2354

Received on Thursday, 15 January 2009 22:12:14 UTC