Revision 631023 of Optimizing your pages for speculative parsing

  • Revision slug: Web/HTML/Optimizing_Your_Pages_for_Speculative_Parsing
  • Revision title: Optimizing your pages for speculative parsing
  • Revision id: 631023
  • Created:
  • Creator: teoli
  • Is current revision? بله
  • توضیح HTML/Optimizing_Your_Pages_for_Speculative_Parsing Web/HTML/Optimizing_Your_Pages_for_Speculative_Parsing

Revision Content

Traditionally in browsers the HTML parser has run on the main thread and has blocked after a </script> tag until the script has been retrieved from the network and executed. The HTML parser in Firefox 4 and later supports speculative parsing off the main thread. It parses ahead while scripts are being downloaded and executed. As in Firefox 3.5 and 3.6, the HTML parser starts speculative loads for scripts, style sheets and images it finds ahead in the stream. However, in Firefox 4 and later the HTML parser also runs the HTML tree construction algorithm speculatively. The upside is that when a speculation succeeds, there's no need to reparse the part of the incoming file that was already scanned for scripts, style sheets and images. The downside is that there's more work lost when the speculation fails.

This document helps you avoid the kind of things that make speculation fail and slow down the loading of your page.

Making speculative loads succeed

There's only one rule for making speculative loads of linked scripts, style sheets and images succeed:

  • If you use a <base> element to override the base URI of your page, put the element in the non-scripted part of the document. Don't add it via document.write() or document.createElement().

Avoiding losing tree builder output

Speculative tree building fails when document.write() changes the tree builder state such that the speculative state after the </script> tag no longer holds when all the content inserted by document.write() has been parsed. However, only unusual uses of document.write() cause trouble. Here are the things to avoid:

  • Don't write unbalanced trees. <script>document.write("<div>");</script> is bad. <script>document.write("<div></div>");</script> is OK.
  • Don't write an unfinished token. <script>document.write("<div></div");</script> is bad.
  • Don't finish your writing with a carriage return. <script>document.write("Hello World!\r");</script> is bad. <script>document.write("Hello World!\n");</script> is OK.
  • Note that writing balanced tags may cause other tags to be inferred in a way that makes the write unbalanced. E.g. <script>document.write("<div></div>");</script> inside the head element will be interpreted as <script>document.write("</head><body><div></div>");</script> which is unbalanced.
  • Don't let the semicolon of a named character reference be the last thing that is written. Due to a bug in Firefox 4 though 10 (fixed in Firefox 11), <script>document.write("foo&nbsp;");</script> causes a speculation failure. However, <script>document.write("&nbsp;foo");</script> is OK.
  • Don't format part of a table. <table><script>document.write("<tr><td>Hello World!</td></tr>");</script></table> is bad. However, <script>document.write("<table><tr><td>Hello World!</td></tr></table>");</script> is OK.
  • TODO: document.write inside other formatting elements.

Revision Source

<p>Traditionally in browsers the HTML parser has run on the main thread and has blocked after a <code>&lt;/script&gt;</code> tag until the script has been retrieved from the network and executed. The HTML parser in Firefox 4 and later supports speculative parsing off the main thread. It parses ahead while scripts are being downloaded and executed. As in Firefox 3.5 and 3.6, the HTML parser starts speculative loads for scripts, style sheets and images it finds ahead in the stream. However, in Firefox 4 and later the HTML parser also runs the HTML tree construction algorithm speculatively. The upside is that when a speculation succeeds, there's no need to reparse the part of the incoming file that was already scanned for scripts, style sheets and images. The downside is that there's more work lost when the speculation fails.</p>
<p>This document helps you avoid the kind of things that make speculation fail and slow down the loading of your page.</p>
<h2 id="Making_speculative_loads_succeed">Making speculative loads succeed</h2>
<p>There's only one rule for making speculative loads of linked scripts, style sheets and images succeed:</p>
<ul> <li>If you use a <code>&lt;base&gt;</code> element to override the base URI of your page, put the element in the non-scripted part of the document. Don't add it via <code>document.write()</code> or <code>document.createElement()</code>.</li>
</ul>
<h2 id="Avoiding_losing_tree_builder_output">Avoiding losing tree builder output</h2>
<p>Speculative tree building fails when <code>document.write()</code> changes the tree builder state such that the speculative state after the <code>&lt;/script&gt;</code> tag no longer holds when all the content inserted by <code>document.write()</code> has been parsed. However, only unusual uses of <code>document.write()</code> cause trouble. Here are the things to avoid:</p>
<ul> <li>Don't write unbalanced trees. <code>&lt;script&gt;document.write("&lt;div&gt;");&lt;/script&gt;</code> is bad. <code>&lt;script&gt;document.write("&lt;div&gt;&lt;/div&gt;");&lt;/script&gt;</code> is OK.</li> <li>Don't write an unfinished token. <code>&lt;script&gt;document.write("&lt;div&gt;&lt;/div");&lt;/script&gt;</code> is bad.</li> <li>Don't finish your writing with a carriage return. <code>&lt;script&gt;document.write("Hello World!\r");&lt;/script&gt;</code> is bad. <code>&lt;script&gt;document.write("Hello World!\n");&lt;/script&gt;</code> is OK.</li> <li>Note that writing balanced tags may cause other tags to be inferred in a way that makes the write unbalanced. E.g. <code>&lt;script&gt;document.write("&lt;div&gt;&lt;/div&gt;");&lt;/script&gt;</code> inside the <code>head</code> element will be interpreted as <code>&lt;script&gt;document.write("&lt;/head&gt;&lt;body&gt;&lt;div&gt;&lt;/div&gt;");&lt;/script&gt;</code> which is unbalanced.</li> <li>Don't let the semicolon of a named character reference be the last thing that is written. Due to a <a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=535530" title="https://bugzilla.mozilla.org/show_bug.cgi?id=535530">bug</a> in Firefox 4 though 10 (fixed in Firefox 11), <code>&lt;script&gt;document.write("foo&amp;nbsp;");&lt;/script&gt;</code> causes a speculation failure. However, <code>&lt;script&gt;document.write("&amp;nbsp;foo");&lt;/script&gt;</code> is OK.</li> <li>Don't format part of a table. <code>&lt;table&gt;&lt;script&gt;document.write("&lt;tr&gt;&lt;td&gt;Hello World!&lt;/td&gt;&lt;/tr&gt;");&lt;/script&gt;&lt;/table&gt;</code> is bad. However, <code>&lt;script&gt;document.write("</code><code>&lt;table&gt;</code><code>&lt;tr&gt;&lt;td&gt;Hello World!&lt;/td&gt;&lt;/tr&gt;</code><code>&lt;/table&gt;</code><code>");&lt;/script&gt;</code> is OK.</li> <li>TODO: document.write inside other formatting elements.</li>
</ul>
Revert to this revision