Import a fresh version of the full HTML5 spec for perf testing.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 12 Nov 2013 09:44:27 +0000 (09:44 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 12 Nov 2013 09:44:27 +0000 (09:44 +0000)
Rubber-stamped by Antti Koivisto.

* Parser/HTML5-8266-FullRender.html: Added.
* Parser/HTML5-8266-ParseOnly.html: Added.
* Parser/resources/html5-8266.html: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@159101 268f45cc-cd09-0410-ab3c-d52691b4dbfc

PerformanceTests/ChangeLog
PerformanceTests/Parser/HTML5-8266-FullRender.html [new file with mode: 0644]
PerformanceTests/Parser/HTML5-8266-ParseOnly.html [new file with mode: 0644]
PerformanceTests/Parser/resources/html5-8266.html [new file with mode: 0644]

index bcaa7ec..1629b97 100644 (file)
@@ -1,3 +1,13 @@
+2013-11-12  Andreas Kling  <akling@apple.com>
+
+        Import a fresh version of the full HTML5 spec for perf testing.
+
+        Rubber-stamped by Antti Koivisto.
+
+        * Parser/HTML5-8266-FullRender.html: Added.
+        * Parser/HTML5-8266-ParseOnly.html: Added.
+        * Parser/resources/html5-8266.html: Added.
+
 2013-11-09  Antti Koivisto  <antti@apple.com>
 
         Add subtest for word-break:break-all to Layout/line-layout-simple.html
diff --git a/PerformanceTests/Parser/HTML5-8266-FullRender.html b/PerformanceTests/Parser/HTML5-8266-FullRender.html
new file mode 100644 (file)
index 0000000..d9ad97e
--- /dev/null
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<body>
+<script src="../resources/runner.js"></script>
+<script>
+// Running from the onload callback just makes the UI nicer as it shows the logs before starting the test.
+window.onload = function() {
+    PerfTestRunner.measurePageLoadTime({path: "resources/html5-8266.html",
+    chunkSize: 750000 }); // 6.93mb / 750k = approx 10 chunks (thus 10 forced layouts/style resolves).
+}
+
+</script>
+</body>
diff --git a/PerformanceTests/Parser/HTML5-8266-ParseOnly.html b/PerformanceTests/Parser/HTML5-8266-ParseOnly.html
new file mode 100644 (file)
index 0000000..7d92616
--- /dev/null
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<body>
+<script src="../resources/runner.js"></script>
+<script>
+var spec = PerfTestRunner.loadFile("resources/html5-8266.html");
+
+PerfTestRunner.measureTime({run: function() {
+    var iframe = document.createElement("iframe");
+    iframe.style.display = "none";  // Prevent creation of the rendering tree, so we only test HTML parsing.
+    iframe.sandbox = '';  // Prevent external script loads which could cause write() to return before completing the parse.
+    document.body.appendChild(iframe);
+    iframe.contentDocument.open();
+    iframe.contentDocument.write(spec);
+    iframe.contentDocument.close();
+    document.body.removeChild(iframe);
+}});
+
+</script>
+</body>
diff --git a/PerformanceTests/Parser/resources/html5-8266.html b/PerformanceTests/Parser/resources/html5-8266.html
new file mode 100644 (file)
index 0000000..ac2513a
--- /dev/null
@@ -0,0 +1,102369 @@
+<!DOCTYPE html><html lang=en-US-x-hixie><title>HTML Standard</title><script>
+   var loadTimer = new Date();
+   var current_revision = "r" + "$Revision: 8266 $".substr(11);
+   current_revision = current_revision.substr(0, current_revision.length - 2);
+   var last_known_revision = current_revision;
+   function F( /* varargs... */) {
+     var fragment = document.createDocumentFragment();
+     for (var index = 0; index < arguments.length; index += 1) {
+       if (arguments[index] instanceof Array) {
+         fragment.appendChild(F.apply(this, arguments[index]));
+       } else if (typeof arguments[index] == 'string') {
+         fragment.appendChild(document.createTextNode(arguments[index]));
+       } else {
+         fragment.appendChild(arguments[index]);
+       }
+     }
+     return fragment;
+   }
+   function E(name, /* optional */ attributes /*, varargs... */) {
+     var element = document.createElement(name);
+     var index = 1;
+     if ((arguments.length > 1) && (typeof attributes != 'string') &&
+         (!(attributes instanceof Node)) && (!(attributes instanceof Array))) {
+       for (var attName in attributes) {
+         if (typeof attributes[attName] == 'boolean') {
+           if (attributes[attName])
+             element.setAttribute(attName, '');
+         } else if (typeof attributes[attName] == 'function') {
+           element[attName] = attributes[attName];
+         } else {
+           element.setAttribute(attName, attributes[attName]);
+         }
+       }
+       index = 2;
+     }
+     for (; index < arguments.length; index += 1) {
+       if (arguments[index] instanceof Array) {
+         element.appendChild(F.apply(this, arguments[index]));
+       } else if (typeof arguments[index] == 'string') {
+         element.appendChild(document.createTextNode(arguments[index]));
+       } else {
+         element.appendChild(arguments[index]);
+       }
+     }
+     return element;
+   }
+   function getCookie(name) {
+     var params = location.search.substr(1).split("&");
+     for (var index = 0; index < params.length; index++) {
+       if (params[index] == name)
+         return "1";
+       var data = params[index].split("=");
+       if (data[0] == name)
+         return unescape(data[1]);
+     }
+     var cookies = document.cookie.split("; ");
+     for (var index = 0; index < cookies.length; index++) {
+       var data = cookies[index].split("=");
+       if (data[0] == name)
+         return unescape(data[1]);
+     }
+     return null;
+   }
+   var currentAlert;
+   var currentAlertTimeout;
+   function showAlert(s, href) {
+     if (!currentAlert) {
+       currentAlert = document.createElement('div');
+       currentAlert.id = 'alert';
+       var x = document.createElement('button');
+       x.textContent = '\u2573';
+       x.onclick = closeAlert2;
+       currentAlert.appendChild(x);
+       currentAlert.appendChild(document.createElement('span'));
+       currentAlert.onmousemove = function () {
+         clearTimeout(currentAlertTimeout);
+         currentAlert.className = '';
+         currentAlertTimeout = setTimeout(closeAlert, 10000);
+       }
+       document.body.appendChild(currentAlert);
+     } else {
+       clearTimeout(currentAlertTimeout);
+       currentAlert.className = '';
+     }
+     currentAlert.lastChild.textContent = '';
+     currentAlert.lastChild.appendChild(F(s));
+     if (href) {
+       var link = document.createElement('a');
+       link.href = href;
+       link.textContent = href;
+       currentAlert.lastChild.appendChild(F(' ', link));
+     }
+     currentAlertTimeout = setTimeout(closeAlert, 10000);
+   }
+   function closeAlert() {
+     clearTimeout(currentAlertTimeout);
+     if (currentAlert) {
+       currentAlert.className = 'closed';
+       currentAlertTimeout = setTimeout(closeAlert2, 3000);
+     }
+   }
+   function closeAlert2() {
+     clearTimeout(currentAlertTimeout);
+     if (currentAlert) {
+       currentAlert.parentNode.removeChild(currentAlert);
+       currentAlert = null;
+     }
+   }
+   window.addEventListener('keydown', function (event) {
+     if (event.keyCode == 27) {
+       if (currentAlert)
+         closeAlert2();
+     } else {
+       closeAlert();
+     }
+   }, false);
+   window.addEventListener('scroll', function (event) {
+     closeAlert();
+   }, false);
+   function load(script) {
+     var e = document.createElement('script');
+     e.setAttribute('src', 'http://www.whatwg.org/specs/web-apps/current-work/' + script);
+     document.body.appendChild(e);
+   }
+  </script>
+  <!-- BEGIN WEBKIT EDITS -->
+  <!-- We inline some style sheets to get more stable numbers. -->
+  <!-- Inlining /style/specification -->
+  <style>
+   /* WHATWG Green: sRGB #3c790a, rgb(60, 121, 10) */
+
+   html { margin: 0; padding: 0; color: black; background: white; }
+   body { margin: 0; padding: 0 1em 2em 8.5em; line-height: 1.35; color: black; background: white top left repeat-y; }
+
+   @media screen {
+     html { background: #eeeeee; }
+     body { margin-bottom: 30%; border-bottom: thin solid #3c790a; }
+   }
+
+   :link { color: #00C; background: transparent }
+   :visited { color: #609; background: transparent }
+   :link:active, :visited:active { color: #C00; background: transparent }
+   :link:hover, :visited:hover { background: #ffa; }
+   code :link, code :visited { color: inherit; }
+
+   body, th, td { font-family: sans-serif, Droid Sans Fallback; }
+
+   h1, h2, h3, h4, h5, h6 { text-align: left; text-rendering: optimiseLegibility; }
+   h1, h2, h3 { color: #3c790a; background: transparent; }
+   h1 { font: 900 200% sans-serif, Droid Sans Fallback; }
+   h1.allcaps { font: 900 350% sans-serif, Droid Sans Fallback; letter-spacing: 2px; }
+   h2 { font: 800 140% sans-serif, Droid Sans Fallback; }
+   h3 { font: 800 125% sans-serif, Droid Sans Fallback; }
+   h4 { font: 800 110% sans-serif, Droid Sans Fallback; }
+   h5 { font: 800 100% sans-serif, Droid Sans Fallback; }
+   h6 { font: 600 italic 100% sans-serif, Droid Sans Fallback; }
+
+   pre { margin-left: 2em; white-space: pre-wrap; }
+   h2 { margin: 3em 0 1em 0; }
+   h3 { margin: 2.5em 0 1em 0; }
+   h4 { margin: 2.5em 0 0.75em 0; }
+   h5, h6 { margin: 2.5em 0 1em; }
+   h1 + h2, h2 + h3, h3 + h4, h4 + h5, h5 + h6,
+     h1 + div.status + h2, h2 + div.status + h3, h3 + div.status + h4, h4 + div.status + h5, h5 + div.status + h6 { margin-top: 0.5em; }
+   p { margin: 1em 0; }
+   hr { display: block; background: none; border: none; padding: 0; margin: 2em 0; height: auto; }
+   dl, dd { margin-top: 0; margin-bottom: 0; }
+   dt { margin-top: 0.75em; margin-bottom: 0.25em; clear: left; }
+   dt + dt { margin-top: 0; }
+   dd dt { margin-top: 0.25em; margin-bottom: 0; }
+   dd p, dd ol, dd ol.brief { margin-top: 0; }
+   dd dl + p, dd dl + div.status + p { margin-top: 1em; }
+   dd table + p, dd table + div.status + p { margin-top: 1em; }
+   p + * > li, p + div.status + * > li, dd li { margin: 1em 0; }
+   dt, dfn { font-weight: bold; font-style: normal; }
+   i, em, dt dfn { font-style: italic; }
+   pre, code { font-size: inherit; font-family: monospace, Droid Sans Fallback, sans-serif; font-variant: normal; }
+   pre strong { color: black; font: inherit; font-weight: bold; background: #B7EDEA; }
+   pre em { font-weight: bolder; font-style: normal; }
+   @media screen { code { color: orangered; } }
+   var sub { vertical-align: bottom; font-size: smaller; position: relative; top: 0.1em; }
+   table { border-collapse: collapse; border-style: hidden hidden none hidden; }
+   table thead, table tbody { border-bottom: solid; }
+   table tbody th { text-align: left; }
+   table tbody th:first-child { border-left: solid; }
+   table td, table th { border-left: solid; border-right: solid; border-bottom: solid thin; vertical-align: top; padding: 0.2em; }
+   blockquote { margin: 0 0 0 2em; border: 0; padding: 0; font-style: italic; }
+   ins { background: green; color: white; /* color: green; border: solid thin lime; padding: 0.3em; line-height: 1.6em; */ text-decoration: none; }
+   del { background: maroon; color: white; /* color: maroon; border: solid thin red; padding: 0.3em; line-height: 1.6em; */ text-decoration: line-through; }
+   body ins, body del { display: block; }
+   body * ins, body * del { display: inline; }
+
+   .toc dfn, h1 dfn, h2 dfn, h3 dfn, h4 dfn, h5 dfn, h6 dfn { font: inherit; }
+   img.extra, p.overview { float: right; }
+   hr.bookmark { border: dashed 2em black; background: yellow; }
+   pre::before { font: bold 0.8em sans-serif; padding: 0.5em; position: absolute; top: auto; margin: -0.703125em 0 0 -3.75em /* 1em/0.8 + 1.5em + 0.5em*2 */ ; width: 1.5em; background: inherit; border: 0.078125em; border-style: solid none solid solid; border-radius: 1em 0 0 1em; }
+   pre.idl { border: solid 0.0625em; background: #EEEEEE; color: black; padding: 0.5em 1em; }
+   pre.idl :link, pre.idl :visited { color: inherit; background: transparent; }
+   pre.idl::before { content: 'IDL'; }
+   pre.asn { border: solid 0.0625em; background: #EEEEEE; color: black; padding: 0.5em 1em; }
+   pre.asn :link, pre.asn :visited { color: inherit; background: transparent; }
+   pre.asn::before { content: 'ASN'; }
+   pre.css { border: solid 0.0625em; background: #FFFFEE; color: black; padding: 0.5em 1em; }
+   pre.css:first-line { color: #AAAA50; }
+   pre.css::before { content: 'CSS'; }
+   dl.domintro { color: green; margin: 2em 0 2em 0; padding: 0.5em 1em 0.5em 2em; border: none; background: #DDFFDD; }
+   hr + dl.domintro, div.impl + dl.domintro, hr + div.status + dl.domintro, div.impl + div.status + dl.domintro { margin-top: 2.5em; margin-bottom: 1.5em; }
+   dl.domintro dt, dl.domintro dt * { color: black; text-decoration: none; }
+   dl.domintro dd { margin: 0.5em 0 1em 2em; padding: 0; }
+   dl.domintro dd p { margin: 0.5em 0; }
+   dl.domintro:before { display: table; margin: -1em -0.5em -0.5em auto; width: auto; content: 'This box is non-normative. Implementation requirements are given below this box.'; color: black; font-style: italic; border: solid 2px; background: white; padding: 0 0.25em; }
+   dl.switch { padding-left: 2em; }
+   dl.switch > dt { text-indent: -1.5em; }
+   dl.switch > dt:before { content: '\21AA'; padding: 0 0.5em 0 0; display: inline-block; width: 1em; text-align: right; line-height: 0.5em; }
+   dl.triple { padding: 0 0 0 1em; }
+   dl.triple dt, dl.triple dd { margin: 0; display: inline }
+   dl.triple dt:after { content: ':'; }
+   dl.triple dd:after { content: '\A'; white-space: pre; }
+   .diff-old { text-decoration: line-through; color: silver; background: transparent; }
+   .diff-chg, .diff-new { text-decoration: underline; color: green; background: transparent; }
+   a .diff-new { border-bottom: 1px blue solid; }
+   tr.rare { background: #EEEEEE; color: #333333; }
+
+   figure.diagrams { border: double black; background: white; padding: 1em; }
+   figure.diagrams img { display: block; margin: 1em auto; }
+
+   h2:not(.short) { page-break-before: always; }
+   h1, h2, h3, h4, h5, h6, dt { page-break-after: avoid; }
+   hgroup h2, h1 + h2, hr + h2.no-toc { page-break-before: auto ! important; }
+
+   p  > span:not([title=""]):not([class="XXX"]):not([class="impl"]):not([class="note"]),
+   li > span:not([title=""]):not([class="XXX"]):not([class="impl"]):not([class="note"]) { border-bottom: solid #99CC99; }
+
+   .head { margin: 0 0 1em; padding: 1em 0 0 0; display: block; }
+   .head p { margin: 0; }
+   .head h1 { margin: 0; }
+   .head h2 { margin-top: 0; }
+   .head .logo { float: right; margin: 0 1em; }
+   .head .logo img { display: block; margin: 0 0 0 auto; border: none } /* remove border from top image */
+   .head dl { margin: 1em 0; }
+   p.copyright { font-size: 0.6em; font-style: oblique; margin: 0; }
+
+   body > .toc > li { margin-top: 1em; margin-bottom: 1em; }
+   body > .toc.brief > li { margin-top: 0.35em; margin-bottom: 0.35em; }
+   body > .toc > li > * { margin-bottom: 0.5em; }
+   body > .toc > li > * > li > * { margin-bottom: 0.25em; }
+   .toc, .toc li { list-style: none; }
+
+   .brief { margin-top: 1em; margin-bottom: 1em; line-height: 1.1; }
+   .brief > li { margin: 0; padding: 0; }
+   .brief > li > p, .brief > li > ol, .brief > li > ul, .brief > li > dl { 
+     margin-top: 0;
+     margin-bottom: 0;
+     padding-top: 0;
+     padding-bottom: 0;
+   }
+
+   .category-list { margin-top: -0.75em; margin-bottom: 1em; line-height: 1.5; }
+   .category-list::before { content: '\21D2\A0'; font-size: 1.2em; font-weight: 900; }
+   .category-list li { display: inline; }
+   .category-list li:not(:last-child)::after { content: ', '; }
+   .category-list li > span, .category-list li > a { text-transform: lowercase; }
+   .category-list li * { text-transform: none; } /* don't affect <code> nested in <a> */
+
+   [title=WIP], [title=TBW] { background: red; color: yellow; padding: 0.1em 0.3em; border: dotted white; margin: 0 0.7em 0 0.2em; }
+   [title=SCS] { background: green; color: white; padding: 0.1em 0.3em; border-style: none dashed; margin: 0 0.7em 0 0.2em; }
+   [title=WIP] :link, [title=WIP] :visited,
+   [title=TBW] :link, [title=TBW] :visited,
+   [title=SCS] :link, [title=SCS] :visited { background: transparent; color: inherit; }
+
+   .big-issue, .XXX { color: #E50000; background: white; border: solid red; padding: 0.5em; margin: 1em 0; }
+   .big-issue > :first-child, .XXX > :first-child { margin-top: 0; }
+   p .big-issue, p .XXX { line-height: 3em; }
+   .note { color: green; background: transparent; font-family: sans-serif, Droid Sans Fallback; }
+   .warning { color: red; background: transparent; }
+   .note, .warning { font-weight: bolder; font-style: italic; }
+   .note em, .warning em, .note i, .warning i, .note var, .warning var { font-style: normal; }
+   p.note, div.note { padding: 0.5em 2em; }
+   span.note { padding: 0 2em; }
+   .note p:first-child, .warning p:first-child { margin-top: 0; }
+   .note p:last-child, .warning p:last-child { margin-bottom: 0; }
+   dd > .note:first-child { margin-bottom: 0; }
+   .warning:before { font-style: normal; }
+
+   .tablenote { margin: 0.25em 0; }
+   .tablenote small { font-size: 0.9em; }
+
+   .XXX:before, .XXX:after { content: " ** "; position: absolute; left: 0; width: 8em; text-align: right; }
+   p.note:before { content: 'Note: '; }
+   p.warning:before { content: '\26A0 Warning! '; }
+
+   .bookkeeping:before { display: block; content: 'Bookkeeping details'; font-weight: bolder; font-style: italic; }
+   .bookkeeping { font-size: 0.8em; margin: 2em 0; }
+   .bookkeeping p { margin: 0.5em 2em; display: list-item; list-style: square; }
+   .bookkeeping dt { margin: 0.5em 2em 0; }
+   .bookkeeping dd { margin: 0 3em 0.5em; }
+
+   .critical { margin: 1em; border: double thick red; padding: 1em; background: #FFFFCC; }
+   .critical > :first-child { margin-top: 0; }
+
+   h4 { position: relative; z-index: 3; }
+   h4 + .element, h4 + div.status + .element { margin-top: -2.5em; padding-top: 2em; }
+   .element { background: #EEFFEE; color: black; margin: 0 0 1em 0.15em; padding: 0 1em 0.25em 0.75em; border-left: solid #99FF99 0.25em; position: relative; z-index: 1; }
+   .element:before { position: absolute; z-index: 2; top: 0; left: -1.15em; height: 2em; width: 0.9em; background: #EEFFEE; content: ' '; border-style: none none solid solid; border-color: #99FF99; border-width: 0.25em; }
+   .element:not(:hover) > dt > :link, .element:not(:hover) > dt > :visited { color: inherit; text-decoration: none; }
+
+   table.css-property caption { text-align: left; font: inherit; font-weight: bold; }
+   table.css-property th { font: inherit; font-style: italic; text-align: left; padding-left: 2em; }
+
+   .example { display: block; color: #222222; background: #FCFCFC; border-left: double; margin-left: 2em; padding-left: 1em; }
+   td > .example:only-child { margin: 0 0 0 0.1em; }
+
+   td.non-rectangular-cell-continuation { border-left-style: hidden; }
+   td.non-rectangular-cell-indentation { border-top-style: hidden; min-width: 2em; }
+
+   .hide { display: none }
+
+   body.dfnEnabled dfn { cursor: pointer; }
+   .dfnPanel {
+     display: inline;
+     position: absolute;
+     z-index: 10;
+     height: auto;
+     width: auto;
+     padding: 0.5em 0.75em;
+     font: small sans-serif, Droid Sans Fallback;
+     background: #DDDDDD;
+     color: black;
+     border: outset 0.2em;
+   }
+   .dfnPanel * { margin: 0; padding: 0; font: inherit; text-indent: 0; }
+   .dfnPanel :link, .dfnPanel :visited { color: black; }
+   .dfnPanel p { font-weight: bolder; }
+   .dfnPanel * + p { margin-top: 0.25em; }
+   .dfnPanel li { list-style-position: inside; }
+
+   @media aural {  
+     h1, h2, h3 { stress: 20; richness: 90 }
+     .hide { speak: none }
+     p.copyright { volume: x-soft; speech-rate: x-fast }
+     dt { pause-before: 20% }
+     code, pre { speak-punctuation: code } 
+   }
+
+   @media print {
+     html { font-size: 8pt; }
+     @page { margin: 1cm 1cm 1cm 1cm; }
+     @page :left {
+       @bottom-left {
+         font: 6pt sans-serif, Droid Sans Fallback;
+         content: counter(page);
+         padding-top: 0em;
+         vertical-align: top;
+       }
+     }
+     @page :right {
+       @bottom-right {
+         font: 6pt sans-serif, Droid Sans Fallback;
+         content: counter(page);
+         text-align: right;
+         vertical-align: top;
+         padding-top: 0em;
+       }
+     }
+     a[href^="#"]::after { font-size: 0.6em; vertical-align: super; padding: 0 0.15em 0 0.15em; content: "p" target-counter(attr(href), page); }
+     .toc a::after { font: inherit; vertical-align: baseline; padding: 0; content: leader('.') target-counter(attr(href), page); }
+     pre a[href^="#"]::after, blockquote a[href^="#"]::after { content: ""; padding: 0; }
+     table { font-size: smaller; }
+     :link, :visited { text-decoration: none; color: inherit; background: transparent; }
+   }
+
+   ul.domTree, ul.domTree ul { padding: 0 0 0 1em; margin: 0; }
+   ul.domTree li { padding: 0; margin: 0; list-style: none; position: relative; }
+   ul.domTree li li { list-style: none; }
+   ul.domTree li:first-child::before { position: absolute; top: 0; height: 0.6em; left: -0.75em; width: 0.5em; border-style: none none solid solid; content: ''; border-width: 0.1em; }
+   ul.domTree li:not(:last-child)::after { position: absolute; top: 0; bottom: -0.6em; left: -0.75em; width: 0.5em; border-style: none none solid solid; content: ''; border-width: 0.1em; }
+   ul.domTree span { font-style: italic; font-family: serif, Droid Sans Fallback; }
+   ul.domTree .t1 code { color: purple; font-weight: bold; }
+   ul.domTree .t2 { font-style: normal; font-family: monospace, Droid Sans Fallback; }
+   ul.domTree .t2 .name { color: black; font-weight: bold; }
+   ul.domTree .t2 .value { color: blue; font-weight: normal; }
+   ul.domTree .t3 code, .domTree .t4 code, .domTree .t5 code { color: gray; }
+   ul.domTree .t7 code, .domTree .t8 code { color: green; }
+   ul.domTree .t10 code { color: teal; }
+
+   :target {
+      background:         #ffa;
+      -moz-box-shadow:    0 0 25px #ffa;
+      -webkit-box-shadow: 0 0 150px #ffa;
+      box-shadow:         0 0 25px #ffa;
+   }
+
+   /*body:not(.statusEnabled) .head, body:not(.dfnEnabled) .head { background: bottom right url(http://hixie.ch/resources/images/spinner) no-repeat; }*/
+  </style>
+  <!-- END WEBKIT EDITS -->
+  <link rel=icon href=http://www.whatwg.org/images/icon><style>
+   .proposal { border: blue solid; padding: 1em; }
+   .bad, .bad *:not(.XXX) { color: gray; border-color: gray; background: transparent; }
+   #updatesStatus { display: none; }
+   #updatesStatus.relevant { display: block; position: fixed; right: 1em; top: 1em; padding: 0.5em; font: bold small sans-serif; min-width: 25em; width: 30%; max-width: 40em; height: auto; border: ridge 4px gray; background: #EEEEEE; color: black; }
+   div.head .logo { width: 11em; margin-bottom: 20em; }
+   #configUI { position: absolute; z-index: 20; top: 10em; right: 0; width: 11em; padding: 0 0.5em 0 0.5em; font-size: small; background: gray; background: rgba(32,32,32,0.9); color: white; border-radius: 1em 0 0 1em; -moz-border-radius: 1em 0 0 1em; }
+   #configUI p { margin: 0.75em 0; padding: 0.3em; }
+   #configUI p label { display: block; }
+   #configUI #updateUI, #configUI .loginUI { text-align: center; }
+   #configUI input[type=button] { display: block; margin: auto; }
+   #configUI :link, #configUI :visited { color: white; }
+   #configUI :link:hover, #configUI :visited:hover { background: transparent; }
+   #reviewer { position: fixed; bottom: 0; right: 0; padding: 0.15em 0.25em 0em 0.5em; white-space: nowrap; overflow: hidden; z-index: 30; background: gray; background: rgba(32,32,32,0.9); color: white; border-radius: 1em 0 0 0; -moz-border-radius: 1em 0 0 0; max-width: 90%; }
+   #reviewer input { max-width: 50%; }
+   #reviewer * { font-size: small; }
+   #reviewer.off > :not(:first-child) { display: none; }
+   #alert { position: fixed; top: 20%; left: 20%; right: 20%; font-size: 2em; padding: 0.5em; z-index: 40; background: gray; background: rgba(32,32,32,0.9); color: white; border-radius: 1em; -moz-border-radius: 1em; -webkit-transition: opacity 1s linear; }
+   #alert.closed { opacity: 0; }
+   #alert button { position: absolute; top: -1em; right: 2em; border-radius: 1em 1em 0 0; border: none; line-height: 0.9; color: white; background: rgb(64,64,64); font-size: 0.6em; font-weight: 900; cursor: pointer; }
+   #alert :link, #alert :visited { color: white; }
+   #alert :link:hover, #alert :visited:hover { background: transparent; }
+   @media print { #configUI { display: none; } }
+   .rfc2119 { font-variant: small-caps; text-shadow: 0 0 0.5em yellow; position: static; }
+   .rfc2119::after { position: absolute; left: 0; width: 25px; text-align: center; color: yellow; text-shadow: 0.075em 0.075em 0.2em black; }
+   .rfc2119.m\ust::after { content: '\2605'; }
+   .rfc2119.s\hould::after { content: '\2606'; }
+   [hidden] { display: none; }
+  </style><style type=text/css>
+
+   .fingerprint { float: right; }
+
+   .applies thead th > * { display: block; }
+   .applies thead code { display: block; }
+   .applies td { text-align: center; }
+   .applies .yes { background: yellow; }
+
+   .matrix, .matrix td { border: hidden; text-align: right; }
+   .matrix { margin-left: 2em; }
+
+   .vertical-summary-table tr > th[rowspan="2"]:first-child + th,
+   .vertical-summary-table tr > td[rowspan="2"]:first-child + td { border-bottom: hidden; }
+
+   .dice-example { border-collapse: collapse; border-style: hidden solid solid hidden; border-width: thin; margin-left: 3em; }
+   .dice-example caption { width: 30em; font-size: smaller; font-style: italic; padding: 0.75em 0; text-align: left; }
+   .dice-example td, .dice-example th { border: solid thin; width: 1.35em; height: 1.05em; text-align: center; padding: 0; }
+
+   td.eg { border-width: thin; text-align: center; }
+
+   #table-example-1 { border: solid thin; border-collapse: collapse; margin-left: 3em; }
+   #table-example-1 * { font-family: "Essays1743", serif; line-height: 1.01em; }
+   #table-example-1 caption { padding-bottom: 0.5em; }
+   #table-example-1 thead, #table-example-1 tbody { border: none; }
+   #table-example-1 th, #table-example-1 td { border: solid thin; }
+   #table-example-1 th { font-weight: normal; }
+   #table-example-1 td { border-style: none solid; vertical-align: top; }
+   #table-example-1 th { padding: 0.5em; vertical-align: middle; text-align: center; }
+   #table-example-1 tbody tr:first-child td { padding-top: 0.5em; }
+   #table-example-1 tbody tr:last-child td { padding-bottom: 1.5em; }
+   #table-example-1 tbody td:first-child { padding-left: 2.5em; padding-right: 0; width: 9em; }
+   #table-example-1 tbody td:first-child::after { content: leader(". "); }
+   #table-example-1 tbody td { padding-left: 2em; padding-right: 2em; }
+   #table-example-1 tbody td:first-child + td { width: 10em; }
+   #table-example-1 tbody td:first-child + td ~ td { width: 2.5em; }
+   #table-example-1 tbody td:first-child + td + td + td ~ td { width: 1.25em; }
+
+   .apple-table-examples { border: none; border-collapse: separate; border-spacing: 1.5em 0em; width: 40em; margin-left: 3em; }
+   .apple-table-examples * { font-family: "Times", serif; }
+   .apple-table-examples td, .apple-table-examples th { border: none; white-space: nowrap; padding-top: 0; padding-bottom: 0; }
+   .apple-table-examples tbody th:first-child { border-left: none; width: 100%; }
+   .apple-table-examples thead th:first-child ~ th { font-size: smaller; font-weight: bolder; border-bottom: solid 2px; text-align: center; }
+   .apple-table-examples tbody th::after, .apple-table-examples tfoot th::after { content: leader(". ") }
+   .apple-table-examples tbody th, .apple-table-examples tfoot th { font: inherit; text-align: left; }
+   .apple-table-examples td { text-align: right; vertical-align: top; }
+   .apple-table-examples.e1 tbody tr:last-child td { border-bottom: solid 1px; }
+   .apple-table-examples.e1 tbody + tbody tr:last-child td { border-bottom: double 3px; }
+   .apple-table-examples.e2 th[scope=row] { padding-left: 1em; }
+   .apple-table-examples sup { line-height: 0; }
+
+   .three-column-nowrap tr > td:first-child,
+   .three-column-nowrap tr > td:first-child + td,
+   .three-column-nowrap tr > td:first-child + td + td { white-space: nowrap; }
+
+   .details-example img { vertical-align: top; }
+
+   #base64-table {
+     white-space: nowrap;
+     font-size: 0.6em;
+     column-width: 6em;
+     column-count: 5;
+     column-gap: 1em;
+     -moz-column-width: 6em;
+     -moz-column-count: 5;
+     -moz-column-gap: 1em;
+     -webkit-column-width: 6em;
+     -webkit-column-count: 5;
+     -webkit-column-gap: 1em;
+   }
+   #base64-table thead { display: none; }
+   #base64-table * { border: none; }
+   #base64-table tbody td:first-child:after { content: ':'; }
+   #base64-table tbody td:last-child { text-align: right; }
+
+   #named-character-references-table {
+     white-space: nowrap;
+     font-size: 0.6em;
+     column-width: 30em;
+     column-gap: 1em;
+     -moz-column-width: 30em;
+     -moz-column-gap: 1em;
+     -webkit-column-width: 30em;
+     -webkit-column-gap: 1em;
+   }
+   #named-character-references-table > table > tbody > tr > td:first-child + td,
+   #named-character-references-table > table > tbody > tr > td:last-child { text-align: center; }
+   #named-character-references-table > table > tbody > tr > td:last-child:hover > span { position: absolute; top: auto; left: auto; margin-left: 0.5em; line-height: 1.2; font-size: 5em; border: outset; padding: 0.25em 0.5em; background: white; width: 1.25em; height: auto; text-align: center; }
+   #named-character-references-table > table > tbody > tr#entity-CounterClockwiseContourIntegral > td:first-child { font-size: 0.5em; }
+
+   .glyph.control { color: red; }
+
+   @font-face {
+     font-family: 'Essays1743';
+     src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743.ttf');
+   }
+   @font-face {
+     font-family: 'Essays1743';
+     font-weight: bold;
+     src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743-Bold.ttf');
+   }
+   @font-face {
+     font-family: 'Essays1743';
+     font-style: italic;
+     src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743-Italic.ttf');
+   }
+   @font-face {
+     font-family: 'Essays1743';
+     font-style: italic;
+     font-weight: bold;
+     src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743-BoldItalic.ttf');
+   }
+
+  </style><link rel=stylesheet href=data:text/css, title=Normal><link rel="stylesheet alternate" href=data:text/css,.impl%20{%20background:%20pink;%20} title="Highlight implementation-only prose">
+  <!-- BEGIN WEBKIT EDITS -->
+  <!-- We inline some style sheets to get more stable numbers. -->
+  <!-- Inlining status.css -->
+  <style>
+  .status { font: 1em sans-serif; letter-spacing: -0.05em; width: 7.2em; padding: 0.3em; position: absolute; z-index: 8; left: 0.3em; background: #EEE; color: black; display: none; }
+  .status > * { font-size: 0.6em; }
+  .status.current { position: fixed; z-index: 7; top: 20px; transition: 1s; } /* 20px is in the js file too */
+  .status[hidden] { display: block; opacity: 0.0; transition: 0.25s; }
+  .status strong { display: block; margin: -0.5em -0.5em 0.2em; padding: 0.2em 0.3em 0.25em; background: black; color: white; font-weight: normal; }
+  .status.UNKNOWN strong { background: gray; color: white; }
+  .status.TBW strong { background: red; color: white; }
+  .status.WIP strong { background: red; color: white; }
+  .status.FD strong { background: orange; color: black; }
+  .status.WD strong { background: orange; color: black; }
+  .status.CWD strong { background: red; color: yellow; }
+  .status.ATRISK strong { background: red; color: yellow; }
+  .status.LC strong { background: yellow; color: black; }
+  .status.CR strong { background: lime; color: black; }
+  .status.REC strong { background: green; color: white; }
+  .status.SPLITFD strong { background: navy; color: white; }
+  .status.SPLIT/*CR*/ strong { background: navy; color: white; }
+  .status.SPLITREC strong { background: navy; color: white; }
+  .status:after { position: absolute; top: 0; left: 100%; margin-left: -1px; content: '\25B6'; font-size: 0.6em; }
+  .status.UNKNOWN:after { color: gray }
+  .status.TBW:after { color: red }
+  .status.WIP:after { color: red }
+  .status.FD:after { color: orange }
+  .status.WD:after { color: orange }
+  .status.CWD:after { color: red }
+  .status.ATRISK:after { color: red }
+  .status.LC:after { color: yellow }
+  .status.CR:after { color: lime }
+  .status.REC:after { color: green }
+  .status.SPLITFD:after { color: navy }
+  .status.SPLIT/*CR*/:after { color: navy }
+  .status.SPLITREC:after { color: navy }
+  .status { box-shadow: 0 0 3px #999; }
+  .status:after { text-shadow: 1px 0 2px #999; }
+  .status p { margin: 0; clear: both; }
+  .status p + p { overflow: hidden; }
+  .status div.implementations { height: 34px; font: 10px/1.2em sans-serif; max-height: none; overflow: hidden; }
+  .status div.implementations:before { display: block; content: "Implementation status:"; }
+  .status div.implementations p { font-size: 16px; float: left; margin: 0; border: 2px solid transparent; padding: 1px; text-indent: -10000px; /* well that's just silly */ width: 1em; height: 1em; background: no-repeat center center; /*background-size: 1em 1em;*/ clear: none; }
+  .status div.implementations p.IE { background-image: url(http://www.w3.org/TR/2006/WD-i18n-html-tech-lang-20060721/images/iewin.gif); background-position: center left; }
+  .status div.implementations p.Firefox { background-image: url(http://www.mozilla.org/favicon.ico); }
+  .status div.implementations p.Safari { background-image: url(http://www.webkit.org/favicon.ico); }
+  .status div.implementations p.Opera { background-image: url(http://www.opera.com/favicon.ico); }
+  .status div.implementations p.Shims { background-image: url(http://upload.wikimedia.org/wikipedia/commons/b/b7/Plugin.png); }
+  .status div.implementations p.NA,
+  .status div.implementations p.UNKNOWN { opacity: 0.05; }
+  .status div.implementations p.PASS { }
+  .status div.implementations p.PARTIAL { opacity: 0.4; }
+  .status div.implementations p.NONE { background: #FEE; }
+  .status div.implementations p.BUG { border-bottom-color: red; }
+  .status div.implementations p.CRASH { border-style: dotted; border-color: black; background-color: yellow; }
+  .status .autohide { max-height: 0; opacity: 0; overflow: hidden; transition: 0.5s; }
+  .status:hover .autohide { max-height: 10em; opacity: 1.0; }
+  .status:not(:hover) div.implementations.autohide { height: 0; }
+  .status .idref > a { display: block; margin: 0.1em 0 0.2em; }
+  .status:hover { z-index: 10; }
+
+  .progress { text-decoration: blink; }
+
+  .panel { position: fixed; z-index: 9; top: 10%; left: 0; margin: auto; right: 0; width: 35em; border: double thick; background: #EEEEEE; color: black; padding: 1em; font: 1em sans-serif; max-height: 70%; overflow: auto; }
+  .panel h2 { margin: 0; text-align: center; }
+  .panel ul { min-height: 6em; }
+  .panel p { text-align: right; margin: 0; }
+  .panel form { background: transparent; color: black; margin: 0.5em -0.5em 1em; padding: 0.5em; }
+  .panel form.changed { background: yellow; color: black; }
+  .panel form p { text-align: left; margin: 1em 0 0; }
+  .panel form p:first-child { margin-top: 0; }
+  .panel form p:last-child { margin-bottom: 0; }
+  .panel form p textarea { width: 100% /* need the keyword that makes it fit to the parent here XXX */; min-height: 4em; display: block; }
+  .panel form dl { line-height: 1.5em; }
+  .panel form dt { display: inline-block; width: 20em; white-space: nowrap; text-align: right; font-weight: normal; margin: 0; padding: 0; }
+  .panel form dd { display: inline; margin: 0 0 0 1em; padding: 0; }
+  .panel form dd:after { display: block; }
+
+  body.statusEnabled .status { display: block; }
+
+  ul.checkboxes { list-style-type: none; }
+  </style>
+  <!-- END WEBKIT EDITS -->
+  <script>
+   var startedInit = 0;
+   function init() {
+     startedInit = 1;
+     if (location.search == '?slow-browser')
+       return;
+     var configUI = document.createElement('div');
+     configUI.id = 'configUI';
+     document.body.appendChild(configUI);
+     load('reviewer.js');
+     if (document.documentElement.className == "" || document.documentElement.className == "split index")
+       load('toc.js');
+     load('updater.js');
+     load('dfn.js');
+     load('status.js');
+     if (getCookie('profile') == '1')
+       document.getElementsByTagName('h2')[0].textContent += '; load: ' + (new Date() - loadTimer) + 'ms';
+   }
+   if (document.documentElement.className == "")
+     setTimeout(function () {
+       if (!startedInit)
+         showAlert("Too slow? Try reading the multipage copy of the spec instead:", "http://whatwg.org/html");
+     }, 6000);
+
+   window.addEventListener('keypress', function (event) {
+     if ((event.which == 114) && (event.metaKey)) {
+       if (!confirm('Are you sure you want to reload this page?'))
+         event.preventDefault();
+     }
+   }, false);
+
+  </script><script async defer src="//survey.g.doubleclick.net/async_survey?site=52xlbs7js527m"></script><body onload=init()>
+
+  <header class=head id=head><p><a href=http://www.whatwg.org/ class=logo><img width=101 src=/images/logo alt=WHATWG height=101></a></p>
+   <hgroup><h1 class=allcaps>HTML</h1>
+    <h2 class="no-num no-toc">Living Standard &mdash; Last Updated 11 November 2013</h2>
+   </hgroup><dl><dt><strong>Web developer edition:</strong></dt>
+    <dd><strong><a href=http://developers.whatwg.org/>http://developers.whatwg.org/</a></strong></dd>
+    <dt>Multiple-page version:</dt>
+    <dd><a href=http://www.whatwg.org/specs/web-apps/current-work/multipage/>http://whatwg.org/html</a></dd>
+    <dt>One-page version:</dt>
+    <dd><a href=http://www.whatwg.org/specs/web-apps/current-work/>http://whatwg.org/c</a></dd>
+    <dt>Validators</dt>
+    <dd><a href=http://validator.whatwg.org/>http://validator.whatwg.org/</a></dd>
+    <dt>Participate:</dt>
+    <dd><a href=http://www.whatwg.org/mailing-list>whatwg@whatwg.org</a></dd>
+    <dd><a href=http://forums.whatwg.org/>http://forums.whatwg.org/</a></dd>
+    <dd><a href=http://wiki.whatwg.org/wiki/IRC>IRC: #whatwg on Freenode</a></dd>
+    <dt>FAQ:</dt>
+    <dd><a href=http://wiki.whatwg.org/wiki/FAQ>http://wiki.whatwg.org/wiki/FAQ</a></dd>
+    <dt>Version history:</dt>
+    <dd>Twitter updates: <a href=http://twitter.com/WHATWG>http://twitter.com/WHATWG</a></dd>
+    <dd>Commit-Watchers mailing list: <a href=http://lists.whatwg.org/listinfo.cgi/commit-watchers-whatwg.org>http://lists.whatwg.org/listinfo.cgi/commit-watchers-whatwg.org</a></dd>
+    <dd>Interactive Web interface: <a href=http://html5.org/tools/web-apps-tracker>http://html5.org/tools/web-apps-tracker</a></dd>
+    <dd>Subversion interface: <a href=http://svn.whatwg.org/>http://svn.whatwg.org/</a></dd>
+    <dt>Issues:</dt>
+    <dd>To view the open bugs: <a href="https://www.w3.org/Bugs/Public/buglist.cgi?query_format=advanced&amp;short_desc_type=allwordssubstr&amp;short_desc=&amp;product=WHATWG&amp;component=HTML&amp;longdesc_type=allwordssubstr&amp;longdesc=&amp;bug_file_loc_type=allwordssubstr&amp;bug_file_loc=&amp;status_whiteboard_type=allwordssubstr&amp;status_whiteboard=&amp;keywords_type=allwords&amp;keywords=&amp;bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;emailtype1=substring&amp;email1=&amp;emailtype2=substring&amp;email2=&amp;bug_id_type=anyexact&amp;bug_id=&amp;votes=&amp;chfieldfrom=&amp;chfieldto=Now&amp;chfieldvalue=&amp;cmdtype=doit&amp;order=Reuse+same+sort+as+last+time&amp;field0-0-0=noop&amp;type0-0-0=noop&amp;value0-0-0=">HTML bug list</a></dd>
+    <dd>To file bugs, use the "submit review comments" feature at the bottom of the window</dd>
+    <dd>To send feedback by e-mail: <a href=http://www.whatwg.org/mailing-list>whatwg@whatwg.org</a></dd>
+    <dd>To view and vote on e-mail feedback: <a href=http://www.whatwg.org/issues/>http://www.whatwg.org/issues/</a></dd>
+    <dt>Editor:</dt>
+    <dd>Ian Hickson, Google, ian@hixie.ch</dd>
+   </dl><p class=copyright>&copy; Copyright 2004-2011 Apple Computer, Inc.,
+   Mozilla Foundation, and Opera Software ASA.</p>
+   <p class=copyright>You are granted a license to use, reproduce
+   and create derivative works of this document.</p>
+  </header><hr><h2 class="no-num no-toc" id=contents>Table of contents</h2>
+  
+<!--begin-toc-->
+<ol class=toc>
+ <li><a href=#introduction><span class=secno>1 </span>Introduction</a>
+  <ol>
+   <li><a href=#abstract><span class=secno>1.1 </span>Where does this specification fit?</a></li>
+   <li><a href=#is-this-html5?><span class=secno>1.2 </span>Is this HTML5?</a></li>
+   <li><a href=#background><span class=secno>1.3 </span>Background</a></li>
+   <li><a href=#audience><span class=secno>1.4 </span>Audience</a></li>
+   <li><a href=#scope><span class=secno>1.5 </span>Scope</a></li>
+   <li><a href=#history-1><span class=secno>1.6 </span>History</a></li>
+   <li><a href=#design-notes><span class=secno>1.7 </span>Design notes</a>
+    <ol>
+     <li><a href=#serializability-of-script-execution><span class=secno>1.7.1 </span>Serializability of script execution</a></li>
+     <li><a href=#compliance-with-other-specifications><span class=secno>1.7.2 </span>Compliance with other specifications</a></li>
+     <li><a href=#extensibility><span class=secno>1.7.3 </span>Extensibility</a></ol></li>
+   <li><a href=#html-vs-xhtml><span class=secno>1.8 </span>HTML vs XHTML</a></li>
+   <li><a href=#structure-of-this-specification><span class=secno>1.9 </span>Structure of this specification</a>
+    <ol>
+     <li><a href=#how-to-read-this-specification><span class=secno>1.9.1 </span>How to read this specification</a></li>
+     <li><a href=#typographic-conventions><span class=secno>1.9.2 </span>Typographic conventions</a></ol></li>
+   <li><a href=#fingerprint><span class=secno>1.10 </span>Privacy concerns</a></li>
+   <li><a href=#a-quick-introduction-to-html><span class=secno>1.11 </span>A quick introduction to HTML</a>
+    <ol>
+     <li><a href=#writing-secure-applications-with-html><span class=secno>1.11.1 </span>Writing secure applications with HTML</a></li>
+     <li><a href=#common-pitfalls-to-avoid-when-using-the-scripting-apis><span class=secno>1.11.2 </span>Common pitfalls to avoid when using the scripting APIs</a></ol></li>
+   <li><a href=#conformance-requirements-for-authors><span class=secno>1.12 </span>Conformance requirements for authors</a>
+    <ol>
+     <li><a href=#presentational-markup><span class=secno>1.12.1 </span>Presentational markup</a></li>
+     <li><a href=#syntax-errors><span class=secno>1.12.2 </span>Syntax errors</a></li>
+     <li><a href=#restrictions-on-content-models-and-on-attribute-values><span class=secno>1.12.3 </span>Restrictions on content models and on attribute values</a></ol></li>
+   <li><a href=#suggested-reading><span class=secno>1.13 </span>Suggested reading</a></ol></li>
+ <li><a href=#infrastructure><span class=secno>2 </span>Common infrastructure</a>
+  <ol>
+   <li><a href=#terminology><span class=secno>2.1 </span>Terminology</a>
+    <ol>
+     <li><a href=#resources><span class=secno>2.1.1 </span>Resources</a></li>
+     <li><a href=#xml><span class=secno>2.1.2 </span>XML</a></li>
+     <li><a href=#dom-trees><span class=secno>2.1.3 </span>DOM trees</a></li>
+     <li><a href=#scripting-0><span class=secno>2.1.4 </span>Scripting</a></li>
+     <li><a href=#plugins><span class=secno>2.1.5 </span>Plugins</a></li>
+     <li><a href=#encoding-terminology><span class=secno>2.1.6 </span>Character encodings</a></ol></li>
+   <li><a href=#conformance-requirements><span class=secno>2.2 </span>Conformance requirements</a>
+    <ol>
+     <li><a href=#conformance-classes><span class=secno>2.2.1 </span>Conformance classes</a></li>
+     <li><a href=#dependencies><span class=secno>2.2.2 </span>Dependencies</a></li>
+     <li><a href=#extensibility-0><span class=secno>2.2.3 </span>Extensibility</a></li>
+     <li><a href=#interactions-with-xpath-and-xslt><span class=secno>2.2.4 </span>Interactions with XPath and XSLT</a></ol></li>
+   <li><a href=#case-sensitivity-and-string-comparison><span class=secno>2.3 </span>Case-sensitivity and string comparison</a></li>
+   <li><a href=#common-microsyntaxes><span class=secno>2.4 </span>Common microsyntaxes</a>
+    <ol>
+     <li><a href=#common-parser-idioms><span class=secno>2.4.1 </span>Common parser idioms</a></li>
+     <li><a href=#boolean-attributes><span class=secno>2.4.2 </span>Boolean attributes</a></li>
+     <li><a href=#keywords-and-enumerated-attributes><span class=secno>2.4.3 </span>Keywords and enumerated attributes</a></li>
+     <li><a href=#numbers><span class=secno>2.4.4 </span>Numbers</a>
+      <ol>
+       <li><a href=#signed-integers><span class=secno>2.4.4.1 </span>Signed integers</a></li>
+       <li><a href=#non-negative-integers><span class=secno>2.4.4.2 </span>Non-negative integers</a></li>
+       <li><a href=#floating-point-numbers><span class=secno>2.4.4.3 </span>Floating-point numbers</a></li>
+       <li><a href=#percentages-and-dimensions><span class=secno>2.4.4.4 </span>Percentages and lengths</a></li>
+       <li><a href=#lists-of-integers><span class=secno>2.4.4.5 </span>Lists of integers</a></li>
+       <li><a href=#lists-of-dimensions><span class=secno>2.4.4.6 </span>Lists of dimensions</a></ol></li>
+     <li><a href=#dates-and-times><span class=secno>2.4.5 </span>Dates and times</a>
+      <ol>
+       <li><a href=#months><span class=secno>2.4.5.1 </span>Months</a></li>
+       <li><a href=#dates><span class=secno>2.4.5.2 </span>Dates</a></li>
+       <li><a href=#yearless-dates><span class=secno>2.4.5.3 </span>Yearless dates</a></li>
+       <li><a href=#times><span class=secno>2.4.5.4 </span>Times</a></li>
+       <li><a href=#local-dates-and-times><span class=secno>2.4.5.5 </span>Local dates and times</a></li>
+       <li><a href=#time-zones><span class=secno>2.4.5.6 </span>Time zones</a></li>
+       <li><a href=#global-dates-and-times><span class=secno>2.4.5.7 </span>Global dates and times</a></li>
+       <li><a href=#weeks><span class=secno>2.4.5.8 </span>Weeks</a></li>
+       <li><a href=#durations><span class=secno>2.4.5.9 </span>Durations</a></li>
+       <li><a href=#vaguer-moments-in-time><span class=secno>2.4.5.10 </span>Vaguer moments in time</a></ol></li>
+     <li><a href=#colors><span class=secno>2.4.6 </span>Colors</a></li>
+     <li><a href=#space-separated-tokens><span class=secno>2.4.7 </span>Space-separated tokens</a></li>
+     <li><a href=#comma-separated-tokens><span class=secno>2.4.8 </span>Comma-separated tokens</a></li>
+     <li><a href=#syntax-references><span class=secno>2.4.9 </span>References</a></li>
+     <li><a href=#mq><span class=secno>2.4.10 </span>Media queries</a></ol></li>
+   <li><a href=#urls><span class=secno>2.5 </span>URLs</a>
+    <ol>
+     <li><a href=#terminology-0><span class=secno>2.5.1 </span>Terminology</a></li>
+     <li><a href=#resolving-urls><span class=secno>2.5.2 </span>Resolving URLs</a></li>
+     <li><a href=#dynamic-changes-to-base-urls><span class=secno>2.5.3 </span>Dynamic changes to base URLs</a></ol></li>
+   <li><a href=#fetching-resources><span class=secno>2.6 </span>Fetching resources</a>
+    <ol>
+     <li><a href=#terminology-1><span class=secno>2.6.1 </span>Terminology</a></li>
+     <li><a href=#processing-model><span class=secno>2.6.2 </span>Processing model</a></li>
+     <li><a href=#encrypted-http-and-related-security-concerns><span class=secno>2.6.3 </span>Encrypted HTTP and related security concerns</a></li>
+     <li><a href=#content-type-sniffing><span class=secno>2.6.4 </span>Determining the type of a resource</a></li>
+     <li><a href=#extracting-character-encodings-from-meta-elements><span class=secno>2.6.5 </span>Extracting character encodings from <code>meta</code> elements</a></li>
+     <li><a href=#cors-settings-attributes><span class=secno>2.6.6 </span>CORS settings attributes</a></li>
+     <li><a href=#cors-enabled-fetch><span class=secno>2.6.7 </span>CORS-enabled fetch</a></ol></li>
+   <li><a href=#common-dom-interfaces><span class=secno>2.7 </span>Common DOM interfaces</a>
+    <ol>
+     <li><a href=#reflecting-content-attributes-in-idl-attributes><span class=secno>2.7.1 </span>Reflecting content attributes in IDL attributes</a></li>
+     <li><a href=#collections-0><span class=secno>2.7.2 </span>Collections</a>
+      <ol>
+       <li><a href=#htmlallcollection-0><span class=secno>2.7.2.1 </span>HTMLAllCollection</a></li>
+       <li><a href=#htmlformcontrolscollection-0><span class=secno>2.7.2.2 </span>HTMLFormControlsCollection</a></li>
+       <li><a href=#htmloptionscollection-0><span class=secno>2.7.2.3 </span>HTMLOptionsCollection</a></li>
+       <li><a href=#htmlpropertiescollection-0><span class=secno>2.7.2.4 </span>HTMLPropertiesCollection</a></ol></li>
+     <li><a href=#domstringmap-0><span class=secno>2.7.3 </span>DOMStringMap</a></li>
+     <li><a href=#domelementmap-0><span class=secno>2.7.4 </span>DOMElementMap</a></li>
+     <li><a href=#transferable-objects><span class=secno>2.7.5 </span>Transferable objects</a></li>
+     <li><a href=#safe-passing-of-structured-data><span class=secno>2.7.6 </span>Safe passing of structured data</a></li>
+     <li><a href=#callbacks><span class=secno>2.7.7 </span>Callbacks</a></li>
+     <li><a href=#garbage-collection><span class=secno>2.7.8 </span>Garbage collection</a></ol></li>
+   <li><a href=#namespaces><span class=secno>2.8 </span>Namespaces</a></ol></li>
+ <li><a href=#dom><span class=secno>3 </span>Semantics, structure, and APIs of HTML documents</a>
+  <ol>
+   <li><a href=#documents><span class=secno>3.1 </span>Documents</a>
+    <ol>
+     <li><a href=#the-document-object><span class=secno>3.1.1 </span>The <code>Document</code> object</a></li>
+     <li><a href=#security-document><span class=secno>3.1.2 </span>Security</a></li>
+     <li><a href=#resource-metadata-management><span class=secno>3.1.3 </span>Resource metadata management</a></li>
+     <li><a href=#dom-tree-accessors><span class=secno>3.1.4 </span>DOM tree accessors</a></li>
+     <li><a href=#loading-xml-documents><span class=secno>3.1.5 </span>Loading XML documents</a></ol></li>
+   <li><a href=#elements><span class=secno>3.2 </span>Elements</a>
+    <ol>
+     <li><a href=#semantics-0><span class=secno>3.2.1 </span>Semantics</a></li>
+     <li><a href=#elements-in-the-dom><span class=secno>3.2.2 </span>Elements in the DOM</a></li>
+     <li><a href=#element-definitions><span class=secno>3.2.3 </span>Element definitions</a>
+      <ol>
+       <li><a href=#attributes><span class=secno>3.2.3.1 </span>Attributes</a></ol></li>
+     <li><a href=#content-models><span class=secno>3.2.4 </span>Content models</a>
+      <ol>
+       <li><a href=#kinds-of-content><span class=secno>3.2.4.1 </span>Kinds of content</a>
+        <ol>
+         <li><a href=#metadata-content-0><span class=secno>3.2.4.1.1 </span>Metadata content</a></li>
+         <li><a href=#flow-content-0><span class=secno>3.2.4.1.2 </span>Flow content</a></li>
+         <li><a href=#sectioning-content-0><span class=secno>3.2.4.1.3 </span>Sectioning content</a></li>
+         <li><a href=#heading-content-0><span class=secno>3.2.4.1.4 </span>Heading content</a></li>
+         <li><a href=#phrasing-content-0><span class=secno>3.2.4.1.5 </span>Phrasing content</a></li>
+         <li><a href=#embedded-content-0><span class=secno>3.2.4.1.6 </span>Embedded content</a></li>
+         <li><a href=#interactive-content-0><span class=secno>3.2.4.1.7 </span>Interactive content</a></li>
+         <li><a href=#palpable-content-0><span class=secno>3.2.4.1.8 </span>Palpable content</a></li>
+         <li><a href=#script-supporting-elements-0><span class=secno>3.2.4.1.9 </span>Script-supporting elements</a></ol></li>
+       <li><a href=#transparent-content-models><span class=secno>3.2.4.2 </span>Transparent content models</a></li>
+       <li><a href=#paragraphs><span class=secno>3.2.4.3 </span>Paragraphs</a></ol></li>
+     <li><a href=#global-attributes><span class=secno>3.2.5 </span>Global attributes</a>
+      <ol>
+       <li><a href=#the-id-attribute><span class=secno>3.2.5.1 </span>The <code>id</code> attribute</a></li>
+       <li><a href=#the-title-attribute><span class=secno>3.2.5.2 </span>The <code title=attr-title>title</code> attribute</a></li>
+       <li><a href=#the-lang-and-xml:lang-attributes><span class=secno>3.2.5.3 </span>The <code title=attr-lang>lang</code> and <code title=attr-xml-lang>xml:lang</code> attributes</a></li>
+       <li><a href=#the-translate-attribute><span class=secno>3.2.5.4 </span>The <code title=attr-translate>translate</code> attribute</a></li>
+       <li><a href=#the-xml:base-attribute-(xml-only)><span class=secno>3.2.5.5 </span>The <code>xml:base</code> attribute (XML only)</a></li>
+       <li><a href=#the-dir-attribute><span class=secno>3.2.5.6 </span>The <code>dir</code> attribute</a></li>
+       <li><a href=#classes><span class=secno>3.2.5.7 </span>The <code>class</code> attribute</a></li>
+       <li><a href=#the-style-attribute><span class=secno>3.2.5.8 </span>The <code>style</code> attribute</a></li>
+       <li><a href=#embedding-custom-non-visible-data-with-the-data-*-attributes><span class=secno>3.2.5.9 </span>Embedding custom non-visible data with the <code title=attr-data-*>data-*</code> attributes</a></ol></li>
+     <li><a href=#requirements-relating-to-bidirectional-algorithm-formatting-characters><span class=secno>3.2.6 </span>Requirements relating to bidirectional-algorithm formatting characters</a></li>
+     <li><a href=#wai-aria><span class=secno>3.2.7 </span>WAI-ARIA</a></ol></ol></li>
+ <li><a href=#semantics><span class=secno>4 </span>The elements of HTML</a>
+  <ol>
+   <li><a href=#the-root-element><span class=secno>4.1 </span>The root element</a>
+    <ol>
+     <li><a href=#the-html-element><span class=secno>4.1.1 </span>The <code>html</code> element</a></ol></li>
+   <li><a href=#document-metadata><span class=secno>4.2 </span>Document metadata</a>
+    <ol>
+     <li><a href=#the-head-element><span class=secno>4.2.1 </span>The <code>head</code> element</a></li>
+     <li><a href=#the-title-element><span class=secno>4.2.2 </span>The <code>title</code> element</a></li>
+     <li><a href=#the-base-element><span class=secno>4.2.3 </span>The <code>base</code> element</a></li>
+     <li><a href=#the-link-element><span class=secno>4.2.4 </span>The <code>link</code> element</a></li>
+     <li><a href=#the-meta-element><span class=secno>4.2.5 </span>The <code>meta</code> element</a>
+      <ol>
+       <li><a href=#standard-metadata-names><span class=secno>4.2.5.1 </span>Standard metadata names</a></li>
+       <li><a href=#other-metadata-names><span class=secno>4.2.5.2 </span>Other metadata names</a></li>
+       <li><a href=#pragma-directives><span class=secno>4.2.5.3 </span>Pragma directives</a></li>
+       <li><a href=#other-pragma-directives><span class=secno>4.2.5.4 </span>Other pragma directives</a></li>
+       <li><a href=#charset><span class=secno>4.2.5.5 </span>Specifying the document's character encoding</a></ol></li>
+     <li><a href=#the-style-element><span class=secno>4.2.6 </span>The <code>style</code> element</a></li>
+     <li><a href=#styling><span class=secno>4.2.7 </span>Styling</a></ol></li>
+   <li><a href=#sections><span class=secno>4.3 </span>Sections</a>
+    <ol>
+     <li><a href=#the-body-element><span class=secno>4.3.1 </span>The <code>body</code> element</a></li>
+     <li><a href=#the-article-element><span class=secno>4.3.2 </span>The <code>article</code> element</a></li>
+     <li><a href=#the-section-element><span class=secno>4.3.3 </span>The <code>section</code> element</a></li>
+     <li><a href=#the-nav-element><span class=secno>4.3.4 </span>The <code>nav</code> element</a></li>
+     <li><a href=#the-aside-element><span class=secno>4.3.5 </span>The <code>aside</code> element</a></li>
+     <li><a href=#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements><span class=secno>4.3.6 </span>The <code>h1</code>, <code>h2</code>, <code>h3</code>, <code>h4</code>, <code>h5</code>, and
+  <code>h6</code> elements</a></li>
+     <li><a href=#the-hgroup-element><span class=secno>4.3.7 </span>The <code>hgroup</code> element</a></li>
+     <li><a href=#the-header-element><span class=secno>4.3.8 </span>The <code>header</code> element</a></li>
+     <li><a href=#the-footer-element><span class=secno>4.3.9 </span>The <code>footer</code> element</a></li>
+     <li><a href=#the-address-element><span class=secno>4.3.10 </span>The <code>address</code> element</a></li>
+     <li><a href=#headings-and-sections><span class=secno>4.3.11 </span>Headings and sections</a>
+      <ol>
+       <li><a href=#outlines><span class=secno>4.3.11.1 </span>Creating an outline</a></li>
+       <li><a href=#sample-outlines><span class=secno>4.3.11.2 </span>Sample outlines</a></ol></li>
+     <li><a href=#usage-summary-0><span class=secno>4.3.12 </span>Usage summary</a>
+      <ol>
+       <li><a href=#article-or-section><span class=secno>4.3.12.1 </span>Article or section?</a></ol></ol></li>
+   <li><a href=#grouping-content><span class=secno>4.4 </span>Grouping content</a>
+    <ol>
+     <li><a href=#the-p-element><span class=secno>4.4.1 </span>The <code>p</code> element</a></li>
+     <li><a href=#the-hr-element><span class=secno>4.4.2 </span>The <code>hr</code> element</a></li>
+     <li><a href=#the-pre-element><span class=secno>4.4.3 </span>The <code>pre</code> element</a></li>
+     <li><a href=#the-blockquote-element><span class=secno>4.4.4 </span>The <code>blockquote</code> element</a></li>
+     <li><a href=#the-ol-element><span class=secno>4.4.5 </span>The <code>ol</code> element</a></li>
+     <li><a href=#the-ul-element><span class=secno>4.4.6 </span>The <code>ul</code> element</a></li>
+     <li><a href=#the-li-element><span class=secno>4.4.7 </span>The <code>li</code> element</a></li>
+     <li><a href=#the-dl-element><span class=secno>4.4.8 </span>The <code>dl</code> element</a></li>
+     <li><a href=#the-dt-element><span class=secno>4.4.9 </span>The <code>dt</code> element</a></li>
+     <li><a href=#the-dd-element><span class=secno>4.4.10 </span>The <code>dd</code> element</a></li>
+     <li><a href=#the-figure-element><span class=secno>4.4.11 </span>The <code>figure</code> element</a></li>
+     <li><a href=#the-figcaption-element><span class=secno>4.4.12 </span>The <code>figcaption</code> element</a></li>
+     <li><a href=#the-main-element><span class=secno>4.4.13 </span>The <code>main</code> element</a></li>
+     <li><a href=#the-div-element><span class=secno>4.4.14 </span>The <code>div</code> element</a></ol></li>
+   <li><a href=#text-level-semantics><span class=secno>4.5 </span>Text-level semantics</a>
+    <ol>
+     <li><a href=#the-a-element><span class=secno>4.5.1 </span>The <code>a</code> element</a></li>
+     <li><a href=#the-em-element><span class=secno>4.5.2 </span>The <code>em</code> element</a></li>
+     <li><a href=#the-strong-element><span class=secno>4.5.3 </span>The <code>strong</code> element</a></li>
+     <li><a href=#the-small-element><span class=secno>4.5.4 </span>The <code>small</code> element</a></li>
+     <li><a href=#the-s-element><span class=secno>4.5.5 </span>The <code>s</code> element</a></li>
+     <li><a href=#the-cite-element><span class=secno>4.5.6 </span>The <code>cite</code> element</a></li>
+     <li><a href=#the-q-element><span class=secno>4.5.7 </span>The <code>q</code> element</a></li>
+     <li><a href=#the-dfn-element><span class=secno>4.5.8 </span>The <code>dfn</code> element</a></li>
+     <li><a href=#the-abbr-element><span class=secno>4.5.9 </span>The <code>abbr</code> element</a></li>
+     <li><a href=#the-data-element><span class=secno>4.5.10 </span>The <code>data</code> element</a></li>
+     <li><a href=#the-time-element><span class=secno>4.5.11 </span>The <code>time</code> element</a></li>
+     <li><a href=#the-code-element><span class=secno>4.5.12 </span>The <code>code</code> element</a></li>
+     <li><a href=#the-var-element><span class=secno>4.5.13 </span>The <code>var</code> element</a></li>
+     <li><a href=#the-samp-element><span class=secno>4.5.14 </span>The <code>samp</code> element</a></li>
+     <li><a href=#the-kbd-element><span class=secno>4.5.15 </span>The <code>kbd</code> element</a></li>
+     <li><a href=#the-sub-and-sup-elements><span class=secno>4.5.16 </span>The <code>sub</code> and <code>sup</code> elements</a></li>
+     <li><a href=#the-i-element><span class=secno>4.5.17 </span>The <code>i</code> element</a></li>
+     <li><a href=#the-b-element><span class=secno>4.5.18 </span>The <code>b</code> element</a></li>
+     <li><a href=#the-u-element><span class=secno>4.5.19 </span>The <code>u</code> element</a></li>
+     <li><a href=#the-mark-element><span class=secno>4.5.20 </span>The <code>mark</code> element</a></li>
+     <li><a href=#the-ruby-element><span class=secno>4.5.21 </span>The <code>ruby</code> element</a></li>
+     <li><a href=#the-rt-element><span class=secno>4.5.22 </span>The <code>rt</code> element</a></li>
+     <li><a href=#the-rp-element><span class=secno>4.5.23 </span>The <code>rp</code> element</a></li>
+     <li><a href=#the-bdi-element><span class=secno>4.5.24 </span>The <code>bdi</code> element</a></li>
+     <li><a href=#the-bdo-element><span class=secno>4.5.25 </span>The <code>bdo</code> element</a></li>
+     <li><a href=#the-span-element><span class=secno>4.5.26 </span>The <code>span</code> element</a></li>
+     <li><a href=#the-br-element><span class=secno>4.5.27 </span>The <code>br</code> element</a></li>
+     <li><a href=#the-wbr-element><span class=secno>4.5.28 </span>The <code>wbr</code> element</a></li>
+     <li><a href=#usage-summary><span class=secno>4.5.29 </span>Usage summary</a></ol></li>
+   <li><a href=#edits><span class=secno>4.6 </span>Edits</a>
+    <ol>
+     <li><a href=#the-ins-element><span class=secno>4.6.1 </span>The <code>ins</code> element</a></li>
+     <li><a href=#the-del-element><span class=secno>4.6.2 </span>The <code>del</code> element</a></li>
+     <li><a href=#attributes-common-to-ins-and-del-elements><span class=secno>4.6.3 </span>Attributes common to <code>ins</code> and <code>del</code> elements</a></li>
+     <li><a href=#edits-and-paragraphs><span class=secno>4.6.4 </span>Edits and paragraphs</a></li>
+     <li><a href=#edits-and-lists><span class=secno>4.6.5 </span>Edits and lists</a></li>
+     <li><a href=#edits-and-tables><span class=secno>4.6.6 </span>Edits and tables</a></ol></li>
+   <li><a href=#embedded-content-1><span class=secno>4.7 </span>Embedded content</a>
+    <ol>
+     <li><a href=#the-img-element><span class=secno>4.7.1 </span>The <code>img</code> element</a>
+      <ol>
+       <li><a href=#alt><span class=secno>4.7.1.1 </span>Requirements for providing text to act as an alternative for images</a>
+        <ol>
+         <li><a href=#general-guidelines><span class=secno>4.7.1.1.1 </span>General guidelines</a></li>
+         <li><a href=#a-link-or-button-containing-nothing-but-the-image><span class=secno>4.7.1.1.2 </span>A link or button containing nothing but the image</a></li>
+         <li><a href=#a-phrase-or-paragraph-with-an-alternative-graphical-representation:-charts,-diagrams,-graphs,-maps,-illustrations><span class=secno>4.7.1.1.3 </span>A phrase or paragraph with an alternative graphical representation: charts, diagrams, graphs, maps, illustrations</a></li>
+         <li><a href=#a-short-phrase-or-label-with-an-alternative-graphical-representation:-icons,-logos><span class=secno>4.7.1.1.4 </span>A short phrase or label with an alternative graphical representation: icons, logos</a></li>
+         <li><a href=#text-that-has-been-rendered-to-a-graphic-for-typographical-effect><span class=secno>4.7.1.1.5 </span>Text that has been rendered to a graphic for typographical effect</a></li>
+         <li><a href=#a-graphical-representation-of-some-of-the-surrounding-text><span class=secno>4.7.1.1.6 </span>A graphical representation of some of the surrounding text</a></li>
+         <li><a href="#a-purely-decorative-image-that-doesn't-add-any-information"><span class=secno>4.7.1.1.7 </span>A purely decorative image that doesn't add any information</a></li>
+         <li><a href=#a-group-of-images-that-form-a-single-larger-picture-with-no-links><span class=secno>4.7.1.1.8 </span>A group of images that form a single larger picture with no links</a></li>
+         <li><a href=#a-group-of-images-that-form-a-single-larger-picture-with-links><span class=secno>4.7.1.1.9 </span>A group of images that form a single larger picture with links</a></li>
+         <li><a href=#a-key-part-of-the-content><span class=secno>4.7.1.1.10 </span>A key part of the content</a></li>
+         <li><a href=#an-image-not-intended-for-the-user><span class=secno>4.7.1.1.11 </span>An image not intended for the user</a></li>
+         <li><a href=#an-image-in-an-e-mail-or-private-document-intended-for-a-specific-person-who-is-known-to-be-able-to-view-images><span class=secno>4.7.1.1.12 </span>An image in an e-mail or private document intended for a specific person who is known to be able to view images</a></li>
+         <li><a href=#guidance-for-markup-generators><span class=secno>4.7.1.1.13 </span>Guidance for markup generators</a></li>
+         <li><a href=#guidance-for-conformance-checkers><span class=secno>4.7.1.1.14 </span>Guidance for conformance checkers</a></ol></li>
+       <li><a href=#adaptive-images><span class=secno>4.7.1.2 </span>Adaptive images</a></ol></li>
+     <li><a href=#the-iframe-element><span class=secno>4.7.2 </span>The <code>iframe</code> element</a></li>
+     <li><a href=#the-embed-element><span class=secno>4.7.3 </span>The <code>embed</code> element</a></li>
+     <li><a href=#the-object-element><span class=secno>4.7.4 </span>The <code>object</code> element</a></li>
+     <li><a href=#the-param-element><span class=secno>4.7.5 </span>The <code>param</code> element</a></li>
+     <li><a href=#the-video-element><span class=secno>4.7.6 </span>The <code>video</code> element</a></li>
+     <li><a href=#the-audio-element><span class=secno>4.7.7 </span>The <code>audio</code> element</a></li>
+     <li><a href=#the-source-element><span class=secno>4.7.8 </span>The <code>source</code> element</a></li>
+     <li><a href=#the-track-element><span class=secno>4.7.9 </span>The <code>track</code> element</a></li>
+     <li><a href=#media-elements><span class=secno>4.7.10 </span>Media elements</a>
+      <ol>
+       <li><a href=#error-codes><span class=secno>4.7.10.1 </span>Error codes</a></li>
+       <li><a href=#location-of-the-media-resource><span class=secno>4.7.10.2 </span>Location of the media resource</a></li>
+       <li><a href=#mime-types><span class=secno>4.7.10.3 </span>MIME types</a></li>
+       <li><a href=#network-states><span class=secno>4.7.10.4 </span>Network states</a></li>
+       <li><a href=#loading-the-media-resource><span class=secno>4.7.10.5 </span>Loading the media resource</a></li>
+       <li><a href=#offsets-into-the-media-resource><span class=secno>4.7.10.6 </span>Offsets into the media resource</a></li>
+       <li><a href=#ready-states><span class=secno>4.7.10.7 </span>Ready states</a></li>
+       <li><a href=#playing-the-media-resource><span class=secno>4.7.10.8 </span>Playing the media resource</a></li>
+       <li><a href=#seeking><span class=secno>4.7.10.9 </span>Seeking</a></li>
+       <li><a href=#media-resources-with-multiple-media-tracks><span class=secno>4.7.10.10 </span>Media resources with multiple media tracks</a>
+        <ol>
+         <li><a href=#audiotracklist-and-videotracklist-objects><span class=secno>4.7.10.10.1 </span><code>AudioTrackList</code> and <code>VideoTrackList</code> objects</a></li>
+         <li><a href=#selecting-specific-audio-and-video-tracks-declaratively><span class=secno>4.7.10.10.2 </span>Selecting specific audio and video tracks declaratively</a></ol></li>
+       <li><a href=#synchronising-multiple-media-elements><span class=secno>4.7.10.11 </span>Synchronising multiple media elements</a>
+        <ol>
+         <li><a href=#introduction-0><span class=secno>4.7.10.11.1 </span>Introduction</a></li>
+         <li><a href=#media-controllers><span class=secno>4.7.10.11.2 </span>Media controllers</a></li>
+         <li><a href=#assigning-a-media-controller-declaratively><span class=secno>4.7.10.11.3 </span>Assigning a media controller declaratively</a></ol></li>
+       <li><a href=#timed-text-tracks><span class=secno>4.7.10.12 </span>Timed text tracks</a>
+        <ol>
+         <li><a href=#text-track-model><span class=secno>4.7.10.12.1 </span>Text track model</a></li>
+         <li><a href=#sourcing-in-band-text-tracks><span class=secno>4.7.10.12.2 </span>Sourcing in-band text tracks</a></li>
+         <li><a href=#sourcing-out-of-band-text-tracks><span class=secno>4.7.10.12.3 </span>Sourcing out-of-band text tracks</a></li>
+         <li><a href=#guidelines-for-exposing-cues-in-various-formats-as-text-track-cues><span class=secno>4.7.10.12.4 </span>Guidelines for exposing cues in various formats as text track cues</a></li>
+         <li><a href=#text-track-api><span class=secno>4.7.10.12.5 </span>Text track API</a></li>
+         <li><a href=#text-tracks-describing-chapters><span class=secno>4.7.10.12.6 </span>Text tracks describing chapters</a></li>
+         <li><a href=#cue-events><span class=secno>4.7.10.12.7 </span>Event definitions</a></ol></li>
+       <li><a href=#user-interface><span class=secno>4.7.10.13 </span>User interface</a></li>
+       <li><a href=#time-ranges><span class=secno>4.7.10.14 </span>Time ranges</a></li>
+       <li><a href=#event-definitions><span class=secno>4.7.10.15 </span>Event definitions</a></li>
+       <li><a href=#mediaevents><span class=secno>4.7.10.16 </span>Event summary</a></li>
+       <li><a href=#security-and-privacy-considerations><span class=secno>4.7.10.17 </span>Security and privacy considerations</a></li>
+       <li><a href=#best-practices-for-authors-using-media-elements><span class=secno>4.7.10.18 </span>Best practices for authors using media elements</a></li>
+       <li><a href=#best-practices-for-implementors-of-media-elements><span class=secno>4.7.10.19 </span>Best practices for implementors of media elements</a></ol></li>
+     <li><a href=#the-map-element><span class=secno>4.7.11 </span>The <code>map</code> element</a></li>
+     <li><a href=#the-area-element><span class=secno>4.7.12 </span>The <code>area</code> element</a></li>
+     <li><a href=#image-maps><span class=secno>4.7.13 </span>Image maps</a>
+      <ol>
+       <li><a href=#authoring><span class=secno>4.7.13.1 </span>Authoring</a></li>
+       <li><a href=#processing-model-0><span class=secno>4.7.13.2 </span>Processing model</a></ol></li>
+     <li><a href=#mathml><span class=secno>4.7.14 </span>MathML</a></li>
+     <li><a href=#svg-0><span class=secno>4.7.15 </span>SVG</a></li>
+     <li><a href=#dimension-attributes><span class=secno>4.7.16 </span>Dimension attributes</a></ol></li>
+   <li><a href=#links><span class=secno>4.8 </span>Links</a>
+    <ol>
+     <li><a href=#introduction-1><span class=secno>4.8.1 </span>Introduction</a></li>
+     <li><a href=#links-created-by-a-and-area-elements><span class=secno>4.8.2 </span>Links created by <code>a</code> and <code>area</code> elements</a></li>
+     <li><a href=#following-hyperlinks-0><span class=secno>4.8.3 </span>Following hyperlinks</a></li>
+     <li><a href=#downloading-resources><span class=secno>4.8.4 </span>Downloading resources</a>
+      <ol>
+       <li><a href=#hyperlink-auditing><span class=secno>4.8.4.1 </span>Hyperlink auditing</a></ol></li>
+     <li><a href=#linkTypes><span class=secno>4.8.5 </span>Link types</a>
+      <ol>
+       <li><a href=#rel-alternate><span class=secno>4.8.5.1 </span>Link type "<code>alternate</code>"</a></li>
+       <li><a href=#link-type-author><span class=secno>4.8.5.2 </span>Link type "<code>author</code>"</a></li>
+       <li><a href=#link-type-bookmark><span class=secno>4.8.5.3 </span>Link type "<code>bookmark</code>"</a></li>
+       <li><a href=#link-type-external><span class=secno>4.8.5.4 </span>Link type "<code>external</code>"</a></li>
+       <li><a href=#link-type-help><span class=secno>4.8.5.5 </span>Link type "<code>help</code>"</a></li>
+       <li><a href=#rel-icon><span class=secno>4.8.5.6 </span>Link type "<code>icon</code>"</a></li>
+       <li><a href=#link-type-license><span class=secno>4.8.5.7 </span>Link type "<code>license</code>"</a></li>
+       <li><a href=#link-type-nofollow><span class=secno>4.8.5.8 </span>Link type "<code>nofollow</code>"</a></li>
+       <li><a href=#link-type-noreferrer><span class=secno>4.8.5.9 </span>Link type "<code>noreferrer</code>"</a></li>
+       <li><a href=#link-type-pingback><span class=secno>4.8.5.10 </span>Link type "<code>pingback</code>"</a></li>
+       <li><a href=#link-type-prefetch><span class=secno>4.8.5.11 </span>Link type "<code>prefetch</code>"</a></li>
+       <li><a href=#link-type-search><span class=secno>4.8.5.12 </span>Link type "<code>search</code>"</a></li>
+       <li><a href=#link-type-sidebar><span class=secno>4.8.5.13 </span>Link type "<code>sidebar</code>"</a></li>
+       <li><a href=#link-type-stylesheet><span class=secno>4.8.5.14 </span>Link type "<code>stylesheet</code>"</a></li>
+       <li><a href=#link-type-tag><span class=secno>4.8.5.15 </span>Link type "<code>tag</code>"</a></li>
+       <li><a href=#sequential-link-types><span class=secno>4.8.5.16 </span>Sequential link types</a>
+        <ol>
+         <li><a href=#link-type-next><span class=secno>4.8.5.16.1 </span>Link type "<code>next</code>"</a></li>
+         <li><a href=#link-type-prev><span class=secno>4.8.5.16.2 </span>Link type "<code>prev</code>"</a></ol></li>
+       <li><a href=#other-link-types><span class=secno>4.8.5.17 </span>Other link types</a></ol></ol></li>
+   <li><a href=#tabular-data><span class=secno>4.9 </span>Tabular data</a>
+    <ol>
+     <li><a href=#the-table-element><span class=secno>4.9.1 </span>The <code>table</code> element</a>
+      <ol>
+       <li><a href=#table-descriptions-techniques><span class=secno>4.9.1.1 </span>Techniques for describing tables</a></li>
+       <li><a href=#table-layout-techniques><span class=secno>4.9.1.2 </span>Techniques for table design</a></ol></li>
+     <li><a href=#the-caption-element><span class=secno>4.9.2 </span>The <code>caption</code> element</a></li>
+     <li><a href=#the-colgroup-element><span class=secno>4.9.3 </span>The <code>colgroup</code> element</a></li>
+     <li><a href=#the-col-element><span class=secno>4.9.4 </span>The <code>col</code> element</a></li>
+     <li><a href=#the-tbody-element><span class=secno>4.9.5 </span>The <code>tbody</code> element</a></li>
+     <li><a href=#the-thead-element><span class=secno>4.9.6 </span>The <code>thead</code> element</a></li>
+     <li><a href=#the-tfoot-element><span class=secno>4.9.7 </span>The <code>tfoot</code> element</a></li>
+     <li><a href=#the-tr-element><span class=secno>4.9.8 </span>The <code>tr</code> element</a></li>
+     <li><a href=#the-td-element><span class=secno>4.9.9 </span>The <code>td</code> element</a></li>
+     <li><a href=#the-th-element><span class=secno>4.9.10 </span>The <code>th</code> element</a></li>
+     <li><a href=#attributes-common-to-td-and-th-elements><span class=secno>4.9.11 </span>Attributes common to <code>td</code> and <code>th</code> elements</a></li>
+     <li><a href=#processing-model-1><span class=secno>4.9.12 </span>Processing model</a>
+      <ol>
+       <li><a href=#forming-a-table><span class=secno>4.9.12.1 </span>Forming a table</a></li>
+       <li><a href=#header-and-data-cell-semantics><span class=secno>4.9.12.2 </span>Forming relationships between data cells and header cells</a></ol></li>
+     <li><a href=#table-sorting-model><span class=secno>4.9.13 </span>Table sorting model</a></li>
+     <li><a href=#examples><span class=secno>4.9.14 </span>Examples</a></ol></li>
+   <li><a href=#forms><span class=secno>4.10 </span>Forms</a>
+    <ol>
+     <li><a href=#introduction-2><span class=secno>4.10.1 </span>Introduction</a>
+      <ol>
+       <li><a href="#writing-a-form's-user-interface"><span class=secno>4.10.1.1 </span>Writing a form's user interface</a></li>
+       <li><a href=#implementing-the-server-side-processing-for-a-form><span class=secno>4.10.1.2 </span>Implementing the server-side processing for a form</a></li>
+       <li><a href=#configuring-a-form-to-communicate-with-a-server><span class=secno>4.10.1.3 </span>Configuring a form to communicate with a server</a></li>
+       <li><a href=#client-side-form-validation><span class=secno>4.10.1.4 </span>Client-side form validation</a></li>
+       <li><a href=#enabling-client-side-automatic-filling-of-form-controls><span class=secno>4.10.1.5 </span>Enabling client-side automatic filling of form controls</a></li>
+       <li><a href=#improving-the-user-experience-on-mobile-devices><span class=secno>4.10.1.6 </span>Improving the user experience on mobile devices</a></li>
+       <li><a href=#the-difference-between-the-field-type,-the-autofill-field-name,-and-the-input-modality><span class=secno>4.10.1.7 </span>The difference between the field type, the autofill field name, and the input modality</a></li>
+       <li><a href=#input-author-notes><span class=secno>4.10.1.8 </span>Date, time, and number formats</a></ol></li>
+     <li><a href=#categories><span class=secno>4.10.2 </span>Categories</a></li>
+     <li><a href=#the-form-element><span class=secno>4.10.3 </span>The <code>form</code> element</a></li>
+     <li><a href=#the-label-element><span class=secno>4.10.4 </span>The <code>label</code> element</a></li>
+     <li><a href=#the-input-element><span class=secno>4.10.5 </span>The <code>input</code> element</a>
+      <ol>
+       <li><a href=#states-of-the-type-attribute><span class=secno>4.10.5.1 </span>States of the <code title=attr-input-type>type</code> attribute</a>
+        <ol>
+         <li><a href="#hidden-state-(type=hidden)"><span class=secno>4.10.5.1.1 </span>Hidden state (<code title="">type=hidden</code>)</a></li>
+         <li><a href="#text-(type=text)-state-and-search-state-(type=search)"><span class=secno>4.10.5.1.2 </span>Text (<code title="">type=text</code>) state and Search state (<code title="">type=search</code>)</a></li>
+         <li><a href="#telephone-state-(type=tel)"><span class=secno>4.10.5.1.3 </span>Telephone state (<code title="">type=tel</code>)</a></li>
+         <li><a href="#url-state-(type=url)"><span class=secno>4.10.5.1.4 </span>URL state (<code title="">type=url</code>)</a></li>
+         <li><a href="#e-mail-state-(type=email)"><span class=secno>4.10.5.1.5 </span>E-mail state (<code title="">type=email</code>)</a></li>
+         <li><a href="#password-state-(type=password)"><span class=secno>4.10.5.1.6 </span>Password state (<code title="">type=password</code>)</a></li>
+         <li><a href="#date-and-time-state-(type=datetime)"><span class=secno>4.10.5.1.7 </span>Date and Time state (<code title="">type=datetime</code>)</a></li>
+         <li><a href="#date-state-(type=date)"><span class=secno>4.10.5.1.8 </span>Date state (<code title="">type=date</code>)</a></li>
+         <li><a href="#month-state-(type=month)"><span class=secno>4.10.5.1.9 </span>Month state (<code title="">type=month</code>)</a></li>
+         <li><a href="#week-state-(type=week)"><span class=secno>4.10.5.1.10 </span>Week state (<code title="">type=week</code>)</a></li>
+         <li><a href="#time-state-(type=time)"><span class=secno>4.10.5.1.11 </span>Time state (<code title="">type=time</code>)</a></li>
+         <li><a href="#local-date-and-time-state-(type=datetime-local)"><span class=secno>4.10.5.1.12 </span>Local Date and Time state (<code title="">type=datetime-local</code>)</a></li>
+         <li><a href="#number-state-(type=number)"><span class=secno>4.10.5.1.13 </span>Number state (<code title="">type=number</code>)</a></li>
+         <li><a href="#range-state-(type=range)"><span class=secno>4.10.5.1.14 </span>Range state (<code title="">type=range</code>)</a></li>
+         <li><a href="#color-state-(type=color)"><span class=secno>4.10.5.1.15 </span>Color state (<code title="">type=color</code>)</a></li>
+         <li><a href="#checkbox-state-(type=checkbox)"><span class=secno>4.10.5.1.16 </span>Checkbox state (<code title="">type=checkbox</code>)</a></li>
+         <li><a href="#radio-button-state-(type=radio)"><span class=secno>4.10.5.1.17 </span>Radio Button state (<code title="">type=radio</code>)</a></li>
+         <li><a href="#file-upload-state-(type=file)"><span class=secno>4.10.5.1.18 </span>File Upload state (<code title="">type=file</code>)</a></li>
+         <li><a href="#submit-button-state-(type=submit)"><span class=secno>4.10.5.1.19 </span>Submit Button state (<code title="">type=submit</code>)</a></li>
+         <li><a href="#image-button-state-(type=image)"><span class=secno>4.10.5.1.20 </span>Image Button state (<code title="">type=image</code>)</a></li>
+         <li><a href="#reset-button-state-(type=reset)"><span class=secno>4.10.5.1.21 </span>Reset Button state (<code title="">type=reset</code>)</a></li>
+         <li><a href="#button-state-(type=button)"><span class=secno>4.10.5.1.22 </span>Button state (<code title="">type=button</code>)</a></ol></li>
+       <li><a href=#input-impl-notes><span class=secno>4.10.5.2 </span>Implemention notes regarding localization of form controls</a></li>
+       <li><a href=#common-input-element-attributes><span class=secno>4.10.5.3 </span>Common <code>input</code> element attributes</a>
+        <ol>
+         <li><a href=#the-maxlength-and-minlength-attributes><span class=secno>4.10.5.3.1 </span>The <code title=attr-input-maxlength>maxlength</code> and <code title=attr-input-minlength>minlength</code> attributes</a></li>
+         <li><a href=#the-size-attribute><span class=secno>4.10.5.3.2 </span>The <code title=attr-input-size>size</code> attribute</a></li>
+         <li><a href=#the-readonly-attribute><span class=secno>4.10.5.3.3 </span>The <code title=attr-input-readonly>readonly</code> attribute</a></li>
+         <li><a href=#the-required-attribute><span class=secno>4.10.5.3.4 </span>The <code title=attr-input-required>required</code> attribute</a></li>
+         <li><a href=#the-multiple-attribute><span class=secno>4.10.5.3.5 </span>The <code title=attr-input-multiple>multiple</code> attribute</a></li>
+         <li><a href=#the-pattern-attribute><span class=secno>4.10.5.3.6 </span>The <code title=attr-input-pattern>pattern</code> attribute</a></li>
+         <li><a href=#the-min-and-max-attributes><span class=secno>4.10.5.3.7 </span>The <code title=attr-input-min>min</code> and <code title=attr-input-max>max</code> attributes</a></li>
+         <li><a href=#the-step-attribute><span class=secno>4.10.5.3.8 </span>The <code title=attr-input-step>step</code> attribute</a></li>
+         <li><a href=#the-list-attribute><span class=secno>4.10.5.3.9 </span>The <code title=attr-input-list>list</code> attribute</a></li>
+         <li><a href=#the-placeholder-attribute><span class=secno>4.10.5.3.10 </span>The <code title=attr-input-placeholder>placeholder</code> attribute</a></ol></li>
+       <li><a href=#common-input-element-apis><span class=secno>4.10.5.4 </span>Common <code>input</code> element APIs</a></li>
+       <li><a href=#common-event-behaviors><span class=secno>4.10.5.5 </span>Common event behaviors</a></ol></li>
+     <li><a href=#the-button-element><span class=secno>4.10.6 </span>The <code>button</code> element</a></li>
+     <li><a href=#the-select-element><span class=secno>4.10.7 </span>The <code>select</code> element</a></li>
+     <li><a href=#the-datalist-element><span class=secno>4.10.8 </span>The <code>datalist</code> element</a></li>
+     <li><a href=#the-optgroup-element><span class=secno>4.10.9 </span>The <code>optgroup</code> element</a></li>
+     <li><a href=#the-option-element><span class=secno>4.10.10 </span>The <code>option</code> element</a></li>
+     <li><a href=#the-textarea-element><span class=secno>4.10.11 </span>The <code>textarea</code> element</a></li>
+     <li><a href=#the-keygen-element><span class=secno>4.10.12 </span>The <code>keygen</code> element</a></li>
+     <li><a href=#the-output-element><span class=secno>4.10.13 </span>The <code>output</code> element</a></li>
+     <li><a href=#the-progress-element><span class=secno>4.10.14 </span>The <code>progress</code> element</a></li>
+     <li><a href=#the-meter-element><span class=secno>4.10.15 </span>The <code>meter</code> element</a></li>
+     <li><a href=#the-fieldset-element><span class=secno>4.10.16 </span>The <code>fieldset</code> element</a></li>
+     <li><a href=#the-legend-element><span class=secno>4.10.17 </span>The <code>legend</code> element</a></li>
+     <li><a href=#form-control-infrastructure><span class=secno>4.10.18 </span>Form control infrastructure</a>
+      <ol>
+       <li><a href="#a-form-control's-value"><span class=secno>4.10.18.1 </span>A form control's value</a></li>
+       <li><a href=#mutability><span class=secno>4.10.18.2 </span>Mutability</a></li>
+       <li><a href=#association-of-controls-and-forms><span class=secno>4.10.18.3 </span>Association of controls and forms</a></ol></li>
+     <li><a href=#attributes-common-to-form-controls><span class=secno>4.10.19 </span>Attributes common to form controls</a>
+      <ol>
+       <li><a href=#naming-form-controls:-the-name-attribute><span class=secno>4.10.19.1 </span>Naming form controls: the <code title=attr-fe-name>name</code> attribute</a></li>
+       <li><a href=#submitting-element-directionality:-the-dirname-attribute><span class=secno>4.10.19.2 </span>Submitting element directionality: the <code title=attr-fe-dirname>dirname</code> attribute</a></li>
+       <li><a href=#limiting-user-input-length:-the-maxlength-attribute><span class=secno>4.10.19.3 </span>Limiting user input length: the <code title=attr-fe-maxlength>maxlength</code> attribute</a></li>
+       <li><a href=#setting-minimum-input-length-requirements:-the-minlength-attribute><span class=secno>4.10.19.4 </span>Setting minimum input length requirements: the <code title=attr-fe-minlength>minlength</code> attribute</a></li>
+       <li><a href=#enabling-and-disabling-form-controls:-the-disabled-attribute><span class=secno>4.10.19.5 </span>Enabling and disabling form controls: the <code title=attr-fe-disabled>disabled</code> attribute</a></li>
+       <li><a href=#form-submission-0><span class=secno>4.10.19.6 </span>Form submission</a></li>
+       <li><a href=#autofocusing-a-form-control:-the-autofocus-attribute><span class=secno>4.10.19.7 </span>Autofocusing a form control: the <code title=attr-fe-autofocus>autofocus</code> attribute</a></li>
+       <li><a href=#input-modalities:-the-inputmode-attribute><span class=secno>4.10.19.8 </span>Input modalities: the <code title=attr-fe-inputmode>inputmode</code> attribute</a></li>
+       <li><a href=#autofilling-form-controls:-the-autocomplete-attribute><span class=secno>4.10.19.9 </span>Autofilling form controls: the <code title=attr-fe-autocomplete>autocomplete</code> attribute</a></ol></li>
+     <li><a href=#textFieldSelection><span class=secno>4.10.20 </span>APIs for the text field selections</a></li>
+     <li><a href=#constraints><span class=secno>4.10.21 </span>Constraints</a>
+      <ol>
+       <li><a href=#definitions><span class=secno>4.10.21.1 </span>Definitions</a></li>
+       <li><a href=#constraint-validation><span class=secno>4.10.21.2 </span>Constraint validation</a></li>
+       <li><a href=#the-constraint-validation-api><span class=secno>4.10.21.3 </span>The constraint validation API</a></li>
+       <li><a href=#security-forms><span class=secno>4.10.21.4 </span>Security</a></ol></li>
+     <li><a href=#form-submission><span class=secno>4.10.22 </span>Form submission</a>
+      <ol>
+       <li><a href=#introduction-3><span class=secno>4.10.22.1 </span>Introduction</a></li>
+       <li><a href=#implicit-submission><span class=secno>4.10.22.2 </span>Implicit submission</a></li>
+       <li><a href=#form-submission-algorithm><span class=secno>4.10.22.3 </span>Form submission algorithm</a></li>
+       <li><a href=#constructing-form-data-set><span class=secno>4.10.22.4 </span>Constructing the form data set</a></li>
+       <li><a href=#selecting-a-form-submission-encoding><span class=secno>4.10.22.5 </span>Selecting a form submission encoding</a></li>
+       <li><a href=#url-encoded-form-data><span class=secno>4.10.22.6 </span>URL-encoded form data</a></li>
+       <li><a href=#multipart-form-data><span class=secno>4.10.22.7 </span>Multipart form data</a></li>
+       <li><a href=#plain-text-form-data><span class=secno>4.10.22.8 </span>Plain text form data</a></ol></li>
+     <li><a href=#resetting-a-form><span class=secno>4.10.23 </span>Resetting a form</a></ol></li>
+   <li><a href=#interactive-elements><span class=secno>4.11 </span>Interactive elements</a>
+    <ol>
+     <li><a href=#the-details-element><span class=secno>4.11.1 </span>The <code>details</code> element</a></li>
+     <li><a href=#the-summary-element><span class=secno>4.11.2 </span>The <code>summary</code> element</a></li>
+     <li><a href=#the-menu-element><span class=secno>4.11.3 </span>The <code>menu</code> element</a></li>
+     <li><a href=#the-menuitem-element><span class=secno>4.11.4 </span>The <code>menuitem</code> element</a></li>
+     <li><a href=#context-menus><span class=secno>4.11.5 </span>Context menus</a>
+      <ol>
+       <li><a href=#declaring-a-context-menu><span class=secno>4.11.5.1 </span>Declaring a context menu</a></li>
+       <li><a href=#processing-model-2><span class=secno>4.11.5.2 </span>Processing model</a></li>
+       <li><a href=#event-definitions-0><span class=secno>4.11.5.3 </span>Event definitions</a></ol></li>
+     <li><a href=#commands><span class=secno>4.11.6 </span>Commands</a>
+      <ol>
+       <li><a href=#facets-0><span class=secno>4.11.6.1 </span>Facets</a></li>
+       <li><a href=#using-the-a-element-to-define-a-command><span class=secno>4.11.6.2 </span>Using the <code>a</code> element to define a command</a></li>
+       <li><a href=#using-the-button-element-to-define-a-command><span class=secno>4.11.6.3 </span>Using the <code>button</code> element to define a command</a></li>
+       <li><a href=#using-the-input-element-to-define-a-command><span class=secno>4.11.6.4 </span>Using the <code>input</code> element to define a command</a></li>
+       <li><a href=#using-the-option-element-to-define-a-command><span class=secno>4.11.6.5 </span>Using the <code>option</code> element to define a command</a></li>
+       <li><a href=#using-the-menuitem-element-to-define-a-command><span class=secno>4.11.6.6 </span>Using the <code>menuitem</code> element to define a
+  command</a></li>
+       <li><a href=#using-the-command-attribute-on-menuitem-elements-to-define-a-command-indirectly><span class=secno>4.11.6.7 </span>Using the <code title=attr-menuitem-command>command</code> attribute on <code>menuitem</code> elements to define
+  a command indirectly</a></li>
+       <li><a href=#using-the-accesskey-attribute-on-a-label-element-to-define-a-command><span class=secno>4.11.6.8 </span>Using the <code title=attr-accesskey>accesskey</code> attribute
+  on a <code>label</code> element to define a command</a></li>
+       <li><a href=#using-the-accesskey-attribute-on-a-legend-element-to-define-a-command><span class=secno>4.11.6.9 </span>Using the <code title=attr-accesskey>accesskey</code> attribute
+  on a <code>legend</code> element to define a command</a></li>
+       <li><a href=#using-the-accesskey-attribute-to-define-a-command-on-other-elements><span class=secno>4.11.6.10 </span>Using the <code title=attr-accesskey>accesskey</code>
+  attribute to define a command on other elements</a></ol></li>
+     <li><a href=#the-dialog-element><span class=secno>4.11.7 </span>The <code>dialog</code> element</a>
+      <ol>
+       <li><a href=#anchor-points><span class=secno>4.11.7.1 </span>Anchor points</a></ol></ol></li>
+   <li><a href=#scripting-1><span class=secno>4.12 </span>Scripting</a>
+    <ol>
+     <li><a href=#the-script-element><span class=secno>4.12.1 </span>The <code>script</code> element</a>
+      <ol>
+       <li><a href=#scriptingLanguages><span class=secno>4.12.1.1 </span>Scripting languages</a></li>
+       <li><a href=#restrictions-for-contents-of-script-elements><span class=secno>4.12.1.2 </span>Restrictions for contents of <code>script</code> elements</a></li>
+       <li><a href=#inline-documentation-for-external-scripts><span class=secno>4.12.1.3 </span>Inline documentation for external scripts</a></li>
+       <li><a href=#scriptTagXSLT><span class=secno>4.12.1.4 </span>Interaction of <code>script</code> elements and XSLT</a></ol></li>
+     <li><a href=#the-noscript-element><span class=secno>4.12.2 </span>The <code>noscript</code> element</a></li>
+     <li><a href=#the-template-element><span class=secno>4.12.3 </span>The <code>template</code> element</a>
+      <ol>
+       <li><a href=#template-XSLT-XPath><span class=secno>4.12.3.1 </span>Interaction of <code>template</code> elements with XSLT and XPath</a></ol></li>
+     <li><a href=#the-canvas-element><span class=secno>4.12.4 </span>The <code>canvas</code> element</a>
+      <ol>
+       <li><a href=#proxying-canvases-to-workers><span class=secno>4.12.4.1 </span>Proxying canvases to workers</a></li>
+       <li><a href=#2dcontext><span class=secno>4.12.4.2 </span>The 2D rendering context</a>
+        <ol>
+         <li><a href=#implementation-notes><span class=secno>4.12.4.2.1 </span>Implementation notes</a></li>
+         <li><a href=#the-canvas-state><span class=secno>4.12.4.2.2 </span>The canvas state</a></li>
+         <li><a href=#drawingstyle-objects><span class=secno>4.12.4.2.3 </span><code>DrawingStyle</code> objects</a></li>
+         <li><a href=#line-styles><span class=secno>4.12.4.2.4 </span>Line styles</a></li>
+         <li><a href=#text-styles><span class=secno>4.12.4.2.5 </span>Text styles</a></li>
+         <li><a href=#building-paths><span class=secno>4.12.4.2.6 </span>Building paths</a></li>
+         <li><a href=#path-objects><span class=secno>4.12.4.2.7 </span><code>Path</code> objects</a></li>
+         <li><a href=#transformations><span class=secno>4.12.4.2.8 </span>Transformations</a></li>
+         <li><a href=#image-sources-for-2d-rendering-contexts><span class=secno>4.12.4.2.9 </span>Image sources for 2D rendering contexts</a></li>
+         <li><a href=#fill-and-stroke-styles><span class=secno>4.12.4.2.10 </span>Fill and stroke styles</a></li>
+         <li><a href=#drawing-rectangles-to-the-bitmap><span class=secno>4.12.4.2.11 </span>Drawing rectangles to the bitmap</a></li>
+         <li><a href=#drawing-text-to-the-bitmap><span class=secno>4.12.4.2.12 </span>Drawing text to the bitmap</a></li>
+         <li><a href=#drawing-paths-to-the-canvas><span class=secno>4.12.4.2.13 </span>Drawing paths to the canvas</a></li>
+         <li><a href=#drawing-images><span class=secno>4.12.4.2.14 </span>Drawing images</a></li>
+         <li><a href=#hit-regions><span class=secno>4.12.4.2.15 </span>Hit regions</a></li>
+         <li><a href=#pixel-manipulation><span class=secno>4.12.4.2.16 </span>Pixel manipulation</a></li>
+         <li><a href=#compositing><span class=secno>4.12.4.2.17 </span>Compositing</a></li>
+         <li><a href=#image-smoothing><span class=secno>4.12.4.2.18 </span>Image smoothing</a></li>
+         <li><a href=#shadows><span class=secno>4.12.4.2.19 </span>Shadows</a></li>
+         <li><a href=#drawing-model><span class=secno>4.12.4.2.20 </span>Drawing model</a></li>
+         <li><a href=#best-practices><span class=secno>4.12.4.2.21 </span>Best practices</a></li>
+         <li><a href=#examples-0><span class=secno>4.12.4.2.22 </span>Examples</a></ol></li>
+       <li><a href=#pixel-density><span class=secno>4.12.4.3 </span>Pixel density</a></li>
+       <li><a href=#color-spaces-and-color-correction><span class=secno>4.12.4.4 </span>Color spaces and color correction</a></li>
+       <li><a href=#serializing-bitmaps-to-a-file><span class=secno>4.12.4.5 </span>Serializing bitmaps to a file</a></li>
+       <li><a href=#security-with-canvas-elements><span class=secno>4.12.4.6 </span>Security with <code>canvas</code> elements</a></ol></ol></li>
+   <li><a href=#common-idioms><span class=secno>4.13 </span>Common idioms without dedicated elements</a>
+    <ol>
+     <li><a href=#the-main-part-of-the-content><span class=secno>4.13.1 </span>The main part of the content</a></li>
+     <li><a href=#rel-up><span class=secno>4.13.2 </span>Bread crumb navigation</a></li>
+     <li><a href=#tag-clouds><span class=secno>4.13.3 </span>Tag clouds</a></li>
+     <li><a href=#conversations><span class=secno>4.13.4 </span>Conversations</a></li>
+     <li><a href=#footnotes><span class=secno>4.13.5 </span>Footnotes</a></ol></li>
+   <li><a href=#disabled-elements><span class=secno>4.14 </span>Disabled elements</a></li>
+   <li><a href=#selectors><span class=secno>4.15 </span>Matching HTML elements using selectors</a>
+    <ol>
+     <li><a href=#case-sensitivity><span class=secno>4.15.1 </span>Case-sensitivity</a></li>
+     <li><a href=#pseudo-classes><span class=secno>4.15.2 </span>Pseudo-classes</a></ol></ol></li>
+ <li><a href=#microdata><span class=secno>5 </span>Microdata</a>
+  <ol>
+   <li><a href=#introduction-4><span class=secno>5.1 </span>Introduction</a>
+    <ol>
+     <li><a href=#overview><span class=secno>5.1.1 </span>Overview</a></li>
+     <li><a href=#the-basic-syntax><span class=secno>5.1.2 </span>The basic syntax</a></li>
+     <li><a href=#typed-items><span class=secno>5.1.3 </span>Typed items</a></li>
+     <li><a href=#global-identifiers-for-items><span class=secno>5.1.4 </span>Global identifiers for items</a></li>
+     <li><a href=#selecting-names-when-defining-vocabularies><span class=secno>5.1.5 </span>Selecting names when defining vocabularies</a></li>
+     <li><a href=#using-the-microdata-dom-api><span class=secno>5.1.6 </span>Using the microdata DOM API</a></ol></li>
+   <li><a href=#encoding-microdata><span class=secno>5.2 </span>Encoding microdata</a>
+    <ol>
+     <li><a href=#the-microdata-model><span class=secno>5.2.1 </span>The microdata model</a></li>
+     <li><a href=#items><span class=secno>5.2.2 </span>Items</a></li>
+     <li><a href=#names:-the-itemprop-attribute><span class=secno>5.2.3 </span>Names: the <code>itemprop</code> attribute</a></li>
+     <li><a href=#values><span class=secno>5.2.4 </span>Values</a></li>
+     <li><a href=#associating-names-with-items><span class=secno>5.2.5 </span>Associating names with items</a></li>
+     <li><a href=#microdata-and-other-namespaces><span class=secno>5.2.6 </span>Microdata and other namespaces</a></ol></li>
+   <li><a href=#microdata-dom-api><span class=secno>5.3 </span>Microdata DOM API</a></li>
+   <li><a href=#mdvocabs><span class=secno>5.4 </span>Sample microdata vocabularies</a>
+    <ol>
+     <li><a href=#vcard><span class=secno>5.4.1 </span>vCard</a>
+      <ol>
+       <li><a href=#conversion-to-vcard><span class=secno>5.4.1.1 </span>Conversion to vCard</a></li>
+       <li><a href=#examples-1><span class=secno>5.4.1.2 </span>Examples</a></ol></li>
+     <li><a href=#vevent><span class=secno>5.4.2 </span>vEvent</a>
+      <ol>
+       <li><a href=#conversion-to-icalendar><span class=secno>5.4.2.1 </span>Conversion to iCalendar</a></li>
+       <li><a href=#examples-2><span class=secno>5.4.2.2 </span>Examples</a></ol></li>
+     <li><a href=#licensing-works><span class=secno>5.4.3 </span>Licensing works</a>
+      <ol>
+       <li><a href=#examples-3><span class=secno>5.4.3.1 </span>Examples</a></ol></ol></li>
+   <li><a href=#converting-html-to-other-formats><span class=secno>5.5 </span>Converting HTML to other formats</a>
+    <ol>
+     <li><a href=#json><span class=secno>5.5.1 </span>JSON</a></ol></ol></li>
+ <li><a href=#browsers><span class=secno>6 </span>Loading Web pages</a>
+  <ol>
+   <li><a href=#windows><span class=secno>6.1 </span>Browsing contexts</a>
+    <ol>
+     <li><a href=#nested-browsing-contexts><span class=secno>6.1.1 </span>Nested browsing contexts</a>
+      <ol>
+       <li><a href=#navigating-nested-browsing-contexts-in-the-dom><span class=secno>6.1.1.1 </span>Navigating nested browsing contexts in the DOM</a></ol></li>
+     <li><a href=#auxiliary-browsing-contexts><span class=secno>6.1.2 </span>Auxiliary browsing contexts</a>
+      <ol>
+       <li><a href=#navigating-auxiliary-browsing-contexts-in-the-dom><span class=secno>6.1.2.1 </span>Navigating auxiliary browsing contexts in the DOM</a></ol></li>
+     <li><a href=#secondary-browsing-contexts><span class=secno>6.1.3 </span>Secondary browsing contexts</a></li>
+     <li><a href=#security-nav><span class=secno>6.1.4 </span>Security</a></li>
+     <li><a href=#groupings-of-browsing-contexts><span class=secno>6.1.5 </span>Groupings of browsing contexts</a></li>
+     <li><a href=#browsing-context-names><span class=secno>6.1.6 </span>Browsing context names</a></ol></li>
+   <li><a href=#the-window-object><span class=secno>6.2 </span>The <code>Window</code> object</a>
+    <ol>
+     <li><a href=#security-window><span class=secno>6.2.1 </span>Security</a></li>
+     <li><a href=#apis-for-creating-and-navigating-browsing-contexts-by-name><span class=secno>6.2.2 </span>APIs for creating and navigating browsing contexts by name</a></li>
+     <li><a href=#accessing-other-browsing-contexts><span class=secno>6.2.3 </span>Accessing other browsing contexts</a></li>
+     <li><a href=#named-access-on-the-window-object><span class=secno>6.2.4 </span>Named access on the <code>Window</code> object</a></li>
+     <li><a href=#garbage-collection-and-browsing-contexts><span class=secno>6.2.5 </span>Garbage collection and browsing contexts</a></li>
+     <li><a href=#closing-browsing-contexts><span class=secno>6.2.6 </span>Closing browsing contexts</a></li>
+     <li><a href=#browser-interface-elements><span class=secno>6.2.7 </span>Browser interface elements</a></li>
+     <li><a href=#the-windowproxy-object><span class=secno>6.2.8 </span>The <code>WindowProxy</code> object</a></ol></li>
+   <li><a href=#origin-0><span class=secno>6.3 </span>Origin</a>
+    <ol>
+     <li><a href=#relaxing-the-same-origin-restriction><span class=secno>6.3.1 </span>Relaxing the same-origin restriction</a></ol></li>
+   <li><a href=#sandboxing><span class=secno>6.4 </span>Sandboxing</a></li>
+   <li><a href=#history><span class=secno>6.5 </span>Session history and navigation</a>
+    <ol>
+     <li><a href=#the-session-history-of-browsing-contexts><span class=secno>6.5.1 </span>The session history of browsing contexts</a></li>
+     <li><a href=#the-history-interface><span class=secno>6.5.2 </span>The <code>History</code> interface</a></li>
+     <li><a href=#the-location-interface><span class=secno>6.5.3 </span>The <code>Location</code> interface</a>
+      <ol>
+       <li><a href=#security-location><span class=secno>6.5.3.1 </span>Security</a></ol></li>
+     <li><a href=#history-notes><span class=secno>6.5.4 </span>Implementation notes for session history</a></ol></li>
+   <li><a href=#browsing-the-web><span class=secno>6.6 </span>Browsing the Web</a>
+    <ol>
+     <li><a href=#navigating-across-documents><span class=secno>6.6.1 </span>Navigating across documents</a></li>
+     <li><a href=#read-html><span class=secno>6.6.2 </span>Page load processing model for HTML files</a></li>
+     <li><a href=#read-xml><span class=secno>6.6.3 </span>Page load processing model for XML files</a></li>
+     <li><a href=#read-text><span class=secno>6.6.4 </span>Page load processing model for text files</a></li>
+     <li><a href=#read-multipart-x-mixed-replace><span class=secno>6.6.5 </span>Page load processing model for <code>multipart/x-mixed-replace</code> resources</a></li>
+     <li><a href=#read-media><span class=secno>6.6.6 </span>Page load processing model for media</a></li>
+     <li><a href=#read-plugin><span class=secno>6.6.7 </span>Page load processing model for content that uses plugins</a></li>
+     <li><a href=#read-ua-inline><span class=secno>6.6.8 </span>Page load processing model for inline
+  content that doesn't have a DOM</a></li>
+     <li><a href=#scroll-to-fragid><span class=secno>6.6.9 </span>Navigating to a fragment identifier</a></li>
+     <li><a href=#history-traversal><span class=secno>6.6.10 </span>History traversal</a>
+      <ol>
+       <li><a href=#event-definitions-1><span class=secno>6.6.10.1 </span>Event definitions</a></ol></li>
+     <li><a href=#unloading-documents><span class=secno>6.6.11 </span>Unloading documents</a>
+      <ol>
+       <li><a href=#event-definition><span class=secno>6.6.11.1 </span>Event definition</a></ol></li>
+     <li><a href=#aborting-a-document-load><span class=secno>6.6.12 </span>Aborting a document load</a></ol></li>
+   <li><a href=#offline><span class=secno>6.7 </span>Offline Web applications</a>
+    <ol>
+     <li><a href=#introduction-5><span class=secno>6.7.1 </span>Introduction</a>
+      <ol>
+       <li><a href=#supporting-offline-caching-for-legacy-applications><span class=secno>6.7.1.1 </span>Supporting offline caching for legacy applications</a></li>
+       <li><a href=#appcacheevents><span class=secno>6.7.1.2 </span>Event summary</a></ol></li>
+     <li><a href=#appcache><span class=secno>6.7.2 </span>Application caches</a></li>
+     <li><a href=#manifests><span class=secno>6.7.3 </span>The cache manifest syntax</a>
+      <ol>
+       <li><a href=#some-sample-manifests><span class=secno>6.7.3.1 </span>Some sample manifests</a></li>
+       <li><a href=#writing-cache-manifests><span class=secno>6.7.3.2 </span>Writing cache manifests</a></li>
+       <li><a href=#parsing-cache-manifests><span class=secno>6.7.3.3 </span>Parsing cache manifests</a></ol></li>
+     <li><a href=#downloading-or-updating-an-application-cache><span class=secno>6.7.4 </span>Downloading or updating an application cache</a></li>
+     <li><a href=#the-application-cache-selection-algorithm><span class=secno>6.7.5 </span>The application cache selection algorithm</a></li>
+     <li><a href=#changesToNetworkingModel><span class=secno>6.7.6 </span>Changes to the networking model</a></li>
+     <li><a href=#expiring-application-caches><span class=secno>6.7.7 </span>Expiring application caches</a></li>
+     <li><a href=#disk-space><span class=secno>6.7.8 </span>Disk space</a></li>
+     <li><a href=#application-cache-api><span class=secno>6.7.9 </span>Application cache API</a></li>
+     <li><a href=#browser-state><span class=secno>6.7.10 </span>Browser state</a></ol></ol></li>
+ <li><a href=#webappapis><span class=secno>7 </span>Web application APIs</a>
+  <ol>
+   <li><a href=#scripting><span class=secno>7.1 </span>Scripting</a>
+    <ol>
+     <li><a href=#introduction-6><span class=secno>7.1.1 </span>Introduction</a></li>
+     <li><a href=#enabling-and-disabling-scripting><span class=secno>7.1.2 </span>Enabling and disabling scripting</a></li>
+     <li><a href=#processing-model-3><span class=secno>7.1.3 </span>Processing model</a>
+      <ol>
+       <li><a href=#definitions-0><span class=secno>7.1.3.1 </span>Definitions</a></li>
+       <li><a href=#script-settings-for-browsing-contexts><span class=secno>7.1.3.2 </span>Script settings for browsing contexts</a></li>
+       <li><a href=#calling-scripts><span class=secno>7.1.3.3 </span>Calling scripts</a></li>
+       <li><a href=#creating-scripts><span class=secno>7.1.3.4 </span>Creating scripts</a></li>
+       <li><a href=#killing-scripts><span class=secno>7.1.3.5 </span>Killing scripts</a></li>
+       <li><a href=#runtime-script-errors><span class=secno>7.1.3.6 </span>Runtime script errors</a>
+        <ol>
+         <li><a href=#runtime-script-errors-in-documents><span class=secno>7.1.3.6.1 </span>Runtime script errors in documents</a></li>
+         <li><a href=#the-errorevent-interface><span class=secno>7.1.3.6.2 </span>The <code>ErrorEvent</code> interface</a></ol></ol></li>
+     <li><a href=#event-loops><span class=secno>7.1.4 </span>Event loops</a>
+      <ol>
+       <li><a href=#definitions-1><span class=secno>7.1.4.1 </span>Definitions</a></li>
+       <li><a href=#processing-model-4><span class=secno>7.1.4.2 </span>Processing model</a></li>
+       <li><a href=#generic-task-sources><span class=secno>7.1.4.3 </span>Generic task sources</a></ol></li>
+     <li><a href=#javascript-protocol><span class=secno>7.1.5 </span>The <code title="">javascript:</code> URL scheme</a></li>
+     <li><a href=#events><span class=secno>7.1.6 </span>Events</a>
+      <ol>
+       <li><a href=#event-handler-attributes><span class=secno>7.1.6.1 </span>Event handlers</a></li>
+       <li><a href=#event-handlers-on-elements,-document-objects,-and-window-objects><span class=secno>7.1.6.2 </span>Event handlers on elements, <code>Document</code> objects, and <code>Window</code> objects</a>
+        <ol>
+         <li><a href=#idl-definitions><span class=secno>7.1.6.2.1 </span>IDL definitions</a></ol></li>
+       <li><a href=#event-firing><span class=secno>7.1.6.3 </span>Event firing</a></li>
+       <li><a href=#events-and-the-window-object><span class=secno>7.1.6.4 </span>Events and the <code>Window</code> object</a></ol></ol></li>
+   <li><a href=#atob><span class=secno>7.2 </span>Base64 utility methods</a></li>
+   <li><a href=#dynamic-markup-insertion><span class=secno>7.3 </span>Dynamic markup insertion</a>
+    <ol>
+     <li><a href=#opening-the-input-stream><span class=secno>7.3.1 </span>Opening the input stream</a></li>
+     <li><a href=#closing-the-input-stream><span class=secno>7.3.2 </span>Closing the input stream</a></li>
+     <li><a href=#document.write()><span class=secno>7.3.3 </span><code title=dom-document-write>document.write()</code></a></li>
+     <li><a href=#document.writeln()><span class=secno>7.3.4 </span><code title=dom-document-writeln>document.writeln()</code></a></ol></li>
+   <li><a href=#timers><span class=secno>7.4 </span>Timers</a></li>
+   <li><a href=#user-prompts><span class=secno>7.5 </span>User prompts</a>
+    <ol>
+     <li><a href=#simple-dialogs><span class=secno>7.5.1 </span>Simple dialogs</a></li>
+     <li><a href=#printing><span class=secno>7.5.2 </span>Printing</a></li>
+     <li><a href=#dialogs-implemented-using-separate-documents><span class=secno>7.5.3 </span>Dialogs implemented using separate documents</a></ol></li>
+   <li><a href=#system-state-and-capabilities><span class=secno>7.6 </span>System state and capabilities</a>
+    <ol>
+     <li><a href=#the-navigator-object><span class=secno>7.6.1 </span>The <code>Navigator</code> object</a>
+      <ol>
+       <li><a href=#client-identification><span class=secno>7.6.1.1 </span>Client identification</a></li>
+       <li><a href=#language-preferences><span class=secno>7.6.1.2 </span>Language preferences</a></li>
+       <li><a href=#custom-handlers><span class=secno>7.6.1.3 </span>Custom scheme and content handlers</a>
+        <ol>
+         <li><a href=#security-and-privacy><span class=secno>7.6.1.3.1 </span>Security and privacy</a></li>
+         <li><a href=#sample-handler-impl><span class=secno>7.6.1.3.2 </span>Sample user interface</a></ol></li>
+       <li><a href=#manually-releasing-the-storage-mutex><span class=secno>7.6.1.4 </span>Manually releasing the storage mutex</a></li>
+       <li><a href=#plugins-0><span class=secno>7.6.1.5 </span>Plugins</a></ol></li>
+     <li><a href=#the-external-interface><span class=secno>7.6.2 </span>The <code>External</code> interface</a></ol></li>
+   <li><a href=#images><span class=secno>7.7 </span>Images</a></ol></li>
+ <li><a href=#editing><span class=secno>8 </span>User interaction</a>
+  <ol>
+   <li><a href=#the-hidden-attribute><span class=secno>8.1 </span>The <code>hidden</code> attribute</a></li>
+   <li><a href=#inert-subtrees><span class=secno>8.2 </span>Inert subtrees</a>
+    <ol>
+     <li><a href=#the-inert-attribute><span class=secno>8.2.1 </span>The <code>inert</code> attribute</a></ol></li>
+   <li><a href=#activation><span class=secno>8.3 </span>Activation</a></li>
+   <li><a href=#focus><span class=secno>8.4 </span>Focus</a>
+    <ol>
+     <li><a href=#sequential-focus-navigation-and-the-tabindex-attribute><span class=secno>8.4.1 </span>Sequential focus navigation and the <code title=attr-tabindex>tabindex</code> attribute</a></li>
+     <li><a href=#focus-management><span class=secno>8.4.2 </span>Focus management</a></li>
+     <li><a href=#document-level-focus-apis><span class=secno>8.4.3 </span>Document-level focus APIs</a></li>
+     <li><a href=#element-level-focus-apis><span class=secno>8.4.4 </span>Element-level focus APIs</a></ol></li>
+   <li><a href=#assigning-keyboard-shortcuts><span class=secno>8.5 </span>Assigning keyboard shortcuts</a>
+    <ol>
+     <li><a href=#introduction-7><span class=secno>8.5.1 </span>Introduction</a></li>
+     <li><a href=#the-accesskey-attribute><span class=secno>8.5.2 </span>The <code>accesskey</code> attribute</a></li>
+     <li><a href=#processing-model-5><span class=secno>8.5.3 </span>Processing model</a></ol></li>
+   <li><a href=#editing-0><span class=secno>8.6 </span>Editing</a>
+    <ol>
+     <li><a href=#contenteditable><span class=secno>8.6.1 </span>Making document regions editable: The <code title=attr-contenteditable>contenteditable</code> content attribute</a></li>
+     <li><a href=#making-entire-documents-editable:-the-designmode-idl-attribute><span class=secno>8.6.2 </span>Making entire documents editable: The <code title=dom-document-designMode>designMode</code> IDL attribute</a></li>
+     <li><a href=#best-practices-for-in-page-editors><span class=secno>8.6.3 </span>Best practices for in-page editors</a></li>
+     <li><a href=#editing-apis><span class=secno>8.6.4 </span>Editing APIs</a></li>
+     <li><a href=#spelling-and-grammar-checking><span class=secno>8.6.5 </span>Spelling and grammar checking</a></ol></li>
+   <li><a href=#dnd><span class=secno>8.7 </span>Drag and drop</a>
+    <ol>
+     <li><a href=#introduction-8><span class=secno>8.7.1 </span>Introduction</a></li>
+     <li><a href=#the-drag-data-store><span class=secno>8.7.2 </span>The drag data store</a></li>
+     <li><a href=#the-datatransfer-interface><span class=secno>8.7.3 </span>The <code>DataTransfer</code> interface</a>
+      <ol>
+       <li><a href=#the-datatransferitemlist-interface><span class=secno>8.7.3.1 </span>The <code>DataTransferItemList</code> interface</a></li>
+       <li><a href=#the-datatransferitem-interface><span class=secno>8.7.3.2 </span>The <code>DataTransferItem</code> interface</a></ol></li>
+     <li><a href=#the-dragevent-interface><span class=secno>8.7.4 </span>The <code>DragEvent</code> interface</a></li>
+     <li><a href=#drag-and-drop-processing-model><span class=secno>8.7.5 </span>Drag-and-drop processing model</a></li>
+     <li><a href=#dndevents><span class=secno>8.7.6 </span>Events summary</a></li>
+     <li><a href=#the-draggable-attribute><span class=secno>8.7.7 </span>The <code>draggable</code> attribute</a></li>
+     <li><a href=#the-dropzone-attribute><span class=secno>8.7.8 </span>The <code>dropzone</code> attribute</a></li>
+     <li><a href=#security-risks-in-the-drag-and-drop-model><span class=secno>8.7.9 </span>Security risks in the drag-and-drop model</a></ol></ol></li>
+ <li><a href=#comms><span class=secno>9 </span>Communication</a>
+  <ol>
+   <li><a href=#event-definitions-2><span class=secno>9.1 </span>Event definitions</a></li>
+   <li><a href=#server-sent-events><span class=secno>9.2 </span>Server-sent events</a>
+    <ol>
+     <li><a href=#server-sent-events-intro><span class=secno>9.2.1 </span>Introduction</a></li>
+     <li><a href=#the-eventsource-interface><span class=secno>9.2.2 </span>The <code>EventSource</code> interface</a></li>
+     <li><a href=#processing-model-6><span class=secno>9.2.3 </span>Processing model</a></li>
+     <li><a href=#parsing-an-event-stream><span class=secno>9.2.4 </span>Parsing an event stream</a></li>
+     <li><a href=#event-stream-interpretation><span class=secno>9.2.5 </span>Interpreting an event stream</a></li>
+     <li><a href=#authoring-notes><span class=secno>9.2.6 </span>Authoring notes</a></li>
+     <li><a href=#eventsource-push><span class=secno>9.2.7 </span>Connectionless push and other features</a></li>
+     <li><a href=#garbage-collection-0><span class=secno>9.2.8 </span>Garbage collection</a></li>
+     <li><a href=#implementation-advice><span class=secno>9.2.9 </span>Implementation advice</a></li>
+     <li><a href=#iana-considerations><span class=secno>9.2.10 </span>IANA considerations</a>
+      <ol>
+       <li><a href=#text/event-stream><span class=secno>9.2.10.1 </span><code>text/event-stream</code></a></li>
+       <li><a href=#last-event-id><span class=secno>9.2.10.2 </span><code>Last-Event-ID</code></a></ol></ol></li>
+   <li><a href=#network><span class=secno>9.3 </span>Web sockets</a>
+    <ol>
+     <li><a href=#network-intro><span class=secno>9.3.1 </span>Introduction</a></li>
+     <li><a href=#the-websocket-interface><span class=secno>9.3.2 </span>The <code>WebSocket</code> interface</a></li>
+     <li><a href=#feedback-from-the-protocol><span class=secno>9.3.3 </span>Feedback from the protocol</a></li>
+     <li><a href=#ping-and-pong-frames><span class=secno>9.3.4 </span>Ping and Pong frames</a></li>
+     <li><a href=#parsing-websocket-urls><span class=secno>9.3.5 </span>Parsing WebSocket URLs</a></li>
+     <li><a href=#event-definitions-3><span class=secno>9.3.6 </span>Event definitions</a></li>
+     <li><a href=#garbage-collection-1><span class=secno>9.3.7 </span>Garbage collection</a></ol></li>
+   <li><a href=#web-messaging><span class=secno>9.4 </span>Cross-document messaging</a>
+    <ol>
+     <li><a href=#introduction-9><span class=secno>9.4.1 </span>Introduction</a></li>
+     <li><a href=#security-postmsg><span class=secno>9.4.2 </span>Security</a>
+      <ol>
+       <li><a href=#authors><span class=secno>9.4.2.1 </span>Authors</a></li>
+       <li><a href=#user-agents><span class=secno>9.4.2.2 </span>User agents</a></ol></li>
+     <li><a href=#posting-messages><span class=secno>9.4.3 </span>Posting messages</a></ol></li>
+   <li><a href=#channel-messaging><span class=secno>9.5 </span>Channel messaging</a>
+    <ol>
+     <li><a href=#introduction-10><span class=secno>9.5.1 </span>Introduction</a>
+      <ol>
+       <li><a href=#examples-4><span class=secno>9.5.1.1 </span>Examples</a></li>
+       <li><a href=#ports-as-the-basis-of-an-object-capability-model-on-the-web><span class=secno>9.5.1.2 </span>Ports as the basis of an object-capability model on the Web</a></li>
+       <li><a href=#ports-as-the-basis-of-abstracting-out-service-implementations><span class=secno>9.5.1.3 </span>Ports as the basis of abstracting out service implementations</a></ol></li>
+     <li><a href=#message-channels><span class=secno>9.5.2 </span>Message channels</a></li>
+     <li><a href=#message-ports><span class=secno>9.5.3 </span>Message ports</a></li>
+     <li><a href=#broadcasting-to-many-ports><span class=secno>9.5.4 </span>Broadcasting to many ports</a></li>
+     <li><a href=#ports-and-garbage-collection><span class=secno>9.5.5 </span>Ports and garbage collection</a></ol></ol></li>
+ <li><a href=#workers><span class=secno>10 </span>Web workers</a>
+  <ol>
+   <li><a href=#introduction-11><span class=secno>10.1 </span>Introduction</a>
+    <ol>
+     <li><a href=#scope-0><span class=secno>10.1.1 </span>Scope</a></li>
+     <li><a href=#examples-5><span class=secno>10.1.2 </span>Examples</a>
+      <ol>
+       <li><a href=#a-background-number-crunching-worker><span class=secno>10.1.2.1 </span>A background number-crunching worker</a></li>
+       <li><a href=#worker-used-for-background-i/o><span class=secno>10.1.2.2 </span>Worker used for background I/O</a></li>
+       <li><a href=#shared-workers-introduction><span class=secno>10.1.2.3 </span>Shared workers introduction</a></li>
+       <li><a href=#shared-state-using-a-shared-worker><span class=secno>10.1.2.4 </span>Shared state using a shared worker</a></li>
+       <li><a href=#delegation><span class=secno>10.1.2.5 </span>Delegation</a></ol></li>
+     <li><a href=#tutorials><span class=secno>10.1.3 </span>Tutorials</a>
+      <ol>
+       <li><a href=#creating-a-dedicated-worker><span class=secno>10.1.3.1 </span>Creating a dedicated worker</a></li>
+       <li><a href=#communicating-with-a-dedicated-worker><span class=secno>10.1.3.2 </span>Communicating with a dedicated worker</a></li>
+       <li><a href=#shared-workers><span class=secno>10.1.3.3 </span>Shared workers</a></ol></ol></li>
+   <li><a href=#infrastructure-0><span class=secno>10.2 </span>Infrastructure</a>
+    <ol>
+     <li><a href=#the-global-scope><span class=secno>10.2.1 </span>The global scope</a>
+      <ol>
+       <li><a href=#the-workerglobalscope-common-interface><span class=secno>10.2.1.1 </span>The <code>WorkerGlobalScope</code> common interface</a></li>
+       <li><a href=#dedicated-workers-and-the-dedicatedworkerglobalscope-interface><span class=secno>10.2.1.2 </span>Dedicated workers and the <code>DedicatedWorkerGlobalScope</code> interface</a></li>
+       <li><a href=#shared-workers-and-the-sharedworkerglobalscope-interface><span class=secno>10.2.1.3 </span>Shared workers and the <code>SharedWorkerGlobalScope</code> interface</a></ol></li>
+     <li><a href=#the-event-loop><span class=secno>10.2.2 </span>The event loop</a></li>
+     <li><a href="#the-worker's-lifetime"><span class=secno>10.2.3 </span>The worker's lifetime</a></li>
+     <li><a href=#processing-model-7><span class=secno>10.2.4 </span>Processing model</a></li>
+     <li><a href=#runtime-script-errors-0><span class=secno>10.2.5 </span>Runtime script errors</a></li>
+     <li><a href=#creating-workers><span class=secno>10.2.6 </span>Creating workers</a>
+      <ol>
+       <li><a href=#the-abstractworker-abstract-interface><span class=secno>10.2.6.1 </span>The <code>AbstractWorker</code> abstract interface</a></li>
+       <li><a href=#script-settings-for-workers><span class=secno>10.2.6.2 </span>Script settings for workers</a></li>
+       <li><a href=#dedicated-workers-and-the-worker-interface><span class=secno>10.2.6.3 </span>Dedicated workers and the <code>Worker</code> interface</a></li>
+       <li><a href=#shared-workers-and-the-sharedworker-interface><span class=secno>10.2.6.4 </span>Shared workers and the <code>SharedWorker</code> interface</a></ol></ol></li>
+   <li><a href=#apis-available-to-workers><span class=secno>10.3 </span>APIs available to workers</a>
+    <ol>
+     <li><a href=#importing-scripts-and-libraries><span class=secno>10.3.1 </span>Importing scripts and libraries</a></li>
+     <li><a href=#the-workernavigator-object><span class=secno>10.3.2 </span>The <code>WorkerNavigator</code> object</a></li>
+     <li><a href=#interface-objects-and-constructors><span class=secno>10.3.3 </span>Interface objects and constructors</a></li>
+     <li><a href=#worker-locations><span class=secno>10.3.4 </span>Worker locations</a></ol></ol></li>
+ <li><a href=#webstorage><span class=secno>11 </span>Web storage</a>
+  <ol>
+   <li><a href=#introduction-12><span class=secno>11.1 </span>Introduction</a></li>
+   <li><a href=#storage><span class=secno>11.2 </span>The API</a>
+    <ol>
+     <li><a href=#the-storage-interface><span class=secno>11.2.1 </span>The <code>Storage</code> interface</a></li>
+     <li><a href=#the-sessionstorage-attribute><span class=secno>11.2.2 </span>The <code title=dom-sessionStorage>sessionStorage</code> attribute</a></li>
+     <li><a href=#the-localstorage-attribute><span class=secno>11.2.3 </span>The <code title=dom-localStorage>localStorage</code> attribute</a></li>
+     <li><a href=#the-storage-event><span class=secno>11.2.4 </span>The <code title=event-storage>storage</code> event</a>
+      <ol>
+       <li><a href=#event-definition-0><span class=secno>11.2.4.1 </span>Event definition</a></ol></li>
+     <li><a href=#threads><span class=secno>11.2.5 </span>Threads</a></ol></li>
+   <li><a href=#disk-space-0><span class=secno>11.3 </span>Disk space</a></li>
+   <li><a href=#privacy><span class=secno>11.4 </span>Privacy</a>
+    <ol>
+     <li><a href=#user-tracking><span class=secno>11.4.1 </span>User tracking</a></li>
+     <li><a href=#sensitivity-of-data><span class=secno>11.4.2 </span>Sensitivity of data</a></ol></li>
+   <li><a href=#security-storage><span class=secno>11.5 </span>Security</a>
+    <ol>
+     <li><a href=#dns-spoofing-attacks><span class=secno>11.5.1 </span>DNS spoofing attacks</a></li>
+     <li><a href=#cross-directory-attacks><span class=secno>11.5.2 </span>Cross-directory attacks</a></li>
+     <li><a href=#implementation-risks><span class=secno>11.5.3 </span>Implementation risks</a></ol></ol></li>
+ <li><a href=#syntax><span class=secno>12 </span>The HTML syntax</a>
+  <ol>
+   <li><a href=#writing><span class=secno>12.1 </span>Writing HTML documents</a>
+    <ol>
+     <li><a href=#the-doctype><span class=secno>12.1.1 </span>The DOCTYPE</a></li>
+     <li><a href=#elements-0><span class=secno>12.1.2 </span>Elements</a>
+      <ol>
+       <li><a href=#start-tags><span class=secno>12.1.2.1 </span>Start tags</a></li>
+       <li><a href=#end-tags><span class=secno>12.1.2.2 </span>End tags</a></li>
+       <li><a href=#attributes-0><span class=secno>12.1.2.3 </span>Attributes</a></li>
+       <li><a href=#optional-tags><span class=secno>12.1.2.4 </span>Optional tags</a></li>
+       <li><a href=#element-restrictions><span class=secno>12.1.2.5 </span>Restrictions on content models</a></li>
+       <li><a href=#cdata-rcdata-restrictions><span class=secno>12.1.2.6 </span>Restrictions on the contents of raw text and escapable raw text elements</a></ol></li>
+     <li><a href=#text-0><span class=secno>12.1.3 </span>Text</a>
+      <ol>
+       <li><a href=#newlines><span class=secno>12.1.3.1 </span>Newlines</a></ol></li>
+     <li><a href=#character-references><span class=secno>12.1.4 </span>Character references</a></li>
+     <li><a href=#cdata-sections><span class=secno>12.1.5 </span>CDATA sections</a></li>
+     <li><a href=#comments><span class=secno>12.1.6 </span>Comments</a></ol></li>
+   <li><a href=#parsing><span class=secno>12.2 </span>Parsing HTML documents</a>
+    <ol>
+     <li><a href=#overview-of-the-parsing-model><span class=secno>12.2.1 </span>Overview of the parsing model</a></li>
+     <li><a href=#the-input-byte-stream><span class=secno>12.2.2 </span>The input byte stream</a>
+      <ol>
+       <li><a href=#parsing-with-a-known-character-encoding><span class=secno>12.2.2.1 </span>Parsing with a known character encoding</a></li>
+       <li><a href=#determining-the-character-encoding><span class=secno>12.2.2.2 </span>Determining the character encoding</a></li>
+       <li><a href=#character-encodings><span class=secno>12.2.2.3 </span>Character encodings</a></li>
+       <li><a href=#changing-the-encoding-while-parsing><span class=secno>12.2.2.4 </span>Changing the encoding while parsing</a></li>
+       <li><a href=#preprocessing-the-input-stream><span class=secno>12.2.2.5 </span>Preprocessing the input stream</a></ol></li>
+     <li><a href=#parse-state><span class=secno>12.2.3 </span>Parse state</a>
+      <ol>
+       <li><a href=#the-insertion-mode><span class=secno>12.2.3.1 </span>The insertion mode</a></li>
+       <li><a href=#the-stack-of-open-elements><span class=secno>12.2.3.2 </span>The stack of open elements</a></li>
+       <li><a href=#the-list-of-active-formatting-elements><span class=secno>12.2.3.3 </span>The list of active formatting elements</a></li>
+       <li><a href=#the-element-pointers><span class=secno>12.2.3.4 </span>The element pointers</a></li>
+       <li><a href=#other-parsing-state-flags><span class=secno>12.2.3.5 </span>Other parsing state flags</a></ol></li>
+     <li><a href=#tokenization><span class=secno>12.2.4 </span>Tokenization</a>
+      <ol>
+       <li><a href=#data-state><span class=secno>12.2.4.1 </span>Data state</a></li>
+       <li><a href=#character-reference-in-data-state><span class=secno>12.2.4.2 </span>Character reference in data state</a></li>
+       <li><a href=#rcdata-state><span class=secno>12.2.4.3 </span>RCDATA state</a></li>
+       <li><a href=#character-reference-in-rcdata-state><span class=secno>12.2.4.4 </span>Character reference in RCDATA state</a></li>
+       <li><a href=#rawtext-state><span class=secno>12.2.4.5 </span>RAWTEXT state</a></li>
+       <li><a href=#script-data-state><span class=secno>12.2.4.6 </span>Script data state</a></li>
+       <li><a href=#plaintext-state><span class=secno>12.2.4.7 </span>PLAINTEXT state</a></li>
+       <li><a href=#tag-open-state><span class=secno>12.2.4.8 </span>Tag open state</a></li>
+       <li><a href=#end-tag-open-state><span class=secno>12.2.4.9 </span>End tag open state</a></li>
+       <li><a href=#tag-name-state><span class=secno>12.2.4.10 </span>Tag name state</a></li>
+       <li><a href=#rcdata-less-than-sign-state><span class=secno>12.2.4.11 </span>RCDATA less-than sign state</a></li>
+       <li><a href=#rcdata-end-tag-open-state><span class=secno>12.2.4.12 </span>RCDATA end tag open state</a></li>
+       <li><a href=#rcdata-end-tag-name-state><span class=secno>12.2.4.13 </span>RCDATA end tag name state</a></li>
+       <li><a href=#rawtext-less-than-sign-state><span class=secno>12.2.4.14 </span>RAWTEXT less-than sign state</a></li>
+       <li><a href=#rawtext-end-tag-open-state><span class=secno>12.2.4.15 </span>RAWTEXT end tag open state</a></li>
+       <li><a href=#rawtext-end-tag-name-state><span class=secno>12.2.4.16 </span>RAWTEXT end tag name state</a></li>
+       <li><a href=#script-data-less-than-sign-state><span class=secno>12.2.4.17 </span>Script data less-than sign state</a></li>
+       <li><a href=#script-data-end-tag-open-state><span class=secno>12.2.4.18 </span>Script data end tag open state</a></li>
+       <li><a href=#script-data-end-tag-name-state><span class=secno>12.2.4.19 </span>Script data end tag name state</a></li>
+       <li><a href=#script-data-escape-start-state><span class=secno>12.2.4.20 </span>Script data escape start state</a></li>
+       <li><a href=#script-data-escape-start-dash-state><span class=secno>12.2.4.21 </span>Script data escape start dash state</a></li>
+       <li><a href=#script-data-escaped-state><span class=secno>12.2.4.22 </span>Script data escaped state</a></li>
+       <li><a href=#script-data-escaped-dash-state><span class=secno>12.2.4.23 </span>Script data escaped dash state</a></li>
+       <li><a href=#script-data-escaped-dash-dash-state><span class=secno>12.2.4.24 </span>Script data escaped dash dash state</a></li>
+       <li><a href=#script-data-escaped-less-than-sign-state><span class=secno>12.2.4.25 </span>Script data escaped less-than sign state</a></li>
+       <li><a href=#script-data-escaped-end-tag-open-state><span class=secno>12.2.4.26 </span>Script data escaped end tag open state</a></li>
+       <li><a href=#script-data-escaped-end-tag-name-state><span class=secno>12.2.4.27 </span>Script data escaped end tag name state</a></li>
+       <li><a href=#script-data-double-escape-start-state><span class=secno>12.2.4.28 </span>Script data double escape start state</a></li>
+       <li><a href=#script-data-double-escaped-state><span class=secno>12.2.4.29 </span>Script data double escaped state</a></li>
+       <li><a href=#script-data-double-escaped-dash-state><span class=secno>12.2.4.30 </span>Script data double escaped dash state</a></li>
+       <li><a href=#script-data-double-escaped-dash-dash-state><span class=secno>12.2.4.31 </span>Script data double escaped dash dash state</a></li>
+       <li><a href=#script-data-double-escaped-less-than-sign-state><span class=secno>12.2.4.32 </span>Script data double escaped less-than sign state</a></li>
+       <li><a href=#script-data-double-escape-end-state><span class=secno>12.2.4.33 </span>Script data double escape end state</a></li>
+       <li><a href=#before-attribute-name-state><span class=secno>12.2.4.34 </span>Before attribute name state</a></li>
+       <li><a href=#attribute-name-state><span class=secno>12.2.4.35 </span>Attribute name state</a></li>
+       <li><a href=#after-attribute-name-state><span class=secno>12.2.4.36 </span>After attribute name state</a></li>
+       <li><a href=#before-attribute-value-state><span class=secno>12.2.4.37 </span>Before attribute value state</a></li>
+       <li><a href=#attribute-value-(double-quoted)-state><span class=secno>12.2.4.38 </span>Attribute value (double-quoted) state</a></li>
+       <li><a href=#attribute-value-(single-quoted)-state><span class=secno>12.2.4.39 </span>Attribute value (single-quoted) state</a></li>
+       <li><a href=#attribute-value-(unquoted)-state><span class=secno>12.2.4.40 </span>Attribute value (unquoted) state</a></li>
+       <li><a href=#character-reference-in-attribute-value-state><span class=secno>12.2.4.41 </span>Character reference in attribute value state</a></li>
+       <li><a href=#after-attribute-value-(quoted)-state><span class=secno>12.2.4.42 </span>After attribute value (quoted) state</a></li>
+       <li><a href=#self-closing-start-tag-state><span class=secno>12.2.4.43 </span>Self-closing start tag state</a></li>
+       <li><a href=#bogus-comment-state><span class=secno>12.2.4.44 </span>Bogus comment state</a></li>
+       <li><a href=#markup-declaration-open-state><span class=secno>12.2.4.45 </span>Markup declaration open state</a></li>
+       <li><a href=#comment-start-state><span class=secno>12.2.4.46 </span>Comment start state</a></li>
+       <li><a href=#comment-start-dash-state><span class=secno>12.2.4.47 </span>Comment start dash state</a></li>
+       <li><a href=#comment-state><span class=secno>12.2.4.48 </span>Comment state</a></li>
+       <li><a href=#comment-end-dash-state><span class=secno>12.2.4.49 </span>Comment end dash state</a></li>
+       <li><a href=#comment-end-state><span class=secno>12.2.4.50 </span>Comment end state</a></li>
+       <li><a href=#comment-end-bang-state><span class=secno>12.2.4.51 </span>Comment end bang state</a></li>
+       <li><a href=#doctype-state><span class=secno>12.2.4.52 </span>DOCTYPE state</a></li>
+       <li><a href=#before-doctype-name-state><span class=secno>12.2.4.53 </span>Before DOCTYPE name state</a></li>
+       <li><a href=#doctype-name-state><span class=secno>12.2.4.54 </span>DOCTYPE name state</a></li>
+       <li><a href=#after-doctype-name-state><span class=secno>12.2.4.55 </span>After DOCTYPE name state</a></li>
+       <li><a href=#after-doctype-public-keyword-state><span class=secno>12.2.4.56 </span>After DOCTYPE public keyword state</a></li>
+       <li><a href=#before-doctype-public-identifier-state><span class=secno>12.2.4.57 </span>Before DOCTYPE public identifier state</a></li>
+       <li><a href=#doctype-public-identifier-(double-quoted)-state><span class=secno>12.2.4.58 </span>DOCTYPE public identifier (double-quoted) state</a></li>
+       <li><a href=#doctype-public-identifier-(single-quoted)-state><span class=secno>12.2.4.59 </span>DOCTYPE public identifier (single-quoted) state</a></li>
+       <li><a href=#after-doctype-public-identifier-state><span class=secno>12.2.4.60 </span>After DOCTYPE public identifier state</a></li>
+       <li><a href=#between-doctype-public-and-system-identifiers-state><span class=secno>12.2.4.61 </span>Between DOCTYPE public and system identifiers state</a></li>
+       <li><a href=#after-doctype-system-keyword-state><span class=secno>12.2.4.62 </span>After DOCTYPE system keyword state</a></li>
+       <li><a href=#before-doctype-system-identifier-state><span class=secno>12.2.4.63 </span>Before DOCTYPE system identifier state</a></li>
+       <li><a href=#doctype-system-identifier-(double-quoted)-state><span class=secno>12.2.4.64 </span>DOCTYPE system identifier (double-quoted) state</a></li>
+       <li><a href=#doctype-system-identifier-(single-quoted)-state><span class=secno>12.2.4.65 </span>DOCTYPE system identifier (single-quoted) state</a></li>
+       <li><a href=#after-doctype-system-identifier-state><span class=secno>12.2.4.66 </span>After DOCTYPE system identifier state</a></li>
+       <li><a href=#bogus-doctype-state><span class=secno>12.2.4.67 </span>Bogus DOCTYPE state</a></li>
+       <li><a href=#cdata-section-state><span class=secno>12.2.4.68 </span>CDATA section state</a></li>
+       <li><a href=#tokenizing-character-references><span class=secno>12.2.4.69 </span>Tokenizing character references</a></ol></li>
+     <li><a href=#tree-construction><span class=secno>12.2.5 </span>Tree construction</a>
+      <ol>
+       <li><a href=#creating-and-inserting-nodes><span class=secno>12.2.5.1 </span>Creating and inserting nodes</a></li>
+       <li><a href=#parsing-elements-that-contain-only-text><span class=secno>12.2.5.2 </span>Parsing elements that contain only text</a></li>
+       <li><a href=#closing-elements-that-have-implied-end-tags><span class=secno>12.2.5.3 </span>Closing elements that have implied end tags</a></li>
+       <li><a href=#parsing-main-inhtml><span class=secno>12.2.5.4 </span>The rules for parsing tokens in HTML content</a>
+        <ol>
+         <li><a href=#the-initial-insertion-mode><span class=secno>12.2.5.4.1 </span>The "initial" insertion mode</a></li>
+         <li><a href=#the-before-html-insertion-mode><span class=secno>12.2.5.4.2 </span>The "before html" insertion mode</a></li>
+         <li><a href=#the-before-head-insertion-mode><span class=secno>12.2.5.4.3 </span>The "before head" insertion mode</a></li>
+         <li><a href=#parsing-main-inhead><span class=secno>12.2.5.4.4 </span>The "in head" insertion mode</a></li>
+         <li><a href=#parsing-main-inheadnoscript><span class=secno>12.2.5.4.5 </span>The "in head noscript" insertion mode</a></li>
+         <li><a href=#the-after-head-insertion-mode><span class=secno>12.2.5.4.6 </span>The "after head" insertion mode</a></li>
+         <li><a href=#parsing-main-inbody><span class=secno>12.2.5.4.7 </span>The "in body" insertion mode</a></li>
+         <li><a href=#parsing-main-incdata><span class=secno>12.2.5.4.8 </span>The "text" insertion mode</a></li>
+         <li><a href=#parsing-main-intable><span class=secno>12.2.5.4.9 </span>The "in table" insertion mode</a></li>
+         <li><a href=#parsing-main-intabletext><span class=secno>12.2.5.4.10 </span>The "in table text" insertion mode</a></li>
+         <li><a href=#parsing-main-incaption><span class=secno>12.2.5.4.11 </span>The "in caption" insertion mode</a></li>
+         <li><a href=#parsing-main-incolgroup><span class=secno>12.2.5.4.12 </span>The "in column group" insertion mode</a></li>
+         <li><a href=#parsing-main-intbody><span class=secno>12.2.5.4.13 </span>The "in table body" insertion mode</a></li>
+         <li><a href=#parsing-main-intr><span class=secno>12.2.5.4.14 </span>The "in row" insertion mode</a></li>
+         <li><a href=#parsing-main-intd><span class=secno>12.2.5.4.15 </span>The "in cell" insertion mode</a></li>
+         <li><a href=#parsing-main-inselect><span class=secno>12.2.5.4.16 </span>The "in select" insertion mode</a></li>
+         <li><a href=#parsing-main-inselectintable><span class=secno>12.2.5.4.17 </span>The "in select in table" insertion mode</a></li>
+         <li><a href=#parsing-main-intemplate><span class=secno>12.2.5.4.18 </span>The "in template" insertion mode</a></li>
+         <li><a href=#parsing-main-afterbody><span class=secno>12.2.5.4.19 </span>The "after body" insertion mode</a></li>
+         <li><a href=#parsing-main-inframeset><span class=secno>12.2.5.4.20 </span>The "in frameset" insertion mode</a></li>
+         <li><a href=#parsing-main-afterframeset><span class=secno>12.2.5.4.21 </span>The "after frameset" insertion mode</a></li>
+         <li><a href=#the-after-after-body-insertion-mode><span class=secno>12.2.5.4.22 </span>The "after after body" insertion mode</a></li>
+         <li><a href=#the-after-after-frameset-insertion-mode><span class=secno>12.2.5.4.23 </span>The "after after frameset" insertion mode</a></ol></li>
+       <li><a href=#parsing-main-inforeign><span class=secno>12.2.5.5 </span>The rules for parsing tokens in foreign content</a></ol></li>
+     <li><a href=#the-end><span class=secno>12.2.6 </span>The end</a></li>
+     <li><a href=#coercing-an-html-dom-into-an-infoset><span class=secno>12.2.7 </span>Coercing an HTML DOM into an infoset</a></li>
+     <li><a href=#an-introduction-to-error-handling-and-strange-cases-in-the-parser><span class=secno>12.2.8 </span>An introduction to error handling and strange cases in the parser</a>
+      <ol>
+       <li><a href=#misnested-tags:-b-i-/b-/i><span class=secno>12.2.8.1 </span>Misnested tags: &lt;b&gt;&lt;i&gt;&lt;/b&gt;&lt;/i&gt;</a></li>
+       <li><a href=#misnested-tags:-b-p-/b-/p><span class=secno>12.2.8.2 </span>Misnested tags: &lt;b&gt;&lt;p&gt;&lt;/b&gt;&lt;/p&gt;</a></li>
+       <li><a href=#unexpected-markup-in-tables><span class=secno>12.2.8.3 </span>Unexpected markup in tables</a></li>
+       <li><a href=#scripts-that-modify-the-page-as-it-is-being-parsed><span class=secno>12.2.8.4 </span>Scripts that modify the page as it is being parsed</a></li>
+       <li><a href=#the-execution-of-scripts-that-are-moving-across-multiple-documents><span class=secno>12.2.8.5 </span>The execution of scripts that are moving across multiple documents</a></li>
+       <li><a href=#unclosed-formatting-elements><span class=secno>12.2.8.6 </span>Unclosed formatting elements</a></ol></ol></li>
+   <li><a href=#serializing-html-fragments><span class=secno>12.3 </span>Serializing HTML fragments</a></li>
+   <li><a href=#parsing-html-fragments><span class=secno>12.4 </span>Parsing HTML fragments</a></li>
+   <li><a href=#named-character-references><span class=secno>12.5 </span>Named character references</a></ol></li>
+ <li><a href=#the-xhtml-syntax><span class=secno>13 </span>The XHTML syntax</a>
+  <ol>
+   <li><a href=#writing-xhtml-documents><span class=secno>13.1 </span>Writing XHTML documents</a></li>
+   <li><a href=#parsing-xhtml-documents><span class=secno>13.2 </span>Parsing XHTML documents</a></li>
+   <li><a href=#serializing-xhtml-fragments><span class=secno>13.3 </span>Serializing XHTML fragments</a></li>
+   <li><a href=#parsing-xhtml-fragments><span class=secno>13.4 </span>Parsing XHTML fragments</a></ol></li>
+ <li><a href=#rendering><span class=secno>14 </span>Rendering</a>
+  <ol>
+   <li><a href=#introduction-13><span class=secno>14.1 </span>Introduction</a></li>
+   <li><a href=#the-css-user-agent-style-sheet-and-presentational-hints><span class=secno>14.2 </span>The CSS user agent style sheet and presentational hints</a></li>
+   <li><a href=#non-replaced-elements><span class=secno>14.3 </span>Non-replaced elements</a>
+    <ol>
+     <li><a href=#hidden-elements><span class=secno>14.3.1 </span>Hidden elements</a></li>
+     <li><a href=#the-page><span class=secno>14.3.2 </span>The page</a></li>
+     <li><a href=#flow-content-1><span class=secno>14.3.3 </span>Flow content</a></li>
+     <li><a href=#phrasing-content-1><span class=secno>14.3.4 </span>Phrasing content</a></li>
+     <li><a href=#bidirectional-text><span class=secno>14.3.5 </span>Bidirectional text</a></li>
+     <li><a href=#quotes><span class=secno>14.3.6 </span>Quotes</a></li>
+     <li><a href=#sections-and-headings><span class=secno>14.3.7 </span>Sections and headings</a></li>
+     <li><a href=#lists><span class=secno>14.3.8 </span>Lists</a></li>
+     <li><a href=#tables><span class=secno>14.3.9 </span>Tables</a></li>
+     <li><a href=#margin-collapsing-quirks><span class=secno>14.3.10 </span>Margin collapsing quirks</a></li>
+     <li><a href=#form-controls><span class=secno>14.3.11 </span>Form controls</a></li>
+     <li><a href=#the-hr-element-0><span class=secno>14.3.12 </span>The <code>hr</code> element</a></li>
+     <li><a href=#the-fieldset-and-legend-elements><span class=secno>14.3.13 </span>The <code>fieldset</code> and <code>legend</code> elements</a></ol></li>
+   <li><a href=#replaced-elements><span class=secno>14.4 </span>Replaced elements</a>
+    <ol>
+     <li><a href=#embedded-content-2><span class=secno>14.4.1 </span>Embedded content</a></li>
+     <li><a href=#images-0><span class=secno>14.4.2 </span>Images</a></li>
+     <li><a href=#attributes-for-embedded-content-and-images><span class=secno>14.4.3 </span>Attributes for embedded content and images</a></li>
+     <li><a href=#image-maps-0><span class=secno>14.4.4 </span>Image maps</a></ol></li>
+   <li><a href=#bindings><span class=secno>14.5 </span>Bindings</a>
+    <ol>
+     <li><a href=#introduction-14><span class=secno>14.5.1 </span>Introduction</a></li>
+     <li><a href=#the-button-element-0><span class=secno>14.5.2 </span>The <code>button</code> element</a></li>
+     <li><a href=#the-details-element-0><span class=secno>14.5.3 </span>The <code>details</code> element</a></li>
+     <li><a href=#the-input-element-as-a-text-entry-widget><span class=secno>14.5.4 </span>The <code>input</code> element as a text entry widget</a></li>
+     <li><a href=#the-input-element-as-domain-specific-widgets><span class=secno>14.5.5 </span>The <code>input</code> element as domain-specific widgets</a></li>
+     <li><a href=#the-input-element-as-a-range-control><span class=secno>14.5.6 </span>The <code>input</code> element as a range control</a></li>
+     <li><a href=#the-input-element-as-a-color-well><span class=secno>14.5.7 </span>The <code>input</code> element as a color well</a></li>
+     <li><a href=#the-input-element-as-a-checkbox-and-radio-button-widgets><span class=secno>14.5.8 </span>The <code>input</code> element as a checkbox and radio button widgets</a></li>
+     <li><a href=#the-input-element-as-a-file-upload-control><span class=secno>14.5.9 </span>The <code>input</code> element as a file upload control</a></li>
+     <li><a href=#the-input-element-as-a-button><span class=secno>14.5.10 </span>The <code>input</code> element as a button</a></li>
+     <li><a href=#the-marquee-element-0><span class=secno>14.5.11 </span>The <code>marquee</code> element</a></li>
+     <li><a href=#the-meter-element-0><span class=secno>14.5.12 </span>The <code>meter</code> element</a></li>
+     <li><a href=#the-progress-element-0><span class=secno>14.5.13 </span>The <code>progress</code> element</a></li>
+     <li><a href=#the-select-element-0><span class=secno>14.5.14 </span>The <code>select</code> element</a></li>
+     <li><a href=#the-textarea-element-0><span class=secno>14.5.15 </span>The <code>textarea</code> element</a></li>
+     <li><a href=#the-keygen-element-0><span class=secno>14.5.16 </span>The <code>keygen</code> element</a></ol></li>
+   <li><a href=#frames-and-framesets><span class=secno>14.6 </span>Frames and framesets</a></li>
+   <li><a href=#interactive-media><span class=secno>14.7 </span>Interactive media</a>
+    <ol>
+     <li><a href=#links,-forms,-and-navigation><span class=secno>14.7.1 </span>Links, forms, and navigation</a></li>
+     <li><a href=#the-title-attribute-0><span class=secno>14.7.2 </span>The <code title=attr-title>title</code> attribute</a></li>
+     <li><a href=#editing-hosts><span class=secno>14.7.3 </span>Editing hosts</a></li>
+     <li><a href=#text-rendered-in-native-user-interfaces><span class=secno>14.7.4 </span>Text rendered in native user interfaces</a></ol></li>
+   <li><a href=#print-media><span class=secno>14.8 </span>Print media</a></li>
+   <li><a href=#unstyled-xml-documents><span class=secno>14.9 </span>Unstyled XML documents</a></ol></li>
+ <li><a href=#obsolete><span class=secno>15 </span>Obsolete features</a>
+  <ol>
+   <li><a href=#obsolete-but-conforming-features><span class=secno>15.1 </span>Obsolete but conforming features</a>
+    <ol>
+     <li><a href=#warnings-for-obsolete-but-conforming-features><span class=secno>15.1.1 </span>Warnings for obsolete but conforming features</a></ol></li>
+   <li><a href=#non-conforming-features><span class=secno>15.2 </span>Non-conforming features</a></li>
+   <li><a href=#requirements-for-implementations><span class=secno>15.3 </span>Requirements for implementations</a>
+    <ol>
+     <li><a href=#the-applet-element><span class=secno>15.3.1 </span>The <code>applet</code> element</a></li>
+     <li><a href=#the-marquee-element><span class=secno>15.3.2 </span>The <code>marquee</code> element</a></li>
+     <li><a href=#frames><span class=secno>15.3.3 </span>Frames</a></li>
+     <li><a href=#other-elements,-attributes-and-apis><span class=secno>15.3.4 </span>Other elements, attributes and APIs</a></ol></ol></li>
+ <li><a href=#iana><span class=secno>16 </span>IANA considerations</a>
+  <ol>
+   <li><a href=#text/html><span class=secno>16.1 </span><code>text/html</code></a></li>
+   <li><a href=#multipart/x-mixed-replace><span class=secno>16.2 </span><code>multipart/x-mixed-replace</code></a></li>
+   <li><a href=#application/xhtml+xml><span class=secno>16.3 </span><code>application/xhtml+xml</code></a></li>
+   <li><a href=#application/x-www-form-urlencoded><span class=secno>16.4 </span><code>application/x-www-form-urlencoded</code></a></li>
+   <li><a href=#text/cache-manifest><span class=secno>16.5 </span><code>text/cache-manifest</code></a></li>
+   <li><a href=#text/ping><span class=secno>16.6 </span><code>text/ping</code></a></li>
+   <li><a href=#application/microdata+json><span class=secno>16.7 </span><code>application/microdata+json</code></a></li>
+   <li><a href=#ping-from><span class=secno>16.8 </span><code>Ping-From</code></a></li>
+   <li><a href=#ping-to><span class=secno>16.9 </span><code>Ping-To</code></a></li>
+   <li><a href=#web+-scheme-prefix><span class=secno>16.10 </span><code>web+</code> scheme prefix</a></ol></li>
+ <li><a href=#index class=no-num>Index</a>
+  <ol>
+   <li><a href=#elements-1 class=no-num>Elements</a></li>
+   <li><a href=#element-content-categories class=no-num>Element content categories</a></li>
+   <li><a href=#attributes-1 class=no-num>Attributes</a></li>
+   <li><a href=#element-interfaces class=no-num>Element Interfaces</a></li>
+   <li><a href=#all-interfaces class=no-num>All Interfaces</a></ol></li>
+ <li><a href=#references class=no-num>References</a></li>
+ <li><a href=#acknowledgments class=no-num>Acknowledgments</a></ol>
+<!--end-toc-->
+  <hr><h2 id=introduction><span class=secno>1 </span>Introduction</h2>
+
+
+  <h3 id=abstract><span class=secno>1.1 </span>Where does this specification fit?</h3>
+
+  <p>This specification defines a big part of the Web platform, in
+  lots of detail. Its place in the Web platform specification stack
+  relative to other specifications can be best summed up as
+  follows:</p>
+
+  <p><img src=http://images.whatwg.org/abstract.png width=398 alt="It consists of everything else, above such core technologies as HTTP, URI/IRIs, DOM, XML, Unicode, and ECMAScript; below presentation-layer technologies like CSS, XBL, and the NPAPI; and to the side of technologies like Geolocation, SVG, MathML, and XHR." height=359></p>
+
+
+
+  <h3 id=is-this-html5?><span class=secno>1.2 </span>Is this HTML5?</h3><!--VERSION-->
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>In short: Yes.</p>
+
+  <p>In more length: The term "HTML5" is widely used as a buzzword to
+  refer to modern Web technologies, many of which (though by no means
+  all) are developed at the WHATWG, in some cases in conjunction with
+  the W3C and IETF.</p>
+
+  <p>The WHATWG work is all published in one specification
+
+  (the one you are reading right now),
+  parts of which are republished in an edition optimized for Web developers.
+
+  </p>
+
+  <p>The W3C also publishes parts of this specification as separate
+  documents. One of these parts is called "HTML5"; it is a forked subset of
+
+  this specification (the HTML Living Standard).
+  There are numerous differences between 
+
+  this specification (the HTML Living Standard)
+  and the W3C version, some minor, some major. Unfortunately these are not currently accurately
+  documented anywhere, so there is no way to know which are intentional and which are not.</p>
+
+
+
+  <h3 id=background><span class=secno>1.3 </span>Background</h3>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>The World Wide Web's markup language has always been HTML. HTML was primarily designed as a
+  language for semantically describing scientific documents, although its general design and
+  adaptations over the years have enabled it to be used to describe a number of other types of
+  documents.</p>
+
+  <p>The main area that has not been adequately addressed by HTML is a vague subject referred to as
+  Web Applications. This specification attempts to rectify this, while at the same time updating the
+  HTML specifications to address issues raised in the past few years.</p>
+
+
+  <h3 id=audience><span class=secno>1.4 </span>Audience</h3>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>This specification is intended for authors of documents and scripts that use the features
+  defined in this specification<span class=impl>, implementors of tools that operate on pages that
+  use the features defined in this specification, and individuals wishing to establish the
+  correctness of documents or implementations with respect to the requirements of this
+  specification</span>.</p>
+
+  <p>This document is probably not suited to readers who do not already have at least a passing
+  familiarity with Web technologies, as in places it sacrifices clarity for precision, and brevity
+  for completeness. More approachable tutorials and authoring guides can provide a gentler
+  introduction to the topic.</p>
+
+  <p>In particular, familiarity with the basics of DOM is necessary for a complete understanding of
+  some of the more technical parts of this specification. An understanding of Web IDL, HTTP, XML,
+  Unicode, character encodings, JavaScript, and CSS will also be helpful in places but is not
+  essential.</p>
+
+
+  <h3 id=scope><span class=secno>1.5 </span>Scope</h3>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>This specification is limited to providing a semantic-level markup language and associated
+  semantic-level scripting APIs for authoring accessible pages on the Web ranging from static
+  documents to dynamic applications.</p>
+
+  <p>The scope of this specification does not include providing mechanisms for media-specific
+  customization of presentation (although default rendering rules for Web browsers are included at
+  the end of this specification, and several mechanisms for hooking into CSS are provided as part of
+  the language).</p>
+
+  <p>The scope of this specification is not to describe an entire operating system. In particular,
+  hardware configuration software, image manipulation tools, and applications that users would be
+  expected to use with high-end workstations on a daily basis are out of scope. In terms of
+  applications, this specification is targeted specifically at applications that would be expected
+  to be used by users on an occasional basis, or regularly but from disparate locations, with low
+  CPU requirements. Examples of such applications include online purchasing systems, searching
+  systems, games (especially multiplayer online games), public telephone books or address books,
+  communications software (e-mail clients, instant messaging clients, discussion software), document
+  editing software, etc.</p>
+
+
+  <h3 id=history-1><span class=secno>1.6 </span>History</h3>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>For its first five years (1990-1995), HTML went through a number of revisions and experienced a
+  number of extensions, primarily hosted first at CERN, and then at the IETF.</p>
+
+  <p>With the creation of the W3C, HTML's development changed venue again. A first abortive attempt
+  at extending HTML in 1995 known as HTML 3.0 then made way to a more pragmatic approach known as
+  HTML 3.2, which was completed in 1997. HTML4 quickly followed later that same year.</p>
+
+  <p>The following year, the W3C membership decided to stop evolving HTML and instead begin work on
+  an XML-based equivalent, called XHTML. <!-- http://www.w3.org/MarkUp/future/#summary --> This
+  effort started with a reformulation of HTML4 in XML, known as XHTML 1.0, which added no new
+  features except the new serialization, and which was completed in 2000. After XHTML 1.0, the W3C's
+  focus turned to making it easier for other working groups to extend XHTML, under the banner of
+  XHTML Modularization. In parallel with this, the W3C also worked on a new language that was not
+  compatible with the earlier HTML and XHTML languages, calling it XHTML2.</p>
+
+  <p>Around the time that HTML's evolution was stopped in 1998, parts of the API for HTML developed
+  by browser vendors were specified and published under the name DOM Level 1 (in 1998) and DOM Level
+  2 Core and DOM Level 2 HTML (starting in 2000 and culminating in 2003). These efforts then petered
+  out, with some DOM Level 3 specifications published in 2004 but the working group being closed
+  before all the Level 3 drafts were completed.</p>
+
+  <p>In 2003, the publication of XForms, a technology which was positioned as the next generation of
+  Web forms, sparked a renewed interest in evolving HTML itself, rather than finding replacements
+  for it. This interest was borne from the realization that XML's deployment as a Web technology was
+  limited to entirely new technologies (like RSS and later Atom), rather than as a replacement for
+  existing deployed technologies (like HTML).</p>
+
+  <p>A proof of concept to show that it was possible to extend HTML4's forms to provide many of the
+  features that XForms 1.0 introduced, without requiring browsers to implement rendering engines
+  that were incompatible with existing HTML Web pages, was the first result of this renewed
+  interest. At this early stage, while the draft was already publicly available, and input was
+  already being solicited from all sources, the specification was only under Opera Software's
+  copyright.</p>
+
+  <p>The idea that HTML's evolution should be reopened was tested at a W3C workshop in 2004, where
+  some of the principles that underlie the HTML5 work (described below), as well as the
+  aforementioned early draft proposal covering just forms-related features, were presented to the
+  W3C jointly by Mozilla and Opera. The proposal was rejected on the grounds that the proposal
+  conflicted with the previously chosen direction for the Web's evolution; the W3C staff and
+  membership voted to continue developing XML-based replacements instead.</p>
+
+  <p>Shortly thereafter, Apple, Mozilla, and Opera jointly announced their intent to continue
+  working on the effort under the umbrella of a new venue called the WHATWG. A public mailing list
+  was created, and the draft was moved to the WHATWG site. The copyright was subsequently amended to
+  be jointly owned by all three vendors, and to allow reuse of the specification.</p>
+
+  <p>The WHATWG was based on several core principles, in particular that technologies need to be
+  backwards compatible, that specifications and implementations need to match even if this means
+  changing the specification rather than the implementations, and that specifications need to be
+  detailed enough that implementations can achieve complete interoperability without
+  reverse-engineering each other.</p>
+
+  <p>The latter requirement in particular required that the scope of the HTML5 specification include
+  what had previously been specified in three separate documents: HTML4, XHTML1, and DOM2 HTML. It
+  also meant including significantly more detail than had previously been considered the norm.</p>
+
+  <p>In 2006, the W3C indicated an interest to participate in the development of HTML5 after all,
+  and in 2007 formed a working group chartered to work with the WHATWG on the development of the
+  HTML5 specification. Apple, Mozilla, and Opera allowed the W3C to publish the specification under
+  the W3C copyright, while keeping a version with the less restrictive license on the WHATWG
+  site.</p>
+
+  <p>For a number of years, both groups then worked together. In 2011, however, the groups came to
+  the conclusion that they had different goals: the W3C wanted to publish a "finished" version of
+  "HTML5", while the WHATWG wanted to continue working on a Living Standard for HTML, continuously
+  maintaining the specification rather than freezing it in a state with known problems, and adding
+  new features as needed to evolve the platform.</p>
+
+  <p>Since then, the WHATWG has been working on this specification (amongst others), and the W3C has
+  been copying fixes made by the WHATWG into their fork of the document, as well as making other
+  changes, some intentional and some not, with no documentation listing or explaining the
+  differences.</p>
+
+
+
+
+  <h3 id=design-notes><span class=secno>1.7 </span>Design notes</h3>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>It must be admitted that many aspects of HTML appear at first glance to be nonsensical and
+  inconsistent.</p>
+
+  <p>HTML, its supporting DOM APIs, as well as many of its supporting technologies, have been
+  developed over a period of several decades by a wide array of people with different priorities
+  who, in many cases, did not know of each other's existence.</p>
+
+  <p>Features have thus arisen from many sources, and have not always been designed in especially
+  consistent ways. Furthermore, because of the unique characteristics of the Web, implementation
+  bugs have often become de-facto, and now de-jure, standards, as content is often unintentionally
+  written in ways that rely on them before they can be fixed.</p>
+
+  <p>Despite all this, efforts have been made to adhere to certain design goals. These are described
+  in the next few subsections.</p>
+
+
+  <h4 id=serializability-of-script-execution><span class=secno>1.7.1 </span>Serializability of script execution</h4>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>To avoid exposing Web authors to the complexities of multithreading, the HTML and DOM APIs are
+  designed such that no script can ever detect the simultaneous execution of other scripts. Even
+  with <a href=#worker title=Worker>workers</a>, the intent is that the behavior of implementations can
+  be thought of as completely serializing the execution of all scripts in all <a href=#browsing-context title="browsing
+  context">browsing contexts</a>.</p>
+
+  <p class=note>The <code title=dom-navigator-yieldForStorageUpdates><a href=#dom-navigator-yieldforstorageupdates>navigator.yieldForStorageUpdates()</a></code> method, in
+  this model, is equivalent to allowing other scripts to run while the calling script is
+  blocked.</p>
+
+
+  <h4 id=compliance-with-other-specifications><span class=secno>1.7.2 </span>Compliance with other specifications</h4>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>This specification interacts with and relies on a wide variety of other specifications. In
+  certain circumstances, unfortunately, conflicting needs have led to this specification violating
+  the requirements of these other specifications. Whenever this has occurred, the transgressions
+  have each been noted as a "<dfn id=willful-violation>willful violation</dfn>", and the reason for the violation has
+  been noted.</p>
+
+
+  <h4 id=extensibility><span class=secno>1.7.3 </span>Extensibility</h4>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>HTML has a wide number of extensibility mechanisms that can be used for adding semantics in a
+  safe manner:</p>
+
+  <ul><li>Authors can use the <code title=attr-class><a href=#classes>class</a></code> attribute to extend elements,
+   effectively creating their own elements, while using the most applicable existing "real" HTML
+   element, so that browsers and other tools that don't know of the extension can still support it
+   somewhat well. This is the tack used by microformats, for example.</li>
+
+   <li>Authors can include data for inline client-side scripts or server-side site-wide scripts to
+   process using the <code title=attr-data-*><a href=#attr-data-*>data-*=""</a></code> attributes. These are guaranteed to
+   never be touched by browsers, and allow scripts to include data on HTML elements that scripts can
+   then look for and process.</li>
+
+   <li>Authors can use the <code title=meta><a href=#the-meta-element>&lt;meta name="" content=""&gt;</a></code> mechanism to
+   include page-wide metadata by registering <a href=#concept-meta-extensions title=concept-meta-extensions>extensions to the
+   predefined set of metadata names</a>.</li>
+
+   <li>Authors can use the <code title=attr-hyperlink-rel><a href=#attr-hyperlink-rel>rel=""</a></code> mechanism to annotate
+   links with specific meanings by registering <a href=#concept-rel-extensions title=concept-rel-extensions>extensions to
+   the predefined set of link types</a>. This is also used by microformats.</li>
+
+   <li>Authors can embed raw data using the <code title=script><a href=#the-script-element>&lt;script type=""&gt;</a></code>
+   mechanism with a custom type, for further handling by inline or server-side scripts.</li>
+
+   <li>Authors can create <a href=#plugin title=plugin>plugins</a> and invoke them using the
+   <code><a href=#the-embed-element>embed</a></code> element. This is how Flash works.</li>
+
+   <li>Authors can extend APIs using the JavaScript prototyping mechanism. This is widely used by
+   script libraries, for instance.</li>
+
+   <li>Authors can use the microdata feature (the <code title=attr-itemscope><a href=#attr-itemscope>itemscope=""</a></code>
+   and <code title=attr-itemprop><a href=#names:-the-itemprop-attribute>itemprop=""</a></code> attributes) to embed nested name-value pairs
+   of data to be shared with other applications and sites.</li>
+
+  </ul><h3 id=html-vs-xhtml><span class=secno>1.8 </span>HTML vs XHTML</h3>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>This specification defines an abstract language for describing documents and applications, and
+  some APIs for interacting with in-memory representations of resources that use this language.</p>
+
+  <p>The in-memory representation is known as "DOM HTML", or "the DOM" for short.</p>
+
+  <p>There are various concrete syntaxes that can be used to transmit resources that use this
+  abstract language, two of which are defined in this specification.</p>
+
+  <p>The first such concrete syntax is the HTML syntax. This is the format suggested for most
+  authors. It is compatible with most legacy Web browsers. If a document is transmitted with the
+  <code><a href=#text/html>text/html</a></code> <a href=#mime-type>MIME type</a>, then it will be processed as an HTML document by
+  Web browsers. This specification defines the latest HTML syntax, known simply as "HTML".</p>
+
+  <p>The second concrete syntax is the XHTML syntax, which is an application of XML. When a document
+  is transmitted with an <a href=#xml-mime-type>XML MIME type</a>, such as <code><a href=#application/xhtml+xml>application/xhtml+xml</a></code>,
+  then it is treated as an XML document by Web browsers, to be parsed by an XML processor. Authors
+  are reminded that the processing for XML and HTML differs; in particular, even minor syntax errors
+  will prevent a document labeled as XML from being rendered fully, whereas they would be ignored in
+  the HTML syntax. This specification defines the latest XHTML syntax, known simply as "XHTML".</p>
+
+  <p>The DOM, the HTML syntax, and the XHTML syntax cannot all represent the same content. For
+  example, namespaces cannot be represented using the HTML syntax, but they are supported in the DOM
+  and in the XHTML syntax. Similarly, documents that use the <code><a href=#the-noscript-element>noscript</a></code> feature can be
+  represented using the HTML syntax, but cannot be represented with the DOM or in the XHTML syntax.
+  Comments that contain the string "<code title="">--&gt;</code>" can only be represented in the
+  DOM, not in the HTML and XHTML syntaxes.</p>
+
+
+  <h3 id=structure-of-this-specification><span class=secno>1.9 </span>Structure of this specification</h3>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>This specification is divided into the following major sections:</p>
+
+  <dl><dt><a href=#introduction>Introduction</a></dt>
+
+   <dd>Non-normative materials providing a context for the HTML standard.</dd>
+
+
+   <dt><a href=#infrastructure>Common infrastructure</a></dt>
+
+   <dd>The conformance classes, algorithms, definitions, and the common underpinnings of the rest of
+   the specification.</dd>
+
+
+   <dt><a href=#dom>Semantics, structure, and APIs of HTML documents</a></dt>
+
+   <dd>Documents are built from elements. These elements form a tree using the DOM. This section
+   defines the features of this DOM, as well as introducing the features common to all elements, and
+   the concepts used in defining elements.</dd>
+
+
+   <dt><a href=#semantics>The elements of HTML</a></dt>
+
+   <dd>Each element has a predefined meaning, which is explained in this section. Rules for authors
+   on how to use the element<span class=impl>, along with user agent requirements for how to
+   handle each element,</span> are also given. This includes large signature features of HTML such
+   as video playback and subtitles, form controls and form submission, and a 2D graphics API known
+   as the HTML canvas.</dd>
+
+
+   <dt><a href=#microdata>Microdata</a></dt>
+
+   <dd>This specification introduces a mechanism for adding machine-readable annotations to
+   documents, so that tools can extract trees of name-value pairs from the document. This section
+   describes this mechanism<span class=impl> and some algorithms that can be used to convert HTML
+   documents into other formats</span>. This section also defines some sample Microdata vocabularies
+   for contact information, calendar events, and licensing works.</dd>
+
+
+   <dt><a href=#browsers>Loading Web pages</a></dt>
+
+   <dd>HTML documents do not exist in a vacuum &mdash; this section defines many of the features
+   that affect environments that deal with multiple pages, such as Web browsers and offline
+   caching of Web applications.</dd>
+
+
+   <dt><a href=#webappapis>Web application APIs</a></dt>
+
+   <dd>This section introduces basic features for scripting of applications in HTML.</dd>
+
+
+   <dt><a href=#editing>User interaction</a></dt>
+
+   <dd>HTML documents can provide a number of mechanisms for users to interact with and modify
+   content, which are described in this section, such as how focus works, and drag-and-drop.</dd>
+
+
+   <dt><a href=#workers>Web workers</a></dt>
+
+   <dd>This section defines an API for background threads in JavaScript.</dd>
+
+
+   <dt><a href=#comms>The communication APIs</a></dt>
+
+   <dd>This section describes some mechanisms that applications written in HTML can use to
+   communicate with other applications from different domains running on the same client. It also
+   introduces a server-push event stream mechanism known as Server Sent Events or
+   <code><a href=#eventsource>EventSource</a></code>, and a two-way full-duplex socket protocol for scripts known as Web
+   Sockets.
+
+   </dd>
+
+
+   <dt><a href=#webstorage>Web storage</a></dt>
+
+   <dd>This section defines a client-side storage mechanism based on name-value pairs.</dd>
+
+
+   <dt><a href=#syntax>The HTML syntax</a></dt>
+   <dt><a href=#xhtml>The XHTML syntax</a></dt>
+
+   <dd>All of these features would be for naught if they couldn't be represented in a serialized
+   form and sent to other people, and so these sections define the syntaxes of HTML and XHTML<span class=impl>, along with rules for how to parse content using those syntaxes</span>.</dd>
+
+
+   <dt><a href=#rendering>Rendering</a></dt>
+
+   <dd>This section defines the default rendering rules for Web browsers.</dd>
+
+
+  </dl><p>There are also some appendices, listing <a href=#obsolete>obsolete features</a> and <a href=#iana>IANA considerations</a>, and several indices.</p>
+
+
+
+  <h4 id=how-to-read-this-specification><span class=secno>1.9.1 </span>How to read this specification</h4>
+
+  <p>This specification should be read like all other specifications. First, it should be read
+  cover-to-cover, multiple times. Then, it should be read backwards at least once. Then it should be
+  read by picking random sections from the contents list and following all the cross-references.</p>
+
+  <p>As described in the conformance requirements section below, this specification describes
+  conformance criteria for a variety of conformance classes. In particular, there are conformance
+  requirements that apply to <em>producers</em>, for example authors and the documents they create,
+  and there are conformance requirements that apply to <em>consumers</em>, for example Web browsers.
+  They can be distinguished by what they are requiring: a requirement on a producer states what is
+  allowed, while a requirement on a consumer states how software is to act.</p>
+
+  <div class=example>
+
+   <p>For example, "the <code title="">foo</code> attribute's value must be a <a href=#valid-integer>valid
+   integer</a>" is a requirement on producers, as it lays out the allowed values; in contrast,
+   the requirement "the <code title="">foo</code> attribute's value must be parsed using the
+   <a href=#rules-for-parsing-integers>rules for parsing integers</a>" is a requirement on consumers, as it describes how to
+   process the content.</p>
+
+  </div>
+
+  <p><strong>Requirements on producers have no bearing whatsoever on consumers.</strong></p>
+
+  <div class=example>
+
+   <p>Continuing the above example, a requirement stating that a particular attribute's value is
+   constrained to being a <a href=#valid-integer>valid integer</a> emphatically does <em>not</em> imply anything
+   about the requirements on consumers. It might be that the consumers are in fact required to treat
+   the attribute as an opaque string, completely unaffected by whether the value conforms to the
+   requirements or not. It might be (as in the previous example) that the consumers are required to
+   parse the value using specific rules that define how invalid (non-numeric in this case) values
+   are to be processed.</p>
+
+  </div>
+
+
+
+  <h4 id=typographic-conventions><span class=secno>1.9.2 </span>Typographic conventions</h4>
+
+  <p>This is a definition, requirement, or explanation.</p>
+
+  <p class=note>This is a note.</p>
+
+  <p class=example>This is an example.</p>
+
+  <p class=XXX>This is an open issue.</p>
+
+  <p class=warning>This is a warning.</p>
+
+  <pre class="idl extract">interface <dfn title="">Example</dfn> {
+  // this is an IDL definition
+};</pre>
+
+  <dl class=domintro><dt><var title="">variable</var> = <var title="">object</var> . <code title="">method</code>( [ <var title="">optionalArgument</var> ] )</dt>
+
+   <dd>
+
+    <p>This is a note to authors describing the usage of an interface.</p>
+
+   </dd>
+
+  </dl><pre class=css>/* this is a CSS fragment */</pre>
+
+  <p>The defining instance of a term is marked up like <dfn id=x-this title=x-this>this</dfn>. Uses of that
+  term are marked up like <a href=#x-this title=x-this>this</a> or like <i title=x-this><a href=#x-this>this</a></i>.</p>
+
+  <p>The defining instance of an element, attribute, or API is marked up like <dfn id=x-that title=x-that><code>this</code></dfn>. References to that element, attribute, or API are marked
+  up like <code title=x-that><a href=#x-that>this</a></code>.</p>
+
+  <p>Other code fragments are marked up <code title="">like this</code>.</p>
+
+  <p>Variables are marked up like <var title="">this</var>.</p>
+
+  <!--<p class="impl">This is an implementation requirement.</p>-->
+
+  <p>In an algorithm, steps in <a href=#synchronous-section title="synchronous section">synchronous sections</a> are
+  marked with &#x231b;.</p>
+
+  <p>In some cases, requirements are given in the form of lists with conditions and corresponding
+  requirements. In such cases, the requirements that apply to a condition are always the first set
+  of requirements that follow the condition, even in the case of there being multiple sets of
+  conditions for those requirements. Such cases are presented as follows:</p>
+
+  <dl class=switch><dt>This is a condition
+   <dt>This is another condition
+   </dt><dd>This is the requirement that applies to the conditions above.
+
+   <dt>This is a third condition
+   <dd>This is the requirement that applies to the third condition.
+
+  </dl><h3 id=fingerprint><span class=secno>1.10 </span>Privacy concerns</h3>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>Some features of HTML trade user convenience for a measure of user privacy.</p>
+
+  <p>In general, due to the Internet's architecture, a user can be distinguished from another by the
+  user's IP address. IP addresses do not perfectly match to a user; as a user moves from device to
+  device, or from network to network, their IP address will change; similarly, NAT routing, proxy
+  servers, and shared computers enable packets that appear to all come from a single IP address to
+  actually map to multiple users. Technologies such as onion routing can be used to further
+  anonymize requests so that requests from a single user at one node on the Internet appear to come
+  from many disparate parts of the network.</p>
+
+  <p>However, the IP address used for a user's requests is not the only mechanism by which a user's
+  requests could be related to each other. Cookies, for example, are designed specifically to enable
+  this, and are the basis of most of the Web's session features that enable you to log into a site
+  with which you have an account.</p>
+
+  <p>There are other mechanisms that are more subtle. Certain characteristics of a user's system can
+  be used to distinguish groups of users from each other; by collecting enough such information, an
+  individual user's browser's "digital fingerprint" can be computed, which can be as good, if not
+  better, as an IP address in ascertaining which requests are from the same user.</p>
+
+  <p>Grouping requests in this manner, especially across multiple sites, can be used for both benign
+  (and even arguably positive) purposes, as well as for malevolent purposes. An example of a
+  reasonably benign purpose would be determining whether a particular person seems to prefer sites
+  with dog illustrations as opposed to sites with cat illustrations (based on how often they visit
+  the sites in question) and then automatically using the preferred illustrations on subsequent
+  visits to participating sites. Malevolent purposes, however, could include governments combining
+  information such as the person's home address (determined from the addresses they use when getting
+  driving directions on one site) with their apparent political affiliations (determined by
+  examining the forum sites that they participate in) to determine whether the person should be
+  prevented from voting in an election.</p>
+
+  <p>Since the malevolent purposes can be remarkably evil, user agent implementors are encouraged to
+  consider how to provide their users with tools to minimize leaking information that could be used
+  to fingerprint a user.</p>
+
+  <p>Unfortunately, as the first paragraph in this section implies, sometimes there is great benefit
+  to be derived from exposing the very information that can also be used for fingerprinting
+  purposes, so it's not as easy as simply blocking all possible leaks. For instance, the ability to
+  log into a site to post under a specific identity requires that the user's requests be
+  identifiable as all being from the same user, more or less by definition. More subtly, though,
+  information such as how wide text is, which is necessary for many effects that involve drawing
+  text onto a canvas (e.g. any effect that involves drawing a border around the text) also leaks
+  information that can be used to group a user's requests. (In this case, by potentially exposing,
+  via a brute force search, which fonts a user has installed, information which can vary
+  considerably from user to user.)</p>
+
+  <p>Features in this specification which can be <dfn id=fingerprinting-vector title="fingerprinting vector">used to
+  fingerprint the user</dfn> are marked as this paragraph is.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>Other features in the platform can be used for the same purpose, though, including, though not
+  limited to:</p>
+
+  <ul><li>The exact list of which features a user agents supports.</li>
+
+   <li>The maximum allowed stack depth for recursion in script.</li>
+
+   <li>Features that describe the user's environment, like Media Queries and the <code><a href=#screen>Screen</a></code>
+   object. <a href=#refsMQ>[MQ]</a> <a href=#refsCSSOMVIEW>[CSSOMVIEW]</a></li>
+
+   <li>The user's time zone.</li>
+
+  </ul><h3 id=a-quick-introduction-to-html><span class=secno>1.11 </span>A quick introduction to HTML</h3>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>A basic HTML document looks like this:</p>
+
+  <pre id=intro-early-example>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+ &lt;head&gt;
+  &lt;title&gt;Sample page&lt;/title&gt;
+ &lt;/head&gt;
+ &lt;body&gt;
+  &lt;h1&gt;Sample page&lt;/h1&gt;
+  &lt;p&gt;This is a &lt;a href="demo.html"&gt;simple&lt;/a&gt; sample.&lt;/p&gt;
+  &lt;!-- this is a comment --&gt;
+ &lt;/body&gt;
+&lt;/html&gt;</pre>
+
+  <p>HTML documents consist of a tree of elements and text. Each element is denoted in the source by
+  a <a href=#syntax-start-tag title=syntax-start-tag>start tag</a>, such as "<code title="">&lt;body&gt;</code>", and
+  an <a href=#syntax-end-tag title=syntax-end-tag>end tag</a>, such as "<code title="">&lt;/body&gt;</code>".
+  (Certain start tags and end tags can in certain cases be <a href=#syntax-tag-omission title=syntax-tag-omission>omitted</a> and are implied by other tags.)</p>
+
+  <p>Tags have to be nested such that elements are all completely within each other, without
+  overlapping:</p>
+
+  <pre class=bad>&lt;p&gt;This is &lt;em&gt;very &lt;strong&gt;wrong&lt;/em&gt;!&lt;/strong&gt;&lt;/p&gt;</pre>
+  <pre>&lt;p&gt;This &lt;em&gt;is &lt;strong&gt;correct&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;</pre>
+
+  <p>This specification defines a set of elements that can be used in HTML, along with rules about
+  the ways in which the elements can be nested.</p>
+
+  <p>Elements can have attributes, which control how the elements work. In the example below, there
+  is a <a href=#hyperlink>hyperlink</a>, formed using the <code><a href=#the-a-element>a</a></code> element and its <code title=attr-hyperlink-href><a href=#attr-hyperlink-href>href</a></code> attribute:</p>
+
+  <pre>&lt;a href="demo.html"&gt;simple&lt;/a&gt;</pre>
+
+  <p><a href=#syntax-attributes title=syntax-attributes>Attributes</a> are placed inside the start tag, and consist
+  of a <a href=#syntax-attribute-name title=syntax-attribute-name>name</a> and a <a href=#syntax-attribute-value title=syntax-attribute-value>value</a>, separated by an "<code title="">=</code>" character.
+  The attribute value can remain <a href=#unquoted>unquoted</a> if it doesn't contain <a href=#space-character title="space character">space characters</a> or any of <code title="">"</code> <code title="">'</code> <code title="">`</code> <code title="">=</code> <code title="">&lt;</code> or
+  <code title="">&gt;</code>. Otherwise, it has to be quoted using either single or double quotes.
+  The value, along with the "<code title="">=</code>" character, can be omitted altogether if the
+  value is the empty string.</p>
+
+  <pre>&lt;!-- empty attributes --&gt;
+&lt;input name=address disabled&gt;
+&lt;input name=address disabled=""&gt;
+
+&lt;!-- attributes with a value --&gt;
+&lt;input name=address maxlength=200&gt;
+&lt;input name=address maxlength='200'&gt;
+&lt;input name=address maxlength="200"&gt;</pre>
+
+  <p>HTML user agents (e.g. Web browsers) then <i>parse</i> this markup, turning it into a DOM
+  (Document Object Model) tree. A DOM tree is an in-memory representation of a document.</p>
+
+  <p>DOM trees contain several kinds of nodes, in particular a <code><a href=#documenttype>DocumentType</a></code> node,
+  <code><a href=#element>Element</a></code> nodes, <code><a href=#text>Text</a></code> nodes, <code><a href=#comment-0>Comment</a></code> nodes, and in some cases
+  <code><a href=#processinginstruction>ProcessingInstruction</a></code> nodes.</p>
+
+  <p>The <a href=#intro-early-example>markup snippet at the top of this section</a> would be
+  turned into the following DOM tree:</p>
+
+  <ul class=domTree><li class=t10>DOCTYPE: <code title="">html</code><li class=t1><code><a href=#the-html-element>html</a></code><ul><li class=t1><code><a href=#the-head-element>head</a></code><ul><li class=t3><code>#text</code>: <span title="">&#x23ce;&blank;&blank;</span><li class=t1><code><a href=#the-title-element>title</a></code><ul><li class=t3><code>#text</code>: <span title="">Sample page</span></ul><li class=t3><code>#text</code>: <span title="">&#x23ce;&blank;</span></ul><li class=t3><code>#text</code>: <span title="">&#x23ce;&blank;</span><li class=t1><code><a href=#the-body-element>body</a></code><ul><li class=t3><code>#text</code>: <span title="">&#x23ce;&blank;&blank;</span><li class=t1><code><a href=#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements>h1</a></code><ul><li class=t3><code>#text</code>: <span title="">Sample page</span></ul><li class=t3><code>#text</code>: <span title="">&#x23ce;&blank;&blank;</span><li class=t1><code><a href=#the-p-element>p</a></code><ul><li class=t3><code>#text</code>: <span title="">This is a <!--grammar-check-override--></span><li class=t1><code><a href=#the-a-element>a</a></code> <span class=t2 title=""><code class="attribute name">href</code>="<code class="attribute value">demo.html</code>"</span><ul><li class=t3><code>#text</code>: <span title="">simple</span></ul><li class=t3><code>#text</code>: <span title=""> sample.</span></ul><li class=t3><code>#text</code>: <span title="">&#x23ce;&blank;&blank;</span><li class=t8><code>#comment</code>: <span title=""> this is a comment </span><li class=t3><code>#text</code>: <span title="">&#x23ce;&blank;&#x23ce;</span></ul></ul></ul><p>The <a href=#root-element>root element</a> of this tree is the <code><a href=#the-html-element>html</a></code> element, which is the
+  element always found at the root of HTML documents. It contains two elements, <code><a href=#the-head-element>head</a></code>
+  and <code><a href=#the-body-element>body</a></code>, as well as a <code><a href=#text>Text</a></code> node between them.</p>
+
+  <p>There are many more <code><a href=#text>Text</a></code> nodes in the DOM tree than one would initially expect,
+  because the source contains a number of spaces (represented here by "&blank;") and line breaks
+  ("&#x23ce;") that all end up as <code><a href=#text>Text</a></code> nodes in the DOM. However, for historical
+  reasons not all of the spaces and line breaks in the original markup appear in the DOM. In
+  particular, all the whitespace before <code><a href=#the-head-element>head</a></code> start tag ends up being dropped silently,
+  and all the whitespace after the <code><a href=#the-body-element>body</a></code> end tag ends up placed at the end of the
+  <code><a href=#the-body-element>body</a></code>.</p>
+
+  <p>The <code><a href=#the-head-element>head</a></code> element contains a <code><a href=#the-title-element>title</a></code> element, which itself contains a
+  <code><a href=#text>Text</a></code> node with the text "Sample page". Similarly, the <code><a href=#the-body-element>body</a></code> element
+  contains an <code><a href=#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements>h1</a></code> element, a <code><a href=#the-p-element>p</a></code> element, and a comment.</p>
+
+  <hr><p>This DOM tree can be manipulated from scripts in the page. Scripts (typically in JavaScript)
+  are small programs that can be embedded using the <code><a href=#the-script-element>script</a></code> element or using <a href=#event-handler-content-attributes>event
+  handler content attributes</a>. For example, here is a form with a script that sets the value
+  of the form's <code><a href=#the-output-element>output</a></code> element to say "Hello World":</p>
+
+  <pre>&lt;<a href=#the-form-element>form</a> <a href=#attr-form-name title=attr-form-name>name</a>="main"&gt;
+ Result: &lt;<a href=#the-output-element>output</a> <a href=#attr-fe-name title=attr-fe-name>name</a>="result"&gt;&lt;/output&gt;
+ &lt;<a href=#the-script-element>script</a>&gt;
+  <a href=#document title=Document>document</a>.<a href=#dom-document-forms title=dom-document-forms>forms</a>.main.<a href=#dom-form-elements title=dom-form-elements>elements</a>.result.<a href=#dom-output-value title=dom-output-value>value</a> = 'Hello World';
+ &lt;/script&gt;
+&lt;/form&gt;</pre>
+
+  <p>Each element in the DOM tree is represented by an object, and these objects have APIs so that
+  they can be manipulated. For instance, a link (e.g. the <code><a href=#the-a-element>a</a></code> element in the tree above)
+  can have its "<code title=attr-hyperlink-href><a href=#attr-hyperlink-href>href</a></code>" attribute changed in several
+  ways:</p>
+
+  <pre>var a = <a href=#document title=Document>document</a>.<a href=#dom-document-links title=dom-document-links>links</a>[0]; // obtain the first link in the document
+a.<a href=#dom-url-href title=dom-url-href>href</a> = 'sample.html'; // change the destination URL of the link
+a.<a href=#dom-url-protocol title=dom-url-protocol>protocol</a> = 'https'; // change just the scheme part of the URL
+a.setAttribute('href', 'http://example.com/'); // change the content attribute directly</pre>
+
+  <p>Since DOM trees are used as the way to represent HTML documents when they are processed and
+  presented by implementations (especially interactive implementations like Web browsers), this
+  specification is mostly phrased in terms of DOM trees, instead of the markup described above.</p>
+
+  <hr><p>HTML documents represent a media-independent description of interactive content. HTML documents
+  might be rendered to a screen, or through a speech synthesizer, or on a braille display. To
+  influence exactly how such rendering takes place, authors can use a styling language such as
+  CSS.</p>
+
+  <p>In the following example, the page has been made yellow-on-blue using CSS.</p>
+
+  <pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+ &lt;head&gt;
+  &lt;title&gt;Sample styled page&lt;/title&gt;
+  &lt;style&gt;
+   body { background: navy; color: yellow; }
+  &lt;/style&gt;
+ &lt;/head&gt;
+ &lt;body&gt;
+  &lt;h1&gt;Sample styled page&lt;/h1&gt;
+  &lt;p&gt;This page is just a demo.&lt;/p&gt;
+ &lt;/body&gt;
+&lt;/html&gt;</pre>
+
+  <p>For more details on how to use HTML, authors are encouraged to consult tutorials and guides.
+  Some of the examples included in this specification might also be of use, but the novice author is
+  cautioned that this specification, by necessity, defines the language with a level of detail that
+  might be difficult to understand at first.</p>
+
+<!--ADD-TOPIC:Security-->
+  <h4 id=writing-secure-applications-with-html><span class=secno>1.11.1 </span>Writing secure applications with HTML</h4>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>When HTML is used to create interactive sites, care needs to be taken to avoid introducing
+  vulnerabilities through which attackers can compromise the integrity of the site itself or of the
+  site's users.</p>
+
+  <p>A comprehensive study of this matter is beyond the scope of this document, and authors are
+  strongly encouraged to study the matter in more detail. However, this section attempts to provide
+  a quick introduction to some common pitfalls in HTML application development.</p>
+
+  <p>The security model of the Web is based on the concept of "origins", and correspondingly many of
+  the potential attacks on the Web involve cross-origin actions. <a href=#refsORIGIN>[ORIGIN]</a></p>
+
+  <dl><dt>Not validating user input</dt>
+   <dt>Cross-site scripting (XSS)</dt>
+   <dt>SQL injection</dt>
+
+   <dd>
+
+    <p>When accepting untrusted input, e.g. user-generated content such as text comments, values in
+    URL parameters, messages from third-party sites, etc, it is imperative that the data be
+    validated before use, and properly escaped when displayed. Failing to do this can allow a
+    hostile user to perform a variety of attacks, ranging from the potentially benign, such as
+    providing bogus user information like a negative age, to the serious, such as running scripts
+    every time a user looks at a page that includes the information, potentially propagating the
+    attack in the process, to the catastrophic, such as deleting all data in the server.</p>
+
+    <p>When writing filters to validate user input, it is imperative that filters always be
+    whitelist-based, allowing known-safe constructs and disallowing all other input. Blacklist-based
+    filters that disallow known-bad inputs and allow everything else are not secure, as not
+    everything that is bad is yet known (for example, because it might be invented in the
+    future).</p>
+
+    <div class=example>
+
+     <p>For example, suppose a page looked at its URL's query string to determine what to display,
+     and the site then redirected the user to that page to display a message, as in:</p>
+
+     <pre>&lt;ul&gt;
+ &lt;li&gt;&lt;a href="message.cgi?say=Hello"&gt;Say Hello&lt;/a&gt;
+ &lt;li&gt;&lt;a href="message.cgi?say=Welcome"&gt;Say Welcome&lt;/a&gt;
+ &lt;li&gt;&lt;a href="message.cgi?say=Kittens"&gt;Say Kittens&lt;/a&gt;
+&lt;/ul&gt;</pre>
+
+     <p>If the message was just displayed to the user without escaping, a hostile attacker could
+     then craft a URL that contained a script element:</p>
+
+     <pre>http://example.com/message.cgi?say=%3Cscript%3Ealert%28%27Oh%20no%21%27%29%3C/script%3E</pre>
+
+     <p>If the attacker then convinced a victim user to visit this page, a script of the attacker's
+     choosing would run on the page. Such a script could do any number of hostile actions, limited
+     only by what the site offers: if the site is an e-commerce shop, for instance, such a script
+     could cause the user to unknowingly make arbitrarily many unwanted purchases.</p>
+
+     <p>This is called a cross-site scripting attack.</p>
+
+    </div>
+
+    <p>There are many constructs that can be used to try to trick a site into executing code. Here
+    are some that authors are encouraged to consider when writing whitelist filters:</p>
+
+    <ul><li>When allowing harmless-seeming elements like <code><a href=#the-img-element>img</a></code>, it is important to whitelist
+     any provided attributes as well. If one allowed all attributes then an attacker could, for
+     instance, use the <code title=handler-onload><a href=#handler-onload>onload</a></code> attribute to run arbitrary
+     script.</li>
+
+     <li>When allowing URLs to be provided (e.g. for links), the scheme of each URL also needs to be
+     explicitly whitelisted, as there are many schemes that can be abused. The most prominent
+     example is "<code title=javascript-protocol>javascript:</code>", but user agents can
+     implement (and indeed, have historically implemented) others.</li> <!-- IE had vbscript:,
+     Netscape had livescript:, etc. -->
+
+     <li>Allowing a <code><a href=#the-base-element>base</a></code> element to be inserted means any <code><a href=#the-script-element>script</a></code> elements
+     in the page with relative links can be hijacked, and similarly that any form submissions can
+     get redirected to a hostile site.</li>
+
+    </ul></dd>
+
+
+   <dt>Cross-site request forgery (CSRF)</dt>
+
+   <dd>
+
+    <p>If a site allows a user to make form submissions with user-specific side-effects, for example
+    posting messages on a forum under the user's name, making purchases, or applying for a passport,
+    it is important to verify that the request was made by the user intentionally, rather than by
+    another site tricking the user into making the request unknowingly.</p>
+
+    <p>This problem exists because HTML forms can be submitted to other origins.</p>
+
+    <p>Sites can prevent such attacks by populating forms with user-specific hidden tokens, or by
+    checking <code title=http-origin>Origin</code> headers on all requests.</p>
+
+   </dd>
+
+
+
+   <dt>Clickjacking</dt>
+
+   <dd>
+
+    <p>A page that provides users with an interface to perform actions that the user might not wish
+    to perform needs to be designed so as to avoid the possibility that users can be tricked into
+    activating the interface.</p>
+
+    <p>One way that a user could be so tricked is if a hostile site places the victim site in a
+    small <code><a href=#the-iframe-element>iframe</a></code> and then convinces the user to click, for instance by having the user
+    play a reaction game. Once the user is playing the game, the hostile site can quickly position
+    the iframe under the mouse cursor just as the user is about to click, thus tricking the user
+    into clicking the victim site's interface.</p>
+
+    <p>To avoid this, sites that do not expect to be used in frames are encouraged to only enable
+    their interface if they detect that they are not in a frame (e.g. by comparing the <code title=dom-window><a href=#dom-window>window</a></code> object to the value of the <code title=dom-top><a href=#dom-top>top</a></code>
+    attribute).</p>
+
+   </dd>
+
+  </dl><!--REMOVE-TOPIC:Security--><h4 id=common-pitfalls-to-avoid-when-using-the-scripting-apis><span class=secno>1.11.2 </span>Common pitfalls to avoid when using the scripting APIs</h4>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>Scripts in HTML have "run-to-completion" semantics, meaning that the browser will generally run
+  the script uninterrupted before doing anything else, such as firing further events or continuing
+  to parse the document.</p>
+
+  <p>On the other hand, parsing of HTML files happens asynchronously and incrementally, meaning that
+  the parser can pause at any point to let scripts run. This is generally a good thing, but it does
+  mean that authors need to be careful to avoid hooking event handlers after the events could have
+  possibly fired.</p>
+
+  <p>There are two techniques for doing this reliably: use <a href=#event-handler-content-attributes>event handler content
+  attributes</a>, or create the element and add the event handlers in the same script. The latter
+  is safe because, as mentioned earlier, scripts are run to completion before further events can
+  fire.</p>
+
+  <div class=example>
+
+   <p>One way this could manifest itself is with <code><a href=#the-img-element>img</a></code> elements and the <code title=event-load>load</code> event. The event could fire as soon as the element has been
+   parsed, especially if the image has already been cached (which is common).</p>
+
+   <p>Here, the author uses the <code title=handler-onload><a href=#handler-onload>onload</a></code> handler on an
+   <code><a href=#the-img-element>img</a></code> element to catch the <code title=event-load>load</code> event:</p>
+
+   <pre>&lt;img src="games.png" alt="Games" onload="gamesLogoHasLoaded(event)"&gt;</pre>
+
+   <p>If the element is being added by script, then so long as the event handlers are added in the
+   same script, the event will still not be missed:</p>
+
+   <pre>&lt;script&gt;
+ var img = new Image();
+ img.src = 'games.png';
+ img.alt = 'Games';
+ img.onload = gamesLogoHasLoaded;
+ // img.addEventListener('load', gamesLogoHasLoaded, false); // would work also
+&lt;/script&gt;</pre>
+
+   <p>However, if the author first created the <code><a href=#the-img-element>img</a></code> element and then in a separate
+   script added the event listeners, there's a chance that the <code title=event-load>load</code>
+   event would be fired in between, leading it to be missed:</p>
+
+   <pre class=bad>&lt;!-- Do not use this style, it has a race condition! --&gt;
+ &lt;img id="games" src="games.png" alt="Games"&gt;
+ &lt;!-- the 'load' event might fire here while the parser is taking a
+      break, in which case you will not see it! --&gt;
+ &lt;script&gt;
+  var img = document.getElementById('games');
+  img.onload = gamesLogoHasLoaded; // might never fire!
+ &lt;/script&gt;</pre>
+
+  </div>
+
+
+
+  <h3 id=conformance-requirements-for-authors><span class=secno>1.12 </span>Conformance requirements for authors</h3>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>Unlike previous versions of the HTML specification, this specification defines in some detail
+  the required processing for invalid documents as well as valid documents.</p> <!-- This has led to
+  some questioning the purpose of conformance criteria: if there is no ambiguity in how something
+  will be processed, why disallow it? -->
+
+  <p>However, even though the processing of invalid content is in most cases well-defined,
+  conformance requirements for documents are still important: in practice, interoperability (the
+  situation in which all implementations process particular content in a reliable and identical or
+  equivalent way) is not the only goal of document conformance requirements. This section details
+  some of the more common reasons for still distinguishing between a conforming document and one
+  with errors.</p>
+
+
+  <h4 id=presentational-markup><span class=secno>1.12.1 </span>Presentational markup</h4>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>The majority of presentational features from previous versions of HTML are no longer allowed.
+  Presentational markup in general has been found to have a number of problems:</p>
+
+  <dl><dt>The use of presentational elements leads to poorer accessibility</dt>
+
+   <dd>
+
+    <p>While it is possible to use presentational markup in a way that provides users of assistive
+    technologies (ATs) with an acceptable experience (e.g. using ARIA), doing so is significantly
+    more difficult than doing so when using semantically-appropriate markup. Furthermore, even using
+    such techniques doesn't help make pages accessible for non-AT non-graphical users, such as users
+    of text-mode browsers.</p>
+
+    <p>Using media-independent markup, on the other hand, provides an easy way for documents to be
+    authored in such a way that they work for more users (e.g. text browsers).</p>
+
+   </dd>
+
+
+   <dt>Higher cost of maintenance</dt>
+
+   <dd>
+
+    <p>It is significantly easier to maintain a site written in such a way that the markup is
+    style-independent. For example, changing the color of a site that uses
+    <code>&lt;font&nbsp;color=""&gt;</code> throughout requires changes across the entire site, whereas
+    a similar change to a site based on CSS can be done by changing a single file.</p>
+
+   </dd>
+
+
+   <dt>Larger document sizes</dt>
+
+   <dd>
+
+    <p>Presentational markup tends to be much more redundant, and thus results in larger document
+    sizes.</p>
+
+   </dd>
+
+  </dl><p>For those reasons, presentational markup has been removed from HTML in this version. This
+  change should not come as a surprise; HTML4 deprecated presentational markup many years ago and
+  provided a mode (HTML4 Transitional) to help authors move away from presentational markup; later,
+  XHTML 1.1 went further and obsoleted those features altogether.</p>
+
+  <p>The only remaining presentational markup features in HTML are the <code title=attr-style><a href=#the-style-attribute>style</a></code> attribute and the <code><a href=#the-style-element>style</a></code> element. Use of the <code title=attr-style><a href=#the-style-attribute>style</a></code> attribute is somewhat discouraged in production environments, but
+  it can be useful for rapid prototyping (where its rules can be directly moved into a separate
+  style sheet later) and for providing specific styles in unusual cases where a separate style sheet
+  would be inconvenient. Similarly, the <code><a href=#the-style-element>style</a></code> element can be useful in syndication or
+  for page-specific styles, but in general an external style sheet is likely to be more convenient
+  when the styles apply to multiple pages.</p>
+
+  <p>It is also worth noting that some elements that were previously presentational have been
+  redefined in this specification to be media-independent: <code><a href=#the-b-element>b</a></code>, <code><a href=#the-i-element>i</a></code>,
+  <code><a href=#the-hr-element>hr</a></code>, <code><a href=#the-s-element>s</a></code>, <code><a href=#the-small-element>small</a></code>, and <code><a href=#the-u-element>u</a></code>.</p>
+
+
+  <h4 id=syntax-errors><span class=secno>1.12.2 </span>Syntax errors</h4>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>The syntax of HTML is constrained to avoid a wide variety of problems.</p>
+
+  <dl><dt>Unintuitive error-handling behavior</dt>
+
+   <dd>
+
+    <p>Certain invalid syntax constructs, when parsed, result in DOM trees that are highly
+    unintuitive.</p>
+
+    <div class=example>
+
+     <p>For example, the following markup fragment results in a DOM with an <code><a href=#the-hr-element>hr</a></code> element
+     that is an <em>earlier</em> sibling of the corresponding <code><a href=#the-table-element>table</a></code> element:</p>
+
+     <pre class=bad>&lt;table&gt;&lt;hr&gt;...</pre>
+
+    </div>
+
+   </dd>
+
+
+   <dt>Errors with optional error recovery</dt>
+
+   <dd>
+
+    <p>To allow user agents to be used in controlled environments without having to implement the
+    more bizarre and convoluted error handling rules, user agents are permitted to fail whenever
+    encountering a <a href=#parse-error>parse error</a>.</p>
+
+   </dd>
+
+
+   <dt>Errors where the error-handling behavior is not compatible with streaming user agents</dt>
+
+   <dd>
+
+    <p>Some error-handling behavior, such as the behavior for the <code title="">&lt;table&gt;&lt;hr&gt;...</code> example mentioned above, are incompatible with streaming
+    user agents (user agents that process HTML files in one pass, without storing state). To avoid
+    interoperability problems with such user agents, any syntax resulting in such behavior is
+    considered invalid.</p>
+
+   </dd>
+
+
+   <dt>Errors that can result in infoset coercion</dt>
+
+   <dd>
+
+    <p>When a user agent based on XML is connected to an HTML parser, it is possible that certain
+    invariants that XML enforces, such as comments never containing two consecutive hyphens, will be
+    violated by an HTML file. Handling this can require that the parser coerce the HTML DOM into an
+    XML-compatible infoset. Most syntax constructs that require such handling are considered
+    invalid.</p>
+
+   </dd>
+
+
+   <dt>Errors that result in disproportionally poor performance</dt>
+
+   <dd>
+
+    <p>Certain syntax constructs can result in disproportionally poor performance. To discourage the
+    use of such constructs, they are typically made non-conforming.</p>
+
+    <div class=example>
+
+     <p>For example, the following markup results in poor performance, since all the unclosed
+     <code><a href=#the-i-element>i</a></code> elements have to be reconstructed in each paragraph, resulting in progressively
+     more elements in each paragraph:</p>
+
+     <pre class=bad>&lt;p&gt;&lt;i&gt;He dreamt.
+&lt;p&gt;&lt;i&gt;He dreamt that he ate breakfast.
+&lt;p&gt;&lt;i&gt;Then lunch.
+&lt;p&gt;&lt;i&gt;And finally dinner.</pre>
+
+     <p>The resulting DOM for this fragment would be:</p>
+
+     <ul class=domTree><li class=t1><code><a href=#the-p-element>p</a></code><ul><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t3><code>#text</code>: <span title="">He dreamt.</span></ul></ul><li class=t1><code><a href=#the-p-element>p</a></code><ul><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t3><code>#text</code>: <span title="">He dreamt that he ate breakfast.</span></ul></ul></ul><li class=t1><code><a href=#the-p-element>p</a></code><ul><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t3><code>#text</code>: <span title="">Then lunch.</span></ul></ul></ul></ul><li class=t1><code><a href=#the-p-element>p</a></code><ul><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t3><code>#text</code>: <span title="">And finally dinner.</span></ul></ul></ul></ul></ul></ul></div>
+
+   </dd>
+
+
+   <dt>Errors involving fragile syntax constructs</dt>
+
+   <dd>
+
+    <p>There are syntax constructs that, for historical reasons, are relatively fragile. To help
+    reduce the number of users who accidentally run into such problems, they are made
+    non-conforming.</p>
+
+    <div class=example>
+
+     <p>For example, the parsing of certain named character references in attributes happens even
+     with the closing semicolon being omitted. It is safe to include an ampersand followed by
+     letters that do not form a named character reference, but if the letters are changed to a
+     string that <em>does</em> form a named character reference, they will be interpreted as that
+     character instead.</p>
+
+     <p>In this fragment, the attribute's value is "<code title="">?bill&amp;ted</code>":</p>
+
+     <pre class=bad>&lt;a href="?bill&amp;ted"&gt;Bill and Ted&lt;/a&gt;</pre>
+
+     <p>In the following fragment, however, the attribute's value is actually "<code title="">?art&copy;</code>", <em>not</em> the intended "<code title="">?art&amp;copy</code>",
+     because even without the final semicolon, "<code title="">&amp;copy</code>" is handled the same
+     as "<code title="">&amp;copy;</code>" and thus gets interpreted as "<code title="">&copy;</code>":</p>
+
+     <pre class=bad>&lt;a href="?art&amp;copy"&gt;Art and Copy&lt;/a&gt;</pre>
+
+     <p>To avoid this problem, all named character references are required to end with a semicolon,
+     and uses of named character references without a semicolon are flagged as errors.</p>
+
+     <p>Thus, the correct way to express the above cases is as
+     follows:</p>
+
+     <pre>&lt;a href="?bill&amp;ted"&gt;Bill and Ted&lt;/a&gt; &lt;!-- &amp;ted is ok, since it's not a named character reference --&gt;</pre>
+     <pre>&lt;a href="?art&amp;amp;copy"&gt;Art and Copy&lt;/a&gt; &lt;!-- the &amp; has to be escaped, since &amp;copy <em>is</em> a named character reference --&gt;</pre>
+
+    </div>
+
+   </dd>
+
+
+   <dt>Errors involving known interoperability problems in legacy user agents</dt>
+
+   <dd>
+
+    <p>Certain syntax constructs are known to cause especially subtle or serious problems in legacy
+    user agents, and are therefore marked as non-conforming to help authors avoid them.</p>
+
+    <div class=example>
+
+     <p>For example, this is why the U+0060 GRAVE ACCENT character (`) is not allowed in unquoted
+     attributes. In certain legacy user agents, <!-- namely IE --> it is sometimes treated as a
+     quote character.</p>
+
+    </div>
+
+    <div class=example>
+
+     <p>Another example of this is the DOCTYPE, which is required to trigger <a href=#no-quirks-mode>no-quirks
+     mode</a>, because the behavior of legacy user agents in <a href=#quirks-mode>quirks mode</a> is often
+     largely undocumented.</p>
+
+    </div>
+
+   </dd>
+
+
+<!--ADD-TOPIC:Security-->
+   <dt>Errors that risk exposing authors to security attacks</dt>
+
+   <dd>
+
+    <p>Certain restrictions exist purely to avoid known security problems.</p>
+
+    <div class=example>
+
+     <p>For example, the restriction on using UTF-7 exists purely to avoid authors falling prey to a
+     known cross-site-scripting attack using UTF-7. <a href=#refsUTF7>[UTF7]</a></p>
+
+    </div>
+
+   </dd>
+<!--REMOVE-TOPIC:Security-->
+
+
+   <dt>Cases where the author's intent is unclear</dt>
+
+   <dd>
+
+    <p>Markup where the author's intent is very unclear is often made non-conforming. Correcting
+    these errors early makes later maintenance easier.</p>
+
+    <div class=example>
+
+     <p>For example, it is unclear whether the author intended the following to be an
+     <code><a href=#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements>h1</a></code> heading or an <code><a href=#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements>h2</a></code> heading:</p>
+
+     <pre class=bad>&lt;h1&gt;Contact details&lt;/h2&gt;</pre>
+
+    </div>
+
+   </dd>
+
+
+   <dt>Cases that are likely to be typos</dt>
+
+   <dd>
+
+    <p>When a user makes a simple typo, it is helpful if the error can be caught early, as this can
+    save the author a lot of debugging time. This specification therefore usually considers it an
+    error to use element names, attribute names, and so forth, that do not match the names defined
+    in this specification.</p>
+
+    <div class=example>
+
+     <p>For example, if the author typed <code>&lt;capton&gt;</code> instead of
+     <code>&lt;caption&gt;</code>, this would be flagged as an error and the author could correct the
+     typo immediately.</p>
+
+    </div>
+
+   </dd>
+
+
+   <dt>Errors that could interfere with new syntax in the future</dt>
+
+   <dd>
+
+    <p>In order to allow the language syntax to be extended in the future, certain otherwise
+    harmless features are disallowed.</p>
+
+    <div class=example>
+
+     <p>For example, "attributes" in end tags are ignored currently, but they are invalid, in case a
+     future change to the language makes use of that syntax feature without conflicting with
+     already-deployed (and valid!) content.</p>
+
+    </div>
+
+   </dd>
+
+
+  </dl><p>Some authors find it helpful to be in the practice of always quoting all attributes and always
+  including all optional tags, preferring the consistency derived from such custom over the minor
+  benefits of terseness afforded by making use of the flexibility of the HTML syntax. To aid such
+  authors, conformance checkers can provide modes of operation wherein such conventions are
+  enforced.</p>
+
+
+
+  <h4 id=restrictions-on-content-models-and-on-attribute-values><span class=secno>1.12.3 </span>Restrictions on content models and on attribute values</h4>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>Beyond the syntax of the language, this specification also places restrictions on how elements
+  and attributes can be specified. These restrictions are present for similar reasons:</p>
+
+  <dl><dt>Errors involving content with dubious semantics</dt>
+
+   <dd>
+
+    <p>To avoid misuse of elements with defined meanings, content models are defined that restrict
+    how elements can be nested when such nestings would be of dubious value.</p>
+
+    <p class=example>For example, this specification disallows nesting a <code><a href=#the-section-element>section</a></code>
+    element inside a <code><a href=#the-kbd-element>kbd</a></code> element, since it is highly unlikely for an author to indicate
+    that an entire section should be keyed in.</p>
+
+   </dd>
+
+
+   <dt>Errors that involve a conflict in expressed semantics</dt>
+
+   <dd>
+
+    <p>Similarly, to draw the author's attention to mistakes in the use of elements, clear
+    contradictions in the semantics expressed are also considered conformance errors.</p>
+
+    <div class=example>
+
+     <p>In the fragments below, for example, the semantics are nonsensical: a separator cannot
+     simultaneously be a cell, nor can a radio button be a progress bar.</p>
+
+     <pre class=bad>&lt;hr role="cell"&gt;</pre>
+     <pre class=bad>&lt;input type=radio role=progressbar&gt;</pre>
+
+    </div>
+
+    <p class=example>Another example is the restrictions on the content models of the
+    <code><a href=#the-ul-element>ul</a></code> element, which only allows <code><a href=#the-li-element>li</a></code> element children. Lists by definition
+    consist just of zero or more list items, so if a <code><a href=#the-ul-element>ul</a></code> element contains something
+    other than an <code><a href=#the-li-element>li</a></code> element, it's not clear what was meant.</p>
+
+   </dd>
+
+
+   <dt>Cases where the default styles are likely to lead to confusion</dt>
+
+   <dd>
+
+    <p>Certain elements have default styles or behaviors that make certain combinations likely to
+    lead to confusion. Where these have equivalent alternatives without this problem, the confusing
+    combinations are disallowed.</p>
+
+    <p class=example>For example, <code><a href=#the-div-element>div</a></code> elements are rendered as block boxes, and
+    <code><a href=#the-span-element>span</a></code> elements as inline boxes. Putting a block box in an inline box is
+    unnecessarily confusing; since either nesting just <code><a href=#the-div-element>div</a></code> elements, or nesting just
+    <code><a href=#the-span-element>span</a></code> elements, or nesting <code><a href=#the-span-element>span</a></code> elements inside <code><a href=#the-div-element>div</a></code>
+    elements all serve the same purpose as nesting a <code><a href=#the-div-element>div</a></code> element in a <code><a href=#the-span-element>span</a></code>
+    element, but only the latter involves a block box in an inline box, the latter combination is
+    disallowed.</p>
+
+    <p class=example>Another example would be the way <a href=#interactive-content>interactive content</a> cannot be
+    nested. For example, a <code><a href=#the-button-element>button</a></code> element cannot contain a <code><a href=#the-textarea-element>textarea</a></code>
+    element. This is because the default behavior of such nesting interactive elements would be
+    highly confusing to users. Instead of nesting these elements, they can be placed side by
+    side.</p>
+
+   </dd>
+
+
+   <dt>Errors that indicate a likely misunderstanding of the specification</dt>
+
+   <dd>
+
+    <p>Sometimes, something is disallowed because allowing it would likely cause author
+    confusion.</p>
+
+    <p class=example>For example, setting the <code title=attr-fe-disabled><a href=#attr-fe-disabled>disabled</a></code>
+    attribute to the value "<code title="">false</code>" is disallowed, because despite the
+    appearance of meaning that the element is enabled, it in fact means that the element is
+    <em>disabled</em> (what matters for implementations is the presence of the attribute, not its
+    value).</p>
+
+   </dd>
+
+
+   <dt>Errors involving limits that have been imposed merely to simplify the language</dt>
+
+   <dd>
+
+    <p>Some conformance errors simplify the language that authors need to learn.</p>
+
+    <p class=example>For example, the <code><a href=#the-area-element>area</a></code> element's <code title=attr-area-shape><a href=#attr-area-shape>shape</a></code> attribute, despite accepting both <code title=attr-area-shape-keyword-circ><a href=#attr-area-shape-keyword-circ>circ</a></code> and <code title=attr-area-shape-keyword-circle><a href=#attr-area-shape-keyword-circle>circle</a></code> values in practice as synonyms, disallows
+    the use of the <code title=attr-area-shape-keyword-circ><a href=#attr-area-shape-keyword-circ>circ</a></code> value, so as to simplify
+    tutorials and other learning aids. There would be no benefit to allowing both, but it would
+    cause extra confusion when teaching the language.</p>
+
+   </dd>
+
+
+   <dt>Errors that involve peculiarities of the parser</dt>
+
+   <dd>
+
+    <p>Certain elements are parsed in somewhat eccentric ways (typically for historical reasons),
+    and their content model restrictions are intended to avoid exposing the author to these
+    issues.</p>
+
+    <div class=example>
+
+     <p>For example, a <code><a href=#the-form-element>form</a></code> element isn't allowed inside <a href=#phrasing-content>phrasing content</a>,
+     because when parsed as HTML, a <code><a href=#the-form-element>form</a></code> element's start tag will imply a
+     <code><a href=#the-p-element>p</a></code> element's end tag. Thus, the following markup results in two <a href=#paragraph title=paragraph>paragraphs</a>, not one:</p>
+
+     <pre>&lt;p&gt;Welcome. &lt;form&gt;&lt;label&gt;Name:&lt;/label&gt; &lt;input&gt;&lt;/form&gt;</pre>
+
+     <p>It is parsed exactly like the following:</p>
+
+     <pre>&lt;p&gt;Welcome. &lt;/p&gt;&lt;form&gt;&lt;label&gt;Name:&lt;/label&gt; &lt;input&gt;&lt;/form&gt;</pre>
+
+    </div>
+
+   </dd>
+
+
+   <dt>Errors that would likely result in scripts failing in hard-to-debug ways</dt>
+
+   <dd>
+
+    <p>Some errors are intended to help prevent script problems that would be hard to debug.</p>
+
+    <p class=example>This is why, for instance, it is non-conforming to have two <code title=attr-id><a href=#the-id-attribute>id</a></code> attributes with the same value. Duplicate IDs lead to the wrong
+    element being selected, with sometimes disastrous effects whose cause is hard to determine.</p>
+
+   </dd>
+
+
+   <dt>Errors that waste authoring time</dt>
+
+   <dd>
+
+    <p>Some constructs are disallowed because historically they have been the cause of a lot of
+    wasted authoring time, and by encouraging authors to avoid making them, authors can save time in
+    future efforts.</p>
+
+    <p class=example>For example, a <code><a href=#the-script-element>script</a></code> element's <code title=attr-script-src><a href=#attr-script-src>src</a></code> attribute causes the element's contents to be ignored.
+    However, this isn't obvious, especially if the element's contents appear to be executable script
+    &mdash; which can lead to authors spending a lot of time trying to debug the inline script
+    without realizing that it is not executing. To reduce this problem, this specification makes it
+    non-conforming to have executable script in a <code><a href=#the-script-element>script</a></code> element when the <code title=attr-script-src><a href=#attr-script-src>src</a></code> attribute is present. This means that authors who are
+    validating their documents are less likely to waste time with this kind of mistake.</p>
+
+   </dd>
+
+
+   <dt>Errors that involve areas that affect authors migrating to and from XHTML</dt>
+
+   <dd>
+
+    <p>Some authors like to write files that can be interpreted as both XML and HTML with similar
+    results. Though this practice is discouraged in general due to the myriad of subtle
+    complications involved (especially when involving scripting, styling, or any kind of automated
+    serialization), this specification has a few restrictions intended to at least somewhat mitigate
+    the difficulties. This makes it easier for authors to use this as a transitionary step when
+    migrating between HTML and XHTML.</p>
+
+    <p class=example>For example, there are somewhat complicated rules surrounding the <code title=attr-lang><a href=#attr-lang>lang</a></code> and <code title=attr-xml-lang><a href=#attr-xml-lang>xml:lang</a></code> attributes
+    intended to keep the two synchronized.</p>
+
+    <p class=example>Another example would be the restrictions on the values of <code title="">xmlns</code> attributes in the HTML serialization, which are intended to ensure that
+    elements in conforming documents end up in the same namespaces whether processed as HTML or
+    XML.</p>
+
+   </dd>
+
+
+   <dt>Errors that involve areas reserved for future expansion</dt>
+
+   <dd>
+
+    <p>As with the restrictions on the syntax intended to allow for new syntax in future revisions
+    of the language, some restrictions on the content models of elements and values of attributes
+    are intended to allow for future expansion of the HTML vocabulary.</p>
+
+    <p class=example>For example, limiting the values of the <code title=attr-hyperlink-target><a href=#attr-hyperlink-target>target</a></code> attribute that start with an U+005F LOW LINE
+    character (_) to only specific predefined values allows new predefined values to be introduced
+    at a future time without conflicting with author-defined values.</p>
+
+   </dd>
+
+
+   <dt>Errors that indicate a mis-use of other specifications</dt>
+
+   <dd>
+
+    <p>Certain restrictions are intended to support the restrictions made by other
+    specifications.</p>
+
+    <p class=example>For example, requiring that attributes that take media queries use only
+    <em>valid</em> media queries reinforces the importance of following the conformance rules of
+    that specification.</p>
+
+   </dd>
+
+  </dl><h3 id=suggested-reading><span class=secno>1.13 </span>Suggested reading</h3>
+
+  <p><i>This section is non-normative.</i></p>
+
+  <p>The following documents might be of interest to readers of this specification.</p>
+
+  <dl><dt><cite>Character Model for the World Wide Web 1.0: Fundamentals</cite> <a href=#refsCHARMOD>[CHARMOD]</a></dt>
+
+   <dd><blockquote><p>This Architectural Specification provides authors of specifications, software
+   developers, and content developers with a common reference for interoperable text manipulation on
+   the World Wide Web, building on the Universal Character Set, defined jointly by the Unicode
+   Standard and ISO/IEC 10646. Topics addressed include use of the terms 'character', 'encoding' and
+   'string', a reference processing model, choice and identification of character encodings,
+   character escaping, and string indexing.</blockquote></dd>
+
+   <dt><cite>Unicode Security Considerations</cite> <a href=#refsUTR36>[UTR36]</a></dt>
+
+   <dd><blockquote><p>Because Unicode contains such a large number of characters and incorporates
+   the varied writing systems of the world, incorrect usage can expose programs or systems to
+   possible security attacks. This is especially important as more and more products are
+   internationalized. This document describes some of the security considerations that programmers,
+   system analysts, standards developers, and users should take into account, and provides specific
+   recommendations to reduce the risk of problems.</blockquote></dd>
+
+   <dt><cite>Web Content Accessibility Guidelines (WCAG) 2.0</cite> <a href=#refsWCAG>[WCAG]</a></dt>
+
+   <dd><blockquote><p>Web Content Accessibility Guidelines (WCAG) 2.0 covers a wide range of
+   recommendations for making Web content more accessible. Following these guidelines will make
+   content accessible to a wider range of people with disabilities, including blindness and low
+   vision, deafness and hearing loss, learning disabilities, cognitive limitations, limited
+   movement, speech disabilities, photosensitivity and combinations of these. Following these
+   guidelines will also often make your Web content more usable to users in
+   general.</blockquote></dd>
+
+   <dt class=impl><cite>Authoring Tool Accessibility Guidelines (ATAG) 2.0</cite> <a href=#refsATAG>[ATAG]</a></dt>
+
+   <dd class=impl><blockquote><p>This specification provides guidelines for designing Web content
+   authoring tools that are more accessible for people with disabilities. An authoring tool that
+   conforms to these guidelines will promote accessibility by providing an accessible user interface
+   to authors with disabilities as well as by enabling, supporting, and promoting the production of
+   accessible Web content by all authors.</blockquote></dd>
+
+   <dt class=impl><cite>User Agent Accessibility Guidelines (UAAG) 2.0</cite> <a href=#refsUAAG>[UAAG]</a></dt>
+
+   <dd class=impl><blockquote><p>This document provides guidelines for designing user agents that
+   lower barriers to Web accessibility for people with disabilities. User agents include browsers
+   and other types of software that retrieve and render Web content. A user agent that conforms to
+   these guidelines will promote accessibility through its own user interface and through other
+   internal facilities, including its ability to communicate with other technologies (especially
+   assistive technologies). Furthermore, all users, not just users with disabilities, should find
+   conforming user agents to be more usable.</blockquote></dd>
+
+  </dl><h2 id=infrastructure><span class=secno>2 </span>Common infrastructure</h2>
+
+  <h3 id=terminology><span class=secno>2.1 </span>Terminology</h3>
+
+  <p>This specification refers to both HTML and XML attributes and IDL attributes, often in the same
+  context. When it is not clear which is being referred to, they are referred to as <dfn title="">content attributes</dfn> for HTML and XML attributes, and <dfn title="">IDL
+  attributes</dfn> for those defined on IDL interfaces. Similarly, the term "properties" is used for
+  both JavaScript object properties and CSS properties. When these are ambiguous they are qualified
+  as <dfn title="">object properties</dfn> and <dfn title="">CSS properties</dfn> respectively.</p>
+
+  <p>Generally, when the specification states that a feature applies to <a href=#syntax>the HTML syntax</a>
+  or <a href=#the-xhtml-syntax>the XHTML syntax</a>, it also includes the other. When a feature specifically only
+  applies to one of the two languages, it is called out by explicitly stating that it does not apply
+  to the other format, as in "for HTML, ... (this does not apply to XHTML)".</p>
+
+  <p>This specification uses the term <dfn title="">document</dfn> to refer to any use of HTML,
+  ranging from short static documents to long essays or reports with rich multimedia, as well as to
+  fully-fledged interactive applications. The term is used to refer both to <code><a href=#document>Document</a></code>
+  objects and their descendant DOM trees, and to serialized byte streams using the <a href=#syntax title="the
+  HTML syntax">HTML syntax</a> or <a href=#the-xhtml-syntax title="the XHTML syntax">XHTML syntax</a>, depending
+  on context.</p>
+
+  <p>In the context of the DOM structures, the terms <a href=#html-documents title="HTML documents">HTML
+  document</a> and <a href=#xml-documents title="XML documents">XML document</a> are used as defined in the DOM
+  specification, and refer specifically to two different modes that <code><a href=#document>Document</a></code> objects
+  can find themselves in. <a href=#refsDOM>[DOM]</a> (Such uses are always hyperlinked to their
+  definition.)</p>
+
+  <p>In the context of byte streams, the term HTML document refers to resources labeled as
+  <code><a href=#text/html>text/html</a></code>, and the term XML document refers to resources labeled with an <a href=#xml-mime-type>XML
+  MIME type</a>.</p>
+
+  <p>The term <dfn id=xhtml-document>XHTML document</dfn> is used to refer to both <code><a href=#document>Document</a></code>s in the <a href=#xml-documents title="XML documents">XML document</a> mode that contains element nodes in the <a href=#html-namespace-0>HTML
+  namespace</a>, and byte streams labeled with an <a href=#xml-mime-type>XML MIME type</a> that contain
+  elements from the <a href=#html-namespace-0>HTML namespace</a>, depending on context.</p>
+
+  <hr><p>For simplicity, terms such as <dfn title="">shown</dfn>, <dfn title="">displayed</dfn>, and
+  <dfn title="">visible</dfn> might sometimes be used when referring to the way a document is
+  rendered to the user. These terms are not meant to imply a visual medium; they must be considered
+  to apply to other media in equivalent ways.</p>
+
+  <div class=impl>
+
+  <p>When an algorithm B says to return to another algorithm A, it implies that A called B. Upon
+  returning to A, the implementation must continue from where it left off in calling B.</p>
+
+  </div>
+
+  <!-- should find somewhere more appropriate to put this -->
+  <p>The term "transparent black" refers to the color with red, green, blue, and alpha channels all
+  set to zero.</p>
+
+
+  <h4 id=resources><span class=secno>2.1.1 </span>Resources</h4>
+
+  <p>The specification uses the term <dfn title="">supported</dfn> when referring to whether a user
+  agent has an implementation capable of decoding the semantics of an external resource. A format or
+  type is said to be <i>supported</i> if the implementation can process an external resource of that
+  format or type without critical aspects of the resource being ignored. Whether a specific resource
+  is <i>supported</i> can depend on what features of the resource's format are in use.</p>
+
+  <p class=example>For example, a PNG image would be considered to be in a supported format if its
+  pixel data could be decoded and rendered, even if, unbeknownst to the implementation, the image
+  also contained animation data.</p>
+
+  <p class=example>An MPEG-4 video file would not be considered to be in a supported format if the
+  compression format used was not supported, even if the implementation could determine the
+  dimensions of the movie from the file's metadata.</p>
+
+  <p>What some specifications, in particular the HTTP specification, refer to as a
+  <i>representation</i> is referred to in this specification as a <dfn title="">resource</dfn>. <a href=#refsHTTP>[HTTP]</a></p>
+
+  <p>The term <dfn id=mime-type>MIME type</dfn> is used to refer to what is sometimes called an <i>Internet media
+  type</i> in protocol literature. The term <i>media type</i> in this specification is used to refer
+  to the type of media intended for presentation, as used by the CSS specifications. <a href=#refsRFC2046>[RFC2046]</a> <a href=#refsMQ>[MQ]</a></p>
+
+  <p>A string is a <dfn id=valid-mime-type>valid MIME type</dfn> if it matches the <code title="">media-type</code>
+  rule defined in section 3.7 "Media Types" of RFC 2616. In particular, a <a href=#valid-mime-type>valid MIME
+  type</a> may include MIME type parameters. <a href=#refsHTTP>[HTTP]</a></p>
+
+  <p>A string is a <dfn id=valid-mime-type-with-no-parameters>valid MIME type with no parameters</dfn> if it matches the <code title="">media-type</code> rule defined in section 3.7 "Media Types" of RFC 2616, but does not
+  contain any U+003B SEMICOLON characters (;). In other words, if it consists only of a type and
+  subtype, with no MIME Type parameters. <a href=#refsHTTP>[HTTP]</a></p>
+
+  <p>The term <dfn id=html-mime-type>HTML MIME type</dfn> is used to refer to the <a href=#mime-type>MIME type</a>
+  <code><a href=#text/html>text/html</a></code>.</p>
+
+  <p>A resource's <dfn id=critical-subresources>critical subresources</dfn> are those that the resource needs to have
+  available to be correctly processed. Which resources are considered critical or not is defined by
+  the specification that defines the resource's format.</p>
+
+  <p>The term <dfn id=data-protocol title="data protocol"><code title="">data:</code> URL</dfn> refers to <a href=#url title=URL>URLs</a> that use the <code title="">data:</code> scheme. <a href=#refsRFC2397>[RFC2397]</a></p>
+
+
+  <h4 id=xml><span class=secno>2.1.2 </span>XML</h4>
+
+  <p id=html-namespace>To ease migration from HTML to XHTML, UAs conforming to this specification
+  will place elements in HTML in the <code>http://www.w3.org/1999/xhtml</code> namespace, at least
+  for the purposes of the DOM and CSS. The term "<dfn id=html-elements>HTML elements</dfn>", when used in this
+  specification, refers to any element in that namespace, and thus refers to both HTML and XHTML
+  elements.</p>
+
+  <p>Except where otherwise stated, all elements defined or mentioned in this specification are in
+  the <a href=#html-namespace-0>HTML namespace</a> ("<code>http://www.w3.org/1999/xhtml</code>"), and all attributes
+  defined or mentioned in this specification have no namespace.</p>
+
+  <p>The term <dfn id=element-type>element type</dfn> is used to refer to the set of elements that have a given
+  local name and namespace. For example, <code><a href=#the-button-element>button</a></code> elements are elements with the element
+  type <code><a href=#the-button-element>button</a></code>, meaning they have the local name "<code title="">button</code>" and
+  (implicitly as defined above) the <a href=#html-namespace-0>HTML namespace</a>.</p>
+
+  <p>Attribute names are said to be <dfn id=xml-compatible>XML-compatible</dfn> if they match the <a href=http://www.w3.org/TR/xml/#NT-Name><code title="">Name</code></a> production defined in
+  XML, they contain no U+003A COLON characters (:), and their first three characters are not an
+  <a href=#ascii-case-insensitive>ASCII case-insensitive</a> match for the string "<code title="">xml</code>". <a href=#refsXML>[XML]</a></p>
+
+  <p>The term <dfn id=xml-mime-type>XML MIME type</dfn> is used to refer to the <a href=#mime-type title="MIME type">MIME
+  types</a> <code title="">text/xml</code>, <code title="">application/xml</code>, and any
+  <a href=#mime-type>MIME type</a> whose subtype ends with the four characters "<code title="">+xml</code>".
+  <a href=#refsRFC3023>[RFC3023]</a></p>
+
+
+  <h4 id=dom-trees><span class=secno>2.1.3 </span>DOM trees</h4>
+
+  <p>The <dfn id=root-element-of-a-document-object>root element of a <code>Document</code> object</dfn> is that <code><a href=#document>Document</a></code>'s
+  first element child, if any. If it does not have one then the <code><a href=#document>Document</a></code> has no root
+  element.</p>
+
+  <p>The term <dfn id=root-element>root element</dfn>, when not referring to a <code><a href=#document>Document</a></code> object's root
+  element, means the furthest ancestor element node of whatever node is being discussed, or the node
+  itself if it has no ancestors. When the node is a part of the document, then the node's <a href=#root-element>root
+  element</a> is indeed the document's root element; however, if the node is not currently part
+  of the document tree, the root element will be an orphaned node.</p>
+
+  <p>When an element's <a href=#root-element>root element</a> is the <a href=#root-element-of-a-document-object>root element of a
+  <code>Document</code> object</a>, it is said to be <dfn id=in-a-document>in a <code>Document</code></dfn>. An
+  element is said to have been <dfn id=insert-an-element-into-a-document title="insert an element into a document">inserted into a
+  document</dfn> when its <a href=#root-element>root element</a> changes and is now the document's <a href=#root-element>root
+  element</a>. Analogously, an element is said to have been <dfn id=remove-an-element-from-a-document title="remove an element from a
+  document">removed from a document</dfn> when its <a href=#root-element>root element</a> changes from being the
+  document's <a href=#root-element>root element</a> to being another element.</p>
+
+  <p>A node's <dfn id=home-subtree>home subtree</dfn> is the subtree rooted at that node's <a href=#root-element>root
+  element</a>. When a node is <a href=#in-a-document>in a <code>Document</code></a>, its <a href=#home-subtree>home
+  subtree</a> is that <code><a href=#document>Document</a></code>'s tree.</p>
+
+  <p>The <code><a href=#document>Document</a></code> of a <code><a href=#node>Node</a></code> (such as an element) is the
+  <code><a href=#document>Document</a></code> that the <code><a href=#node>Node</a></code>'s <code title=dom-Node-ownerDocument><a href=#dom-node-ownerdocument>ownerDocument</a></code> IDL attribute returns. When a
+  <code><a href=#node>Node</a></code> is <a href=#in-a-document>in a <code>Document</code></a> then that <code><a href=#document>Document</a></code> is
+  always the <code><a href=#node>Node</a></code>'s <code><a href=#document>Document</a></code>, and the <code><a href=#node>Node</a></code>'s <code title=dom-Node-ownerDocument><a href=#dom-node-ownerdocument>ownerDocument</a></code> IDL attribute thus always returns that
+  <code><a href=#document>Document</a></code>.</p>
+
+  <p>The <code><a href=#document>Document</a></code> of a content attribute is the <code><a href=#document>Document</a></code> of the
+  attribute's element.</p>
+
+  <p>The term <dfn id=tree-order>tree order</dfn> means a pre-order, depth-first traversal of DOM nodes involved
+  (through the <code title=dom-Node-parentNode><a href=#dom-node-parentnode>parentNode</a></code>/<code title=dom-Node-childNodes><a href=#dom-node-childnodes>childNodes</a></code> relationship).</p>
+
+  <p>When it is stated that some element or attribute is <dfn id=ignore title=ignore>ignored</dfn>, or
+  treated as some other value, or handled as if it was something else, this refers only to the
+  processing of the node after it is in the DOM. <span class=impl>A user agent must not mutate the
+  DOM in such situations.</span></p>
+
+  <p>A content attribute is said to <dfn title="">change</dfn> value only if its new value is
+  different than its previous value; setting an attribute to a value it already has does not change
+  it.</p>
+
+  <p>The term <dfn title="">empty</dfn>, when used of an attribute value, <code><a href=#text>Text</a></code> node, or
+  string, means that the length of the text is zero (i.e. not even containing spaces or <a href=#control-characters>control
+  characters</a>).</p>
+
+
+  <h4 id=scripting-0><span class=secno>2.1.4 </span>Scripting</h4>
+
+  <p>The construction "a <code>Foo</code> object", where <code>Foo</code> is actually an interface,
+  is sometimes used instead of the more accurate "an object implementing the interface
+  <code>Foo</code>".</p>
+
+  <p>An IDL attribute is said to be <dfn title="">getting</dfn> when its value is being retrieved
+  (e.g. by author script), and is said to be <dfn title="">setting</dfn> when a new value is
+  assigned to it.</p>
+
+  <p>If a DOM object is said to be <dfn id=live>live</dfn>, then the attributes and methods on that object
+  <span class=impl>must</span> operate on the actual underlying data, not a snapshot of the
+  data.</p>
+
+  <p>In the contexts of events, the terms <i>fire</i> and <i>dispatch</i> are used as defined in the
+  DOM specification: <dfn id=concept-event-fire title=concept-event-fire>firing</dfn> an event means to create and <a href=#concept-event-dispatch title=concept-event-dispatch>dispatch</a> it, and <dfn id=concept-event-dispatch title=concept-event-dispatch>dispatching</dfn> an event means to follow the steps that propagate
+  the event through the tree. The term <dfn id=concept-events-trusted title=concept-events-trusted>trusted event</dfn> is
+  used to refer to events whose <code title=dom-event-isTrusted><a href=#dom-event-istrusted>isTrusted</a></code> attribute is
+  initialized to true. <a href=#refsDOM>[DOM]</a></p>
+
+
+  <h4 id=plugins><span class=secno>2.1.5 </span>Plugins</h4>
+
+  <p>The term <dfn id=plugin>plugin</dfn> refers to a user-agent defined set of content handlers used by the
+  user agent that can take part in the user agent's rendering of a <code><a href=#document>Document</a></code> object, but
+  that neither act as <a href=#child-browsing-context title="child browsing context">child browsing contexts</a> of the
+  <code><a href=#document>Document</a></code> nor introduce any <code><a href=#node>Node</a></code> objects to the <code><a href=#document>Document</a></code>'s
+  DOM.</p>
+
+  <p>Typically such content handlers are provided by third parties, though a user agent can also
+  designate built-in content handlers as plugins.</p>
+
+  <div class=impl>
+
+  <p>A user agent must not consider the types <code>text/plain</code> and
+  <code>application/octet-stream</code> as having a registered <a href=#plugin>plugin</a>.</p> <!-- because
+  of the way <object> handles those types, if nothing else (it also doesn't make any sense to have a
+  plugin registered for those types, of course) -->
+
+  </div>
+
+  <p class=example>One example of a plugin would be a PDF viewer that is instantiated in a
+  <a href=#browsing-context>browsing context</a> when the user navigates to a PDF file. This would count as a plugin
+  regardless of whether the party that implemented the PDF viewer component was the same as that
+  which implemented the user agent itself. However, a PDF viewer application that launches separate
+  from the user agent (as opposed to using the same interface) is not a plugin by this
+  definition.</p>
+
+  <p class=note>This specification does not define a mechanism for interacting with plugins, as it
+  is expected to be user-agent- and platform-specific. Some UAs might opt to support a plugin
+  mechanism such as the Netscape Plugin API; others might use remote content converters or have
+  built-in support for certain types. Indeed, this specification doesn't require user agents to
+  support plugins at all. <a href=#refsNPAPI>[NPAPI]</a></p>
+
+  <p>A plugin can be <dfn id=concept-plugin-secure title=concept-plugin-secure>secured</dfn> if it honors the semantics of
+  the <code title=attr-iframe-sandbox><a href=#attr-iframe-sandbox>sandbox</a></code> attribute.</p>
+
+  <p class=example>For example, a secured plugin would prevent its contents from creating pop-up
+  windows when the plugin is instantiated inside a sandboxed <code><a href=#the-iframe-element>iframe</a></code>.</p>
+
+  <div class=impl>
+
+  <p class=warning>Browsers should take extreme care when interacting with external content
+  intended for <a href=#plugin title=plugin>plugins</a>. When third-party software is run with the same
+  privileges as the user agent itself, vulnerabilities in the third-party software become as
+  dangerous as those in the user agent.</p>
+
+  <p>Since different users having differents sets of <a href=#plugin title=plugin>plugins</a> provides a
+  fingerprinting vector that increases the chances of users being uniquely identified, user agents
+  are encouraged to support the exact same set of <a href=#plugin title=plugin>plugins</a> for each
+  user.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  </div>
+
+
+
+  <h4 id=encoding-terminology><span class=secno>2.1.6 </span>Character encodings</h4>
+
+  <p>A <dfn id=encoding title=encoding>character encoding</dfn>, or just <i><a href=#encoding>encoding</a></i> where that is not
+  ambiguous, is a defined way to convert between byte streams and Unicode strings, as defined in the
+  WHATWG Encoding standard. An <a href=#encoding>encoding</a> has an <dfn id=encoding-name>encoding name</dfn> and one or more
+  <dfn id=encoding-label title="encoding label">encoding labels</dfn>, referred to as the encoding's <i>name</i> and
+  <i>labels</i> in the Encoding specification. <a href=#refsENCODING>[ENCODING]</a></p>
+
+  <p>An <dfn id=ascii-compatible-character-encoding>ASCII-compatible character encoding</dfn> is a single-byte or variable-length
+  <a href=#encoding>encoding</a> in which the bytes 0x09, 0x0A, 0x0C, 0x0D, 0x20 - 0x22, 0x26, 0x27, 0x2C -
+  0x3F, 0x41 - 0x5A, and 0x61 - 0x7A<!-- is that list ok? do any character sets we want to support
+  do things outside that range? -->, ignoring bytes that are the second and later bytes of multibyte
+  sequences, all correspond to single-byte sequences that map to the same Unicode characters as
+  those bytes in Windows-1252<!--ANSI_X3.4-1968 (US-ASCII)-->. <a href=#refsENCODING>[ENCODING]</a></p>
+
+  <p class=note>This includes such encodings as Shift_JIS, HZ-GB-2312, and variants of ISO-2022,
+  even though it is possible in these encodings for bytes like 0x70 to be part of longer sequences
+  that are unrelated to their interpretation as ASCII. It excludes UTF-16 variants, as well as
+  obsolete legacy encodings such as UTF-7, GSM03.38, and EBCDIC variants.</p>
+
+  <!--
+   We'll have to change that if anyone comes up with a way to have a document that is valid as two
+   different encodings at once, with different <meta charset> elements applying in each case.
+  -->
+
+  <p>The term <dfn id=a-utf-16-encoding>a UTF-16 encoding</dfn> refers to any variant of UTF-16: UTF-16LE or UTF-16BE,
+  regardless of the presence or absence of a BOM. <a href=#refsENCODING>[ENCODING]</a></p>
+
+  <p>The term <dfn id=code-unit>code unit</dfn> is used as defined in the Web IDL specification: a 16 bit
+  unsigned integer, the smallest atomic component of a <code>DOMString</code>. (This is a narrower
+  definition than the one used in Unicode, and is not the same as a <i>code point</i>.) <a href=#refsWEBIDL>[WEBIDL]</a></p>
+
+  <p>The term <dfn id=unicode-code-point>Unicode code point</dfn> means a <i title="">Unicode scalar value</i> where
+  possible, and an isolated surrogate code point when not. When a conformance requirement is defined
+  in terms of characters or Unicode code points, a pair of <a href=#code-unit title="code unit">code units</a>
+  consisting of a high surrogate followed by a low surrogate must be treated as the single code
+  point represented by the surrogate pair, but isolated surrogates must each be treated as the
+  single code point with the value of the surrogate. <a href=#refsUNICODE>[UNICODE]</a></p>
+
+  <p>In this specification, the term <dfn id=character>character</dfn>, when not qualified as <em>Unicode</em>
+  character, is synonymous with the term <a href=#unicode-code-point>Unicode code point</a>.</p>
+
+  <p>The term <dfn id=unicode-character>Unicode character</dfn> is used to mean a <i title="">Unicode scalar value</i>
+  (i.e. any Unicode code point that is not a surrogate code point). <a href=#refsUNICODE>[UNICODE]</a></p>
+
+  <p>The <dfn id=code-unit-length>code-unit length</dfn> of a string is the number of <a href=#code-unit title="code unit">code
+  units</a> in that string.</p>
+
+  <p class=note>This complexity results from the historical decision to define the DOM API in
+  terms of 16 bit (UTF-16) <a href=#code-unit title="code unit">code units</a>, rather than in terms of <a href=#unicode-character title="Unicode character">Unicode characters</a>.</p>
+
+
+
+
+
+  <h3 id=conformance-requirements><span class=secno>2.2 </span>Conformance requirements</h3>
+
+  <p>All diagrams, examples, and notes in this specification are non-normative, as are all sections
+  explicitly marked non-normative. Everything else in this specification is normative.</p>
+
+  <p>The key words "MUST", "MUST NOT", "REQUIRED", <!--"SHALL", "SHALL NOT",--> "SHOULD", "SHOULD
+  NOT", <!--"RECOMMENDED", "NOT RECOMMENDED",--> "MAY", and "OPTIONAL" in the normative parts of
+  this document are to be interpreted as described in RFC2119. The key word "OPTIONALLY" in the
+  normative parts of this document is to be interpreted with the same normative meaning as "MAY" and
+  "OPTIONAL". For readability, these words do not appear in all uppercase letters in this
+  specification. <a href=#refsRFC2119>[RFC2119]</a></p>
+
+  <div class=impl>
+
+  <p>Requirements phrased in the imperative as part of algorithms (such as "strip any leading space
+  characters" or "return false and abort these steps") are to be interpreted with the meaning of the
+  key word ("must", "should", "may", etc) used in introducing the algorithm.</p>
+
+  <div class=example>
+
+   <p>For example, were the spec to say:</p>
+
+   <pre>To eat an orange, the user must:
+1. Peel the orange.
+2. Separate each slice of the orange.
+3. Eat the orange slices.</pre>
+
+   <p>...it would be equivalent to the following:</p>
+
+   <pre>To eat an orange:
+1. The user must peel the orange.
+2. The user must separate each slice of the orange.
+3. The user must eat the orange slices.</pre>
+
+   <p>Here the key word is "must".</p>
+
+   <p>The former (imperative) style is generally preferred in this specification for stylistic
+   reasons.</p>
+
+  </div>
+
+  <p>Conformance requirements phrased as algorithms or specific steps may be implemented in any
+  manner, so long as the end result is equivalent. (In particular, the algorithms defined in this
+  specification are intended to be easy to follow, and not intended to be performant.)</p>
+
+  </div>
+
+
+
+  <div class=impl>
+
+  <h4 id=conformance-classes><span class=secno>2.2.1 </span>Conformance classes</h4>
+
+  <p>This specification describes the conformance criteria for <span class=impl>user agents
+  (relevant to implementors) and</span> documents<span class=impl> (relevant to authors and
+  authoring tool implementors)</span>.</p>
+
+  <p><dfn id=conforming-documents>Conforming documents</dfn> are those that comply with all the conformance criteria for
+  documents. For readability, some of these conformance requirements are phrased as conformance
+  requirements on authors; such requirements are implicitly requirements on documents: by
+  definition, all documents are assumed to have had an author. (In some cases, that author may
+  itself be a user agent &mdash; such user agents are subject to additional rules, as explained
+  below.)</p>
+
+  <p class=example>For example, if a requirement states that "authors must not use the <code title="">foobar</code> element", it would imply that documents are not allowed to contain elements
+  named <code title="">foobar</code>.</p>
+
+  <p class="note impl">There is no implied relationship between document conformance requirements
+  and implementation conformance requirements. User agents are not free to handle non-conformant
+  documents as they please; the processing model described in this specification applies to
+  implementations regardless of the conformity of the input documents.</p>
+
+  <p>User agents fall into several (overlapping) categories with different conformance
+  requirements.</p>
+
+  <dl><dt id=interactive>Web browsers and other interactive user agents</dt>
+
+   <dd>
+
+    <p>Web browsers that support <a href=#the-xhtml-syntax>the XHTML syntax</a> must process elements and attributes
+    from the <a href=#html-namespace-0>HTML namespace</a> found in XML documents as described in this specification,
+    so that users can interact with them, unless the semantics of those elements have been
+    overridden by other specifications.</p>
+
+    <p class=example>A conforming XHTML processor would, upon finding an XHTML <code><a href=#the-script-element>script</a></code>
+    element in an XML document, execute the script contained in that element. However, if the
+    element is found within a transformation expressed in XSLT (assuming the user agent also
+    supports XSLT), then the processor would instead treat the <code><a href=#the-script-element>script</a></code> element as an
+    opaque element that forms part of the transform.</p>
+
+    <p>Web browsers that support <a href=#syntax>the HTML syntax</a> must process documents labeled with an
+    <a href=#html-mime-type>HTML MIME type</a> as described in this specification, so that users can interact with
+    them.</p>
+
+    <p>User agents that support scripting must also be conforming implementations of the IDL
+    fragments in this specification, as described in the Web IDL specification. <a href=#refsWEBIDL>[WEBIDL]</a></p>
+
+    <p class=note>Unless explicitly stated, specifications that override the semantics of HTML
+    elements do not override the requirements on DOM objects representing those elements. For
+    example, the <code><a href=#the-script-element>script</a></code> element in the example above would still implement the
+    <code><a href=#htmlscriptelement>HTMLScriptElement</a></code> interface.</p>
+
+   </dd>
+
+   <dt id=non-interactive>Non-interactive presentation user agents</dt>
+
+   <dd>
+
+    <p>User agents that process HTML and XHTML documents purely to render non-interactive versions
+    of them must comply to the same conformance criteria as Web browsers, except that they are
+    exempt from requirements regarding user interaction.</p>
+
+    <p class=note>Typical examples of non-interactive presentation user agents are printers
+    (static UAs) and overhead displays (dynamic UAs). It is expected that most static
+    non-interactive presentation user agents will also opt to <a href=#non-scripted>lack scripting
+    support</a>.</p>
+
+    <p class=example>A non-interactive but dynamic presentation UA would still execute scripts,
+    allowing forms to be dynamically submitted, and so forth. However, since the concept of "focus"
+    is irrelevant when the user cannot interact with the document, the UA would not need to support
+    any of the focus-related DOM APIs.</p>
+
+   </dd>
+
+   <dt id=renderingUA>Visual user agents that support the suggested default rendering</dt>
+
+   <dd>
+
+    <p>User agents, whether interactive or not, may be designated (possibly as a user option) as
+    supporting the suggested default rendering defined by this specification.</p>
+
+    <p>This is not required. In particular, even user agents that do implement the suggested default
+    rendering are encouraged to offer settings that override this default to improve the experience
+    for the user, e.g. changing the color contrast, using different focus styles, or otherwise
+    making the experience more accessible and usable to the user.</p>
+
+    <p>User agents that are designated as supporting the suggested default rendering must, while so
+    designated, implement the rules in <a href=#rendering>the rendering section</a> that that
+    section defines as the behavior that user agents are <em>expected</em> to implement.</p>
+
+   </dd>
+
+   <dt id=non-scripted>User agents with no scripting support</dt>
+
+   <dd>
+
+    <p>Implementations that do not support scripting (or which have their scripting features
+    disabled entirely) are exempt from supporting the events and DOM interfaces mentioned in this
+    specification. For the parts of this specification that are defined in terms of an events model
+    or in terms of the DOM, such user agents must still act as if events and the DOM were
+    supported.</p>
+
+    <p class=note>Scripting can form an integral part of an application. Web browsers that do not
+    support scripting, or that have scripting disabled, might be unable to fully convey the author's
+    intent.</p>
+
+   </dd>
+
+
+   <dt>Conformance checkers</dt>
+
+   <dd id=conformance-checkers>
+
+    <p>Conformance checkers must verify that a document conforms to the applicable conformance
+    criteria described in this specification. Automated conformance checkers are exempt from
+    detecting errors that require interpretation of the author's intent (for example, while a
+    document is non-conforming if the content of a <code><a href=#the-blockquote-element>blockquote</a></code> element is not a quote,
+    conformance checkers running without the input of human judgement do not have to check that
+    <code><a href=#the-blockquote-element>blockquote</a></code> elements only contain quoted material).</p>
+
+    <p>Conformance checkers must check that the input document conforms when parsed without a
+    <a href=#browsing-context>browsing context</a> (meaning that no scripts are run, and that the parser's
+    <a href=#scripting-flag>scripting flag</a> is disabled), and should also check that the input document conforms
+    when parsed with a <a href=#browsing-context>browsing context</a> in which scripts execute, and that the scripts
+    never cause non-conforming states to occur other than transiently during script execution
+    itself. (This is only a "SHOULD" and not a "MUST" requirement because it has been proven to be
+    impossible. <a href=#refsCOMPUTABLE>[COMPUTABLE]</a>)</p>
+
+    <p>The term "HTML validator" can be used to refer to a conformance checker that itself conforms
+    to the applicable requirements of this specification.</p>
+
+    <div class=note>
+
+     <p>XML DTDs cannot express all the conformance requirements of this specification. Therefore, a
+     validating XML processor and a DTD cannot constitute a conformance checker. Also, since neither
+     of the two authoring formats defined in this specification are applications of SGML, a
+     validating SGML system cannot constitute a conformance checker either.</p>
+
+     <p>To put it another way, there are three types of conformance criteria:</p>
+
+     <ol><li>Criteria that can be expressed in a DTD.</li>
+
+      <li>Criteria that cannot be expressed by a DTD, but can still be checked by a machine.</li>
+
+      <li>Criteria that can only be checked by a human.</li>
+
+     </ol><p>A conformance checker must check for the first two. A simple DTD-based validator only checks
+     for the first class of errors and is therefore not a conforming conformance checker according
+     to this specification.</p>
+
+    </div>
+   </dd>
+
+
+   <dt>Data mining tools</dt>
+
+   <dd id=data-mining>
+
+    <p>Applications and tools that process HTML and XHTML documents for reasons other than to either
+    render the documents or check them for conformance should act in accordance with the semantics
+    of the documents that they process.</p>
+
+    <p class=example>A tool that generates <a href=#outline title=outline>document outlines</a> but
+    increases the nesting level for each paragraph and does not increase the nesting level for each
+    section would not be conforming.</p>
+
+   </dd>
+
+
+   <dt id=editors>Authoring tools and markup generators</dt>
+
+   <dd>
+
+    <p>Authoring tools and markup generators must generate <a href=#conforming-documents>conforming documents</a>.
+    Conformance criteria that apply to authors also apply to authoring tools, where appropriate.</p>
+
+    <p>Authoring tools are exempt from the strict requirements of using elements only for their
+    specified purpose, but only to the extent that authoring tools are not yet able to determine
+    author intent. However, authoring tools must not automatically misuse elements or encourage
+    their users to do so.</p>
+
+    <p class=example>For example, it is not conforming to use an <code><a href=#the-address-element>address</a></code> element for
+    arbitrary contact information; that element can only be used for marking up contact information
+    for the author of the document or section. However, since an authoring tool is likely unable to
+    determine the difference, an authoring tool is exempt from that requirement. This does not mean,
+    though, that authoring tools can use <code><a href=#the-address-element>address</a></code> elements for any block of italics text
+    (for instance); it just means that the authoring tool doesn't have to verify that when the user
+    uses a tool for inserting contact information for a section, that the user really is doing that
+    and not inserting something else instead.</p>
+
+    <p class=note>In terms of conformance checking, an editor has to output documents that conform
+    to the same extent that a conformance checker will verify.</p>
+
+    <p>When an authoring tool is used to edit a non-conforming document, it may preserve the
+    conformance errors in sections of the document that were not edited during the editing session
+    (i.e. an editing tool is allowed to round-trip erroneous content). However, an authoring tool
+    must not claim that the output is conformant if errors have been so preserved.</p>
+
+    <p>Authoring tools are expected to come in two broad varieties: tools that work from structure
+    or semantic data, and tools that work on a What-You-See-Is-What-You-Get media-specific editing
+    basis (WYSIWYG).</p>
+
+    <p>The former is the preferred mechanism for tools that author HTML, since the structure in the
+    source information can be used to make informed choices regarding which HTML elements and
+    attributes are most appropriate.</p>
+
+    <p>However, WYSIWYG tools are legitimate. WYSIWYG tools should use elements they know are
+    appropriate, and should not use elements that they do not know to be appropriate. This might in
+    certain extreme cases mean limiting the use of flow elements to just a few elements, like
+    <code><a href=#the-div-element>div</a></code>, <code><a href=#the-b-element>b</a></code>, <code><a href=#the-i-element>i</a></code>, and <code><a href=#the-span-element>span</a></code> and making liberal use
+    of the <code title=attr-style><a href=#the-style-attribute>style</a></code> attribute.</p>
+
+    <p>All authoring tools, whether WYSIWYG or not, should make a best effort attempt at enabling
+    users to create well-structured, semantically rich, media-independent content.</p>
+
+   </dd>
+
+  </dl><p id=hardwareLimitations>User agents may impose implementation-specific limits on otherwise
+  unconstrained inputs, e.g. to prevent denial of service attacks, to guard against running out of
+  memory, or to work around platform-specific limitations.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>For compatibility with existing content and prior specifications, this specification describes
+  two authoring formats: one based on XML (referred to as <a href=#the-xhtml-syntax>the XHTML syntax</a>), and one
+  using a <a href=#writing>custom format</a> inspired by SGML (referred to as <a href=#syntax>the HTML
+  syntax</a>). Implementations must support at least one of these two formats, although
+  supporting both is encouraged.</p>
+
+  <p>Some conformance requirements are phrased as requirements on elements, attributes, methods or
+  objects. Such requirements fall into two categories: those describing content model restrictions,
+  and those describing implementation behavior. Those in the former category are requirements on
+  documents and authoring tools. Those in the second category are requirements on user agents.
+  Similarly, some conformance requirements are phrased as requirements on authors; such requirements
+  are to be interpreted as conformance requirements on the documents that authors produce. (In other
+  words, this specification does not distinguish between conformance criteria on authors and
+  conformance criteria on documents.)</p>
+
+  </div>
+
+
+  <div class=impl>
+
+  <h4 id=dependencies><span class=secno>2.2.2 </span>Dependencies</h4>
+
+  <p>This specification relies on several other underlying specifications.</p>
+
+  <dl><dt>Unicode and Encoding</dt>
+
+   <dd>
+
+    <p>The Unicode character set is used to represent textual data, and the WHATWG Encoding standard
+    defines requirements around <a href=#encoding title=encoding>character encodings</a>. <a href=#refsUNICODE>[UNICODE]</a></p>
+
+    <p class=note>This specification <a href=#encoding-terminology>introduces terminology</a>
+    based on the terms defined in those specifications, as described earlier.</p>
+
+    <p>The following terms are used as defined in the Encoding specification: <a href=#refsENCODING>[ENCODING]</a></p>
+
+    <ul class=brief><li><dfn id=getting-an-encoding>Getting an encoding</dfn>
+
+     <li>The <dfn id=encoder>encoder</dfn> and <dfn id=decoder>decoder</dfn> algorithms for various encodings, including
+     the <dfn id=utf-8-encoder>UTF-8 encoder</dfn> and <dfn id=utf-8-decoder>UTF-8 decoder</dfn>
+
+     <li>The generic <dfn id=decode>decode</dfn> algorithm which takes a byte stream and an encoding and
+     returns a character stream
+
+     <li>The <dfn id=utf-8-decode>UTF-8 decode</dfn> algorithm which takes a byte stream and returns a character
+     stream, additionally stripping one leading UTF-8 Byte Order Mark (BOM), if any
+
+    </ul><p class=note>The <a href=#utf-8-decoder>UTF-8 decoder</a> is distinct from the <i>UTF-8 decode
+    algorithm</i>. The latter first strips a Byte Order Mark (BOM), if any, and then invokes the
+    former.</p>
+
+    <p>For readability, character encodings are sometimes referenced in this specification with a
+    case that differs from the canonical case given in the encoding standard. (For example,
+    "UTF-16LE" instead of "utf-16le".)</p>
+
+   </dd>
+
+
+   <dt>XML</dt>
+
+   <dd>
+
+    <p>Implementations that support <a href=#the-xhtml-syntax>the XHTML syntax</a> must support some version of XML,
+    as well as its corresponding namespaces specification, because that syntax uses an XML
+    serialization with namespaces. <a href=#refsXML>[XML]</a> <a href=#refsXMLNS>[XMLNS]</a></p>
+
+   </dd>
+
+
+   <dt>URLs</dt>
+
+   <dd>
+
+    <p>The following terms are defined in the URL standard: <a href=#refsURL>[URL]</a></p>
+
+    <ul class=brief><li><dfn id=url>URL</dfn>
+     <li><dfn id=absolute-url>Absolute URL</dfn>
+     <li><dfn id=relative-url>Relative URL</dfn>
+     <li><dfn id=concept-url-scheme-relative title=concept-url-scheme-relative>Relative schemes</dfn>
+     <li>The <dfn id=url-parser>URL parser</dfn>
+     <li><dfn id=parsed-url>Parsed URL</dfn>
+     <li>The <dfn id=concept-url-scheme title=concept-url-scheme>scheme</dfn> component of a <a href=#parsed-url>parsed URL</a>
+     <li>The <dfn id=concept-url-scheme-data title="concept-url-scheme data">scheme data</dfn> component of a <a href=#parsed-url>parsed URL</a>
+     <li>The <dfn id=concept-url-username title=concept-url-username>username</dfn> component of a <a href=#parsed-url>parsed URL</a>
+     <li>The <dfn id=concept-url-password title=concept-url-password>password</dfn> component of a <a href=#parsed-url>parsed URL</a>
+     <li>The <dfn id=concept-url-host title=concept-url-host>host</dfn> component of a <a href=#parsed-url>parsed URL</a>
+     <li>The <dfn id=concept-url-port title=concept-url-port>port</dfn> component of a <a href=#parsed-url>parsed URL</a>
+     <li>The <dfn id=concept-url-path title=concept-url-path>path</dfn> component of a <a href=#parsed-url>parsed URL</a>
+     <li>The <dfn id=concept-url-query title=concept-url-query>query</dfn> component of a <a href=#parsed-url>parsed URL</a>
+     <li>The <dfn id=concept-url-fragment title=concept-url-fragment>fragment</dfn> component of a <a href=#parsed-url>parsed URL</a>
+     <li><dfn id=concept-url-parse-error title=concept-url-parse-error>Parse errors</dfn> from the <a href=#url-parser>URL parser</a>
+     <li>The <dfn id=concept-url-serializer title=concept-url-serializer>URL serializer</dfn>
+     <li><dfn id=default-encode-set>Default encode set</dfn>
+     <li><dfn id=percent-encode>Percent encode</dfn>
+     <li><dfn id=utf-8-percent-encode>UTF-8 percent encode</dfn>
+     <li><dfn id=percent-decode>Percent decode</dfn>
+     <li><dfn id=decoder-error>Decoder error</dfn>
+     <li><dfn id=urlutils><code>URLUtils</code></dfn> interface
+     <li><dfn id=urlutilsreadonly><code>URLUtilsReadOnly</code></dfn> interface
+     <li><dfn id=dom-url-href title=dom-url-href><code>href</code> attribute</dfn>
+     <li><dfn id=dom-url-protocol title=dom-url-protocol><code>protocol</code> attribute</dfn>
+     <li>The <dfn id=concept-uu-get-the-base title=concept-uu-get-the-base>get the base</dfn> hook for <code><a href=#urlutils>URLUtils</a></code>
+     <li>The <dfn id=concept-uu-update title=concept-uu-update>update steps</dfn> hook for <code><a href=#urlutils>URLUtils</a></code>
+     <li>The <dfn id=concept-uu-set-the-input title=concept-uu-set-the-input>set the input</dfn> algorithm for <code><a href=#urlutils>URLUtils</a></code>
+     <li>The <dfn id=concept-uu-query-encoding title=concept-uu-query-encoding>query encoding</dfn> of an <code><a href=#urlutils>URLUtils</a></code> object
+     <li>The <dfn id=concept-uu-input title=concept-uu-input>input</dfn> of an <code><a href=#urlutils>URLUtils</a></code> object
+     <li>The <dfn id=concept-uu-url title=concept-uu-url>url</dfn> of an <code><a href=#urlutils>URLUtils</a></code> object
+    </ul></dd>
+
+
+   <dt>Cookies</dt>
+
+   <dd>
+
+    <p>The following terms are defined in the Cookie specification: <a href=#refsCOOKIES>[COOKIES]</a></p>
+
+    <ul class=brief><li><dfn id=cookie-string>cookie-string</dfn>
+     <li><dfn id=receives-a-set-cookie-string>receives a set-cookie-string</dfn>
+    </ul></dd>
+
+
+   <dt>CORS</dt>
+
+   <dd>
+
+    <p>The following terms are defined in the CORS specification: <a href=#refsCORS>[CORS]</a></p>
+
+    <ul class=brief><li><dfn id=cross-origin-request>cross-origin request</dfn>
+     <li><dfn id=cross-origin-request-status>cross-origin request status</dfn>
+     <li><dfn id=custom-request-headers>custom request headers</dfn>
+     <li><dfn id=simple-cross-origin-request>simple cross-origin request</dfn>
+     <li><dfn id=redirect-steps>redirect steps</dfn>
+     <li><dfn id=omit-credentials-flag>omit credentials flag</dfn>
+     <li><dfn id=resource-sharing-check>resource sharing check</dfn>
+    </ul></dd>
+
+
+<!--TOPIC:DOM APIs-->
+
+   <dt>Web IDL</dt>
+
+   <dd>
+
+    <p>The IDL fragments in this specification must be interpreted as required for conforming IDL
+    fragments, as described in the Web IDL specification. <a href=#refsWEBIDL>[WEBIDL]</a></p>
+
+    <p>The terms <dfn id=supported-property-indices>supported property indices</dfn>, <dfn id=determine-the-value-of-an-indexed-property>determine the value
+    of an indexed property</dfn>, <dfn id=support-named-properties>support named properties</dfn>, <dfn id=supported-property-names>supported property
+    names</dfn>, <dfn id=determine-the-value-of-a-named-property>determine the value of a named property</dfn>, <dfn id=platform-array-objects>platform array
+    objects</dfn>, and <dfn id=dfn-read-only-array title=dfn-read-only-array>read only</dfn> (when applied to arrays) are
+    used as defined in the Web IDL specification. The algorithm to <dfn id=convert-a-domstring-to-a-sequence-of-unicode-characters>convert a DOMString to a
+    sequence of Unicode characters</dfn> is similarly that defined in the Web IDL specification.</p>
+
+    <p>Where this specification says an interface or exception is <dfn id=exposed-to-javascript>exposed to JavaScript</dfn>,
+    it refers to the manner, described in the Web IDL specification, in which an ECMAScript global
+    environment <i title=dfn-expose>exposes</i> interfaces and exceptions.</p>
+
+    <p>When this specification requires a user agent to <dfn id=create-a-date-object>create a <code>Date</code> object</dfn>
+    representing a particular time (which could be the special value Not-a-Number), the milliseconds
+    component of that time, if any, must be truncated to an integer, and the time value of the newly
+    created <code>Date</code> object must represent the resulting truncated time.</p>
+
+    <p class=example>For instance, given the time 23045 millionths of a second after 01:00 UTC on
+    January 1st 2000, i.e. the time 2000-01-01T00:00:00.023045Z, then the <code>Date</code> object
+    created representing that time would represent the same time as that created representing the
+    time 2000-01-01T00:00:00.023Z, 45 millionths earlier. If the given time is NaN, then the result
+    is a <code>Date</code> object that represents a time value NaN (indicating that the object does
+    not represent a specific instant of time).</p>
+
+   </dd>
+
+
+   <dt>JavaScript</dt>
+
+   <dd>
+
+    <p>Some parts of the language described by this specification only support JavaScript as the
+    underlying scripting language. <a href=#refsECMA262>[ECMA262]</a></p>
+
+    <p class=note>The term "JavaScript" is used to refer to ECMA262, rather than the official term
+    ECMAScript, since the term JavaScript is more widely known. Similarly, the <a href=#mime-type>MIME
+    type</a> used to refer to JavaScript in this specification is <code title="">text/javascript</code>, since that is the most commonly used type, <a href=#willful-violation title="willful
+    violation">despite it being an officially obsoleted type</a> according to RFC 4329. <a href=#refsRFC4329>[RFC4329]</a></p>
+
+    <p>The term <dfn id=javascript-global-environment>JavaScript global environment</dfn> refers to the <i title="">global
+    environment</i> concept defined in the ECMAScript specification.</p>
+
+    <p>The ECMAScript <dfn id=js-syntaxerror title=js-SyntaxError><code>SyntaxError</code></dfn> exception is also
+    defined in the ECMAScript specification. <a href=#refsECMA262>[ECMA262]</a></p>
+
+   </dd>
+
+
+   <dt>DOM</dt>
+
+   <dd>
+
+    <p>The Document Object Model (DOM) is a representation &mdash; a model &mdash; of a document and
+    its content. The DOM is not just an API; the conformance criteria of HTML implementations are
+    defined, in this specification, in terms of operations on the DOM. <a href=#refsDOM>[DOM]</a></p>
+
+    <p>Implementations must support DOM and the events defined in DOM Events, because this
+    specification is defined in terms of the DOM, and some of the features are defined as extensions
+    to the DOM interfaces. <a href=#refsDOM>[DOM]</a> <a href=#refsDOMEVENTS>[DOMEVENTS]</a></p>
+
+    <p>In particular, the following features are defined in the DOM specification: <a href=#refsDOM>[DOM]</a></p> <!-- aka DOM Core or DOMCORE -->
+
+    <ul class=brief><li><dfn id=attr><code>Attr</code></dfn> interface</li>
+     <li><dfn id=comment-0><code>Comment</code></dfn> interface</li>
+     <li><dfn id=domimplementation><code>DOMImplementation</code></dfn> interface</li>
+     <li><dfn id=dom-document title="DOM Document"><code>Document</code></dfn> interface</li>
+     <li><dfn id=documentfragment><code>DocumentFragment</code></dfn> interface</li>
+     <li><dfn id=documenttype><code>DocumentType</code></dfn> interface</li>
+     <li><dfn id=domexception><code>DOMException</code></dfn> interface</li>
+     <li><dfn id=childnode><code>ChildNode</code></dfn> interface</li>
+     <li><dfn id=element><code>Element</code></dfn> interface</li>
+     <li><dfn id=node><code>Node</code></dfn> interface</li>
+     <li><dfn id=nodelist><code>NodeList</code></dfn> interface</li>
+     <li><dfn id=processinginstruction><code>ProcessingInstruction</code></dfn> interface</li>
+     <li><dfn id=text><code>Text</code></dfn> interface</li>
+
+     <li><dfn id=htmlcollection><code>HTMLCollection</code></dfn> interface</li>
+     <li><dfn id=dom-htmlcollection-item title=dom-HTMLCollection-item><code>item()</code> method</dfn>
+     <li>The terms <dfn id=collections>collections</dfn> and <dfn id=represented-by-the-collection>represented by the collection</dfn></li>
+
+     <li><dfn id=domtokenlist><code>DOMTokenList</code></dfn> interface</li>
+     <li><dfn id=domsettabletokenlist><code>DOMSettableTokenList</code></dfn> interface</li>
+
+     <li><dfn id=dom-domimplementation-createdocument title=dom-DOMImplementation-createDocument><code>createDocument()</code></dfn> method</li>
+     <li><dfn id=dom-domimplementation-createhtmldocument title=dom-DOMImplementation-createHTMLDocument><code>createHTMLDocument()</code></dfn> method</li>
+     <li><dfn id=dom-document-createelement title=dom-Document-createElement><code>createElement()</code></dfn> method</li>
+     <li><dfn id=dom-document-createelementns title=dom-Document-createElementNS><code>createElementNS()</code></dfn> method</li>
+     <li><dfn id=dom-document-getelementbyid title=dom-Document-getElementById><code>getElementById()</code></dfn> method</li>
+     <li><dfn id=dom-node-insertbefore title=dom-Node-insertBefore><code>insertBefore()</code></dfn> method</li>
+
+     <li><dfn id=dom-node-ownerdocument title=dom-Node-ownerDocument><code>ownerDocument</code></dfn> attribute</li>
+     <li><dfn id=dom-node-childnodes title=dom-Node-childNodes><code>childNodes</code></dfn> attribute</li>
+     <li><dfn id=dom-node-localname title=dom-Node-localName><code>localName</code></dfn> attribute</li>
+     <li><dfn id=dom-node-parentnode title=dom-Node-parentNode><code>parentNode</code></dfn> attribute</li>
+     <li><dfn id=dom-node-namespaceuri title=dom-Node-namespaceURI><code>namespaceURI</code></dfn> attribute</li>
+     <li><dfn id=dom-element-tagname title=dom-Element-tagName><code>tagName</code></dfn> attribute</li>
+     <li><dfn id=dom-element-id title=dom-Element-id><code>id</code></dfn> attribute</li>
+     <li><dfn id=textcontent><code>textContent</code></dfn> attribute</li>
+
+     <li>The <dfn id=concept-node-insert title=concept-node-insert>insert</dfn>, <dfn id=concept-node-append title=concept-node-append>append</dfn>, <dfn id=concept-node-remove title=concept-node-remove>remove</dfn>, and <dfn id=concept-node-replace title=concept-node-replace>replace</dfn> algorithms for nodes</li>
+     <li>The <dfn id=nodes-are-inserted>nodes are inserted</dfn> and <dfn id=nodes-are-removed>nodes are removed</dfn> concepts</li>
+     <li>The <dfn id=attribute-list>attribute list</dfn> concept.</li>
+     <li>The <dfn id=concept-cd-data title=concept-cd-data>data</dfn> of a text node.</li>
+
+     <li><dfn id=event><code>Event</code></dfn> interface</li>
+     <li><dfn id=eventtarget><code>EventTarget</code></dfn> interface</li>
+     <li><dfn id=eventinit><code>EventInit</code></dfn> dictionary type</li>
+     <li><dfn id=dom-event-target title=dom-Event-target><code>target</code></dfn> attribute</li>
+     <li><dfn id=dom-event-istrusted title=dom-Event-isTrusted><code>isTrusted</code></dfn> attribute</li>
+     <li>The <dfn id=concept-event-type title=concept-event-type>type</dfn> of an event</li>
+     <li>The concept of an <dfn id=concept-event-listener title=concept-event-listener>event listener</dfn> and the <a href=#concept-event-listener title=concept-event-listener>event listeners</a> associated with an <code><a href=#eventtarget>EventTarget</a></code></li>
+     <li>The concept of a regular <dfn id=event-parent>event parent</dfn> and a <dfn id=cross-boundary-event-parent>cross-boundary event parent</dfn></li> <!-- see bug 18780 -->
+
+     <li>The <dfn id="document's-character-encoding" title="document's character encoding">encoding</dfn> (herein the <i>character encoding</i>) and <dfn id=concept-document-content-type title=concept-document-content-type>content type</dfn> of a <code><a href=#document>Document</a></code></li>
+     <li>The distinction between <dfn id=xml-documents>XML documents</dfn> and <dfn id=html-documents>HTML documents</dfn></li>
+     <li>The terms <dfn id=quirks-mode>quirks mode</dfn>, <dfn id=limited-quirks-mode>limited-quirks mode</dfn>, and <dfn id=no-quirks-mode>no-quirks mode</dfn></li>
+     <li>The algorithm to <dfn id=concept-node-clone title=concept-node-clone>clone</dfn> a <code><a href=#node>Node</a></code>, and the concept of <dfn id=concept-node-clone-ext title=concept-node-clone-ext>cloning steps</dfn> used by that algorithm</li>
+     <li>The concept of <dfn id=base-url-change-steps>base URL change steps</dfn> and the definition of what happens when an element is <dfn id=affected-by-a-base-url-change>affected by a base URL change</dfn></li>
+     <li>The concept of an element's <dfn id=concept-id title=concept-id>unique identifier (ID)</dfn></li>
+
+     <li>The concept of a DOM <dfn id=concept-range title=concept-range>range</dfn>, and the terms <dfn id=concept-range-start title=concept-range-start>start</dfn>, <dfn id=concept-range-end title=concept-range-end>end</dfn>, and <dfn id=concept-range-bp title=concept-range-bp>boundary point</dfn> as applied to ranges.</li>
+
+     <li><dfn id=mutationobserver><code>MutationObserver</code></dfn> interface</li>
+     <li>The <dfn id=mutationobserver-scripting-environment><code>MutationObserver</code> <var title="">scripting environment</var></dfn> concept</li>
+     <li>The <dfn id=concept-mo-invoke title=concept-mo-invoke>invoke <code>MutationObserver</code> objects</dfn> algorithm</li>
+
+     <li><dfn id=promise>Promise</dfn> interface</li>
+     <li>The <dfn id=concept-resolver title=concept-resolver>resolver</dfn> concept</li>
+     <li>The <dfn id=concept-resolver-fulfill title=concept-resolver-fulfill>fulfill</dfn> and <dfn id=concept-resolver-reject title=concept-resolver-reject>reject</dfn> algorithms</li>
+
+    </ul><p>The term <dfn id=throw>throw</dfn> in this specification is used as defined in the DOM specification.
+    The following <code><a href=#domexception>DOMException</a></code> types are defined in the DOM specification: <a href=#refsDOM>[DOM]</a></p>
+
+    <ol class=brief><li value=1><dfn id=indexsizeerror><code>IndexSizeError</code></dfn></li>
+     <li value=3><dfn id=hierarchyrequesterror><code>HierarchyRequestError</code></dfn></li>
+     <li value=4><dfn id=wrongdocumenterror><code>WrongDocumentError</code></dfn></li>
+     <li value=5><dfn id=invalidcharactererror><code>InvalidCharacterError</code></dfn></li>
+     <li value=7><dfn id=nomodificationallowederror><code>NoModificationAllowedError</code></dfn></li>
+     <li value=8><dfn id=notfounderror><code>NotFoundError</code></dfn></li>
+     <li value=9><dfn id=notsupportederror><code>NotSupportedError</code></dfn></li>
+     <li value=11><dfn id=invalidstateerror><code>InvalidStateError</code></dfn></li>
+     <li value=12><dfn id=syntaxerror><code>SyntaxError</code></dfn></li>
+     <li value=13><dfn id=invalidmodificationerror><code>InvalidModificationError</code></dfn></li>
+     <li value=14><dfn id=namespaceerror><code>NamespaceError</code></dfn></li>
+     <li value=15><dfn id=invalidaccesserror><code>InvalidAccessError</code></dfn></li>
+     <li value=18><dfn id=securityerror><code>SecurityError</code></dfn></li>
+     <li value=19><dfn id=networkerror><code>NetworkError</code></dfn></li>
+     <li value=20><dfn id=aborterror><code>AbortError</code></dfn></li>
+     <li value=21><dfn id=urlmismatcherror><code>URLMismatchError</code></dfn></li>
+     <li value=22><dfn id=quotaexceedederror><code>QuotaExceededError</code></dfn></li>
+     <li value=23><dfn id=timeouterror><code>TimeoutError</code></dfn></li>
+     <li value=24><dfn id=invalidnodetypeerror><code>InvalidNodeTypeError</code></dfn></li>
+     <li value=25><dfn id=datacloneerror><code>DataCloneError</code></dfn></li>
+    </ol><p class=example>For example, to <i>throw a <code><a href=#timeouterror>TimeoutError</a></code> exception</i>, a user
+    agent would construct a <code><a href=#domexception>DOMException</a></code> object whose type was the string "<code title="">TimeoutError</code>" (and whose code was the number 23, for legacy reasons) and
+    actually throw that object as an exception.</p>
+
+    <p>The <span title=concept-document-URL>URL</span> associated with a <code><a href=#document>Document</a></code>, as
+    defined in the DOM specification, is referred to in this specification as <a href="#the-document's-address">the document's
+    address</a>.</p>
+
+    <p>The following features are defined in the DOM Events specification: <a href=#refsDOMEVENTS>[DOMEVENTS]</a></p>
+
+    <ul class=brief><li><dfn id=mouseevent><code>MouseEvent</code></dfn> interface</li>
+     <li><dfn id=mouseeventinit><code>MouseEventInit</code></dfn> dictionary type</li>
+
+     <li>The <dfn id=uievent><code>UIEvent</code></dfn> interface's <dfn id=dom-uievent-detail title=dom-UIEvent-detail><code>detail</code></dfn> attribute</li>
+
+     <li><dfn id=event-click title=event-click><code>click</code></dfn> event</li>
+
+    </ul><p>This specification sometimes uses the term <dfn title="">name</dfn> to refer to the event's <code title=dom-event-type>type</code>; as in, "an event named <code title="">click</code>" or "if the event name is <code title="">keypress</code>". The terms "name" and "type" for events
+    are synonymous.</p>
+
+    <p>The following features are defined in the DOM Parsing and
+    Serialization specification: <a href=#refsDOMPARSING>[DOMPARSING]</a></p>
+
+    <ul class=brief><li><dfn id=dom-innerhtml title=dom-innerHTML><code>innerHTML</code></dfn></li>
+     <li><dfn id=dom-outerhtml title=dom-outerHTML><code>outerHTML</code></dfn></li>
+    </ul><p class=note>User agents are also encouraged to implement the
+    features described in the <cite>HTML Editing APIs</cite> and
+    <cite><code>UndoManager</code> and DOM Transaction</cite>
+    specifications.
+    <a href=#refsEDITING>[EDITING]</a>
+    <a href=#refsUNDO>[UNDO]</a>
+    </p>
+
+    <p>The following parts of the Fullscreen specification are referenced from this specification,
+    in part to define the rendering of <code><a href=#the-dialog-element>dialog</a></code> elements, and also to define how the
+    Fullscreen API interacts with the sandboxing features in HTML: <a href=#refsFULLSCREEN>[FULLSCREEN]</a></p>
+
+    <ul class=brief><li>The <dfn id=top-layer>top layer</dfn> concept</li>
+     <li><dfn id=dom-element-requestfullscreen title=dom-element-requestFullscreen><code>requestFullscreen()</code></dfn>
+     <li>The <dfn id=fullscreen-enabled-flag>fullscreen enabled flag</dfn></li>
+     <li>The <dfn id=fully-exit-fullscreen>fully exit fullscreen</dfn> algorithm</li>
+    </ul></dd>
+
+
+   <dt>Typed Arrays</dt>
+
+   <dd>
+
+    <p>The <dfn id=arraybuffer>ArrayBuffer</dfn> and <dfn id=arraybufferview>ArrayBufferView</dfn> interfaces and underlying concepts
+    from the Typed Array Specification are used for several features in this specification. The
+    <dfn id=uint8clampedarray>Uint8ClampedArray</dfn> interface type is specifically used in the definition of the
+    <code><a href=#the-canvas-element>canvas</a></code> element's 2D API. <a href=#refsTYPEDARRAY>[TYPEDARRAY]</a></p>
+
+   </dd>
+
+
+   <dt>File API</dt>
+
+   <dd>
+
+    <p>This specification uses the following features defined in the File API specification: <a href=#refsFILEAPI>[FILEAPI]</a></p>
+
+    <ul class=brief><li><dfn id=blob><code>Blob</code></dfn></li>
+     <li><dfn id=file><code>File</code></dfn></li>
+     <li><dfn id=filelist><code>FileList</code></dfn></li>
+     <li><dfn id=blob.close()><code title=dom-Blob-close>Blob.close()</code></dfn></li>
+     <li><dfn id=blob.type><code title=dom-Blob-type>Blob.type</code></dfn></li>
+     <li>The concept of <dfn id=file-error-read title=file-error-read>read errors</dfn></li>
+    </ul></dd>
+
+
+   <dt>XMLHttpRequest</dt>
+
+   <dd>
+
+    <p>This specification references the XMLHttpRequest specification to define how the two
+    specifications interact and to use its <code><a href=#progressevent>ProgressEvent</a></code> features. The following
+    features and terms are defined in the XMLHttpRequest specification: <a href=#refsXHR>[XHR]</a></p>
+
+    <ul class=brief><li><dfn id=document-response-entity-body>Document response entity body</dfn>
+     <li><dfn id=xmlhttprequest-base-url><code>XMLHttpRequest</code> base URL</dfn>
+     <li><dfn id=xmlhttprequest-origin><code>XMLHttpRequest</code> origin</dfn>
+     <li><dfn id=xmlhttprequest-referrer-source><code>XMLHttpRequest</code> referrer source</dfn>
+
+     <li><dfn id=progressevent><code>ProgressEvent</code></dfn>
+     <li><dfn id=fire-a-progress-event title="fire a progress event">Fire a progress event named <var title="">e</var></dfn>
+
+    </ul></dd>
+
+
+<!--TOPIC:HTML-->
+
+   <dt>Media Queries</dt>
+
+   <dd>
+
+    <p>Implementations must support the Media Queries language. <a href=#refsMQ>[MQ]</a></p>
+
+   </dd>
+
+
+   <dt>CSS modules</dt>
+
+   <dd>
+
+    <p>While support for CSS as a whole is not required of implementations of this specification
+    (though it is encouraged, at least for Web browsers), some features are defined in terms of
+    specific CSS requirements.</p>
+
+    <p>In particular, some features require that a string be <dfn id=parsed-as-a-css-color-value>parsed as a CSS &lt;color&gt;
+    value</dfn>. When parsing a CSS value, user agents are required by the CSS specifications to
+    apply some error handling rules. These apply to this specification also. <a href=#refsCSSCOLOR>[CSSCOLOR]</a> <a href=#refsCSS>[CSS]</a></p>
+
+    <p class=example>For example, user agents are required to close all open constructs upon
+    finding the end of a style sheet unexpectedly. Thus, when parsing the string "<code title="">rgb(0,0,0</code>" (with a missing close-parenthesis) for a color value, the close
+    parenthesis is implied by this error handling rule, and a value is obtained (the color 'black').
+    However, the similar construct "<code title="">rgb(0,0,</code>" (with both a missing parenthesis
+    and a missing "blue" value) cannot be parsed, as closing the open construct does not result in a
+    viable value.</p>
+
+    <p>The term <dfn id=css-element-reference-identifier>CSS element reference identifier</dfn> is used as defined in the <cite>CSS
+    Image Values and Replaced Content</cite> specification to define the API that declares
+    identifiers for use with the CSS 'element()' function. <a href=#refsCSSIMAGES>[CSSIMAGES]</a></p>
+
+    <p>Similarly, the term <dfn id=provides-a-paint-source>provides a paint source</dfn> is used as defined in the <cite>CSS
+    Image Values and Replaced Content</cite> specification to define the interaction of certain HTML
+    elements with the CSS 'element()' function. <a href=#refsCSSIMAGES>[CSSIMAGES]</a></p>
+
+    <p>The term <dfn id=default-object-size>default object size</dfn> is also defined in the <cite>CSS Image Values and
+    Replaced Content</cite> specification. <a href=#refsCSSIMAGES>[CSSIMAGES]</a></p>
+
+    <p>Support for the CSS Object Model is required for implementations that support scripting. The
+    following features and terms are defined in the CSSOM specifications: <a href=#refsCSSOM>[CSSOM]</a> <a href=#refsCSSOMVIEW>[CSSOMVIEW]</a>
+
+    <ul class=brief><li><dfn id=screen><code>Screen</code></dfn></li>
+     <li><dfn id=linkstyle><code>LinkStyle</code></dfn></li>
+     <li><dfn id=cssstyledeclaration><code>CSSStyleDeclaration</code></dfn></li>
+     <li><dfn id=dom-cssstyledeclaration-csstext title=dom-CSSStyleDeclaration-cssText><code>cssText</code></dfn> attribute of <code><a href=#cssstyledeclaration>CSSStyleDeclaration</a></code></li>
+     <li><dfn id=stylesheet><code>StyleSheet</code></dfn></li>
+     <li><dfn id=dom-linkstyle-sheet title=dom-linkstyle-sheet><code>sheet</code></dfn></li>
+     <li><dfn id=dom-stylesheet-disabled title=dom-stylesheet-disabled><code>disabled</code></dfn></li>
+     <li><dfn id=alternative-style-sheet-sets>Alternative style sheet sets</dfn> and the <dfn id=preferred-style-sheet-set>preferred style sheet set</dfn></li>
+     <li><dfn id=serializing-a-css-value>Serializing a CSS value</dfn></li>
+     <li><dfn id=scroll-an-element-into-view>Scroll an element into view</dfn></li>
+     <li><dfn id=scroll-to-the-beginning-of-the-document>Scroll to the beginning of the document</dfn></li>
+    </ul><p>The term <dfn id=css-styling-attribute>CSS styling attribute</dfn> is defined in the <cite>CSS Style Attributes</cite>
+    specification. <a href=#refsCSSATTR>[CSSATTR]</a></p>
+
+    <p>The <code><a href=#canvasrenderingcontext2d>CanvasRenderingContext2D</a></code> object's use of fonts depends on the features
+    described in the CSS <cite>Fonts</cite> and <cite>Font Load Events</cite> specifications, including in particular
+    <dfn id=fontloader><code>FontLoader</code></dfn>. <a href=#refsCSSFONTS>[CSSFONTS]</a> <a href=#refsCSSFONTLOAD>[CSSFONTLOAD]</a></p>
+
+   </dd>
+
+
+<!--TOPIC:Canvas-->
+
+   <dt>SVG</dt>
+
+   <dd>
+
+    <p>The following interface is defined in the SVG specification: <a href=#refsSVG>[SVG]</a></p>
+
+    <ul class=brief><li><dfn id=svgmatrix><code>SVGMatrix</code></dfn>
+    </ul><!-- mention that the parser supports it? --></dd>
+
+
+   <dt>WebGL</dt>
+
+   <dd>
+
+    <p>The following interface is defined in the WebGL specification: <a href=#refsWEBGL>[WEBGL]</a></p>
+
+    <ul class=brief><li><dfn id=webglrenderingcontext><code>WebGLRenderingContext</code></dfn>
+    </ul></dd>
+
+
+<!--TOPIC:HTML-->
+
+   <!-- mention that the parser supports mathml? -->
+
+
+<!--TOPIC:Video Text Tracks-->
+
+   <dt>WebVTT</dt>
+
+   <dd>
+
+    <p>Implementations may support <dfn id=webvtt>WebVTT</dfn> as a text track format for subtitles, captions,
+    chapter titles, metadata, etc, for media resources. <a href=#refsWEBVTT>[WEBVTT]</a></p>
+
+    <p>The following terms, used in this specification, are defined in the WebVTT specification:</p>
+
+    <ul class=brief><li><dfn id=webvtt-file>WebVTT file</dfn>
+     <li><dfn id=webvtt-file-using-cue-text>WebVTT file using cue text</dfn>
+     <li><dfn id=webvtt-file-using-chapter-title-text>WebVTT file using chapter title text</dfn>
+     <li><dfn id=webvtt-file-using-only-nested-cues>WebVTT file using only nested cues</dfn>
+     <li><dfn id=webvtt-parser>WebVTT parser</dfn>
+     <li>The <dfn id=rules-for-updating-the-display-of-webvtt-text-tracks>rules for updating the display of WebVTT text tracks</dfn>
+     <li>The <dfn id=rules-for-interpreting-webvtt-cue-text>rules for interpreting WebVTT cue text</dfn>
+     <li>The WebVTT <dfn id=text-track-cue-writing-direction>text track cue writing direction</dfn>
+    </ul></dd>
+
+
+<!--TOPIC:WebSocket API-->
+
+   <dt>The WebSocket protocol</dt>
+
+   <dd>
+
+    <p>The following terms are defined in the WebSocket protocol specification: <a href=#refsWSP>[WSP]</a></p>
+
+    <ul class=brief><li><dfn id=establish-a-websocket-connection>establish a WebSocket connection</dfn>
+     <li><dfn id=the-websocket-connection-is-established>the WebSocket connection is established</dfn>
+     <li><dfn id="validate-the-server's-response">validate the server's response</dfn>
+     <li><dfn id=extensions-in-use>extensions in use</dfn>
+     <li><dfn id=subprotocol-in-use>subprotocol in use</dfn>
+     <li><dfn id=headers-to-send-appropriate-cookies>headers to send appropriate cookies</dfn>
+     <li><dfn id="cookies-set-during-the-server's-opening-handshake">cookies set during the server's opening handshake</dfn>
+     <li><dfn id=a-websocket-message-has-been-received>a WebSocket message has been received</dfn>
+     <li><dfn id=fail-the-websocket-connection>fail the WebSocket connection</dfn>
+     <li><dfn id=close-the-websocket-connection>close the WebSocket connection</dfn>
+     <li><dfn id=start-the-websocket-closing-handshake>start the WebSocket closing handshake</dfn>
+     <li><dfn id=the-websocket-closing-handshake-is-started>the WebSocket closing handshake is started</dfn>
+     <li><dfn id=the-websocket-connection-is-closed>the WebSocket connection is closed</dfn> (possibly <i title="">cleanly</i>)
+     <li><dfn id=the-websocket-connection-close-code>the WebSocket connection close code</dfn>
+     <li><dfn id=the-websocket-connection-close-reason>the WebSocket connection close reason</dfn>
+
+    </ul></dd>
+
+
+<!--TOPIC:HTML-->
+
+   <dt>ARIA</dt>
+
+   <dd>
+
+    <p>The terms <dfn id=strong-native-semantics>strong native semantics</dfn> is used as defined in the ARIA specification.
+    The term <dfn id=default-implicit-aria-semantics>default implicit ARIA semantics</dfn> has the same meaning as the term <i>implicit
+    WAI-ARIA semantics</i> as used in the ARIA specification. <a href=#refsARIA>[ARIA]</a></p>
+
+    <p>The <dfn id=attr-aria-role title=attr-aria-role><code>role</code></dfn> and <code title="">aria-*</code>
+    attributes are defined in the ARIA specification. <a href=#refsARIA>[ARIA]</a></p>
+
+
+   </dd>
+
+
+  </dl><p>This specification does not <em>require</em> support of any particular network protocol, style
+  sheet language, scripting language, or any of the DOM specifications beyond those required in the
+  list above. However, the language described by this specification is biased towards CSS as the
+  styling language, JavaScript as the scripting language, and HTTP as the network protocol, and
+  several features assume that those languages and protocols are in use.</p>
+
+  <p>A user agent that implements the HTTP protocol must implement the Web Origin Concept
+  specification and the HTTP State Management Mechanism specification (Cookies) as well. <a href=#refsHTTP>[HTTP]</a> <a href=#refsORIGIN>[ORIGIN]</a> <a href=#refsCOOKIES>[COOKIES]</a></p>
+
+  <p class=note>This specification might have certain additional requirements on character
+  encodings, image formats, audio formats, and video formats in the respective sections.</p>
+
+  </div>
+
+
+
+  <h4 id=extensibility-0><span class=secno>2.2.3 </span>Extensibility</h4>
+
+  <p>Vendor-specific proprietary user agent extensions to this specification are strongly
+  discouraged. Documents must not use such extensions, as doing so reduces interoperability and
+  fragments the user base, allowing only users of specific user agents to access the content in
+  question.</p>
+
+  <div class=impl>
+
+  <p>If such extensions are nonetheless needed, e.g. for experimental purposes, then vendors are
+  strongly urged to use one of the following extension mechanisms:</p>
+
+  <ul><li><p>For markup-level features that can be limited to the XML serialization and need not be
+   supported in the HTML serialization, vendors should use the namespace mechanism to define custom
+   namespaces in which the non-standard elements and attributes are supported.</p>
+
+   <li>
+
+    <p>For markup-level features that are intended for use with <a href=#syntax>the HTML syntax</a>,
+    extensions should be limited to new attributes of the form "<code title="">x-<var title="">vendor</var>-<var title="">feature</var></code>", where <var title="">vendor</var> is a
+    short string that identifies the vendor responsible for the extension, and <var title="">feature</var> is the name of the feature. New element names should not be created.
+    Using attributes for such extensions exclusively allows extensions from multiple vendors to
+    co-exist on the same element, which would not be possible with elements. Using the "<code title="">x-<var title="">vendor</var>-<var title="">feature</var></code>" form allows extensions
+    to be made without risk of conflicting with future additions to the specification.</p>
+
+    <div class=example>
+
+     <p>For instance, a browser named "FerretBrowser" could use "ferret" as a vendor prefix, while a
+     browser named "Mellblom Browser" could use "mb". If both of these browsers invented extensions
+     that turned elements into scratch-and-sniff areas, an author experimenting with these features
+     could write:</p>
+
+     <pre>&lt;p&gt;This smells of lemons!
+&lt;span x-ferret-smellovision x-ferret-smellcode="LEM01"
+      x-mb-outputsmell x-mb-smell="lemon juice"&gt;&lt;/span&gt;&lt;/p&gt;</pre>
+
+    </div>
+
+   </li>
+
+  </ul><p>Attribute names beginning with the two characters "<code title="">x-</code>" are reserved for
+  user agent use and are guaranteed to never be formally added to the HTML language. For
+  flexibility, attributes names containing underscores (the U+005F LOW LINE character) are also
+  reserved for experimental purposes and are guaranteed to never be formally added to the HTML
+  language.</p>
+
+  <p class=note>Pages that use such attributes are by definition non-conforming.</p>
+
+  <p>For DOM extensions, e.g. new methods and IDL attributes, the new members should be prefixed by
+  vendor-specific strings to prevent clashes with future versions of this specification.</p>
+
+  <p>For events, experimental event types should be prefixed with vendor-specific strings.</p>
+
+  <div class=example>
+
+   <p>For example, if a user agent called "Pleas<!--e h-->old" were to add an event to indicate when
+   the user is going up in an elevator, it could use the prefix "<code title="">pleasold</code>" and
+   thus name the event "<code title="">pleasoldgoingup</code>", possibly with an event handler
+   attribute named "<code title="">onpleasoldgoingup</code>".</p>
+
+  </div>
+
+  <p>All extensions must be defined so that the use of extensions neither contradicts nor causes the
+  non-conformance of functionality defined in the specification.</p> <!-- thanks to QA Framework -->
+
+  <div class=example>
+
+   <p>For example, while strongly discouraged from doing so, an implementation "Foo Browser" could
+   add a new IDL attribute "<code title="">fooTypeTime</code>" to a control's DOM interface that
+   returned the time it took the user to select the current value of a control (say). On the other
+   hand, defining a new control that appears in a form's <code title=dom-form-elements><a href=#dom-form-elements>elements</a></code> array would be in violation of the above requirement,
+   as it would violate the definition of <code title=dom-form-elements><a href=#dom-form-elements>elements</a></code> given in
+   this specification.</p>
+
+  </div>
+
+  <p>When adding new <a href=#reflect title=reflect>reflecting</a> IDL attributes corresponding to content
+  attributes of the form "<code title="">x-<var title="">vendor</var>-<var title="">feature</var></code>", the IDL attribute should be named "<code title=""><var title="">vendor</var><var title="">Feature</var></code>" (i.e. the "<code title="">x</code>" is
+  dropped from the IDL attribute's name).</p>
+
+  </div>
+
+  <hr><p>When vendor-neutral extensions to this specification are needed, either this specification can
+  be updated accordingly, or an extension specification can be written that overrides the
+  requirements in this specification. When someone applying this specification to their activities
+  decides that they will recognize the requirements of such an extension specification, it becomes
+  an <dfn id=other-applicable-specifications title="other applicable specifications">applicable specification</dfn> for the purposes of
+  conformance requirements in this specification.</p>
+
+  <p class=note>Someone could write a specification that defines any arbitrary byte stream as
+  conforming, and then claim that their random junk is conforming. However, that does not mean that
+  their random junk actually is conforming for everyone's purposes: if someone else decides that
+  that specification does not apply to their work, then they can quite legitimately say that the
+  aforementioned random junk is just that, junk, and not conforming at all. As far as conformance
+  goes, what matters in a particular community is what that community <em>agrees</em> is
+  applicable.</p>
+
+  <div class=impl>
+
+  <hr><p>User agents must treat elements and attributes that they do not understand as semantically
+  neutral; leaving them in the DOM (for DOM processors), and styling them according to CSS (for CSS
+  processors), but not inferring any meaning from them.</p>
+
+<!--ADD-TOPIC:Security-->
+  <p>When support for a feature is disabled (e.g. as an emergency measure to mitigate a security
+  problem, or to aid in development, or for performance reasons), user agents must act as if they
+  had no support for the feature whatsoever, and as if the feature was not mentioned in this
+  specification. For example, if a particular feature is accessed via an attribute in a Web IDL
+  interface, the attribute itself would be omitted from the objects that implement that interface
+  &mdash; leaving the attribute on the object but making it return null or throw an exception is
+  insufficient.</p>
+<!--REMOVE-TOPIC:Security-->
+
+  </div>
+
+
+  <div class=impl>
+
+  <h4 id=interactions-with-xpath-and-xslt><span class=secno>2.2.4 </span>Interactions with XPath and XSLT</h4>
+
+  <p id=xpath-1.0-processors>Implementations of XPath 1.0 that operate on <a href=#html-documents>HTML
+  documents</a> parsed or created in the manners described in this specification (e.g. as part of
+  the <code title="">document.evaluate()</code> API) must act as if the following edit was applied
+  to the XPath 1.0 specification.</p>
+
+  <p>First, remove this paragraph:</p>
+
+  <blockquote cite=http://www.w3.org/TR/1999/REC-xpath-19991116#node-tests>
+
+   <p>A <a href=http://www.w3.org/TR/REC-xml-names#NT-QName>QName</a> in the node test is expanded
+   into an <a href=http://www.w3.org/TR/1999/REC-xpath-19991116#dt-expanded-name>expanded-name</a>
+   using the namespace declarations from the expression context. This is the same way expansion is
+   done for element type names in start and end-tags except that the default namespace declared with
+   <code title="">xmlns</code> is not used: if the <a href=http://www.w3.org/TR/REC-xml-names#NT-QName>QName</a> does not have a prefix, then the
+   namespace URI is null (this is the same way attribute names are expanded). It is an error if the
+   <a href=http://www.w3.org/TR/REC-xml-names#NT-QName>QName</a> has a prefix for which there is
+   no namespace declaration in the expression context.</p>
+
+  </blockquote>
+
+  <p>Then, insert in its place the following:</p>
+
+  <blockquote cite="http://www.w3.org/Bugs/Public/show_bug.cgi?id=7059#c37">
+
+   <p>A QName in the node test is expanded into an expanded-name using the namespace declarations
+   from the expression context. If the QName has a prefix, then there must be a<!-- added 2009-10-27
+   - http://www.w3.org/Bugs/Public/show_bug.cgi?id=8062 --> namespace declaration for this prefix in
+   the expression context, and the corresponding<!-- typo fixed 2009-10-27 -
+   http://www.w3.org/Bugs/Public/show_bug.cgi?id=8063 --> namespace URI is the one that is
+   associated with this prefix. It is an error if the QName has a prefix for which there is no
+   namespace declaration in the expression context. </p>
+
+   <p>If the QName has no prefix and the principal node type of the axis is element, then the
+   default element namespace is used. Otherwise if the QName has no prefix, the namespace URI is
+   null. The default element namespace is a member of the context for the XPath expression. The
+   value of the default element namespace when executing an XPath expression through the DOM3 XPath
+   API is determined in the following way:</p>
+
+   <ol><li>If the context node is from an HTML DOM, the default element namespace is
+    "http://www.w3.org/1999/xhtml".</li>
+
+    <li>Otherwise, the default element namespace URI is null.</li>
+
+   </ol><p class=note>This is equivalent to adding the default element namespace feature of XPath 2.0
+   to XPath 1.0, and using the HTML namespace as the default element namespace for HTML documents.
+   It is motivated by the desire to have implementations be compatible with legacy HTML content
+   while still supporting the changes that this specification introduces to HTML regarding the
+   namespace used for HTML elements, and by the desire to use XPath 1.0 rather than XPath 2.0.</p>
+
+  </blockquote>
+
+  <p class=note>This change is a <a href=#willful-violation>willful violation</a> of the XPath 1.0 specification,
+  motivated by desire to have implementations be compatible with legacy content while still
+  supporting the changes that this specification introduces to HTML regarding which namespace is
+  used for HTML elements. <a href=#refsXPATH10>[XPATH10]</a></p> <!-- note: version matters for
+  this ref -->
+
+  <hr><p id=dom-based-xslt-1.0-processors>XSLT 1.0 processors outputting to a DOM when the output
+  method is "html" (either explicitly or via the defaulting rule in XSLT 1.0) are affected as
+  follows:</p>
+
+  <p>If the transformation program outputs an element in no namespace, the processor must, prior to
+  constructing the corresponding DOM element node, change the namespace of the element to the
+  <a href=#html-namespace-0>HTML namespace</a>, <a href=#converted-to-ascii-lowercase title="converted to ASCII lowercase">ASCII-lowercase</a> the
+  element's local name, and <a href=#converted-to-ascii-lowercase title="converted to ASCII lowercase">ASCII-lowercase</a> the
+  names of any non-namespaced attributes on the element.</p>
+
+  <p class=note>This requirement is a <a href=#willful-violation>willful violation</a> of the XSLT 1.0
+  specification, required because this specification changes the namespaces and case-sensitivity
+  rules of HTML in a manner that would otherwise be incompatible with DOM-based XSLT
+  transformations. (Processors that serialize the output are unaffected.) <a href=#refsXSLT10>[XSLT10]</a></p> <!-- note: version matters for this ref -->
+
+  <hr><p>This specification does not specify precisely how XSLT processing interacts with the <a href=#html-parser>HTML
+  parser</a> infrastructure (for example, whether an XSLT processor acts as if it puts any
+  elements into a <a href=#stack-of-open-elements>stack of open elements</a>). However, XSLT processors must <a href=#stop-parsing>stop
+  parsing</a> if they successfully complete, and must set the <a href=#current-document-readiness>current document
+  readiness</a> first to "<code title="">interactive</code>"<!-- this synchronously fires an
+  event --> and then to "<code title="">complete</code>"<!-- this also synchronously fires an event
+  --> if they are aborted.</p>
+
+  <hr><p>This specification does not specify how XSLT interacts with the <a href=#navigate title=navigate>navigation</a> algorithm, how it fits in with the <a href=#event-loop>event loop</a>, nor
+  how error pages are to be handled (e.g. whether XSLT errors are to replace an incremental XSLT
+  output, or are rendered inline, etc).</p>
+
+  <p class=note>There are also additional non-normative comments regarding the interaction of XSLT
+  and HTML <a href=#scriptTagXSLT>in the <code>script</code> element section</a>, and of
+  XSLT, XPath, and HTML <a href=#template-XSLT-XPath>in the <code>template</code> element
+  section</a>.</p>
+
+  </div>
+
+
+
+
+  <h3 id=case-sensitivity-and-string-comparison><span class=secno>2.3 </span>Case-sensitivity and string comparison</h3>
+
+  <p>Comparing two strings in a <dfn id=case-sensitive>case-sensitive</dfn> manner means comparing them exactly, code
+  point for code point.</p>
+
+  <p>Comparing two strings in an <dfn id=ascii-case-insensitive>ASCII case-insensitive</dfn> manner means comparing them
+  exactly, code point for code point, except that the characters in the range U+0041 to U+005A (i.e.
+  LATIN CAPITAL LETTER A to LATIN CAPITAL LETTER Z) and the corresponding characters in the range
+  U+0061 to U+007A (i.e. LATIN SMALL LETTER A to LATIN SMALL LETTER Z) are considered to also
+  match.</p>
+
+  <p>Comparing two strings in a <dfn id=compatibility-caseless>compatibility caseless</dfn> manner means using the Unicode
+  <i>compatibility caseless match</i> operation to compare the two strings, with no language-specific tailoirings. <a href=#refsUNICODE>[UNICODE]</a></p>
+
+  <p>Except where otherwise stated, string comparisons must be performed in a
+  <a href=#case-sensitive>case-sensitive</a> manner.</p>
+
+
+  <div class=impl>
+
+  <p><dfn id=converted-to-ascii-uppercase title="converted to ASCII uppercase">Converting a string to ASCII uppercase</dfn> means
+  replacing all characters in the range U+0061 to U+007A (i.e. LATIN SMALL LETTER A to LATIN SMALL
+  LETTER Z) with the corresponding characters in the range U+0041 to U+005A (i.e. LATIN CAPITAL
+  LETTER A to LATIN CAPITAL LETTER Z).</p>
+
+  <p><dfn id=converted-to-ascii-lowercase title="converted to ASCII lowercase">Converting a string to ASCII lowercase</dfn> means
+  replacing all characters in the range U+0041 to U+005A (i.e. LATIN CAPITAL LETTER A to LATIN
+  CAPITAL LETTER Z) with the corresponding characters in the range U+0061 to U+007A (i.e. LATIN
+  SMALL LETTER A to LATIN SMALL LETTER Z).</p>
+
+  </div>
+
+
+  <p>A string <var title="">pattern</var> is a <dfn id=prefix-match>prefix match</dfn> for a string <var title="">s</var> when <var title="">pattern</var> is not longer than <var title="">s</var> and
+  truncating <var title="">s</var> to <var title="">pattern</var>'s length leaves the two strings as
+  matches of each other.</p>
+
+
+
+  <h3 id=common-microsyntaxes><span class=secno>2.4 </span>Common microsyntaxes</h3>
+
+  <p>There are various places in HTML that accept particular data types, such as dates or numbers.
+  This section describes what the conformance criteria for content in those formats is, and how to
+  parse them.</p>
+
+  <div class=impl>
+
+  <p class=note>Implementors are strongly urged to carefully examine any third-party libraries
+  they might consider using to implement the parsing of syntaxes described below. For example, date
+  libraries are likely to implement error handling behavior that differs from what is required in
+  this specification, since error-handling behavior is often not defined in specifications that
+  describe date syntaxes similar to those used in this specification, and thus implementations tend
+  to vary greatly in how they handle errors.</p>
+
+  </div>
+
+
+  <div class=impl>
+
+  <h4 id=common-parser-idioms><span class=secno>2.4.1 </span>Common parser idioms</h4>
+
+  </div>
+
+  <p>The <dfn id=space-character title="space character">space characters</dfn>, for the purposes of this
+  specification, are U+0020 SPACE, U+0009 CHARACTER TABULATION (tab), U+000A LINE FEED (LF), U+000C
+  FORM FEED (FF), and U+000D CARRIAGE RETURN (CR).</p>
+
+  <p>The <dfn id=white_space title=White_Space>White_Space characters</dfn> are those that have the Unicode
+  property "White_Space" in the Unicode <code title="">PropList.txt</code> data file. <a href=#refsUNICODE>[UNICODE]</a></p>
+
+  <p class=note>This should not be confused with the "White_Space" value (abbreviated "WS") of the
+  "Bidi_Class" property in the <code title="">Unicode.txt</code> data file.</p>
+
+  <p>The <dfn id=control-characters>control characters</dfn> are those whose Unicode "General_Category" property has the
+  value "Cc" in the Unicode <code title="">UnicodeData.txt</code> data file. <a href=#refsUNICODE>[UNICODE]</a></p>
+
+  <p>The <dfn id=uppercase-ascii-letters>uppercase ASCII letters</dfn> are the characters in the range U+0041 LATIN CAPITAL
+  LETTER A to U+005A LATIN CAPITAL LETTER Z.</p>
+
+  <p>The <dfn id=lowercase-ascii-letters>lowercase ASCII letters</dfn> are the characters in the range U+0061 LATIN SMALL
+  LETTER A to U+007A LATIN SMALL LETTER Z.</p>
+
+  <p>The <dfn id=ascii-digits>ASCII digits</dfn> are the characters in the range U+0030 DIGIT ZERO (0) to U+0039
+  DIGIT NINE (9).</p>
+
+  <p>The <dfn id=alphanumeric-ascii-characters>alphanumeric ASCII characters</dfn> are those that are either <a href=#uppercase-ascii-letters>uppercase ASCII
+  letters</a>, <a href=#lowercase-ascii-letters>lowercase ASCII letters</a>, or <a href=#ascii-digits>ASCII digits</a>.</p>
+
+  <p>The <dfn id=ascii-hex-digits>ASCII hex digits</dfn> are the characters in the ranges U+0030 DIGIT ZERO (0) to
+  U+0039 DIGIT NINE (9), U+0041 LATIN CAPITAL LETTER A to U+0046 LATIN CAPITAL LETTER F, and U+0061
+  LATIN SMALL LETTER A to U+0066 LATIN SMALL LETTER F.</p>
+
+  <p>The <dfn id=uppercase-ascii-hex-digits>uppercase ASCII hex digits</dfn> are the characters in the ranges U+0030 DIGIT ZERO (0) to
+  U+0039 DIGIT NINE (9) and U+0041 LATIN CAPITAL LETTER A to U+0046 LATIN CAPITAL LETTER F only.</p>
+
+  <p>The <dfn id=lowercase-ascii-hex-digits>lowercase ASCII hex digits</dfn> are the characters in the ranges U+0030 DIGIT ZERO
+  (0) to U+0039 DIGIT NINE (9) and U+0061 LATIN SMALL LETTER A to U+0066 LATIN SMALL LETTER F
+  only.</p>
+
+  <div class=impl>
+
+  <p>Some of the micro-parsers described below follow the pattern of having an <var title="">input</var> variable that holds the string being parsed, and having a <var title="">position</var> variable pointing at the next character to parse in <var title="">input</var>.</p>
+
+  <p>For parsers based on this pattern, a step that requires the user agent to <dfn id=collect-a-sequence-of-characters>collect a
+  sequence of characters</dfn> means that the following algorithm must be run, with <var title="">characters</var> being the set of characters that can be collected:</p>
+
+  <ol><li><p>Let <var title="">input</var> and <var title="">position</var> be the same variables as
+   those of the same name in the algorithm that invoked these steps.</li>
+
+   <li><p>Let <var title="">result</var> be the empty string.</li>
+
+   <li><p>While <var title="">position</var> doesn't point past the end of <var title="">input</var>
+   and the character at <var title="">position</var> is one of the <var title="">characters</var>,
+   append that character to the end of <var title="">result</var> and advance <var title="">position</var> to the next character in <var title="">input</var>.</li>
+
+   <li><p>Return <var title="">result</var>.</li>
+
+  </ol><p>The step <dfn id=skip-whitespace>skip whitespace</dfn> means that the user agent must <a href=#collect-a-sequence-of-characters>collect a sequence of
+  characters</a> that are <a href=#space-character title="space character">space characters</a>. The step
+  <dfn id=skip-white_space-characters>skip White_Space characters</dfn> means that the user agent must <a href=#collect-a-sequence-of-characters>collect a sequence of
+  characters</a> that are <a href=#white_space>White_Space</a> characters. In both cases, the collected
+  characters are not used. <a href=#refsUNICODE>[UNICODE]</a></p>
+
+  <p>When a user agent is to <dfn id=strip-line-breaks>strip line breaks</dfn> from a string, the user agent must remove
+  any U+000A LINE FEED (LF) and U+000D CARRIAGE RETURN (CR) characters from that string.</p>
+
+  <p>When a user agent is to <dfn id=strip-leading-and-trailing-whitespace>strip leading and trailing whitespace</dfn> from a string, the
+  user agent must remove all <a href=#space-character title="space character">space characters</a> that are at the
+  start or end of the string.</p>
+
+  <p>When a user agent is to <dfn id=strip-and-collapse-whitespace>strip and collapse whitespace</dfn> in a string, it must replace
+  any sequence of one or more consecutive <a href=#space-character title="space character">space characters</a> in
+  that string with a single U+0020 SPACE character, and then <a href=#strip-leading-and-trailing-whitespace>strip leading and trailing
+  whitespace</a> from that string.</p>
+
+  <p>When a user agent has to <dfn id=strictly-split-a-string>strictly split a string</dfn> on a particular delimiter character
+  <var title="">delimiter</var>, it must use the following algorithm:</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p>Let <var title="">tokens</var> be an ordered list of tokens, initially empty.</li>
+
+   <li><p>While <var title="">position</var> is not past the end of <var title="">input</var>:</p>
+
+    <ol><li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are not the <var title="">delimiter</var> character.</li>
+
+     <li><p>Append the string collected in the previous step to <var title="">tokens</var>.</li>
+
+     <li><p>Advance <var title="">position</var> to the next character in <var title="">input</var>.</li> <!-- skips past the delimiter -->
+
+    </ol></li>
+
+   <li><p>Return <var title="">tokens</var>.</li>
+
+  </ol><p class=note>For the special cases of splitting a string <a href=#split-a-string-on-spaces title="split a string on
+  spaces">on spaces</a> and <a href=#split-a-string-on-commas title="split a string on commas">on commas</a>, this
+  algorithm does not apply (those algorithms also perform <a href=#strip-leading-and-trailing-whitespace title="strip leading and trailing
+  whitespace">whitespace trimming</a>).</p>
+
+  </div>
+
+
+
+  <h4 id=boolean-attributes><span class=secno>2.4.2 </span>Boolean attributes</h4>
+
+  <p>A number of attributes are <dfn id=boolean-attribute title="boolean attribute">boolean attributes</dfn>. The
+  presence of a boolean attribute on an element represents the true value, and the absence of the
+  attribute represents the false value.</p>
+
+  <p>If the attribute is present, its value must either be the empty string or a value that is an
+  <a href=#ascii-case-insensitive>ASCII case-insensitive</a> match for the attribute's canonical name, with no leading or
+  trailing whitespace.</p>
+
+  <p class=note>The values "true" and "false" are not allowed on boolean attributes. To represent
+  a false value, the attribute has to be omitted altogether.</p>
+
+  <div class=example>
+
+   <p>Here is an example of a checkbox that is checked and disabled. The <code title=attr-input-checked><a href=#attr-input-checked>checked</a></code> and <code title=attr-fe-disabled><a href=#attr-fe-disabled>disabled</a></code>
+   attributes are the boolean attributes.</p>
+
+   <pre>&lt;label&gt;&lt;input type=checkbox checked name=cheese disabled&gt; Cheese&lt;/label&gt;</pre>
+
+   <p>This could be equivalently written as this:
+
+   <pre>&lt;label&gt;&lt;input type=checkbox checked=checked name=cheese disabled=disabled&gt; Cheese&lt;/label&gt;</pre>
+
+   <p>You can also mix styles; the following is still equivalent:</p>
+
+   <pre>&lt;label&gt;&lt;input type='checkbox' checked name=cheese disabled=""&gt; Cheese&lt;/label&gt;</pre>
+
+  </div>
+
+
+
+  <h4 id=keywords-and-enumerated-attributes><span class=secno>2.4.3 </span>Keywords and enumerated attributes</h4>
+
+  <p>Some attributes are defined as taking one of a finite set of keywords. Such attributes are
+  called <dfn id=enumerated-attribute title="enumerated attribute">enumerated attributes</dfn>. The keywords are each
+  defined to map to a particular <em>state</em> (several keywords might map to the same state, in
+  which case some of the keywords are synonyms of each other; additionally, some of the keywords can
+  be said to be non-conforming, and are only in the specification for historical reasons). In
+  addition, two default states can be given. The first is the <i>invalid value default</i>, the
+  second is the <i>missing value default</i>.</p>
+
+  <p>If an enumerated attribute is specified, the attribute's value must be an <a href=#ascii-case-insensitive>ASCII
+  case-insensitive</a> match for one of the given keywords that are not said to be
+  non-conforming, with no leading or trailing whitespace.</p>
+
+  <p>When the attribute is specified, if its value is an <a href=#ascii-case-insensitive>ASCII case-insensitive</a> match
+  for one of the given keywords then that keyword's state is the state that the attribute
+  represents. If the attribute value matches none of the given keywords, but the attribute has an
+  <i>invalid value default</i>, then the attribute represents that state. Otherwise, if the
+  attribute value matches none of the keywords but there is a <i>missing value default</i> state
+  defined, then <em>that</em> is the state represented by the attribute. Otherwise, there is no
+  default, and invalid values mean that there is no state represented.</p>
+
+  <p>When the attribute is <em>not</em> specified, if there is a <i>missing value default</i> state
+  defined, then that is the state represented by the (missing) attribute. Otherwise, the absence of
+  the attribute means that there is no state represented.</p>
+
+  <p class=note>The empty string can be a valid keyword.</p>
+
+
+  <h4 id=numbers><span class=secno>2.4.4 </span>Numbers</h4>
+
+  <h5 id=signed-integers><span class=secno>2.4.4.1 </span>Signed integers</h5>
+
+  <p>A string is a <dfn id=valid-integer>valid integer</dfn> if it consists of one or more <a href=#ascii-digits>ASCII digits</a>,
+  optionally prefixed with a U+002D HYPHEN-MINUS character (-).</p>
+
+  <p>A <a href=#valid-integer>valid integer</a> without a U+002D HYPHEN-MINUS (-) prefix represents the number
+  that is represented in base ten by that string of digits. A <a href=#valid-integer>valid integer</a>
+  <em>with</em> a U+002D HYPHEN-MINUS (-) prefix represents the number represented in base ten by
+  the string of digits that follows the U+002D HYPHEN-MINUS, subtracted from zero.</p>
+
+  <div class=impl>
+
+  <p>The <dfn id=rules-for-parsing-integers>rules for parsing integers</dfn> are as given in the following algorithm. When
+  invoked, the steps must be followed in the order given, aborting at the first step that returns a
+  value. This algorithm will return either an integer or an error.</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p>Let <var title="">sign</var> have the value "positive".</li>
+
+   <li><p><a href=#skip-whitespace>Skip whitespace</a>.</li>
+
+   <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, return an
+    error.</li>
+
+   <li>
+
+    <p>If the character indicated by <var title="">position</var> (the first character) is a U+002D
+    HYPHEN-MINUS character (-):</p>
+
+    <ol><li>Let <var title="">sign</var> be "negative".</li>
+
+     <li>Advance <var title="">position</var> to the next character.</li>
+
+     <li>If <var title="">position</var> is past the end of <var title="">input</var>, return an
+     error.</li>
+
+    </ol><p>Otherwise, if the character indicated by <var title="">position</var> (the first character)
+    is a U+002B PLUS SIGN character (+):</p>
+
+    <ol><li>Advance <var title="">position</var> to the next character. (The "<code title="">+</code>"
+     is ignored, but it is not conforming.)</li>
+
+     <li>If <var title="">position</var> is past the end of <var title="">input</var>, return an
+     error.</li>
+
+    </ol></li>
+
+   <li><p>If the character indicated by <var title="">position</var> is not an <a href=#ascii-digits title="ASCII
+   digits">ASCII digit</a>, then return an error.</li>
+
+   <!-- Ok. At this point we know we have a number. It might have
+   trailing garbage which we'll ignore, but it's a number, and we
+   won't return an error. -->
+
+   <li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>, and
+   interpret the resulting sequence as a base-ten integer. Let <var title="">value</var> be that
+   integer.</li>
+
+   <li><p>If <var title="">sign</var> is "positive", return <var title="">value</var>, otherwise return the result of subtracting
+   <var title="">value</var> from zero.</li>
+
+  </ol></div>
+
+
+  <h5 id=non-negative-integers><span class=secno>2.4.4.2 </span>Non-negative integers</h5>
+
+  <p>A string is a <dfn id=valid-non-negative-integer>valid non-negative integer</dfn> if it consists of one or more <a href=#ascii-digits>ASCII
+  digits</a>.</p>
+
+  <p>A <a href=#valid-non-negative-integer>valid non-negative integer</a> represents the number that is represented in base ten
+  by that string of digits.</p>
+
+  <div class=impl>
+
+  <p>The <dfn id=rules-for-parsing-non-negative-integers>rules for parsing non-negative integers</dfn> are as given in the following algorithm.
+  When invoked, the steps must be followed in the order given, aborting at the first step that
+  returns a value. This algorithm will return either zero, a positive integer, or an error.</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">value</var> be the result of parsing <var title="">input</var> using the
+   <a href=#rules-for-parsing-integers>rules for parsing integers</a>.</li>
+
+   <li><p>If <var title="">value</var> is an error, return an error.</li>
+
+   <li><p>If <var title="">value</var> is less than zero, return an error.</li>
+
+   <li><p>Return <var title="">value</var>.</li>
+
+  </ol><!-- Implications: A leading + is ignored. A leading - is ignored if the value is zero. --></div>
+
+
+  <h5 id=floating-point-numbers><span class=secno>2.4.4.3 </span>Floating-point numbers</h5>
+
+  <p>A string is a <dfn id=valid-floating-point-number>valid floating-point number</dfn> if it consists of:</p>
+
+  <ol class=brief><li>Optionally, a U+002D HYPHEN-MINUS character (-).</li>
+
+   <li>One or both of the following, in the given order:
+
+    <ol><li>A series of one or more <a href=#ascii-digits>ASCII digits</a>.</li>
+
+     <li>
+
+      <ol><li>A single U+002E FULL STOP character (.).</li>
+
+       <li>A series of one or more <a href=#ascii-digits>ASCII digits</a>.</li>
+
+      </ol></li>
+
+    </ol></li>
+
+   <li>Optionally:
+
+    <ol><li>Either a U+0065 LATIN SMALL LETTER E character (e) or a U+0045 LATIN CAPITAL LETTER E
+     character (E).</li>
+
+     <li>Optionally, a U+002D HYPHEN-MINUS character (-) or U+002B PLUS SIGN character (+).</li>
+
+     <li>A series of one or more <a href=#ascii-digits>ASCII digits</a>.</li>
+
+    </ol></li>
+
+  </ol><p>A <a href=#valid-floating-point-number>valid floating-point number</a> represents the number obtained by multiplying the
+  significand by ten raised to the power of the exponent, where the significand is the first number,
+  interpreted as base ten (including the decimal point and the number after the decimal point, if
+  any, and interpreting the significand as a negative number if the whole string starts with a
+  U+002D HYPHEN-MINUS character (-) and the number is not zero), and where the exponent is the
+  number after the E, if any (interpreted as a negative number if there is a U+002D HYPHEN-MINUS
+  character (-) between the E and the number and the number is not zero, or else ignoring a U+002B
+  PLUS SIGN character (+) between the E and the number if there is one). If there is no E, then the
+  exponent is treated as zero.</p>
+
+  <p class=note>The Infinity and Not-a-Number (NaN) values are not <a href=#valid-floating-point-number title="valid
+  floating-point number">valid floating-point numbers</a>.</p>
+
+  <div class=impl>
+
+  <p>The <dfn id=best-representation-of-the-number-as-a-floating-point-number title="best representation of the number as a floating-point number">best
+  representation of the number <var title="">n</var> as a floating-point number</dfn> is the string
+  obtained from applying the JavaScript operator ToString to <var title="">n</var>. The JavaScript
+  operator ToString is not uniquely determined. When there are multiple possible strings that could
+  be obtained from the JavaScript operator ToString for a particular value, the user agent must
+  always return the same string for that value (though it may differ from the value used by other
+  user agents).</p>
+
+  <p>The <dfn id=rules-for-parsing-floating-point-number-values>rules for parsing floating-point number values</dfn> are as given in the following
+  algorithm. This algorithm must be aborted at the first step that returns something. This algorithm
+  will return either a number or an error.</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p>Let <var title="">value</var> have the value 1.</li>
+
+   <li><p>Let <var title="">divisor</var> have the value 1.</li>
+
+   <li><p>Let <var title="">exponent</var> have the value 1.</li>
+
+   <li><p><a href=#skip-whitespace>Skip whitespace</a>.</li>
+
+   <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, return an
+   error.</li>
+
+   <li>
+
+    <p>If the character indicated by <var title="">position</var> is a U+002D HYPHEN-MINUS character
+    (-):</p>
+
+    <ol><li>Change <var title="">value</var> and <var title="">divisor</var> to &minus;1.</li>
+
+     <li>Advance <var title="">position</var> to the next character.</li>
+
+     <li>If <var title="">position</var> is past the end of <var title="">input</var>, return an
+     error.</li>
+
+    </ol><p>Otherwise, if the character indicated by <var title="">position</var> (the first character)
+    is a U+002B PLUS SIGN character (+):</p>
+
+    <ol><li>Advance <var title="">position</var> to the next character. (The "<code title="">+</code>"
+     is ignored, but it is not conforming.)</li>
+
+     <li>If <var title="">position</var> is past the end of <var title="">input</var>, return an
+     error.</li>
+
+    </ol></li>
+
+   <li><p>If the character indicated by <var title="">position</var> is a U+002E FULL STOP (.), and
+   that is not the last character in <var title="">input</var>, and the character after the
+   character indicated by <var title="">position</var> is an <a href=#ascii-digits title="ASCII digits">ASCII
+   digit</a>, then set <var title="">value</var> to zero and jump to the step labeled
+   <i>fraction</i>.</p> <!-- we have to check there's a number so that ".e1" fails to parse but ".0"
+   does not -->
+
+   <li><p>If the character indicated by <var title="">position</var> is not an <a href=#ascii-digits title="ASCII
+   digits">ASCII digit</a>, then return an error.</li>
+
+   <li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>, and
+   interpret the resulting sequence as a base-ten integer. Multiply <var title="">value</var> by
+   that integer.</li>
+
+   <li>If <var title="">position</var> is past the end of <var title="">input</var>, jump to the
+   step labeled <i>conversion</i>.</li>
+
+   <li><p><i>Fraction</i>: If the character indicated by <var title="">position</var> is a U+002E
+   FULL STOP (.), run these substeps:</p>
+
+    <ol><li><p>Advance <var title="">position</var> to the next character.</li>
+
+     <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, or if the
+     character indicated by <var title="">position</var> is not an <a href=#ascii-digits title="ASCII digits">ASCII
+     digit</a>, U+0065 LATIN SMALL LETTER E (e), or U+0045 LATIN CAPITAL LETTER E (E), then jump
+     to the step labeled <i>conversion</i>.</li>
+
+     <li><p>If the character indicated by <var title="">position</var> is a U+0065 LATIN SMALL
+     LETTER E character (e) or a U+0045 LATIN CAPITAL LETTER E character (E), skip the remainder of
+     these substeps.</p>
+
+     <li><p><i>Fraction loop</i>: Multiply <var title="">divisor</var> by ten.</li>
+
+     <li>Add the value of the character indicated by <var title="">position</var>, interpreted as a
+     base-ten digit (0..9) and divided by <var title="">divisor</var>, to <var title="">value</var>.</li>
+
+     <li><p>Advance <var title="">position</var> to the next character.</li>
+
+     <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, then jump
+     to the step labeled <i>conversion</i>.</li>
+
+     <li><p>If the character indicated by <var title="">position</var> is an <a href=#ascii-digits title="ASCII
+     digits">ASCII digit</a>, jump back to the step labeled <i>fraction loop</i> in these
+     substeps.</li>
+
+    </ol></li>
+
+   <li><p>If the character indicated by <var title="">position</var> is a U+0065 LATIN SMALL LETTER
+   E character (e) or a U+0045 LATIN CAPITAL LETTER E character (E), run these substeps:</p>
+
+    <ol><li><p>Advance <var title="">position</var> to the next character.</li>
+
+     <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, then jump
+     to the step labeled <i>conversion</i>.</li>
+
+     <li>
+
+      <p>If the character indicated by <var title="">position</var> is a U+002D HYPHEN-MINUS
+      character (-):</p>
+
+      <ol><li>Change <var title="">exponent</var> to &minus;1.</li>
+
+       <li>Advance <var title="">position</var> to the next character.</li>
+
+       <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, then
+       jump to the step labeled <i>conversion</i>.</li>
+
+      </ol><p>Otherwise, if the character indicated by <var title="">position</var> is a U+002B PLUS SIGN
+      character (+):</p>
+
+      <ol><li>Advance <var title="">position</var> to the next character.</li>
+
+       <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, then
+       jump to the step labeled <i>conversion</i>.</li>
+
+      </ol></li>
+
+     <li><p>If the character indicated by <var title="">position</var> is not an <a href=#ascii-digits title="ASCII
+     digits">ASCII digit</a>, then jump to the step labeled <i>conversion</i>.</li>
+
+     <li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>, and
+     interpret the resulting sequence as a base-ten integer. Multiply <var title="">exponent</var>
+     by that integer.</li>
+
+     <li><p>Multiply <var title="">value</var> by ten raised to the <var title="">exponent</var>th
+     power.</li>
+
+    </ol></li>
+
+   <li><p><i>Conversion</i>: Let <var title="">S</var> be the set of finite IEEE 754
+   double-precision floating-point values except &minus;0, but with two special values added: 2<sup title="">1024</sup> and &minus;2<sup title="">1024</sup>.</li>
+
+   <li><p>Let <var title="">rounded-value</var> be the number in <var title="">S</var> that is
+   closest to <var title="">value</var>, selecting the number with an even significand if there are
+   two equally close values. (The two special values 2<sup title="">1024</sup> and &minus;2<sup title="">1024</sup> are considered to have even significands for this purpose.)</li>
+
+   <li><p>If <var title="">rounded-value</var> is 2<sup title="">1024</sup> or &minus;2<sup title="">1024</sup>, return an error.</li>
+
+   <li><p>Return <var title="">rounded-value</var>.</li>
+
+  </ol></div>
+
+
+<div class=impl>
+  <h5 id=percentages-and-dimensions><span class=secno>2.4.4.4 </span>Percentages and lengths</h5>
+
+  <p>The <dfn id=rules-for-parsing-dimension-values>rules for parsing dimension values</dfn> are as given in the following algorithm. When
+  invoked, the steps must be followed in the order given, aborting at the first step that returns a
+  value. This algorithm will return either a number greater than or equal to 1.0, or an error; if a
+  number is returned, then it is further categorized as either a percentage or a length.</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p><a href=#skip-whitespace>Skip whitespace</a>.</li>
+
+   <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, return an
+   error.</li>
+
+   <li><p>If the character indicated by <var title="">position</var> is a U+002B PLUS SIGN character
+   (+), advance <var title="">position</var> to the next character.</li>
+
+   <li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are U+0030 DIGIT ZERO (0) characters,
+   and discard them.</li>
+
+   <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, return an
+   error.</li>
+
+   <li><p>If the character indicated by <var title="">position</var> is not one of U+0031 DIGIT ONE
+   (1) to U+0039 DIGIT NINE (9), then return an error.</li>
+
+   <!-- Ok. At this point we know we have a number. It might have trailing garbage which we'll
+   ignore, but it's a number, and we won't return an error. -->
+
+   <li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>, and
+   interpret the resulting sequence as a base-ten integer. Let <var title="">value</var> be that
+   number.</li>
+
+   <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, return <var title="">value</var> as a length.</li>
+
+   <li>
+
+    <p>If the character indicated by <var title="">position</var> is a U+002E FULL STOP character
+    (.):</p>
+
+    <ol><li><p>Advance <var title="">position</var> to the next character.</li>
+
+     <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, or if the
+     character indicated by <var title="">position</var> is not an <a href=#ascii-digits title="ASCII digits">ASCII
+     digit</a>, then return <var title="">value</var> as a length.</li>
+
+     <li><p>Let <var title="">divisor</var> have the value 1.</li>
+
+     <li><p><i>Fraction loop</i>: Multiply <var title="">divisor</var> by ten.</li>
+
+     <li>Add the value of the character indicated by <var title="">position</var>, interpreted as a
+     base-ten digit (0..9) and divided by <var title="">divisor</var>, to <var title="">value</var>.</li>
+
+     <li><p>Advance <var title="">position</var> to the next character.</li>
+
+     <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, then
+     return <var title="">value</var> as a length.</li>
+
+     <li><p>If the character indicated by <var title="">position</var> is an <a href=#ascii-digits title="ASCII
+     digits">ASCII digit</a>, return to the step labeled <i>fraction loop</i> in these
+     substeps.</li>
+
+    </ol></li>
+
+   <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, return <var title="">value</var> as a length.</li>
+
+   <li><p>If the character indicated by <var title="">position</var> is a U+0025 PERCENT SIGN
+   character (%), return <var title="">value</var> as a percentage.</li>
+
+   <li><p>Return <var title="">value</var> as a length.</li>
+
+  </ol></div>
+
+
+  <h5 id=lists-of-integers><span class=secno>2.4.4.5 </span>Lists of integers</h5>
+
+  <p>A <dfn id=valid-list-of-integers>valid list of integers</dfn> is a number of <a href=#valid-integer title="valid integer">valid
+  integers</a> separated by U+002C COMMA characters, with no other characters (e.g. no <a href=#space-character title="space character">space characters</a>). In addition, there might be restrictions on the
+  number of integers that can be given, or on the range of values allowed.</p>
+
+  <div class=impl>
+
+  <p>The <dfn id=rules-for-parsing-a-list-of-integers>rules for parsing a list of integers</dfn> are as follows:</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p>Let <var title="">numbers</var> be an initially empty list of integers. This list will be
+   the result of this algorithm.</li>
+
+   <li><p>If there is a character in the string <var title="">input</var> at position <var title="">position</var>, and it is either a U+0020 SPACE, U+002C COMMA, or U+003B SEMICOLON
+   character, then advance <var title="">position</var> to the next character in <var title="">input</var>, or to beyond the end of the string if there are no more
+   characters.</li>
+
+   <li><p>If <var title="">position</var> points to beyond the end of <var title="">input</var>,
+   return <var title="">numbers</var> and abort.</li>
+
+   <li><p>If the character in the string <var title="">input</var> at position <var title="">position</var> is a U+0020 SPACE, U+002C COMMA, or U+003B SEMICOLON character, then
+   return to step 4.</li>
+
+   <li><p>Let <var title="">negated</var> be false.</li> <li><p>Let <var title="">value</var> be
+   0.</li>
+
+   <li><p>Let <var title="">started</var> be false. This variable is set to true when the parser
+   sees a number or a U+002D HYPHEN-MINUS character (-).</li>
+
+   <li><p>Let <var title="">got number</var> be false. This variable is set to true when the parser
+   sees a number.</li>
+
+   <li><p>Let <var title="">finished</var> be false. This variable is set to true to switch parser
+   into a mode where it ignores characters until the next separator.</li>
+
+   <li><p>Let <var title="">bogus</var> be false.</li>
+
+   <li><p><i>Parser</i>: If the character in the string <var title="">input</var> at position <var title="">position</var> is:</p>
+
+    <dl class=switch><dt>A U+002D HYPHEN-MINUS character</dt>
+
+     <dd>
+
+      <p>Follow these substeps:</p>
+
+      <ol><li>If <var title="">got number</var> is true, let <var title="">finished</var> be true.</li>
+
+       <li>If <var title="">finished</var> is true, skip to the next step in the overall set of
+       steps.</li>
+
+       <li>If <var title="">started</var> is true, let <var title="">negated</var> be false.</li>
+
+       <li>Otherwise, if <var title="">started</var> is false and if <var title="">bogus</var> is
+       false, let <var title="">negated</var> be true.</li>
+
+       <li>Let <var title="">started</var> be true.</li>
+
+      </ol></dd>
+
+     <dt>An <a href=#ascii-digits title="ASCII digits">ASCII digit</a></dt>
+
+     <dd>
+
+      <p>Follow these substeps:</p>
+
+      <ol><li>If <var title="">finished</var> is true, skip to the next step in the overall set of
+       steps.</li>
+
+       <li>Multiply <var title="">value</var> by ten.</li>
+
+       <li>Add the value of the digit, interpreted in base ten, to <var title="">value</var>.</li>
+
+       <li>Let <var title="">started</var> be true.</li>
+
+       <li>Let <var title="">got number</var> be true.</li>
+
+      </ol></dd>
+
+
+     <dt>A U+0020 SPACE character</dt>
+     <dt>A U+002C COMMA character</dt>
+     <dt>A U+003B SEMICOLON character</dt>
+
+     <dd>
+
+      <p>Follow these substeps:</p>
+
+      <ol><li>If <var title="">got number</var> is false, return the <var title="">numbers</var> list
+       and abort. This happens if an entry in the list has no digits, as in "<code title="">1,2,x,4</code>".</li>
+
+       <li>If <var title="">negated</var> is true, then negate <var title="">value</var>.</li>
+
+       <li>Append <var title="">value</var> to the <var title="">numbers</var> list.</li>
+
+       <li>Jump to step 4 in the overall set of steps.</li>
+
+      </ol></dd>
+
+
+     <!-- <dt>A U+002E FULL STOP character</dt> -->
+     <dt>A character in the range U+0001 to U+001F, <!-- space --> U+0021 to U+002B, <!-- comma --> U+002D to U+002F, <!-- digits --> U+003A, <!-- semicolon --> U+003C to U+0040, <!-- a-z --> U+005B to U+0060, <!-- A-Z --> U+007b to U+007F
+        (i.e. any other non-alphabetic ASCII character)</dt>
+
+ <!--
+ Test: http://www.hixie.ch/tests/adhoc/html/flow/image-maps/004-demo.html
+ IE6 on Wine treats the following characters like this also: U+1-U+1f, U+21-U+2b, U+2d-U+2f, U+3a,
+ U+3c-U+40, U+5b-U+60, U+7b-U+82, U+84-U+89, U+8b, U+8d, U+8f-U+99, U+9b, U+9d, U+a0-U+bf, U+d7,
+ U+f7, U+1f6-U+1f9, U+218-U+24f, U+2a9-U+385, U+387, U+38b, U+38d, U+3a2, U+3cf, U+3d7-U+3d9, U+3db,
+ U+3dd, U+3df, U+3e1, U+3f4-U+400, U+40d, U+450, U+45d, U+482-U+48f, U+4c5-U+4c6, U+4c9-U+4ca,
+ U+4cd-U+4cf, U+4ec-U+4ed, U+4f6-U+4f7, U+4fa-U+530, U+557-U+560, U+588-U+5cf, U+5eb-U+5ef,
+ U+5f3-U+620, U+63b-U+640, U+64b-U+670, U+6b8-U+6b9, U+6bf, U+6cf, U+6d4, U+6d6-U+904, U+93a-U+957,
+ U+962-U+984, U+98d-U+98e, U+991-U+992, U+9a9, U+9b1, U+9b3-U+9b5, U+9ba-U+9db, U+9de, U+9e2-U+9ef,
+ U+9f2-U+a04, U+a0b-U+a0e, U+a11-U+a12, U+a29, U+a31, U+a34, U+a37, U+a3a-U+a58, U+a5d, U+a5f-U+a84,
+ U+a8c, U+a8e, U+a92, U+aa9, U+ab1, U+ab4, U+aba-U+adf, U+ae1-U+b04, U+b0d-U+b0e, U+b11-U+b12,
+ U+b29, U+b31, U+b34-U+b35, U+b3a-U+b5b, U+b5e, U+b62-U+b84, U+b8b-U+b8d, U+b91, U+b96-U+b98, U+b9b,
+ U+b9d, U+ba0-U+ba2, U+ba5-U+ba7, U+bab-U+bad, U+bb6, U+bba-U+c04, U+c0d, U+c11, U+c29, U+c34,
+ U+c3a-U+c5f, U+c62-U+c84, U+c8d, U+c91, U+ca9, U+cb4, U+cba-U+cdd, U+cdf, U+ce2-U+d04, U+d0d,
+ U+d11, U+d29, U+d3a-U+d5f, U+d62-U+e00, U+e2f, U+e31, U+e34-U+e3f, U+e46-U+e80, U+e83, U+e85-U+e86,
+ U+e89, U+e8b-U+e8c, U+e8e-U+e93, U+e98, U+ea0, U+ea4, U+ea6, U+ea8-U+ea9, U+eac, U+eaf-U+edb,
+ U+ede-U+109f, U+10c6-U+10cf, U+10f7-U+10ff, U+115a-U+115e, U+11a3-U+11a7, U+11fa-U+1dff,
+ U+1e9b-U+1e9f, U+1efa-U+1eff, U+1f16-U+1f17, U+1f1e-U+1f1f, U+1f46-U+1f47, U+1f4e-U+1f4f, U+1f58,
+ U+1f5a, U+1f5c, U+1f5e, U+1f7e-U+1f7f, U+1fb5, U+1fbd-U+1fc1, U+1fc5, U+1fcd-U+1fcf, U+1fd4-U+1fd5,
+ U+1fdc-U+1fdf, U+1fed-U+1ff1, U+1ff5, U+1ffd-U+249b, U+24ea-U+3004, U+3006-U+3040, U+3095-U+309a,
+ U+309f-U+30a0, U+30fb, U+30ff-U+3104, U+312d-U+3130, U+318f-U+4dff, U+9fa6-U+abff, U+d7a4-U+d7ff,
+ U+e000-U+f8ff, U+fa2e-U+faff, U+fb07-U+fb12, U+fb18-U+fb1e, U+fb37, U+fb3d, U+fb3f, U+fb42, U+fb45,
+ U+fbb2-U+fbd2, U+fbe9, U+fce1, U+fd3e-U+fd4f, U+fd90-U+fd91, U+fdc8-U+fdef, U+fdfc-U+fe7f,
+ U+fefd-U+ff20, U+ff3b-U+ff40, U+ff5b-U+ff65, U+ffa0, U+ffbf-U+ffc1, U+ffc8-U+ffc9, U+ffd0-U+ffd1,
+ U+ffd8-U+ffd9, U+ffdd-U+ffff
+ IE7 on Win2003 treats the following characters like this also instead: U+1-U+1f, U+21-U+2b,
+ U+2d-U+2f, U+3a, U+3c-U+40, U+5b-U+60, U+7b-U+82, U+84-U+89, U+8b, U+8d, U+8f-U+99, U+9b, U+9d,
+ U+a0-U+a9, U+ab-U+b4, U+b6-U+b9, U+bb-U+bf, U+d7, U+f7, U+220-U+221, U+234-U+24f, U+2ae-U+2af,
+ U+2b9-U+2ba, U+2c2-U+2df, U+2e5-U+2ed, U+2ef-U+344, U+346-U+379, U+37b-U+385, U+387, U+38b, U+38d,
+ U+3a2, U+3cf, U+3d8-U+3d9, U+3f4-U+3ff, U+482-U+48b, U+4c5-U+4c6, U+4c9-U+4ca, U+4cd-U+4cf,
+ U+4f6-U+4f7, U+4fa-U+530, U+557-U+558, U+55a-U+560, U+588-U+5cf, U+5eb-U+5ef, U+5f3-U+620,
+ U+63b-U+640, U+656-U+66f, U+6d4, U+6dd-U+6e0, U+6e9-U+6ec, U+6ee-U+6f9, U+6fd-U+70f, U+72d-U+72f,
+ U+740-U+77f, U+7b1-U+900, U+904, U+93a-U+93c, U+94d - U+94f, U+951-U+957, U+964-U+980, U+984,
+ U+98d-U+98e, U+991-U+992, U+9a9, U+9b1, U+9b3-U+9b5, U+9ba-U+9bd, U+9c5-U+9c6, U+9c9-U+9ca,
+ U+9cd-U+9d6, U+9d8-U+9db, U+9de, U+9e4-U+9ef, U+9f2-U+a01, U+a03-U+a04, U+a0b-U+a0e, U+a11-U+a12,
+ U+a29, U+a31, U+a34, U+a37, U+a3a-U+a3d, U+a43-U+a46, U+a49-U+a4a, U+a4d-U+a58, U+a5d, U+a5f-U+a6f,
+ U+a75-U+a80, U+a84, U+a8c, U+a8e, U+a92, U+aa9, U+ab1, U+ab4, U+aba-U+abc, U+ac6, U+aca,
+ U+acd-U+acf, U+ad1-U+adf, U+ae1-U+b00, U+b04, U+b0d-U+b0e, U+b11-U+b12, U+b29, U+b31, U+b34-U+b35,
+ U+b3a-U+b3c, U+b44-U+b46, U+b49 - U+b4a, U+b4d-U+b55, U+b58-U+b5b, U+b5e, U+b62-U+b81, U+b84,
+ U+b8b-U+b8d, U+b91, U+b96-U+b98, U+b9b, U+b9d, U+ba0 - U+ba2, U+ba5-U+ba7, U+bab-U+bad, U+bb6,
+ U+bba-U+bbd, U+bc3-U+bc5, U+bc9, U+bcd-U+bd6, U+bd8-U+c00, U+c04, U+c0d, U+c11, U+c29, U+c34,
+ U+c3a-U+c3d, U+c45, U+c49, U+c4d-U+c54, U+c57-U+c5f, U+c62-U+c81, U+c84, U+c8d, U+c91, U+ca9,
+ U+cb4, U+cba-U+cbd, U+cc5, U+cc9, U+ccd-U+cd4, U+cd7-U+cdd, U+cdf, U+ce2-U+d01, U+d04, U+d0d,
+ U+d11, U+d29, U+d3a-U+d3d, U+d44-U+d45, U+d49, U+d4d-U+d56, U+d58-U+d5f, U+d62-U+d81, U+d84,
+ U+d97-U+d99, U+db2, U+dbc, U+dbe - U+dbf, U+dc7-U+dce, U+dd5, U+dd7, U+de0-U+df1, U+df4-U+e00,
+ U+e3b-U+e3f, U+e4f-U+e80, U+e83, U+e85-U+e86, U+e89, U+e8b-U+e8c, U+e8e-U+e93, U+e98, U+ea0, U+ea4,
+ U+ea6, U+ea8-U+ea9, U+eac, U+eba, U+ebe-U+ebf, U+ec5-U+ecc, U+ece-U+edb, U+ede-U+eff, U+f01-U+f3f,
+ U+f48, U+f6b-U+f70, U+f82-U+f87, U+f8c-U+f8f, U+f98, U+fbd-U+fff, U+1022, U+1028, U+102b,
+ U+1033-U+1035, U+1037, U+1039-U+104f, U+105a-U+109f, U+10c6-U+10cf, U+10f7-U+10ff, U+115a - U+115e,
+ U+11a3-U+11a7, U+11fa-U+11ff, U+1207, U+1247, U+1249, U+124e-U+124f, U+1257, U+1259, U+125e-U+125f,
+ U+1287, U+1289, U+128e-U+128f, U+12af, U+12b1, U+12b6-U+12b7, U+12bf, U+12c1, U+12c6-U+12c7,
+ U+12cf, U+12d7, U+12ef, U+130f, U+1311, U+1316-U+1317, U+131f, U+1347, U+135b-U+139f,
+ U+13f5-U+1400, U+166d-U+166e, U+1677-U+1680, U+169b - U+169f, U+16eb-U+177f, U+17c9-U+181f, U+1843,
+ U+1878-U+187f, U+18aa-U+1dff, U+1e9c-U+1e9f, U+1efa-U+1eff, U+1f16-U+1f17, U+1f1e-U+1f1f,
+ U+1f46-U+1f47, U+1f4e-U+1f4f, U+1f58, U+1f5a, U+1f5c, U+1f5e, U+1f7e-U+1f7f, U+1fb5, U+1fbd,
+ U+1fbf-U+1fc1, U+1fc5, U+1fcd-U+1fcf, U+1fd4-U+1fd5, U+1fdc-U+1fdf, U+1fed-U+1ff1, U+1ff5,
+ U+1ffd-U+207e, U+2080-U+2101, U+2103-U+2106, U+2108-U+2109, U+2114, U+2116-U+2118, U+211e-U+2123,
+ U+2125, U+2127, U+2129, U+212e, U+2132, U+213a-U+215f, U+2184-U+3005, U+3008-U+3020, U+302a-U+3037,
+ U+303b-U+3104, U+312d-U+3130, U+318f - U+319f, U+31b8-U+33ff, U+4db6-U+4dff, U+9fa6-U+9fff,
+ U+a48d-U+abff, U+d7a4-U+d7ff, U+e000-U+f8ff, U+fa2e-U+faff, U+fb07-U+fb12, U+fb18-U+fb1c, U+fb1e,
+ U+fb29, U+fb37, U+fb3d, U+fb3f, U+fb42, U+fb45, U+fbb2-U+fbd2, U+fd3e-U+fd4f, U+fd90-U+fd91,
+ U+fdc8-U+fdef, U+fdfc-U+fe6f, U+fe73, U+fe75, U+fefd-U+ff20, U+ff3b-U+ff40, U+ff5b-U+ff9f,
+ U+ffbf-U+ffc1, U+ffc8-U+ffc9, U+ffd0-U+ffd1, U+ffd8-U+ffd9, U+ffdd-U+ffff
+-->
+
+     <dd>
+
+      <p>Follow these substeps:</p>
+
+      <ol><li>If <var title="">got number</var> is true, let <var title="">finished</var> be true.</li>
+
+       <li>If <var title="">finished</var> is true, skip to the next step in the overall set of
+       steps.</li>
+
+       <li>Let <var title="">negated</var> be false.</li>
+
+      </ol></dd>
+
+
+     <dt>Any other character</dt>
+     <!-- alphabetic a-z A-Z, and non-ASCII -->
+
+     <dd>
+
+      <p>Follow these substeps:</p>
+
+      <ol><li>If <var title="">finished</var> is true, skip to the next step in the overall set of
+       steps.</li>
+
+       <li>Let <var title="">negated</var> be false.</li>
+
+       <li>Let <var title="">bogus</var> be true.</li>
+
+       <li>If <var title="">started</var> is true, then return the <var title="">numbers</var> list,
+       and abort. (The value in <var title="">value</var> is not appended to the list first; it is
+       dropped.)</li>
+
+      </ol></dd>
+
+    </dl></li>
+
+   <li><p>Advance <var title="">position</var> to the next character in <var title="">input</var>,
+   or to beyond the end of the string if there are no more characters.</li>
+
+   <li><p>If <var title="">position</var> points to a character (and not to beyond the end of <var title="">input</var>), jump to the big <i>Parser</i> step above.</li>
+
+   <li><p>If <var title="">negated</var> is true, then negate <var title="">value</var>.</li>
+
+   <li><p>If <var title="">got number</var> is true, then append <var title="">value</var> to the
+   <var title="">numbers</var> list.</li>
+
+   <li><p>Return the <var title="">numbers</var> list and abort.</li>
+
+  </ol></div>
+
+
+  <div class=impl>
+
+  <h5 id=lists-of-dimensions><span class=secno>2.4.4.6 </span>Lists of dimensions</h5>
+
+  <!-- no definition of a type since no conforming feature uses this syntax (it's only used in
+  cols="" and rows="" on <frameset> -->
+
+  <p>The <dfn id=rules-for-parsing-a-list-of-dimensions>rules for parsing a list of dimensions</dfn> are as follows. These rules return a list
+  of zero or more pairs consisting of a number and a unit, the unit being one of <i>percentage</i>,
+  <i>relative</i>, and <i>absolute</i>.</p>
+
+  <ol><li><p>Let <var title="">raw input</var> be the string being parsed.</li>
+
+   <li><p>If the last character in <var title="">raw input</var> is a U+002C COMMA character (,),
+   then remove that character from <var title="">raw input</var>.</li>
+
+   <li><p><a href=#split-a-string-on-commas title="split a string on commas">Split the string <var title="">raw input</var> on
+   commas</a>. Let <var title="">raw tokens</var> be the resulting list of tokens.</li>
+
+   <li><p>Let <var title="">result</var> be an empty list of number/unit pairs.</li>
+
+   <li>
+
+    <p>For each token in <var title="">raw tokens</var>, run the following substeps:</p>
+
+    <ol><li><p>Let <var title="">input</var> be the token.</li>
+
+     <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>,
+     initially pointing at the start of the string.</li>
+
+     <li><p>Let <var title="">value</var> be the number 0.</li>
+
+     <li><p>Let <var title="">unit</var> be <i>absolute</i>.</li>
+
+     <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, set <var title="">unit</var> to <i>relative</i> and jump to the last substep.</li>
+
+     <li><p>If the character at <var title="">position</var> is an <a href=#ascii-digits title="ASCII
+     digits">ASCII digit</a>, <a href=#collect-a-sequence-of-characters>collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII
+     digits</a>, interpret the resulting sequence as an integer in base ten, and increment <var title="">value</var> by that integer.</li>
+
+     <li>
+
+      <p>If the character at <var title="">position</var> is a U+002E FULL STOP character (.), run
+      these substeps:</p>
+
+      <ol><li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> consisting of <a href=#space-character title="space
+       character">space characters</a> and <a href=#ascii-digits>ASCII digits</a>. Let <var title="">s</var>
+       be the resulting sequence.</li>
+
+       <li><p>Remove all <a href=#space-character title="space character">space characters</a> in <var title="">s</var>.</li>
+
+       <li>
+
+        <p>If <var title="">s</var> is not the empty string, run these subsubsteps:</p>
+
+        <ol><li><p>Let <var title="">length</var> be the number of characters in <var title="">s</var> (after the spaces were removed).</li>
+
+         <li><p>Let <var title="">fraction</var> be the result of interpreting <var title="">s</var> as a base-ten integer, and then dividing that number by <span title="">10<sup title=""><var title="">length</var></sup></span>.</li>
+
+         <li><p>Increment <var title="">value</var> by <var title="">fraction</var>.</li>
+
+        </ol></li>
+
+      </ol></li>
+
+     <li><p><a href=#skip-whitespace>Skip whitespace</a>.</li>
+
+     <li>
+
+      <p>If the character at <var title="">position</var> is a U+0025 PERCENT SIGN character (%),
+      then set <var title="">unit</var> to <i>percentage</i>.</p>
+
+      <p>Otherwise, if the character at <var title="">position</var> is a U+002A ASTERISK character
+      (*), then set <var title="">unit</var> to <i>relative</i>.</p>
+
+     </li>
+
+     <!-- the remaining characters in /input/ are ignored -->
+
+     <li><p>Add an entry to <var title="">result</var> consisting of the number given by <var title="">value</var> and the unit given by <var title="">unit</var>.</li>
+
+    </ol></li>
+
+   <li><p>Return the list <var title="">result</var>.</li>
+
+  </ol></div>
+
+
+  <h4 id=dates-and-times><span class=secno>2.4.5 </span>Dates and times</h4>
+
+  <p>In the algorithms below, the <dfn id=number-of-days-in-month-month-of-year-year>number of days in month <var title="">month</var> of year
+  <var title="">year</var></dfn> is: <em>31</em> if <var title="">month</var> is 1, 3, 5, 7, 8,
+  10, or 12; <em>30</em> if <var title="">month</var> is 4, 6, 9, or 11; <em>29</em> if <var title="">month</var> is 2 and <var title="">year</var> is a number divisible by 400, or if <var title="">year</var> is a number divisible by 4 but not by 100; and <em>28</em> otherwise. This
+  takes into account leap years in the Gregorian calendar. <a href=#refsGREGORIAN>[GREGORIAN]</a></p>
+
+  <p>When <a href=#ascii-digits>ASCII digits</a> are used in the date and time syntaxes defined in this section,
+  they express numbers in base ten.</p>
+
+  <div class=impl>
+
+  <p class=note>While the formats described here are intended to be subsets of the corresponding
+  ISO8601 formats, this specification defines parsing rules in much more detail than ISO8601.
+  Implementors are therefore encouraged to carefully examine any date parsing libraries before using
+  them to implement the parsing rules described below; ISO8601 libraries might not parse dates and
+  times in exactly the same manner. <a href=#refsISO8601>[ISO8601]</a></p>
+
+  </div>
+
+  <p>Where this specification refers to the <dfn id=proleptic-gregorian-calendar>proleptic Gregorian calendar</dfn>, it means the
+  modern Gregorian calendar, extrapolated backwards to year 1. A date in the <a href=#proleptic-gregorian-calendar>proleptic
+  Gregorian calendar</a>, sometimes explicitly referred to as a <dfn id=proleptic-gregorian-date>proleptic-Gregorian
+  date</dfn>, is one that is described using that calendar even if that calendar was not in use at
+  the time (or place) in question. <a href=#refsGREGORIAN>[GREGORIAN]</a></p>
+
+  <p class=note>The use of the Gregorian calendar as the wire format in this specification is an
+  arbitrary choice resulting from the cultural biases of those involved in the decision. See also
+  the section discussing <a href=#input-author-notes>date, time, and number formats</a> in forms
+  <span class=impl>(for authors), <a href=#input-impl-notes>implemention notes regarding
+  localization of form controls</a>,</span> and the <code><a href=#the-time-element>time</a></code> element.</p>
+
+
+  <h5 id=months><span class=secno>2.4.5.1 </span>Months</h5>
+
+  <p>A <dfn id=concept-month title=concept-month>month</dfn> consists of a specific <a href=#proleptic-gregorian-date>proleptic-Gregorian
+  date</a> with no time-zone information and no date information beyond a year and a month. <a href=#refsGREGORIAN>[GREGORIAN]</a></p>
+
+  <p>A string is a <dfn id=valid-month-string>valid month string</dfn> representing a year <var title="">year</var> and
+  month <var title="">month</var> if it consists of the following components in the given order:</p>
+
+  <ol><li>Four or more <a href=#ascii-digits>ASCII digits</a>, representing <var title="">year</var>, where <var title="">year</var>&nbsp;&gt;&nbsp;0</li>
+
+   <li>A U+002D HYPHEN-MINUS character (-)</li>
+
+   <li>Two <a href=#ascii-digits>ASCII digits</a>, representing the month <var title="">month</var>, in the range
+   1&nbsp;&le;&nbsp;<var title="">month</var>&nbsp;&le;&nbsp;12</li>
+
+  </ol><div class=impl>
+
+  <p>The rules to <dfn id=parse-a-month-string>parse a month string</dfn> are as follows. This will return either a year and
+  month, or nothing. If at any point the algorithm says that it "fails", this means that it is
+  aborted at that point and returns nothing.</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p><a href=#parse-a-month-component>Parse a month component</a> to obtain <var title="">year</var> and <var title="">month</var>. If this returns nothing, then fail.</p>
+
+   <li><p>If <var title="">position</var> is <em>not</em> beyond the
+   end of <var title="">input</var>, then fail.</li>
+
+   <li><p>Return <var title="">year</var> and <var title="">month</var>.</li>
+
+  </ol><p>The rules to <dfn id=parse-a-month-component>parse a month component</dfn>, given an <var title="">input</var> string and
+  a <var title="">position</var>, are as follows. This will return either a year and a month, or
+  nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that
+  point and returns nothing.</p>
+
+  <ol><li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>. If the
+   collected sequence is not at least four characters long, then fail. Otherwise, interpret the
+   resulting sequence as a base-ten integer. Let that number be the <var title="">year</var>.</li>
+
+   <li><p>If <var title="">year</var> is not a number greater than zero, then fail.</li>
+
+   <li><p>If <var title="">position</var> is beyond the end of <var title="">input</var> or if the
+   character at <var title="">position</var> is not a U+002D HYPHEN-MINUS character, then fail.
+   Otherwise, move <var title="">position</var> forwards one character.</li>
+
+   <li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>. If the
+   collected sequence is not exactly two characters long, then fail. Otherwise, interpret the
+   resulting sequence as a base-ten integer. Let that number be the <var title="">month</var>.</li>
+
+   <li><p>If <var title="">month</var> is not a number in the range 1&nbsp;&le;&nbsp;<var title="">month</var>&nbsp;&le;&nbsp;12, then fail.</li>
+
+   <li><p>Return <var title="">year</var> and <var title="">month</var>.</li>
+
+  </ol></div>
+
+
+  <h5 id=dates><span class=secno>2.4.5.2 </span>Dates</h5>
+
+  <p>A <dfn id=concept-date title=concept-date>date</dfn> consists of a specific <a href=#proleptic-gregorian-date>proleptic-Gregorian
+  date</a> with no time-zone information, consisting of a year, a month, and a day. <a href=#refsGREGORIAN>[GREGORIAN]</a></p>
+
+  <p>A string is a <dfn id=valid-date-string>valid date string</dfn> representing a year <var title="">year</var>, month
+  <var title="">month</var>, and day <var title="">day</var> if it consists of the following
+  components in the given order:</p>
+
+  <ol><li>A <a href=#valid-month-string>valid month string</a>, representing <var title="">year</var> and <var title="">month</var></li>
+
+   <li>A U+002D HYPHEN-MINUS character (-)</li>
+
+   <li>Two <a href=#ascii-digits>ASCII digits</a>, representing <var title="">day</var>, in the range
+   1&nbsp;&le;&nbsp;<var title="">day</var>&nbsp;&le;&nbsp;<var title="">maxday</var> where <var title="">maxday</var> is the <a href=#number-of-days-in-month-month-of-year-year title="number of days in month month of year year">number of
+   days in the month <var title="">month</var> and year <var title="">year</var></a></li>
+
+  </ol><div class=impl>
+
+  <p>The rules to <dfn id=parse-a-date-string>parse a date string</dfn> are as follows. This will return either a date, or
+  nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that
+  point and returns nothing.</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p><a href=#parse-a-date-component>Parse a date component</a> to obtain <var title="">year</var>, <var title="">month</var>, and <var title="">day</var>. If this returns nothing, then fail.</p>
+
+   <li><p>If <var title="">position</var> is <em>not</em> beyond the end of <var title="">input</var>, then fail.</li>
+
+   <li><p>Let <var title="">date</var> be the date with year <var title="">year</var>, month <var title="">month</var>, and day <var title="">day</var>.</li>
+
+   <li><p>Return <var title="">date</var>.</li>
+
+  </ol><p>The rules to <dfn id=parse-a-date-component>parse a date component</dfn>, given an <var title="">input</var> string and a
+  <var title="">position</var>, are as follows. This will return either a year, a month, and a day,
+  or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at
+  that point and returns nothing.</p>
+
+  <ol><li><p><a href=#parse-a-month-component>Parse a month component</a> to obtain <var title="">year</var> and <var title="">month</var>. If this returns nothing, then fail.</li>
+
+   <li><p>Let <var title="">maxday</var> be the <a href=#number-of-days-in-month-month-of-year-year>number of days in month <var title="">month</var> of year <var title="">year</var></a>.</li>
+
+   <li><p>If <var title="">position</var> is beyond the end of <var title="">input</var> or if the
+   character at <var title="">position</var> is not a U+002D HYPHEN-MINUS character, then fail.
+   Otherwise, move <var title="">position</var> forwards one character.</li>
+
+   <li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>. If the
+   collected sequence is not exactly two characters long, then fail. Otherwise, interpret the
+   resulting sequence as a base-ten integer. Let that number be the <var title="">day</var>.</li>
+
+   <li><p>If <var title="">day</var> is not a number in the range 1&nbsp;&le;&nbsp;<var title="">day</var>&nbsp;&le;&nbsp;<var title="">maxday</var>, then fail.</li>
+
+   <li><p>Return <var title="">year</var>, <var title="">month</var>, and <var title="">day</var>.</li>
+
+  </ol></div>
+
+
+  <h5 id=yearless-dates><span class=secno>2.4.5.3 </span>Yearless dates</h5>
+
+  <p>A <dfn id=concept-yearless-date title=concept-yearless-date>yearless date</dfn> consists of a Gregorian month and a
+  day within that month, but with no associated year. <a href=#refsGREGORIAN>[GREGORIAN]</a></p>
+
+  <p>A string is a <dfn id=valid-yearless-date-string>valid yearless date string</dfn> representing a month <var title="">month</var> and a day <var title="">day</var> if it consists of the following components
+  in the given order:</p>
+
+  <ol><li>Optionally, two U+002D HYPHEN-MINUS characters (-)</li>
+
+   <li>Two <a href=#ascii-digits>ASCII digits</a>, representing the month <var title="">month</var>, in the range
+   1&nbsp;&le;&nbsp;<var title="">month</var>&nbsp;&le;&nbsp;12</li>
+
+   <li>A U+002D HYPHEN-MINUS character (-)</li>
+
+   <li>Two <a href=#ascii-digits>ASCII digits</a>, representing <var title="">day</var>, in the range
+   1&nbsp;&le;&nbsp;<var title="">day</var>&nbsp;&le;&nbsp;<var title="">maxday</var> where <var title="">maxday</var> is the <a href=#number-of-days-in-month-month-of-year-year title="number of days in month month of year year">number of
+   days</a> in the month <var title="">month</var> and any arbitrary leap year (e.g. 4 or
+   2000)</li>
+
+  </ol><p class=note>In other words, if the <var title="">month</var> is "<code title="">02</code>",
+  meaning February, then the day can be 29, as if the year was a leap year.</p>
+
+  <div class=impl>
+
+  <p>The rules to <dfn id=parse-a-yearless-date-string>parse a yearless date string</dfn> are as follows. This will return either a
+  month and a day, or nothing. If at any point the algorithm says that it "fails", this means that
+  it is aborted at that point and returns nothing.</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p><a href=#parse-a-yearless-date-component>Parse a yearless date component</a> to obtain <var title="">month</var> and <var title="">day</var>. If this returns nothing, then fail.</p>
+
+   <li><p>If <var title="">position</var> is <em>not</em> beyond the end of <var title="">input</var>, then fail.</li>
+
+   <li><p>Return <var title="">month</var> and <var title="">day</var>.</li>
+
+  </ol><p>The rules to <dfn id=parse-a-yearless-date-component>parse a yearless date component</dfn>, given an <var title="">input</var>
+  string and a <var title="">position</var>, are as follows. This will return either a month and a
+  day, or nothing. If at any point the algorithm says that it "fails", this means that it is aborted
+  at that point and returns nothing.</p>
+
+  <ol><li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are U+002D HYPHEN-MINUS characters (-).
+   If the collected sequence is not exactly zero or two characters long, then fail.</li>
+
+   <li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>. If the
+   collected sequence is not exactly two characters long, then fail. Otherwise, interpret the
+   resulting sequence as a base-ten integer. Let that number be the <var title="">month</var>.</li>
+
+   <li><p>If <var title="">month</var> is not a number in the range 1&nbsp;&le;&nbsp;<var title="">month</var>&nbsp;&le;&nbsp;12, then fail.</li>
+
+   <li><p>Let <var title="">maxday</var> be the <a href=#number-of-days-in-month-month-of-year-year title="number of days in month month of year
+   year">number of days</a> in month <var title="">month</var> of any arbitrary leap year (e.g. 4
+   or 2000).</li>
+
+   <li><p>If <var title="">position</var> is beyond the end of <var title="">input</var> or if the
+   character at <var title="">position</var> is not a U+002D HYPHEN-MINUS character, then fail.
+   Otherwise, move <var title="">position</var> forwards one character.</li>
+
+   <li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>. If the
+   collected sequence is not exactly two characters long, then fail. Otherwise, interpret the
+   resulting sequence as a base-ten integer. Let that number be the <var title="">day</var>.</li>
+
+   <li><p>If <var title="">day</var> is not a number in the range 1&nbsp;&le;&nbsp;<var title="">day</var>&nbsp;&le;&nbsp;<var title="">maxday</var>, then fail.</li>
+
+   <li><p>Return <var title="">month</var> and <var title="">day</var>.</li>
+
+  </ol></div>
+
+
+  <h5 id=times><span class=secno>2.4.5.4 </span>Times</h5>
+
+  <p>A <dfn id=concept-time title=concept-time>time</dfn> consists of a specific time with no time-zone
+  information, consisting of an hour, a minute, a second, and a fraction of a second.</p>
+
+  <p>A string is a <dfn id=valid-time-string>valid time string</dfn> representing an hour <var title="">hour</var>, a
+  minute <var title="">minute</var>, and a second <var title="">second</var> if it consists of the
+  following components in the given order:</p>
+
+  <ol><li>Two <a href=#ascii-digits>ASCII digits</a>, representing <var title="">hour</var>, in the range
+   0&nbsp;&le;&nbsp;<var title="">hour</var>&nbsp;&le;&nbsp;23</li>
+
+   <li>A U+003A COLON character (:)</li>
+
+   <li>Two <a href=#ascii-digits>ASCII digits</a>, representing <var title="">minute</var>, in the range
+   0&nbsp;&le;&nbsp;<var title="">minute</var>&nbsp;&le;&nbsp;59</li>
+
+   <li>Optionally (required if <var title="">second</var> is
+   non-zero):
+
+    <ol><li>A U+003A COLON character (:)</li>
+
+     <li>Two <a href=#ascii-digits>ASCII digits</a>, representing the integer part of <var title="">second</var>,
+     in the range 0&nbsp;&le;&nbsp;<var title="">s</var>&nbsp;&le;&nbsp;59</li>
+
+     <li>Optionally (required if <var title="">second</var> is not an
+     integer):
+
+      <ol><li>A 002E FULL STOP character (.)</li>
+
+       <li>One, two, or three <a href=#ascii-digits>ASCII digits</a>, representing the fractional part of <var title="">second</var></li>
+
+      </ol></li>
+
+    </ol></li>
+
+  </ol><p class=note>The <var title="">second</var> component cannot be 60 or 61; leap seconds cannot
+  be represented.</p>
+
+  <div class=impl>
+
+  <p>The rules to <dfn id=parse-a-time-string>parse a time string</dfn> are as follows. This will return either a time, or
+  nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that
+  point and returns nothing.</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p><a href=#parse-a-time-component>Parse a time component</a> to obtain <var title="">hour</var>, <var title="">minute</var>, and <var title="">second</var>. If this returns nothing, then fail.</p>
+
+   <li><p>If <var title="">position</var> is <em>not</em> beyond the end of <var title="">input</var>, then fail.</li>
+
+   <li><p>Let <var title="">time</var> be the time with hour <var title="">hour</var>, minute <var title="">minute</var>, and second <var title="">second</var>.</li>
+
+   <li><p>Return <var title="">time</var>.</li>
+
+  </ol><p>The rules to <dfn id=parse-a-time-component>parse a time component</dfn>, given an <var title="">input</var> string and a
+  <var title="">position</var>, are as follows. This will return either an hour, a minute, and a
+  second, or nothing. If at any point the algorithm says that it "fails", this means that it is
+  aborted at that point and returns nothing.</p>
+
+  <ol><li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>. If the
+   collected sequence is not exactly two characters long, then fail. Otherwise, interpret the
+   resulting sequence as a base-ten integer. Let that number be the <var title="">hour</var>.</li>
+
+   <li>If <var title="">hour</var> is not a number in the range 0&nbsp;&le;&nbsp;<var title="">hour</var>&nbsp;&le;&nbsp;23, then fail.</li>
+
+   <li><p>If <var title="">position</var> is beyond the end of <var title="">input</var> or if the
+   character at <var title="">position</var> is not a U+003A COLON character, then fail. Otherwise,
+   move <var title="">position</var> forwards one character.</li>
+
+   <li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>. If the
+   collected sequence is not exactly two characters long, then fail. Otherwise, interpret the
+   resulting sequence as a base-ten integer. Let that number be the <var title="">minute</var>.</li>
+
+   <li>If <var title="">minute</var> is not a number in the range 0&nbsp;&le;&nbsp;<var title="">minute</var>&nbsp;&le;&nbsp;59, then fail.</li>
+
+   <li><p>Let <var title="">second</var> be a string with the value "0".</li>
+
+   <li>
+
+    <p>If <var title="">position</var> is not beyond the end of <var title="">input</var> and the
+    character at <var title="">position</var> is a U+003A COLON, then run these substeps:</p>
+
+    <ol><li><p>Advance <var title="">position</var> to the next character in <var title="">input</var>.</li>
+
+     <li><p>If <var title="">position</var> is beyond the end of <var title="">input</var>, or at
+     the last character in <var title="">input</var>, or if the next <em>two</em> characters in <var title="">input</var> starting at <var title="">position</var> are not both <a href=#ascii-digits>ASCII
+     digits</a>, then fail.</li>
+
+     <li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are either <a href=#ascii-digits>ASCII digits</a>
+     or U+002E FULL STOP characters. If the collected sequence is three characters long, or if it is
+     longer than three characters long and the third character is not a U+002E FULL STOP character,
+     or if it has more than one U+002E FULL STOP character, then fail. Otherwise, let the collected
+     string be <var title="">second</var> instead of its previous value.</li>
+
+    </ol></li>
+
+   <li><p>Interpret <var title="">second</var> as a base-ten number (possibly with a fractional
+   part). Let <var title="">second</var> be that number instead of the string version.</li>
+
+   <li><p>If <var title="">second</var> is not a number in the range 0&nbsp;&le;&nbsp;<var title="">second</var>&nbsp;&lt;&nbsp;60, then fail.</li>
+
+   <li><p>Return <var title="">hour</var>, <var title="">minute</var>, and <var title="">second</var>.</li>
+
+  </ol></div>
+
+
+  <h5 id=local-dates-and-times><span class=secno>2.4.5.5 </span>Local dates and times</h5>
+
+  <p>A <dfn id=concept-datetime-local title=concept-datetime-local>local date and time</dfn> consists of a specific
+  <a href=#proleptic-gregorian-date>proleptic-Gregorian date</a>, consisting of a year, a month, and a day, and a time,
+  consisting of an hour, a minute, a second, and a fraction of a second, but expressed without a
+  time zone. <a href=#refsGREGORIAN>[GREGORIAN]</a></p>
+
+  <p>A string is a <dfn id=valid-local-date-and-time-string>valid local date and time string</dfn> representing a date and time if it
+  consists of the following components in the given order:</p>
+
+  <ol><li>A <a href=#valid-date-string>valid date string</a> representing the date</li>
+
+   <li>A U+0054 LATIN CAPITAL LETTER T character (T) or a U+0020 SPACE character</li>
+
+   <li>A <a href=#valid-time-string>valid time string</a> representing the time</li>
+
+  </ol><p>A string is a <dfn id=valid-normalized-local-date-and-time-string>valid normalized local date and time string</dfn> representing a date and
+  time if it consists of the following components in the given order:</p>
+
+  <ol><li>A <a href=#valid-date-string>valid date string</a> representing the date</li>
+
+   <li>A U+0054 LATIN CAPITAL LETTER T character (T)</li>
+
+   <li>A <a href=#valid-time-string>valid time string</a> representing the time, expressed as the shortest possible
+   string for the given time (e.g. omitting the seconds component entirely if the given time is zero
+   seconds past the minute)</li>
+
+  </ol><div class=impl>
+
+  <p>The rules to <dfn id=parse-a-local-date-and-time-string>parse a local date and time string</dfn> are as follows. This will return
+  either a date and time, or nothing. If at any point the algorithm says that it "fails", this means
+  that it is aborted at that point and returns nothing.</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p><a href=#parse-a-date-component>Parse a date component</a> to obtain <var title="">year</var>, <var title="">month</var>, and <var title="">day</var>. If this returns nothing, then fail.</p>
+
+   <li><p>If <var title="">position</var> is beyond the end of <var title="">input</var> or if the
+   character at <var title="">position</var> is neither a U+0054 LATIN CAPITAL LETTER T character
+   (T) nor a U+0020 SPACE character, then fail. Otherwise, move <var title="">position</var>
+   forwards one character.</li>
+
+   <li><p><a href=#parse-a-time-component>Parse a time component</a> to obtain <var title="">hour</var>, <var title="">minute</var>, and <var title="">second</var>. If this returns nothing, then fail.</p>
+
+   <li><p>If <var title="">position</var> is <em>not</em> beyond the end of <var title="">input</var>, then fail.</li>
+
+   <li><p>Let <var title="">date</var> be the date with year <var title="">year</var>, month <var title="">month</var>, and day <var title="">day</var>.</li>
+
+   <li><p>Let <var title="">time</var> be the time with hour <var title="">hour</var>, minute <var title="">minute</var>, and second <var title="">second</var>.</li>
+
+   <li><p>Return <var title="">date</var> and <var title="">time</var>.</li>
+
+  </ol></div>
+
+
+  <h5 id=time-zones><span class=secno>2.4.5.6 </span>Time zones</h5>
+
+  <p>A <dfn id=concept-timezone title=concept-timezone>time-zone offset</dfn> consists of a signed number of hours and
+  minutes.</p>
+
+  <p>A string is a <dfn id=valid-time-zone-offset-string>valid time-zone offset string</dfn> representing a time-zone offset if it
+  consists of either:</p>
+
+
+  <ul><li><p>A U+005A LATIN CAPITAL LETTER Z character (Z), allowed only if the time zone is
+   UTC</li>
+
+   <li>
+
+    <p>Or, the following components, in the given order:</p>
+
+    <ol><li>Either a U+002B PLUS SIGN character (+) or, if the time-zone offset is not zero, a U+002D
+     HYPHEN-MINUS character (-), representing the sign of the time-zone offset</li>
+     <!-- the -00:00 offset is disallowed because RFC3339 gives it a special semantic -->
+
+     <li>Two <a href=#ascii-digits>ASCII digits</a>, representing the hours component <var title="">hour</var> of
+     the time-zone offset, in the range 0&nbsp;&le;&nbsp;<var title="">hour</var>&nbsp;&le;&nbsp;23</li>
+
+     <li>Optionally, a U+003A COLON character (:)</li>
+
+     <li>Two <a href=#ascii-digits>ASCII digits</a>, representing the minutes component <var title="">minute</var> of the time-zone offset, in the range 0&nbsp;&le;&nbsp;<var title="">minute</var>&nbsp;&le;&nbsp;59</li>
+
+    </ol></li>
+
+  </ul><p class=note>This format allows for time-zone offsets from -23:59 to +23:59. Right now, in
+  practice, the range of offsets of actual time zones is -12:00 to +14:00, and the minutes component
+  of offsets of actual time zones is always either 00, 30, or 45. There is no guarantee that this
+  will remain so forever, however, since time zones are used as political footballs and are thus
+  subject to very whimsical policy decisions.</p>
+
+  <p class=note>See also the usage notes and examples in the <a href=#concept-datetime title=concept-datetime>global
+  date and time</a> section below for details on using time-zone offsets with historical times
+  that predate the formation of formal time zones.</p>
+
+  <div class=impl>
+
+  <p>The rules to <dfn id=parse-a-time-zone-offset-string>parse a time-zone offset string</dfn> are as follows. This will return either
+  a time-zone offset, or nothing. If at any point the algorithm says that it "fails", this means
+  that it is aborted at that point and returns nothing.</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p><a href=#parse-a-time-zone-offset-component>Parse a time-zone offset component</a> to obtain <var title="">timezone<sub title="">hours</sub></var> and <var title="">timezone<sub title="">minutes</sub></var>. If this
+   returns nothing, then fail.</p>
+
+   <li><p>If <var title="">position</var> is <em>not</em> beyond the end of <var title="">input</var>, then fail.</li>
+
+   <li><p>Return the time-zone offset that is <var title="">timezone<sub title="">hours</sub></var>
+   hours and <var title="">timezone<sub title="">minutes</sub></var> minutes from UTC.</li>
+
+  </ol><p>The rules to <dfn id=parse-a-time-zone-offset-component>parse a time-zone offset component</dfn>, given an <var title="">input</var>
+  string and a <var title="">position</var>, are as follows. This will return either time-zone hours
+  and time-zone minutes, or nothing. If at any point the algorithm says that it "fails", this means
+  that it is aborted at that point and returns nothing.</p>
+
+  <ol><li>
+
+    <p>If the character at <var title="">position</var> is a U+005A LATIN CAPITAL LETTER Z character
+    (Z), then:</p>
+
+    <ol><li><p>Let <var title="">timezone<sub title="">hours</sub></var> be 0.</li>
+
+     <li><p>Let <var title="">timezone<sub title="">minutes</sub></var> be 0.</li>
+
+     <li><p>Advance <var title="">position</var> to the next character in <var title="">input</var>.</li>
+
+    </ol><p>Otherwise, if the character at <var title="">position</var> is either a U+002B PLUS SIGN (+)
+    or a U+002D HYPHEN-MINUS (-), then:</p>
+
+    <ol><li><p>If the character at <var title="">position</var> is a U+002B PLUS SIGN (+), let <var title="">sign</var> be "positive". Otherwise, it's a U+002D HYPHEN-MINUS (-); let <var title="">sign</var> be "negative".</li>
+
+     <li><p>Advance <var title="">position</var> to the next character in <var title="">input</var>.</li>
+
+     <li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>. Let
+     <var title="">s</var> be the collected sequence.</li>
+
+     <li>
+
+      <p>If <var title="">s</var> is exactly two characters long, then run these substeps:</p>
+
+      <ol><li><p>Interpret <var title="">s</var> as a base-ten integer. Let that number be the <var title="">timezone<sub title="">hours</sub></var>.</li>
+
+       <li><p>If <var title="">position</var> is beyond the end of <var title="">input</var> or if
+       the character at <var title="">position</var> is not a U+003A COLON character, then fail.
+       Otherwise, move <var title="">position</var> forwards one character.</li>
+
+       <li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>. If
+       the collected sequence is not exactly two characters long, then fail. Otherwise, interpret
+       the resulting sequence as a base-ten integer. Let that number be the <var title="">timezone<sub title="">minutes</sub></var>.</li>
+
+      </ol><p>If <var title="">s</var> is exactly four characters long, then run these substeps:</p>
+
+      <ol><li><p>Interpret the first two characters of <var title="">s</var> as a base-ten integer. Let
+       that number be the <var title="">timezone<sub title="">hours</sub></var>.</li>
+
+       <li><p>Interpret the last two characters of <var title="">s</var> as a base-ten integer. Let
+       that number be the <var title="">timezone<sub title="">minutes</sub></var>.</li>
+
+      </ol><p>Otherwise, fail.</p>
+
+     </li>
+
+     <li>If <var title="">timezone<sub title="">hours</sub></var> is not a number in the range
+     0&nbsp;&le;&nbsp;<var title="">timezone<sub title="">hours</sub></var>&nbsp;&le;&nbsp;23, then
+     fail.</li>
+
+     <li>If <var title="">sign</var> is "negative", then negate <var title="">timezone<sub title="">hours</sub></var>.</li>
+
+     <li>If <var title="">timezone<sub title="">minutes</sub></var> is not a number in the range
+     0&nbsp;&le;&nbsp;<var title="">timezone<sub title="">minutes</sub></var>&nbsp;&le;&nbsp;59,
+     then fail.</li>
+
+     <li>If <var title="">sign</var> is "negative", then negate <var title="">timezone<sub title="">minutes</sub></var>.</li>
+
+    </ol><p>Otherwise, fail.</p>
+
+   </li>
+
+   <li><p>Return <var title="">timezone<sub title="">hours</sub></var> and <var title="">timezone<sub title="">minutes</sub></var>.</li>
+
+  </ol></div>
+
+
+  <h5 id=global-dates-and-times><span class=secno>2.4.5.7 </span>Global dates and times</h5>
+
+  <p>A <dfn id=concept-datetime title=concept-datetime>global date and time</dfn> consists of a specific
+  <a href=#proleptic-gregorian-date>proleptic-Gregorian date</a>, consisting of a year, a month, and a day, and a time,
+  consisting of an hour, a minute, a second, and a fraction of a second, expressed with a time-zone
+  offset, consisting of a signed number of hours and minutes. <a href=#refsGREGORIAN>[GREGORIAN]</a></p>
+
+  <p>A string is a <dfn id=valid-global-date-and-time-string>valid global date and time string</dfn> representing a date, time, and a
+  time-zone offset if it consists of the following components in the given order:</p>
+
+  <ol><li>A <a href=#valid-date-string>valid date string</a> representing the date</li>
+
+   <li>A U+0054 LATIN CAPITAL LETTER T character (T) or a U+0020 SPACE character</li>
+
+   <li>A <a href=#valid-time-string>valid time string</a> representing the time</li>
+
+   <li>A <a href=#valid-time-zone-offset-string>valid time-zone offset string</a> representing the time-zone offset</li>
+
+  </ol><p>Times in dates before the formation of UTC in the mid twentieth century must be expressed and
+  interpreted in terms of UT1 (contemporary Earth solar time at the 0&deg; longitude), not UTC (the
+  approximation of UT1 that ticks in SI seconds). Time before the formation of time zones must be
+  expressed and interpeted as UT1 times with explicit time zones that approximate the contemporary
+  difference between the appropriate local time and the time observed at the location of Greenwich,
+  London.</p>
+
+  <div class=example>
+
+   <p>The following are some examples of dates written as <a href=#valid-global-date-and-time-string title="valid global date and time
+   string">valid global date and time strings</a>.</p>
+
+   <dl><dt>"<code>0037-12-13 00:00Z</code>"</dt>
+
+    <dd>Midnight in areas using London time on the birthday of Nero (the Roman Emperor). See below
+    for further discussion on which date this actually corresponds to.</dd>
+
+    <dt>"<code>1979-10-14T12:00:00.001-04:00</code>"</dt>
+
+    <dd>One millisecond after noon on October 14th 1979, in the time zone in use on the east coast
+    of the USA during daylight saving time.</dd>
+
+    <dt>"<code>8592-01-01T02:09+02:09</code>"</dt>
+
+    <dd>Midnight UTC on the 1st of January, 8592. The time zone associated with that time is two
+    hours and nine minutes ahead of UTC, which is not currently a real time zone, but is nonetheless
+    allowed.</dd>
+
+   </dl><p>Several things are notable about these dates:</p>
+
+   <ul><li>Years with fewer than four digits have to be zero-padded. The date "37-12-13" would not be a
+    valid date.</li>
+
+    <li>If the "<code title="">T</code>" is replaced by a space, it must be a single space
+    character. The string "<code title="">2001-12-21&nbsp;&nbsp;12:00Z</code>" (with two spaces
+    between the components) would not be parsed successfully.</li>
+
+    <li>To unambiguously identify a moment in time prior to the introduction of the Gregorian
+    calendar (insofar as moments in time before the formation of UTC can be unambiguously
+    identified), the date has to be first converted to the Gregorian calendar from the calendar in
+    use at the time (e.g. from the Julian calendar). The date of Nero's birth is the 15th of
+    December 37, in the Julian Calendar, which is the 13th of December 37 in the <a href=#proleptic-gregorian-calendar>proleptic
+    Gregorian calendar</a>.</li> <!-- This might not be true. I can't find a reference that gives
+    his birthday with an explicit statement about the calendar being used. However, it seems
+    unlikely that it would be given in the Gregorian calendar, so I assume sites use the Julian one.
+    -->
+
+    <li>The time and time-zone offset components are not optional.</li>
+
+    <li>Dates before the year one can't be represented as a datetime in this version of HTML.</li>
+
+    <li>Times of specific events in ancient times are, at best, approximations, since time was not
+    well coordinated or measured until relatively recent decades.</li>
+
+    <li>Time-zone offsets differ based on daylight savings time.</li>
+
+   </ul></div>
+
+  <p>A string is a <dfn id=valid-normalized-forced-utc-global-date-and-time-string>valid normalized forced-UTC global date and time string</dfn> representing a
+  date, time, and a time-zone offset if it consists of the following components in the given
+  order:</p>
+
+  <ol><li>A <a href=#valid-date-string>valid date string</a> representing the date converted to the UTC time zone</li>
+
+   <li>A U+0054 LATIN CAPITAL LETTER T character (T)</li>
+
+   <li>A <a href=#valid-time-string>valid time string</a> representing the time converted to the UTC time zone and
+   expressed as the shortest possible string for the given time (e.g. omitting the seconds component
+   entirely if the given time is zero seconds past the minute)</li>
+
+   <li>A U+005A LATIN CAPITAL LETTER Z character (Z)</li>
+
+  </ol><div class=impl>
+
+  <p>The rules to <dfn id=parse-a-global-date-and-time-string>parse a global date and time string</dfn> are as follows. This will return
+  either a time in UTC, with associated time-zone offset information for round-tripping or display
+  purposes, or nothing. If at any point the algorithm says that it "fails", this means that it is
+  aborted at that point and returns nothing.</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p><a href=#parse-a-date-component>Parse a date component</a> to obtain <var title="">year</var>, <var title="">month</var>, and <var title="">day</var>. If this returns nothing, then fail.</p>
+
+   <li><p>If <var title="">position</var> is beyond the end of <var title="">input</var> or if the
+   character at <var title="">position</var> is neither a U+0054 LATIN CAPITAL LETTER T character
+   (T) nor a U+0020 SPACE character, then fail. Otherwise, move <var title="">position</var>
+   forwards one character.</li>
+
+   <li><p><a href=#parse-a-time-component>Parse a time component</a> to obtain <var title="">hour</var>, <var title="">minute</var>, and <var title="">second</var>. If this returns nothing, then fail.</p>
+
+   <li><p>If <var title="">position</var> is beyond the end of <var title="">input</var>, then
+   fail.</li>
+
+   <li><p><a href=#parse-a-time-zone-offset-component>Parse a time-zone offset component</a> to obtain <var title="">timezone<sub title="">hours</sub></var> and <var title="">timezone<sub title="">minutes</sub></var>. If this
+   returns nothing, then fail.</p>
+
+   <li><p>If <var title="">position</var> is <em>not</em> beyond the end of <var title="">input</var>, then fail.</li>
+
+   <li><p>Let <var title="">time</var> be the moment in time at year <var title="">year</var>, month
+   <var title="">month</var>, day <var title="">day</var>, hours <var title="">hour</var>, minute
+   <var title="">minute</var>, second <var title="">second</var>, subtracting <var title="">timezone<sub title="">hours</sub></var> hours and <var title="">timezone<sub title="">minutes</sub></var> minutes. That moment in time is a moment in the UTC time
+   zone.</li>
+
+   <li><p>Let <var title="">timezone</var> be <var title="">timezone<sub title="">hours</sub></var>
+   hours and <var title="">timezone<sub title="">minutes</sub></var> minutes from UTC.</li>
+
+   <li><p>Return <var title="">time</var> and <var title="">timezone</var>.</li>
+
+  </ol></div>
+
+
+  <h5 id=weeks><span class=secno>2.4.5.8 </span>Weeks</h5>
+
+  <p>A <dfn id=concept-week title=concept-week>week</dfn> consists of a week-year number and a week number
+  representing a seven-day period starting on a Monday. Each week-year in this calendaring system
+  has either 52 or 53 such seven-day periods, as defined below. The seven-day period starting on the
+  Gregorian date Monday December 29th 1969 (1969-12-29) is defined as week number 1 in week-year
+  1970. Consecutive weeks are numbered sequentially. The week before the number 1 week in a
+  week-year is the last week in the previous week-year, and vice versa. <a href=#refsGREGORIAN>[GREGORIAN]</a></p>
+
+  <p>A week-year with a number <var title="">year</var> has 53 weeks if it corresponds to either a
+  year <var title="">year</var> in the <a href=#proleptic-gregorian-calendar>proleptic Gregorian calendar</a> that has a Thursday
+  as its first day (January 1st), or a year <var title="">year</var> in the <a href=#proleptic-gregorian-calendar>proleptic
+  Gregorian calendar</a> that has a Wednesday as its first day (January 1st) and where <var title="">year</var> is a number divisible by 400, or a number divisible by 4 but not by 100. All
+  other week-years have 52 weeks.</p>
+
+  <p>The <dfn id=week-number-of-the-last-day>week number of the last day</dfn> of a week-year with 53 weeks is 53; the week number
+  of the last day of a week-year with 52 weeks is 52.</p>
+
+  <p class=note>The week-year number of a particular day can be different than the number of the
+  year that contains that day in the <a href=#proleptic-gregorian-calendar>proleptic Gregorian calendar</a>. The first week in a
+  week-year <var title="">y</var> is the week that contains the first Thursday of the Gregorian year
+  <var title="">y</var>.</p>
+
+  <p class=note>For modern purposes, a <a href=#concept-week title=concept-week>week</a> as defined here is
+  equivalent to ISO weeks as defined in ISO 8601. <a href=#refsISO8601>[ISO8601]</a></p>
+
+  <p>A string is a <dfn id=valid-week-string>valid week string</dfn> representing a week-year <var title="">year</var>
+  and week <var title="">week</var> if it consists of the following components in the given
+  order:</p>
+
+  <ol><li>Four or more <a href=#ascii-digits>ASCII digits</a>, representing <var title="">year</var>, where <var title="">year</var>&nbsp;&gt;&nbsp;0</li>
+
+   <li>A U+002D HYPHEN-MINUS character (-)</li>
+
+   <li>A U+0057 LATIN CAPITAL LETTER W character (W)</li>
+
+   <li>Two <a href=#ascii-digits>ASCII digits</a>, representing the week <var title="">week</var>, in the range
+   1&nbsp;&le;&nbsp;<var title="">week</var>&nbsp;&le;&nbsp;<var title="">maxweek</var>, where <var title="">maxweek</var> is the <a href=#week-number-of-the-last-day>week number of the last day</a> of week-year <var title="">year</var></li>
+
+  </ol><div class=impl>
+
+  <p>The rules to <dfn id=parse-a-week-string>parse a week string</dfn> are as follows. This will return either a week-year
+  number and week number, or nothing. If at any point the algorithm says that it "fails", this means
+  that it is aborted at that point and returns nothing.</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>. If the
+   collected sequence is not at least four characters long, then fail. Otherwise, interpret the
+   resulting sequence as a base-ten integer. Let that number be the <var title="">year</var>.</li>
+
+   <li><p>If <var title="">year</var> is not a number greater than zero, then fail.</li>
+
+   <li><p>If <var title="">position</var> is beyond the end of <var title="">input</var> or if the
+   character at <var title="">position</var> is not a U+002D HYPHEN-MINUS character, then fail.
+   Otherwise, move <var title="">position</var> forwards one character.</li>
+
+   <li><p>If <var title="">position</var> is beyond the end of <var title="">input</var> or if the
+   character at <var title="">position</var> is not a U+0057 LATIN CAPITAL LETTER W character (W),
+   then fail. Otherwise, move <var title="">position</var> forwards one character.</li>
+
+   <li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>. If the
+   collected sequence is not exactly two characters long, then fail. Otherwise, interpret the
+   resulting sequence as a base-ten integer. Let that number be the <var title="">week</var>.</li>
+
+   <li><p>Let <var title="">maxweek</var> be the <a href=#week-number-of-the-last-day>week number of the last day</a> of year
+   <var title="">year</var>.</li>
+
+   <li><p>If <var title="">week</var> is not a number in the range 1&nbsp;&le;&nbsp;<var title="">week</var>&nbsp;&le;&nbsp;<var title="">maxweek</var>, then fail.</li>
+
+   <li><p>If <var title="">position</var> is <em>not</em> beyond the end of <var title="">input</var>, then fail.</li>
+
+   <li><p>Return the week-year number <var title="">year</var> and the week number <var title="">week</var>.</li>
+
+  </ol></div>
+
+
+  <h5 id=durations><span class=secno>2.4.5.9 </span>Durations</h5>
+
+  <!-- if you add support for year and month durations, then search for MONTHS throughout the spec
+  (not just this section) for things that have to change -->
+
+  <p>A <dfn id=concept-duration title=concept-duration>duration</dfn> consists of <!--MONTHS: either a number of
+  months or--> a number of seconds.</p>
+
+  <p class=note>Since months and seconds are not comparable (a month is not a precise number of
+  seconds, but is instead a period whose exact length depends on the precise day from which it is
+  measured) a <a href=#concept-duration title=concept-duration>duration</a> as defined in this specification cannot
+  <!--MONTHS: consist of a mixture of both--> include months (or years, which are equivalent to
+  twelve months). Only durations that describe a specific number of seconds can be described.</p>
+
+  <p>A string is a <dfn id=valid-duration-string>valid duration string</dfn> representing a <a href=#concept-duration title=concept-duration>duration</a> <var title="">t</var> if it consists of either of the
+  following:</p>
+
+  <ul><li>
+
+    <!-- The ISO format -->
+
+    <!-- NOTE: ISO durations also have a number of formats we do not
+         consider conforming:
+
+         - a "week" format (e.g. P4W). This one is actually supported
+           by the parser.
+
+         - P<date>T<time>, with or without hyphens
+
+         - All these formats, with commas instead of periods for the
+           seconds decimal
+
+    -->
+
+    <p>A literal U+0050 LATIN CAPITAL LETTER P character followed by one or more of the following
+    subcomponents, in the order given, where <!--the number of years, if any, multiplied by twelve,
+    plus the number of months, if any, equals the number of months in <var title="">t</var>, if the
+    duration is in months; or, if it is in seconds, -->the number of days, hours, minutes, and
+    seconds corresponds to the same number of seconds as in <var title="">t</var>:</p>
+
+    <ol><!--MONTHS:
+     <li><p>One or more <span>ASCII digits</span> followed by a U+0059 LATIN CAPITAL LETTER Y
+     character, representing a number of years.</p></li>
+
+     <li><p>One or more <span>ASCII digits</span> followed by a U+004D LATIN CAPITAL LETTER M
+     character, representing a number of months.</p></li>
+--><li><p>One or more <a href=#ascii-digits>ASCII digits</a> followed by a U+0044 LATIN CAPITAL LETTER D
+     character, representing a number of days.</li>
+
+     <li>
+
+      <p>A U+0054 LATIN CAPITAL LETTER T character followed by one or more of the following
+      subcomponents, in the order given:</p>
+
+      <ol><li><p>One or more <a href=#ascii-digits>ASCII digits</a> followed by a U+0048 LATIN CAPITAL LETTER H
+       character, representing a number of hours.</li>
+
+       <li><p>One or more <a href=#ascii-digits>ASCII digits</a> followed by a U+004D LATIN CAPITAL LETTER M
+       character, representing a number of minutes.</li>
+
+       <li>
+
+        <p>The following components:</p>
+
+        <ol><li><p>One or more <a href=#ascii-digits>ASCII digits</a>, representing a number of seconds.</li>
+
+         <li><p>Optionally, a U+002E FULL STOP character (.) followed by one, two, or three
+         <a href=#ascii-digits>ASCII digits</a>, representing a fraction of a second.</li>
+
+         <li><p>A U+0053 LATIN CAPITAL LETTER S character.</li>
+
+        </ol></li>
+
+      </ol></li>
+
+    </ol><p class=note>This, as with a number of other date- and time-related microsyntaxes defined in
+    this specification, is based on one of the formats defined in ISO 8601. <a href=#refsISO8601>[ISO8601]</a></p>
+
+   </li>
+
+   <li>
+
+    <p>One or more <a href=#duration-time-component title="duration time component">duration time components</a>, each with
+    a different <a href=#duration-time-component-scale>duration time component scale</a>, in any order; the sum of the represented
+    seconds being equal to the number of seconds in <var title="">t</var>.</p>
+
+    <p>A <dfn id=duration-time-component>duration time component</dfn> is a string consisting of the following components:</p>
+
+    <ol><li><p>Zero or more <a href=#space-character title="space character">space characters</a>.</li>
+
+     <li><p>One or more <a href=#ascii-digits>ASCII digits</a>, representing a number of time units, scaled by
+     the <a href=#duration-time-component-scale>duration time component scale</a> specified (see below) to represent a number of
+     seconds.</li>
+
+     <li><p>If the <a href=#duration-time-component-scale>duration time component scale</a> specified is 1 (i.e. the units are
+     seconds), then, optionally, a U+002E FULL STOP character (.) followed by one, two, or three
+     <a href=#ascii-digits>ASCII digits</a>, representing a fraction of a second.</li>
+
+     <li><p>Zero or more <a href=#space-character title="space character">space characters</a>.</li>
+
+     <li>
+
+      <p>One of the following characters, representing the <dfn id=duration-time-component-scale>duration time component scale</dfn>
+      of the time unit used in the numeric part of the <a href=#duration-time-component>duration time component</a>:</p>
+
+      <dl><dt>U+0057 LATIN CAPITAL LETTER W character</dt>
+       <dt>U+0077 LATIN SMALL LETTER W character</dt>
+
+       <dd>Weeks. The scale is 604800.</dd>
+
+       <dt>U+0044 LATIN CAPITAL LETTER D character</dt>
+       <dt>U+0064 LATIN SMALL LETTER D character</dt>
+
+       <dd>Days. The scale is 86400.</dd>
+
+       <dt>U+0048 LATIN CAPITAL LETTER H character</dt>
+       <dt>U+0068 LATIN SMALL LETTER H character</dt>
+
+       <dd>Hours. The scale is 3600.</dd>
+
+       <dt>U+004D LATIN CAPITAL LETTER M character</dt>
+       <dt>U+006D LATIN SMALL LETTER M character</dt>
+
+       <dd>Minutes. The scale is 60.</dd>
+
+       <dt>U+0053 LATIN CAPITAL LETTER S character</dt>
+       <dt>U+0073 LATIN SMALL LETTER S character</dt>
+
+       <dd>Seconds. The scale is 1.</dd>
+
+      </dl></li>
+
+     <li><p>Zero or more <a href=#space-character title="space character">space
+     characters</a>.</li>
+
+    </ol><p class=note>This is not based on any of the formats in ISO 8601. It is intended to be a more
+    human-readable alternative to the ISO 8601 duration format.</p>
+
+   </li>    
+
+  </ul><div class=impl>
+
+  <p>The rules to <dfn id=parse-a-duration-string>parse a duration string</dfn> are as follows. This will return either a <a href=#concept-duration title=concept-duration>duration</a> or nothing. If at any point the algorithm says that it
+  "fails", this means that it is aborted at that point and returns nothing.</p>
+
+  <ol><!--MONTHS: this algorithm actually already parses months adequately, though it would need
+   tweaking if we introduced a "mo" unit for the non-ISO variant. See other "MONTHS" annotations
+   below. --><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p>Let <var title="">months</var>, <var title="">seconds</var>, and <var title="">component
+   count</var> all be zero.</li>
+
+   <li>
+
+    <p>Let <var title="">M-disambiguator</var> be <i>minutes</i>.</p>
+
+    <!--MONTHS: this note would change-->
+    <p class=note>This flag's other value is <i>months</i>. It is used to disambiguate the "M"
+    unit in ISO8601 durations, which use the same unit for months and minutes. Months are not
+    allowed, but are parsed for future compatibility and to avoid misinterpreting ISO8601 durations
+    that would be valid in other contexts.</p>
+
+   </li>
+
+   <li><p><a href=#skip-whitespace>Skip whitespace</a>.</li>
+
+   <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, then
+   fail.</li>
+
+   <li><p>If the character in <var title="">input</var> pointed to by <var title="">position</var>
+   is a U+0050 LATIN CAPITAL LETTER P character, then advance <var title="">position</var> to the
+   next character, set <var title="">M-disambiguator</var> to <i>months</i>, and <a href=#skip-whitespace>skip
+   whitespace</a>.</li>
+
+   <li>
+
+    <p>Run the following substeps in a loop, until a step requiring the loop to be broken or the
+    entire algorithm to fail is reached:</p>
+
+    <ol><li><p>Let <var title="">units</var> be undefined. It will be assigned one of the following
+     values: <i>years</i>, <i>months</i>, <i>weeks</i>, <i>days</i>, <i>hours</i>, <i>minutes</i>,
+     and <i>seconds</i>.</li>
+
+     <li><p>Let <var title="">next character</var> be undefined. It is used to process characters
+     from the <var title="">input</var>.</li>
+
+     <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, then break
+     the loop.</li>
+
+     <li><p>If the character in <var title="">input</var> pointed to by <var title="">position</var>
+     is a U+0054 LATIN CAPITAL LETTER T character, then advance <var title="">position</var> to the
+     next character, set <var title="">M-disambiguator</var> to <i>minutes</i>, <a href=#skip-whitespace>skip
+     whitespace</a>, and return to the top of the loop.</li>
+
+     <li><p>Set <var title="">next character</var> to the character in <var title="">input</var>
+     pointed to by <var title="">position</var>.</li>
+
+     <li>
+
+      <p>If <var title="">next character</var> is a U+002E FULL STOP character (.), then let <var title="">N</var> equal zero. (Do not advance <var title="">position</var>. That is taken care
+      of below.)</p>
+
+      <p>Otherwise, if <var title="">next character</var> is an <a href=#ascii-digits title="ASCII digits">ASCII
+      digit</a>, then <a href=#collect-a-sequence-of-characters>collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII
+      digits</a>, interpret the resulting sequence as a base-ten integer, and let <var title="">N</var> be that number.</p>
+
+      <p>Otherwise <var title="">next character</var> is not part of a number; fail.</p>
+
+     </li>
+
+     <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, then
+     fail.</li>
+
+     <li><p>Set <var title="">next character</var> to the character in <var title="">input</var>
+     pointed to by <var title="">position</var>, and this time advance <var title="">position</var>
+     to the next character. (If <var title="">next character</var> was a U+002E FULL STOP character
+     (.) before, it will still be that character this time.)</li>
+
+     <li>
+
+      <p>If <var title="">next character</var> is a U+002E FULL STOP character (.), then run these
+      substeps:</p>
+
+      <ol><li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are <a href=#ascii-digits>ASCII digits</a>. Let
+       <var title="">s</var> be the resulting sequence.</li>
+
+       <li><p>If <var title="">s</var> is the empty string, then fail.</li>
+
+       <li><p>Let <var title="">length</var> be the number of characters in <var title="">s</var>.</li>
+
+       <li><p>Let <var title="">fraction</var> be the result of interpreting <var title="">s</var>
+       as a base-ten integer, and then dividing that number by <span title="">10<sup title=""><var title="">length</var></sup></span>.</li>
+
+       <li><p>Increment <var title="">N</var> by <var title="">fraction</var>.</li>
+
+       <li><p><a href=#skip-whitespace>Skip whitespace</a>.</li>
+
+       <li><p>If <var title="">position</var> is past the end of <var title="">input</var>, then
+       fail.</li>
+
+       <li><p>Set <var title="">next character</var> to the character in <var title="">input</var>
+       pointed to by <var title="">position</var>, and advance <var title="">position</var> to the
+       next character.</li>
+
+       <li><p>If <var title="">next character</var> is neither a U+0053 LATIN CAPITAL LETTER S
+       character nor a U+0073 LATIN SMALL LETTER S character, then fail.</li>
+
+       <li><p>Set <var title="">units</var> to <i>seconds</i>.</li>
+
+      </ol><p>Otherwise, run these substeps:</p>
+
+      <ol><li><p>If <var title="">next character</var> is a <a href=#space-character>space character</a>, then
+       <a href=#skip-whitespace>skip whitespace</a>, set <var title="">next character</var> to the character in <var title="">input</var> pointed to by <var title="">position</var>, and advance <var title="">position</var> to the next character.</li>
+
+       <li>
+
+        <!--MONTHS: this would probably be where we would add more
+        logic to support a new unit like 'mo' -->
+
+        <p>If <var title="">next character</var> is a U+0059 LATIN CAPITAL LETTER Y character, or a
+        U+0079 LATIN SMALL LETTER Y character, set <var title="">units</var> to <i>years</i> and set
+        <var title="">M-disambiguator</var> to <i>months</i>.</p>
+
+        <p>If <var title="">next character</var> is a U+004D LATIN CAPITAL LETTER M character or a
+        U+006D LATIN SMALL LETTER M character, and <var title="">M-disambiguator</var> is
+        <i>months</i>, then set <var title="">units</var> to <i>months</i>.</p>
+
+        <p>If <var title="">next character</var> is a U+0057 LATIN CAPITAL LETTER W character or a
+        U+0077 LATIN SMALL LETTER W character, set <var title="">units</var> to <i>weeks</i> and set
+        <var title="">M-disambiguator</var> to <i>minutes</i>.</p>
+
+        <p>If <var title="">next character</var> is a U+0044 LATIN CAPITAL LETTER D character or a
+        U+0064 LATIN SMALL LETTER D character, set <var title="">units</var> to <i>days</i> and set
+        <var title="">M-disambiguator</var> to <i>minutes</i>.</p>
+
+        <p>If <var title="">next character</var> is a U+0048 LATIN CAPITAL LETTER H character or a
+        U+0068 LATIN SMALL LETTER H character, set <var title="">units</var> to <i>hours</i> and set
+        <var title="">M-disambiguator</var> to <i>minutes</i>.</p>
+
+        <p>If <var title="">next character</var> is a U+004D LATIN CAPITAL LETTER M character or a
+        U+006D LATIN SMALL LETTER M character, and <var title="">M-disambiguator</var> is
+        <i>minutes</i>, then set <var title="">units</var> to <i>minutes</i>.</p>
+
+        <p>If <var title="">next character</var> is a U+0053 LATIN CAPITAL LETTER S character or a
+        U+0073 LATIN SMALL LETTER S character, set <var title="">units</var> to <i>seconds</i> and
+        set <var title="">M-disambiguator</var> to <i>minutes</i>.</p>
+
+        <p>Otherwise if <var title="">next character</var> is none of the above characters, then
+        fail.</p>
+
+       </li>
+
+      </ol></li>
+
+     <li><p>Increment <var title="">component count</var>.</li>
+
+     <li><p>Let <var title="">multiplier</var> be 1.</li>
+
+     <li><p>If <var title="">units</var> is <i>years</i>, multiply <var title="">multiplier</var> by
+     12 and set <var title="">units</var> to <i>months</i>.</li>
+
+     <li>
+
+      <p>If <var title="">units</var> is <i>months</i>, add the product of <var title="">N</var> and
+      <var title="">multiplier</var> to <var title="">months</var>.</p>
+
+      <p>Otherwise, run these substeps:</p>
+
+      <ol><li><p>If <var title="">units</var> is <i>weeks</i>, multiply <var title="">multiplier</var>
+       by 7 and set <var title="">units</var> to <i>days</i>.</li>
+
+       <li><p>If <var title="">units</var> is <i>days</i>, multiply <var title="">multiplier</var>
+       by 24 and set <var title="">units</var> to <i>hours</i>.</li>
+
+       <li><p>If <var title="">units</var> is <i>hours</i>, multiply <var title="">multiplier</var>
+       by 60 and set <var title="">units</var> to <i>minutes</i>.</li>
+
+       <li><p>If <var title="">units</var> is <i>minutes</i>, multiply <var title="">multiplier</var> by 60 and set <var title="">units</var> to <i>seconds</i>.</li>
+
+       <li><p>Forcibly, <var title="">units</var> is now <i>seconds</i>. Add the product of <var title="">N</var> and <var title="">multiplier</var> to <var title="">seconds</var>.</li>
+
+      </ol></li>
+
+     <li><p><a href=#skip-whitespace>Skip whitespace</a>.</li>
+
+    </ol></li>
+
+   <li><p>If <var title="">component count</var> is zero,
+   fail.</li>
+
+   <!--MONTHS: if we add month support this is where you'd return them-->
+   <li><p>If <var title="">months</var> is not zero, fail.</li>
+
+   <li><p>Return the <a href=#concept-duration title=concept-duration>duration</a> consisting of <var title="">seconds</var> seconds.</li>
+
+  </ol></div>
+
+
+  <h5 id=vaguer-moments-in-time><span class=secno>2.4.5.10 </span>Vaguer moments in time</h5>
+
+  <p>A string is a <dfn id=valid-date-string-with-optional-time>valid date string with optional time</dfn> if
+  it is also one of the following:</p>
+
+  <ul><li>A <a href=#valid-date-string>valid date string</a></li>
+
+   <li>A <a href=#valid-global-date-and-time-string>valid global date and time string</a></li>
+
+  </ul><div class=impl>
+
+  <hr><p>The rules to <dfn id=parse-a-date-or-time-string>parse a date or time string</dfn> are as follows. The algorithm will return
+  either a <a href=#concept-date title=concept-date>date</a>, a <a href=#concept-time title=concept-time>time</a>, a <a href=#concept-datetime title=concept-datetime>global date and time</a>, or nothing. If at any point the algorithm
+  says that it "fails", this means that it is aborted at that point and returns nothing.</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p>Set <var title="">start position</var> to the same position as <var title="">position</var>.</li>
+
+   <li><p>Set the <var title="">date present</var> and <var title="">time present</var> flags to
+   true.</li>
+
+   <li><p><a href=#parse-a-date-component>Parse a date component</a> to obtain <var title="">year</var>, <var title="">month</var>, and <var title="">day</var>. If this fails, then set the <var title="">date
+   present</var> flag to false.</p>
+
+   <li>
+
+    <p>If <var title="">date present</var> is true, and <var title="">position</var> is not beyond
+    the end of <var title="">input</var>, and the character at <var title="">position</var> is
+    either a U+0054 LATIN CAPITAL LETTER T character (T) or a U+0020 SPACE character, then advance
+    <var title="">position</var> to the next character in <var title="">input</var>.</p>
+
+    <p>Otherwise, if <var title="">date present</var> is true, and either <var title="">position</var> is beyond the end of <var title="">input</var> or the character at <var title="">position</var> is neither a U+0054 LATIN CAPITAL LETTER T character (T) nor a U+0020
+    SPACE character, then set <var title="">time present</var> to false.</p>
+
+    <p>Otherwise, if <var title="">date present</var> is false, set <var title="">position</var>
+    back to the same position as <var title="">start position</var>.</p>
+
+   </li>
+
+   <li><p>If the <var title="">time present</var> flag is true, then <a href=#parse-a-time-component>parse a time
+   component</a> to obtain <var title="">hour</var>, <var title="">minute</var>, and <var title="">second</var>. If this returns nothing, then fail.</li>
+
+   <li><p>If the <var title="">date present</var> and <var title="">time present</var> flags are
+   both true, but <var title="">position</var> is beyond the end of <var title="">input</var>, then
+   fail.</li>
+
+   <li><p>If the <var title="">date present</var> and <var title="">time present</var> flags are
+   both true, <a href=#parse-a-time-zone-offset-component>parse a time-zone offset component</a> to obtain <var title="">timezone<sub title="">hours</sub></var> and <var title="">timezone<sub title="">minutes</sub></var>. If this
+   returns nothing, then fail.</p>
+
+   <li><p>If <var title="">position</var> is <em>not</em> beyond the end of <var title="">input</var>, then fail.</li>
+
+   <li>
+
+    <p>If the <var title="">date present</var> flag is true and the <var title="">time present</var>
+    flag is false, then let <var title="">date</var> be the date with year <var title="">year</var>,
+    month <var title="">month</var>, and day <var title="">day</var>, and return <var title="">date</var>.</p>
+
+    <p>Otherwise, if the <var title="">time present</var> flag is true and the <var title="">date
+    present</var> flag is false, then let <var title="">time</var> be the time with hour <var title="">hour</var>, minute <var title="">minute</var>, and second <var title="">second</var>,
+    and return <var title="">time</var>.</p>
+
+    <p>Otherwise, let <var title="">time</var> be the moment in time at year <var title="">year</var>, month <var title="">month</var>, day <var title="">day</var>, hours <var title="">hour</var>, minute <var title="">minute</var>, second <var title="">second</var>,
+    subtracting <var title="">timezone<sub title="">hours</sub></var> hours and <var title="">timezone<sub title="">minutes</sub></var> minutes, that moment in time being a moment
+    in the UTC time zone; let <var title="">timezone</var> be <var title="">timezone<sub title="">hours</sub></var> hours and <var title="">timezone<sub title="">minutes</sub></var>
+    minutes from UTC; and return <var title="">time</var> and <var title="">timezone</var>.</p>
+
+   </li>
+
+  </ol></div>
+
+
+  <h4 id=colors><span class=secno>2.4.6 </span>Colors</h4>
+
+  <p>A <dfn id=simple-color>simple color</dfn> consists of three 8-bit numbers in the range 0..255, representing the
+  red, green, and blue components of the color respectively, in the sRGB color space. <a href=#refsSRGB>[SRGB]</a></p>
+
+  <p>A string is a <dfn id=valid-simple-color>valid simple color</dfn> if it is exactly seven characters long, and the
+  first character is a U+0023 NUMBER SIGN character (#), and the remaining six characters are all
+  <a href=#ascii-hex-digits>ASCII hex digits</a>, with the first two digits representing the red component, the
+  middle two digits representing the green component, and the last two digits representing the blue
+  component, in hexadecimal.</p>
+
+  <p>A string is a <dfn id=valid-lowercase-simple-color>valid lowercase simple color</dfn> if it is a <a href=#valid-simple-color>valid simple
+  color</a> and doesn't use any characters in the range U+0041 LATIN CAPITAL LETTER A to U+0046
+  LATIN CAPITAL LETTER F.</p>
+
+  <div class=impl>
+
+  <p>The <dfn id=rules-for-parsing-simple-color-values>rules for parsing simple color values</dfn> are as given in the following algorithm.
+  When invoked, the steps must be followed in the order given, aborting at the first step that
+  returns a value. This algorithm will return either a <a href=#simple-color>simple color</a> or an error.</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>If <var title="">input</var> is not exactly seven characters long, then return an
+   error.</li>
+
+   <li><p>If the first character in <var title="">input</var> is not a U+0023 NUMBER SIGN character
+   (#), then return an error.</li>
+
+   <li><p>If the last six characters of <var title="">input</var> are not all <a href=#ascii-hex-digits>ASCII hex
+   digits</a>, then return an error.</li>
+
+   <li><p>Let <var title="">result</var> be a <a href=#simple-color>simple color</a>.</p>
+
+   <li><p>Interpret the second and third characters as a hexadecimal number and let the result be
+   the red component of <var title="">result</var>.</p>
+
+   <li><p>Interpret the fourth and fifth characters as a hexadecimal number and let the result be
+   the green component of <var title="">result</var>.</p>
+
+   <li><p>Interpret the sixth and seventh characters as a hexadecimal number and let the result be
+   the blue component of <var title="">result</var>.</p>
+
+   <li><p>Return <var title="">result</var>.</p>
+
+  </ol><p>The <dfn id=rules-for-serializing-simple-color-values>rules for serializing simple color values</dfn> given a <a href=#simple-color>simple color</a> are
+  as given in the following algorithm:</p>
+
+  <ol><li><p>Let <var title="">result</var> be a string consisting of a single U+0023 NUMBER SIGN
+   character (#).</li>
+
+   <li><p>Convert the red, green, and blue components in turn to two-digit hexadecimal numbers using
+   <a href=#lowercase-ascii-hex-digits>lowercase ASCII hex digits</a>, zero-padding if necessary, and append these numbers to
+   <var title="">result</var>, in the order red, green, blue.</p>
+
+   <li><p>Return <var title="">result</var>, which will be a <a href=#valid-lowercase-simple-color>valid lowercase simple
+   color</a>.</li>
+
+  </ol><hr><p>Some obsolete legacy attributes parse colors in a more complicated manner, using the <dfn id=rules-for-parsing-a-legacy-color-value>rules
+  for parsing a legacy color value</dfn>, which are given in the following algorithm. When invoked,
+  the steps must be followed in the order given, aborting at the first step that returns a value.
+  This algorithm will return either a <a href=#simple-color>simple color</a> or an error.</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>If <var title="">input</var> is the empty string, then return an error.</li>
+
+   <li><p><a href=#strip-leading-and-trailing-whitespace>Strip leading and trailing whitespace</a> from <var title="">input</var>.</li>
+
+   <li><p>If <var title="">input</var> is an <a href=#ascii-case-insensitive>ASCII case-insensitive</a> match for the
+   string "<code title="">transparent</code>", then return an error.</li>
+
+   <li>
+
+    <p>If <var title="">input</var> is an <a href=#ascii-case-insensitive>ASCII case-insensitive</a> match for one of the
+    keywords listed in the <a href=http://www.w3.org/TR/css3-color/#svg-color>SVG color
+    keywords</a> <!-- or <a href="http://www.w3.org/TR/css3-color/#css2-system">CSS2 System
+    Colors</a> --> section<!--s--> of the CSS3 Color specification, then return the <a href=#simple-color>simple
+    color</a> corresponding to that keyword. <a href=#refsCSSCOLOR>[CSSCOLOR]</a></p>
+
+    <p class=note><a href=http://www.w3.org/TR/css3-color/#css2-system>CSS2 System
+    Colors</a> are not recognised.</p>
+
+   </li>
+
+   <li>
+
+    <p>If <var title="">input</var> is four characters long, and the first character in <var title="">input</var> is a U+0023 NUMBER SIGN character (#), and the last three characters of
+    <var title="">input</var> are all <a href=#ascii-hex-digits>ASCII hex digits</a>, then run these substeps:</p>
+
+    <ol><li><p>Let <var title="">result</var> be a <a href=#simple-color>simple color</a>.</p>
+
+     <li><p>Interpret the second character of <var title="">input</var> as a hexadecimal digit; let
+     the red component of <var title="">result</var> be the resulting number multiplied by 17.</p>
+
+     <li><p>Interpret the third character of <var title="">input</var> as a hexadecimal digit; let
+     the green component of <var title="">result</var> be the resulting number multiplied by 17.</p>
+
+     <li><p>Interpret the fourth character of <var title="">input</var> as a hexadecimal digit; let
+     the blue component of <var title="">result</var> be the resulting number multiplied by 17.</p>
+
+     <li><p>Return <var title="">result</var>.</p>
+
+    </ol></li>
+
+   <li><p>Replace any characters in <var title="">input</var> that have a Unicode code point greater
+   than U+FFFF (i.e. any characters that are not in the basic multilingual plane) with the
+   two-character string "<code title="">00</code>".</li>
+
+   <li><p>If <var title="">input</var> is longer than 128 characters, truncate <var title="">input</var>, leaving only the first 128 characters.</li>
+
+   <li><p>If the first character in <var title="">input</var> is a U+0023 NUMBER SIGN character (#),
+   remove it.</li>
+
+   <li><p>Replace any character in <var title="">input</var> that is not an <a href=#ascii-hex-digits title="ASCII hex
+   digits">ASCII hex digit</a> with the character U+0030 DIGIT ZERO (0).</li>
+
+   <li><p>While <var title="">input</var>'s length is zero or not a multiple of three, append a
+   U+0030 DIGIT ZERO (0) character to <var title="">input</var>.</li>
+
+   <li><p>Split <var title="">input</var> into three strings of equal length, to obtain three
+   components. Let <var title="">length</var> be the length of those components (one third the
+   length of <var title="">input</var>).</li>
+
+   <li><p>If <var title="">length</var> is greater than 8, then remove the leading <span title=""><var title="">length</var>-8</span> characters in each component, and let <var title="">length</var> be 8.</li>
+
+   <li><p>While <var title="">length</var> is greater than two and the first character in each
+   component is a U+0030 DIGIT ZERO (0) character, remove that character and reduce <var title="">length</var> by one.</li>
+
+   <li><p>If <var title="">length</var> is <em>still</em> greater than two, truncate each component,
+   leaving only the first two characters in each.</li>
+
+   <li><p>Let <var title="">result</var> be a <a href=#simple-color>simple color</a>.</p>
+
+   <li><p>Interpret the first component as a hexadecimal number; let the red component of <var title="">result</var> be the resulting number.</li>
+
+   <li><p>Interpret the second component as a hexadecimal number; let the green component of <var title="">result</var> be the resulting number.</li>
+
+   <li><p>Interpret the third component as a hexadecimal number; let the blue component of <var title="">result</var> be the resulting number.</li>
+
+   <li><p>Return <var title="">result</var>.</p>
+
+  </ol></div>
+
+  <hr><p class=note>The <a href=#canvas-context-2d title=canvas-context-2d>2D graphics context</a> has a separate
+  color syntax that also handles opacity.</p>
+
+
+
+  <h4 id=space-separated-tokens><span class=secno>2.4.7 </span>Space-separated tokens</h4>
+
+  <p>A <dfn id=set-of-space-separated-tokens>set of space-separated tokens</dfn> is a string containing zero or more words (known as
+  tokens) separated by one or more <a href=#space-character title="space character">space characters</a>, where
+  words consist of any string of one or more characters, none of which are <a href=#space-character title="space
+  character">space characters</a>.</p>
+
+  <p>A string containing a <a href=#set-of-space-separated-tokens>set of space-separated tokens</a> may have leading or trailing
+  <a href=#space-character title="space character">space characters</a>.</p>
+
+  <p>An <dfn id=unordered-set-of-unique-space-separated-tokens>unordered set of unique space-separated tokens</dfn> is a <a href=#set-of-space-separated-tokens>set of space-separated
+  tokens</a> where none of the tokens are duplicated.</p>
+
+  <p>An <dfn id=ordered-set-of-unique-space-separated-tokens>ordered set of unique space-separated tokens</dfn> is a <a href=#set-of-space-separated-tokens>set of space-separated
+  tokens</a> where none of the tokens are duplicated but where the order of the tokens is
+  meaningful.</p>
+
+  <p><a href=#set-of-space-separated-tokens title="set of space-separated tokens">Sets of space-separated tokens</a> sometimes
+  have a defined set of allowed values. When a set of allowed values is defined, the tokens must all
+  be from that list of allowed values; other values are non-conforming. If no such set of allowed
+  values is provided, then all values are conforming.</p>
+
+  <p class=note>How tokens in a <a href=#set-of-space-separated-tokens>set of space-separated tokens</a> are to be compared
+  (e.g. case-sensitively or not) is defined on a per-set basis.</p>
+
+  <div class=impl>
+
+  <p>When a user agent has to <dfn id=split-a-string-on-spaces>split a string on spaces</dfn>, it must use the following
+  algorithm:</p>
+
+  <ol><li><p>Let <var title="">input</var> be the string being parsed.</li>
+
+   <li><p>Let <var title="">position</var> be a pointer into <var title="">input</var>, initially
+   pointing at the start of the string.</li>
+
+   <li><p>Let <var title="">tokens</var> be an ordered list of tokens, initially empty.</li>
+
+   <li><p><a href=#skip-whitespace>Skip whitespace</a></li>
+
+   <li><p>While <var title="">position</var> is not past the end of <var title="">input</var>:</p>
+
+    <ol><li><p><a href=#collect-a-sequence-of-characters>Collect a sequence of characters</a> that are not <a href=#space-character title="space
+     character">space characters</a>.</li>
+
+     <li><p>Append the string collected in the previous step to <var title="">tokens</var>.</li>
+
+     <li><p><a href=#skip-whitespace>Skip whitespace</a></li>
+
+    </ol></li>
+
+   <li><p>Return <var title="">tokens</var>.</li>
+
+  </ol></div>
+
+
+  <h4 id=comma-separated-tokens><span class=secno>2.4.8 </span>Comma-separated tokens</h4&