[html5] r5945 - [giow] (0) Completely revamp how peer-to-peer networking works (and some minor t [...]
whatwg at whatwg.org
whatwg at whatwg.org
Mon Mar 14 03:19:50 PDT 2011
Author: ianh
Date: 2011-03-14 03:19:45 -0700 (Mon, 14 Mar 2011)
New Revision: 5945
Modified:
complete.html
index
source
Log:
[giow] (0) Completely revamp how peer-to-peer networking works (and some minor typo fixes in other parts of the spec). This is only a second draft, and therefore this feature will likely evolve a lot over the coming months. Detailed responses to feedback on the topic will be sent out soon.
Modified: complete.html
===================================================================
--- complete.html 2011-03-05 00:12:36 UTC (rev 5944)
+++ complete.html 2011-03-14 10:19:45 UTC (rev 5945)
@@ -239,7 +239,7 @@
<header class=head id=head><p><a class=logo href=http://www.whatwg.org/ rel=home><img alt=WHATWG height=101 src=/images/logo width=101></a></p>
<hgroup><h1>Web Applications 1.0</h1>
- <h2 class="no-num no-toc">Living Standard — Last Updated 5 March 2011</h2>
+ <h2 class="no-num no-toc">Living Standard — Last Updated 14 March 2011</h2>
</hgroup><p>You can take part in this work. <a href=http://www.whatwg.org/mailing-list>Join the working group's discussion list.</a></p>
<p><strong>Web designers!</strong> We have a <a href=http://blog.whatwg.org/faq/>FAQ</a>, a <a href=http://forums.whatwg.org/>forum</a>, and a <a href=http://www.whatwg.org/mailing-list#help>help mailing list</a> for you!</p>
<!--<p class="impl"><strong>Implementors!</strong> We have a <a href="http://www.whatwg.org/mailing-list#implementors">mailing list</a> for you too!</p>-->
@@ -770,11 +770,7 @@
a command</a></li>
<li><a href=#using-the-accesskey-attribute-on-a-label-element-to-define-a-command><span class=secno>4.11.5.6 </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.5.7 </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.5.8 </span>Using the <code title=attr-accesskey>accesskey</code> attribute to define a command on other elements</a></ol></li>
- <li><a href=#devices><span class=secno>4.11.6 </span>The <code>device</code> element</a>
- <ol>
- <li><a href=#stream-api><span class=secno>4.11.6.1 </span>Stream API</a></li>
- <li><a href=#peer-to-peer-connections><span class=secno>4.11.6.2 </span>Peer-to-peer connections</a></ol></ol></li>
+ <li><a href=#using-the-accesskey-attribute-to-define-a-command-on-other-elements><span class=secno>4.11.5.8 </span>Using the <code title=attr-accesskey>accesskey</code> attribute to define a command on other elements</a></ol></ol></li>
<li><a href=#links><span class=secno>4.12 </span>Links</a>
<ol>
<li><a href=#introduction-2><span class=secno>4.12.1 </span>Introduction</a></li>
@@ -1006,340 +1002,350 @@
<li><a href=#the-undomanagerevent-interface-and-the-undo-and-redo-events><span class=secno>8.8.5 </span>The <code>UndoManagerEvent</code> interface and the <code title=event-undo>undo</code> and <code title=event-redo>redo</code> events</a></li>
<li><a href=#implementation-notes><span class=secno>8.8.6 </span>Implementation notes</a></ol></li>
<li><a href=#editing-apis><span class=secno>8.9 </span>Editing APIs</a></ol></li>
- <li><a href=#workers><span class=secno>9 </span>Web workers</a>
+ <li><a href=#video-conferencing-and-peer-to-peer-communication><span class=secno>9 </span>Video conferencing and peer-to-peer communication</a>
<ol>
<li><a href=#introduction-8><span class=secno>9.1 </span>Introduction</a>
<ol>
- <li><a href=#scope-0><span class=secno>9.1.1 </span>Scope</a></li>
- <li><a href=#tutorial><span class=secno>9.1.2 </span>Tutorial</a>
+ <li><a href=#obtaining-local-multimedia-content><span class=secno>9.1.1 </span>Obtaining local multimedia content</a></li>
+ <li><a href=#stream-api><span class=secno>9.1.2 </span>Stream API</a></li>
+ <li><a href=#peer-to-peer-connections><span class=secno>9.1.3 </span>Peer-to-peer connections</a></li>
+ <li><a href=#the-data-stream><span class=secno>9.1.4 </span>The data stream</a></li>
+ <li><a href=#event-definitions-0><span class=secno>9.1.5 </span>Event definitions</a></li>
+ <li><a href=#event-summary><span class=secno>9.1.6 </span>Event Summary</a></ol></ol></li>
+ <li><a href=#workers><span class=secno>10 </span>Web workers</a>
+ <ol>
+ <li><a href=#introduction-9><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=#tutorial><span class=secno>10.1.2 </span>Tutorial</a>
<ol>
- <li><a href=#a-background-number-crunching-worker><span class=secno>9.1.2.1 </span>A background number-crunching worker</a></li>
- <li><a href=#a-worker-for-updating-a-client-side-database><span class=secno>9.1.2.2 </span>A worker for updating a client-side database</a></li>
- <li><a href=#worker-used-for-background-i/o><span class=secno>9.1.2.3 </span>Worker used for background I/O</a></li>
- <li><a href=#shared-workers-introduction><span class=secno>9.1.2.4 </span>Shared workers introduction</a></li>
- <li><a href=#shared-state-using-a-shared-worker><span class=secno>9.1.2.5 </span>Shared state using a shared worker</a></li>
- <li><a href=#delegation><span class=secno>9.1.2.6 </span>Delegation</a></ol></ol></li>
- <li><a href=#infrastructure-0><span class=secno>9.2 </span>Infrastructure</a>
+ <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=#a-worker-for-updating-a-client-side-database><span class=secno>10.1.2.2 </span>A worker for updating a client-side database</a></li>
+ <li><a href=#worker-used-for-background-i/o><span class=secno>10.1.2.3 </span>Worker used for background I/O</a></li>
+ <li><a href=#shared-workers-introduction><span class=secno>10.1.2.4 </span>Shared workers introduction</a></li>
+ <li><a href=#shared-state-using-a-shared-worker><span class=secno>10.1.2.5 </span>Shared state using a shared worker</a></li>
+ <li><a href=#delegation><span class=secno>10.1.2.6 </span>Delegation</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>9.2.1 </span>The global scope</a>
+ <li><a href=#the-global-scope><span class=secno>10.2.1 </span>The global scope</a>
<ol>
- <li><a href=#the-workerglobalscope-abstract-interface><span class=secno>9.2.1.1 </span>The <code>WorkerGlobalScope</code> abstract interface</a></li>
- <li><a href=#dedicated-workers-and-the-dedicatedworkerglobalscope-interface><span class=secno>9.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>9.2.1.3 </span>Shared workers and the <code>SharedWorkerGlobalScope</code> interface</a></ol></li>
- <li><a href=#origins-of-workers><span class=secno>9.2.2 </span>Origins of workers</a></li>
- <li><a href=#the-event-loop><span class=secno>9.2.3 </span>The event loop</a></li>
- <li><a href="#the-worker's-lifetime"><span class=secno>9.2.4 </span>The worker's lifetime</a></li>
- <li><a href=#processing-model-4><span class=secno>9.2.5 </span>Processing model</a></li>
- <li><a href=#runtime-script-errors-0><span class=secno>9.2.6 </span>Runtime script errors</a></li>
- <li><a href=#creating-workers><span class=secno>9.2.7 </span>Creating workers</a>
+ <li><a href=#the-workerglobalscope-abstract-interface><span class=secno>10.2.1.1 </span>The <code>WorkerGlobalScope</code> abstract 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=#origins-of-workers><span class=secno>10.2.2 </span>Origins of workers</a></li>
+ <li><a href=#the-event-loop><span class=secno>10.2.3 </span>The event loop</a></li>
+ <li><a href="#the-worker's-lifetime"><span class=secno>10.2.4 </span>The worker's lifetime</a></li>
+ <li><a href=#processing-model-4><span class=secno>10.2.5 </span>Processing model</a></li>
+ <li><a href=#runtime-script-errors-0><span class=secno>10.2.6 </span>Runtime script errors</a></li>
+ <li><a href=#creating-workers><span class=secno>10.2.7 </span>Creating workers</a>
<ol>
- <li><a href=#the-abstractworker-abstract-interface><span class=secno>9.2.7.1 </span>The <code>AbstractWorker</code> abstract interface</a></li>
- <li><a href=#dedicated-workers-and-the-worker-interface><span class=secno>9.2.7.2 </span>Dedicated workers and the <code>Worker</code> interface</a></li>
- <li><a href=#shared-workers-and-the-sharedworker-interface><span class=secno>9.2.7.3 </span>Shared workers and the <code>SharedWorker</code> interface</a></ol></ol></li>
- <li><a href=#apis-available-to-workers><span class=secno>9.3 </span>APIs available to workers</a>
+ <li><a href=#the-abstractworker-abstract-interface><span class=secno>10.2.7.1 </span>The <code>AbstractWorker</code> abstract interface</a></li>
+ <li><a href=#dedicated-workers-and-the-worker-interface><span class=secno>10.2.7.2 </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.7.3 </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>9.3.1 </span>Importing scripts and libraries</a></li>
- <li><a href=#the-workernavigator-object><span class=secno>9.3.2 </span>The <code>WorkerNavigator</code> object</a></li>
- <li><a href=#interface-objects-and-constructors><span class=secno>9.3.3 </span>Interface objects and constructors</a></li>
- <li><a href=#worker-locations><span class=secno>9.3.4 </span>Worker locations</a></ol></ol></li>
- <li><a href=#comms><span class=secno>10 </span>Communication</a>
+ <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=#comms><span class=secno>11 </span>Communication</a>
<ol>
- <li><a href=#event-definitions-0><span class=secno>10.1 </span>Event definitions</a></li>
- <li><a href=#server-sent-events><span class=secno>10.2 </span>Server-sent events</a>
+ <li><a href=#event-definitions-1><span class=secno>11.1 </span>Event definitions</a></li>
+ <li><a href=#server-sent-events><span class=secno>11.2 </span>Server-sent events</a>
<ol>
- <li><a href=#server-sent-events-intro><span class=secno>10.2.1 </span>Introduction</a></li>
- <li><a href=#the-eventsource-interface><span class=secno>10.2.2 </span>The <code>EventSource</code> interface</a></li>
- <li><a href=#processing-model-5><span class=secno>10.2.3 </span>Processing model</a></li>
- <li><a href=#parsing-an-event-stream><span class=secno>10.2.4 </span>Parsing an event stream</a></li>
- <li><a href=#event-stream-interpretation><span class=secno>10.2.5 </span>Interpreting an event stream</a></li>
- <li><a href=#notes><span class=secno>10.2.6 </span>Notes</a></li>
- <li><a href=#eventsource-push><span class=secno>10.2.7 </span>Connectionless push and other features</a></li>
- <li><a href=#garbage-collection-0><span class=secno>10.2.8 </span>Garbage collection</a></li>
- <li><a href=#iana-considerations><span class=secno>10.2.9 </span>IANA considerations</a>
+ <li><a href=#server-sent-events-intro><span class=secno>11.2.1 </span>Introduction</a></li>
+ <li><a href=#the-eventsource-interface><span class=secno>11.2.2 </span>The <code>EventSource</code> interface</a></li>
+ <li><a href=#processing-model-5><span class=secno>11.2.3 </span>Processing model</a></li>
+ <li><a href=#parsing-an-event-stream><span class=secno>11.2.4 </span>Parsing an event stream</a></li>
+ <li><a href=#event-stream-interpretation><span class=secno>11.2.5 </span>Interpreting an event stream</a></li>
+ <li><a href=#notes><span class=secno>11.2.6 </span>Notes</a></li>
+ <li><a href=#eventsource-push><span class=secno>11.2.7 </span>Connectionless push and other features</a></li>
+ <li><a href=#garbage-collection-0><span class=secno>11.2.8 </span>Garbage collection</a></li>
+ <li><a href=#iana-considerations><span class=secno>11.2.9 </span>IANA considerations</a>
<ol>
- <li><a href=#text/event-stream><span class=secno>10.2.9.1 </span><code>text/event-stream</code></a></li>
- <li><a href=#last-event-id><span class=secno>10.2.9.2 </span><code>Last-Event-ID</code></a></ol></ol></li>
- <li><a href=#network><span class=secno>10.3 </span>Web sockets</a>
+ <li><a href=#text/event-stream><span class=secno>11.2.9.1 </span><code>text/event-stream</code></a></li>
+ <li><a href=#last-event-id><span class=secno>11.2.9.2 </span><code>Last-Event-ID</code></a></ol></ol></li>
+ <li><a href=#network><span class=secno>11.3 </span>Web sockets</a>
<ol>
- <li><a href=#network-intro><span class=secno>10.3.1 </span>Introduction</a></li>
- <li><a href=#the-websocket-interface><span class=secno>10.3.2 </span>The <code>WebSocket</code> interface</a></li>
- <li><a href=#feedback-from-the-protocol><span class=secno>10.3.3 </span>Feedback from the protocol</a>
+ <li><a href=#network-intro><span class=secno>11.3.1 </span>Introduction</a></li>
+ <li><a href=#the-websocket-interface><span class=secno>11.3.2 </span>The <code>WebSocket</code> interface</a></li>
+ <li><a href=#feedback-from-the-protocol><span class=secno>11.3.3 </span>Feedback from the protocol</a>
<ol>
- <li><a href=#event-definitions-1><span class=secno>10.3.3.1 </span>Event definitions</a></li>
- <li><a href=#garbage-collection-1><span class=secno>10.3.3.2 </span>Garbage collection</a></ol></ol></li>
- <li><a href=#web-messaging><span class=secno>10.4 </span>Cross-document messaging</a>
+ <li><a href=#event-definitions-2><span class=secno>11.3.3.1 </span>Event definitions</a></li>
+ <li><a href=#garbage-collection-1><span class=secno>11.3.3.2 </span>Garbage collection</a></ol></ol></li>
+ <li><a href=#web-messaging><span class=secno>11.4 </span>Cross-document messaging</a>
<ol>
- <li><a href=#introduction-9><span class=secno>10.4.1 </span>Introduction</a></li>
- <li><a href=#security-postmsg><span class=secno>10.4.2 </span>Security</a>
+ <li><a href=#introduction-10><span class=secno>11.4.1 </span>Introduction</a></li>
+ <li><a href=#security-postmsg><span class=secno>11.4.2 </span>Security</a>
<ol>
- <li><a href=#authors><span class=secno>10.4.2.1 </span>Authors</a></li>
- <li><a href=#user-agents><span class=secno>10.4.2.2 </span>User agents</a></ol></li>
- <li><a href=#posting-messages><span class=secno>10.4.3 </span>Posting messages</a></ol></li>
- <li><a href=#channel-messaging><span class=secno>10.5 </span>Channel messaging</a>
+ <li><a href=#authors><span class=secno>11.4.2.1 </span>Authors</a></li>
+ <li><a href=#user-agents><span class=secno>11.4.2.2 </span>User agents</a></ol></li>
+ <li><a href=#posting-messages><span class=secno>11.4.3 </span>Posting messages</a></ol></li>
+ <li><a href=#channel-messaging><span class=secno>11.5 </span>Channel messaging</a>
<ol>
- <li><a href=#introduction-10><span class=secno>10.5.1 </span>Introduction</a></li>
- <li><a href=#message-channels><span class=secno>10.5.2 </span>Message channels</a></li>
- <li><a href=#message-ports><span class=secno>10.5.3 </span>Message ports</a>
+ <li><a href=#introduction-11><span class=secno>11.5.1 </span>Introduction</a></li>
+ <li><a href=#message-channels><span class=secno>11.5.2 </span>Message channels</a></li>
+ <li><a href=#message-ports><span class=secno>11.5.3 </span>Message ports</a>
<ol>
- <li><a href=#ports-and-garbage-collection><span class=secno>10.5.3.1 </span>Ports and garbage collection</a></ol></ol></ol></li>
- <li><a href=#webstorage><span class=secno>11 </span>Web storage</a>
+ <li><a href=#ports-and-garbage-collection><span class=secno>11.5.3.1 </span>Ports and garbage collection</a></ol></ol></ol></li>
+ <li><a href=#webstorage><span class=secno>12 </span>Web storage</a>
<ol>
- <li><a href=#introduction-11><span class=secno>11.1 </span>Introduction</a></li>
- <li><a href=#storage><span class=secno>11.2 </span>The API</a>
+ <li><a href=#introduction-12><span class=secno>12.1 </span>Introduction</a></li>
+ <li><a href=#storage><span class=secno>12.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><a href=#the-storage-interface><span class=secno>12.2.1 </span>The <code>Storage</code> interface</a></li>
+ <li><a href=#the-sessionstorage-attribute><span class=secno>12.2.2 </span>The <code title=dom-sessionStorage>sessionStorage</code> attribute</a></li>
+ <li><a href=#the-localstorage-attribute><span class=secno>12.2.3 </span>The <code title=dom-localStorage>localStorage</code> attribute</a>
<ol>
- <li><a href=#security-localStorage><span class=secno>11.2.3.1 </span>Security</a></ol></li>
- <li><a href=#the-storage-event><span class=secno>11.2.4 </span>The <code title=event-storage>storage</code> event</a>
+ <li><a href=#security-localStorage><span class=secno>12.2.3.1 </span>Security</a></ol></li>
+ <li><a href=#the-storage-event><span class=secno>12.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>
+ <li><a href=#event-definition-0><span class=secno>12.2.4.1 </span>Event definition</a></ol></li>
+ <li><a href=#threads><span class=secno>12.2.5 </span>Threads</a></ol></li>
+ <li><a href=#disk-space-0><span class=secno>12.3 </span>Disk space</a></li>
+ <li><a href=#privacy><span class=secno>12.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>
+ <li><a href=#user-tracking><span class=secno>12.4.1 </span>User tracking</a></li>
+ <li><a href=#sensitivity-of-data><span class=secno>12.4.2 </span>Sensitivity of data</a></ol></li>
+ <li><a href=#security-storage><span class=secno>12.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>
+ <li><a href=#dns-spoofing-attacks><span class=secno>12.5.1 </span>DNS spoofing attacks</a></li>
+ <li><a href=#cross-directory-attacks><span class=secno>12.5.2 </span>Cross-directory attacks</a></li>
+ <li><a href=#implementation-risks><span class=secno>12.5.3 </span>Implementation risks</a></ol></ol></li>
+ <li><a href=#syntax><span class=secno>13 </span>The HTML syntax</a>
<ol>
- <li><a href=#writing><span class=secno>12.1 </span>Writing HTML documents</a>
+ <li><a href=#writing><span class=secno>13.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>
+ <li><a href=#the-doctype><span class=secno>13.1.1 </span>The DOCTYPE</a></li>
+ <li><a href=#elements-0><span class=secno>13.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 RCDATA elements</a></ol></li>
- <li><a href=#text-1><span class=secno>12.1.3 </span>Text</a>
+ <li><a href=#start-tags><span class=secno>13.1.2.1 </span>Start tags</a></li>
+ <li><a href=#end-tags><span class=secno>13.1.2.2 </span>End tags</a></li>
+ <li><a href=#attributes-0><span class=secno>13.1.2.3 </span>Attributes</a></li>
+ <li><a href=#optional-tags><span class=secno>13.1.2.4 </span>Optional tags</a></li>
+ <li><a href=#element-restrictions><span class=secno>13.1.2.5 </span>Restrictions on content models</a></li>
+ <li><a href=#cdata-rcdata-restrictions><span class=secno>13.1.2.6 </span>Restrictions on the contents of raw text and RCDATA elements</a></ol></li>
+ <li><a href=#text-1><span class=secno>13.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>
+ <li><a href=#newlines><span class=secno>13.1.3.1 </span>Newlines</a></ol></li>
+ <li><a href=#character-references><span class=secno>13.1.4 </span>Character references</a></li>
+ <li><a href=#cdata-sections><span class=secno>13.1.5 </span>CDATA sections</a></li>
+ <li><a href=#comments><span class=secno>13.1.6 </span>Comments</a></ol></li>
+ <li><a href=#parsing><span class=secno>13.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-stream><span class=secno>12.2.2 </span>The input stream</a>
+ <li><a href=#overview-of-the-parsing-model><span class=secno>13.2.1 </span>Overview of the parsing model</a></li>
+ <li><a href=#the-input-stream><span class=secno>13.2.2 </span>The input stream</a>
<ol>
- <li><a href=#determining-the-character-encoding><span class=secno>12.2.2.1 </span>Determining the character encoding</a></li>
- <li><a href=#character-encodings-0><span class=secno>12.2.2.2 </span>Character encodings</a></li>
- <li><a href=#preprocessing-the-input-stream><span class=secno>12.2.2.3 </span>Preprocessing the input stream</a></li>
- <li><a href=#changing-the-encoding-while-parsing><span class=secno>12.2.2.4 </span>Changing the encoding while parsing</a></ol></li>
- <li><a href=#parse-state><span class=secno>12.2.3 </span>Parse state</a>
+ <li><a href=#determining-the-character-encoding><span class=secno>13.2.2.1 </span>Determining the character encoding</a></li>
+ <li><a href=#character-encodings-0><span class=secno>13.2.2.2 </span>Character encodings</a></li>
+ <li><a href=#preprocessing-the-input-stream><span class=secno>13.2.2.3 </span>Preprocessing the input stream</a></li>
+ <li><a href=#changing-the-encoding-while-parsing><span class=secno>13.2.2.4 </span>Changing the encoding while parsing</a></ol></li>
+ <li><a href=#parse-state><span class=secno>13.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>
+ <li><a href=#the-insertion-mode><span class=secno>13.2.3.1 </span>The insertion mode</a></li>
+ <li><a href=#the-stack-of-open-elements><span class=secno>13.2.3.2 </span>The stack of open elements</a></li>
+ <li><a href=#the-list-of-active-formatting-elements><span class=secno>13.2.3.3 </span>The list of active formatting elements</a></li>
+ <li><a href=#the-element-pointers><span class=secno>13.2.3.4 </span>The element pointers</a></li>
+ <li><a href=#other-parsing-state-flags><span class=secno>13.2.3.5 </span>Other parsing state flags</a></ol></li>
+ <li><a href=#tokenization><span class=secno>13.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>
+ <li><a href=#data-state><span class=secno>13.2.4.1 </span>Data state</a></li>
+ <li><a href=#character-reference-in-data-state><span class=secno>13.2.4.2 </span>Character reference in data state</a></li>
+ <li><a href=#rcdata-state><span class=secno>13.2.4.3 </span>RCDATA state</a></li>
+ <li><a href=#character-reference-in-rcdata-state><span class=secno>13.2.4.4 </span>Character reference in RCDATA state</a></li>
+ <li><a href=#rawtext-state><span class=secno>13.2.4.5 </span>RAWTEXT state</a></li>
+ <li><a href=#script-data-state><span class=secno>13.2.4.6 </span>Script data state</a></li>
+ <li><a href=#plaintext-state><span class=secno>13.2.4.7 </span>PLAINTEXT state</a></li>
+ <li><a href=#tag-open-state><span class=secno>13.2.4.8 </span>Tag open state</a></li>
+ <li><a href=#end-tag-open-state><span class=secno>13.2.4.9 </span>End tag open state</a></li>
+ <li><a href=#tag-name-state><span class=secno>13.2.4.10 </span>Tag name state</a></li>
+ <li><a href=#rcdata-less-than-sign-state><span class=secno>13.2.4.11 </span>RCDATA less-than sign state</a></li>
+ <li><a href=#rcdata-end-tag-open-state><span class=secno>13.2.4.12 </span>RCDATA end tag open state</a></li>
+ <li><a href=#rcdata-end-tag-name-state><span class=secno>13.2.4.13 </span>RCDATA end tag name state</a></li>
+ <li><a href=#rawtext-less-than-sign-state><span class=secno>13.2.4.14 </span>RAWTEXT less-than sign state</a></li>
+ <li><a href=#rawtext-end-tag-open-state><span class=secno>13.2.4.15 </span>RAWTEXT end tag open state</a></li>
+ <li><a href=#rawtext-end-tag-name-state><span class=secno>13.2.4.16 </span>RAWTEXT end tag name state</a></li>
+ <li><a href=#script-data-less-than-sign-state><span class=secno>13.2.4.17 </span>Script data less-than sign state</a></li>
+ <li><a href=#script-data-end-tag-open-state><span class=secno>13.2.4.18 </span>Script data end tag open state</a></li>
+ <li><a href=#script-data-end-tag-name-state><span class=secno>13.2.4.19 </span>Script data end tag name state</a></li>
+ <li><a href=#script-data-escape-start-state><span class=secno>13.2.4.20 </span>Script data escape start state</a></li>
+ <li><a href=#script-data-escape-start-dash-state><span class=secno>13.2.4.21 </span>Script data escape start dash state</a></li>
+ <li><a href=#script-data-escaped-state><span class=secno>13.2.4.22 </span>Script data escaped state</a></li>
+ <li><a href=#script-data-escaped-dash-state><span class=secno>13.2.4.23 </span>Script data escaped dash state</a></li>
+ <li><a href=#script-data-escaped-dash-dash-state><span class=secno>13.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>13.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>13.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>13.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>13.2.4.28 </span>Script data double escape start state</a></li>
+ <li><a href=#script-data-double-escaped-state><span class=secno>13.2.4.29 </span>Script data double escaped state</a></li>
+ <li><a href=#script-data-double-escaped-dash-state><span class=secno>13.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>13.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>13.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>13.2.4.33 </span>Script data double escape end state</a></li>
+ <li><a href=#before-attribute-name-state><span class=secno>13.2.4.34 </span>Before attribute name state</a></li>
+ <li><a href=#attribute-name-state><span class=secno>13.2.4.35 </span>Attribute name state</a></li>
+ <li><a href=#after-attribute-name-state><span class=secno>13.2.4.36 </span>After attribute name state</a></li>
+ <li><a href=#before-attribute-value-state><span class=secno>13.2.4.37 </span>Before attribute value state</a></li>
+ <li><a href=#attribute-value-(double-quoted)-state><span class=secno>13.2.4.38 </span>Attribute value (double-quoted) state</a></li>
+ <li><a href=#attribute-value-(single-quoted)-state><span class=secno>13.2.4.39 </span>Attribute value (single-quoted) state</a></li>
+ <li><a href=#attribute-value-(unquoted)-state><span class=secno>13.2.4.40 </span>Attribute value (unquoted) state</a></li>
+ <li><a href=#character-reference-in-attribute-value-state><span class=secno>13.2.4.41 </span>Character reference in attribute value state</a></li>
+ <li><a href=#after-attribute-value-(quoted)-state><span class=secno>13.2.4.42 </span>After attribute value (quoted) state</a></li>
+ <li><a href=#self-closing-start-tag-state><span class=secno>13.2.4.43 </span>Self-closing start tag state</a></li>
+ <li><a href=#bogus-comment-state><span class=secno>13.2.4.44 </span>Bogus comment state</a></li>
+ <li><a href=#markup-declaration-open-state><span class=secno>13.2.4.45 </span>Markup declaration open state</a></li>
+ <li><a href=#comment-start-state><span class=secno>13.2.4.46 </span>Comment start state</a></li>
+ <li><a href=#comment-start-dash-state><span class=secno>13.2.4.47 </span>Comment start dash state</a></li>
+ <li><a href=#comment-state><span class=secno>13.2.4.48 </span>Comment state</a></li>
+ <li><a href=#comment-end-dash-state><span class=secno>13.2.4.49 </span>Comment end dash state</a></li>
+ <li><a href=#comment-end-state><span class=secno>13.2.4.50 </span>Comment end state</a></li>
+ <li><a href=#comment-end-bang-state><span class=secno>13.2.4.51 </span>Comment end bang state</a></li>
+ <li><a href=#doctype-state><span class=secno>13.2.4.52 </span>DOCTYPE state</a></li>
+ <li><a href=#before-doctype-name-state><span class=secno>13.2.4.53 </span>Before DOCTYPE name state</a></li>
+ <li><a href=#doctype-name-state><span class=secno>13.2.4.54 </span>DOCTYPE name state</a></li>
+ <li><a href=#after-doctype-name-state><span class=secno>13.2.4.55 </span>After DOCTYPE name state</a></li>
+ <li><a href=#after-doctype-public-keyword-state><span class=secno>13.2.4.56 </span>After DOCTYPE public keyword state</a></li>
+ <li><a href=#before-doctype-public-identifier-state><span class=secno>13.2.4.57 </span>Before DOCTYPE public identifier state</a></li>
+ <li><a href=#doctype-public-identifier-(double-quoted)-state><span class=secno>13.2.4.58 </span>DOCTYPE public identifier (double-quoted) state</a></li>
+ <li><a href=#doctype-public-identifier-(single-quoted)-state><span class=secno>13.2.4.59 </span>DOCTYPE public identifier (single-quoted) state</a></li>
+ <li><a href=#after-doctype-public-identifier-state><span class=secno>13.2.4.60 </span>After DOCTYPE public identifier state</a></li>
+ <li><a href=#between-doctype-public-and-system-identifiers-state><span class=secno>13.2.4.61 </span>Between DOCTYPE public and system identifiers state</a></li>
+ <li><a href=#after-doctype-system-keyword-state><span class=secno>13.2.4.62 </span>After DOCTYPE system keyword state</a></li>
+ <li><a href=#before-doctype-system-identifier-state><span class=secno>13.2.4.63 </span>Before DOCTYPE system identifier state</a></li>
+ <li><a href=#doctype-system-identifier-(double-quoted)-state><span class=secno>13.2.4.64 </span>DOCTYPE system identifier (double-quoted) state</a></li>
+ <li><a href=#doctype-system-identifier-(single-quoted)-state><span class=secno>13.2.4.65 </span>DOCTYPE system identifier (single-quoted) state</a></li>
+ <li><a href=#after-doctype-system-identifier-state><span class=secno>13.2.4.66 </span>After DOCTYPE system identifier state</a></li>
+ <li><a href=#bogus-doctype-state><span class=secno>13.2.4.67 </span>Bogus DOCTYPE state</a></li>
+ <li><a href=#cdata-section-state><span class=secno>13.2.4.68 </span>CDATA section state</a></li>
+ <li><a href=#tokenizing-character-references><span class=secno>13.2.4.69 </span>Tokenizing character references</a></ol></li>
+ <li><a href=#tree-construction><span class=secno>13.2.5 </span>Tree construction</a>
<ol>
- <li><a href=#creating-and-inserting-elements><span class=secno>12.2.5.1 </span>Creating and inserting elements</a></li>
- <li><a href=#closing-elements-that-have-implied-end-tags><span class=secno>12.2.5.2 </span>Closing elements that have implied end tags</a></li>
- <li><a href=#foster-parenting><span class=secno>12.2.5.3 </span>Foster parenting</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>
+ <li><a href=#creating-and-inserting-elements><span class=secno>13.2.5.1 </span>Creating and inserting elements</a></li>
+ <li><a href=#closing-elements-that-have-implied-end-tags><span class=secno>13.2.5.2 </span>Closing elements that have implied end tags</a></li>
+ <li><a href=#foster-parenting><span class=secno>13.2.5.3 </span>Foster parenting</a></li>
+ <li><a href=#parsing-main-inhtml><span class=secno>13.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-afterbody><span class=secno>12.2.5.4.18 </span>The "after body" insertion mode</a></li>
- <li><a href=#parsing-main-inframeset><span class=secno>12.2.5.4.19 </span>The "in frameset" insertion mode</a></li>
- <li><a href=#parsing-main-afterframeset><span class=secno>12.2.5.4.20 </span>The "after frameset" insertion mode</a></li>
- <li><a href=#the-after-after-body-insertion-mode><span class=secno>12.2.5.4.21 </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.22 </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>
+ <li><a href=#the-initial-insertion-mode><span class=secno>13.2.5.4.1 </span>The "initial" insertion mode</a></li>
+ <li><a href=#the-before-html-insertion-mode><span class=secno>13.2.5.4.2 </span>The "before html" insertion mode</a></li>
+ <li><a href=#the-before-head-insertion-mode><span class=secno>13.2.5.4.3 </span>The "before head" insertion mode</a></li>
+ <li><a href=#parsing-main-inhead><span class=secno>13.2.5.4.4 </span>The "in head" insertion mode</a></li>
+ <li><a href=#parsing-main-inheadnoscript><span class=secno>13.2.5.4.5 </span>The "in head noscript" insertion mode</a></li>
+ <li><a href=#the-after-head-insertion-mode><span class=secno>13.2.5.4.6 </span>The "after head" insertion mode</a></li>
+ <li><a href=#parsing-main-inbody><span class=secno>13.2.5.4.7 </span>The "in body" insertion mode</a></li>
+ <li><a href=#parsing-main-incdata><span class=secno>13.2.5.4.8 </span>The "text" insertion mode</a></li>
+ <li><a href=#parsing-main-intable><span class=secno>13.2.5.4.9 </span>The "in table" insertion mode</a></li>
+ <li><a href=#parsing-main-intabletext><span class=secno>13.2.5.4.10 </span>The "in table text" insertion mode</a></li>
+ <li><a href=#parsing-main-incaption><span class=secno>13.2.5.4.11 </span>The "in caption" insertion mode</a></li>
+ <li><a href=#parsing-main-incolgroup><span class=secno>13.2.5.4.12 </span>The "in column group" insertion mode</a></li>
+ <li><a href=#parsing-main-intbody><span class=secno>13.2.5.4.13 </span>The "in table body" insertion mode</a></li>
+ <li><a href=#parsing-main-intr><span class=secno>13.2.5.4.14 </span>The "in row" insertion mode</a></li>
+ <li><a href=#parsing-main-intd><span class=secno>13.2.5.4.15 </span>The "in cell" insertion mode</a></li>
+ <li><a href=#parsing-main-inselect><span class=secno>13.2.5.4.16 </span>The "in select" insertion mode</a></li>
+ <li><a href=#parsing-main-inselectintable><span class=secno>13.2.5.4.17 </span>The "in select in table" insertion mode</a></li>
+ <li><a href=#parsing-main-afterbody><span class=secno>13.2.5.4.18 </span>The "after body" insertion mode</a></li>
+ <li><a href=#parsing-main-inframeset><span class=secno>13.2.5.4.19 </span>The "in frameset" insertion mode</a></li>
+ <li><a href=#parsing-main-afterframeset><span class=secno>13.2.5.4.20 </span>The "after frameset" insertion mode</a></li>
+ <li><a href=#the-after-after-body-insertion-mode><span class=secno>13.2.5.4.21 </span>The "after after body" insertion mode</a></li>
+ <li><a href=#the-after-after-frameset-insertion-mode><span class=secno>13.2.5.4.22 </span>The "after after frameset" insertion mode</a></ol></li>
+ <li><a href=#parsing-main-inforeign><span class=secno>13.2.5.5 </span>The rules for parsing tokens in foreign content</a></ol></li>
+ <li><a href=#the-end><span class=secno>13.2.6 </span>The end</a></li>
+ <li><a href=#coercing-an-html-dom-into-an-infoset><span class=secno>13.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>13.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: <b><i></b></i></a></li>
- <li><a href=#misnested-tags:-b-p-/b-/p><span class=secno>12.2.8.2 </span>Misnested tags: <b><p></b></p></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>
+ <li><a href=#misnested-tags:-b-i-/b-/i><span class=secno>13.2.8.1 </span>Misnested tags: <b><i></b></i></a></li>
+ <li><a href=#misnested-tags:-b-p-/b-/p><span class=secno>13.2.8.2 </span>Misnested tags: <b><p></b></p></a></li>
+ <li><a href=#unexpected-markup-in-tables><span class=secno>13.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>13.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>13.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>13.2.8.6 </span>Unclosed formatting elements</a></ol></ol></li>
+ <li><a href=#serializing-html-fragments><span class=secno>13.3 </span>Serializing HTML fragments</a></li>
+ <li><a href=#parsing-html-fragments><span class=secno>13.4 </span>Parsing HTML fragments</a></li>
+ <li><a href=#named-character-references><span class=secno>13.5 </span>Named character references</a></ol></li>
+ <li><a href=#the-xhtml-syntax><span class=secno>14 </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>
+ <li><a href=#writing-xhtml-documents><span class=secno>14.1 </span>Writing XHTML documents</a></li>
+ <li><a href=#parsing-xhtml-documents><span class=secno>14.2 </span>Parsing XHTML documents</a></li>
+ <li><a href=#serializing-xhtml-fragments><span class=secno>14.3 </span>Serializing XHTML fragments</a></li>
+ <li><a href=#parsing-xhtml-fragments><span class=secno>14.4 </span>Parsing XHTML fragments</a></ol></li>
+ <li><a href=#rendering><span class=secno>15 </span>Rendering</a>
<ol>
- <li><a href=#introduction-12><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><a href=#introduction-13><span class=secno>15.1 </span>Introduction</a></li>
+ <li><a href=#the-css-user-agent-style-sheet-and-presentational-hints><span class=secno>15.2 </span>The CSS user agent style sheet and presentational hints</a>
<ol>
- <li><a href=#introduction-13><span class=secno>14.2.1 </span>Introduction</a></li>
- <li><a href=#display-types><span class=secno>14.2.2 </span>Display types</a></li>
- <li><a href=#margins-and-padding><span class=secno>14.2.3 </span>Margins and padding</a></li>
- <li><a href=#alignment><span class=secno>14.2.4 </span>Alignment</a></li>
- <li><a href=#fonts-and-colors><span class=secno>14.2.5 </span>Fonts and colors</a></li>
- <li><a href=#punctuation-and-decorations><span class=secno>14.2.6 </span>Punctuation and decorations</a></li>
- <li><a href=#resetting-rules-for-inherited-properties><span class=secno>14.2.7 </span>Resetting rules for inherited properties</a></li>
- <li><a href=#the-hr-element-0><span class=secno>14.2.8 </span>The <code>hr</code> element</a></li>
- <li><a href=#the-fieldset-element-0><span class=secno>14.2.9 </span>The <code>fieldset</code> element</a></ol></li>
- <li><a href=#replaced-elements><span class=secno>14.3 </span>Replaced elements</a>
+ <li><a href=#introduction-14><span class=secno>15.2.1 </span>Introduction</a></li>
+ <li><a href=#display-types><span class=secno>15.2.2 </span>Display types</a></li>
+ <li><a href=#margins-and-padding><span class=secno>15.2.3 </span>Margins and padding</a></li>
+ <li><a href=#alignment><span class=secno>15.2.4 </span>Alignment</a></li>
+ <li><a href=#fonts-and-colors><span class=secno>15.2.5 </span>Fonts and colors</a></li>
+ <li><a href=#punctuation-and-decorations><span class=secno>15.2.6 </span>Punctuation and decorations</a></li>
+ <li><a href=#resetting-rules-for-inherited-properties><span class=secno>15.2.7 </span>Resetting rules for inherited properties</a></li>
+ <li><a href=#the-hr-element-0><span class=secno>15.2.8 </span>The <code>hr</code> element</a></li>
+ <li><a href=#the-fieldset-element-0><span class=secno>15.2.9 </span>The <code>fieldset</code> element</a></ol></li>
+ <li><a href=#replaced-elements><span class=secno>15.3 </span>Replaced elements</a>
<ol>
- <li><a href=#embedded-content-2><span class=secno>14.3.1 </span>Embedded content</a></li>
- <li><a href=#timed-text-tracks-0><span class=secno>14.3.2 </span>Timed text tracks</a>
+ <li><a href=#embedded-content-2><span class=secno>15.3.1 </span>Embedded content</a></li>
+ <li><a href=#timed-text-tracks-0><span class=secno>15.3.2 </span>Timed text tracks</a>
<ol>
- <li><a href=#webvtt-cue-text-rendering-rules><span class=secno>14.3.2.1 </span>WebVTT cue text rendering rules</a></li>
- <li><a href=#applying-css-properties-to-webvtt-node-objects><span class=secno>14.3.2.2 </span>Applying CSS properties to WebVTT Node Objects</a></li>
- <li><a href=#css-extensions><span class=secno>14.3.2.3 </span>CSS extensions</a>
+ <li><a href=#webvtt-cue-text-rendering-rules><span class=secno>15.3.2.1 </span>WebVTT cue text rendering rules</a></li>
+ <li><a href=#applying-css-properties-to-webvtt-node-objects><span class=secno>15.3.2.2 </span>Applying CSS properties to WebVTT Node Objects</a></li>
+ <li><a href=#css-extensions><span class=secno>15.3.2.3 </span>CSS extensions</a>
<ol>
- <li><a href="#the-'::cue'-pseudo-element"><span class=secno>14.3.2.3.1 </span>The '::cue' pseudo-element</a></li>
- <li><a href="#the-':past'-and-':future'-pseudo-classes"><span class=secno>14.3.2.3.2 </span>The ':past' and ':future' pseudo-classes</a></ol></ol></li>
- <li><a href=#images-0><span class=secno>14.3.3 </span>Images</a></li>
- <li><a href=#attributes-for-embedded-content-and-images><span class=secno>14.3.4 </span>Attributes for embedded content and images</a></li>
- <li><a href=#image-maps-0><span class=secno>14.3.5 </span>Image maps</a></li>
- <li><a href=#toolbars-0><span class=secno>14.3.6 </span>Toolbars</a></ol></li>
- <li><a href=#bindings><span class=secno>14.4 </span>Bindings</a>
+ <li><a href="#the-'::cue'-pseudo-element"><span class=secno>15.3.2.3.1 </span>The '::cue' pseudo-element</a></li>
+ <li><a href="#the-':past'-and-':future'-pseudo-classes"><span class=secno>15.3.2.3.2 </span>The ':past' and ':future' pseudo-classes</a></ol></ol></li>
+ <li><a href=#images-0><span class=secno>15.3.3 </span>Images</a></li>
+ <li><a href=#attributes-for-embedded-content-and-images><span class=secno>15.3.4 </span>Attributes for embedded content and images</a></li>
+ <li><a href=#image-maps-0><span class=secno>15.3.5 </span>Image maps</a></li>
+ <li><a href=#toolbars-0><span class=secno>15.3.6 </span>Toolbars</a></ol></li>
+ <li><a href=#bindings><span class=secno>15.4 </span>Bindings</a>
<ol>
- <li><a href=#introduction-14><span class=secno>14.4.1 </span>Introduction</a></li>
- <li><a href=#the-button-element-0><span class=secno>14.4.2 </span>The <code>button</code> element</a></li>
- <li><a href=#the-details-element-0><span class=secno>14.4.3 </span>The <code>details</code> element</a></li>
- <li><a href=#the-input-element-as-a-text-entry-widget><span class=secno>14.4.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.4.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.4.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.4.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.4.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.4.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.4.10 </span>The <code>input</code> element as a button</a></li>
- <li><a href=#the-marquee-element-0><span class=secno>14.4.11 </span>The <code>marquee</code> element</a></li>
- <li><a href=#the-meter-element-0><span class=secno>14.4.12 </span>The <code>meter</code> element</a></li>
- <li><a href=#the-progress-element-0><span class=secno>14.4.13 </span>The <code>progress</code> element</a></li>
- <li><a href=#the-select-element-0><span class=secno>14.4.14 </span>The <code>select</code> element</a></li>
- <li><a href=#the-textarea-element-0><span class=secno>14.4.15 </span>The <code>textarea</code> element</a></li>
- <li><a href=#the-keygen-element-0><span class=secno>14.4.16 </span>The <code>keygen</code> element</a></li>
- <li><a href=#the-time-element-0><span class=secno>14.4.17 </span>The <code>time</code> element</a></ol></li>
- <li><a href=#frames-and-framesets><span class=secno>14.5 </span>Frames and framesets</a></li>
- <li><a href=#interactive-media><span class=secno>14.6 </span>Interactive media</a>
+ <li><a href=#introduction-15><span class=secno>15.4.1 </span>Introduction</a></li>
+ <li><a href=#the-button-element-0><span class=secno>15.4.2 </span>The <code>button</code> element</a></li>
+ <li><a href=#the-details-element-0><span class=secno>15.4.3 </span>The <code>details</code> element</a></li>
+ <li><a href=#the-input-element-as-a-text-entry-widget><span class=secno>15.4.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>15.4.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>15.4.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>15.4.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>15.4.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>15.4.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>15.4.10 </span>The <code>input</code> element as a button</a></li>
+ <li><a href=#the-marquee-element-0><span class=secno>15.4.11 </span>The <code>marquee</code> element</a></li>
+ <li><a href=#the-meter-element-0><span class=secno>15.4.12 </span>The <code>meter</code> element</a></li>
+ <li><a href=#the-progress-element-0><span class=secno>15.4.13 </span>The <code>progress</code> element</a></li>
+ <li><a href=#the-select-element-0><span class=secno>15.4.14 </span>The <code>select</code> element</a></li>
+ <li><a href=#the-textarea-element-0><span class=secno>15.4.15 </span>The <code>textarea</code> element</a></li>
+ <li><a href=#the-keygen-element-0><span class=secno>15.4.16 </span>The <code>keygen</code> element</a></li>
+ <li><a href=#the-time-element-0><span class=secno>15.4.17 </span>The <code>time</code> element</a></ol></li>
+ <li><a href=#frames-and-framesets><span class=secno>15.5 </span>Frames and framesets</a></li>
+ <li><a href=#interactive-media><span class=secno>15.6 </span>Interactive media</a>
<ol>
- <li><a href=#links,-forms,-and-navigation><span class=secno>14.6.1 </span>Links, forms, and navigation</a></li>
- <li><a href=#the-title-attribute-0><span class=secno>14.6.2 </span>The <code title=attr-title>title</code> attribute</a></li>
- <li><a href=#editing-hosts><span class=secno>14.6.3 </span>Editing hosts</a></li>
- <li><a href=#text-rendered-in-native-user-interfaces><span class=secno>14.6.4 </span>Text rendered in native user interfaces</a></ol></li>
- <li><a href=#print-media><span class=secno>14.7 </span>Print media</a></ol></li>
- <li><a href=#obsolete><span class=secno>15 </span>Obsolete features</a>
+ <li><a href=#links,-forms,-and-navigation><span class=secno>15.6.1 </span>Links, forms, and navigation</a></li>
+ <li><a href=#the-title-attribute-0><span class=secno>15.6.2 </span>The <code title=attr-title>title</code> attribute</a></li>
+ <li><a href=#editing-hosts><span class=secno>15.6.3 </span>Editing hosts</a></li>
+ <li><a href=#text-rendered-in-native-user-interfaces><span class=secno>15.6.4 </span>Text rendered in native user interfaces</a></ol></li>
+ <li><a href=#print-media><span class=secno>15.7 </span>Print media</a></ol></li>
+ <li><a href=#obsolete><span class=secno>16 </span>Obsolete features</a>
<ol>
- <li><a href=#obsolete-but-conforming-features><span class=secno>15.1 </span>Obsolete but conforming features</a>
+ <li><a href=#obsolete-but-conforming-features><span class=secno>16.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>
+ <li><a href=#warnings-for-obsolete-but-conforming-features><span class=secno>16.1.1 </span>Warnings for obsolete but conforming features</a></ol></li>
+ <li><a href=#non-conforming-features><span class=secno>16.2 </span>Non-conforming features</a></li>
+ <li><a href=#requirements-for-implementations><span class=secno>16.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>
+ <li><a href=#the-applet-element><span class=secno>16.3.1 </span>The <code>applet</code> element</a></li>
+ <li><a href=#the-marquee-element><span class=secno>16.3.2 </span>The <code>marquee</code> element</a></li>
+ <li><a href=#frames><span class=secno>16.3.3 </span>Frames</a></li>
+ <li><a href=#other-elements,-attributes-and-apis><span class=secno>16.3.4 </span>Other elements, attributes and APIs</a></ol></ol></li>
+ <li><a href=#iana><span class=secno>17 </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=#text/html-sandboxed><span class=secno>16.2 </span><code>text/html-sandboxed</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=#text/cache-manifest><span class=secno>16.4 </span><code>text/cache-manifest</code></a></li>
- <li><a href=#text/ping><span class=secno>16.5 </span><code>text/ping</code></a></li>
- <li><a href=#text/vtt><span class=secno>16.6 </span><code>text/vtt</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></ol></li>
+ <li><a href=#text/html><span class=secno>17.1 </span><code>text/html</code></a></li>
+ <li><a href=#text/html-sandboxed><span class=secno>17.2 </span><code>text/html-sandboxed</code></a></li>
+ <li><a href=#application/xhtml+xml><span class=secno>17.3 </span><code>application/xhtml+xml</code></a></li>
+ <li><a href=#text/cache-manifest><span class=secno>17.4 </span><code>text/cache-manifest</code></a></li>
+ <li><a href=#text/ping><span class=secno>17.5 </span><code>text/ping</code></a></li>
+ <li><a href=#text/vtt><span class=secno>17.6 </span><code>text/vtt</code></a></li>
+ <li><a href=#application/microdata+json><span class=secno>17.7 </span><code>application/microdata+json</code></a></li>
+ <li><a href=#ping-from><span class=secno>17.8 </span><code>Ping-From</code></a></li>
+ <li><a href=#ping-to><span class=secno>17.9 </span><code>Ping-To</code></a></ol></li>
<li><a class=no-num href=#index>Index</a>
<ol>
<li><a class=no-num href=#elements-1>Elements</a></li>
@@ -24808,7 +24814,7 @@
zero or more <code><a href=#the-track-element>track</a></code> elements, then
<!--KEEP-START w3c-html--><!--TT-->
<a href=#transparent>transparent</a>, but with no <a href=#media-element>media element</a> descendants.</dd>
- <dd>If the element does not have a <code title=attr-media-src><a href=#attr-media-src>src</a></code> attribute: one or more <code><a href=#the-source-element>source</a></code> elements, then
+ <dd>If the element does not have a <code title=attr-media-src><a href=#attr-media-src>src</a></code> attribute: zero or more <code><a href=#the-source-element>source</a></code> elements, then
<!--KEEP-END w3c-html--><!--TT-->
zero or more <code><a href=#the-track-element>track</a></code> elements, then
<!--KEEP-START w3c-html--><!--TT-->
@@ -27335,8 +27341,8 @@
<a href=#queue-a-task>queue a task</a> to <a href=#fire-a-simple-event>fire a simple event</a>
named <code title=event-media-playing><a href=#event-media-playing>playing</a></code>.</p>
- <p class=note>User agents are not required to autoplay, and it
- is suggested that user agents honor user preferences on the
+ <p class=note>User agents do not need to support autoplay,
+ and it is suggested that user agents honor user preferences on the
matter. Authors are urged to use the <code title=attr-media-autoplay><a href=#attr-media-autoplay>autoplay</a></code> attribute rather than
using script to force the video to play, so as to allow the user
to override the behavior if so desired.</p>
@@ -50731,236 +50737,8 @@
</ol></div>
-<!--DEVICE-->
-<div data-component="other Hixie drafts (editor: Ian Hickson)">
- <h4 id=devices><span class=secno>4.11.6 </span>The <dfn><code>device</code></dfn> element</h4>
-
- <dl class=element><dt>Categories</dt>
- <dd><a href=#flow-content>Flow content</a>.</dd>
- <dd><a href=#phrasing-content>Phrasing content</a>.</dd>
- <dd><a href=#interactive-content>Interactive content</a>.</dd>
- <dt>Contexts in which this element can be used:</dt>
- <dd>Where <a href=#phrasing-content>phrasing content</a> is expected.</dd>
- <dt>Content model:</dt>
- <dd>Empty.</dd>
- <dt>Content attributes:</dt>
- <dd><a href=#global-attributes>Global attributes</a></dd>
- <dd><code title=attr-device-type><a href=#attr-device-type>type</a></code></dd>
- <dt>DOM interface:</dt>
- <dd>
-<pre class=idl>interface <dfn id=htmldeviceelement>HTMLDeviceElement</dfn> : <a href=#htmlelement>HTMLElement</a> {
- attribute DOMString <span title=dom-device-type>type</span>;
- readonly attribute any <span title=dom-device-data>data</span>;
-};</pre>
- </dl><p>The <code><a href=#devices>device</a></code> element represents a device selector, to
- allow the user to give the page access to a device, for example a
- video camera.</p>
-
- <p>The <dfn id=attr-device-type title=attr-device-type><code>type</code></dfn>
- attribute allows the author to specify which kind of device the page
- would like access to. The attribute is an <a href=#enumerated-attribute>enumerated
- attribute</a> with the keywords given in the first column of the
- following table, and their corresponding states given in the cell in
- second column of the same row.</p>
-
- <p class=XXX>RS232 and USB are only included below to give an idea
- of where we could go with this. <strong>Should we instead just make
- this only useful for audiovisual streams?</strong> Unless there are
- compelling reasons, we probably should not be this generic. So far,
- the reasons for RS232 aren't that compelling. For USB, slightly more
- so.</p>
-
- <table><thead><tr><th>Keyword
- <th>State
- <th>Device description
- <th>Examples
- <tbody><tr><td><dfn id=attr-device-type-keyword-media title=attr-device-type-keyword-media><code>media</code></dfn>
- <td><span title=attr-device-type-media>Media</span>
- <td>Stream of audio and/or video data.
- <td>A webcam.
- <tr><td><dfn id=attr-device-type-keyword-fs title=attr-device-type-keyword-fs><code>fs</code></dfn>
- <td><span title=attr-device-type-fs>File system</span>
- <td>File system.
- <td>A USB-connected media player.
- <tr><td><dfn id=attr-device-type-keyword-rs232 title=attr-device-type-keyword-rs232><code>rs232</code></dfn>
- <td><span title=attr-device-type-rs232>RS232</span>
- <td>RS232 device.
- <td>A serial port.
- <tr><td><dfn id=attr-device-type-keyword-usb title=attr-device-type-keyword-usb><code>usb</code></dfn>
- <td><span title=attr-device-type-usb>USB</span>
- <td>USB device.
- <td>A scanner, a music player, a disk jockey, a fish tank.
- </table><p class=XXX>processing model: 'change' event fires once user
- selects a new device; .data is set to new Stream, LocalFS, USB, or
- RS232 object as appropriate.</p>
-
- <div class=example>
-
- <pre><p>To start chatting, select a video camera: <device type=media onchange="update(this.data)"></p>
-<video autoplay></video>
-<script>
- function update(stream) {
- document.getElementsByTagName('video')[0].src = stream.url;
- }
-</script></pre>
-
- </div>
-
- <p class=XXX>The <code><a href=#devices>device</a></code> element is intended to be a
- void element, but the parser spec hasn't yet been updated. This
- section of the spec is very much awaiting implementation
- experience.</p>
-
-
- <h5 id=stream-api><span class=secno>4.11.6.1 </span>Stream API</h5>
-
- <p>The <code><a href=#stream>Stream</a></code> interface is used to represent
- streams.</p>
-
- <pre class=idl>interface <dfn id=stream>Stream</dfn> {
- readonly attribute DOMString <a href=#dom-stream-url title=dom-stream-url>url</a>;
- <a href=#streamrecorder>StreamRecorder</a> <a href=#dom-stream-record title=dom-stream-record>record</a>();
-};</pre>
-
- <p>The <dfn id=dom-stream-url title=dom-stream-url><code>url</code></dfn> attribute
- must return a <span title=fileURN>File URN</span> representing the
- stream. <a href=#refsFILEAPI>[FILEAPI]</a></p>
-
- <p>For audio and video streams, the stream must be in a format
- supported by the user agent for use in <code><a href=#audio>audio</a></code> and
- <code><a href=#video>video</a></code> elements.</p>
-
- <p class=XXX>This will be pinned down to a specific codec.</p>
-
- <p>When the <dfn id=dom-stream-record title=dom-stream-record><code>record()</code></dfn> method is
- invoked, the user agent must return a new
- <code><a href=#streamrecorder>StreamRecorder</a></code> object associated with the stream.</p>
-
- <pre class=idl>interface <dfn id=streamrecorder>StreamRecorder</dfn> {
- <span>File</span> <a href=#dom-streamrecorder-stop title=dom-StreamRecorder-stop>stop</a>();
-};</pre>
-
- <p>The <dfn id=dom-streamrecorder-stop title=dom-StreamRecorder-stop><code>stop()</code></dfn> method
- must return a new <code>File</code> object representing the data
- that was streamed between the creation of the
- <code><a href=#streamrecorder>StreamRecorder</a></code> object and the invocation of the <code title=dom-StreamRecorder-stop><a href=#dom-streamrecorder-stop>stop()</a></code> method. <a href=#refsFILEAPI>[FILEAPI]</a></p>
-
- <p>For audio and video streams, the file must be in a format
- supported by the user agent for use in <code><a href=#audio>audio</a></code> and
- <code><a href=#video>video</a></code> elements.</p>
-
- <p class=XXX>This again will be pinned down to a specific codec.</p>
-
-
- <h5 id=peer-to-peer-connections><span class=secno>4.11.6.2 </span>Peer-to-peer connections</h5>
-
- <p class=XXX>This section will be moved to a more appropriate
- location in due course; it is here currently to keep it near the
- <code><a href=#devices>device</a></code> element to allow reviewers to look at it.</p>
-
- <pre class=idl>[Constructor(in DOMString serverConfiguration)]
-interface <dfn id=connectionpeer>ConnectionPeer</dfn> {
- void sendText(in DOMString text, in optional boolean unimportant); // if second arg is true, then use unreliable low-latency transport (UDP-like), otherwise guarantee delivery (TCP-like)
- attribute <a href=#function>Function</a> ontext; // receiving
-
- void sendBitmap(in HTMLImageElement image);
- attribute <a href=#function>Function</a> onbitmap; // receiving
-
- void sendFile(in File file);
- attribute <a href=#function>Function</a> onfile; // receiving
-
- void addStream(in Stream stream);
- void removeStream(in Stream stream);
- readonly attribute Stream[] localStreams;
- readonly attribute Stream[] remoteStreams;
- attribute <a href=#function>Function</a> onstream; // receiving
-
- void <span title=dom-ConnectionPeer-getLocalConfiguration>getLocalConfiguration</span>(in <a href=#connectionpeerconfigurationcallback>ConnectionPeerConfigurationCallback</a> callback); // maybe this should be in the constructor, or be an event
- void <span title=dom-ConnectionPeer-addRemoteConfiguration>addRemoteConfiguration</span>(in DOMString configuration, in optional DOMString remoteOrigin); // remote origin is assumed to be same-origin if not specified. If specified, has to match remote origin (checked in handshake). Should support leading "*." to mean "any subdomain of".
- void close(); // disconnects and stops listening
-
- attribute <a href=#function>Function</a> onconnect;
- attribute <a href=#function>Function</a> onerror;
- attribute <a href=#function>Function</a> ondisconnect;
-};
-<a href=#connectionpeer>ConnectionPeer</a> implements <a href=#eventtarget>EventTarget</a>;
-
-[Callback=FunctionOnly, NoInterfaceObject]
-interface <dfn id=connectionpeerconfigurationcallback>ConnectionPeerConfigurationCallback</dfn> {
- void <span title=dom-ConnectionPeerConfigurationCallback-handleEvent>handleEvent</span>(in <a href=#connectionpeer>ConnectionPeer</a> server, in DOMString configuration);
-};</pre>
-
- <p class=XXX>...</p>
-
- <div class=XXX>
-
- <p>This relies on some currently hypothetical other standard to
- define:</p>
-
- <ul><li>The format of server configuration strings.
- <li>The format of client configuration strings.
- <li>The protocols that clients use to talk to third-party servers mentioned in the server configuration strings.
- <li>The protocols that clients use to talk to each other.
- </ul></div>
-
- <div class=example>
-
- <p>When two peers decide they are going to set up a connection to
- each other, they both go through these steps. The serverConfig
- comes from a third-party server they can use to get things like
- their public IP address or to set up NAT traversal. They also have
- to send their respective configuration to each other using the same
- out-of-band mechanism they used to establish that they were going
- to communicate in the first place.</p>
-
- <pre>var serverConfig = ...; // configuration string obtained from server
-// contains details such as the IP address of a server that can speak some
-// protocol to help the client determine its public IP address, route packets
-// if necessary, etc.
-
-var local = new ConnectionPeer(serverConfig);
-local.getLocalConfiguration(function (configuration) {
- if (configuration != '') {
- ...; // send configuration to other peer using out-of-band mechanism
- } else {
- // we've exhausted our options; wait for connection
- }
-});
-
-function ... (configuration) {
- // called whenever we get configuration information out-of-band
- local.addRemoteConfiguration(configuration);
-}
-
-local.onconnect = function (event) {
- // we are connected!
- local.sendText('Hello');
- local.addStream(...); // send video
- local.onstream = function (event) {
- // receive video
- // (videoElement is some <video> element)
- if (local.remoteStreams.length > 0)
- videoElement.src = local.remoteStreams[0].url;
- };
-};</pre>
-
- </div>
-
- <p class=warning>To prevent network sniffing from allowing a
- fourth party to establish a connection to a peer using the
- information sent out-of-band to the other peer and thus spoofing the
- client, the configuration information should always be transmitted
- using an encrypted connection.</p>
-
-
-</div>
-<!--DEVICE-->
-
-
-
-
<h3 id=links><span class=secno>4.12 </span>Links</h3>
<h4 id=introduction-2><span class=secno>4.12.1 </span>Introduction</h4>
@@ -66731,7 +66509,6 @@
-
<h2 id=editing><span class=secno>8 </span><dfn>User interaction</dfn></h2>
@@ -71198,17 +70975,1456 @@
v2 (well, really v0):
"forecolor", "hilitecolor", "fontname", "fontsize", "justifyleft",
"justifycenter", "justifyright", "justifyfull", "indent", "outdent"
---><div data-component="Web Workers (editor: Ian Hickson)">
+--><div data-component="other Hixie drafts (editor: Ian Hickson)">
- <h2 id=workers><span class=secno>9 </span>Web workers</h2>
+ <h2 id=video-conferencing-and-peer-to-peer-communication><span class=secno>9 </span>Video conferencing and peer-to-peer communication</h2>
+ <h3 id=introduction-8><span class=secno>9.1 </span>Introduction</h3>
+ <p><i>This section is non-normative.</i></p>
+ <p>There are a number of facets to video-conferencing in HTML:</p>
- <h3 id=introduction-8><span class=secno>9.1 </span>Introduction</h3>
+ <ul><li>Getting a multimedia stream (video, audio, or both) from local
+ devices (video cameras, microphones, Web cams) or from prerecorded
+ files provided by the user.</li>
- <h4 id=scope-0><span class=secno>9.1.1 </span>Scope</h4>
+ <li>Recording such streams locally.</li>
+ <li>Connecting to remote peers using NAT-traversal technologies
+ such as ICE, STUN, and TURN.</li>
+
+ <li>Sending the locally-produced streams to remote peers and
+ receiving streams from remote peers.</li>
+
+ <li>Displaying such streams (both the locally-produced ones and the
+ remotely-obtained ones) locally using the <code><a href=#video>video</a></code> or
+ <code><a href=#audio>audio</a></code> elements.</li>
+
+ <li>Sending arbitrary data to remote peers.</li>
+
+ </ul><p>This section defines the APIs used for these features.</p>
+
+
+ <h4 id=obtaining-local-multimedia-content><span class=secno>9.1.1 </span>Obtaining local multimedia content</h4>
+
+ <pre class=idl>[Supplemental, NoInterfaceObject]
+interface <dfn id=navigatorusermedia>NavigatorUserMedia</dfn> {
+ void <a href=#dom-navigator-getusermedia title=dom-navigator-getUserMedia>getUserMedia</a>(in DOMString options, in <a href=#navigatorusermediasuccesscallback>NavigatorUserMediaSuccessCallback</a> successCallback, in optional <a href=#navigatorusermediaerrorcallback>NavigatorUserMediaErrorCallback</a> errorCallback);
+};
+<a href=#navigator>Navigator</a> implements <a href=#navigatorusermedia>NavigatorUserMedia</a>;
+
+[Callback=FunctionOnly, NoInterfaceObject]
+interface <dfn id=navigatorusermediasuccesscallback>NavigatorUserMediaSuccessCallback</dfn> {
+ void <span title=dom-NavigatorUserMediaSuccessCallback-handleEvent>handleEvent</span>(in <a href=#generatedstream>GeneratedStream</a> stream);
+};
+
+[NoInterfaceObject]<!-- this is based on PositionError in geolocation -->
+interface <dfn id=navigatorusermediaerror>NavigatorUserMediaError</dfn> {
+ const unsigned short <a href=#dom-navigatorusermediaerror-permission_denied title=dom-NavigatorUserMediaError-PERMISSION_DENIED>PERMISSION_DENIED</a> = 1;<!--
+ const unsigned short <span title="dom-NavigatorUserMediaError-UNAVAILABLE">UNAVAILABLE</span> = 2;
+ const unsigned short <span title="dom-NavigatorUserMediaError-TIMEOUT">TIMEOUT</span> = 3;-->
+ readonly attribute unsigned short <a href=#dom-navigatorusermediaerror-code title=dom-NavigatorUserMediaError-code>code</a>;<!--
+ readonly attribute DOMString <span title="dom-NavigatorUserMediaError-message">message</span>;-->
+};
+
+[Callback=FunctionOnly, NoInterfaceObject]
+interface <dfn id=navigatorusermediaerrorcallback>NavigatorUserMediaErrorCallback</dfn> {
+ void <span title=dom-NavigatorUserMediaSuccessCallback-handleEvent>handleEvent</span>(in <a href=#navigatorusermediaerror>NavigatorUserMediaError</a> error);
+};</pre>
+
+ <dl class=domintro><dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-navigator-getUserMedia><a href=#dom-navigator-getusermedia>getUserMedia</a></code>(<var title="">options</var>, <var title="">successCallback</var> [, <var title="">errorCallback</var> ] )</dt>
+
+ <dd>
+
+ <p>Prompts the user for permission to use their Web cam or other
+ video or audio input.</p>
+
+ <p>The <var title="">options</var> argument is a string of
+ comma-separated values from the following list:</p>
+
+ <dl><dt>"<code title="">audio</code>"</dt>
+
+ <dd>The provided media needs to include audio data.</dd>
+
+
+ <dt>"<code title="">video</code>"</dt>
+
+ <dd>The provided media needs to include video data.</dd>
+
+
+ </dl><p>If the user accepts, the <var title="">successCallback</var> is
+ invoked, with a suitable <code><a href=#generatedstream>GeneratedStream</a></code> object as
+ its argument.</p>
+
+ <p>If the user declines, the <var title="">errorCallback</var> (if
+ any) is invoked.</p>
+
+ </dd>
+
+
+ <dt><var title="">error</var> . <code title=dom-NavigatorUserMediaError-code><a href=#dom-navigatorusermediaerror-code>code</a></code></dt>
+
+ <dd>
+
+ <p>Returns the current error's error code. At this time, this will
+ always be 1, for which the constant <code title=dom-NavigatorUserMediaError-PERMISSION_DENIED><a href=#dom-navigatorusermediaerror-permission_denied>PERMISSION_DENIED</a></code>
+ is defined.</p>
+
+ </dd>
+
+ </dl><div class=impl>
+
+ <p>When the <dfn id=dom-navigator-getusermedia title=dom-navigator-getUserMedia><code>getUserMedia()</code></dfn>
+ method is called, the user agent must run the following steps:</p>
+
+ <ol><li><p>Let <var title="">options</var> be the method's first
+ argument.</li>
+
+ <li><p>Let <var title="">successCallback</var> be the callback
+ indicated by the method's second argument.</li>
+
+ <li><p>Let <var title="">errorCallback</var> be the callback
+ indicated by the method's third argument, if any, or null
+ otherwise.</li>
+
+ <li><p>If <var title="">successCallback</var> is null, abort these
+ steps.</li> <!-- we could throw an exception instead (that's
+ why the method doesn't return until later: so that we can add an
+ exception here, or for /options/ below, without changing the
+ algorithm) -->
+
+ <li><p><a href=#split-a-string-on-spaces title="split a string on spaces">Split <var title="">options</var> on spaces</a> to obtain <var title="">list of options</var>.</li>
+
+ <li><p>If one of the tokens in <var title="">list of options</var>
+ is a <a href=#case-sensitive>case-sensitive</a> match for the string "<code title="">audio</code>", let <var title="">audio</var> be true.
+ Otherwise, let it be false.</li>
+
+ <li><p>If one of the tokens in <var title="">list of options</var>
+ is a <a href=#case-sensitive>case-sensitive</a> match for the string "<code title="">video</code>", let <var title="">video</var> be true.
+ Otherwise, let it be false.</li>
+
+ <!-- any error handling for /options/ should be done here (that's
+ why the method doesn't return until the next step: so we can add
+ exception throwing here) -->
+
+ <li><p>Return, and run the remaining steps asynchronously.</li>
+
+ <li><p>Optionally, e.g. based on a previously-established user
+ preference, for security reasons, or due to platform limitations,
+ jump to the step labeled <i>failure</i> below.</li>
+
+ <li>
+
+ <p>Prompt the user in a user-agent-specific manner for permission
+ to provide the <a href=#entry-script>entry script</a>'s <a href=#origin>origin</a>
+ with a <code><a href=#generatedstream>GeneratedStream</a></code> object representing a media
+ stream.</p>
+
+ <p>If <var title="">audio</var> is true, then the provided media
+ should include an audio component. If <var title="">audio</var>
+ is false, then the provided media must not include an audio
+ component.</p>
+
+ <p>If <var title="">video</var> is true, then the provided media
+ should include a video component. If <var title="">video</var> is
+ false, then the provided media must not include a video
+ component.</p>
+
+ <p>User agents are encouraged to default to using the user's
+ primary or system default camera and/or microphone (as
+ appropriate) to generate the media stream. User agents may allow
+ users to use any media source, including pre-recorded media
+ files.</p>
+
+ <p>If the user grants permission to use local recording devices,
+ user agents are encouraged to include a prominent indicator that
+ the devices are "hot" (i.e. an "on-air" or "recording"
+ indicator).</p>
+
+ <p>If the user denies permission, jump to the step labeled
+ <i>failure</i> below. If the user never responds, this algorithm
+ stalls on this step.</p>
+
+ </li>
+
+ <li><p>Let <var title="">stream</var> be the
+ <code><a href=#generatedstream>GeneratedStream</a></code> object for which the user granted
+ permission.</li>
+
+ <li><p><a href=#queue-a-task>Queue a task</a> to invoke <var title="">successCallback</var> with <var title="">stream</var> as
+ its argument.</li>
+
+ <li><p>Abort these steps.</li>
+
+ <li><p><i>Failure</i>: If <var title="">errorCallback</var> is
+ null, abort these steps.</li>
+
+ <li><p>Let <var title="">error</var> be a new
+ <code><a href=#navigatorusermediaerror>NavigatorUserMediaError</a></code> object whose <code title=dom-NavigatorUserMediaError-code><a href=#dom-navigatorusermediaerror-code>code</a></code> attribute has
+ the numeric value 1 (<code title=dom-NavigatorUserMediaError-PERMISSION_DENIED><a href=#dom-navigatorusermediaerror-permission_denied>PERMISSION_DENIED</a></code>).</li>
+
+ <li><p><a href=#queue-a-task>Queue a task</a> to invoke <var title="">errorCallback</var> with <var title="">error</var> as its
+ argument.</li>
+
+ </ol><p>The <a href=#task-source>task source</a> for these <a href=#concept-task title=concept-task>tasks</a> is the <a href=#user-interaction-task-source>user interaction task
+ source</a>.</p>
+
+ <hr><p>The <dfn id=dom-navigatorusermediaerror-code title=dom-NavigatorUserMediaError-code><code>code</code></dfn>
+ attribute of a <code><a href=#navigatorusermediaerror>NavigatorUserMediaError</a></code> object must return the code
+ for the error, which must be <!--one of--> the following:</p>
+
+ <dl><dt><dfn id=dom-navigatorusermediaerror-permission_denied title=dom-NavigatorUserMediaError-PERMISSION_DENIED><code>PERMISSION_DENIED</code></dfn> (numeric value 1)</dt>
+
+ <dd>The user denied the page permission to use the user's media devices.</dd>
+
+ </dl></div>
+
+ <div class=example>
+
+ <p>A voice chat feature in a game could attempt to get access to
+ the user's microphone by calling the API as follows:</p>
+
+ <pre><script>
+ navigator.getUserMedia('audio', gotAudio);
+ function gotAudio(stream) {
+ // ... use 'stream' ...
+ }
+</script></pre>
+
+ </div>
+
+ <div class=example>
+
+ <p>A video-conferencing system would ask for both audio and video:</p>
+
+ <pre><script>
+ function beginCall() {
+ navigator.getUserMedia('audio,video', gotStream);
+ }
+ function gotStream(stream) {
+ // ... use 'stream' ...
+ }
+</script></pre>
+
+ </div>
+
+
+
+ <h4 id=stream-api><span class=secno>9.1.2 </span>Stream API</h4>
+
+ <p>The <code><a href=#stream>Stream</a></code> interface is used to represent streams,
+ typically (but not necessarily) of audio and/or video content, e.g.
+ from a local camera or a remote site.</p>
+
+ <p>The <code><a href=#generatedstream>GeneratedStream</a></code> interface is used when the user
+ agent is generating the stream's data (e.g. from a camera or
+ streaming it from a local video file). It allows authors to pause
+ the generation of the content, e.g. to allow the user to temporarily
+ disable a local camera during a video-conference chat.</p>
+
+ <p>When a <code><a href=#generatedstream>GeneratedStream</a></code> object is being generated
+ from a local file (as opposed to a live audio/video source), the
+ user agent should stream the data from the file in real time, not
+ all at once. This reduces the ease with which pages can distinguish
+ live video from pre-recorded video, which can help protect the
+ user's privacy.</p>
+
+ <!-- v2: support reading the bits from the stream directly, for use
+ with streaming over WebSocket? Or do we rely on FileReader for that? -->
+
+ <pre class=idl>interface <dfn id=stream>Stream</dfn> {
+ readonly attribute DOMString <a href=#dom-stream-label title=dom-stream-label>label</a>;
+ <a href=#streamrecorder>StreamRecorder</a> <a href=#dom-stream-record title=dom-stream-record>record</a>();
+<!--
+ const unsigned short <span title="dom-stream-LOADING">LOADING</span> = 0; -->
+ const unsigned short <a href=#dom-stream-live title=dom-stream-LIVE>LIVE</a> = 1;
+ const unsigned short <a href=#dom-stream-ended title=dom-stream-ENDED>ENDED</a> = 2;
+ readonly attribute unsigned short <a href=#dom-stream-readystate title=dom-stream-readyState>readyState</a>;
+ attribute <a href=#function>Function</a> <a href=#handler-stream-onreadystatechange title=handler-stream-onreadystatechange>onreadystatechange</a>;
+ attribute <a href=#function>Function</a> <a href=#handler-stream-onended title=handler-stream-onended>onended</a>;
+};
+<a href=#stream>Stream</a> implements <a href=#eventtarget>EventTarget</a>;
+
+interface <dfn id=generatedstream>GeneratedStream</dfn> {
+ void <a href=#dom-stream-stop title=dom-stream-stop>stop</a>();
+
+ // temporarily pausing the stream
+ const unsigned short <a href=#dom-stream-paused title=dom-stream-PAUSED>PAUSED</a> = 3;
+ void <a href=#dom-stream-pause title=dom-stream-pause>pause</a>();
+ void <a href=#dom-stream-resume title=dom-stream-resume>resume</a>();
+ attribute <a href=#function>Function</a> <a href=#handler-stream-onpause title=handler-stream-onpause>onpause</a>;
+ attribute <a href=#function>Function</a> <a href=#handler-stream-onplay title=handler-stream-onplay>onplay</a>;
+};</pre>
+
+ <dl class=domintro><dt><var title="">stream</var> . <code title=dom-stream-label><a href=#dom-stream-label>label</a></code></dt>
+
+ <dd>
+
+ <p>Returns a label that is unique to this stream, so that streams
+ can be recognised after they are sent through the
+ <code><a href=#peerconnection>PeerConnection</a></code> API.</p>
+
+ </dd>
+
+
+ <dt><var title="">recorder</var> = <var title="">stream</var> . <code title=dom-stream-record><a href=#dom-stream-record>record</a></code>()</dt>
+
+ <dd>
+
+ <p>Begins recording the stream. The returned
+ <code><a href=#streamrecorder>StreamRecorder</a></code> object provides access to the recorded
+ data.</p>
+
+ </dd>
+
+
+ <dt><var title="">stream</var> . <code title=dom-stream-stop><a href=#dom-stream-stop>stop</a></code>()</dt>
+
+ <dd>
+
+ <p>Permanently stops the generation of media data for the stream.</p>
+
+ </dd>
+
+
+ <dt><var title="">stream</var> . <code title=dom-stream-paused><a href=#dom-stream-paused>paused</a></code></dt>
+
+ <dd>
+
+ <p>Returns false if the stream is generating data; true if it is pause.</p>
+
+ </dd>
+
+
+ <dt><var title="">stream</var> . <code title=dom-stream-pause><a href=#dom-stream-pause>pause</a></code>()</dt>
+
+ <dd>
+
+ <p>Temporarily stops the generation of media data for the stream.</p>
+
+ </dd>
+
+
+ <dt><var title="">stream</var> . <code title=dom-stream-resume><a href=#dom-stream-resume>resume</a></code>()</dt>
+
+ <dd>
+
+ <p>Resumes the generation of media data for the stream if it was temporarily stopped.</p>
+
+ </dd>
+
+ </dl><div class=impl>
+
+ <p>The <dfn id=dom-stream-readystate title=dom-stream-readyState><code>readyState</code></dfn>
+ attribute represents the state of the stream. It must return the
+ value to which the user agent last set it (as defined below). It can
+ have the following values:</p>
+
+ <dl><dt><dfn id=dom-stream-live title=dom-stream-LIVE><code>LIVE</code></dfn> (numeric value 1)</dt>
+
+ <dd>The stream is active (the user agent is making a best-effort
+ attempt to receive or generate data in real time).</dd>
+
+ <dt><dfn id=dom-stream-ended title=dom-stream-ENDED><code>ENDED</code></dfn> (numeric value 2)</dt>
+
+ <dd>The stream has finished (the user agent is no longer receiving
+ or generating data, and will never receive or generate more data
+ for this stream).</dd>
+
+ <dt><dfn id=dom-stream-paused title=dom-stream-PAUSED><code>PAUSED</code></dfn> (numeric value 3)</dt>
+
+ <dd>The stream is not generating data at this time, but could still
+ be resumed. Only <code><a href=#generatedstream>GeneratedStream</a></code> objects can be in
+ this state.</dd>
+
+ </dl><p>When a <code><a href=#stream>Stream</a></code> object is created, its <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute must be
+ set to <code title=dom-stream-LIVE><a href=#dom-stream-live>LIVE</a></code> (1).</p>
+
+ <p>When a <code><a href=#stream>Stream</a></code> object ends for any reason other than
+ the <code title=dom-stream-stop><a href=#dom-stream-stop>stop()</a></code> method being invoke
+ (e.g. because the user rescinds the permission for the page to use
+ the local camera, or because the data comes from a finite file and
+ the file's end has been reached and the user has not requested that
+ it be looped, or because the stream comes from a remote peer and the
+ remote peer has permanently stopped sending data), the user agent
+ must <a href=#queue-a-task>queue a task</a> that runs the following steps:</p>
+
+ <ol><li><p>If the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute has the
+ value <code title=dom-stream-ENDED><a href=#dom-stream-ended>ENDED</a></code> (2) already, then
+ abort these steps. (The <code title=dom-stream-stop><a href=#dom-stream-stop>stop()</a></code>
+ method was probably called just before the stream stopped for other
+ reasons, e.g. the user clicked an in-page stop button and then the
+ user-agent-provided stop button.)</li>
+
+ <li><p>Set the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute to <code title=dom-stream-ENDED><a href=#dom-stream-ended>ENDED</a></code> (2).</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-readystatechange><a href=#event-readystatechange>readystatechange</a></code> at the
+ object.</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-stream-ended>ended</code> at the object.</li>
+
+ </ol><p>If the end of the stream was reached due to a user request, the
+ <a href=#task-source>task source</a> for this <a href=#concept-task title=concept-task>task</a> is the <a href=#user-interaction-task-source>user interaction task
+ source</a>. Otherwise the <a href=#task-source>task source</a> for this <a href=#concept-task title=concept-task>task</a> is the <a href=#networking-task-source>networking task
+ source</a>.</p>
+
+ <hr><p>When a <code><a href=#generatedstream>GeneratedStream</a></code> object is created, the user
+ agent must generate a globally unique identifier string, and must
+ initialize the object's <code title=dom-stream-label><a href=#dom-stream-label>label</a></code>
+ attribute to that string. Such strings must only use characters in
+ the ranges U+0021, U+0023 to U+0027, U+002A to U+002B, U+002D to
+ U+002E, U+0030 to U+0039, U+0041 to U+005A, U+005E to U+007E, and
+ must be 36 characters long.</p> <!-- UUIDs have 36 characters
+ including hyphens; the ranges above comes from RFC4574 (the a=label:
+ thing in SDP) -->
+
+ <p>When a <code><a href=#stream>Stream</a></code> is created to represent a stream
+ obtained from a remote peer, the <code title=dom-stream-label><a href=#dom-stream-label>label</a></code> attribute is initialized from
+ information provided by the remote source.</p> <!-- described below
+ -->
+
+ <p>The <dfn id=dom-stream-label title=dom-stream-label><code>label</code></dfn>
+ attribute must return the value to which it was initialized when the
+ object was created.</p>
+
+ <hr><p>When the <dfn id=dom-stream-record title=dom-stream-record><code>record()</code></dfn> method is
+ invoked, the user agent must return a new
+ <code><a href=#streamrecorder>StreamRecorder</a></code> object associated with the stream.</p>
+
+ <hr><p>When a <code><a href=#generatedstream>GeneratedStream</a></code> object's <dfn id=dom-stream-stop title=dom-stream-stop><code>stop()</code></dfn> method is invoked,
+ the user agent must <a href=#queue-a-task>queue a task</a> that runs the
+ following steps:</p>
+
+ <ol><li><p>If the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute is in the
+ <code title=dom-stream-ENDED><a href=#dom-stream-ended>ENDED</a></code> (2) state, then abort
+ these steps.</li>
+
+ <li><p>Permanently stop the generation of data for the stream. If
+ the data is being generated from a live source (e.g. a microphone
+ or camera), and no other stream is being generated from a live
+ source, then the user agent should remove any active "on-air"
+ indicator. If the data is being generated from a prerecorded source
+ (e.g. a video file), any remaining content in the file is
+ ignored.</li>
+
+ <li><p>Set the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute to <code title=dom-stream-ENDED><a href=#dom-stream-ended>ENDED</a></code> (2).</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-readystatechange><a href=#event-readystatechange>readystatechange</a></code> at the
+ object.</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-stream-ended>ended</code> at the object.</li>
+
+ </ol><hr><p>When a <code><a href=#generatedstream>GeneratedStream</a></code> object's <dfn id=dom-stream-pause title=dom-stream-pause><code>pause()</code></dfn> method is
+ invoked, the user agent must <a href=#queue-a-task>queue a task</a> that runs the
+ following steps:</p>
+
+ <ol><li><p>If the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute is not in
+ the <code title=dom-stream-LIVE><a href=#dom-stream-live>LIVE</a></code> (1) state, then abort
+ these steps.</li>
+
+ <li><p>Pause the generation of data for the stream. If the data is
+ being generated from a live source (e.g. a microphone or camera),
+ then data collected for this stream while the stream is paused must
+ be discarded. If the data is being generated from a prerecorded
+ source (e.g. a video file), the user agent should follow user
+ preferences for handling a pause (either skipping over data in real
+ time or resuming from the same point when the stream is later
+ resumed).</li>
+
+ <li><p>Set the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute to <code title=dom-stream-PAUSED><a href=#dom-stream-paused>PAUSED</a></code> (3).</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-readystatechange><a href=#event-readystatechange>readystatechange</a></code> at the
+ object.</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-stream-pause>pause</code> at the object.</li>
+
+ </ol><p>When a <code><a href=#generatedstream>GeneratedStream</a></code> object's <dfn id=dom-stream-resume title=dom-stream-resume><code>resume()</code></dfn> method is
+ invoked, the user agent must <a href=#queue-a-task>queue a task</a> that runs the
+ following steps:</p>
+
+ <ol><li><p>If the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute is not in
+ the <code title=dom-stream-PAUSED><a href=#dom-stream-paused>PAUSED</a></code> (3) state, then
+ abort these steps.</li>
+
+ <li><p>Resume the generation of data for the stream.</li>
+
+ <li><p>Set the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute to <code title=dom-stream-LIVE><a href=#dom-stream-live>LIVE</a></code> (1).</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-readystatechange><a href=#event-readystatechange>readystatechange</a></code> at the
+ object.</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-stream-play>play</code> at the object.</li>
+
+ </ol><hr><p>The <a href=#task-source>task source</a> for the <a href=#concept-task title=concept-task>tasks</a> queued for the <code title=dom-stream-stop><a href=#dom-stream-stop>stop()</a></code>, <code title=dom-stream-pause><a href=#dom-stream-pause>pause()</a></code>, and <code title=dom-stream-resume><a href=#dom-stream-resume>resume()</a></code> methods is the <a href=#dom-manipulation-task-source>DOM
+ manipulation task source</a>.</p>
+
+ <hr><p>The following are the <a href=#event-handlers>event handlers</a> (and their
+ corresponding <a href=#event-handler-event-type title="event handler event type">event handler
+ event types</a>) that must be supported, as IDL attributes, by
+ all objects implementing the <code><a href=#stream>Stream</a></code> interface:</p>
+
+ <table><thead><tr><th><a href=#event-handlers title="event handlers">Event handler</a> <th><a href=#event-handler-event-type>Event handler event type</a>
+ <tbody><tr><td><dfn id=handler-stream-onreadystatechange title=handler-stream-onreadystatechange><code>onreadystatechange</code></dfn> <td> <code title=event-stream-readystatechange>readystatechange</code>
+ <tr><td><dfn id=handler-stream-onended title=handler-stream-onended><code>onended</code></dfn> <td> <code title=event-stream-ended>ended</code>
+ </table><p>The following are the additional <a href=#event-handlers>event handlers</a> (and
+ their corresponding <a href=#event-handler-event-type title="event handler event type">event
+ handler event types</a>) that must be supported, as IDL
+ attributes, by all objects implementing the
+ <code><a href=#generatedstream>GeneratedStream</a></code> interface:</p>
+
+ <table><thead><tr><th><a href=#event-handlers title="event handlers">Event handler</a> <th><a href=#event-handler-event-type>Event handler event type</a>
+ <tbody><tr><td><dfn id=handler-stream-onpause title=handler-stream-onpause><code>onpause</code></dfn> <td> <code title=event-stream-pause>pause</code>
+ <tr><td><dfn id=handler-stream-onplay title=handler-stream-onplay><code>onplay</code></dfn> <td> <code title=event-stream-play>play</code>
+ </table></div>
+
+ <div class=example>
+
+ <p>This sample code exposes a button. When clicked, the button is
+ disabled and the user is prompted to offer a stream. The user can
+ cause the button to be re-enabled by providing a stream (e.g.
+ giving the page access to the local camera) and then disabling the
+ stream (e.g. revoking that access).</p>
+
+ <pre>
+<input type="button" value="Start" onclick="start()" id="startBtn">
+<script>
+ var startBtn = document.getElementById('startBtn');
+ function start() {
+ navigator.getUserMedia('audio,video', gotStream);
+ startBtn.disabled = true;
+ }
+ function gotStream(stream) {
+ stream.onended = function () {
+ startBtn.disabled = false;
+ }
+ }
+</script></pre>
+
+ </div>
+
+ <pre class=idl>interface <dfn id=streamrecorder>StreamRecorder</dfn> {
+ <span>Blob</span> <a href=#dom-streamrecorder-getrecordeddata title=dom-StreamRecorder-getRecordedData>getRecordedData</a>(in <a href=#blobcallback>BlobCallback</a> callback);
+};
+
+[Callback=FunctionOnly, NoInterfaceObject]
+interface <dfn id=blobcallback>BlobCallback</dfn> {
+ void <span title=dom-BlobCallback-handleEvent>handleEvent</span>(in <span>Blob</span> blob);
+};</pre>
+
+ <dl class=domintro><dt><var title="">recorder</var> . <code title=dom-StreamRecorder-getRecordedData><a href=#dom-streamrecorder-getrecordeddata>getRecordedData</a></code>(<var title="">callback</var>)</dt>
+
+ <dd>
+
+ <p>Creates a <code>Blob</code> of the recorded data, and invokes
+ the provided callback with that <code>Blob</code>.</p>
+
+ </dd>
+
+ </dl><div class=impl>
+
+ <p>When the <dfn id=dom-streamrecorder-getrecordeddata title=dom-StreamRecorder-getRecordedData><code>getRecordedData()</code></dfn>
+ method is called, the user agent must run the following steps:</p>
+
+ <ol><li><p>Let <var title="">callback</var> be the callback
+ indicated by the method's first argument.</li>
+
+ <li><p>If <var title="">callback</var> is null, abort these
+ steps.</li> <!-- we could throw an exception instead (that's
+ why the method doesn't return until later: so that we can add an
+ exception here without changing the algorithm) -->
+
+ <li><p>Let <var title="">data</var> be the data that was streamed
+ by the <code><a href=#stream>Stream</a></code> object from which the
+ <code><a href=#streamrecorder>StreamRecorder</a></code> was created since the creation of the
+ <code><a href=#streamrecorder>StreamRecorder</a></code> object.</li>
+
+ <li><p>Return, and run the remaining steps asynchronously.</li>
+
+ <li><p>Generate a file that containing <var title="">data</var> in
+ a format supported by the user agent for use in <code><a href=#audio>audio</a></code>
+ and <code><a href=#video>video</a></code> elements.</li>
+
+ <li><p>Let <var title="">blob</var> be a <code>Blob</code> object
+ representing the contents of the file generated in the previous
+ step. <a href=#refsFILEAPI>[FILEAPI]</a></p>
+
+ <li><p><a href=#queue-a-task>Queue a task</a> to invoke <var title="">callback</var> with <var title="">blob</var> as its
+ argument.</li>
+
+ </ol><p class=note>The <code title=dom-StreamRecorder-getRecordedData><a href=#dom-streamrecorder-getrecordeddata>getRecordedData()</a></code>
+ method can be called multiple times on one
+ <code><a href=#streamrecorder>StreamRecorder</a></code> object; each time, it will create a new
+ file as if this was the first time the method was being called. In
+ particular, the method does not stop or reset the recording when the
+ method is called.</p>
+
+ </div>
+
+ <div class=example>
+
+ <p>This example allows people to record a short audio message and
+ upload it to the server. This example even shows rudimentary error
+ handling.</p>
+
+ <pre><input type="button" value="⚫" onclick="msgRecord()" id="recBtn">
+<input type="button" value="◼" onclick="msgStop()" id="stopBtn" disabled>
+<p id="status">To start recording, press the ⚫ button.</p>
+<script>
+ var recBtn = document.getElementById('recBtn');
+ var stopBtn = document.getElementById('stopBtn');
+ function report(s) {
+ document.getElementById('status').textContent = s;
+ }
+ function msgRecord() {
+ report('Attempting to access microphone...');
+ navigator.getUserMedia('audio', gotStream, noStream);
+ recBtn.disabled = true;
+ }
+ var msgStream;
+ function gotStream(stream) {
+ report('Recording... To stop, press to ◼ button.');
+ msgStream = stream;
+ stopBtn.disabled = false;
+ stream.onended = function () {
+ msgStop();
+ }
+ }
+ function msgStop() {
+ report('Creating file...');
+ stopBtn.disabled = true;
+ stream.onended = null;
+ stream.stop();
+ stream.getRecordedData(msgSave);
+ }
+ function msgSave(blob) {
+ report('Uploading file...');
+ var x = new XMLHttpRequest();
+ x.open('POST', 'uploadMessage');
+ x.send(blob);
+ x.onload = function () {
+ report('Done! To record a new message, press the ⚫ button.');
+ recBtn.disabled = false;
+ };
+ x.onerror = function () {
+ report('Failed to upload message. To try recording a message again, press the ⚫ button.');
+ recBtn.disabled = false;
+ };
+ }
+ funciton noStream() {
+ report('Could not obtain access to your microphone. To try again, press the ⚫ button.');
+ recBtn.disabled = false;
+ }
+</script></pre>
+
+ </div>
+
+ <pre class=idl>[Supplemental]
+interface <dfn id=dom-url title=dom-URL>URL</dfn> {
+ static DOMString <a href=#dom-url-createobjecturl title=dom-URL-createObjectURL>createObjectURL</a>(in <a href=#stream>Stream</a> stream);
+};</pre>
+
+ <dl class=domintro><dt><var title="">window</var> . <code title=dom-URL><a href=#dom-url>URL</a></code> . <code title=dom-URL-createObjectURL><a href=#dom-url-createobjecturl>createObjectURL</a></code>(<var title="">stream</var>)</dt>
+
+ <dd>
+
+ <p>Mints a <a href=#blob-url>Blob URL</a> to refer to the given <code><a href=#stream>Stream</a></code>.</p>
+
+ </dd>
+
+ </dl><div class=impl>
+
+ <p>When the <dfn id=dom-url-createobjecturl title=dom-URL-createObjectURL><code>createObjectURL()</code></dfn>
+ method is called with a <code><a href=#stream>Stream</a></code> argument, the user agent
+ must return a unique <a href=#blob-url>Blob URL</a> for the given
+ <code><a href=#stream>Stream</a></code>. <a href=#refsFILEAPI>[FILEAPI]</a></p>
+
+ <p>For audio and video streams, the data exposed on that stream must
+ be in a format supported by the user agent for use in
+ <code><a href=#audio>audio</a></code> and <code><a href=#video>video</a></code> elements.</p>
+
+ <p class=bookkeeping>A <dfn id=blob-url>Blob URL</dfn> is the same as what the
+ File API specification calls a <span>Blob URI</span>, except that
+ anything in the definition of that feature that refers to
+ <code>File</code> and <code>Blob</code> objects is hereby extended
+ to also apply to <code><a href=#stream>Stream</a></code> and
+ <code><a href=#generatedstream>GeneratedStream</a></code> objects.</p>
+
+ </div>
+
+ <div class=example>
+
+ <p>This example allows people to take photos of themselves from the
+ local video camera.</p>
+
+ <pre><article>
+ <style scoped>
+ video { transform: scaleX(-1); }
+ p { text-align: center; }
+ </style>
+ <h1>Snapshot Kiosk</h1>
+ <section id="splash">
+ <p id="errorMessage">Loading...</p>
+ </section>
+ <section id="app" hidden>
+ <p><video id="monitor"></video> <canvas id="photo"></canvas>
+ <p><input type=button value="📷" onclick="snapshot()">
+ </section>
+ <script>
+ navigator.getUserMedia('video', gotStream, noStream);
+ var video = document.getElementById('monitor');
+ var canvas = document.getElementById('photo');
+ function gotStream(stream) {
+ video.src = URL.getObjectURL(stream);
+ video.onerror = function () {
+ stream.stop();
+ noStream();
+ }
+ video.onloadedmetadata = function () {
+ canvas.width = video.videoWidth;
+ canvas.height = video.videoHeight;
+ document.getElementById('splash').hidden = true;
+ document.getElementById('app').hidden = false;
+ }
+ }
+ function noStream() {
+ document.getElementById('errorMessage').textContent = 'No camera available.';
+ }
+ function snapshot() {
+ canvas.getContext('2d').drawImage(video, 0, 0);
+ }
+ </script>
+</article></pre>
+
+ </div>
+
+
+
+ <h4 id=peer-to-peer-connections><span class=secno>9.1.3 </span>Peer-to-peer connections</h4>
+
+ <pre class=idl>[<a href=#dom-peerconnection title=dom-PeerConnection>Constructor</a>(in DOMString configuration, in <a href=#signalingcallback>SignalingCallback</a> signalingCallback)]
+interface <dfn id=peerconnection>PeerConnection</dfn> {
+ void <a href=#dom-peerconnection-signalingmessage title=dom-PeerConnection-signalingMessage>signalingMessage</a>(in DOMString message);
+
+ // <span class=XXX>readyState, etc</span>
+
+ void <a href=#dom-peerconnection-send title=dom-PeerConnection-send>send</a>(in DOMString text);
+ void <a href=#dom-peerconnection-addstream title=dom-PeerConnection-addStream>addStream</a>(in <a href=#stream>Stream</a> stream);
+ void <a href=#dom-peerconnection-removestream title=dom-PeerConnection-removeStream>removeStream</a>(in <a href=#stream>Stream</a> stream);
+ readonly attribute <a href=#stream>Stream</a>[] <a href=#dom-peerconnection-localstreams title=dom-PeerConnection-localStreams>localStreams</a>;
+ readonly attribute <a href=#stream>Stream</a>[] <a href=#dom-peerconnection-remotestreams title=dom-PeerConnection-remoteStreams>remoteStreams</a>;
+
+ // <span class=XXX>connection quality information</span>
+
+ attribute <a href=#function>Function</a> <a href=#handler-peerconnection-ontext title=handler-PeerConnection-ontext>ontext</a>;
+ attribute <a href=#function>Function</a> <a href=#handler-peerconnection-onaddstream title=handler-PeerConnection-onaddstream>onaddstream</a>;
+ attribute <a href=#function>Function</a> <a href=#handler-peerconnection-onremovestream title=handler-PeerConnection-onremovestream>onremovestream</a>;
+};
+<a href=#peerconnection>PeerConnection</a> implements <a href=#eventtarget>EventTarget</a>;
+
+[Callback=FunctionOnly, NoInterfaceObject]
+interface <dfn id=signalingcallback>SignalingCallback</dfn> {
+ void <span title=dom-SignalingCallback-handleEvent>handleEvent</span>(in <a href=#peerconnection>PeerConnection</a> source, in DOMString message);
+};</pre>
+
+ <p>A <code><a href=#peerconnection>PeerConnection</a></code> allows two users to communicate
+ directly, browser-to-browser. Communications are coordinated via a
+ signaling channel provided by script in the page via the server,
+ e.g. using <code>XMLHttpRequest</code>.</p>
+
+ <dl class=domintro><dt><var title="">connection</var> = new <code title=dom-PeerConnection><a href=#dom-peerconnection>PeerConnection</a></code>(<var title="">configuration</var>, <var title="">signalingCallback</var>)</dt>
+
+ <dd>
+
+ <p>Creates a <code><a href=#peerconnection>PeerConnection</a></code> object.</p>
+
+ <p>The <var title="">configuration</var> string gives the address
+ of a STUN or TURN server to use to establish the connection. <a href=#refsSTUN>[STUN]</a> <a href=#refsTURN>[TURN]</a></p>
+
+ <p>The allowed formats for this string are:</p>
+
+ <dl><dt>"<code title=""><var title="">TYPE</var> 203.0.113.2:3478</code>"
+ <dd>
+ <p>Indicates a specific IP address and port for the server.</p>
+ </dd>
+
+ <dt>"<code title=""><var title="">TYPE</var> relay.example.net:3478</code>"
+ <dd>
+ <p>Indicates a specific host and port for the server; the user agent will look up the IP address in DNS.</p>
+ </dd>
+
+ <dt>"<code title=""><var title="">TYPE</var> example.net</code>"
+ <dd>
+ <p>Indicates a specific domain for the server; the user agent will look up the IP address and port in DNS.</p>
+ </dd>
+
+ </dl><p>The "<code title=""><var title="">TYPE</var></code>" is one of:</p>
+
+ <dl><dt><code title="">STUN</code></dt>
+ <dd>Indicates a STUN server
+
+ <dt><code title="">STUNS</code></dt>
+ <dd>Indicates a STUN server that is to be contacted using a TLS session.
+
+ <dt><code title="">TURN</code></dt>
+ <dd>Indicates a TURN server
+
+ <dt><code title="">TURNS</code></dt>
+ <dd>Indicates a TURN server that is to be contacted using a TLS session.
+
+ </dl><p>The <var title="">signalingCallback</var> argument is a method
+ that will be invoked when the user agent needs to send a message
+ to the other host over the signaling channel. When the callback
+ is invoked, convey its argument (a string) to the other peer using
+ whatever method is being used by the Web application to relay
+ signaling messages. (Messages returned from the other peer are
+ provided back to the user agent using the <code title=dom-PeerConnection-signalingMessage><a href=#dom-peerconnection-signalingmessage>signalingMessage()</a></code>
+ method.)</p>
+
+ </dd>
+
+
+ <dt><var title="">connection</var> . <code title=dom-PeerConnection-signalingMessage><a href=#dom-peerconnection-signalingmessage>signalingMessage</a></code>(<var title="">message</var>)</dt>
+
+ <dd>
+
+ <p>When a message is relayed from the remote peer over the
+ signaling channel is received by the Web application, pass it to
+ the user agent by calling the <code title=dom-PeerConnection-signalingMessage><a href=#dom-peerconnection-signalingmessage>signalingMessage()</a></code>
+ method.</p>
+
+ <p>The order of messages is important. Passing messages to the
+ user agent in a different order than they were generated by the
+ remote peer's user agent can prevent a successful connection from
+ being established or degrade the connection's quality if one is
+ established.</p>
+
+ </dd>
+
+ <dt><var title="">connection</var> . <code title=dom-PeerConnection-send><a href=#dom-peerconnection-send>send</a></code>(<var title="">text</var>)</dt>
+
+ <dd>
+
+ <p>Attempts to send the given text to the remote peer. This uses
+ UDP, which is inherently unreliable; there is no guarantee that
+ every message will be received.</p>
+
+ <p>When a message sent in this manner from the other peer is
+ received, a <code title=event-PeerConnection-text>text</code>
+ event is dispatched at the <code><a href=#peerconnection>PeerConnection</a></code> object.</p>
+
+ </dd>
+
+ <dt><var title="">connection</var> . <code title=dom-PeerConnection-addStream><a href=#dom-peerconnection-addstream>addStream</a></code>(<var title="">stream</var>)</dt>
+
+ <dd>
+
+ <p>Attempts to starting sending the given stream to the remote
+ peer.</p>
+
+ <p>When the other peer starts sending a stream in this manner, an
+ <code title=event-PeerConnection-addstream>addstream</code>
+ event is dispatched at the <code><a href=#peerconnection>PeerConnection</a></code> object.</p>
+
+ </dd>
+
+ <dt><var title="">connection</var> . <code title=dom-PeerConnection-removeStream><a href=#dom-peerconnection-removestream>removeStream</a></code>(<var title="">stream</var>)</dt>
+
+ <dd>
+
+ <p>Steps sending the given stream to the remote peer.</p>
+
+ <p>When the other peer stops sending a stream in this manner, a
+ <code title=event-PeerConnection-removestream>removestream</code>
+ event is dispatched at the <code><a href=#peerconnection>PeerConnection</a></code> object.</p>
+
+ </dd>
+
+ <dt><var title="">connection</var> . <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code></dt>
+
+ <dd>
+
+ <p>Returns a live array containing the streams that the user agent
+ is currently attempting to transmit to the remote peer (those that
+ were added with <code title=dom-PeerConnection-addStream><a href=#dom-peerconnection-addstream>addStream()</a></code>).</p>
+
+ </dd>
+
+ <dt><var title="">connection</var> . <code title=dom-PeerConnection-remoteStreams><a href=#dom-peerconnection-remotestreams>remoteStreams</a></code></dt>
+
+ <dd>
+
+ <p>Returns a live array containing the streams that the user agent
+ is currently receiving from the remote peer.</p>
+
+ <p>This array is updated when <code title=event-PeerConnection-addstream>addstream</code> and <code title=event-PeerConnection-removestream>removestream</code>
+ events are fired.</p>
+
+ </dd>
+
+ </dl><div class=impl>
+
+ <p>A <code><a href=#peerconnection>PeerConnection</a></code> object has an associated
+ <dfn id=peerconnection-signaling-callback><code>PeerConnection</code> signaling callback</dfn>, a
+ <dfn id=peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</dfn>, a
+ <dfn id=peerconnection-data-udp-media-stream><code>PeerConnection</code> data UDP media stream</dfn> and an
+ <dfn id=ice-started-flag>ICE started flag</dfn>. These are initialized when the object
+ is created.</p>
+
+ <p>When the <dfn id=dom-peerconnection title=dom-PeerConnection><code>PeerConnection()</code></dfn>
+ constructor is invoked, the user agent must run the following steps.
+ This algorithm has a <a href=#synchronous-section>synchronous section</a> (which is
+ triggered as part of the <a href=#event-loop>event loop</a> algorithm). Steps
+ in the <a href=#synchronous-section>synchronous section</a> are marked with
+ ⌛.</p>
+
+ <ol><li><p>Let <var title="">serverConfiguration</var> be the constructor's
+ first argument.</li>
+
+ <li><p>Let <var title="">signalingCallback</var> be the
+ constructor's second argument.</li>
+
+ <li><p>If <var title="">signalingCallback</var> is null, throw a
+ <code>TypeError</code> exception and abort these steps.</li>
+
+ <li><p>Let <var title="">connection</var> be a newly created
+ <code><a href=#peerconnection>PeerConnection</a></code> object.</li>
+
+ <li><p>Create an ICE Agent and let <var title="">connection</var>'s
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> be that ICE
+ Agent. <a href=#refsICE>[ICE]</a></li>
+
+ <li><p>If <var title="">serverConfiguration</var> contains a U+000A LINE
+ FEED (LF) character or a U+000D CARRIAGE RETURN (CR) character (or
+ both), remove all characters from <var title="">serverConfiguration</var>
+ after the first such character.</li>
+
+ <li><p><a href=#split-a-string-on-spaces title="split a string on spaces">Split <var title="">serverConfiguration</var> on spaces</a> to obtain <var title="">configuration components</var>.</li>
+
+ <li>
+
+ <p>If <var title="">configuration components</var> has two or more
+ components, and the first component is a
+ <a href=#case-sensitive>case-sensitive</a> match for one of the following
+ strings:</p>
+
+ <ul class=brief><li>"<code title="">STUN</code>"
+ <li>"<code title="">STUNS</code>"
+ <li>"<code title="">TURN</code>"
+ <li>"<code title="">TURNS</code>"
+ </ul><p>...then run the following substeps:</p>
+
+ <ol><li><p>Let <var title="">server type</var> be STUN if the first
+ component of <var title="">configuration components</var> is
+ "<code title="">STUN</code>" or "<code title="">STUNS</code>",
+ and TURN otherwise (the first component of <var title="">configuration components</var> is "<code title="">TURN</code>" or "<code title="">TURNS</code>").</p>
+
+ <li><p>Let <var title="">secure</var> be true if the first
+ component of <var title="">configuration components</var> is
+ "<code title="">STUNS</code>" or "<code title="">TURNS</code>",
+ and false otherwise.</p>
+
+ <li><p>Let <var title="">host</var> be the contents of the second
+ component of <var title="">configuration components</var> up to
+ the character before the first U+003A COLON character (:), if
+ any, or the entire string otherwise.</li>
+
+ <li><p>Let <var title="">port</var> be the contents of the second
+ component of <var title="">configuration components</var> from
+ the character after the first U+003A COLON character (:) up to
+ the end, if any, or the empty string otherwise.</li>
+
+ <li>
+
+ <p>Configure the <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE
+ Agent</a>'s STUN or TURN server as follows:</p>
+
+ <ul><li>If <var title="">server type</var> is STUN, the server is a
+ STUN server. Otherwise, <var title="">server type</var> is TURN
+ and the server is a TURN server.</li>
+
+ <li>If <var title="">secure</var> is true, the server is to be
+ contacted using TLS-over-TCP, otherwise, it is to be contacted
+ using UDP.</li>
+
+ <li>The IP address, host name, or domain name of the server is
+ <var title="">host</var>.</li>
+
+ <li>The port to use is <var title="">port</var>. If this is the
+ empty string, then only a domain name is configured (and the
+ ICE Agent will use DNS SRV requests to determine the IP address
+ and port).</li>
+
+ <li>The long-term username for the the STUN or TURN server is
+ the <a href=#ascii-serialization-of-an-origin title="ASCII serialization of an origin">ASCII
+ serialization</a> of the <a href=#entry-script>entry script</a>'s
+ <a href=#origin>origin</a>; the long-term password is the empty
+ string.</li>
+
+ </ul><p>If the given IP address, host name, domain name, or port are
+ invalid, then the user agent must act as if no STUN or TURN
+ server is configured.</p>
+
+ </li>
+
+ </ol></li>
+
+ <li><p>Let the <var title="">connection</var>'s
+ <a href=#peerconnection-signaling-callback><code>PeerConnection</code> signaling callback</a> be
+ <var title="">signalingCallback</var>.</li>
+
+ <li><p>Set <var title="">connection</var>'s <a href=#ice-started-flag>ICE started
+ flag</a> to false.</li>
+
+ <li><p>Let <var title="">connection</var>'s
+ <a href=#peerconnection-data-udp-media-stream><code>PeerConnection</code> data UDP media stream</a> be a
+ new <a href=#data-udp-media-stream>data UDP media stream</a>.</li>
+
+ <li><p>Let <var title="">connection</var>'s <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code>
+ attribute be an empty read-only <code><a href=#stream>Stream</a></code> array. <a href=#refsWEBIDL>[WEBIDL]</a></li>
+
+ <li><p>Let <var title="">connection</var>'s <code title=dom-PeerConnection-remoteStreams><a href=#dom-peerconnection-remotestreams>remoteStreams</a></code>
+ attribute be an empty read-only <code><a href=#stream>Stream</a></code> array. <a href=#refsWEBIDL>[WEBIDL]</a></li>
+
+ <li><p>Return <var title="">connection</var>, but continue these
+ steps asynchronously.</li>
+
+ <li><p><a href=#await-a-stable-state>Await a stable state</a>. The <a href=#synchronous-section>synchronous
+ section</a> consists of the remaining steps of this
+ algorithm. (Steps in <a href=#synchronous-section title="synchronous section">synchronous
+ sections</a> are marked with ⌛.)</li>
+
+ <li><p>⌛ If <var title="">connection</var>'s <a href=#ice-started-flag>ICE
+ started flag</a> is still false, start the
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> and send the
+ initial offer. The initial offer must include a media description
+ for the <a href=#peerconnection-data-udp-media-stream><code>PeerConnection</code> data UDP media
+ stream</a> and for all the streams in <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code>. <a href=#refsICE>[ICE]</a></li>
+
+ <li><p>⌛ Let <var title="">connection</var>'s <a href=#ice-started-flag>ICE
+ started flag</a> be true.</li>
+
+ </ol><p>When a <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> is
+ required to send SDP offers or answers, the user agent must follow
+ these steps:</p>
+
+ <ol><li><p>Let <var title="">sdp</var> be the SDP offer or answer to be
+ sent. <a href=#refsSDPOFFERANSWER>[SDPOFFERANSWER]</a></li>
+
+ <li><p>Let <var title="">message</var> be the concatenation of the
+ string "<code title="">SDP</code>", a U+000A LINE FEED (LF)
+ character, and <var title="">sdp</var>, in that order.</li>
+
+ <li><p><a href=#queue-a-task>Queue a task</a> to invoke that
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a>'s
+ <a href=#peerconnection-signaling-callback><code>PeerConnection</code> signaling callback</a> with
+ <var title="">message</var> as its argument.</li>
+
+ </ol><p>All SDP media descriptions for streams represented by
+ <code><a href=#stream>Stream</a></code> objects must include a label attribute ("<code title="">a=label:</code>") whose value is the value of the
+ <code><a href=#stream>Stream</a></code> object's <code title=dom-stream-label><a href=#dom-stream-label>label</a></code> attribute. <a href=#refsSDP>[SDP]</a> <a href=#refsSDPLABEL>[SDPLABEL]</a></p>
+
+ <p><a href=#peerconnection-ice-agent title="PeerConnection ICE
+ Agent"><code>PeerConnection</code> ICE Agents</a> must not
+ generate any candidates for media streams whose media descriptions
+ do not have a label attribute ("<code title="">a=label:</code>"). <a href=#refsICE>[ICE]</a> <a href=#refsSDP>[SDP]</a> <a href=#refsSDPLABEL>[SDPLABEL]</a></p>
+
+ <p>When a user agent starts receiving media for a component an a
+ candidate provided for that component by a
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a>, the user agent
+ must follow these steps:</p>
+
+ <ol><li><p>Let <var title="">connection</var> be the
+ <code><a href=#peerconnection>PeerConnection</a></code> whose ICE Agent is expecting this
+ media.</li>
+
+ <li><p>If there is already a <code><a href=#stream>Stream</a></code> object for the
+ media stream to which this component belongs, then associate the
+ component with that media stream and abort these steps. (Some media
+ streams have multiple components; this API does not expose the
+ role of these individual components in ICE.)</li>
+
+ <li><p>Create a <code><a href=#stream>Stream</a></code> object to represent the media
+ stream. Set its <code title=attr-stream-label>label</code>
+ attribute to the value of the SDP Label attribute for that
+ component's media stream.</li>
+
+ <li><p><a href=#queue-a-task>Queue a task</a> to add the newly created
+ <code><a href=#stream>Stream</a></code> object to the end of <var title="">connection</var>'s <code title=dom-PeerConnection-remoteStreams><a href=#dom-peerconnection-remotestreams>remoteStreams</a></code>
+ array, then <a href=#fire-a-stream-event>fire a stream event</a> named <code title=event-stream-addstream>addstream</code> with the newly
+ created <code><a href=#stream>Stream</a></code> object at the <var title="">connection</var> object.</li>
+
+ </ol><p>When a <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> finds
+ that a stream from the remote peer has been removed (its port has
+ been set to zero in a media description sent on the signaling
+ channel), the user agent must follow these steps:</p>
+
+ <ol><li><p>Let <var title="">connection</var> be the
+ <code><a href=#peerconnection>PeerConnection</a></code> whose <a href=#peerconnection-ice-agent><code>PeerConnection</code>
+ ICE Agent</a> has determined that a stream is being removed.</li>
+
+ <li><p>Let <var title="">stream</var> be the <code><a href=#stream>Stream</a></code>
+ object that represents the media stream being removed, if any. If
+ there isn't one, then abort these steps.</li>
+
+ <li><p><a href=#queue-a-task>Queue a task</a> to remove <var title="">stream</var> from <var title="">connection</var>'s <code title=dom-PeerConnection-remoteStreams><a href=#dom-peerconnection-remotestreams>remoteStreams</a></code>
+ array, then <a href=#fire-a-stream-event>fire a stream event</a> named <code title=event-stream-removestream>removestream</code> with <var title="">stream</var> at the <var title="">connection</var>
+ object.</li>
+
+ </ol><p>When the <dfn id=dom-peerconnection-signalingmessage title=dom-PeerConnection-signalingMessage><code title="">signalingMessage()</code></dfn> method is invoked, the
+ user agent must run the following steps:</p>
+
+ <ol><li><p>Let <var title="">message</var> be the method's
+ argument.</li>
+
+ <li>
+
+ <p>If the first four characters of <var title="">message</var> are
+ not "<code title="">SDP</code>" followed by a U+000A LINE FEED
+ (LF) character, then abort these steps. (This indicates an error
+ in the signaling channel implementation. User agents may report
+ such errors to their developer consoles to aid debugging.)</p>
+
+ <p class=note>Future extensions to the
+ <code><a href=#peerconnection>PeerConnection</a></code> interface might use other prefix
+ values to implement additional features.</p>
+
+ </li>
+
+ <li><p>Let <var title="">sdp</var> be the string consisting of all
+ but the first four characters of <var title="">message</var>.</li>
+
+ <li>
+
+ <p>If <var title="">connection</var>'s <a href=#ice-started-flag>ICE started
+ flag</a> is still false, start the
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> and pass it
+ <var title="">sdp</var> as the initial offer from the other peer;
+ the ICE Agent will then (asynchronously) construct the initial
+ answer and transmit it as described above. The initial answer must
+ include a media description for the
+ <a href=#peerconnection-data-udp-media-stream><code>PeerConnection</code> data UDP media stream</a> and
+ for all the streams in <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code>. <a href=#refsICE>[ICE]</a></p>
+
+ <p>If <var title="">connection</var>'s <a href=#ice-started-flag>ICE started
+ flag</a> is true, then pass <var title="">sdp</var> to the
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> as a subsequent
+ offer or answer, to be interpreted as appropriate given the
+ current state of the ICE Agent. <a href=#refsICE>[ICE]</a></p>
+
+ </li>
+
+ <li><p>Let <var title="">connection</var>'s <a href=#ice-started-flag>ICE started
+ flag</a> be true.</li>
+
+ </ol><p>When the <dfn id=dom-peerconnection-send title=dom-PeerConnection-send><code title="">send()</code></dfn> method is invoked, the
+ user agent must run the following steps:</p>
+
+ <ol><li><p>Let <var title="">message</var> be the method's first
+ argument.</li>
+
+ <li><p>Let <var title="">data</var> be <var title="">message</var>
+ encoded as UTF-8. <a href=#refsRFC3629>[RFC3629]</a></li>
+
+ <li><p>If <var title="">data</var> is longer than 65470 bytes,
+ throw an <code><a href=#invalid_access_err>INVALID_ACCESS_ERR</a></code> exception and abort these
+ steps.</li>
+ <!-- 65470 = 65535 (64K, max IP size) - 40 (IP header) - 8 (UDP header) - 16 (nonce) - 1 (payload type byte) -->
+
+ <li><p>If the <code><a href=#peerconnection>PeerConnection</a></code>'s
+ <a href=#peerconnection-data-udp-media-stream><code>PeerConnection</code> data UDP media stream</a> is
+ not an <a href=#active-data-udp-media-stream>active data UDP media stream</a>, abort these
+ steps. No message is sent.</li>
+
+ <li><p><a href=#transmit-a-data-packet-to-a-peer>Transmit a data packet to a peer</a> using the
+ <code><a href=#peerconnection>PeerConnection</a></code>'s <a href=#peerconnection-data-udp-media-stream><code>PeerConnection</code>
+ data UDP media stream</a> with <var title="">data</var> as the
+ message.</li>
+
+ </ol><p>When the <dfn id=dom-peerconnection-addstream title=dom-PeerConnection-addStream><code title="">addStream()</code></dfn> method is invoked, the user agent
+ must run the following steps:</p>
+
+ <ol><li><p>Let <var title="">stream</var> be the method's
+ argument.</li>
+
+ <li><p>If <var title="">stream</var> is null, throw a
+ <code>TypeError</code> exception and abort these steps.</li>
+
+ <li><p>If <var title="">stream</var> is already in the
+ <code><a href=#peerconnection>PeerConnection</a></code> object's <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code> object,
+ then abort these steps.</li>
+
+ <li><p>Add <var title="">stream</var> to the end of the
+ <code><a href=#peerconnection>PeerConnection</a></code> object's <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code>
+ object.</li>
+
+ <li><p>If the <code><a href=#peerconnection>PeerConnection</a></code>'s <a href=#ice-started-flag>ICE
+ started flag</a> is false, then abort these steps.</li>
+
+ <li><p>Have the <code><a href=#peerconnection>PeerConnection</a></code>'s
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> add a media
+ stream for <var title="">stream</var>. <a href=#refsICE>[ICE]</a></li> <!-- section 9.1.1.3 -->
+
+ </ol><p>When the <dfn id=dom-peerconnection-removestream title=dom-PeerConnection-removeStream><code title="">removeStream()</code></dfn> method is invoked, the user agent
+ must run the following steps:</p>
+
+ <ol><li><p>Let <var title="">stream</var> be the method's
+ argument.</li>
+
+ <li><p>If <var title="">stream</var> is null, throw a
+ <code>TypeError</code> exception and abort these steps.</li>
+
+ <li><p>If <var title="">stream</var> is not in the
+ <code><a href=#peerconnection>PeerConnection</a></code> object's <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code> object,
+ then abort these steps.</li>
+
+ <li><p>Remove <var title="">stream</var> from the
+ <code><a href=#peerconnection>PeerConnection</a></code> object's <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code>
+ object.</li>
+
+ <li><p>If the <code><a href=#peerconnection>PeerConnection</a></code>'s <a href=#ice-started-flag>ICE
+ started flag</a> is false, then abort these steps.</li>
+
+ <li><p>Have the <code><a href=#peerconnection>PeerConnection</a></code>'s
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> remove the media
+ stream for <var title="">stream</var>. <a href=#refsICE>[ICE]</a></li> <!-- section 9.1.1.2 -->
+
+ </ol><p>The <dfn id=dom-peerconnection-localstreams title=dom-PeerConnection-localStreams><code>localStreams</code></dfn>
+ and <dfn id=dom-peerconnection-remotestreams title=dom-PeerConnection-remoteStreams><code>remoteStreams</code></dfn>
+ attributes must return the read-only <code><a href=#stream>Stream</a></code> arrays that
+ the attributes were respectively set to when the
+ <code><a href=#peerconnection>PeerConnection</a></code>'s constructor ran.</p>
+
+ <hr><p>The following are the <a href=#event-handlers>event handlers</a> (and their
+ corresponding <a href=#event-handler-event-type title="event handler event type">event handler
+ event types</a>) that must be supported, as IDL attributes, by
+ all objects implementing the <code><a href=#peerconnection>PeerConnection</a></code>
+ interface:</p>
+
+ <table><thead><tr><th><a href=#event-handlers title="event handlers">Event handler</a> <th><a href=#event-handler-event-type>Event handler event type</a>
+ <tbody><tr><td><dfn id=handler-peerconnection-ontext title=handler-PeerConnection-ontext><code>ontext</code></dfn> <td> <code title=event-stream-text>text</code>
+ <tr><td><dfn id=handler-peerconnection-onaddstream title=handler-PeerConnection-onaddstream><code>onaddstream</code></dfn> <td> <code title=event-stream-addstream>addstream</code>
+ <tr><td><dfn id=handler-peerconnection-onremovestream title=handler-PeerConnection-onremovestream><code>onremovestream</code></dfn> <td> <code title=event-stream-removestream>removestream</code>
+ </table><hr><p>The <a href=#task-source>task source</a> for the <a href=#concept-task title=concept-task>tasks</a> listed in this section is the
+ <a href=#networking-task-source>networking task source</a>.</p>
+
+ </div>
+
+ <div class=example>
+
+ <p>When two peers decide they are going to set up a connection to
+ each other, they both go through these steps. The STUN/TURN server
+ configuration describes a server they can use to get things like
+ their public IP address or to set up NAT traversal. They also have
+ to send data for the signaling channel to each other using the same
+ out-of-band mechanism they used to establish that they were going
+ to communicate in the first place.</p>
+
+ <pre>// the first argument describes the STUN/TURN server configuration
+var local = new PeerConnection('TURNS example.net', sendSignalingChannel);
+local.signalingChannel(...); // if we have a message from the other side, pass it along here
+
+// (aLocalStream is some GeneratedStream object)
+local.addStream(aLocalStream); // start sending video
+
+function sendSignalingChannel(message) {
+ ... // send message to the other side via the signaling channel
+}
+
+function receiveSignalingChannel (message) {
+ // call this whenever we get a message on the signaling channel
+ local.signalingChannel(message);
+}
+
+local.onaddstream = function (event) {
+ // (videoElement is some <video> element)
+ videoElement.src = URL.getObjectURL(event.stream);
+};</pre>
+
+ </div>
+
+ <p class=warning>To prevent network sniffing from allowing a
+ fourth party to establish a connection to a peer using the
+ information sent out-of-band to the other peer and thus spoofing the
+ client, the configuration information should always be transmitted
+ using an encrypted connection.</p>
+
+
+
+ <h4 id=the-data-stream><span class=secno>9.1.4 </span>The data stream</h4>
+
+ <p>All <code><a href=#peerconnection>PeerConnection</a></code> connections include a <dfn id=data-udp-media-stream>data
+ UDP media stream</dfn>, which is used to send data packets
+ peer-to-peer, for instance game control packets. This data channel
+ is unreliable (packets are not guaranteed to be delivered, and are
+ not guaranteed to be delivered in the right order).</p>
+
+ <p>All SDP media descriptions for <a href=#data-udp-media-stream title="data UDP media
+ stream">data UDP media streams</a> must include a label attribute
+ ("<code title="">a=label:</code>") whose value is the string "<code title="">data</code>". <a href=#refsSDP>[SDP]</a> <a href=#refsSDPLABEL>[SDPLABEL]</a></p>
+
+ <p>All SDP media descriptions for <a href=#data-udp-media-stream title="data UDP media
+ stream">data UDP media streams</a> must also include a key field
+ ("<code title="">k=</code>"), with the value being a base64-encoded
+ representation of 16 cryptographically random bytes determined on a
+ per-ICE-Agent basis. <a href=#refsSDP>[SDP]</a></p>
+
+ <p><a href=#peerconnection-ice-agent title="PeerConnection ICE
+ Agent"><code>PeerConnection</code> ICE Agents</a> must attempt to
+ establish a connection for their <a href=#peerconnection-data-udp-media-stream><code>PeerConnection</code>
+ data UDP media stream</a> during the initial offer/answer
+ exchange, and must maintain that UDP media stream for the ICE
+ Agents' whole lifetime.</p>
+
+ <p>A <a href=#data-udp-media-stream>data UDP media stream</a> is an <dfn id=active-data-udp-media-stream>active data UDP
+ media stream</dfn> if the <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE
+ Agent</a> has selected a destination for it. A <a href=#data-udp-media-stream>data UDP
+ media stream</a> can change active status many times during the
+ lifetime of its <code><a href=#peerconnection>PeerConnection</a></code> object (e.g. any time
+ the network topology changes and the ICE Agent performs an ICE
+ Restart). <a href=#refsICE>[ICE]</a></p>
+
+ <p>Bytes transmitted on a <a href=#data-udp-media-stream>data UDP media stream</a> are
+ masked so as to prevent cross-protocol attacks (<a href=#data-udp-media-stream>data UDP media
+ stream</a> always appear to contain random noise to other
+ protocols). For the purposes of masking, the <dfn id=data-udp-media-stream-salt>data UDP media
+ stream salt</dfn> is defined to be the following 16 bytes, described
+ here as hexadecimal numbers: DB 68 B5 FD 17 0E 15 77 56 AF 7A 3A 1A
+ 57 75 02</p> <!-- obtained thusly: head -c 16 /dev/urandom |
+ hexdump -C -->
+
+ <p>When the user agent is to <dfn id=transmit-a-data-packet-to-a-peer>transmit a data packet to a
+ peer</dfn> using a <a href=#data-udp-media-stream>data UDP media stream</a> and with a
+ byte string payload <var title="">data</var>, the user agent must
+ run the following steps:</p>
+
+ <ol><li><p>Let <var title="">nonce</var> be 16 cryptographically random
+ bytes.</li>
+
+ <li><p>Let <var title="">ice-key</var> be the 16 bytes given as the
+ encryption key for the <a href=#data-udp-media-stream>data UDP media stream</a> in its
+ media description, as defined above.</li>
+
+ <li><p>Let <var title="">key</var> be the first 16 bytes of the
+ HMAC-SHA1 of the 16 <var title="">nonce</var> bytes concatenated
+ with the 16 <var title="">ice-key</var> bytes concatenated with the
+ 16 <a href=#data-udp-media-stream-salt>data UDP media stream salt</a> bytes. <a href=#refsHMAC>[HMAC]</a> <a href=#refsSHA1>[SHA1]</a></li>
+
+ <li><p>Let <var title="">message</var> be a 0x01 byte followed by
+ <var title="">data</var>.</li>
+
+ <li><p>Let <var title="">masked message</var> be the result of
+ encrypting <var title="">message</var> using AES-128-CTR keyed with
+ <var title="">key</var>. <a href=#refsAES128CTR>[AES128CTR]</a></li>
+
+ <li><p>Send the concatenation of <var title="">nonce</var> and <var title="">masked message</var> in a UDP packet to the destination
+ that the relevant <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE
+ Agent</a> has selected a destination for the <a href=#data-udp-media-stream>data UDP
+ media stream</a>.</li>
+
+ </ol><p>A <dfn id=remote-data-udp-media-stream>remote data UDP media stream</dfn> is the first UDP media
+ stream whose sender is the remote peer, whose label attribute
+ ("<code title="">a=label:</code>") has the value "<code title="">data</code>", and for which a
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> has selected a
+ destination, if that media stream has an encryption key advertised
+ in its media description, and if that encryption key is 16 bytes
+ long. A <a href=#remote-data-udp-media-stream>remote data UDP media stream</a> is associated with
+ the <code><a href=#peerconnection>PeerConnection</a></code> object for which the
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> in question is
+ operating.</p>
+
+ <p>When a packet from a <a href=#remote-data-udp-media-stream>remote data UDP media stream</a> is
+ received, the user agent must run the following steps:</p>
+
+ <ol><li><p>Let <var title="">data</var> be the UDP packet's data.</li>
+
+ <li><p>If <var title="">data</var> is shorter than 17 bytes, then
+ abort these steps.</li>
+
+ <li><p>Let <var title="">nonce</var> be the first 16 bytes of the
+ <var title="">data</var>.</li>
+
+ <li><p>Let <var title="">ice-key</var> be the 16 bytes given as the
+ encryption key for the <a href=#remote-data-udp-media-stream>remote data UDP media stream</a> in
+ the media description for this media stream. <a href=#refsSDP>[SDP]</a></li>
+
+ <li><p>Let <var title="">key</var> be the first 16 bytes of the
+ HMAC-SHA1 of the 16 <var title="">nonce</var> bytes concatenated
+ with the 16 <var title="">ice-key</var> bytes concatenated with the
+ 16 <a href=#data-udp-media-stream-salt>data UDP media stream salt</a> bytes. <a href=#refsHMAC>[HMAC]</a> <a href=#refsSHA1>[SHA1]</a></li>
+
+ <li><p>Let <var title="">unmasked data</var> be the result of
+ decrypting <var title="">message</var> using AES-128-CTR keyed with
+ <var title="">key</var>. <a href=#refsAES128CTR>[AES128CTR]</a></li>
+
+ <li><p>If the first byte of <var title="">unmasked data</var> is
+ not 0x01, then abort these steps.</li>
+
+ <li><p>Let <var title="">raw message</var> be the string consisting
+ of all but the first character of <var title="">unmasked
+ message</var>.</li>
+
+ <li><p>Let <var title="">message</var> be <var title="">raw
+ message</var> <a href=#decoded-as-utf-8,-with-error-handling>decoded as UTF-8, with error
+ handling</a>.</li>
+
+ <li><p>Create an event that uses the <code><a href=#messageevent>MessageEvent</a></code>
+ interface, with the name <code title=event-text>text</code>,
+ which does not bubble, is not cancelable, has no default action,
+ and has a <code title=dom-MessageEvent-data><a href=#dom-messageevent-data>data</a></code> attribute
+ whose value is <var title="">message</var>, and <a href=#queue-a-task>queue a
+ task</a> to dispatch the event at the
+ <code><a href=#peerconnection>PeerConnection</a></code> object that the <a href=#remote-data-udp-media-stream>remote data UDP
+ media stream</a> is associated with.</li>
+
+ </ol><h4 id=event-definitions-0><span class=secno>9.1.5 </span>Event definitions</h4>
+
+ <p>The <code title=event-stream-addstream>addstream</code> and
+ <code title=event-stream-removestream>removestream</code> events
+ use the <code><a href=#streamevent>StreamEvent</a></code> interface:</p>
+
+ <pre class=idl>interface <dfn id=streamevent>StreamEvent</dfn> : <a href=#event>Event</a> {
+ readonly attribute <a href=#stream>Stream</a> <a href=#dom-streamevent-stream title=dom-StreamEvent-stream>stream</a>;
+ void <a href=#dom-closeevent-initcloseevent title=dom-CloseEvent-initCloseEvent>initCloseEvent</a>(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in <a href=#stream>Stream</a> streamArg);
+};</pre>
+
+ <p>The <dfn id=dom-streamevent-initstreamevent title=dom-StreamEvent-initStreamEvent><code>initStreamEvent()</code></dfn>
+ method must initialize the event in a manner analogous to the
+ similarly-named method in the DOM Events interfaces. <a href=#refsDOMEVENTS>[DOMEVENTS]</a></p>
+
+ <p>The <dfn id=dom-streamevent-stream title=dom-StreamEvent-stream><code>stream</code></dfn>
+ attribute represents the <code><a href=#stream>Stream</a></code> object associated with
+ the event.</p>
+
+ <p><dfn id=fire-a-stream-event title="fire a stream event">Firing a stream event named <var title="">e</var></dfn> with a <code><a href=#stream>Stream</a></code> <var title="">stream</var> means that an event with the name <var title="">e</var>, which does not bubble (except where otherwise
+ stated) and is not cancelable (except where otherwise stated), and
+ which uses the <code><a href=#streamevent>StreamEvent</a></code> interface with the <code title=dom-StreamEvent-stream><a href=#dom-streamevent-stream>stream</a></code> attribute set to <var title="">stream</var>, must be dispatched at the given target.</p>
+
+
+ <h4 id=event-summary><span class=secno>9.1.6 </span>Event Summary</h4>
+
+ <p class=XXX>...will add event summary for streams here...</p>
+
+</div>
+
+
+
+
+
+
+
+
+ <div data-component="Web Workers (editor: Ian Hickson)">
+
+ <h2 id=workers><span class=secno>10 </span>Web workers</h2>
+
+
+
+
+ <h3 id=introduction-9><span class=secno>10.1 </span>Introduction</h3>
+
+ <h4 id=scope-0><span class=secno>10.1.1 </span>Scope</h4>
+
<p><i>This section is non-normative.</i></p>
<p>This specification defines an API for running scripts in the
@@ -71229,14 +72445,14 @@
start-up performance cost, and a high per-instance memory cost.</p>
- <h4 id=tutorial><span class=secno>9.1.2 </span>Tutorial</h4>
+ <h4 id=tutorial><span class=secno>10.1.2 </span>Tutorial</h4>
<p><i>This section is non-normative.</i></p>
<p>There are a variety of uses that workers can be put to. The
following subsections show various examples of this use.</p>
- <h5 id=a-background-number-crunching-worker><span class=secno>9.1.2.1 </span>A background number-crunching worker</h5>
+ <h5 id=a-background-number-crunching-worker><span class=secno>10.1.2.1 </span>A background number-crunching worker</h5>
<p><i>This section is non-normative.</i></p>
@@ -71283,14 +72499,14 @@
}</pre>
<p>The bulk of this code is simply an unoptimized search for a prime
- number. To send a message back to the page, the <code title=dom-DedicatedWorkerGlobalScope-postMessage><a href=#dom-dedicatedworkerglobalscope-postmessage>postMessage()</a></code>
+ number. To send a message back to the page, the <code title=dom-DedicatedWorkerGlobalScope-send>send()</code>
method is used to post a message when a prime is found.</p>
<p><a href=http://www.whatwg.org/demos/workers/primes/page.html>View this example online</a>.</p>
- <h5 id=a-worker-for-updating-a-client-side-database><span class=secno>9.1.2.2 </span>A worker for updating a client-side database</h5>
+ <h5 id=a-worker-for-updating-a-client-side-database><span class=secno>10.1.2.2 </span>A worker for updating a client-side database</h5>
<p><i>This section is non-normative.</i></p>
@@ -71338,7 +72554,7 @@
- <h5 id=worker-used-for-background-i/o><span class=secno>9.1.2.3 </span>Worker used for background I/O</h5>
+ <h5 id=worker-used-for-background-i/o><span class=secno>10.1.2.3 </span>Worker used for background I/O</h5>
<p><i>This section is non-normative.</i></p>
@@ -71445,7 +72661,7 @@
<p><a href=http://www.whatwg.org/demos/workers/stocks/page.html>View this example online</a>.</p>
- <h5 id=shared-workers-introduction><span class=secno>9.1.2.4 </span>Shared workers introduction</h5>
+ <h5 id=shared-workers-introduction><span class=secno>10.1.2.4 </span>Shared workers introduction</h5>
<p><i>This section is non-normative.</i></p>
@@ -71571,7 +72787,7 @@
<p><a href=http://www.whatwg.org/demos/workers/shared/003/test.html>View this example online</a>.</p>
- <h5 id=shared-state-using-a-shared-worker><span class=secno>9.1.2.5 </span>Shared state using a shared worker</h5>
+ <h5 id=shared-state-using-a-shared-worker><span class=secno>10.1.2.5 </span>Shared state using a shared worker</h5>
<p><i>This section is non-normative.</i></p>
@@ -71855,7 +73071,7 @@
<p><a href=http://www.whatwg.org/demos/workers/multiviewer/page.html>View this example online</a>.</p>
- <h5 id=delegation><span class=secno>9.1.2.6 </span>Delegation</h5>
+ <h5 id=delegation><span class=secno>10.1.2.6 </span>Delegation</h5>
<p><i>This section is non-normative.</i></p>
@@ -72187,7 +73403,7 @@
- <h3 id=infrastructure-0><span class=secno>9.2 </span>Infrastructure</h3>
+ <h3 id=infrastructure-0><span class=secno>10.2 </span>Infrastructure</h3>
<p>There are two kinds of workers; dedicated workers, and shared
workers. Dedicated workers, once created, and are linked to their
@@ -72198,11 +73414,11 @@
obtain a reference to that worker and communicate with it.</p>
- <h4 id=the-global-scope><span class=secno>9.2.1 </span>The global scope</h4>
+ <h4 id=the-global-scope><span class=secno>10.2.1 </span>The global scope</h4>
<p>The global scope is the "inside" of a worker.</p>
- <h5 id=the-workerglobalscope-abstract-interface><span class=secno>9.2.1.1 </span>The <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> abstract interface</h5>
+ <h5 id=the-workerglobalscope-abstract-interface><span class=secno>10.2.1.1 </span>The <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> abstract interface</h5>
<pre class=idl>interface <dfn id=workerglobalscope>WorkerGlobalScope</dfn> {
readonly attribute <a href=#workerglobalscope>WorkerGlobalScope</a> <a href=#dom-workerglobalscope-self title=dom-WorkerGlobalScope-self>self</a>;
@@ -72256,7 +73472,7 @@
- <h5 id=dedicated-workers-and-the-dedicatedworkerglobalscope-interface><span class=secno>9.2.1.2 </span>Dedicated workers and the <code><a href=#dedicatedworkerglobalscope>DedicatedWorkerGlobalScope</a></code> interface</h5>
+ <h5 id=dedicated-workers-and-the-dedicatedworkerglobalscope-interface><span class=secno>10.2.1.2 </span>Dedicated workers and the <code><a href=#dedicatedworkerglobalscope>DedicatedWorkerGlobalScope</a></code> interface</h5>
<pre class=idl>[Supplemental, NoInterfaceObject]
interface <dfn id=dedicatedworkerglobalscope>DedicatedWorkerGlobalScope</dfn> : <a href=#workerglobalscope>WorkerGlobalScope</a> {
@@ -72297,7 +73513,7 @@
- <h5 id=shared-workers-and-the-sharedworkerglobalscope-interface><span class=secno>9.2.1.3 </span>Shared workers and the <code><a href=#sharedworkerglobalscope>SharedWorkerGlobalScope</a></code> interface</h5>
+ <h5 id=shared-workers-and-the-sharedworkerglobalscope-interface><span class=secno>10.2.1.3 </span>Shared workers and the <code><a href=#sharedworkerglobalscope>SharedWorkerGlobalScope</a></code> interface</h5>
<pre class=idl>[Supplemental, NoInterfaceObject]
interface <dfn id=sharedworkerglobalscope>SharedWorkerGlobalScope</dfn> : <a href=#workerglobalscope>WorkerGlobalScope</a> {
@@ -72335,7 +73551,7 @@
-->
- <h4 id=origins-of-workers><span class=secno>9.2.2 </span>Origins of workers</h4>
+ <h4 id=origins-of-workers><span class=secno>10.2.2 </span>Origins of workers</h4>
<p>Both the <a href=#origin>origin</a> and <a href=#effective-script-origin>effective script
origin</a> of scripts running in workers are the
@@ -72345,7 +73561,7 @@
- <h4 id=the-event-loop><span class=secno>9.2.3 </span>The event loop</h4>
+ <h4 id=the-event-loop><span class=secno>10.2.3 </span>The event loop</h4>
<p>Each <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object has an <a href=#event-loop>event
loop</a> distinct from those defined for <a href=#unit-of-related-similar-origin-browsing-contexts title="unit of
@@ -72371,7 +73587,7 @@
- <h4 id="the-worker's-lifetime"><span class=secno>9.2.4 </span>The worker's lifetime</h4>
+ <h4 id="the-worker's-lifetime"><span class=secno>10.2.4 </span>The worker's lifetime</h4>
<p>Workers communicate with other workers and with <a href=#browsing-context title="browsing context">browsing contexts</a> through <a href=#channel-messaging title="channel messaging">message channels</a> and their
<code><a href=#messageport>MessagePort</a></code> objects.</p>
@@ -72443,7 +73659,7 @@
<a href=#permissible-worker>permissible worker</a>.</p>
- <h4 id=processing-model-4><span class=secno>9.2.5 </span>Processing model</h4>
+ <h4 id=processing-model-4><span class=secno>10.2.5 </span>Processing model</h4>
<p>When a user agent is to <dfn id=run-a-worker>run a worker</dfn> for a script with
<a href=#url>URL</a> <var title="">url</var>, a <a href=#browsing-context>browsing
@@ -72721,7 +73937,7 @@
<a href=#dom-manipulation-task-source>DOM manipulation task source</a>.</p>
- <h4 id=runtime-script-errors-0><span class=secno>9.2.6 </span>Runtime script errors</h4>
+ <h4 id=runtime-script-errors-0><span class=secno>10.2.6 </span>Runtime script errors</h4>
<p>Whenever an uncaught runtime script error occurs in one of the
worker's scripts, if the error did not occur while handling a
@@ -72780,9 +73996,9 @@
- <h4 id=creating-workers><span class=secno>9.2.7 </span>Creating workers</h4>
+ <h4 id=creating-workers><span class=secno>10.2.7 </span>Creating workers</h4>
- <h5 id=the-abstractworker-abstract-interface><span class=secno>9.2.7.1 </span>The <code><a href=#abstractworker>AbstractWorker</a></code> abstract interface</h5>
+ <h5 id=the-abstractworker-abstract-interface><span class=secno>10.2.7.1 </span>The <code><a href=#abstractworker>AbstractWorker</a></code> abstract interface</h5>
<pre class=idl>[Supplemental, NoInterfaceObject]
interface <dfn id=abstractworker>AbstractWorker</dfn> {
@@ -72799,7 +74015,7 @@
<table><thead><tr><th><a href=#event-handlers title="event handlers">Event handler</a> <th><a href=#event-handler-event-type>Event handler event type</a>
<tbody><tr><td><dfn id=handler-abstractworker-onerror title=handler-AbstractWorker-onerror><code>onerror</code></dfn> <td> <code title=event-error>error</code>
<!-- v2-onclose <tr><td><dfn title="handler-AbstractWorker-onclose"><code>onclose</code></dfn> <td> <code title="event-close">close</code> -->
- </table><h5 id=dedicated-workers-and-the-worker-interface><span class=secno>9.2.7.2 </span>Dedicated workers and the <code><a href=#worker>Worker</a></code> interface</h5>
+ </table><h5 id=dedicated-workers-and-the-worker-interface><span class=secno>10.2.7.2 </span>Dedicated workers and the <code><a href=#worker>Worker</a></code> interface</h5>
<pre class=idl>[<a href=#dom-worker title=dom-Worker>Constructor</a>(in DOMString scriptURL)]
interface <dfn id=worker>Worker</dfn> : <a href=#abstractworker>AbstractWorker</a> {
@@ -72945,7 +74161,7 @@
implementing the <code><a href=#workerutils>WorkerUtils</a></code> interface.</p>
- <h5 id=shared-workers-and-the-sharedworker-interface><span class=secno>9.2.7.3 </span>Shared workers and the <code><a href=#sharedworker>SharedWorker</a></code> interface</h5>
+ <h5 id=shared-workers-and-the-sharedworker-interface><span class=secno>10.2.7.3 </span>Shared workers and the <code><a href=#sharedworker>SharedWorker</a></code> interface</h5>
<pre class=idl>[<a href=#dom-sharedworker title=dom-SharedWorker>Constructor</a>(in DOMString scriptURL, in optional DOMString name)]
interface <dfn id=sharedworker>SharedWorker</dfn> : <a href=#abstractworker>AbstractWorker</a> {
@@ -73160,7 +74376,7 @@
- <h3 id=apis-available-to-workers><span class=secno>9.3 </span>APIs available to workers</h3>
+ <h3 id=apis-available-to-workers><span class=secno>10.3 </span>APIs available to workers</h3>
<pre class=idl>[Supplemental, NoInterfaceObject]
interface <dfn id=workerutils>WorkerUtils</dfn> {
@@ -73174,7 +74390,7 @@
specification.</p>
- <h4 id=importing-scripts-and-libraries><span class=secno>9.3.1 </span>Importing scripts and libraries</h4>
+ <h4 id=importing-scripts-and-libraries><span class=secno>10.3.1 </span>Importing scripts and libraries</h4>
<p>When a script invokes the <dfn id=dom-workerglobalscope-importscripts title=dom-WorkerGlobalScope-importScripts><code>importScripts(<var title="">urls</var>)</code></dfn> method on a
<code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object, the user agent must run the
@@ -73264,7 +74480,7 @@
</ol></li>
- </ol><h4 id=the-workernavigator-object><span class=secno>9.3.2 </span>The <code><a href=#workernavigator>WorkerNavigator</a></code> object</h4>
+ </ol><h4 id=the-workernavigator-object><span class=secno>10.3.2 </span>The <code><a href=#workernavigator>WorkerNavigator</a></code> object</h4>
<p>The <dfn id=dom-worker-navigator title=dom-worker-navigator><code>navigator</code></dfn> attribute
of the <code><a href=#workerutils>WorkerUtils</a></code> interface must return an instance of
@@ -73287,7 +74503,7 @@
- <h4 id=interface-objects-and-constructors><span class=secno>9.3.3 </span>Interface objects and constructors</h4>
+ <h4 id=interface-objects-and-constructors><span class=secno>10.3.3 </span>Interface objects and constructors</h4>
<p>There must be no interface objects and constructors available in
the global scope of scripts whose <a href="#script's-global-object">script's global
@@ -73322,7 +74538,7 @@
visibility of interfaces annotated with the <code title="">[NoInterfaceObject]</code> extended attribute.</p>
- <h4 id=worker-locations><span class=secno>9.3.4 </span>Worker locations</h4>
+ <h4 id=worker-locations><span class=secno>10.3.4 </span>Worker locations</h4>
<pre class=idl>interface <dfn id=workerlocation>WorkerLocation</dfn> {
// <a href=#url-decomposition-idl-attributes>URL decomposition IDL attributes</a>
@@ -73368,13 +74584,13 @@
- <h2 id=comms><span class=secno>10 </span>Communication</h2>
+ <h2 id=comms><span class=secno>11 </span>Communication</h2>
<div data-component="Web Messaging (editor: Ian Hickson)">
- <h3 id=event-definitions-0><span class=secno>10.1 </span>Event definitions</h3>
+ <h3 id=event-definitions-1><span class=secno>11.1 </span>Event definitions</h3>
<p>Messages in <a href=#server-sent-events>server-sent events</a>, <a href=#network>Web
sockets</a>, <a href=#web-messaging>cross-document messaging</a>, and
@@ -73484,13 +74700,13 @@
- <h3 id=server-sent-events><span class=secno>10.2 </span><dfn>Server-sent events</dfn></h3>
+ <h3 id=server-sent-events><span class=secno>11.2 </span><dfn>Server-sent events</dfn></h3>
<div data-component="Server-Sent Events (editor: Ian Hickson)">
- <h4 id=server-sent-events-intro><span class=secno>10.2.1 </span>Introduction</h4>
+ <h4 id=server-sent-events-intro><span class=secno>11.2.1 </span>Introduction</h4>
<p><i>This section is non-normative.</i></p>
@@ -73526,7 +74742,7 @@
discussed further in the section below on <a href=#eventsource-push>connectionless push</a>.</p>
- <h4 id=the-eventsource-interface><span class=secno>10.2.2 </span>The <code><a href=#eventsource>EventSource</a></code> interface</h4>
+ <h4 id=the-eventsource-interface><span class=secno>11.2.2 </span>The <code><a href=#eventsource>EventSource</a></code> interface</h4>
<pre class=idl>[<a href=#dom-eventsource title=dom-EventSource>Constructor</a>(in DOMString url)]
interface <dfn id=eventsource>EventSource</dfn> {
@@ -73648,7 +74864,7 @@
</ul><p>These values are not currently exposed on the interface.</p>
- <h4 id=processing-model-5><span class=secno>10.2.3 </span>Processing model</h4>
+ <h4 id=processing-model-5><span class=secno>11.2.3 </span>Processing model</h4>
<p>The resource indicated in the argument to the <code title=dom-EventSource><a href=#dom-eventsource>EventSource</a></code> constructor is <a href=#fetch title=fetch>fetched</a> when the constructor is run.</p>
@@ -73759,7 +74975,7 @@
<dfn id=remote-event-task-source>remote event task source</dfn>.</p>
- <h4 id=parsing-an-event-stream><span class=secno>10.2.4 </span>Parsing an event stream</h4>
+ <h4 id=parsing-an-event-stream><span class=secno>11.2.4 </span>Parsing an event stream</h4>
<p>This event stream format's <a href=#mime-type>MIME type</a> is
<code><a href=#text/event-stream>text/event-stream</a></code>.</p>
@@ -73800,7 +75016,7 @@
expected line endings can cause delays in event dispatch.</p>
- <h4 id=event-stream-interpretation><span class=secno>10.2.5 </span>Interpreting an event stream</h4>
+ <h4 id=event-stream-interpretation><span class=secno>11.2.5 </span>Interpreting an event stream</h4>
<p>Streams must be <a href=#decoded-as-utf-8,-with-error-handling>decoded as UTF-8, with error
handling</a>.
@@ -74067,7 +75283,7 @@
</div>
- <h4 id=notes><span class=secno>10.2.6 </span>Notes</h4>
+ <h4 id=notes><span class=secno>11.2.6 </span>Notes</h4>
<p>Legacy proxy servers are known to, in certain cases, drop HTTP
connections after a short timeout. To protect against such proxy
@@ -74100,7 +75316,7 @@
</p>
- <h4 id=eventsource-push><span class=secno>10.2.7 </span>Connectionless push and other features</h4>
+ <h4 id=eventsource-push><span class=secno>11.2.7 </span>Connectionless push and other features</h4>
<p>User agents running in controlled environments, e.g. browsers on
mobile handsets tied to specific carriers, may offload the
@@ -74157,7 +75373,7 @@
define how they are to be parsed or processed.</p>
- <h4 id=garbage-collection-0><span class=secno>10.2.8 </span>Garbage collection</h4>
+ <h4 id=garbage-collection-0><span class=secno>11.2.8 </span>Garbage collection</h4>
<p>While an <code><a href=#eventsource>EventSource</a></code> object's <code title=dom-EventSource-readyState><a href=#dom-eventsource-readystate>readyState</a></code> is not <code title=dom-EventSource-CLOSED><a href=#dom-eventsource-closed>CLOSED</a></code>, and the object has one
or more event listeners registered for <code title=event-message><a href=#event-message>message</a></code> events, there must be a strong
@@ -74169,9 +75385,9 @@
its connection is still open, the connection must be closed.</p>
- <h4 id=iana-considerations><span class=secno>10.2.9 </span>IANA considerations</h4>
+ <h4 id=iana-considerations><span class=secno>11.2.9 </span>IANA considerations</h4>
- <h5 id=text/event-stream><span class=secno>10.2.9.1 </span><dfn><code>text/event-stream</code></dfn></h5>
+ <h5 id=text/event-stream><span class=secno>11.2.9.1 </span><dfn><code>text/event-stream</code></dfn></h5>
<p>This registration is for community review and will be submitted
to the IESG for review, approval, and registration with IANA.</p>
@@ -74249,7 +75465,7 @@
<code><a href=#text/event-stream>text/event-stream</a></code> resources.</p>
- <h5 id=last-event-id><span class=secno>10.2.9.2 </span><dfn title=http-last-event-id><code>Last-Event-ID</code></dfn></h5>
+ <h5 id=last-event-id><span class=secno>11.2.9.2 </span><dfn title=http-last-event-id><code>Last-Event-ID</code></dfn></h5>
<p>This section describes a header field for registration in the
Permanent Message Header Field Registry. <a href=#refsRFC3864>[RFC3864]</a></p>
@@ -74271,13 +75487,13 @@
</dl></div><!--data-component-->
- <h3 id=network><span class=secno>10.3 </span><dfn>Web sockets</dfn></h3>
+ <h3 id=network><span class=secno>11.3 </span><dfn>Web sockets</dfn></h3>
<div data-component="WebSocket API (editor: Ian Hickson)">
- <h4 id=network-intro><span class=secno>10.3.1 </span>Introduction</h4>
+ <h4 id=network-intro><span class=secno>11.3.1 </span>Introduction</h4>
<p><i>This section is non-normative.</i></p>
@@ -74291,7 +75507,7 @@
server.</p>
- <h4 id=the-websocket-interface><span class=secno>10.3.2 </span>The <code><a href=#websocket>WebSocket</a></code> interface</h4>
+ <h4 id=the-websocket-interface><span class=secno>11.3.2 </span>The <code><a href=#websocket>WebSocket</a></code> interface</h4>
<pre class=idl>[<a href=#dom-websocket title=dom-WebSocket>Constructor</a>(in DOMString url, in optional DOMString protocols)]
[<a href=#dom-websocket title=dom-WebSocket>Constructor</a>(in DOMString url, in optional DOMString[] protocols)]
@@ -74566,7 +75782,7 @@
<tr><td><dfn id=handler-websocket-onmessage title=handler-WebSocket-onmessage><code>onmessage</code></dfn> <td> <code title=event-message><a href=#event-message>message</a></code>
<tr><td><dfn id=handler-websocket-onerror title=handler-WebSocket-onerror><code>onerror</code></dfn> <td> <code title=event-error>error</code>
<tr><td><dfn id=handler-websocket-onclose title=handler-WebSocket-onclose><code>onclose</code></dfn> <td> <code title=event-close>close</code>
- </table><h4 id=feedback-from-the-protocol><span class=secno>10.3.3 </span>Feedback from the protocol</h4>
+ </table><h4 id=feedback-from-the-protocol><span class=secno>11.3.3 </span>Feedback from the protocol</h4>
<p>When the <i>WebSocket connection is established</i>, the user
agent must <a href=#queue-a-task>queue a task</a> to first change the <code title=dom-WebSocket-readyState><a href=#dom-websocket-readystate>readyState</a></code> attribute's value
@@ -74617,7 +75833,7 @@
source</dfn>.</p>
- <h5 id=event-definitions-1><span class=secno>10.3.3.1 </span>Event definitions</h5>
+ <h5 id=event-definitions-2><span class=secno>11.3.3.1 </span>Event definitions</h5>
<pre class=idl>interface <dfn id=closeevent>CloseEvent</dfn> : <a href=#event>Event</a> {
readonly attribute boolean <a href=#dom-closeevent-wasclean title=dom-CloseEvent-wasClean>wasClean</a>;
@@ -74634,7 +75850,7 @@
- <h5 id=garbage-collection-1><span class=secno>10.3.3.2 </span>Garbage collection</h5>
+ <h5 id=garbage-collection-1><span class=secno>11.3.3.2 </span>Garbage collection</h5>
<p>A <code><a href=#websocket>WebSocket</a></code> object whose <code title=dom-WebSocket-readyState><a href=#dom-websocket-readystate>readyState</a></code> attribute's value
was set to <code title=dom-WebSocket-CONNECTING><a href=#dom-websocket-connecting>CONNECTING</a></code>
@@ -74671,7 +75887,7 @@
- <h3 id=web-messaging><span class=secno>10.4 </span><dfn id=crossDocumentMessages>Cross-document messaging</dfn></h3>
+ <h3 id=web-messaging><span class=secno>11.4 </span><dfn id=crossDocumentMessages>Cross-document messaging</dfn></h3>
<p>Web browsers, for security and privacy reasons, prevent documents
in different domains from affecting each other; that is, cross-site
@@ -74692,7 +75908,7 @@
</div>
- <h4 id=introduction-9><span class=secno>10.4.1 </span>Introduction</h4>
+ <h4 id=introduction-10><span class=secno>11.4.1 </span>Introduction</h4>
<p><i>This section is non-normative.</i></p>
@@ -74733,11 +75949,11 @@
</div>
- <h4 id=security-postmsg><span class=secno>10.4.2 </span>Security</h4>
+ <h4 id=security-postmsg><span class=secno>11.4.2 </span>Security</h4>
<div class=impl>
- <h5 id=authors><span class=secno>10.4.2.1 </span>Authors</h5>
+ <h5 id=authors><span class=secno>11.4.2.1 </span>Authors</h5>
</div>
@@ -74765,7 +75981,7 @@
<div class=impl>
- <h5 id=user-agents><span class=secno>10.4.2.2 </span>User agents</h5>
+ <h5 id=user-agents><span class=secno>11.4.2.2 </span>User agents</h5>
<p>The integrity of this API is based on the inability for scripts
of one <a href=#origin>origin</a> to post arbitrary events (using <code title="">dispatchEvent()</code> or otherwise) to objects in other
@@ -74781,7 +75997,7 @@
</div>
- <h4 id=posting-messages><span class=secno>10.4.3 </span>Posting messages</h4>
+ <h4 id=posting-messages><span class=secno>11.4.3 </span>Posting messages</h4>
<dl class=domintro><dt><var title="">window</var> . <code title=dom-window-postMessage><a href=#dom-window-postmessage>postMessage</a></code>(<var title="">message</var>, <var title="">targetOrigin</var> [, <var title="">ports</var> ])</dt>
@@ -74923,9 +76139,9 @@
- <h3 id=channel-messaging><span class=secno>10.5 </span><dfn>Channel messaging</dfn></h3>
+ <h3 id=channel-messaging><span class=secno>11.5 </span><dfn>Channel messaging</dfn></h3>
- <h4 id=introduction-10><span class=secno>10.5.1 </span>Introduction</h4>
+ <h4 id=introduction-11><span class=secno>11.5.1 </span>Introduction</h4>
<p><i>This section is non-normative.</i></p>
@@ -74962,7 +76178,7 @@
}</pre>
- <h4 id=message-channels><span class=secno>10.5.2 </span>Message channels</h4>
+ <h4 id=message-channels><span class=secno>11.5.2 </span>Message channels</h4>
<pre class=idl>[<a href=#dom-messagechannel title=dom-MessageChannel>Constructor</a>]
interface <dfn id=messagechannel>MessageChannel</dfn> {
@@ -75031,7 +76247,7 @@
- <h4 id=message-ports><span class=secno>10.5.3 </span>Message ports</h4>
+ <h4 id=message-ports><span class=secno>11.5.3 </span>Message ports</h4>
<p>Each channel has two message ports. Data sent through one port is
received by the other port, and vice versa.</p>
@@ -75318,7 +76534,7 @@
</div>
- <h5 id=ports-and-garbage-collection><span class=secno>10.5.3.1 </span>Ports and garbage collection</h5>
+ <h5 id=ports-and-garbage-collection><span class=secno>11.5.3.1 </span>Ports and garbage collection</h5>
<div class=impl>
@@ -75371,11 +76587,11 @@
<div data-component="Web Storage (editor: Ian Hickson)">
- <h2 id=webstorage><span class=secno>11 </span>Web storage</h2>
+ <h2 id=webstorage><span class=secno>12 </span>Web storage</h2>
- <h3 id=introduction-11><span class=secno>11.1 </span>Introduction</h3>
+ <h3 id=introduction-12><span class=secno>12.1 </span>Introduction</h3>
<p><i>This section is non-normative.</i></p>
@@ -75471,9 +76687,9 @@
- <h3 id=storage><span class=secno>11.2 </span>The API</h3>
+ <h3 id=storage><span class=secno>12.2 </span>The API</h3>
- <h4 id=the-storage-interface><span class=secno>11.2.1 </span>The <code><a href=#storage-0>Storage</a></code> interface</h4>
+ <h4 id=the-storage-interface><span class=secno>12.2.1 </span>The <code><a href=#storage-0>Storage</a></code> interface</h4>
<pre class=idl>interface <dfn id=storage-0>Storage</dfn> {
readonly attribute unsigned long <a href=#dom-storage-length title=dom-Storage-length>length</a>;
@@ -75592,7 +76808,7 @@
underlying list of key/value pairs see is required.</p>
- <h4 id=the-sessionstorage-attribute><span class=secno>11.2.2 </span>The <code title=dom-sessionStorage><a href=#dom-sessionstorage>sessionStorage</a></code> attribute</h4>
+ <h4 id=the-sessionstorage-attribute><span class=secno>12.2.2 </span>The <code title=dom-sessionStorage><a href=#dom-sessionstorage>sessionStorage</a></code> attribute</h4>
<pre class=idl>[Supplemental, NoInterfaceObject]
interface <span>WindowSessionStorage</span> {
@@ -75667,7 +76883,7 @@
storage area, other than <var title="">x</var>, a <code title=event-storage><a href=#event-storage>storage</a></code> event must be fired, as <a href=#event-storage title=event-storage>described below</a>.</p>
- <h4 id=the-localstorage-attribute><span class=secno>11.2.3 </span>The <code title=dom-localStorage><a href=#dom-localstorage>localStorage</a></code> attribute</h4>
+ <h4 id=the-localstorage-attribute><span class=secno>12.2.3 </span>The <code title=dom-localStorage><a href=#dom-localstorage>localStorage</a></code> attribute</h4>
<pre class=idl>[Supplemental, NoInterfaceObject]
interface <span>WindowLocalStorage</span> {
@@ -75727,7 +76943,7 @@
<a href=#obtain-the-storage-mutex>obtain the storage mutex</a>.</p>
- <h5 id=security-localStorage><span class=secno>11.2.3.1 </span>Security</h5>
+ <h5 id=security-localStorage><span class=secno>12.2.3.1 </span>Security</h5>
<p>User agents must raise a <code><a href=#security_err>SECURITY_ERR</a></code> exception
whenever any of the members of a <code><a href=#storage-0>Storage</a></code> object
@@ -75744,7 +76960,7 @@
- <h4 id=the-storage-event><span class=secno>11.2.4 </span>The <code title=event-storage><a href=#event-storage>storage</a></code> event</h4>
+ <h4 id=the-storage-event><span class=secno>12.2.4 </span>The <code title=event-storage><a href=#event-storage>storage</a></code> event</h4>
<p>The <dfn id=event-storage title=event-storage><code>storage</code></dfn> event
is fired when a storage area changes, as described in the previous
@@ -75789,7 +77005,7 @@
local).</p>
- <h5 id=event-definition-0><span class=secno>11.2.4.1 </span>Event definition</h5>
+ <h5 id=event-definition-0><span class=secno>12.2.4.1 </span>Event definition</h5>
<pre class=idl>interface <dfn id=storageevent>StorageEvent</dfn> : <a href=#event>Event</a> {
readonly attribute DOMString <a href=#dom-storageevent-key title=dom-StorageEvent-key>key</a>;
@@ -75823,7 +77039,7 @@
- <h4 id=threads><span class=secno>11.2.5 </span>Threads</h4>
+ <h4 id=threads><span class=secno>12.2.5 </span>Threads</h4>
<p>Because of <a href=#localStorageMutex>the use</a> of the
<a href=#storage-mutex>storage mutex</a>, multiple browsing contexts will be able
@@ -75837,7 +77053,7 @@
itself.</p>
- <h3 id=disk-space-0><span class=secno>11.3 </span>Disk space</h3>
+ <h3 id=disk-space-0><span class=secno>12.3 </span>Disk space</h3>
<p>User agents should limit the total amount of space allowed for
storage areas.</p>
@@ -75865,9 +77081,9 @@
future.</p>
- <h3 id=privacy><span class=secno>11.4 </span>Privacy</h3>
+ <h3 id=privacy><span class=secno>12.4 </span>Privacy</h3>
- <h4 id=user-tracking><span class=secno>11.4.1 </span>User tracking</h4>
+ <h4 id=user-tracking><span class=secno>12.4.1 </span>User tracking</h4>
<p>A third-party advertiser (or any entity capable of getting
content distributed to multiple sites) could use a unique identifier
@@ -75988,7 +77204,7 @@
separate sessions into coherent user profiles.</p>
- <h4 id=sensitivity-of-data><span class=secno>11.4.2 </span>Sensitivity of data</h4>
+ <h4 id=sensitivity-of-data><span class=secno>12.4.2 </span>Sensitivity of data</h4>
<p>User agents should treat persistently stored data as potentially
sensitive; it's quite possible for e-mails, calendar appointments,
@@ -75999,9 +77215,9 @@
it is promptly deleted from the underlying storage.</p>
- <h3 id=security-storage><span class=secno>11.5 </span>Security</h3>
+ <h3 id=security-storage><span class=secno>12.5 </span>Security</h3>
- <h4 id=dns-spoofing-attacks><span class=secno>11.5.1 </span>DNS spoofing attacks</h4>
+ <h4 id=dns-spoofing-attacks><span class=secno>12.5.1 </span>DNS spoofing attacks</h4>
<p>Because of the potential for DNS spoofing attacks, one cannot
guarantee that a host claiming to be in a certain domain really is
@@ -76011,7 +77227,7 @@
storage areas.</p>
- <h4 id=cross-directory-attacks><span class=secno>11.5.2 </span>Cross-directory attacks</h4>
+ <h4 id=cross-directory-attacks><span class=secno>12.5.2 </span>Cross-directory attacks</h4>
<p>Different authors sharing one host name, for example users
hosting content on <code>geocities.com</code>, all share one local
@@ -76026,7 +77242,7 @@
path.</p>
- <h4 id=implementation-risks><span class=secno>11.5.3 </span>Implementation risks</h4>
+ <h4 id=implementation-risks><span class=secno>12.5.3 </span>Implementation risks</h4>
<p>The two primary risks when implementing these persistent storage
features are letting hostile sites read information from other
@@ -76059,7 +77275,7 @@
- <h2 id=syntax><span class=secno>12 </span><dfn>The HTML syntax</dfn></h2>
+ <h2 id=syntax><span class=secno>13 </span><dfn>The HTML syntax</dfn></h2>
<p class=note>This section only describes the rules for resources
labeled with an <a href=#html-mime-type>HTML MIME type</a>. Rules for XML resources
@@ -76067,7 +77283,7 @@
syntax</a>".</p>
- <h3 id=writing><span class=secno>12.1 </span>Writing HTML documents</h3>
+ <h3 id=writing><span class=secno>13.1 </span>Writing HTML documents</h3>
<div class=impl>
@@ -76129,7 +77345,7 @@
as "case-insensitive".</p>
- <h4 id=the-doctype><span class=secno>12.1.1 </span>The DOCTYPE</h4>
+ <h4 id=the-doctype><span class=secno>13.1.1 </span>The DOCTYPE</h4>
<p>A <dfn id=syntax-doctype title=syntax-doctype>DOCTYPE</dfn> is a <!-- mostly
useless but nonetheless --> required preamble.</p>
@@ -76213,7 +77429,7 @@
- <h4 id=elements-0><span class=secno>12.1.2 </span>Elements</h4>
+ <h4 id=elements-0><span class=secno>13.1.2 </span>Elements</h4>
<p>There are five different kinds of <dfn id=syntax-elements title=syntax-elements>elements</dfn>: <a href=#void-elements>void elements</a>,
<a href=#raw-text-elements>raw text elements</a>, <a href=#rcdata-elements>RCDATA elements</a>,
@@ -76335,7 +77551,7 @@
tag name; tag names are case-insensitive.</p>
- <h5 id=start-tags><span class=secno>12.1.2.1 </span>Start tags</h5>
+ <h5 id=start-tags><span class=secno>13.1.2.1 </span>Start tags</h5>
<p><dfn id=syntax-start-tag title=syntax-start-tag>Start tags</dfn> must have the
following format:</p>
@@ -76370,7 +77586,7 @@
<li>Finally, start tags must be closed by a U+003E GREATER-THAN
SIGN character (>).</li>
- </ol><h5 id=end-tags><span class=secno>12.1.2.2 </span>End tags</h5>
+ </ol><h5 id=end-tags><span class=secno>13.1.2.2 </span>End tags</h5>
<p><dfn id=syntax-end-tag title=syntax-end-tag>End tags</dfn> must have the
following format:</p>
@@ -76390,7 +77606,7 @@
<li>Finally, end tags must be closed by a U+003E GREATER-THAN SIGN
character (>).</li>
- </ol><h5 id=attributes-0><span class=secno>12.1.2.3 </span>Attributes</h5>
+ </ol><h5 id=attributes-0><span class=secno>13.1.2.3 </span>Attributes</h5>
<p><dfn id=syntax-attributes title=syntax-attributes>Attributes</dfn> for an element
are expressed inside the element's start tag.</p>
@@ -76584,7 +77800,7 @@
HTML syntax</a>.</p>
- <h5 id=optional-tags><span class=secno>12.1.2.4 </span>Optional tags</h5>
+ <h5 id=optional-tags><span class=secno>13.1.2.4 </span>Optional tags</h5>
<p>Certain tags can be <dfn id=syntax-tag-omission title=syntax-tag-omission>omitted</dfn>.</p>
@@ -76761,7 +77977,7 @@
tag</a> must never be omitted if it has any attributes.</p>
- <h5 id=element-restrictions><span class=secno>12.1.2.5 </span>Restrictions on content models</h5>
+ <h5 id=element-restrictions><span class=secno>13.1.2.5 </span>Restrictions on content models</h5>
<p>For historical reasons, certain elements have extra restrictions
beyond even the restrictions given by their content model.</p>
@@ -76790,7 +78006,7 @@
</div>
- <h5 id=cdata-rcdata-restrictions><span class=secno>12.1.2.6 </span>Restrictions on the contents of raw text and RCDATA elements</h5>
+ <h5 id=cdata-rcdata-restrictions><span class=secno>13.1.2.6 </span>Restrictions on the contents of raw text and RCDATA elements</h5>
<p>The text in <a href=#raw-text-elements title="raw text elements">raw text</a> and
<a href=#rcdata-elements>RCDATA elements</a> must not contain any occurrences of the
@@ -76802,7 +78018,7 @@
U+002F SOLIDUS (/).</p>
- <h4 id=text-1><span class=secno>12.1.3 </span>Text</h4>
+ <h4 id=text-1><span class=secno>13.1.3 </span>Text</h4>
<p><dfn id=syntax-text title=syntax-text>Text</dfn> is allowed inside elements,
attribute values, and comments. Text must consist of Unicode
@@ -76813,7 +78029,7 @@
the text is to be put, as described in the other sections.</p>
- <h5 id=newlines><span class=secno>12.1.3.1 </span>Newlines</h5>
+ <h5 id=newlines><span class=secno>13.1.3.1 </span>Newlines</h5>
<p><dfn id=syntax-newlines title=syntax-newlines>Newlines</dfn> in HTML may be
represented either as U+000D CARRIAGE RETURN (CR) characters, U+000A
@@ -76826,7 +78042,7 @@
represents a <a href=#syntax-newlines title=syntax-newlines>newline</a>.</p>
- <h4 id=character-references><span class=secno>12.1.4 </span>Character references</h4>
+ <h4 id=character-references><span class=secno>13.1.4 </span>Character references</h4>
<p>In certain cases described in other sections, <a href=#syntax-text title=syntax-text>text</a> may be mixed with <dfn id=syntax-charref title=syntax-charref>character references</dfn>. These can be used
to escape characters that couldn't otherwise legally be included in
@@ -76884,7 +78100,7 @@
the <a href=#named-character-references>named character references</a> section.</p>
- <h4 id=cdata-sections><span class=secno>12.1.5 </span>CDATA sections</h4>
+ <h4 id=cdata-sections><span class=secno>13.1.5 </span>CDATA sections</h4>
<p><dfn id=syntax-cdata title=syntax-cdata>CDATA sections</dfn> must consist of
the following components, in this order:</p>
@@ -76915,7 +78131,7 @@
</div>
- <h4 id=comments><span class=secno>12.1.6 </span>Comments</h4>
+ <h4 id=comments><span class=secno>13.1.6 </span>Comments</h4>
<p><dfn id=syntax-comments title=syntax-comments>Comments</dfn> must start with the
four character sequence U+003C LESS-THAN SIGN, U+0021 EXCLAMATION
@@ -76933,7 +78149,7 @@
<div class=impl>
- <h3 id=parsing><span class=secno>12.2 </span>Parsing HTML documents</h3>
+ <h3 id=parsing><span class=secno>13.2 </span>Parsing HTML documents</h3>
<p><i>This section only applies to user agents, data mining tools,
and conformance checkers.</i></p>
@@ -77002,7 +78218,7 @@
<div class=impl>
- <h4 id=overview-of-the-parsing-model><span class=secno>12.2.1 </span>Overview of the parsing model</h4>
+ <h4 id=overview-of-the-parsing-model><span class=secno>13.2.1 </span>Overview of the parsing model</h4>
<p>The input to the HTML parsing process consists of a stream of
Unicode characters, which is passed through a
@@ -77052,7 +78268,7 @@
<div class=impl>
- <h4 id=the-input-stream><span class=secno>12.2.2 </span>The <dfn>input stream</dfn></h4>
+ <h4 id=the-input-stream><span class=secno>13.2.2 </span>The <dfn>input stream</dfn></h4>
<p>The stream of Unicode characters that comprises the input to the
tokenization stage will be initially seen by the user agent as a
@@ -77066,7 +78282,7 @@
specification. This section does not apply to XML documents. <a href=#refsXML>[XML]</a></p>
- <h5 id=determining-the-character-encoding><span class=secno>12.2.2.1 </span>Determining the character encoding</h5>
+ <h5 id=determining-the-character-encoding><span class=secno>13.2.2.1 </span>Determining the character encoding</h5>
<p>In some cases, it might be impractical to unambiguously determine
the encoding before parsing the document. Because of this, this
@@ -77620,7 +78836,7 @@
desire to be maximally compatible with legacy content. <a href=#refsHTTP>[HTTP]</a> <a href=#refsRFC2046>[RFC2046]</a></p>
- <h5 id=character-encodings-0><span class=secno>12.2.2.2 </span>Character encodings</h5>
+ <h5 id=character-encodings-0><span class=secno>13.2.2.2 </span>Character encodings</h5>
<p>User agents must at a minimum support the UTF-8 and Windows-1252
encodings, but may support more. <a href=#refsRFC3629>[RFC3629]</a> <a href=#refsWIN1252>[WIN1252]</a></p>
@@ -77710,7 +78926,7 @@
- <h5 id=preprocessing-the-input-stream><span class=secno>12.2.2.3 </span>Preprocessing the input stream</h5>
+ <h5 id=preprocessing-the-input-stream><span class=secno>13.2.2.3 </span>Preprocessing the input stream</h5>
<p>Given an encoding, the bytes in the input stream must be
converted to Unicode characters for the tokenizer, as described by
@@ -77789,7 +79005,7 @@
the stream, but rather the lack of any further characters.</p>
- <h5 id=changing-the-encoding-while-parsing><span class=secno>12.2.2.4 </span>Changing the encoding while parsing</h5>
+ <h5 id=changing-the-encoding-while-parsing><span class=secno>13.2.2.4 </span>Changing the encoding while parsing</h5>
<p>When the parser requires the user agent to <dfn id=change-the-encoding>change the
encoding</dfn>, it must run the following steps. This might happen
@@ -77846,9 +79062,9 @@
<div class=impl>
- <h4 id=parse-state><span class=secno>12.2.3 </span>Parse state</h4>
+ <h4 id=parse-state><span class=secno>13.2.3 </span>Parse state</h4>
- <h5 id=the-insertion-mode><span class=secno>12.2.3.1 </span>The insertion mode</h5>
+ <h5 id=the-insertion-mode><span class=secno>13.2.3.1 </span>The insertion mode</h5>
<p>The <dfn id=insertion-mode>insertion mode</dfn> is a state variable that controls
the primary operation of the tree construction stage.</p>
@@ -77981,7 +79197,7 @@
<li>Return to the step labeled <i>loop</i>.</li>
- </ol><h5 id=the-stack-of-open-elements><span class=secno>12.2.3.2 </span>The stack of open elements</h5>
+ </ol><h5 id=the-stack-of-open-elements><span class=secno>13.2.3.2 </span>The stack of open elements</h5>
<p>Initially, the <dfn id=stack-of-open-elements>stack of open elements</dfn> is empty. The
stack grows downwards; the topmost node on the stack is the first
@@ -78144,7 +79360,7 @@
the stack is manipulated in a random-access fashion.</p>
- <h5 id=the-list-of-active-formatting-elements><span class=secno>12.2.3.3 </span>The list of active formatting elements</h5>
+ <h5 id=the-list-of-active-formatting-elements><span class=secno>13.2.3.3 </span>The list of active formatting elements</h5>
<p>Initially, the <dfn id=list-of-active-formatting-elements>list of active formatting elements</dfn> is
empty. It is used to handle mis-nested <a href=#formatting title=formatting>formatting element tags</a>.</p>
@@ -78262,7 +79478,7 @@
<li>Go to step 1.</li>
- </ol><h5 id=the-element-pointers><span class=secno>12.2.3.4 </span>The element pointers</h5>
+ </ol><h5 id=the-element-pointers><span class=secno>13.2.3.4 </span>The element pointers</h5>
<p>Initially, the <dfn id=head-element-pointer><code title="">head</code> element
pointer</dfn> and the <dfn id=form-element-pointer><code title="">form</code> element
@@ -78279,7 +79495,7 @@
markup, for historical reasons.</p>
- <h5 id=other-parsing-state-flags><span class=secno>12.2.3.5 </span>Other parsing state flags</h5>
+ <h5 id=other-parsing-state-flags><span class=secno>13.2.3.5 </span>Other parsing state flags</h5>
<p>The <dfn id=scripting-flag>scripting flag</dfn> is set to "enabled" if <a href=#concept-n-script title=concept-n-script>scripting was enabled</a> for the
<code><a href=#document>Document</a></code> with which the parser is associated when the
@@ -78298,7 +79514,7 @@
<div class=impl>
- <h4 id=tokenization><span class=secno>12.2.4 </span><dfn>Tokenization</dfn></h4>
+ <h4 id=tokenization><span class=secno>13.2.4 </span><dfn>Tokenization</dfn></h4>
<p>Implementations must act as if they used the following state
machine to tokenize HTML. The state machine must start in the
@@ -78369,7 +79585,7 @@
error, by unicode, then EOF, ending with "anything else" -->
- <h5 id=data-state><span class=secno>12.2.4.1 </span><dfn>Data state</dfn></h5>
+ <h5 id=data-state><span class=secno>13.2.4.1 </span><dfn>Data state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78391,7 +79607,7 @@
<dd>Emit the <a href=#current-input-character>current input character</a> as a character
token.</dd>
- </dl><h5 id=character-reference-in-data-state><span class=secno>12.2.4.2 </span><dfn>Character reference in data state</dfn></h5>
+ </dl><h5 id=character-reference-in-data-state><span class=secno>13.2.4.2 </span><dfn>Character reference in data state</dfn></h5>
<p>Attempt to <a href=#consume-a-character-reference>consume a character reference</a>, with no
<a href=#additional-allowed-character>additional allowed character</a>.</p>
@@ -78404,7 +79620,7 @@
<p>Finally, switch to the <a href=#data-state>data state</a>.</p>
- <h5 id=rcdata-state><span class=secno>12.2.4.3 </span><dfn>RCDATA state</dfn></h5>
+ <h5 id=rcdata-state><span class=secno>13.2.4.3 </span><dfn>RCDATA state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78426,7 +79642,7 @@
<dd>Emit the <a href=#current-input-character>current input character</a> as a character
token.</dd>
- </dl><h5 id=character-reference-in-rcdata-state><span class=secno>12.2.4.4 </span><dfn>Character reference in RCDATA state</dfn></h5>
+ </dl><h5 id=character-reference-in-rcdata-state><span class=secno>13.2.4.4 </span><dfn>Character reference in RCDATA state</dfn></h5>
<p>Attempt to <a href=#consume-a-character-reference>consume a character reference</a>, with no
<a href=#additional-allowed-character>additional allowed character</a>.</p>
@@ -78439,7 +79655,7 @@
<p>Finally, switch to the <a href=#rcdata-state>RCDATA state</a>.</p>
- <h5 id=rawtext-state><span class=secno>12.2.4.5 </span><dfn>RAWTEXT state</dfn></h5>
+ <h5 id=rawtext-state><span class=secno>13.2.4.5 </span><dfn>RAWTEXT state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78457,7 +79673,7 @@
<dd>Emit the <a href=#current-input-character>current input character</a> as a character
token.</dd>
- </dl><h5 id=script-data-state><span class=secno>12.2.4.6 </span><dfn>Script data state</dfn></h5>
+ </dl><h5 id=script-data-state><span class=secno>13.2.4.6 </span><dfn>Script data state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78475,7 +79691,7 @@
<dd>Emit the <a href=#current-input-character>current input character</a> as a character
token.</dd>
- </dl><h5 id=plaintext-state><span class=secno>12.2.4.7 </span><dfn>PLAINTEXT state</dfn></h5>
+ </dl><h5 id=plaintext-state><span class=secno>13.2.4.7 </span><dfn>PLAINTEXT state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78490,7 +79706,7 @@
<dd>Emit the <a href=#current-input-character>current input character</a> as a character
token.</dd>
- </dl><h5 id=tag-open-state><span class=secno>12.2.4.8 </span><dfn>Tag open state</dfn></h5>
+ </dl><h5 id=tag-open-state><span class=secno>13.2.4.8 </span><dfn>Tag open state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78522,7 +79738,7 @@
character token and reconsume the <a href=#current-input-character>current input
character</a> in the <a href=#data-state>data state</a>.</dd>
- </dl><h5 id=end-tag-open-state><span class=secno>12.2.4.9 </span><dfn>End tag open state</dfn></h5>
+ </dl><h5 id=end-tag-open-state><span class=secno>13.2.4.9 </span><dfn>End tag open state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78552,7 +79768,7 @@
<dd><a href=#parse-error>Parse error</a>. Switch to the <a href=#bogus-comment-state>bogus
comment state</a>.</dd>
- </dl><h5 id=tag-name-state><span class=secno>12.2.4.10 </span><dfn>Tag name state</dfn></h5>
+ </dl><h5 id=tag-name-state><span class=secno>13.2.4.10 </span><dfn>Tag name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78587,7 +79803,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
tag token's tag name.</dd>
- </dl><h5 id=rcdata-less-than-sign-state><span class=secno>12.2.4.11 </span><dfn>RCDATA less-than sign state</dfn></h5>
+ </dl><h5 id=rcdata-less-than-sign-state><span class=secno>13.2.4.11 </span><dfn>RCDATA less-than sign state</dfn></h5>
<!-- identical to the RAWTEXT less-than sign state, except s/RAWTEXT/RCDATA/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78601,7 +79817,7 @@
<a href=#current-input-character>current input character</a> in the <a href=#rcdata-state>RCDATA
state</a>.</dd>
- </dl><h5 id=rcdata-end-tag-open-state><span class=secno>12.2.4.12 </span><dfn>RCDATA end tag open state</dfn></h5>
+ </dl><h5 id=rcdata-end-tag-open-state><span class=secno>13.2.4.12 </span><dfn>RCDATA end tag open state</dfn></h5>
<!-- identical to the RAWTEXT (and Script data) end tag open state, except s/RAWTEXT/RCDATA/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78628,7 +79844,7 @@
character token, and reconsume the <a href=#current-input-character>current input
character</a> in the <a href=#rcdata-state>RCDATA state</a>.</dd>
- </dl><h5 id=rcdata-end-tag-name-state><span class=secno>12.2.4.13 </span><dfn>RCDATA end tag name state</dfn></h5>
+ </dl><h5 id=rcdata-end-tag-name-state><span class=secno>13.2.4.13 </span><dfn>RCDATA end tag name state</dfn></h5>
<!-- identical to the RAWTEXT (and Script data) end tag name state, except s/RAWTEXT/RCDATA/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78673,7 +79889,7 @@
the buffer), and reconsume the <a href=#current-input-character>current input character</a>
in the <a href=#rcdata-state>RCDATA state</a>.</dd>
- </dl><h5 id=rawtext-less-than-sign-state><span class=secno>12.2.4.14 </span><dfn>RAWTEXT less-than sign state</dfn></h5>
+ </dl><h5 id=rawtext-less-than-sign-state><span class=secno>13.2.4.14 </span><dfn>RAWTEXT less-than sign state</dfn></h5>
<!-- identical to the RCDATA less-than sign state, except s/RCDATA/RAWTEXT/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78687,7 +79903,7 @@
<a href=#current-input-character>current input character</a> in the <a href=#rawtext-state>RAWTEXT
state</a>.</dd>
- </dl><h5 id=rawtext-end-tag-open-state><span class=secno>12.2.4.15 </span><dfn>RAWTEXT end tag open state</dfn></h5>
+ </dl><h5 id=rawtext-end-tag-open-state><span class=secno>13.2.4.15 </span><dfn>RAWTEXT end tag open state</dfn></h5>
<!-- identical to the RCDATA (and Script data) end tag open state, except s/RCDATA/RAWTEXT/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78714,7 +79930,7 @@
character token, and reconsume the <a href=#current-input-character>current input
character</a> in the <a href=#rawtext-state>RAWTEXT state</a>.</dd>
- </dl><h5 id=rawtext-end-tag-name-state><span class=secno>12.2.4.16 </span><dfn>RAWTEXT end tag name state</dfn></h5>
+ </dl><h5 id=rawtext-end-tag-name-state><span class=secno>13.2.4.16 </span><dfn>RAWTEXT end tag name state</dfn></h5>
<!-- identical to the RCDATA (and Script data) end tag name state, except s/RCDATA/RAWTEXT/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78759,7 +79975,7 @@
the buffer), and reconsume the <a href=#current-input-character>current input character</a>
in the <a href=#rawtext-state>RAWTEXT state</a>.</dd>
- </dl><h5 id=script-data-less-than-sign-state><span class=secno>12.2.4.17 </span><dfn>Script data less-than sign state</dfn></h5>
+ </dl><h5 id=script-data-less-than-sign-state><span class=secno>13.2.4.17 </span><dfn>Script data less-than sign state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78777,7 +79993,7 @@
<a href=#current-input-character>current input character</a> in the <a href=#script-data-state>script data
state</a>.</dd>
- </dl><h5 id=script-data-end-tag-open-state><span class=secno>12.2.4.18 </span><dfn>Script data end tag open state</dfn></h5>
+ </dl><h5 id=script-data-end-tag-open-state><span class=secno>13.2.4.18 </span><dfn>Script data end tag open state</dfn></h5>
<!-- identical to the RCDATA (and RAWTEXT) end tag open state, except s/RCDATA/Script data/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78804,7 +80020,7 @@
character token, and reconsume the <a href=#current-input-character>current input
character</a> in the <a href=#script-data-state>script data state</a>.</dd>
- </dl><h5 id=script-data-end-tag-name-state><span class=secno>12.2.4.19 </span><dfn>Script data end tag name state</dfn></h5>
+ </dl><h5 id=script-data-end-tag-name-state><span class=secno>13.2.4.19 </span><dfn>Script data end tag name state</dfn></h5>
<!-- identical to the RCDATA (and RAWTEXT) end tag name state, except s/RCDATA/Script data/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78849,7 +80065,7 @@
the buffer), and reconsume the <a href=#current-input-character>current input character</a>
in the <a href=#script-data-state>script data state</a>.</dd>
- </dl><h5 id=script-data-escape-start-state><span class=secno>12.2.4.20 </span><dfn>Script data escape start state</dfn></h5>
+ </dl><h5 id=script-data-escape-start-state><span class=secno>13.2.4.20 </span><dfn>Script data escape start state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78861,7 +80077,7 @@
<dd>Reconsume the <a href=#current-input-character>current input character</a> in the
<a href=#script-data-state>script data state</a>.</dd>
- </dl><h5 id=script-data-escape-start-dash-state><span class=secno>12.2.4.21 </span><dfn>Script data escape start dash state</dfn></h5>
+ </dl><h5 id=script-data-escape-start-dash-state><span class=secno>13.2.4.21 </span><dfn>Script data escape start dash state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78873,7 +80089,7 @@
<dd>Reconsume the <a href=#current-input-character>current input character</a> in the
<a href=#script-data-state>script data state</a>.</dd>
- </dl><h5 id=script-data-escaped-state><span class=secno>12.2.4.22 </span><dfn>Script data escaped state</dfn></h5>
+ </dl><h5 id=script-data-escaped-state><span class=secno>13.2.4.22 </span><dfn>Script data escaped state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78897,7 +80113,7 @@
<dd>Emit the <a href=#current-input-character>current input character</a> as a character
token.</dd>
- </dl><h5 id=script-data-escaped-dash-state><span class=secno>12.2.4.23 </span><dfn>Script data escaped dash state</dfn></h5>
+ </dl><h5 id=script-data-escaped-dash-state><span class=secno>13.2.4.23 </span><dfn>Script data escaped dash state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78922,7 +80138,7 @@
<dd>Switch to the <a href=#script-data-escaped-state>script data escaped state</a>. Emit the
<a href=#current-input-character>current input character</a> as a character token.</dd>
- </dl><h5 id=script-data-escaped-dash-dash-state><span class=secno>12.2.4.24 </span><dfn>Script data escaped dash dash state</dfn></h5>
+ </dl><h5 id=script-data-escaped-dash-dash-state><span class=secno>13.2.4.24 </span><dfn>Script data escaped dash dash state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78950,7 +80166,7 @@
<dd>Switch to the <a href=#script-data-escaped-state>script data escaped state</a>. Emit the
<a href=#current-input-character>current input character</a> as a character token.</dd>
- </dl><h5 id=script-data-escaped-less-than-sign-state><span class=secno>12.2.4.25 </span><dfn>Script data escaped less-than sign state</dfn></h5>
+ </dl><h5 id=script-data-escaped-less-than-sign-state><span class=secno>13.2.4.25 </span><dfn>Script data escaped less-than sign state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -78978,7 +80194,7 @@
<a href=#current-input-character>current input character</a> in the <a href=#script-data-escaped-state>script data
escaped state</a>.</dd>
- </dl><h5 id=script-data-escaped-end-tag-open-state><span class=secno>12.2.4.26 </span><dfn>Script data escaped end tag open state</dfn></h5>
+ </dl><h5 id=script-data-escaped-end-tag-open-state><span class=secno>13.2.4.26 </span><dfn>Script data escaped end tag open state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79004,7 +80220,7 @@
character token, and reconsume the <a href=#current-input-character>current input
character</a> in the <a href=#script-data-escaped-state>script data escaped state</a>.</dd>
- </dl><h5 id=script-data-escaped-end-tag-name-state><span class=secno>12.2.4.27 </span><dfn>Script data escaped end tag name state</dfn></h5>
+ </dl><h5 id=script-data-escaped-end-tag-name-state><span class=secno>13.2.4.27 </span><dfn>Script data escaped end tag name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79048,7 +80264,7 @@
the buffer), and reconsume the <a href=#current-input-character>current input character</a>
in the <a href=#script-data-escaped-state>script data escaped state</a>.</dd>
- </dl><h5 id=script-data-double-escape-start-state><span class=secno>12.2.4.28 </span><dfn>Script data double escape start state</dfn></h5>
+ </dl><h5 id=script-data-double-escape-start-state><span class=secno>13.2.4.28 </span><dfn>Script data double escape start state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79079,7 +80295,7 @@
<dd>Reconsume the <a href=#current-input-character>current input character</a> in the
<a href=#script-data-escaped-state>script data escaped state</a>.</dd>
- </dl><h5 id=script-data-double-escaped-state><span class=secno>12.2.4.29 </span><dfn>Script data double escaped state</dfn></h5>
+ </dl><h5 id=script-data-double-escaped-state><span class=secno>13.2.4.29 </span><dfn>Script data double escaped state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79104,7 +80320,7 @@
<dd>Emit the <a href=#current-input-character>current input character</a> as a character
token.</dd>
- </dl><h5 id=script-data-double-escaped-dash-state><span class=secno>12.2.4.30 </span><dfn>Script data double escaped dash state</dfn></h5>
+ </dl><h5 id=script-data-double-escaped-dash-state><span class=secno>13.2.4.30 </span><dfn>Script data double escaped dash state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79131,7 +80347,7 @@
state</a>. Emit the <a href=#current-input-character>current input character</a> as a
character token.</dd>
- </dl><h5 id=script-data-double-escaped-dash-dash-state><span class=secno>12.2.4.31 </span><dfn>Script data double escaped dash dash state</dfn></h5>
+ </dl><h5 id=script-data-double-escaped-dash-dash-state><span class=secno>13.2.4.31 </span><dfn>Script data double escaped dash dash state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79161,7 +80377,7 @@
state</a>. Emit the <a href=#current-input-character>current input character</a> as a
character token.</dd>
- </dl><h5 id=script-data-double-escaped-less-than-sign-state><span class=secno>12.2.4.32 </span><dfn>Script data double escaped less-than sign state</dfn></h5>
+ </dl><h5 id=script-data-double-escaped-less-than-sign-state><span class=secno>13.2.4.32 </span><dfn>Script data double escaped less-than sign state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79174,7 +80390,7 @@
<dd>Reconsume the <a href=#current-input-character>current input character</a> in the
<a href=#script-data-double-escaped-state>script data double escaped state</a>.</dd>
- </dl><h5 id=script-data-double-escape-end-state><span class=secno>12.2.4.33 </span><dfn>Script data double escape end state</dfn></h5>
+ </dl><h5 id=script-data-double-escape-end-state><span class=secno>13.2.4.33 </span><dfn>Script data double escape end state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79205,7 +80421,7 @@
<dd>Reconsume the <a href=#current-input-character>current input character</a> in the
<a href=#script-data-double-escaped-state>script data double escaped state</a>.</dd>
- </dl><h5 id=before-attribute-name-state><span class=secno>12.2.4.34 </span><dfn>Before attribute name state</dfn></h5>
+ </dl><h5 id=before-attribute-name-state><span class=secno>13.2.4.34 </span><dfn>Before attribute name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79253,7 +80469,7 @@
its value to the empty string. Switch to the <a href=#attribute-name-state>attribute name
state</a>.</dd>
- </dl><h5 id=attribute-name-state><span class=secno>12.2.4.35 </span><dfn>Attribute name state</dfn></h5>
+ </dl><h5 id=attribute-name-state><span class=secno>13.2.4.35 </span><dfn>Attribute name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79306,7 +80522,7 @@
associated with it (if any).</p>
- <h5 id=after-attribute-name-state><span class=secno>12.2.4.36 </span><dfn>After attribute name state</dfn></h5>
+ <h5 id=after-attribute-name-state><span class=secno>13.2.4.36 </span><dfn>After attribute name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79356,7 +80572,7 @@
its value to the empty string. Switch to the <a href=#attribute-name-state>attribute name
state</a>.</dd>
- </dl><h5 id=before-attribute-value-state><span class=secno>12.2.4.37 </span><dfn>Before attribute value state</dfn></h5>
+ </dl><h5 id=before-attribute-value-state><span class=secno>13.2.4.37 </span><dfn>Before attribute value state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79401,7 +80617,7 @@
attribute's value. Switch to the <a href=#attribute-value-(unquoted)-state>attribute value (unquoted)
state</a>.</dd>
- </dl><h5 id=attribute-value-(double-quoted)-state><span class=secno>12.2.4.38 </span><dfn>Attribute value (double-quoted) state</dfn></h5>
+ </dl><h5 id=attribute-value-(double-quoted)-state><span class=secno>13.2.4.38 </span><dfn>Attribute value (double-quoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79426,7 +80642,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
attribute's value.</dd>
- </dl><h5 id=attribute-value-(single-quoted)-state><span class=secno>12.2.4.39 </span><dfn>Attribute value (single-quoted) state</dfn></h5>
+ </dl><h5 id=attribute-value-(single-quoted)-state><span class=secno>13.2.4.39 </span><dfn>Attribute value (single-quoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79451,7 +80667,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
attribute's value.</dd>
- </dl><h5 id=attribute-value-(unquoted)-state><span class=secno>12.2.4.40 </span><dfn>Attribute value (unquoted) state</dfn></h5>
+ </dl><h5 id=attribute-value-(unquoted)-state><span class=secno>13.2.4.40 </span><dfn>Attribute value (unquoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79491,7 +80707,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
attribute's value.</dd>
- </dl><h5 id=character-reference-in-attribute-value-state><span class=secno>12.2.4.41 </span><dfn>Character reference in attribute value state</dfn></h5>
+ </dl><h5 id=character-reference-in-attribute-value-state><span class=secno>13.2.4.41 </span><dfn>Character reference in attribute value state</dfn></h5>
<p>Attempt to <a href=#consume-a-character-reference>consume a character reference</a>.</p>
@@ -79505,7 +80721,7 @@
into this state.</p>
- <h5 id=after-attribute-value-(quoted)-state><span class=secno>12.2.4.42 </span><dfn>After attribute value (quoted) state</dfn></h5>
+ <h5 id=after-attribute-value-(quoted)-state><span class=secno>13.2.4.42 </span><dfn>After attribute value (quoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79531,7 +80747,7 @@
<dd><a href=#parse-error>Parse error</a>. Reconsume the character in
the <a href=#before-attribute-name-state>before attribute name state</a>.</dd>
- </dl><h5 id=self-closing-start-tag-state><span class=secno>12.2.4.43 </span><dfn>Self-closing start tag state</dfn></h5>
+ </dl><h5 id=self-closing-start-tag-state><span class=secno>13.2.4.43 </span><dfn>Self-closing start tag state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79548,7 +80764,7 @@
<dd><a href=#parse-error>Parse error</a>. Reconsume the character in
the <a href=#before-attribute-name-state>before attribute name state</a>.</dd>
- </dl><h5 id=bogus-comment-state><span class=secno>12.2.4.44 </span><dfn>Bogus comment state</dfn></h5>
+ </dl><h5 id=bogus-comment-state><span class=secno>13.2.4.44 </span><dfn>Bogus comment state</dfn></h5>
<p>Consume every character up to and including the first U+003E
GREATER-THAN SIGN character (>) or the end of the file (EOF),
@@ -79567,7 +80783,7 @@
character.</p>
- <h5 id=markup-declaration-open-state><span class=secno>12.2.4.45 </span><dfn>Markup declaration open state</dfn></h5>
+ <h5 id=markup-declaration-open-state><span class=secno>13.2.4.45 </span><dfn>Markup declaration open state</dfn></h5>
<p>If the next two characters are both U+002D HYPHEN-MINUS
characters (-), consume those two characters, create a comment token
@@ -79591,7 +80807,7 @@
comment.</p>
- <h5 id=comment-start-state><span class=secno>12.2.4.46 </span><dfn>Comment start state</dfn></h5>
+ <h5 id=comment-start-state><span class=secno>13.2.4.46 </span><dfn>Comment start state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79616,7 +80832,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the comment
token's data. Switch to the <a href=#comment-state>comment state</a>.</dd>
- </dl><h5 id=comment-start-dash-state><span class=secno>12.2.4.47 </span><dfn>Comment start dash state</dfn></h5>
+ </dl><h5 id=comment-start-dash-state><span class=secno>13.2.4.47 </span><dfn>Comment start dash state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79643,7 +80859,7 @@
<a href=#current-input-character>current input character</a> to the comment token's
data. Switch to the <a href=#comment-state>comment state</a>.</dd>
- </dl><h5 id=comment-state><span class=secno>12.2.4.48 </span><dfn id=comment>Comment state</dfn></h5>
+ </dl><h5 id=comment-state><span class=secno>13.2.4.48 </span><dfn id=comment>Comment state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79663,7 +80879,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the comment
token's data.</dd>
- </dl><h5 id=comment-end-dash-state><span class=secno>12.2.4.49 </span><dfn>Comment end dash state</dfn></h5>
+ </dl><h5 id=comment-end-dash-state><span class=secno>13.2.4.49 </span><dfn>Comment end dash state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79686,7 +80902,7 @@
<a href=#current-input-character>current input character</a> to the comment token's
data. Switch to the <a href=#comment-state>comment state</a>.</dd>
- </dl><h5 id=comment-end-state><span class=secno>12.2.4.50 </span><dfn>Comment end state</dfn></h5>
+ </dl><h5 id=comment-end-state><span class=secno>13.2.4.50 </span><dfn>Comment end state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79722,7 +80938,7 @@
comment token's data. Switch to the <a href=#comment-state>comment
state</a>.</dd>
- </dl><h5 id=comment-end-bang-state><span class=secno>12.2.4.51 </span><dfn>Comment end bang state</dfn></h5>
+ </dl><h5 id=comment-end-bang-state><span class=secno>13.2.4.51 </span><dfn>Comment end bang state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79752,7 +80968,7 @@
character</a> to the comment token's data. Switch to the
<a href=#comment-state>comment state</a>.</dd>
- </dl><h5 id=doctype-state><span class=secno>12.2.4.52 </span><dfn>DOCTYPE state</dfn></h5>
+ </dl><h5 id=doctype-state><span class=secno>13.2.4.52 </span><dfn>DOCTYPE state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79772,7 +80988,7 @@
<dd><a href=#parse-error>Parse error</a>. Reconsume the character in the
<a href=#before-doctype-name-state>before DOCTYPE name state</a>.</dd>
- </dl><h5 id=before-doctype-name-state><span class=secno>12.2.4.53 </span><dfn>Before DOCTYPE name state</dfn></h5>
+ </dl><h5 id=before-doctype-name-state><span class=secno>13.2.4.53 </span><dfn>Before DOCTYPE name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79809,7 +81025,7 @@
<a href=#current-input-character>current input character</a>. Switch to the <a href=#doctype-name-state>DOCTYPE name
state</a>.</dd>
- </dl><h5 id=doctype-name-state><span class=secno>12.2.4.54 </span><dfn>DOCTYPE name state</dfn></h5>
+ </dl><h5 id=doctype-name-state><span class=secno>13.2.4.54 </span><dfn>DOCTYPE name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79842,7 +81058,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
DOCTYPE token's name.</dd>
- </dl><h5 id=after-doctype-name-state><span class=secno>12.2.4.55 </span><dfn>After DOCTYPE name state</dfn></h5>
+ </dl><h5 id=after-doctype-name-state><span class=secno>13.2.4.55 </span><dfn>After DOCTYPE name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79882,7 +81098,7 @@
</dd>
- </dl><h5 id=after-doctype-public-keyword-state><span class=secno>12.2.4.56 </span><dfn>After DOCTYPE public keyword state</dfn></h5>
+ </dl><h5 id=after-doctype-public-keyword-state><span class=secno>13.2.4.56 </span><dfn>After DOCTYPE public keyword state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79919,7 +81135,7 @@
<i>force-quirks flag</i> to <i>on</i>. Switch to the <a href=#bogus-doctype-state>bogus
DOCTYPE state</a>.</dd>
- </dl><h5 id=before-doctype-public-identifier-state><span class=secno>12.2.4.57 </span><dfn>Before DOCTYPE public identifier state</dfn></h5>
+ </dl><h5 id=before-doctype-public-identifier-state><span class=secno>13.2.4.57 </span><dfn>Before DOCTYPE public identifier state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79955,7 +81171,7 @@
<i>force-quirks flag</i> to <i>on</i>. Switch to the <a href=#bogus-doctype-state>bogus
DOCTYPE state</a>.</dd>
- </dl><h5 id=doctype-public-identifier-(double-quoted)-state><span class=secno>12.2.4.58 </span><dfn>DOCTYPE public identifier (double-quoted) state</dfn></h5>
+ </dl><h5 id=doctype-public-identifier-(double-quoted)-state><span class=secno>13.2.4.58 </span><dfn>DOCTYPE public identifier (double-quoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -79980,7 +81196,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
DOCTYPE token's public identifier.</dd>
- </dl><h5 id=doctype-public-identifier-(single-quoted)-state><span class=secno>12.2.4.59 </span><dfn>DOCTYPE public identifier (single-quoted) state</dfn></h5>
+ </dl><h5 id=doctype-public-identifier-(single-quoted)-state><span class=secno>13.2.4.59 </span><dfn>DOCTYPE public identifier (single-quoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -80005,7 +81221,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
DOCTYPE token's public identifier.</dd>
- </dl><h5 id=after-doctype-public-identifier-state><span class=secno>12.2.4.60 </span><dfn>After DOCTYPE public identifier state</dfn></h5>
+ </dl><h5 id=after-doctype-public-identifier-state><span class=secno>13.2.4.60 </span><dfn>After DOCTYPE public identifier state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -80041,7 +81257,7 @@
<i>force-quirks flag</i> to <i>on</i>. Switch to the <a href=#bogus-doctype-state>bogus
DOCTYPE state</a>.</dd>
- </dl><h5 id=between-doctype-public-and-system-identifiers-state><span class=secno>12.2.4.61 </span><dfn>Between DOCTYPE public and system identifiers state</dfn></h5>
+ </dl><h5 id=between-doctype-public-and-system-identifiers-state><span class=secno>13.2.4.61 </span><dfn>Between DOCTYPE public and system identifiers state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -80076,7 +81292,7 @@
<i>force-quirks flag</i> to <i>on</i>. Switch to the <a href=#bogus-doctype-state>bogus
DOCTYPE state</a>.</dd>
- </dl><h5 id=after-doctype-system-keyword-state><span class=secno>12.2.4.62 </span><dfn>After DOCTYPE system keyword state</dfn></h5>
+ </dl><h5 id=after-doctype-system-keyword-state><span class=secno>13.2.4.62 </span><dfn>After DOCTYPE system keyword state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -80113,7 +81329,7 @@
<i>force-quirks flag</i> to <i>on</i>. Switch to the <a href=#bogus-doctype-state>bogus
DOCTYPE state</a>.</dd>
- </dl><h5 id=before-doctype-system-identifier-state><span class=secno>12.2.4.63 </span><dfn>Before DOCTYPE system identifier state</dfn></h5>
+ </dl><h5 id=before-doctype-system-identifier-state><span class=secno>13.2.4.63 </span><dfn>Before DOCTYPE system identifier state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -80149,7 +81365,7 @@
<i>force-quirks flag</i> to <i>on</i>. Switch to the <a href=#bogus-doctype-state>bogus
DOCTYPE state</a>.</dd>
- </dl><h5 id=doctype-system-identifier-(double-quoted)-state><span class=secno>12.2.4.64 </span><dfn>DOCTYPE system identifier (double-quoted) state</dfn></h5>
+ </dl><h5 id=doctype-system-identifier-(double-quoted)-state><span class=secno>13.2.4.64 </span><dfn>DOCTYPE system identifier (double-quoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -80175,7 +81391,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
DOCTYPE token's system identifier.</dd>
- </dl><h5 id=doctype-system-identifier-(single-quoted)-state><span class=secno>12.2.4.65 </span><dfn>DOCTYPE system identifier (single-quoted) state</dfn></h5>
+ </dl><h5 id=doctype-system-identifier-(single-quoted)-state><span class=secno>13.2.4.65 </span><dfn>DOCTYPE system identifier (single-quoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -80201,7 +81417,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
DOCTYPE token's system identifier.</dd>
- </dl><h5 id=after-doctype-system-identifier-state><span class=secno>12.2.4.66 </span><dfn>After DOCTYPE system identifier state</dfn></h5>
+ </dl><h5 id=after-doctype-system-identifier-state><span class=secno>13.2.4.66 </span><dfn>After DOCTYPE system identifier state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -80226,7 +81442,7 @@
state</a>. (This does <em>not</em> set the DOCTYPE token's
<i>force-quirks flag</i> to <i>on</i>.)</dd>
- </dl><h5 id=bogus-doctype-state><span class=secno>12.2.4.67 </span><dfn>Bogus DOCTYPE state</dfn></h5>
+ </dl><h5 id=bogus-doctype-state><span class=secno>13.2.4.67 </span><dfn>Bogus DOCTYPE state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -80241,7 +81457,7 @@
<dt>Anything else</dt>
<dd>Ignore the character.</dd>
- </dl><h5 id=cdata-section-state><span class=secno>12.2.4.68 </span><dfn>CDATA section state</dfn></h5>
+ </dl><h5 id=cdata-section-state><span class=secno>13.2.4.68 </span><dfn>CDATA section state</dfn></h5>
<p>Consume every character up to the next occurrence of the three
character sequence U+005D RIGHT SQUARE BRACKET U+005D RIGHT SQUARE
@@ -80260,7 +81476,7 @@
- <h5 id=tokenizing-character-references><span class=secno>12.2.4.69 </span>Tokenizing character references</h5>
+ <h5 id=tokenizing-character-references><span class=secno>13.2.4.69 </span>Tokenizing character references</h5>
<p>This section defines how to <dfn id=consume-a-character-reference>consume a character
reference</dfn>. This definition is used when parsing character
@@ -80471,7 +81687,7 @@
thing to do is to close some formatting elements from the middle of
the stack when you hit a limit, or something. -->
- <h4 id=tree-construction><span class=secno>12.2.5 </span><dfn>Tree construction</dfn></h4>
+ <h4 id=tree-construction><span class=secno>13.2.5 </span><dfn>Tree construction</dfn></h4>
<p>The input to the tree construction stage is a sequence of tokens
from the <a href=#tokenization>tokenization</a> stage. The tree construction
@@ -80578,7 +81794,7 @@
constraints.</p>
- <h5 id=creating-and-inserting-elements><span class=secno>12.2.5.1 </span>Creating and inserting elements</h5>
+ <h5 id=creating-and-inserting-elements><span class=secno>13.2.5.1 </span>Creating and inserting elements</h5>
<p>When the steps below require the UA to <dfn id=create-an-element-for-the-token title="create an
element for the token">create an element for a token</dfn> in a
@@ -80758,7 +81974,7 @@
<li><p>Then, switch the <a href=#insertion-mode>insertion mode</a> to "<a href=#parsing-main-incdata title="insertion mode: text">text</a>".</li>
- </ol><h5 id=closing-elements-that-have-implied-end-tags><span class=secno>12.2.5.2 </span>Closing elements that have implied end tags</h5>
+ </ol><h5 id=closing-elements-that-have-implied-end-tags><span class=secno>13.2.5.2 </span>Closing elements that have implied end tags</h5>
<p>When the steps below require the UA to <dfn id=generate-implied-end-tags>generate implied end
tags</dfn>, then, while the <a href=#current-node>current node</a> is a
@@ -80774,7 +81990,7 @@
above steps as if that element was not in the above list.</p>
- <h5 id=foster-parenting><span class=secno>12.2.5.3 </span>Foster parenting</h5>
+ <h5 id=foster-parenting><span class=secno>13.2.5.3 </span>Foster parenting</h5>
<p>Foster parenting happens when content is misnested in tables.</p>
@@ -80812,10 +82028,10 @@
- <h5 id=parsing-main-inhtml><span class=secno>12.2.5.4 </span>The rules for parsing tokens in HTML content</h5>
+ <h5 id=parsing-main-inhtml><span class=secno>13.2.5.4 </span>The rules for parsing tokens in HTML content</h5>
- <h6 id=the-initial-insertion-mode><span class=secno>12.2.5.4.1 </span>The "<dfn title="insertion mode: initial">initial</dfn>" insertion mode</h6>
+ <h6 id=the-initial-insertion-mode><span class=secno>13.2.5.4.1 </span>The "<dfn title="insertion mode: initial">initial</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#the-initial-insertion-mode title="insertion mode: initial">initial</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -81008,7 +82224,7 @@
</dd>
- </dl><h6 id=the-before-html-insertion-mode><span class=secno>12.2.5.4.2 </span>The "<dfn title="insertion mode: before html">before html</dfn>" insertion mode</h6>
+ </dl><h6 id=the-before-html-insertion-mode><span class=secno>13.2.5.4.2 </span>The "<dfn title="insertion mode: before html">before html</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#the-before-html-insertion-mode title="insertion mode: before html">before html</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -81091,7 +82307,7 @@
as described in the next section.</p>
- <h6 id=the-before-head-insertion-mode><span class=secno>12.2.5.4.3 </span>The "<dfn title="insertion mode: before head">before head</dfn>" insertion mode</h6>
+ <h6 id=the-before-head-insertion-mode><span class=secno>13.2.5.4.3 </span>The "<dfn title="insertion mode: before head">before head</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#the-before-head-insertion-mode title="insertion mode: before head">before head</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -81156,7 +82372,7 @@
</dd>
- </dl><h6 id=parsing-main-inhead><span class=secno>12.2.5.4.4 </span>The "<dfn title="insertion mode: in head">in head</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-inhead><span class=secno>13.2.5.4.4 </span>The "<dfn title="insertion mode: in head">in head</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-inhead title="insertion mode: in head">in head</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -81322,7 +82538,7 @@
</dd>
- </dl><h6 id=parsing-main-inheadnoscript><span class=secno>12.2.5.4.5 </span>The "<dfn title="insertion mode: in head noscript">in head noscript</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-inheadnoscript><span class=secno>13.2.5.4.5 </span>The "<dfn title="insertion mode: in head noscript">in head noscript</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-inheadnoscript title="insertion mode: in head noscript">in head noscript</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -81382,7 +82598,7 @@
</dd>
- </dl><h6 id=the-after-head-insertion-mode><span class=secno>12.2.5.4.6 </span>The "<dfn title="insertion mode: after head">after head</dfn>" insertion mode</h6>
+ </dl><h6 id=the-after-head-insertion-mode><span class=secno>13.2.5.4.6 </span>The "<dfn title="insertion mode: after head">after head</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#the-after-head-insertion-mode title="insertion mode: after head">after head</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -81472,7 +82688,7 @@
token.</p>
</dd>
- </dl><h6 id=parsing-main-inbody><span class=secno>12.2.5.4.7 </span>The "<dfn title="insertion mode: in body">in body</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-inbody><span class=secno>13.2.5.4.7 </span>The "<dfn title="insertion mode: in body">in body</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-inbody title="insertion mode: in body">in body</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -82734,7 +83950,7 @@
</ol></dd>
- </dl><h6 id=parsing-main-incdata><span class=secno>12.2.5.4.8 </span>The "<dfn title="insertion mode: text">text</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-incdata><span class=secno>13.2.5.4.8 </span>The "<dfn title="insertion mode: text">text</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-incdata title="insertion mode: text">text</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -82886,7 +84102,7 @@
</dd>
- </dl><h6 id=parsing-main-intable><span class=secno>12.2.5.4.9 </span>The "<dfn title="insertion mode: in table">in table</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-intable><span class=secno>13.2.5.4.9 </span>The "<dfn title="insertion mode: in table">in table</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-intable title="insertion mode: in table">in table</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -83089,7 +84305,7 @@
- <h6 id=parsing-main-intabletext><span class=secno>12.2.5.4.10 </span>The "<dfn title="insertion mode: in table text">in table text</dfn>" insertion mode</h6>
+ <h6 id=parsing-main-intabletext><span class=secno>13.2.5.4.10 </span>The "<dfn title="insertion mode: in table text">in table text</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-intabletext title="insertion mode: in table text">in table text</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -83130,7 +84346,7 @@
</dd>
- </dl><h6 id=parsing-main-incaption><span class=secno>12.2.5.4.11 </span>The "<dfn title="insertion mode: in caption">in caption</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-incaption><span class=secno>13.2.5.4.11 </span>The "<dfn title="insertion mode: in caption">in caption</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-incaption title="insertion mode: in caption">in caption</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -83187,7 +84403,7 @@
mode</a>.</p>
</dd>
- </dl><h6 id=parsing-main-incolgroup><span class=secno>12.2.5.4.12 </span>The "<dfn title="insertion mode: in column group">in column group</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-incolgroup><span class=secno>13.2.5.4.12 </span>The "<dfn title="insertion mode: in column group">in column group</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-incolgroup title="insertion mode: in column group">in column group</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -83273,7 +84489,7 @@
</dd>
- </dl><h6 id=parsing-main-intbody><span class=secno>12.2.5.4.13 </span>The "<dfn title="insertion mode: in table body">in table body</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-intbody><span class=secno>13.2.5.4.13 </span>The "<dfn title="insertion mode: in table body">in table body</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-intbody title="insertion mode: in table body">in table body</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -83361,7 +84577,7 @@
case</a>.</p>
- <h6 id=parsing-main-intr><span class=secno>12.2.5.4.14 </span>The "<dfn title="insertion mode: in row">in row</dfn>" insertion mode</h6>
+ <h6 id=parsing-main-intr><span class=secno>13.2.5.4.14 </span>The "<dfn title="insertion mode: in row">in row</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-intr title="insertion mode: in row">in row</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -83451,7 +84667,7 @@
case</a>.</p>
- <h6 id=parsing-main-intd><span class=secno>12.2.5.4.15 </span>The "<dfn title="insertion mode: in cell">in cell</dfn>" insertion mode</h6>
+ <h6 id=parsing-main-intd><span class=secno>13.2.5.4.15 </span>The "<dfn title="insertion mode: in cell">in cell</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-intd title="insertion mode: in cell">in cell</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -83544,7 +84760,7 @@
cell</a> algorithm is invoked.</p>
- <h6 id=parsing-main-inselect><span class=secno>12.2.5.4.16 </span>The "<dfn title="insertion mode: in select">in select</dfn>" insertion mode</h6>
+ <h6 id=parsing-main-inselect><span class=secno>13.2.5.4.16 </span>The "<dfn title="insertion mode: in select">in select</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-inselect title="insertion mode: in select">in select</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -83694,7 +84910,7 @@
<p><a href=#parse-error>Parse error</a>. Ignore the token.</p>
</dd>
- </dl><h6 id=parsing-main-inselectintable><span class=secno>12.2.5.4.17 </span>The "<dfn title="insertion mode: in select in table">in select in table</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-inselectintable><span class=secno>13.2.5.4.17 </span>The "<dfn title="insertion mode: in select in table">in select in table</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-inselectintable title="insertion mode: in select in table">in select in table</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -83725,7 +84941,7 @@
mode</a>.</p>
</dd>
- </dl><h6 id=parsing-main-afterbody><span class=secno>12.2.5.4.18 </span>The "<dfn title="insertion mode: after body">after body</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-afterbody><span class=secno>13.2.5.4.18 </span>The "<dfn title="insertion mode: after body">after body</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-afterbody title="insertion mode: after body">after body</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -83782,7 +84998,7 @@
</dd>
- </dl><h6 id=parsing-main-inframeset><span class=secno>12.2.5.4.19 </span>The "<dfn title="insertion mode: in frameset">in frameset</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-inframeset><span class=secno>13.2.5.4.19 </span>The "<dfn title="insertion mode: in frameset">in frameset</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-inframeset title="insertion mode: in frameset">in frameset</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -83874,7 +85090,7 @@
<p><a href=#parse-error>Parse error</a>. Ignore the token.</p>
</dd>
- </dl><h6 id=parsing-main-afterframeset><span class=secno>12.2.5.4.20 </span>The "<dfn title="insertion mode: after frameset">after frameset</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-afterframeset><span class=secno>13.2.5.4.20 </span>The "<dfn title="insertion mode: after frameset">after frameset</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-afterframeset title="insertion mode: after frameset">after frameset</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -83927,7 +85143,7 @@
<p><a href=#parse-error>Parse error</a>. Ignore the token.</p>
</dd>
- </dl><h6 id=the-after-after-body-insertion-mode><span class=secno>12.2.5.4.21 </span>The "<dfn title="insertion mode: after after body">after after body</dfn>" insertion mode</h6>
+ </dl><h6 id=the-after-after-body-insertion-mode><span class=secno>13.2.5.4.21 </span>The "<dfn title="insertion mode: after after body">after after body</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#the-after-after-body-insertion-mode title="insertion mode: after after body">after after body</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -83960,7 +85176,7 @@
reprocess the token.</p>
</dd>
- </dl><h6 id=the-after-after-frameset-insertion-mode><span class=secno>12.2.5.4.22 </span>The "<dfn title="insertion mode: after after frameset">after after frameset</dfn>" insertion mode</h6>
+ </dl><h6 id=the-after-after-frameset-insertion-mode><span class=secno>13.2.5.4.22 </span>The "<dfn title="insertion mode: after after frameset">after after frameset</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#the-after-after-frameset-insertion-mode title="insertion mode: after after frameset">after after frameset</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -83997,7 +85213,7 @@
<p><a href=#parse-error>Parse error</a>. Ignore the token.</p>
</dd>
- </dl><h5 id=parsing-main-inforeign><span class=secno>12.2.5.5 </span>The rules for parsing tokens <dfn title="insertion mode: in foreign content">in foreign content</dfn></h5>
+ </dl><h5 id=parsing-main-inforeign><span class=secno>13.2.5.5 </span>The rules for parsing tokens <dfn title="insertion mode: in foreign content">in foreign content</dfn></h5>
<p>When the user agent is to apply the rules for parsing tokens in foreign content, the user agent must handle the token as follows:</p>
@@ -84219,7 +85435,7 @@
<div class=impl>
- <h4 id=the-end><span class=secno>12.2.6 </span>The end</h4>
+ <h4 id=the-end><span class=secno>13.2.6 </span>The end</h4>
<p>Once the user agent <dfn id=stop-parsing title="stop parsing">stops parsing</dfn>
the document, the user agent must run the following steps:</p>
@@ -84345,7 +85561,7 @@
<div class=impl>
- <h4 id=coercing-an-html-dom-into-an-infoset><span class=secno>12.2.7 </span>Coercing an HTML DOM into an infoset</h4>
+ <h4 id=coercing-an-html-dom-into-an-infoset><span class=secno>13.2.7 </span>Coercing an HTML DOM into an infoset</h4>
<p>When an application uses an <a href=#html-parser>HTML parser</a> in
conjunction with an XML pipeline, it is possible that the
@@ -84434,7 +85650,7 @@
<div class=impl>
- <h4 id=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</h4>
+ <h4 id=an-introduction-to-error-handling-and-strange-cases-in-the-parser><span class=secno>13.2.8 </span>An introduction to error handling and strange cases in the parser</h4>
<p><i>This section is non-normative.</i></p>
@@ -84442,7 +85658,7 @@
the <a href=#html-parser>HTML parser</a> handles these cases.</p>
- <h5 id=misnested-tags:-b-i-/b-/i><span class=secno>12.2.8.1 </span>Misnested tags: <b><i></b></i></h5>
+ <h5 id=misnested-tags:-b-i-/b-/i><span class=secno>13.2.8.1 </span>Misnested tags: <b><i></b></i></h5>
<p><i>This section is non-normative.</i></p>
@@ -84476,7 +85692,7 @@
received, and the "5" text node is inserted, the DOM looks as
follows:</p>
- <ul class=domTree><li class=t1><code><a href=#the-html-element-0>html</a></code><ul><li class=t1><code><a href=#the-head-element-0>head</a></code><li class=t1><code><a href=#the-body-element-0>body</a></code><ul><li class=t1><code><a href=#the-p-element>p</a></code><ul><li class=t3><code>#text</code>: <span title="">1</span><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">2</span><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t3><code>#text</code>: <span title="">3</span></ul></ul><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t3><code>#text</code>: <span title="">4</span></ul><li class=t3><code>#text</code>: <span title="">5</span></ul></ul></ul></ul><h5 id=misnested-tags:-b-p-/b-/p><span class=secno>12.2.8.2 </span>Misnested tags: <b><p></b></p></h5>
+ <ul class=domTree><li class=t1><code><a href=#the-html-element-0>html</a></code><ul><li class=t1><code><a href=#the-head-element-0>head</a></code><li class=t1><code><a href=#the-body-element-0>body</a></code><ul><li class=t1><code><a href=#the-p-element>p</a></code><ul><li class=t3><code>#text</code>: <span title="">1</span><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">2</span><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t3><code>#text</code>: <span title="">3</span></ul></ul><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t3><code>#text</code>: <span title="">4</span></ul><li class=t3><code>#text</code>: <span title="">5</span></ul></ul></ul></ul><h5 id=misnested-tags:-b-p-/b-/p><span class=secno>13.2.8.2 </span>Misnested tags: <b><p></b></p></h5>
<p><i>This section is non-normative.</i></p>
@@ -84525,7 +85741,7 @@
elements</a>, so that when the "3" is parsed, it is appended to
the <code><a href=#the-p-element>p</a></code> element:</p>
- <ul class=domTree><li class=t1><code><a href=#the-html-element-0>html</a></code><ul><li class=t1><code><a href=#the-head-element-0>head</a></code><li class=t1><code><a href=#the-body-element-0>body</a></code><ul><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">1</span></ul><li class=t1><code><a href=#the-p-element>p</a></code><ul><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">2</span></ul><li class=t3><code>#text</code>: <span title="">3</span></ul></ul></ul></ul><h5 id=unexpected-markup-in-tables><span class=secno>12.2.8.3 </span>Unexpected markup in tables</h5>
+ <ul class=domTree><li class=t1><code><a href=#the-html-element-0>html</a></code><ul><li class=t1><code><a href=#the-head-element-0>head</a></code><li class=t1><code><a href=#the-body-element-0>body</a></code><ul><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">1</span></ul><li class=t1><code><a href=#the-p-element>p</a></code><ul><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">2</span></ul><li class=t3><code>#text</code>: <span title="">3</span></ul></ul></ul></ul><h5 id=unexpected-markup-in-tables><span class=secno>13.2.8.3 </span>Unexpected markup in tables</h5>
<p><i>This section is non-normative.</i></p>
@@ -84624,7 +85840,7 @@
result in yet another <code><a href=#the-b-element>b</a></code> element being created, this
time after the table:</p>
- <ul class=domTree><li class=t1><code><a href=#the-html-element-0>html</a></code><ul><li class=t1><code><a href=#the-head-element-0>head</a></code><li class=t1><code><a href=#the-body-element-0>body</a></code><ul><li class=t1><code><a href=#the-b-element>b</a></code><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">bbb</span></ul><li class=t1><code><a href=#the-table-element>table</a></code><ul><li class=t1><code><a href=#the-tbody-element>tbody</a></code><ul><li class=t1><code><a href=#the-tr-element>tr</a></code><ul><li class=t1><code><a href=#the-td-element>td</a></code><ul><li class=t3><code>#text</code>: <span title="">aaa</span></ul></ul></ul></ul><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">ccc</span></ul></ul></ul></ul><h5 id=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 bein
g parsed</h5>
+ <ul class=domTree><li class=t1><code><a href=#the-html-element-0>html</a></code><ul><li class=t1><code><a href=#the-head-element-0>head</a></code><li class=t1><code><a href=#the-body-element-0>body</a></code><ul><li class=t1><code><a href=#the-b-element>b</a></code><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">bbb</span></ul><li class=t1><code><a href=#the-table-element>table</a></code><ul><li class=t1><code><a href=#the-tbody-element>tbody</a></code><ul><li class=t1><code><a href=#the-tr-element>tr</a></code><ul><li class=t1><code><a href=#the-td-element>td</a></code><ul><li class=t3><code>#text</code>: <span title="">aaa</span></ul></ul></ul></ul><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">ccc</span></ul></ul></ul></ul><h5 id=scripts-that-modify-the-page-as-it-is-being-parsed><span class=secno>13.2.8.4 </span>Scripts that modify the page as it is bein
g parsed</h5>
<p><i>This section is non-normative.</i></p>
@@ -84681,7 +85897,7 @@
<ul class=domTree><li class=t1><code><a href=#the-html-element-0>html</a></code><ul><li class=t1><code><a href=#the-head-element-0>head</a></code><li class=t1><code><a href=#the-body-element-0>body</a></code><ul><li class=t1><code><a href=#script>script</a></code><ul><li class=t3><code>#text</code>: <span title="">alert(document.URL);</span></ul></ul></ul></ul><p>This second alert will say "http://example.com/inner".</p>
- <h5 id=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</h5>
+ <h5 id=the-execution-of-scripts-that-are-moving-across-multiple-documents><span class=secno>13.2.8.5 </span>The execution of scripts that are moving across multiple documents</h5>
<p><i>This section is non-normative.</i></p>
@@ -84697,7 +85913,7 @@
- <h5 id=unclosed-formatting-elements><span class=secno>12.2.8.6 </span>Unclosed formatting elements</h5>
+ <h5 id=unclosed-formatting-elements><span class=secno>13.2.8.6 </span>Unclosed formatting elements</h5>
<p><i>This section is non-normative.</i></p>
@@ -84729,7 +85945,7 @@
- <h3 id=serializing-html-fragments><span class=secno>12.3 </span>Serializing HTML fragments</h3>
+ <h3 id=serializing-html-fragments><span class=secno>13.3 </span>Serializing HTML fragments</h3>
<p>The following steps form the <dfn id=html-fragment-serialization-algorithm>HTML fragment serialization
algorithm</dfn>. The algorithm takes as input a DOM
@@ -84993,7 +86209,7 @@
<li><p>If the algorithm was <em>not</em> invoked in the
<i>attribute mode</i>, replace any occurrences of the "<code title=""><</code>" character by the string "<code title=""><</code>", and any occurrences of the "<code title="">></code>" character by the string "<code title="">></code>".</li>
- </ol><h3 id=parsing-html-fragments><span class=secno>12.4 </span>Parsing HTML fragments</h3>
+ </ol><h3 id=parsing-html-fragments><span class=secno>13.4 </span>Parsing HTML fragments</h3>
<p>The following steps form the <dfn id=html-fragment-parsing-algorithm>HTML fragment parsing
algorithm</dfn>. The algorithm optionally takes as input an
@@ -85167,7 +86383,7 @@
- <h3 id=named-character-references><span class=secno>12.5 </span><dfn>Named character references</dfn></h3>
+ <h3 id=named-character-references><span class=secno>13.5 </span><dfn>Named character references</dfn></h3>
<p>This table lists the character reference names that are supported
by HTML, and the code points to which they refer. It is referenced
@@ -85188,7 +86404,7 @@
- <h2 id=the-xhtml-syntax><span class=secno>13 </span><dfn id=xhtml>The XHTML syntax</dfn></h2>
+ <h2 id=the-xhtml-syntax><span class=secno>14 </span><dfn id=xhtml>The XHTML syntax</dfn></h2>
<p class=note>This section only describes the rules for XML
resources. Rules for <code><a href=#text/html>text/html</a></code> resources are discussed
@@ -85197,7 +86413,7 @@
<div class=impl>
- <h3 id=writing-xhtml-documents><span class=secno>13.1 </span>Writing XHTML documents</h3>
+ <h3 id=writing-xhtml-documents><span class=secno>14.1 </span>Writing XHTML documents</h3>
</div>
@@ -85222,7 +86438,7 @@
<div class=impl>
- <h3 id=parsing-xhtml-documents><span class=secno>13.2 </span>Parsing XHTML documents</h3>
+ <h3 id=parsing-xhtml-documents><span class=secno>14.2 </span>Parsing XHTML documents</h3>
<p>This section describes the relationship between XML and the DOM,
with a particular emphasis on how this interacts with HTML.</p>
@@ -85337,7 +86553,7 @@
- <h3 id=serializing-xhtml-fragments><span class=secno>13.3 </span>Serializing XHTML fragments</h3>
+ <h3 id=serializing-xhtml-fragments><span class=secno>14.3 </span>Serializing XHTML fragments</h3>
<p>The <dfn id=xml-fragment-serialization-algorithm>XML fragment serialization algorithm</dfn> for a
<code><a href=#document>Document</a></code> or <code><a href=#element>Element</a></code> node either returns a
@@ -85434,7 +86650,7 @@
- <h3 id=parsing-xhtml-fragments><span class=secno>13.4 </span>Parsing XHTML fragments</h3>
+ <h3 id=parsing-xhtml-fragments><span class=secno>14.4 </span>Parsing XHTML fragments</h3>
<p>The <dfn id=xml-fragment-parsing-algorithm>XML fragment parsing algorithm</dfn> either returns
a <code><a href=#document>Document</a></code> or raises a <code><a href=#syntax_err>SYNTAX_ERR</a></code>
@@ -85509,7 +86725,7 @@
<div class=impl>
- <h2 id=rendering><span class=secno>14 </span>Rendering</h2>
+ <h2 id=rendering><span class=secno>15 </span>Rendering</h2>
<p><i>User agents are not required to present HTML documents in any
particular way. However, this section provides a set of suggestions
@@ -85525,7 +86741,7 @@
"must".</i></p>
- <h3 id=introduction-12><span class=secno>14.1 </span>Introduction</h3>
+ <h3 id=introduction-13><span class=secno>15.1 </span>Introduction</h3>
<p>In general, user agents are expected to support CSS, and many of
the suggestions in this section are expressed in CSS terms. User
@@ -85561,9 +86777,9 @@
<div class=impl>
- <h3 id=the-css-user-agent-style-sheet-and-presentational-hints><span class=secno>14.2 </span>The CSS user agent style sheet and presentational hints</h3>
+ <h3 id=the-css-user-agent-style-sheet-and-presentational-hints><span class=secno>15.2 </span>The CSS user agent style sheet and presentational hints</h3>
- <h4 id=introduction-13><span class=secno>14.2.1 </span>Introduction</h4>
+ <h4 id=introduction-14><span class=secno>15.2.1 </span>Introduction</h4>
<p>The CSS rules given in these subsections are, except where
otherwise specified, expected to be used as part of the user-agent
@@ -85615,7 +86831,7 @@
<div class=impl>
- <h4 id=display-types><span class=secno>14.2.2 </span>Display types</h4>
+ <h4 id=display-types><span class=secno>15.2.2 </span>Display types</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -85693,7 +86909,7 @@
<div class=impl>
- <h4 id=margins-and-padding><span class=secno>14.2.3 </span>Margins and padding</h4>
+ <h4 id=margins-and-padding><span class=secno>15.2.3 </span>Margins and padding</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -85874,7 +87090,7 @@
<div class=impl>
- <h4 id=alignment><span class=secno>14.2.4 </span>Alignment</h4>
+ <h4 id=alignment><span class=secno>15.2.4 </span>Alignment</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -85995,7 +87211,7 @@
<div class=impl>
- <h4 id=fonts-and-colors><span class=secno>14.2.5 </span>Fonts and colors</h4>
+ <h4 id=fonts-and-colors><span class=secno>15.2.5 </span>Fonts and colors</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -86238,7 +87454,7 @@
<div class=impl>
- <h4 id=punctuation-and-decorations><span class=secno>14.2.6 </span>Punctuation and decorations</h4>
+ <h4 id=punctuation-and-decorations><span class=secno>15.2.6 </span>Punctuation and decorations</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -86414,7 +87630,7 @@
<div class=impl>
- <h4 id=resetting-rules-for-inherited-properties><span class=secno>14.2.7 </span>Resetting rules for inherited properties</h4>
+ <h4 id=resetting-rules-for-inherited-properties><span class=secno>15.2.7 </span>Resetting rules for inherited properties</h4>
<p>The following rules are also expected to be in play, resetting
certain properties to block inheritance by default.</p>
@@ -86451,7 +87667,7 @@
<div class=impl>
- <h4 id=the-hr-element-0><span class=secno>14.2.8 </span>The <code><a href=#the-hr-element>hr</a></code> element</h4>
+ <h4 id=the-hr-element-0><span class=secno>15.2.8 </span>The <code><a href=#the-hr-element>hr</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -86504,7 +87720,7 @@
<div class=impl>
- <h4 id=the-fieldset-element-0><span class=secno>14.2.9 </span>The <code><a href=#the-fieldset-element>fieldset</a></code> element</h4>
+ <h4 id=the-fieldset-element-0><span class=secno>15.2.9 </span>The <code><a href=#the-fieldset-element>fieldset</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -86556,9 +87772,9 @@
<div class=impl>
- <h3 id=replaced-elements><span class=secno>14.3 </span>Replaced elements</h3>
+ <h3 id=replaced-elements><span class=secno>15.3 </span>Replaced elements</h3>
- <h4 id=embedded-content-2><span class=secno>14.3.1 </span>Embedded content</h4>
+ <h4 id=embedded-content-2><span class=secno>15.3.1 </span>Embedded content</h4>
<p>The <code><a href=#the-embed-element>embed</a></code>, <code><a href=#the-iframe-element>iframe</a></code>, and
<code><a href=#video>video</a></code> elements are expected to be treated as replaced
@@ -86635,13 +87851,13 @@
<!--<div data-component="other Hixie drafts (editor: Ian Hickson)">-->
<div class=impl>
- <h4 id=timed-text-tracks-0><span class=secno>14.3.2 </span>Timed text tracks</h4>
+ <h4 id=timed-text-tracks-0><span class=secno>15.3.2 </span>Timed text tracks</h4>
<p class=note>This section is intended to be moved to its own CSS
module once an editor is found to run with it.</p>
- <h5 id=webvtt-cue-text-rendering-rules><span class=secno>14.3.2.1 </span><dfn>WebVTT cue text rendering rules</dfn></h5>
+ <h5 id=webvtt-cue-text-rendering-rules><span class=secno>15.3.2.1 </span><dfn>WebVTT cue text rendering rules</dfn></h5>
<p>The <dfn id=rules-for-updating-the-display-of-webvtt-text-tracks>rules for updating the display of WebVTT text
tracks</dfn> render the <a href=#text-track title="text track">text
@@ -87186,7 +88402,7 @@
<li><p>Return <var title="">output</var>.</li>
- </ol><h5 id=applying-css-properties-to-webvtt-node-objects><span class=secno>14.3.2.2 </span>Applying CSS properties to <a href=#webvtt-node-object title="WebVTT Node Object">WebVTT Node Objects</a></h5>
+ </ol><h5 id=applying-css-properties-to-webvtt-node-objects><span class=secno>15.3.2.2 </span>Applying CSS properties to <a href=#webvtt-node-object title="WebVTT Node Object">WebVTT Node Objects</a></h5>
<p>When following the <a href=#rules-for-updating-the-display-of-webvtt-text-tracks>rules for updating the display of WebVTT
text tracks</a>, user agents must set properties of <a href=#webvtt-node-object title="WebVTT Node Object">WebVTT Node Objects</a> as defined in
@@ -87245,7 +88461,7 @@
values.</p>
- <h5 id=css-extensions><span class=secno>14.3.2.3 </span>CSS extensions</h5>
+ <h5 id=css-extensions><span class=secno>15.3.2.3 </span>CSS extensions</h5>
<p>When a user agent is rendering one or more <a href=#text-track-cue title="text
track cue">text track cues</a> according to the <a href=#webvtt-cue-text-rendering-rules>WebVTT cue
@@ -87277,7 +88493,7 @@
':past' and ':future' pseudo-classes.</p>
- <h6 id="the-'::cue'-pseudo-element"><span class=secno>14.3.2.3.1 </span>The '::cue' pseudo-element</h6>
+ <h6 id="the-'::cue'-pseudo-element"><span class=secno>15.3.2.3.1 </span>The '::cue' pseudo-element</h6>
<p>The '<dfn id=pseudo-cue title=pseudo-cue>::cue</dfn>' pseudo-element (with no
argument) matches any <a href=#list-of-webvtt-node-objects>List of WebVTT Node Objects</a>
@@ -87409,7 +88625,7 @@
the <a href=#webvtt-cue-background-box>WebVTT cue background box</a>.</p>
- <h6 id="the-':past'-and-':future'-pseudo-classes"><span class=secno>14.3.2.3.2 </span>The ':past' and ':future' pseudo-classes</h6>
+ <h6 id="the-':past'-and-':future'-pseudo-classes"><span class=secno>15.3.2.3.2 </span>The ':past' and ':future' pseudo-classes</h6>
<p>The <dfn id=past-pseudo-class title=past-pseudo-class>':past'</dfn> and <dfn id=future-pseudo-class title=future-pseudo-class>':future'</dfn> pseudo-classes only
match <a href=#webvtt-node-object title="WebVTT Node Object">WebVTT Node Objects</a>.</p>
@@ -87448,7 +88664,7 @@
<div class=impl>
- <h4 id=images-0><span class=secno>14.3.3 </span>Images</h4>
+ <h4 id=images-0><span class=secno>15.3.3 </span>Images</h4>
<p>When an <code><a href=#the-img-element>img</a></code> element or an <code><a href=#the-input-element>input</a></code> element
when its <code title=attr-input-type><a href=#attr-input-type>type</a></code> attribute is in
@@ -87508,7 +88724,7 @@
up if the user interacted with the actual image.</p>
<hr><p>All animated images with the same <a href=#absolute-url>absolute URL</a> and
- the same image data are expected to be rendered synchronised to the
+ the same image data are expected to be rendered synchronized to the
same timeline as a group, with the timeline starting at the time of
the most recent addition to the group.</p>
@@ -87530,7 +88746,7 @@
<div class=impl>
- <h4 id=attributes-for-embedded-content-and-images><span class=secno>14.3.4 </span>Attributes for embedded content and images</h4>
+ <h4 id=attributes-for-embedded-content-and-images><span class=secno>15.3.4 </span>Attributes for embedded content and images</h4>
<p>The following CSS rules are expected to apply as
<a href=#presentational-hints>presentational hints</a>:</p>
@@ -87626,7 +88842,7 @@
<div class=impl>
- <h4 id=image-maps-0><span class=secno>14.3.5 </span>Image maps</h4>
+ <h4 id=image-maps-0><span class=secno>15.3.5 </span>Image maps</h4>
<p>Shapes on an <a href=#image-map>image map</a> are expected to act, for the
purpose of the CSS cascade, as elements independent of the original
@@ -87654,7 +88870,7 @@
<div class=impl>
- <h4 id=toolbars-0><span class=secno>14.3.6 </span>Toolbars</h4>
+ <h4 id=toolbars-0><span class=secno>15.3.6 </span>Toolbars</h4>
<p>When a <code><a href=#menus>menu</a></code> element's <code title=attr-menu-type><a href=#attr-menu-type>type</a></code> attribute is in the <a href=#toolbar-state title="toolbar state">toolbar</a> state, the element is
expected to be treated as a replaced element with a height about two
@@ -87670,9 +88886,9 @@
<div class=impl>
- <h3 id=bindings><span class=secno>14.4 </span>Bindings</h3>
+ <h3 id=bindings><span class=secno>15.4 </span>Bindings</h3>
- <h4 id=introduction-14><span class=secno>14.4.1 </span>Introduction</h4>
+ <h4 id=introduction-15><span class=secno>15.4.1 </span>Introduction</h4>
<p>A number of elements have their rendering defined in terms of the
'binding' property. <a href=#refsBECSS>[BECSS]</a></p>
@@ -87695,7 +88911,7 @@
<div class=impl>
- <h4 id=the-button-element-0><span class=secno>14.4.2 </span>The <code><a href=#the-button-element>button</a></code> element</h4>
+ <h4 id=the-button-element-0><span class=secno>15.4.2 </span>The <code><a href=#the-button-element>button</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -87711,7 +88927,7 @@
<div class=impl>
- <h4 id=the-details-element-0><span class=secno>14.4.3 </span>The <code><a href=#the-details-element>details</a></code> element</h4>
+ <h4 id=the-details-element-0><span class=secno>15.4.3 </span>The <code><a href=#the-details-element>details</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -87746,7 +88962,7 @@
<div class=impl>
- <h4 id=the-input-element-as-a-text-entry-widget><span class=secno>14.4.4 </span>The <code><a href=#the-input-element>input</a></code> element as a text entry widget</h4>
+ <h4 id=the-input-element-as-a-text-entry-widget><span class=secno>15.4.4 </span>The <code><a href=#the-input-element>input</a></code> element as a text entry widget</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -87793,7 +89009,7 @@
<div class=impl>
- <h4 id=the-input-element-as-domain-specific-widgets><span class=secno>14.4.5 </span>The <code><a href=#the-input-element>input</a></code> element as domain-specific widgets</h4>
+ <h4 id=the-input-element-as-domain-specific-widgets><span class=secno>15.4.5 </span>The <code><a href=#the-input-element>input</a></code> element as domain-specific widgets</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -87848,7 +89064,7 @@
<div class=impl>
- <h4 id=the-input-element-as-a-range-control><span class=secno>14.4.6 </span>The <code><a href=#the-input-element>input</a></code> element as a range control</h4>
+ <h4 id=the-input-element-as-a-range-control><span class=secno>15.4.6 </span>The <code><a href=#the-input-element>input</a></code> element as a range control</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -87874,7 +89090,7 @@
<div class=impl>
- <h4 id=the-input-element-as-a-color-well><span class=secno>14.4.7 </span>The <code><a href=#the-input-element>input</a></code> element as a color well</h4>
+ <h4 id=the-input-element-as-a-color-well><span class=secno>15.4.7 </span>The <code><a href=#the-input-element>input</a></code> element as a color well</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -87896,7 +89112,7 @@
<div class=impl>
- <h4 id=the-input-element-as-a-checkbox-and-radio-button-widgets><span class=secno>14.4.8 </span>The <code><a href=#the-input-element>input</a></code> element as a checkbox and radio button widgets</h4>
+ <h4 id=the-input-element-as-a-checkbox-and-radio-button-widgets><span class=secno>15.4.8 </span>The <code><a href=#the-input-element>input</a></code> element as a checkbox and radio button widgets</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -87918,7 +89134,7 @@
<div class=impl>
- <h4 id=the-input-element-as-a-file-upload-control><span class=secno>14.4.9 </span>The <code><a href=#the-input-element>input</a></code> element as a file upload control</h4>
+ <h4 id=the-input-element-as-a-file-upload-control><span class=secno>15.4.9 </span>The <code><a href=#the-input-element>input</a></code> element as a file upload control</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -87936,7 +89152,7 @@
<div class=impl>
- <h4 id=the-input-element-as-a-button><span class=secno>14.4.10 </span>The <code><a href=#the-input-element>input</a></code> element as a button</h4>
+ <h4 id=the-input-element-as-a-button><span class=secno>15.4.10 </span>The <code><a href=#the-input-element>input</a></code> element as a button</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -87957,7 +89173,7 @@
<div class=impl>
- <h4 id=the-marquee-element-0><span class=secno>14.4.11 </span>The <code><a href=#the-marquee-element>marquee</a></code> element</h4>
+ <h4 id=the-marquee-element-0><span class=secno>15.4.11 </span>The <code><a href=#the-marquee-element>marquee</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -88121,7 +89337,7 @@
<div class=impl>
- <h4 id=the-meter-element-0><span class=secno>14.4.12 </span>The <code><a href=#the-meter-element>meter</a></code> element</h4>
+ <h4 id=the-meter-element-0><span class=secno>15.4.12 </span>The <code><a href=#the-meter-element>meter</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -88152,7 +89368,7 @@
<div class=impl>
- <h4 id=the-progress-element-0><span class=secno>14.4.13 </span>The <code><a href=#the-progress-element>progress</a></code> element</h4>
+ <h4 id=the-progress-element-0><span class=secno>15.4.13 </span>The <code><a href=#the-progress-element>progress</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -88189,7 +89405,7 @@
<div class=impl>
- <h4 id=the-select-element-0><span class=secno>14.4.14 </span>The <code><a href=#the-select-element>select</a></code> element</h4>
+ <h4 id=the-select-element-0><span class=secno>15.4.14 </span>The <code><a href=#the-select-element>select</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -88257,7 +89473,7 @@
<div class=impl>
- <h4 id=the-textarea-element-0><span class=secno>14.4.15 </span>The <code><a href=#the-textarea-element>textarea</a></code> element</h4>
+ <h4 id=the-textarea-element-0><span class=secno>15.4.15 </span>The <code><a href=#the-textarea-element>textarea</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -88312,7 +89528,7 @@
<div class=impl>
- <h4 id=the-keygen-element-0><span class=secno>14.4.16 </span>The <code><a href=#the-keygen-element>keygen</a></code> element</h4>
+ <h4 id=the-keygen-element-0><span class=secno>15.4.16 </span>The <code><a href=#the-keygen-element>keygen</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -88328,7 +89544,7 @@
<div class=impl>
- <h4 id=the-time-element-0><span class=secno>14.4.17 </span>The <code><a href=#the-time-element>time</a></code> element</h4>
+ <h4 id=the-time-element-0><span class=secno>15.4.17 </span>The <code><a href=#the-time-element>time</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -88348,7 +89564,7 @@
<div class=impl>
- <h3 id=frames-and-framesets><span class=secno>14.5 </span>Frames and framesets</h3>
+ <h3 id=frames-and-framesets><span class=secno>15.5 </span>Frames and framesets</h3>
<p>When an <code><a href=#the-html-element-0>html</a></code> element's second child element is a
<code><a href=#frameset>frameset</a></code> element, the user agent is expected to render
@@ -88633,9 +89849,9 @@
<div class=impl>
- <h3 id=interactive-media><span class=secno>14.6 </span>Interactive media</h3>
+ <h3 id=interactive-media><span class=secno>15.6 </span>Interactive media</h3>
- <h4 id=links,-forms,-and-navigation><span class=secno>14.6.1 </span>Links, forms, and navigation</h4>
+ <h4 id=links,-forms,-and-navigation><span class=secno>15.6.1 </span>Links, forms, and navigation</h4>
<p>User agents are expected to allow the user to control aspects of
<a href=#hyperlink>hyperlink</a> activation and <a href=#form-submission>form submission</a>,
@@ -88671,7 +89887,7 @@
- <h4 id=the-title-attribute-0><span class=secno>14.6.2 </span>The <code title=attr-title><a href=#the-title-attribute>title</a></code> attribute</h4>
+ <h4 id=the-title-attribute-0><span class=secno>15.6.2 </span>The <code title=attr-title><a href=#the-title-attribute>title</a></code> attribute</h4>
<p>Given an element (e.g. the element designated by the mouse
cursor), if the element, or one of its ancestors, has a <code title=attr-title><a href=#the-title-attribute>title</a></code> attribute, and the nearest such
@@ -88705,7 +89921,7 @@
</div>
- <h4 id=editing-hosts><span class=secno>14.6.3 </span>Editing hosts</h4>
+ <h4 id=editing-hosts><span class=secno>15.6.3 </span>Editing hosts</h4>
<p>The current text editing caret (the one at the <a href=#caret-position>caret
position</a> in a focused <a href=#editing-host>editing host</a>) is expected
@@ -88719,7 +89935,7 @@
- <h4 id=text-rendered-in-native-user-interfaces><span class=secno>14.6.4 </span>Text rendered in native user interfaces</h4>
+ <h4 id=text-rendered-in-native-user-interfaces><span class=secno>15.6.4 </span>Text rendered in native user interfaces</h4>
<p>User agents are expected to honor the Unicode semantics of text
that is exposed in user interfaces, for example supporting the
@@ -88815,7 +90031,7 @@
- <h3 id=print-media><span class=secno>14.7 </span>Print media</h3>
+ <h3 id=print-media><span class=secno>15.7 </span>Print media</h3>
<p>User agents are expected to allow the user to request the
opportunity to <dfn id=obtain-a-physical-form>obtain a physical form</dfn> (or a
@@ -88835,9 +90051,9 @@
- <h2 id=obsolete><span class=secno>15 </span>Obsolete features</h2>
+ <h2 id=obsolete><span class=secno>16 </span>Obsolete features</h2>
- <h3 id=obsolete-but-conforming-features><span class=secno>15.1 </span>Obsolete but conforming features</h3>
+ <h3 id=obsolete-but-conforming-features><span class=secno>16.1 </span>Obsolete but conforming features</h3>
<p>Features listed in this section will trigger warnings in
conformance checkers.</p>
@@ -88884,7 +90100,7 @@
<div class=impl>
- <h4 id=warnings-for-obsolete-but-conforming-features><span class=secno>15.1.1 </span>Warnings for obsolete but conforming features</h4>
+ <h4 id=warnings-for-obsolete-but-conforming-features><span class=secno>16.1.1 </span>Warnings for obsolete but conforming features</h4>
<p>To ease the transition from HTML4 Transitional documents to the
language defined in <em>this</em> specification, and to discourage
@@ -88933,7 +90149,7 @@
</div>
- <h3 id=non-conforming-features><span class=secno>15.2 </span>Non-conforming features</h3>
+ <h3 id=non-conforming-features><span class=secno>16.2 </span>Non-conforming features</h3>
<p>Elements in the following list are entirely obsolete, and must
not be used by authors:</p>
@@ -89203,9 +90419,9 @@
</dl><div class=impl>
- <h3 id=requirements-for-implementations><span class=secno>15.3 </span>Requirements for implementations</h3>
+ <h3 id=requirements-for-implementations><span class=secno>16.3 </span>Requirements for implementations</h3>
- <h4 id=the-applet-element><span class=secno>15.3.1 </span>The <dfn><code>applet</code></dfn> element</h4>
+ <h4 id=the-applet-element><span class=secno>16.3.1 </span>The <dfn><code>applet</code></dfn> element</h4>
<p>The <code><a href=#the-applet-element>applet</a></code> element is a Java-specific variant of the
<code><a href=#the-embed-element>embed</a></code> element. The <code><a href=#the-applet-element>applet</a></code> element is now
@@ -89281,7 +90497,7 @@
<a href=#url>URL</a>.</p>
- <h4 id=the-marquee-element><span class=secno>15.3.2 </span>The <dfn><code>marquee</code></dfn> element</h4>
+ <h4 id=the-marquee-element><span class=secno>16.3.2 </span>The <dfn><code>marquee</code></dfn> element</h4>
<p>The <code><a href=#the-marquee-element>marquee</a></code> element is a presentational element that
animates content. CSS transitions and animations are a more
@@ -89458,7 +90674,7 @@
attribute.</p>
- <h4 id=frames><span class=secno>15.3.3 </span>Frames</h4>
+ <h4 id=frames><span class=secno>16.3.3 </span>Frames</h4>
<p>The <dfn id=frameset><code>frameset</code></dfn> element acts as <a href=#the-body-element>the
body element</a> in documents that use frames.</p>
@@ -89637,7 +90853,7 @@
- <h4 id=other-elements,-attributes-and-apis><span class=secno>15.3.4 </span>Other elements, attributes and APIs</h4> <!-- alphabetical by name and attribute -->
+ <h4 id=other-elements,-attributes-and-apis><span class=secno>16.3.4 </span>Other elements, attributes and APIs</h4> <!-- alphabetical by name and attribute -->
<p>User agents must treat <code><a href=#acronym>acronym</a></code> elements in a manner
equivalent to <code><a href=#the-abbr-element>abbr</a></code> elements in terms of semantics and
@@ -90353,13 +91569,13 @@
- <h2 id=iana><span class=secno>16 </span>IANA considerations</h2>
+ <h2 id=iana><span class=secno>17 </span>IANA considerations</h2>
<!-- http://www.w3.org/2002/06/registering-mediatype.html -->
- <h3 id=text/html><span class=secno>16.1 </span><dfn><code>text/html</code></dfn></h3>
+ <h3 id=text/html><span class=secno>17.1 </span><dfn><code>text/html</code></dfn></h3>
<p>This registration is for community review and will be submitted
to the IESG for review, approval, and registration with IANA.</p>
@@ -90486,7 +91702,7 @@
refer to <a href=#the-indicated-part-of-the-document>the indicated part of the document</a>.</p>
- <h3 id=text/html-sandboxed><span class=secno>16.2 </span><dfn><code>text/html-sandboxed</code></dfn></h3>
+ <h3 id=text/html-sandboxed><span class=secno>17.2 </span><dfn><code>text/html-sandboxed</code></dfn></h3>
<p>This registration is for community review and will be submitted
to the IESG for review, approval, and registration with IANA.</p>
@@ -90568,7 +91784,7 @@
document</a>.</p>
- <h3 id=application/xhtml+xml><span class=secno>16.3 </span><dfn><code>application/xhtml+xml</code></dfn></h3>
+ <h3 id=application/xhtml+xml><span class=secno>17.3 </span><dfn><code>application/xhtml+xml</code></dfn></h3>
<p>This registration is for community review and will be submitted
to the IESG for review, approval, and registration with IANA.</p>
@@ -90633,7 +91849,7 @@
type</a>. <a href=#refsRFC3023>[RFC3023]</a></p>
- <h3 id=text/cache-manifest><span class=secno>16.4 </span><dfn><code>text/cache-manifest</code></dfn></h3>
+ <h3 id=text/cache-manifest><span class=secno>17.4 </span><dfn><code>text/cache-manifest</code></dfn></h3>
<p>This registration is for community review and will be submitted
to the IESG for review, approval, and registration with IANA.</p>
@@ -90704,7 +91920,7 @@
<!--PING-->
- <h3 id=text/ping><span class=secno>16.5 </span><dfn><code>text/ping</code></dfn></h3>
+ <h3 id=text/ping><span class=secno>17.5 </span><dfn><code>text/ping</code></dfn></h3>
<p>This registration is for community review and will be submitted
to the IESG for review, approval, and registration with IANA.</p>
@@ -90769,7 +91985,7 @@
<!--TT-->
<div data-component="other Hixie drafts (editor: Ian Hickson)">
- <h3 id=text/vtt><span class=secno>16.6 </span><dfn><code>text/vtt</code></dfn></h3>
+ <h3 id=text/vtt><span class=secno>17.6 </span><dfn><code>text/vtt</code></dfn></h3>
<p>This registration is for community review and will be submitted
to the IESG for review, approval, and registration with IANA.</p>
@@ -90850,7 +92066,7 @@
<!--MD-->
- <h3 id=application/microdata+json><span class=secno>16.7 </span><dfn><code>application/microdata+json</code></dfn></h3>
+ <h3 id=application/microdata+json><span class=secno>17.7 </span><dfn><code>application/microdata+json</code></dfn></h3>
<p>This registration is for community review and will be submitted
@@ -90919,7 +92135,7 @@
<!--MD-->
<!--PING-->
- <h3 id=ping-from><span class=secno>16.8 </span><dfn title=http-ping-from><code>Ping-From</code></dfn></h3>
+ <h3 id=ping-from><span class=secno>17.8 </span><dfn title=http-ping-from><code>Ping-From</code></dfn></h3>
<p>This section describes a header field for registration in the
Permanent Message Header Field Registry. <a href=#refsRFC3864>[RFC3864]</a></p>
@@ -90938,7 +92154,7 @@
</dd>
<dt>Related information</dt>
<dd>None.</dd>
- </dl><h3 id=ping-to><span class=secno>16.9 </span><dfn title=http-ping-to><code>Ping-To</code></dfn></h3>
+ </dl><h3 id=ping-to><span class=secno>17.9 </span><dfn title=http-ping-to><code>Ping-To</code></dfn></h3>
<p>This section describes a header field for registration in the
Permanent Message Header Field Registry. <a href=#refsRFC3864>[RFC3864]</a></p>
@@ -93867,6 +95083,9 @@
<dd><cite><a href=http://tools.ietf.org/html/draft-holsten-about-uri-scheme>The
'about' URI scheme</a></cite>, J. Holsten, L. Hunt. IETF.</dd>
+ <dt id=refsAES128CTR>[AES128CTR]</dt>
+ <dd><cite><a href=http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf>Advanced Encryption Standard (AES)</a></cite>. NIST.</dd>
+
<dt id=refsARIA>[ARIA]</dt>
<dd><cite><a href=http://www.w3.org/WAI/PF/aria/>Accessible Rich
Internet Applications (WAI-ARIA)</a></cite>, J. Craig, M. Cooper, L. Pappas,
@@ -94066,6 +95285,9 @@
<dd>(Non-normative) <cite><a href=http://microformats.org/wiki/hatom>hAtom</a></cite>, D
Janes. Microformats.</dd>
+ <dt id=refsHMAC>[HMAC]</dt>
+ <dd><cite><a href=http://csrc.nist.gov/publications/fips/fips198/fips-198a.pdf>The Keyed-Hash Message Authentication Code (HMAC)</a></cite>. NIST.</dd>
+
<dt id=refsHTMLDIFF>[HTMLDIFF]</dt>
<!--
<dd>(Non-normative) <cite><a
@@ -94088,6 +95310,9 @@
<dd><cite><a href=http://www.iana.org/assignments/message-headers/perm-headers.html>Permanent
Message Header Field Names</a></cite>. IANA.</dd>
+ <dt id=refsICE>[ICE]</dt>
+ <dd><cite><a href=http://tools.ietf.org/html/rfc5245>Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal for Offer/Answer Protocols</a></cite>, J. Rosenberg. IETF.</dd>
+
<dt id=refsISO8601>[ISO8601]</dt>
<dd><cite><a href="http://isotc.iso.org/livelink/livelink/4021199/ISO_8601_2004_E.zip?func=doc.Fetch&nodeid=4021199">ISO8601: Data elements and interchange formats — Information interchange — Representation of dates and times</a></cite>. ISO.</dd>
@@ -94337,11 +95562,23 @@
Compression Scheme For Unicode</a></cite>, M. Wolf, K. Whistler,
C. Wicksteed, M. Davis, A. Freytag, M. Scherer. Unicode Consortium.</dd>
+ <dt id=refsSDP>[SDP]</dt>
+ <dd><cite><a href=http://tools.ietf.org/html/rfc4566>SDP: Session Description Protocol</a></cite>, M. Handley, V. Jacobson, C. Perkins. IETF.</dd>
+
+ <dt id=refsSDPLABEL>[SDPLABEL]</dt>
+ <dd><cite><a href=http://tools.ietf.org/html/rfc4574>The Session Description Protocol (SDP) Label Attribute</a></cite>, O. Levin, G. Camarillo. IETF.</dd>
+
+ <dt id=refsSDPOFFERANSWER>[SDPOFFERANSWER]</dt>
+ <dd><cite><a href=http://tools.ietf.org/html/rfc3264>An Offer/Answer Model with the Session Description Protocol (SDP)</a></cite>, J. Rosenberg, H. Schulzrinne. IETF.</dd>
+
<dt id=refsSELECTORS>[SELECTORS]</dt>
<dd><cite><a href=http://www.w3.org/TR/css3-selectors>Selectors</a></cite>,
T. Çelik, E. Etemad, D. Glazman, I. Hickson, P. Linss,
J. Williams. W3C.</dd>
+ <dt id=refsSHA1>[SHA1]</dt>
+ <dd><cite><a href=http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf>Secure Hash Standard</a></cite>. NIST.</dd>
+
<dt id=refsSHIFTJIS>[SHIFTJIS]</dt>
<dd><cite>JIS X0208: 7-bit and 8-bit double byte coded KANJI sets
for information interchange</cite>. Japanese Industrial Standards Committee.</dd>
@@ -94352,6 +95589,9 @@
and management — Part 2-1: Colour management — Default RGB colour
space — sRGB</a></cite>. IEC.</dd>
+ <dt id=refsSTUN>[STUN]</dt>
+ <dd><cite><a href=http://tools.ietf.org/html/rfc5389>Session Traversal Utilities for NAT (STUN)</a></cite>, J. Rosenberg, R. Mahy, P. Matthews, D. Wing. IETF.</dd>
+
<dt id=refsSVG>[SVG]</dt>
<dd><cite><a href=http://www.w3.org/TR/SVGTiny12/>Scalable Vector
Graphics (SVG) Tiny 1.2 Specification</a></cite>, O. Andersson,
@@ -94366,6 +95606,9 @@
Ministry of Industry, Royal Thai Government. ISBN
974-606-153-4.</dd>
+ <dt id=refsTURN>[TURN]</dt>
+ <dd><cite><a href=http://tools.ietf.org/html/rfc5766>Traversal Using Relays around NAT (TURN): Relay Extensions to Session Traversal Utilities for NAT (STUN)</a></cite>, R. Mahy, P. Matthews, J. Rosenberg. IETF.</dd>
+
<dt id=refsUAAG>[UAAG]</dt>
<dd>(Non-normative) <cite><a href=http://www.w3.org/TR/UAAG20/>Web Content Accessibility
Guidelines (UAAG) 2.0</a></cite>, J. Allan, K. Ford, J. Richards,
Modified: index
===================================================================
--- index 2011-03-05 00:12:36 UTC (rev 5944)
+++ index 2011-03-14 10:19:45 UTC (rev 5945)
@@ -243,7 +243,7 @@
<header class=head id=head><p><a class=logo href=http://www.whatwg.org/ rel=home><img alt=WHATWG height=101 src=/images/logo width=101></a></p>
<hgroup><h1 class=allcaps>HTML</h1>
- <h2 class="no-num no-toc">Living Standard — Last Updated 5 March 2011</h2>
+ <h2 class="no-num no-toc">Living Standard — Last Updated 14 March 2011</h2>
</hgroup><p>You can take part in this work. <a href=http://www.whatwg.org/mailing-list>Join the working group's discussion list.</a></p>
<p><strong>Web designers!</strong> We have a <a href=http://blog.whatwg.org/faq/>FAQ</a>, a <a href=http://forums.whatwg.org/>forum</a>, and a <a href=http://www.whatwg.org/mailing-list#help>help mailing list</a> for you!</p>
<!--<p class="impl"><strong>Implementors!</strong> We have a <a href="http://www.whatwg.org/mailing-list#implementors">mailing list</a> for you too!</p>-->
@@ -274,7 +274,7 @@
<p>This specification evolves HTML and its related APIs to ease the
authoring of Web-based applications. The most recent additions
- include a <code><a href=#devices>device</a></code> element to enable video conferencing,
+ include a <code>device</code> element to enable video conferencing,
as well as all the features added as part of the earlier HTML5
effort.</p>
@@ -778,11 +778,7 @@
a command</a></li>
<li><a href=#using-the-accesskey-attribute-on-a-label-element-to-define-a-command><span class=secno>4.11.5.6 </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.5.7 </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.5.8 </span>Using the <code title=attr-accesskey>accesskey</code> attribute to define a command on other elements</a></ol></li>
- <li><a href=#devices><span class=secno>4.11.6 </span>The <code>device</code> element</a>
- <ol>
- <li><a href=#stream-api><span class=secno>4.11.6.1 </span>Stream API</a></li>
- <li><a href=#peer-to-peer-connections><span class=secno>4.11.6.2 </span>Peer-to-peer connections</a></ol></ol></li>
+ <li><a href=#using-the-accesskey-attribute-to-define-a-command-on-other-elements><span class=secno>4.11.5.8 </span>Using the <code title=attr-accesskey>accesskey</code> attribute to define a command on other elements</a></ol></ol></li>
<li><a href=#links><span class=secno>4.12 </span>Links</a>
<ol>
<li><a href=#introduction-2><span class=secno>4.12.1 </span>Introduction</a></li>
@@ -1014,258 +1010,268 @@
<li><a href=#the-undomanagerevent-interface-and-the-undo-and-redo-events><span class=secno>8.8.5 </span>The <code>UndoManagerEvent</code> interface and the <code title=event-undo>undo</code> and <code title=event-redo>redo</code> events</a></li>
<li><a href=#implementation-notes><span class=secno>8.8.6 </span>Implementation notes</a></ol></li>
<li><a href=#editing-apis><span class=secno>8.9 </span>Editing APIs</a></ol></li>
- <li><a href=#comms><span class=secno>9 </span>Communication</a>
+ <li><a href=#video-conferencing-and-peer-to-peer-communication><span class=secno>9 </span>Video conferencing and peer-to-peer communication</a>
<ol>
- <li><a href=#event-definitions-0><span class=secno>9.1 </span>Event definitions</a></li>
- <li><a href=#web-messaging><span class=secno>9.2 </span>Cross-document messaging</a>
+ <li><a href=#introduction-8><span class=secno>9.1 </span>Introduction</a>
<ol>
- <li><a href=#introduction-8><span class=secno>9.2.1 </span>Introduction</a></li>
- <li><a href=#security-postmsg><span class=secno>9.2.2 </span>Security</a>
+ <li><a href=#obtaining-local-multimedia-content><span class=secno>9.1.1 </span>Obtaining local multimedia content</a></li>
+ <li><a href=#stream-api><span class=secno>9.1.2 </span>Stream API</a></li>
+ <li><a href=#peer-to-peer-connections><span class=secno>9.1.3 </span>Peer-to-peer connections</a></li>
+ <li><a href=#the-data-stream><span class=secno>9.1.4 </span>The data stream</a></li>
+ <li><a href=#event-definitions-0><span class=secno>9.1.5 </span>Event definitions</a></li>
+ <li><a href=#event-summary><span class=secno>9.1.6 </span>Event Summary</a></ol></ol></li>
+ <li><a href=#comms><span class=secno>10 </span>Communication</a>
+ <ol>
+ <li><a href=#event-definitions-1><span class=secno>10.1 </span>Event definitions</a></li>
+ <li><a href=#web-messaging><span class=secno>10.2 </span>Cross-document messaging</a>
+ <ol>
+ <li><a href=#introduction-9><span class=secno>10.2.1 </span>Introduction</a></li>
+ <li><a href=#security-postmsg><span class=secno>10.2.2 </span>Security</a>
<ol>
- <li><a href=#authors><span class=secno>9.2.2.1 </span>Authors</a></li>
- <li><a href=#user-agents><span class=secno>9.2.2.2 </span>User agents</a></ol></li>
- <li><a href=#posting-messages><span class=secno>9.2.3 </span>Posting messages</a></ol></li>
- <li><a href=#channel-messaging><span class=secno>9.3 </span>Channel messaging</a>
+ <li><a href=#authors><span class=secno>10.2.2.1 </span>Authors</a></li>
+ <li><a href=#user-agents><span class=secno>10.2.2.2 </span>User agents</a></ol></li>
+ <li><a href=#posting-messages><span class=secno>10.2.3 </span>Posting messages</a></ol></li>
+ <li><a href=#channel-messaging><span class=secno>10.3 </span>Channel messaging</a>
<ol>
- <li><a href=#introduction-9><span class=secno>9.3.1 </span>Introduction</a></li>
- <li><a href=#message-channels><span class=secno>9.3.2 </span>Message channels</a></li>
- <li><a href=#message-ports><span class=secno>9.3.3 </span>Message ports</a>
+ <li><a href=#introduction-10><span class=secno>10.3.1 </span>Introduction</a></li>
+ <li><a href=#message-channels><span class=secno>10.3.2 </span>Message channels</a></li>
+ <li><a href=#message-ports><span class=secno>10.3.3 </span>Message ports</a>
<ol>
- <li><a href=#ports-and-garbage-collection><span class=secno>9.3.3.1 </span>Ports and garbage collection</a></ol></ol></ol></li>
- <li><a href=#syntax><span class=secno>10 </span>The HTML syntax</a>
+ <li><a href=#ports-and-garbage-collection><span class=secno>10.3.3.1 </span>Ports and garbage collection</a></ol></ol></ol></li>
+ <li><a href=#syntax><span class=secno>11 </span>The HTML syntax</a>
<ol>
- <li><a href=#writing><span class=secno>10.1 </span>Writing HTML documents</a>
+ <li><a href=#writing><span class=secno>11.1 </span>Writing HTML documents</a>
<ol>
- <li><a href=#the-doctype><span class=secno>10.1.1 </span>The DOCTYPE</a></li>
- <li><a href=#elements-0><span class=secno>10.1.2 </span>Elements</a>
+ <li><a href=#the-doctype><span class=secno>11.1.1 </span>The DOCTYPE</a></li>
+ <li><a href=#elements-0><span class=secno>11.1.2 </span>Elements</a>
<ol>
- <li><a href=#start-tags><span class=secno>10.1.2.1 </span>Start tags</a></li>
- <li><a href=#end-tags><span class=secno>10.1.2.2 </span>End tags</a></li>
- <li><a href=#attributes-0><span class=secno>10.1.2.3 </span>Attributes</a></li>
- <li><a href=#optional-tags><span class=secno>10.1.2.4 </span>Optional tags</a></li>
- <li><a href=#element-restrictions><span class=secno>10.1.2.5 </span>Restrictions on content models</a></li>
- <li><a href=#cdata-rcdata-restrictions><span class=secno>10.1.2.6 </span>Restrictions on the contents of raw text and RCDATA elements</a></ol></li>
- <li><a href=#text-1><span class=secno>10.1.3 </span>Text</a>
+ <li><a href=#start-tags><span class=secno>11.1.2.1 </span>Start tags</a></li>
+ <li><a href=#end-tags><span class=secno>11.1.2.2 </span>End tags</a></li>
+ <li><a href=#attributes-0><span class=secno>11.1.2.3 </span>Attributes</a></li>
+ <li><a href=#optional-tags><span class=secno>11.1.2.4 </span>Optional tags</a></li>
+ <li><a href=#element-restrictions><span class=secno>11.1.2.5 </span>Restrictions on content models</a></li>
+ <li><a href=#cdata-rcdata-restrictions><span class=secno>11.1.2.6 </span>Restrictions on the contents of raw text and RCDATA elements</a></ol></li>
+ <li><a href=#text-1><span class=secno>11.1.3 </span>Text</a>
<ol>
- <li><a href=#newlines><span class=secno>10.1.3.1 </span>Newlines</a></ol></li>
- <li><a href=#character-references><span class=secno>10.1.4 </span>Character references</a></li>
- <li><a href=#cdata-sections><span class=secno>10.1.5 </span>CDATA sections</a></li>
- <li><a href=#comments><span class=secno>10.1.6 </span>Comments</a></ol></li>
- <li><a href=#parsing><span class=secno>10.2 </span>Parsing HTML documents</a>
+ <li><a href=#newlines><span class=secno>11.1.3.1 </span>Newlines</a></ol></li>
+ <li><a href=#character-references><span class=secno>11.1.4 </span>Character references</a></li>
+ <li><a href=#cdata-sections><span class=secno>11.1.5 </span>CDATA sections</a></li>
+ <li><a href=#comments><span class=secno>11.1.6 </span>Comments</a></ol></li>
+ <li><a href=#parsing><span class=secno>11.2 </span>Parsing HTML documents</a>
<ol>
- <li><a href=#overview-of-the-parsing-model><span class=secno>10.2.1 </span>Overview of the parsing model</a></li>
- <li><a href=#the-input-stream><span class=secno>10.2.2 </span>The input stream</a>
+ <li><a href=#overview-of-the-parsing-model><span class=secno>11.2.1 </span>Overview of the parsing model</a></li>
+ <li><a href=#the-input-stream><span class=secno>11.2.2 </span>The input stream</a>
<ol>
- <li><a href=#determining-the-character-encoding><span class=secno>10.2.2.1 </span>Determining the character encoding</a></li>
- <li><a href=#character-encodings-0><span class=secno>10.2.2.2 </span>Character encodings</a></li>
- <li><a href=#preprocessing-the-input-stream><span class=secno>10.2.2.3 </span>Preprocessing the input stream</a></li>
- <li><a href=#changing-the-encoding-while-parsing><span class=secno>10.2.2.4 </span>Changing the encoding while parsing</a></ol></li>
- <li><a href=#parse-state><span class=secno>10.2.3 </span>Parse state</a>
+ <li><a href=#determining-the-character-encoding><span class=secno>11.2.2.1 </span>Determining the character encoding</a></li>
+ <li><a href=#character-encodings-0><span class=secno>11.2.2.2 </span>Character encodings</a></li>
+ <li><a href=#preprocessing-the-input-stream><span class=secno>11.2.2.3 </span>Preprocessing the input stream</a></li>
+ <li><a href=#changing-the-encoding-while-parsing><span class=secno>11.2.2.4 </span>Changing the encoding while parsing</a></ol></li>
+ <li><a href=#parse-state><span class=secno>11.2.3 </span>Parse state</a>
<ol>
- <li><a href=#the-insertion-mode><span class=secno>10.2.3.1 </span>The insertion mode</a></li>
- <li><a href=#the-stack-of-open-elements><span class=secno>10.2.3.2 </span>The stack of open elements</a></li>
- <li><a href=#the-list-of-active-formatting-elements><span class=secno>10.2.3.3 </span>The list of active formatting elements</a></li>
- <li><a href=#the-element-pointers><span class=secno>10.2.3.4 </span>The element pointers</a></li>
- <li><a href=#other-parsing-state-flags><span class=secno>10.2.3.5 </span>Other parsing state flags</a></ol></li>
- <li><a href=#tokenization><span class=secno>10.2.4 </span>Tokenization</a>
+ <li><a href=#the-insertion-mode><span class=secno>11.2.3.1 </span>The insertion mode</a></li>
+ <li><a href=#the-stack-of-open-elements><span class=secno>11.2.3.2 </span>The stack of open elements</a></li>
+ <li><a href=#the-list-of-active-formatting-elements><span class=secno>11.2.3.3 </span>The list of active formatting elements</a></li>
+ <li><a href=#the-element-pointers><span class=secno>11.2.3.4 </span>The element pointers</a></li>
+ <li><a href=#other-parsing-state-flags><span class=secno>11.2.3.5 </span>Other parsing state flags</a></ol></li>
+ <li><a href=#tokenization><span class=secno>11.2.4 </span>Tokenization</a>
<ol>
- <li><a href=#data-state><span class=secno>10.2.4.1 </span>Data state</a></li>
- <li><a href=#character-reference-in-data-state><span class=secno>10.2.4.2 </span>Character reference in data state</a></li>
- <li><a href=#rcdata-state><span class=secno>10.2.4.3 </span>RCDATA state</a></li>
- <li><a href=#character-reference-in-rcdata-state><span class=secno>10.2.4.4 </span>Character reference in RCDATA state</a></li>
- <li><a href=#rawtext-state><span class=secno>10.2.4.5 </span>RAWTEXT state</a></li>
- <li><a href=#script-data-state><span class=secno>10.2.4.6 </span>Script data state</a></li>
- <li><a href=#plaintext-state><span class=secno>10.2.4.7 </span>PLAINTEXT state</a></li>
- <li><a href=#tag-open-state><span class=secno>10.2.4.8 </span>Tag open state</a></li>
- <li><a href=#end-tag-open-state><span class=secno>10.2.4.9 </span>End tag open state</a></li>
- <li><a href=#tag-name-state><span class=secno>10.2.4.10 </span>Tag name state</a></li>
- <li><a href=#rcdata-less-than-sign-state><span class=secno>10.2.4.11 </span>RCDATA less-than sign state</a></li>
- <li><a href=#rcdata-end-tag-open-state><span class=secno>10.2.4.12 </span>RCDATA end tag open state</a></li>
- <li><a href=#rcdata-end-tag-name-state><span class=secno>10.2.4.13 </span>RCDATA end tag name state</a></li>
- <li><a href=#rawtext-less-than-sign-state><span class=secno>10.2.4.14 </span>RAWTEXT less-than sign state</a></li>
- <li><a href=#rawtext-end-tag-open-state><span class=secno>10.2.4.15 </span>RAWTEXT end tag open state</a></li>
- <li><a href=#rawtext-end-tag-name-state><span class=secno>10.2.4.16 </span>RAWTEXT end tag name state</a></li>
- <li><a href=#script-data-less-than-sign-state><span class=secno>10.2.4.17 </span>Script data less-than sign state</a></li>
- <li><a href=#script-data-end-tag-open-state><span class=secno>10.2.4.18 </span>Script data end tag open state</a></li>
- <li><a href=#script-data-end-tag-name-state><span class=secno>10.2.4.19 </span>Script data end tag name state</a></li>
- <li><a href=#script-data-escape-start-state><span class=secno>10.2.4.20 </span>Script data escape start state</a></li>
- <li><a href=#script-data-escape-start-dash-state><span class=secno>10.2.4.21 </span>Script data escape start dash state</a></li>
- <li><a href=#script-data-escaped-state><span class=secno>10.2.4.22 </span>Script data escaped state</a></li>
- <li><a href=#script-data-escaped-dash-state><span class=secno>10.2.4.23 </span>Script data escaped dash state</a></li>
- <li><a href=#script-data-escaped-dash-dash-state><span class=secno>10.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>10.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>10.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>10.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>10.2.4.28 </span>Script data double escape start state</a></li>
- <li><a href=#script-data-double-escaped-state><span class=secno>10.2.4.29 </span>Script data double escaped state</a></li>
- <li><a href=#script-data-double-escaped-dash-state><span class=secno>10.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>10.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>10.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>10.2.4.33 </span>Script data double escape end state</a></li>
- <li><a href=#before-attribute-name-state><span class=secno>10.2.4.34 </span>Before attribute name state</a></li>
- <li><a href=#attribute-name-state><span class=secno>10.2.4.35 </span>Attribute name state</a></li>
- <li><a href=#after-attribute-name-state><span class=secno>10.2.4.36 </span>After attribute name state</a></li>
- <li><a href=#before-attribute-value-state><span class=secno>10.2.4.37 </span>Before attribute value state</a></li>
- <li><a href=#attribute-value-(double-quoted)-state><span class=secno>10.2.4.38 </span>Attribute value (double-quoted) state</a></li>
- <li><a href=#attribute-value-(single-quoted)-state><span class=secno>10.2.4.39 </span>Attribute value (single-quoted) state</a></li>
- <li><a href=#attribute-value-(unquoted)-state><span class=secno>10.2.4.40 </span>Attribute value (unquoted) state</a></li>
- <li><a href=#character-reference-in-attribute-value-state><span class=secno>10.2.4.41 </span>Character reference in attribute value state</a></li>
- <li><a href=#after-attribute-value-(quoted)-state><span class=secno>10.2.4.42 </span>After attribute value (quoted) state</a></li>
- <li><a href=#self-closing-start-tag-state><span class=secno>10.2.4.43 </span>Self-closing start tag state</a></li>
- <li><a href=#bogus-comment-state><span class=secno>10.2.4.44 </span>Bogus comment state</a></li>
- <li><a href=#markup-declaration-open-state><span class=secno>10.2.4.45 </span>Markup declaration open state</a></li>
- <li><a href=#comment-start-state><span class=secno>10.2.4.46 </span>Comment start state</a></li>
- <li><a href=#comment-start-dash-state><span class=secno>10.2.4.47 </span>Comment start dash state</a></li>
- <li><a href=#comment-state><span class=secno>10.2.4.48 </span>Comment state</a></li>
- <li><a href=#comment-end-dash-state><span class=secno>10.2.4.49 </span>Comment end dash state</a></li>
- <li><a href=#comment-end-state><span class=secno>10.2.4.50 </span>Comment end state</a></li>
- <li><a href=#comment-end-bang-state><span class=secno>10.2.4.51 </span>Comment end bang state</a></li>
- <li><a href=#doctype-state><span class=secno>10.2.4.52 </span>DOCTYPE state</a></li>
- <li><a href=#before-doctype-name-state><span class=secno>10.2.4.53 </span>Before DOCTYPE name state</a></li>
- <li><a href=#doctype-name-state><span class=secno>10.2.4.54 </span>DOCTYPE name state</a></li>
- <li><a href=#after-doctype-name-state><span class=secno>10.2.4.55 </span>After DOCTYPE name state</a></li>
- <li><a href=#after-doctype-public-keyword-state><span class=secno>10.2.4.56 </span>After DOCTYPE public keyword state</a></li>
- <li><a href=#before-doctype-public-identifier-state><span class=secno>10.2.4.57 </span>Before DOCTYPE public identifier state</a></li>
- <li><a href=#doctype-public-identifier-(double-quoted)-state><span class=secno>10.2.4.58 </span>DOCTYPE public identifier (double-quoted) state</a></li>
- <li><a href=#doctype-public-identifier-(single-quoted)-state><span class=secno>10.2.4.59 </span>DOCTYPE public identifier (single-quoted) state</a></li>
- <li><a href=#after-doctype-public-identifier-state><span class=secno>10.2.4.60 </span>After DOCTYPE public identifier state</a></li>
- <li><a href=#between-doctype-public-and-system-identifiers-state><span class=secno>10.2.4.61 </span>Between DOCTYPE public and system identifiers state</a></li>
- <li><a href=#after-doctype-system-keyword-state><span class=secno>10.2.4.62 </span>After DOCTYPE system keyword state</a></li>
- <li><a href=#before-doctype-system-identifier-state><span class=secno>10.2.4.63 </span>Before DOCTYPE system identifier state</a></li>
- <li><a href=#doctype-system-identifier-(double-quoted)-state><span class=secno>10.2.4.64 </span>DOCTYPE system identifier (double-quoted) state</a></li>
- <li><a href=#doctype-system-identifier-(single-quoted)-state><span class=secno>10.2.4.65 </span>DOCTYPE system identifier (single-quoted) state</a></li>
- <li><a href=#after-doctype-system-identifier-state><span class=secno>10.2.4.66 </span>After DOCTYPE system identifier state</a></li>
- <li><a href=#bogus-doctype-state><span class=secno>10.2.4.67 </span>Bogus DOCTYPE state</a></li>
- <li><a href=#cdata-section-state><span class=secno>10.2.4.68 </span>CDATA section state</a></li>
- <li><a href=#tokenizing-character-references><span class=secno>10.2.4.69 </span>Tokenizing character references</a></ol></li>
- <li><a href=#tree-construction><span class=secno>10.2.5 </span>Tree construction</a>
+ <li><a href=#data-state><span class=secno>11.2.4.1 </span>Data state</a></li>
+ <li><a href=#character-reference-in-data-state><span class=secno>11.2.4.2 </span>Character reference in data state</a></li>
+ <li><a href=#rcdata-state><span class=secno>11.2.4.3 </span>RCDATA state</a></li>
+ <li><a href=#character-reference-in-rcdata-state><span class=secno>11.2.4.4 </span>Character reference in RCDATA state</a></li>
+ <li><a href=#rawtext-state><span class=secno>11.2.4.5 </span>RAWTEXT state</a></li>
+ <li><a href=#script-data-state><span class=secno>11.2.4.6 </span>Script data state</a></li>
+ <li><a href=#plaintext-state><span class=secno>11.2.4.7 </span>PLAINTEXT state</a></li>
+ <li><a href=#tag-open-state><span class=secno>11.2.4.8 </span>Tag open state</a></li>
+ <li><a href=#end-tag-open-state><span class=secno>11.2.4.9 </span>End tag open state</a></li>
+ <li><a href=#tag-name-state><span class=secno>11.2.4.10 </span>Tag name state</a></li>
+ <li><a href=#rcdata-less-than-sign-state><span class=secno>11.2.4.11 </span>RCDATA less-than sign state</a></li>
+ <li><a href=#rcdata-end-tag-open-state><span class=secno>11.2.4.12 </span>RCDATA end tag open state</a></li>
+ <li><a href=#rcdata-end-tag-name-state><span class=secno>11.2.4.13 </span>RCDATA end tag name state</a></li>
+ <li><a href=#rawtext-less-than-sign-state><span class=secno>11.2.4.14 </span>RAWTEXT less-than sign state</a></li>
+ <li><a href=#rawtext-end-tag-open-state><span class=secno>11.2.4.15 </span>RAWTEXT end tag open state</a></li>
+ <li><a href=#rawtext-end-tag-name-state><span class=secno>11.2.4.16 </span>RAWTEXT end tag name state</a></li>
+ <li><a href=#script-data-less-than-sign-state><span class=secno>11.2.4.17 </span>Script data less-than sign state</a></li>
+ <li><a href=#script-data-end-tag-open-state><span class=secno>11.2.4.18 </span>Script data end tag open state</a></li>
+ <li><a href=#script-data-end-tag-name-state><span class=secno>11.2.4.19 </span>Script data end tag name state</a></li>
+ <li><a href=#script-data-escape-start-state><span class=secno>11.2.4.20 </span>Script data escape start state</a></li>
+ <li><a href=#script-data-escape-start-dash-state><span class=secno>11.2.4.21 </span>Script data escape start dash state</a></li>
+ <li><a href=#script-data-escaped-state><span class=secno>11.2.4.22 </span>Script data escaped state</a></li>
+ <li><a href=#script-data-escaped-dash-state><span class=secno>11.2.4.23 </span>Script data escaped dash state</a></li>
+ <li><a href=#script-data-escaped-dash-dash-state><span class=secno>11.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>11.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>11.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>11.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>11.2.4.28 </span>Script data double escape start state</a></li>
+ <li><a href=#script-data-double-escaped-state><span class=secno>11.2.4.29 </span>Script data double escaped state</a></li>
+ <li><a href=#script-data-double-escaped-dash-state><span class=secno>11.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>11.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>11.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>11.2.4.33 </span>Script data double escape end state</a></li>
+ <li><a href=#before-attribute-name-state><span class=secno>11.2.4.34 </span>Before attribute name state</a></li>
+ <li><a href=#attribute-name-state><span class=secno>11.2.4.35 </span>Attribute name state</a></li>
+ <li><a href=#after-attribute-name-state><span class=secno>11.2.4.36 </span>After attribute name state</a></li>
+ <li><a href=#before-attribute-value-state><span class=secno>11.2.4.37 </span>Before attribute value state</a></li>
+ <li><a href=#attribute-value-(double-quoted)-state><span class=secno>11.2.4.38 </span>Attribute value (double-quoted) state</a></li>
+ <li><a href=#attribute-value-(single-quoted)-state><span class=secno>11.2.4.39 </span>Attribute value (single-quoted) state</a></li>
+ <li><a href=#attribute-value-(unquoted)-state><span class=secno>11.2.4.40 </span>Attribute value (unquoted) state</a></li>
+ <li><a href=#character-reference-in-attribute-value-state><span class=secno>11.2.4.41 </span>Character reference in attribute value state</a></li>
+ <li><a href=#after-attribute-value-(quoted)-state><span class=secno>11.2.4.42 </span>After attribute value (quoted) state</a></li>
+ <li><a href=#self-closing-start-tag-state><span class=secno>11.2.4.43 </span>Self-closing start tag state</a></li>
+ <li><a href=#bogus-comment-state><span class=secno>11.2.4.44 </span>Bogus comment state</a></li>
+ <li><a href=#markup-declaration-open-state><span class=secno>11.2.4.45 </span>Markup declaration open state</a></li>
+ <li><a href=#comment-start-state><span class=secno>11.2.4.46 </span>Comment start state</a></li>
+ <li><a href=#comment-start-dash-state><span class=secno>11.2.4.47 </span>Comment start dash state</a></li>
+ <li><a href=#comment-state><span class=secno>11.2.4.48 </span>Comment state</a></li>
+ <li><a href=#comment-end-dash-state><span class=secno>11.2.4.49 </span>Comment end dash state</a></li>
+ <li><a href=#comment-end-state><span class=secno>11.2.4.50 </span>Comment end state</a></li>
+ <li><a href=#comment-end-bang-state><span class=secno>11.2.4.51 </span>Comment end bang state</a></li>
+ <li><a href=#doctype-state><span class=secno>11.2.4.52 </span>DOCTYPE state</a></li>
+ <li><a href=#before-doctype-name-state><span class=secno>11.2.4.53 </span>Before DOCTYPE name state</a></li>
+ <li><a href=#doctype-name-state><span class=secno>11.2.4.54 </span>DOCTYPE name state</a></li>
+ <li><a href=#after-doctype-name-state><span class=secno>11.2.4.55 </span>After DOCTYPE name state</a></li>
+ <li><a href=#after-doctype-public-keyword-state><span class=secno>11.2.4.56 </span>After DOCTYPE public keyword state</a></li>
+ <li><a href=#before-doctype-public-identifier-state><span class=secno>11.2.4.57 </span>Before DOCTYPE public identifier state</a></li>
+ <li><a href=#doctype-public-identifier-(double-quoted)-state><span class=secno>11.2.4.58 </span>DOCTYPE public identifier (double-quoted) state</a></li>
+ <li><a href=#doctype-public-identifier-(single-quoted)-state><span class=secno>11.2.4.59 </span>DOCTYPE public identifier (single-quoted) state</a></li>
+ <li><a href=#after-doctype-public-identifier-state><span class=secno>11.2.4.60 </span>After DOCTYPE public identifier state</a></li>
+ <li><a href=#between-doctype-public-and-system-identifiers-state><span class=secno>11.2.4.61 </span>Between DOCTYPE public and system identifiers state</a></li>
+ <li><a href=#after-doctype-system-keyword-state><span class=secno>11.2.4.62 </span>After DOCTYPE system keyword state</a></li>
+ <li><a href=#before-doctype-system-identifier-state><span class=secno>11.2.4.63 </span>Before DOCTYPE system identifier state</a></li>
+ <li><a href=#doctype-system-identifier-(double-quoted)-state><span class=secno>11.2.4.64 </span>DOCTYPE system identifier (double-quoted) state</a></li>
+ <li><a href=#doctype-system-identifier-(single-quoted)-state><span class=secno>11.2.4.65 </span>DOCTYPE system identifier (single-quoted) state</a></li>
+ <li><a href=#after-doctype-system-identifier-state><span class=secno>11.2.4.66 </span>After DOCTYPE system identifier state</a></li>
+ <li><a href=#bogus-doctype-state><span class=secno>11.2.4.67 </span>Bogus DOCTYPE state</a></li>
+ <li><a href=#cdata-section-state><span class=secno>11.2.4.68 </span>CDATA section state</a></li>
+ <li><a href=#tokenizing-character-references><span class=secno>11.2.4.69 </span>Tokenizing character references</a></ol></li>
+ <li><a href=#tree-construction><span class=secno>11.2.5 </span>Tree construction</a>
<ol>
- <li><a href=#creating-and-inserting-elements><span class=secno>10.2.5.1 </span>Creating and inserting elements</a></li>
- <li><a href=#closing-elements-that-have-implied-end-tags><span class=secno>10.2.5.2 </span>Closing elements that have implied end tags</a></li>
- <li><a href=#foster-parenting><span class=secno>10.2.5.3 </span>Foster parenting</a></li>
- <li><a href=#parsing-main-inhtml><span class=secno>10.2.5.4 </span>The rules for parsing tokens in HTML content</a>
+ <li><a href=#creating-and-inserting-elements><span class=secno>11.2.5.1 </span>Creating and inserting elements</a></li>
+ <li><a href=#closing-elements-that-have-implied-end-tags><span class=secno>11.2.5.2 </span>Closing elements that have implied end tags</a></li>
+ <li><a href=#foster-parenting><span class=secno>11.2.5.3 </span>Foster parenting</a></li>
+ <li><a href=#parsing-main-inhtml><span class=secno>11.2.5.4 </span>The rules for parsing tokens in HTML content</a>
<ol>
- <li><a href=#the-initial-insertion-mode><span class=secno>10.2.5.4.1 </span>The "initial" insertion mode</a></li>
- <li><a href=#the-before-html-insertion-mode><span class=secno>10.2.5.4.2 </span>The "before html" insertion mode</a></li>
- <li><a href=#the-before-head-insertion-mode><span class=secno>10.2.5.4.3 </span>The "before head" insertion mode</a></li>
- <li><a href=#parsing-main-inhead><span class=secno>10.2.5.4.4 </span>The "in head" insertion mode</a></li>
- <li><a href=#parsing-main-inheadnoscript><span class=secno>10.2.5.4.5 </span>The "in head noscript" insertion mode</a></li>
- <li><a href=#the-after-head-insertion-mode><span class=secno>10.2.5.4.6 </span>The "after head" insertion mode</a></li>
- <li><a href=#parsing-main-inbody><span class=secno>10.2.5.4.7 </span>The "in body" insertion mode</a></li>
- <li><a href=#parsing-main-incdata><span class=secno>10.2.5.4.8 </span>The "text" insertion mode</a></li>
- <li><a href=#parsing-main-intable><span class=secno>10.2.5.4.9 </span>The "in table" insertion mode</a></li>
- <li><a href=#parsing-main-intabletext><span class=secno>10.2.5.4.10 </span>The "in table text" insertion mode</a></li>
- <li><a href=#parsing-main-incaption><span class=secno>10.2.5.4.11 </span>The "in caption" insertion mode</a></li>
- <li><a href=#parsing-main-incolgroup><span class=secno>10.2.5.4.12 </span>The "in column group" insertion mode</a></li>
- <li><a href=#parsing-main-intbody><span class=secno>10.2.5.4.13 </span>The "in table body" insertion mode</a></li>
- <li><a href=#parsing-main-intr><span class=secno>10.2.5.4.14 </span>The "in row" insertion mode</a></li>
- <li><a href=#parsing-main-intd><span class=secno>10.2.5.4.15 </span>The "in cell" insertion mode</a></li>
- <li><a href=#parsing-main-inselect><span class=secno>10.2.5.4.16 </span>The "in select" insertion mode</a></li>
- <li><a href=#parsing-main-inselectintable><span class=secno>10.2.5.4.17 </span>The "in select in table" insertion mode</a></li>
- <li><a href=#parsing-main-afterbody><span class=secno>10.2.5.4.18 </span>The "after body" insertion mode</a></li>
- <li><a href=#parsing-main-inframeset><span class=secno>10.2.5.4.19 </span>The "in frameset" insertion mode</a></li>
- <li><a href=#parsing-main-afterframeset><span class=secno>10.2.5.4.20 </span>The "after frameset" insertion mode</a></li>
- <li><a href=#the-after-after-body-insertion-mode><span class=secno>10.2.5.4.21 </span>The "after after body" insertion mode</a></li>
- <li><a href=#the-after-after-frameset-insertion-mode><span class=secno>10.2.5.4.22 </span>The "after after frameset" insertion mode</a></ol></li>
- <li><a href=#parsing-main-inforeign><span class=secno>10.2.5.5 </span>The rules for parsing tokens in foreign content</a></ol></li>
- <li><a href=#the-end><span class=secno>10.2.6 </span>The end</a></li>
- <li><a href=#coercing-an-html-dom-into-an-infoset><span class=secno>10.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>10.2.8 </span>An introduction to error handling and strange cases in the parser</a>
+ <li><a href=#the-initial-insertion-mode><span class=secno>11.2.5.4.1 </span>The "initial" insertion mode</a></li>
+ <li><a href=#the-before-html-insertion-mode><span class=secno>11.2.5.4.2 </span>The "before html" insertion mode</a></li>
+ <li><a href=#the-before-head-insertion-mode><span class=secno>11.2.5.4.3 </span>The "before head" insertion mode</a></li>
+ <li><a href=#parsing-main-inhead><span class=secno>11.2.5.4.4 </span>The "in head" insertion mode</a></li>
+ <li><a href=#parsing-main-inheadnoscript><span class=secno>11.2.5.4.5 </span>The "in head noscript" insertion mode</a></li>
+ <li><a href=#the-after-head-insertion-mode><span class=secno>11.2.5.4.6 </span>The "after head" insertion mode</a></li>
+ <li><a href=#parsing-main-inbody><span class=secno>11.2.5.4.7 </span>The "in body" insertion mode</a></li>
+ <li><a href=#parsing-main-incdata><span class=secno>11.2.5.4.8 </span>The "text" insertion mode</a></li>
+ <li><a href=#parsing-main-intable><span class=secno>11.2.5.4.9 </span>The "in table" insertion mode</a></li>
+ <li><a href=#parsing-main-intabletext><span class=secno>11.2.5.4.10 </span>The "in table text" insertion mode</a></li>
+ <li><a href=#parsing-main-incaption><span class=secno>11.2.5.4.11 </span>The "in caption" insertion mode</a></li>
+ <li><a href=#parsing-main-incolgroup><span class=secno>11.2.5.4.12 </span>The "in column group" insertion mode</a></li>
+ <li><a href=#parsing-main-intbody><span class=secno>11.2.5.4.13 </span>The "in table body" insertion mode</a></li>
+ <li><a href=#parsing-main-intr><span class=secno>11.2.5.4.14 </span>The "in row" insertion mode</a></li>
+ <li><a href=#parsing-main-intd><span class=secno>11.2.5.4.15 </span>The "in cell" insertion mode</a></li>
+ <li><a href=#parsing-main-inselect><span class=secno>11.2.5.4.16 </span>The "in select" insertion mode</a></li>
+ <li><a href=#parsing-main-inselectintable><span class=secno>11.2.5.4.17 </span>The "in select in table" insertion mode</a></li>
+ <li><a href=#parsing-main-afterbody><span class=secno>11.2.5.4.18 </span>The "after body" insertion mode</a></li>
+ <li><a href=#parsing-main-inframeset><span class=secno>11.2.5.4.19 </span>The "in frameset" insertion mode</a></li>
+ <li><a href=#parsing-main-afterframeset><span class=secno>11.2.5.4.20 </span>The "after frameset" insertion mode</a></li>
+ <li><a href=#the-after-after-body-insertion-mode><span class=secno>11.2.5.4.21 </span>The "after after body" insertion mode</a></li>
+ <li><a href=#the-after-after-frameset-insertion-mode><span class=secno>11.2.5.4.22 </span>The "after after frameset" insertion mode</a></ol></li>
+ <li><a href=#parsing-main-inforeign><span class=secno>11.2.5.5 </span>The rules for parsing tokens in foreign content</a></ol></li>
+ <li><a href=#the-end><span class=secno>11.2.6 </span>The end</a></li>
+ <li><a href=#coercing-an-html-dom-into-an-infoset><span class=secno>11.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>11.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>10.2.8.1 </span>Misnested tags: <b><i></b></i></a></li>
- <li><a href=#misnested-tags:-b-p-/b-/p><span class=secno>10.2.8.2 </span>Misnested tags: <b><p></b></p></a></li>
- <li><a href=#unexpected-markup-in-tables><span class=secno>10.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>10.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>10.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>10.2.8.6 </span>Unclosed formatting elements</a></ol></ol></li>
- <li><a href=#serializing-html-fragments><span class=secno>10.3 </span>Serializing HTML fragments</a></li>
- <li><a href=#parsing-html-fragments><span class=secno>10.4 </span>Parsing HTML fragments</a></li>
- <li><a href=#named-character-references><span class=secno>10.5 </span>Named character references</a></ol></li>
- <li><a href=#the-xhtml-syntax><span class=secno>11 </span>The XHTML syntax</a>
+ <li><a href=#misnested-tags:-b-i-/b-/i><span class=secno>11.2.8.1 </span>Misnested tags: <b><i></b></i></a></li>
+ <li><a href=#misnested-tags:-b-p-/b-/p><span class=secno>11.2.8.2 </span>Misnested tags: <b><p></b></p></a></li>
+ <li><a href=#unexpected-markup-in-tables><span class=secno>11.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>11.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>11.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>11.2.8.6 </span>Unclosed formatting elements</a></ol></ol></li>
+ <li><a href=#serializing-html-fragments><span class=secno>11.3 </span>Serializing HTML fragments</a></li>
+ <li><a href=#parsing-html-fragments><span class=secno>11.4 </span>Parsing HTML fragments</a></li>
+ <li><a href=#named-character-references><span class=secno>11.5 </span>Named character references</a></ol></li>
+ <li><a href=#the-xhtml-syntax><span class=secno>12 </span>The XHTML syntax</a>
<ol>
- <li><a href=#writing-xhtml-documents><span class=secno>11.1 </span>Writing XHTML documents</a></li>
- <li><a href=#parsing-xhtml-documents><span class=secno>11.2 </span>Parsing XHTML documents</a></li>
- <li><a href=#serializing-xhtml-fragments><span class=secno>11.3 </span>Serializing XHTML fragments</a></li>
- <li><a href=#parsing-xhtml-fragments><span class=secno>11.4 </span>Parsing XHTML fragments</a></ol></li>
- <li><a href=#rendering><span class=secno>12 </span>Rendering</a>
+ <li><a href=#writing-xhtml-documents><span class=secno>12.1 </span>Writing XHTML documents</a></li>
+ <li><a href=#parsing-xhtml-documents><span class=secno>12.2 </span>Parsing XHTML documents</a></li>
+ <li><a href=#serializing-xhtml-fragments><span class=secno>12.3 </span>Serializing XHTML fragments</a></li>
+ <li><a href=#parsing-xhtml-fragments><span class=secno>12.4 </span>Parsing XHTML fragments</a></ol></li>
+ <li><a href=#rendering><span class=secno>13 </span>Rendering</a>
<ol>
- <li><a href=#introduction-10><span class=secno>12.1 </span>Introduction</a></li>
- <li><a href=#the-css-user-agent-style-sheet-and-presentational-hints><span class=secno>12.2 </span>The CSS user agent style sheet and presentational hints</a>
+ <li><a href=#introduction-11><span class=secno>13.1 </span>Introduction</a></li>
+ <li><a href=#the-css-user-agent-style-sheet-and-presentational-hints><span class=secno>13.2 </span>The CSS user agent style sheet and presentational hints</a>
<ol>
- <li><a href=#introduction-11><span class=secno>12.2.1 </span>Introduction</a></li>
- <li><a href=#display-types><span class=secno>12.2.2 </span>Display types</a></li>
- <li><a href=#margins-and-padding><span class=secno>12.2.3 </span>Margins and padding</a></li>
- <li><a href=#alignment><span class=secno>12.2.4 </span>Alignment</a></li>
- <li><a href=#fonts-and-colors><span class=secno>12.2.5 </span>Fonts and colors</a></li>
- <li><a href=#punctuation-and-decorations><span class=secno>12.2.6 </span>Punctuation and decorations</a></li>
- <li><a href=#resetting-rules-for-inherited-properties><span class=secno>12.2.7 </span>Resetting rules for inherited properties</a></li>
- <li><a href=#the-hr-element-0><span class=secno>12.2.8 </span>The <code>hr</code> element</a></li>
- <li><a href=#the-fieldset-element-0><span class=secno>12.2.9 </span>The <code>fieldset</code> element</a></ol></li>
- <li><a href=#replaced-elements><span class=secno>12.3 </span>Replaced elements</a>
+ <li><a href=#introduction-12><span class=secno>13.2.1 </span>Introduction</a></li>
+ <li><a href=#display-types><span class=secno>13.2.2 </span>Display types</a></li>
+ <li><a href=#margins-and-padding><span class=secno>13.2.3 </span>Margins and padding</a></li>
+ <li><a href=#alignment><span class=secno>13.2.4 </span>Alignment</a></li>
+ <li><a href=#fonts-and-colors><span class=secno>13.2.5 </span>Fonts and colors</a></li>
+ <li><a href=#punctuation-and-decorations><span class=secno>13.2.6 </span>Punctuation and decorations</a></li>
+ <li><a href=#resetting-rules-for-inherited-properties><span class=secno>13.2.7 </span>Resetting rules for inherited properties</a></li>
+ <li><a href=#the-hr-element-0><span class=secno>13.2.8 </span>The <code>hr</code> element</a></li>
+ <li><a href=#the-fieldset-element-0><span class=secno>13.2.9 </span>The <code>fieldset</code> element</a></ol></li>
+ <li><a href=#replaced-elements><span class=secno>13.3 </span>Replaced elements</a>
<ol>
- <li><a href=#embedded-content-2><span class=secno>12.3.1 </span>Embedded content</a></li>
- <li><a href=#timed-text-tracks-0><span class=secno>12.3.2 </span>Timed text tracks</a>
+ <li><a href=#embedded-content-2><span class=secno>13.3.1 </span>Embedded content</a></li>
+ <li><a href=#timed-text-tracks-0><span class=secno>13.3.2 </span>Timed text tracks</a>
<ol>
- <li><a href=#webvtt-cue-text-rendering-rules><span class=secno>12.3.2.1 </span>WebVTT cue text rendering rules</a></li>
- <li><a href=#applying-css-properties-to-webvtt-node-objects><span class=secno>12.3.2.2 </span>Applying CSS properties to WebVTT Node Objects</a></li>
- <li><a href=#css-extensions><span class=secno>12.3.2.3 </span>CSS extensions</a>
+ <li><a href=#webvtt-cue-text-rendering-rules><span class=secno>13.3.2.1 </span>WebVTT cue text rendering rules</a></li>
+ <li><a href=#applying-css-properties-to-webvtt-node-objects><span class=secno>13.3.2.2 </span>Applying CSS properties to WebVTT Node Objects</a></li>
+ <li><a href=#css-extensions><span class=secno>13.3.2.3 </span>CSS extensions</a>
<ol>
- <li><a href="#the-'::cue'-pseudo-element"><span class=secno>12.3.2.3.1 </span>The '::cue' pseudo-element</a></li>
- <li><a href="#the-':past'-and-':future'-pseudo-classes"><span class=secno>12.3.2.3.2 </span>The ':past' and ':future' pseudo-classes</a></ol></ol></li>
- <li><a href=#images-0><span class=secno>12.3.3 </span>Images</a></li>
- <li><a href=#attributes-for-embedded-content-and-images><span class=secno>12.3.4 </span>Attributes for embedded content and images</a></li>
- <li><a href=#image-maps-0><span class=secno>12.3.5 </span>Image maps</a></li>
- <li><a href=#toolbars-0><span class=secno>12.3.6 </span>Toolbars</a></ol></li>
- <li><a href=#bindings><span class=secno>12.4 </span>Bindings</a>
+ <li><a href="#the-'::cue'-pseudo-element"><span class=secno>13.3.2.3.1 </span>The '::cue' pseudo-element</a></li>
+ <li><a href="#the-':past'-and-':future'-pseudo-classes"><span class=secno>13.3.2.3.2 </span>The ':past' and ':future' pseudo-classes</a></ol></ol></li>
+ <li><a href=#images-0><span class=secno>13.3.3 </span>Images</a></li>
+ <li><a href=#attributes-for-embedded-content-and-images><span class=secno>13.3.4 </span>Attributes for embedded content and images</a></li>
+ <li><a href=#image-maps-0><span class=secno>13.3.5 </span>Image maps</a></li>
+ <li><a href=#toolbars-0><span class=secno>13.3.6 </span>Toolbars</a></ol></li>
+ <li><a href=#bindings><span class=secno>13.4 </span>Bindings</a>
<ol>
- <li><a href=#introduction-12><span class=secno>12.4.1 </span>Introduction</a></li>
- <li><a href=#the-button-element-0><span class=secno>12.4.2 </span>The <code>button</code> element</a></li>
- <li><a href=#the-details-element-0><span class=secno>12.4.3 </span>The <code>details</code> element</a></li>
- <li><a href=#the-input-element-as-a-text-entry-widget><span class=secno>12.4.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>12.4.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>12.4.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>12.4.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>12.4.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>12.4.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>12.4.10 </span>The <code>input</code> element as a button</a></li>
- <li><a href=#the-marquee-element-0><span class=secno>12.4.11 </span>The <code>marquee</code> element</a></li>
- <li><a href=#the-meter-element-0><span class=secno>12.4.12 </span>The <code>meter</code> element</a></li>
- <li><a href=#the-progress-element-0><span class=secno>12.4.13 </span>The <code>progress</code> element</a></li>
- <li><a href=#the-select-element-0><span class=secno>12.4.14 </span>The <code>select</code> element</a></li>
- <li><a href=#the-textarea-element-0><span class=secno>12.4.15 </span>The <code>textarea</code> element</a></li>
- <li><a href=#the-keygen-element-0><span class=secno>12.4.16 </span>The <code>keygen</code> element</a></li>
- <li><a href=#the-time-element-0><span class=secno>12.4.17 </span>The <code>time</code> element</a></ol></li>
- <li><a href=#frames-and-framesets><span class=secno>12.5 </span>Frames and framesets</a></li>
- <li><a href=#interactive-media><span class=secno>12.6 </span>Interactive media</a>
+ <li><a href=#introduction-13><span class=secno>13.4.1 </span>Introduction</a></li>
+ <li><a href=#the-button-element-0><span class=secno>13.4.2 </span>The <code>button</code> element</a></li>
+ <li><a href=#the-details-element-0><span class=secno>13.4.3 </span>The <code>details</code> element</a></li>
+ <li><a href=#the-input-element-as-a-text-entry-widget><span class=secno>13.4.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>13.4.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>13.4.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>13.4.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>13.4.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>13.4.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>13.4.10 </span>The <code>input</code> element as a button</a></li>
+ <li><a href=#the-marquee-element-0><span class=secno>13.4.11 </span>The <code>marquee</code> element</a></li>
+ <li><a href=#the-meter-element-0><span class=secno>13.4.12 </span>The <code>meter</code> element</a></li>
+ <li><a href=#the-progress-element-0><span class=secno>13.4.13 </span>The <code>progress</code> element</a></li>
+ <li><a href=#the-select-element-0><span class=secno>13.4.14 </span>The <code>select</code> element</a></li>
+ <li><a href=#the-textarea-element-0><span class=secno>13.4.15 </span>The <code>textarea</code> element</a></li>
+ <li><a href=#the-keygen-element-0><span class=secno>13.4.16 </span>The <code>keygen</code> element</a></li>
+ <li><a href=#the-time-element-0><span class=secno>13.4.17 </span>The <code>time</code> element</a></ol></li>
+ <li><a href=#frames-and-framesets><span class=secno>13.5 </span>Frames and framesets</a></li>
+ <li><a href=#interactive-media><span class=secno>13.6 </span>Interactive media</a>
<ol>
- <li><a href=#links,-forms,-and-navigation><span class=secno>12.6.1 </span>Links, forms, and navigation</a></li>
- <li><a href=#the-title-attribute-0><span class=secno>12.6.2 </span>The <code title=attr-title>title</code> attribute</a></li>
- <li><a href=#editing-hosts><span class=secno>12.6.3 </span>Editing hosts</a></li>
- <li><a href=#text-rendered-in-native-user-interfaces><span class=secno>12.6.4 </span>Text rendered in native user interfaces</a></ol></li>
- <li><a href=#print-media><span class=secno>12.7 </span>Print media</a></ol></li>
- <li><a href=#obsolete><span class=secno>13 </span>Obsolete features</a>
+ <li><a href=#links,-forms,-and-navigation><span class=secno>13.6.1 </span>Links, forms, and navigation</a></li>
+ <li><a href=#the-title-attribute-0><span class=secno>13.6.2 </span>The <code title=attr-title>title</code> attribute</a></li>
+ <li><a href=#editing-hosts><span class=secno>13.6.3 </span>Editing hosts</a></li>
+ <li><a href=#text-rendered-in-native-user-interfaces><span class=secno>13.6.4 </span>Text rendered in native user interfaces</a></ol></li>
+ <li><a href=#print-media><span class=secno>13.7 </span>Print media</a></ol></li>
+ <li><a href=#obsolete><span class=secno>14 </span>Obsolete features</a>
<ol>
- <li><a href=#obsolete-but-conforming-features><span class=secno>13.1 </span>Obsolete but conforming features</a>
+ <li><a href=#obsolete-but-conforming-features><span class=secno>14.1 </span>Obsolete but conforming features</a>
<ol>
- <li><a href=#warnings-for-obsolete-but-conforming-features><span class=secno>13.1.1 </span>Warnings for obsolete but conforming features</a></ol></li>
- <li><a href=#non-conforming-features><span class=secno>13.2 </span>Non-conforming features</a></li>
- <li><a href=#requirements-for-implementations><span class=secno>13.3 </span>Requirements for implementations</a>
+ <li><a href=#warnings-for-obsolete-but-conforming-features><span class=secno>14.1.1 </span>Warnings for obsolete but conforming features</a></ol></li>
+ <li><a href=#non-conforming-features><span class=secno>14.2 </span>Non-conforming features</a></li>
+ <li><a href=#requirements-for-implementations><span class=secno>14.3 </span>Requirements for implementations</a>
<ol>
- <li><a href=#the-applet-element><span class=secno>13.3.1 </span>The <code>applet</code> element</a></li>
- <li><a href=#the-marquee-element><span class=secno>13.3.2 </span>The <code>marquee</code> element</a></li>
- <li><a href=#frames><span class=secno>13.3.3 </span>Frames</a></li>
- <li><a href=#other-elements,-attributes-and-apis><span class=secno>13.3.4 </span>Other elements, attributes and APIs</a></ol></ol></li>
- <li><a href=#iana><span class=secno>14 </span>IANA considerations</a>
+ <li><a href=#the-applet-element><span class=secno>14.3.1 </span>The <code>applet</code> element</a></li>
+ <li><a href=#the-marquee-element><span class=secno>14.3.2 </span>The <code>marquee</code> element</a></li>
+ <li><a href=#frames><span class=secno>14.3.3 </span>Frames</a></li>
+ <li><a href=#other-elements,-attributes-and-apis><span class=secno>14.3.4 </span>Other elements, attributes and APIs</a></ol></ol></li>
+ <li><a href=#iana><span class=secno>15 </span>IANA considerations</a>
<ol>
- <li><a href=#text/html><span class=secno>14.1 </span><code>text/html</code></a></li>
- <li><a href=#text/html-sandboxed><span class=secno>14.2 </span><code>text/html-sandboxed</code></a></li>
- <li><a href=#application/xhtml+xml><span class=secno>14.3 </span><code>application/xhtml+xml</code></a></li>
- <li><a href=#text/cache-manifest><span class=secno>14.4 </span><code>text/cache-manifest</code></a></li>
- <li><a href=#text/ping><span class=secno>14.5 </span><code>text/ping</code></a></li>
- <li><a href=#text/vtt><span class=secno>14.6 </span><code>text/vtt</code></a></li>
- <li><a href=#application/microdata+json><span class=secno>14.7 </span><code>application/microdata+json</code></a></li>
- <li><a href=#ping-from><span class=secno>14.8 </span><code>Ping-From</code></a></li>
- <li><a href=#ping-to><span class=secno>14.9 </span><code>Ping-To</code></a></ol></li>
+ <li><a href=#text/html><span class=secno>15.1 </span><code>text/html</code></a></li>
+ <li><a href=#text/html-sandboxed><span class=secno>15.2 </span><code>text/html-sandboxed</code></a></li>
+ <li><a href=#application/xhtml+xml><span class=secno>15.3 </span><code>application/xhtml+xml</code></a></li>
+ <li><a href=#text/cache-manifest><span class=secno>15.4 </span><code>text/cache-manifest</code></a></li>
+ <li><a href=#text/ping><span class=secno>15.5 </span><code>text/ping</code></a></li>
+ <li><a href=#text/vtt><span class=secno>15.6 </span><code>text/vtt</code></a></li>
+ <li><a href=#application/microdata+json><span class=secno>15.7 </span><code>application/microdata+json</code></a></li>
+ <li><a href=#ping-from><span class=secno>15.8 </span><code>Ping-From</code></a></li>
+ <li><a href=#ping-to><span class=secno>15.9 </span><code>Ping-To</code></a></ol></li>
<li><a class=no-num href=#index>Index</a>
<ol>
<li><a class=no-num href=#elements-1>Elements</a></li>
@@ -1327,7 +1333,7 @@
beyond HTML5 (and that are therefore not included in the W3C version
of HTML5) currently consist of:</p>
- <ul class=brief><li>The <code><a href=#devices>device</a></code> element.</li> <!--DEVICE-->
+ <ul class=brief><li>The <code><a href=#peerconnection>PeerConnection</a></code> API and related video-conferencing features.</li> <!--DEVICE-->
<li>The <code title=attr-hyperlink-ping><a href=#ping>ping</a></code> attribute and related <a href=#hyperlink-auditing>hyperlink auditing</a> features.</li> <!--PING-->
<li>The <a href=#webvtt>WebVTT</a> format and some <a href=#text-track>text track</a> API features.</li> <!--TT--> <!--TTVTT-->
<li>Rules for <a href=#atom>converting HTML to Atom</a>.</li> <!--MD-->
@@ -24791,7 +24797,7 @@
zero or more <code><a href=#the-track-element>track</a></code> elements, then
<!--KEEP-START w3c-html--><!--TT-->
<a href=#transparent>transparent</a>, but with no <a href=#media-element>media element</a> descendants.</dd>
- <dd>If the element does not have a <code title=attr-media-src><a href=#attr-media-src>src</a></code> attribute: one or more <code><a href=#the-source-element>source</a></code> elements, then
+ <dd>If the element does not have a <code title=attr-media-src><a href=#attr-media-src>src</a></code> attribute: zero or more <code><a href=#the-source-element>source</a></code> elements, then
<!--KEEP-END w3c-html--><!--TT-->
zero or more <code><a href=#the-track-element>track</a></code> elements, then
<!--KEEP-START w3c-html--><!--TT-->
@@ -27318,8 +27324,8 @@
<a href=#queue-a-task>queue a task</a> to <a href=#fire-a-simple-event>fire a simple event</a>
named <code title=event-media-playing><a href=#event-media-playing>playing</a></code>.</p>
- <p class=note>User agents are not required to autoplay, and it
- is suggested that user agents honor user preferences on the
+ <p class=note>User agents do not need to support autoplay,
+ and it is suggested that user agents honor user preferences on the
matter. Authors are urged to use the <code title=attr-media-autoplay><a href=#attr-media-autoplay>autoplay</a></code> attribute rather than
using script to force the video to play, so as to allow the user
to override the behavior if so desired.</p>
@@ -50714,236 +50720,8 @@
</ol></div>
-<!--DEVICE-->
-<div data-component="other Hixie drafts (editor: Ian Hickson)">
- <h4 id=devices><span class=secno>4.11.6 </span>The <dfn><code>device</code></dfn> element</h4>
-
- <dl class=element><dt>Categories</dt>
- <dd><a href=#flow-content>Flow content</a>.</dd>
- <dd><a href=#phrasing-content>Phrasing content</a>.</dd>
- <dd><a href=#interactive-content>Interactive content</a>.</dd>
- <dt>Contexts in which this element can be used:</dt>
- <dd>Where <a href=#phrasing-content>phrasing content</a> is expected.</dd>
- <dt>Content model:</dt>
- <dd>Empty.</dd>
- <dt>Content attributes:</dt>
- <dd><a href=#global-attributes>Global attributes</a></dd>
- <dd><code title=attr-device-type><a href=#attr-device-type>type</a></code></dd>
- <dt>DOM interface:</dt>
- <dd>
-<pre class=idl>interface <dfn id=htmldeviceelement>HTMLDeviceElement</dfn> : <a href=#htmlelement>HTMLElement</a> {
- attribute DOMString <span title=dom-device-type>type</span>;
- readonly attribute any <span title=dom-device-data>data</span>;
-};</pre>
- </dl><p>The <code><a href=#devices>device</a></code> element represents a device selector, to
- allow the user to give the page access to a device, for example a
- video camera.</p>
-
- <p>The <dfn id=attr-device-type title=attr-device-type><code>type</code></dfn>
- attribute allows the author to specify which kind of device the page
- would like access to. The attribute is an <a href=#enumerated-attribute>enumerated
- attribute</a> with the keywords given in the first column of the
- following table, and their corresponding states given in the cell in
- second column of the same row.</p>
-
- <p class=XXX>RS232 and USB are only included below to give an idea
- of where we could go with this. <strong>Should we instead just make
- this only useful for audiovisual streams?</strong> Unless there are
- compelling reasons, we probably should not be this generic. So far,
- the reasons for RS232 aren't that compelling. For USB, slightly more
- so.</p>
-
- <table><thead><tr><th>Keyword
- <th>State
- <th>Device description
- <th>Examples
- <tbody><tr><td><dfn id=attr-device-type-keyword-media title=attr-device-type-keyword-media><code>media</code></dfn>
- <td><span title=attr-device-type-media>Media</span>
- <td>Stream of audio and/or video data.
- <td>A webcam.
- <tr><td><dfn id=attr-device-type-keyword-fs title=attr-device-type-keyword-fs><code>fs</code></dfn>
- <td><span title=attr-device-type-fs>File system</span>
- <td>File system.
- <td>A USB-connected media player.
- <tr><td><dfn id=attr-device-type-keyword-rs232 title=attr-device-type-keyword-rs232><code>rs232</code></dfn>
- <td><span title=attr-device-type-rs232>RS232</span>
- <td>RS232 device.
- <td>A serial port.
- <tr><td><dfn id=attr-device-type-keyword-usb title=attr-device-type-keyword-usb><code>usb</code></dfn>
- <td><span title=attr-device-type-usb>USB</span>
- <td>USB device.
- <td>A scanner, a music player, a disk jockey, a fish tank.
- </table><p class=XXX>processing model: 'change' event fires once user
- selects a new device; .data is set to new Stream, LocalFS, USB, or
- RS232 object as appropriate.</p>
-
- <div class=example>
-
- <pre><p>To start chatting, select a video camera: <device type=media onchange="update(this.data)"></p>
-<video autoplay></video>
-<script>
- function update(stream) {
- document.getElementsByTagName('video')[0].src = stream.url;
- }
-</script></pre>
-
- </div>
-
- <p class=XXX>The <code><a href=#devices>device</a></code> element is intended to be a
- void element, but the parser spec hasn't yet been updated. This
- section of the spec is very much awaiting implementation
- experience.</p>
-
-
- <h5 id=stream-api><span class=secno>4.11.6.1 </span>Stream API</h5>
-
- <p>The <code><a href=#stream>Stream</a></code> interface is used to represent
- streams.</p>
-
- <pre class=idl>interface <dfn id=stream>Stream</dfn> {
- readonly attribute DOMString <a href=#dom-stream-url title=dom-stream-url>url</a>;
- <a href=#streamrecorder>StreamRecorder</a> <a href=#dom-stream-record title=dom-stream-record>record</a>();
-};</pre>
-
- <p>The <dfn id=dom-stream-url title=dom-stream-url><code>url</code></dfn> attribute
- must return a <span title=fileURN>File URN</span> representing the
- stream. <a href=#refsFILEAPI>[FILEAPI]</a></p>
-
- <p>For audio and video streams, the stream must be in a format
- supported by the user agent for use in <code><a href=#audio>audio</a></code> and
- <code><a href=#video>video</a></code> elements.</p>
-
- <p class=XXX>This will be pinned down to a specific codec.</p>
-
- <p>When the <dfn id=dom-stream-record title=dom-stream-record><code>record()</code></dfn> method is
- invoked, the user agent must return a new
- <code><a href=#streamrecorder>StreamRecorder</a></code> object associated with the stream.</p>
-
- <pre class=idl>interface <dfn id=streamrecorder>StreamRecorder</dfn> {
- <span>File</span> <a href=#dom-streamrecorder-stop title=dom-StreamRecorder-stop>stop</a>();
-};</pre>
-
- <p>The <dfn id=dom-streamrecorder-stop title=dom-StreamRecorder-stop><code>stop()</code></dfn> method
- must return a new <code>File</code> object representing the data
- that was streamed between the creation of the
- <code><a href=#streamrecorder>StreamRecorder</a></code> object and the invocation of the <code title=dom-StreamRecorder-stop><a href=#dom-streamrecorder-stop>stop()</a></code> method. <a href=#refsFILEAPI>[FILEAPI]</a></p>
-
- <p>For audio and video streams, the file must be in a format
- supported by the user agent for use in <code><a href=#audio>audio</a></code> and
- <code><a href=#video>video</a></code> elements.</p>
-
- <p class=XXX>This again will be pinned down to a specific codec.</p>
-
-
- <h5 id=peer-to-peer-connections><span class=secno>4.11.6.2 </span>Peer-to-peer connections</h5>
-
- <p class=XXX>This section will be moved to a more appropriate
- location in due course; it is here currently to keep it near the
- <code><a href=#devices>device</a></code> element to allow reviewers to look at it.</p>
-
- <pre class=idl>[Constructor(in DOMString serverConfiguration)]
-interface <dfn id=connectionpeer>ConnectionPeer</dfn> {
- void sendText(in DOMString text, in optional boolean unimportant); // if second arg is true, then use unreliable low-latency transport (UDP-like), otherwise guarantee delivery (TCP-like)
- attribute <a href=#function>Function</a> ontext; // receiving
-
- void sendBitmap(in HTMLImageElement image);
- attribute <a href=#function>Function</a> onbitmap; // receiving
-
- void sendFile(in File file);
- attribute <a href=#function>Function</a> onfile; // receiving
-
- void addStream(in Stream stream);
- void removeStream(in Stream stream);
- readonly attribute Stream[] localStreams;
- readonly attribute Stream[] remoteStreams;
- attribute <a href=#function>Function</a> onstream; // receiving
-
- void <span title=dom-ConnectionPeer-getLocalConfiguration>getLocalConfiguration</span>(in <a href=#connectionpeerconfigurationcallback>ConnectionPeerConfigurationCallback</a> callback); // maybe this should be in the constructor, or be an event
- void <span title=dom-ConnectionPeer-addRemoteConfiguration>addRemoteConfiguration</span>(in DOMString configuration, in optional DOMString remoteOrigin); // remote origin is assumed to be same-origin if not specified. If specified, has to match remote origin (checked in handshake). Should support leading "*." to mean "any subdomain of".
- void close(); // disconnects and stops listening
-
- attribute <a href=#function>Function</a> onconnect;
- attribute <a href=#function>Function</a> onerror;
- attribute <a href=#function>Function</a> ondisconnect;
-};
-<a href=#connectionpeer>ConnectionPeer</a> implements <a href=#eventtarget>EventTarget</a>;
-
-[Callback=FunctionOnly, NoInterfaceObject]
-interface <dfn id=connectionpeerconfigurationcallback>ConnectionPeerConfigurationCallback</dfn> {
- void <span title=dom-ConnectionPeerConfigurationCallback-handleEvent>handleEvent</span>(in <a href=#connectionpeer>ConnectionPeer</a> server, in DOMString configuration);
-};</pre>
-
- <p class=XXX>...</p>
-
- <div class=XXX>
-
- <p>This relies on some currently hypothetical other standard to
- define:</p>
-
- <ul><li>The format of server configuration strings.
- <li>The format of client configuration strings.
- <li>The protocols that clients use to talk to third-party servers mentioned in the server configuration strings.
- <li>The protocols that clients use to talk to each other.
- </ul></div>
-
- <div class=example>
-
- <p>When two peers decide they are going to set up a connection to
- each other, they both go through these steps. The serverConfig
- comes from a third-party server they can use to get things like
- their public IP address or to set up NAT traversal. They also have
- to send their respective configuration to each other using the same
- out-of-band mechanism they used to establish that they were going
- to communicate in the first place.</p>
-
- <pre>var serverConfig = ...; // configuration string obtained from server
-// contains details such as the IP address of a server that can speak some
-// protocol to help the client determine its public IP address, route packets
-// if necessary, etc.
-
-var local = new ConnectionPeer(serverConfig);
-local.getLocalConfiguration(function (configuration) {
- if (configuration != '') {
- ...; // send configuration to other peer using out-of-band mechanism
- } else {
- // we've exhausted our options; wait for connection
- }
-});
-
-function ... (configuration) {
- // called whenever we get configuration information out-of-band
- local.addRemoteConfiguration(configuration);
-}
-
-local.onconnect = function (event) {
- // we are connected!
- local.sendText('Hello');
- local.addStream(...); // send video
- local.onstream = function (event) {
- // receive video
- // (videoElement is some <video> element)
- if (local.remoteStreams.length > 0)
- videoElement.src = local.remoteStreams[0].url;
- };
-};</pre>
-
- </div>
-
- <p class=warning>To prevent network sniffing from allowing a
- fourth party to establish a connection to a peer using the
- information sent out-of-band to the other peer and thus spoofing the
- client, the configuration information should always be transmitted
- using an encrypted connection.</p>
-
-
-</div>
-<!--DEVICE-->
-
-
-
-
<h3 id=links><span class=secno>4.12 </span>Links</h3>
<h4 id=introduction-2><span class=secno>4.12.1 </span>Introduction</h4>
@@ -66740,7 +66518,6 @@
-
<h2 id=editing><span class=secno>8 </span><dfn>User interaction</dfn></h2>
@@ -71207,13 +70984,1446 @@
v2 (well, really v0):
"forecolor", "hilitecolor", "fontname", "fontsize", "justifyleft",
"justifycenter", "justifyright", "justifyfull", "indent", "outdent"
---><h2 id=comms><span class=secno>9 </span>Communication</h2>
+--><div data-component="other Hixie drafts (editor: Ian Hickson)">
+ <h2 id=video-conferencing-and-peer-to-peer-communication><span class=secno>9 </span>Video conferencing and peer-to-peer communication</h2>
+
+ <h3 id=introduction-8><span class=secno>9.1 </span>Introduction</h3>
+
+ <p><i>This section is non-normative.</i></p>
+
+ <p>There are a number of facets to video-conferencing in HTML:</p>
+
+ <ul><li>Getting a multimedia stream (video, audio, or both) from local
+ devices (video cameras, microphones, Web cams) or from prerecorded
+ files provided by the user.</li>
+
+ <li>Recording such streams locally.</li>
+
+ <li>Connecting to remote peers using NAT-traversal technologies
+ such as ICE, STUN, and TURN.</li>
+
+ <li>Sending the locally-produced streams to remote peers and
+ receiving streams from remote peers.</li>
+
+ <li>Displaying such streams (both the locally-produced ones and the
+ remotely-obtained ones) locally using the <code><a href=#video>video</a></code> or
+ <code><a href=#audio>audio</a></code> elements.</li>
+
+ <li>Sending arbitrary data to remote peers.</li>
+
+ </ul><p>This section defines the APIs used for these features.</p>
+
+
+ <h4 id=obtaining-local-multimedia-content><span class=secno>9.1.1 </span>Obtaining local multimedia content</h4>
+
+ <pre class=idl>[Supplemental, NoInterfaceObject]
+interface <dfn id=navigatorusermedia>NavigatorUserMedia</dfn> {
+ void <a href=#dom-navigator-getusermedia title=dom-navigator-getUserMedia>getUserMedia</a>(in DOMString options, in <a href=#navigatorusermediasuccesscallback>NavigatorUserMediaSuccessCallback</a> successCallback, in optional <a href=#navigatorusermediaerrorcallback>NavigatorUserMediaErrorCallback</a> errorCallback);
+};
+<a href=#navigator>Navigator</a> implements <a href=#navigatorusermedia>NavigatorUserMedia</a>;
+
+[Callback=FunctionOnly, NoInterfaceObject]
+interface <dfn id=navigatorusermediasuccesscallback>NavigatorUserMediaSuccessCallback</dfn> {
+ void <span title=dom-NavigatorUserMediaSuccessCallback-handleEvent>handleEvent</span>(in <a href=#generatedstream>GeneratedStream</a> stream);
+};
+
+[NoInterfaceObject]<!-- this is based on PositionError in geolocation -->
+interface <dfn id=navigatorusermediaerror>NavigatorUserMediaError</dfn> {
+ const unsigned short <a href=#dom-navigatorusermediaerror-permission_denied title=dom-NavigatorUserMediaError-PERMISSION_DENIED>PERMISSION_DENIED</a> = 1;<!--
+ const unsigned short <span title="dom-NavigatorUserMediaError-UNAVAILABLE">UNAVAILABLE</span> = 2;
+ const unsigned short <span title="dom-NavigatorUserMediaError-TIMEOUT">TIMEOUT</span> = 3;-->
+ readonly attribute unsigned short <a href=#dom-navigatorusermediaerror-code title=dom-NavigatorUserMediaError-code>code</a>;<!--
+ readonly attribute DOMString <span title="dom-NavigatorUserMediaError-message">message</span>;-->
+};
+
+[Callback=FunctionOnly, NoInterfaceObject]
+interface <dfn id=navigatorusermediaerrorcallback>NavigatorUserMediaErrorCallback</dfn> {
+ void <span title=dom-NavigatorUserMediaSuccessCallback-handleEvent>handleEvent</span>(in <a href=#navigatorusermediaerror>NavigatorUserMediaError</a> error);
+};</pre>
+
+ <dl class=domintro><dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-navigator-getUserMedia><a href=#dom-navigator-getusermedia>getUserMedia</a></code>(<var title="">options</var>, <var title="">successCallback</var> [, <var title="">errorCallback</var> ] )</dt>
+
+ <dd>
+
+ <p>Prompts the user for permission to use their Web cam or other
+ video or audio input.</p>
+
+ <p>The <var title="">options</var> argument is a string of
+ comma-separated values from the following list:</p>
+
+ <dl><dt>"<code title="">audio</code>"</dt>
+
+ <dd>The provided media needs to include audio data.</dd>
+
+
+ <dt>"<code title="">video</code>"</dt>
+
+ <dd>The provided media needs to include video data.</dd>
+
+
+ </dl><p>If the user accepts, the <var title="">successCallback</var> is
+ invoked, with a suitable <code><a href=#generatedstream>GeneratedStream</a></code> object as
+ its argument.</p>
+
+ <p>If the user declines, the <var title="">errorCallback</var> (if
+ any) is invoked.</p>
+
+ </dd>
+
+
+ <dt><var title="">error</var> . <code title=dom-NavigatorUserMediaError-code><a href=#dom-navigatorusermediaerror-code>code</a></code></dt>
+
+ <dd>
+
+ <p>Returns the current error's error code. At this time, this will
+ always be 1, for which the constant <code title=dom-NavigatorUserMediaError-PERMISSION_DENIED><a href=#dom-navigatorusermediaerror-permission_denied>PERMISSION_DENIED</a></code>
+ is defined.</p>
+
+ </dd>
+
+ </dl><div class=impl>
+
+ <p>When the <dfn id=dom-navigator-getusermedia title=dom-navigator-getUserMedia><code>getUserMedia()</code></dfn>
+ method is called, the user agent must run the following steps:</p>
+
+ <ol><li><p>Let <var title="">options</var> be the method's first
+ argument.</li>
+
+ <li><p>Let <var title="">successCallback</var> be the callback
+ indicated by the method's second argument.</li>
+
+ <li><p>Let <var title="">errorCallback</var> be the callback
+ indicated by the method's third argument, if any, or null
+ otherwise.</li>
+
+ <li><p>If <var title="">successCallback</var> is null, abort these
+ steps.</li> <!-- we could throw an exception instead (that's
+ why the method doesn't return until later: so that we can add an
+ exception here, or for /options/ below, without changing the
+ algorithm) -->
+
+ <li><p><a href=#split-a-string-on-spaces title="split a string on spaces">Split <var title="">options</var> on spaces</a> to obtain <var title="">list of options</var>.</li>
+
+ <li><p>If one of the tokens in <var title="">list of options</var>
+ is a <a href=#case-sensitive>case-sensitive</a> match for the string "<code title="">audio</code>", let <var title="">audio</var> be true.
+ Otherwise, let it be false.</li>
+
+ <li><p>If one of the tokens in <var title="">list of options</var>
+ is a <a href=#case-sensitive>case-sensitive</a> match for the string "<code title="">video</code>", let <var title="">video</var> be true.
+ Otherwise, let it be false.</li>
+
+ <!-- any error handling for /options/ should be done here (that's
+ why the method doesn't return until the next step: so we can add
+ exception throwing here) -->
+
+ <li><p>Return, and run the remaining steps asynchronously.</li>
+
+ <li><p>Optionally, e.g. based on a previously-established user
+ preference, for security reasons, or due to platform limitations,
+ jump to the step labeled <i>failure</i> below.</li>
+
+ <li>
+
+ <p>Prompt the user in a user-agent-specific manner for permission
+ to provide the <a href=#entry-script>entry script</a>'s <a href=#origin>origin</a>
+ with a <code><a href=#generatedstream>GeneratedStream</a></code> object representing a media
+ stream.</p>
+
+ <p>If <var title="">audio</var> is true, then the provided media
+ should include an audio component. If <var title="">audio</var>
+ is false, then the provided media must not include an audio
+ component.</p>
+
+ <p>If <var title="">video</var> is true, then the provided media
+ should include a video component. If <var title="">video</var> is
+ false, then the provided media must not include a video
+ component.</p>
+
+ <p>User agents are encouraged to default to using the user's
+ primary or system default camera and/or microphone (as
+ appropriate) to generate the media stream. User agents may allow
+ users to use any media source, including pre-recorded media
+ files.</p>
+
+ <p>If the user grants permission to use local recording devices,
+ user agents are encouraged to include a prominent indicator that
+ the devices are "hot" (i.e. an "on-air" or "recording"
+ indicator).</p>
+
+ <p>If the user denies permission, jump to the step labeled
+ <i>failure</i> below. If the user never responds, this algorithm
+ stalls on this step.</p>
+
+ </li>
+
+ <li><p>Let <var title="">stream</var> be the
+ <code><a href=#generatedstream>GeneratedStream</a></code> object for which the user granted
+ permission.</li>
+
+ <li><p><a href=#queue-a-task>Queue a task</a> to invoke <var title="">successCallback</var> with <var title="">stream</var> as
+ its argument.</li>
+
+ <li><p>Abort these steps.</li>
+
+ <li><p><i>Failure</i>: If <var title="">errorCallback</var> is
+ null, abort these steps.</li>
+
+ <li><p>Let <var title="">error</var> be a new
+ <code><a href=#navigatorusermediaerror>NavigatorUserMediaError</a></code> object whose <code title=dom-NavigatorUserMediaError-code><a href=#dom-navigatorusermediaerror-code>code</a></code> attribute has
+ the numeric value 1 (<code title=dom-NavigatorUserMediaError-PERMISSION_DENIED><a href=#dom-navigatorusermediaerror-permission_denied>PERMISSION_DENIED</a></code>).</li>
+
+ <li><p><a href=#queue-a-task>Queue a task</a> to invoke <var title="">errorCallback</var> with <var title="">error</var> as its
+ argument.</li>
+
+ </ol><p>The <a href=#task-source>task source</a> for these <a href=#concept-task title=concept-task>tasks</a> is the <a href=#user-interaction-task-source>user interaction task
+ source</a>.</p>
+
+ <hr><p>The <dfn id=dom-navigatorusermediaerror-code title=dom-NavigatorUserMediaError-code><code>code</code></dfn>
+ attribute of a <code><a href=#navigatorusermediaerror>NavigatorUserMediaError</a></code> object must return the code
+ for the error, which must be <!--one of--> the following:</p>
+
+ <dl><dt><dfn id=dom-navigatorusermediaerror-permission_denied title=dom-NavigatorUserMediaError-PERMISSION_DENIED><code>PERMISSION_DENIED</code></dfn> (numeric value 1)</dt>
+
+ <dd>The user denied the page permission to use the user's media devices.</dd>
+
+ </dl></div>
+
+ <div class=example>
+
+ <p>A voice chat feature in a game could attempt to get access to
+ the user's microphone by calling the API as follows:</p>
+
+ <pre><script>
+ navigator.getUserMedia('audio', gotAudio);
+ function gotAudio(stream) {
+ // ... use 'stream' ...
+ }
+</script></pre>
+
+ </div>
+
+ <div class=example>
+
+ <p>A video-conferencing system would ask for both audio and video:</p>
+
+ <pre><script>
+ function beginCall() {
+ navigator.getUserMedia('audio,video', gotStream);
+ }
+ function gotStream(stream) {
+ // ... use 'stream' ...
+ }
+</script></pre>
+
+ </div>
+
+
+
+ <h4 id=stream-api><span class=secno>9.1.2 </span>Stream API</h4>
+
+ <p>The <code><a href=#stream>Stream</a></code> interface is used to represent streams,
+ typically (but not necessarily) of audio and/or video content, e.g.
+ from a local camera or a remote site.</p>
+
+ <p>The <code><a href=#generatedstream>GeneratedStream</a></code> interface is used when the user
+ agent is generating the stream's data (e.g. from a camera or
+ streaming it from a local video file). It allows authors to pause
+ the generation of the content, e.g. to allow the user to temporarily
+ disable a local camera during a video-conference chat.</p>
+
+ <p>When a <code><a href=#generatedstream>GeneratedStream</a></code> object is being generated
+ from a local file (as opposed to a live audio/video source), the
+ user agent should stream the data from the file in real time, not
+ all at once. This reduces the ease with which pages can distinguish
+ live video from pre-recorded video, which can help protect the
+ user's privacy.</p>
+
+ <!-- v2: support reading the bits from the stream directly, for use
+ with streaming over WebSocket? Or do we rely on FileReader for that? -->
+
+ <pre class=idl>interface <dfn id=stream>Stream</dfn> {
+ readonly attribute DOMString <a href=#dom-stream-label title=dom-stream-label>label</a>;
+ <a href=#streamrecorder>StreamRecorder</a> <a href=#dom-stream-record title=dom-stream-record>record</a>();
+<!--
+ const unsigned short <span title="dom-stream-LOADING">LOADING</span> = 0; -->
+ const unsigned short <a href=#dom-stream-live title=dom-stream-LIVE>LIVE</a> = 1;
+ const unsigned short <a href=#dom-stream-ended title=dom-stream-ENDED>ENDED</a> = 2;
+ readonly attribute unsigned short <a href=#dom-stream-readystate title=dom-stream-readyState>readyState</a>;
+ attribute <a href=#function>Function</a> <a href=#handler-stream-onreadystatechange title=handler-stream-onreadystatechange>onreadystatechange</a>;
+ attribute <a href=#function>Function</a> <a href=#handler-stream-onended title=handler-stream-onended>onended</a>;
+};
+<a href=#stream>Stream</a> implements <a href=#eventtarget>EventTarget</a>;
+
+interface <dfn id=generatedstream>GeneratedStream</dfn> {
+ void <a href=#dom-stream-stop title=dom-stream-stop>stop</a>();
+
+ // temporarily pausing the stream
+ const unsigned short <a href=#dom-stream-paused title=dom-stream-PAUSED>PAUSED</a> = 3;
+ void <a href=#dom-stream-pause title=dom-stream-pause>pause</a>();
+ void <a href=#dom-stream-resume title=dom-stream-resume>resume</a>();
+ attribute <a href=#function>Function</a> <a href=#handler-stream-onpause title=handler-stream-onpause>onpause</a>;
+ attribute <a href=#function>Function</a> <a href=#handler-stream-onplay title=handler-stream-onplay>onplay</a>;
+};</pre>
+
+ <dl class=domintro><dt><var title="">stream</var> . <code title=dom-stream-label><a href=#dom-stream-label>label</a></code></dt>
+
+ <dd>
+
+ <p>Returns a label that is unique to this stream, so that streams
+ can be recognised after they are sent through the
+ <code><a href=#peerconnection>PeerConnection</a></code> API.</p>
+
+ </dd>
+
+
+ <dt><var title="">recorder</var> = <var title="">stream</var> . <code title=dom-stream-record><a href=#dom-stream-record>record</a></code>()</dt>
+
+ <dd>
+
+ <p>Begins recording the stream. The returned
+ <code><a href=#streamrecorder>StreamRecorder</a></code> object provides access to the recorded
+ data.</p>
+
+ </dd>
+
+
+ <dt><var title="">stream</var> . <code title=dom-stream-stop><a href=#dom-stream-stop>stop</a></code>()</dt>
+
+ <dd>
+
+ <p>Permanently stops the generation of media data for the stream.</p>
+
+ </dd>
+
+
+ <dt><var title="">stream</var> . <code title=dom-stream-paused><a href=#dom-stream-paused>paused</a></code></dt>
+
+ <dd>
+
+ <p>Returns false if the stream is generating data; true if it is pause.</p>
+
+ </dd>
+
+
+ <dt><var title="">stream</var> . <code title=dom-stream-pause><a href=#dom-stream-pause>pause</a></code>()</dt>
+
+ <dd>
+
+ <p>Temporarily stops the generation of media data for the stream.</p>
+
+ </dd>
+
+
+ <dt><var title="">stream</var> . <code title=dom-stream-resume><a href=#dom-stream-resume>resume</a></code>()</dt>
+
+ <dd>
+
+ <p>Resumes the generation of media data for the stream if it was temporarily stopped.</p>
+
+ </dd>
+
+ </dl><div class=impl>
+
+ <p>The <dfn id=dom-stream-readystate title=dom-stream-readyState><code>readyState</code></dfn>
+ attribute represents the state of the stream. It must return the
+ value to which the user agent last set it (as defined below). It can
+ have the following values:</p>
+
+ <dl><dt><dfn id=dom-stream-live title=dom-stream-LIVE><code>LIVE</code></dfn> (numeric value 1)</dt>
+
+ <dd>The stream is active (the user agent is making a best-effort
+ attempt to receive or generate data in real time).</dd>
+
+ <dt><dfn id=dom-stream-ended title=dom-stream-ENDED><code>ENDED</code></dfn> (numeric value 2)</dt>
+
+ <dd>The stream has finished (the user agent is no longer receiving
+ or generating data, and will never receive or generate more data
+ for this stream).</dd>
+
+ <dt><dfn id=dom-stream-paused title=dom-stream-PAUSED><code>PAUSED</code></dfn> (numeric value 3)</dt>
+
+ <dd>The stream is not generating data at this time, but could still
+ be resumed. Only <code><a href=#generatedstream>GeneratedStream</a></code> objects can be in
+ this state.</dd>
+
+ </dl><p>When a <code><a href=#stream>Stream</a></code> object is created, its <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute must be
+ set to <code title=dom-stream-LIVE><a href=#dom-stream-live>LIVE</a></code> (1).</p>
+
+ <p>When a <code><a href=#stream>Stream</a></code> object ends for any reason other than
+ the <code title=dom-stream-stop><a href=#dom-stream-stop>stop()</a></code> method being invoke
+ (e.g. because the user rescinds the permission for the page to use
+ the local camera, or because the data comes from a finite file and
+ the file's end has been reached and the user has not requested that
+ it be looped, or because the stream comes from a remote peer and the
+ remote peer has permanently stopped sending data), the user agent
+ must <a href=#queue-a-task>queue a task</a> that runs the following steps:</p>
+
+ <ol><li><p>If the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute has the
+ value <code title=dom-stream-ENDED><a href=#dom-stream-ended>ENDED</a></code> (2) already, then
+ abort these steps. (The <code title=dom-stream-stop><a href=#dom-stream-stop>stop()</a></code>
+ method was probably called just before the stream stopped for other
+ reasons, e.g. the user clicked an in-page stop button and then the
+ user-agent-provided stop button.)</li>
+
+ <li><p>Set the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute to <code title=dom-stream-ENDED><a href=#dom-stream-ended>ENDED</a></code> (2).</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-readystatechange><a href=#event-readystatechange>readystatechange</a></code> at the
+ object.</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-stream-ended>ended</code> at the object.</li>
+
+ </ol><p>If the end of the stream was reached due to a user request, the
+ <a href=#task-source>task source</a> for this <a href=#concept-task title=concept-task>task</a> is the <a href=#user-interaction-task-source>user interaction task
+ source</a>. Otherwise the <a href=#task-source>task source</a> for this <a href=#concept-task title=concept-task>task</a> is the <a href=#networking-task-source>networking task
+ source</a>.</p>
+
+ <hr><p>When a <code><a href=#generatedstream>GeneratedStream</a></code> object is created, the user
+ agent must generate a globally unique identifier string, and must
+ initialize the object's <code title=dom-stream-label><a href=#dom-stream-label>label</a></code>
+ attribute to that string. Such strings must only use characters in
+ the ranges U+0021, U+0023 to U+0027, U+002A to U+002B, U+002D to
+ U+002E, U+0030 to U+0039, U+0041 to U+005A, U+005E to U+007E, and
+ must be 36 characters long.</p> <!-- UUIDs have 36 characters
+ including hyphens; the ranges above comes from RFC4574 (the a=label:
+ thing in SDP) -->
+
+ <p>When a <code><a href=#stream>Stream</a></code> is created to represent a stream
+ obtained from a remote peer, the <code title=dom-stream-label><a href=#dom-stream-label>label</a></code> attribute is initialized from
+ information provided by the remote source.</p> <!-- described below
+ -->
+
+ <p>The <dfn id=dom-stream-label title=dom-stream-label><code>label</code></dfn>
+ attribute must return the value to which it was initialized when the
+ object was created.</p>
+
+ <hr><p>When the <dfn id=dom-stream-record title=dom-stream-record><code>record()</code></dfn> method is
+ invoked, the user agent must return a new
+ <code><a href=#streamrecorder>StreamRecorder</a></code> object associated with the stream.</p>
+
+ <hr><p>When a <code><a href=#generatedstream>GeneratedStream</a></code> object's <dfn id=dom-stream-stop title=dom-stream-stop><code>stop()</code></dfn> method is invoked,
+ the user agent must <a href=#queue-a-task>queue a task</a> that runs the
+ following steps:</p>
+
+ <ol><li><p>If the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute is in the
+ <code title=dom-stream-ENDED><a href=#dom-stream-ended>ENDED</a></code> (2) state, then abort
+ these steps.</li>
+
+ <li><p>Permanently stop the generation of data for the stream. If
+ the data is being generated from a live source (e.g. a microphone
+ or camera), and no other stream is being generated from a live
+ source, then the user agent should remove any active "on-air"
+ indicator. If the data is being generated from a prerecorded source
+ (e.g. a video file), any remaining content in the file is
+ ignored.</li>
+
+ <li><p>Set the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute to <code title=dom-stream-ENDED><a href=#dom-stream-ended>ENDED</a></code> (2).</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-readystatechange><a href=#event-readystatechange>readystatechange</a></code> at the
+ object.</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-stream-ended>ended</code> at the object.</li>
+
+ </ol><hr><p>When a <code><a href=#generatedstream>GeneratedStream</a></code> object's <dfn id=dom-stream-pause title=dom-stream-pause><code>pause()</code></dfn> method is
+ invoked, the user agent must <a href=#queue-a-task>queue a task</a> that runs the
+ following steps:</p>
+
+ <ol><li><p>If the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute is not in
+ the <code title=dom-stream-LIVE><a href=#dom-stream-live>LIVE</a></code> (1) state, then abort
+ these steps.</li>
+
+ <li><p>Pause the generation of data for the stream. If the data is
+ being generated from a live source (e.g. a microphone or camera),
+ then data collected for this stream while the stream is paused must
+ be discarded. If the data is being generated from a prerecorded
+ source (e.g. a video file), the user agent should follow user
+ preferences for handling a pause (either skipping over data in real
+ time or resuming from the same point when the stream is later
+ resumed).</li>
+
+ <li><p>Set the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute to <code title=dom-stream-PAUSED><a href=#dom-stream-paused>PAUSED</a></code> (3).</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-readystatechange><a href=#event-readystatechange>readystatechange</a></code> at the
+ object.</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-stream-pause>pause</code> at the object.</li>
+
+ </ol><p>When a <code><a href=#generatedstream>GeneratedStream</a></code> object's <dfn id=dom-stream-resume title=dom-stream-resume><code>resume()</code></dfn> method is
+ invoked, the user agent must <a href=#queue-a-task>queue a task</a> that runs the
+ following steps:</p>
+
+ <ol><li><p>If the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute is not in
+ the <code title=dom-stream-PAUSED><a href=#dom-stream-paused>PAUSED</a></code> (3) state, then
+ abort these steps.</li>
+
+ <li><p>Resume the generation of data for the stream.</li>
+
+ <li><p>Set the object's <code title=dom-stream-readyState><a href=#dom-stream-readystate>readyState</a></code> attribute to <code title=dom-stream-LIVE><a href=#dom-stream-live>LIVE</a></code> (1).</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-readystatechange><a href=#event-readystatechange>readystatechange</a></code> at the
+ object.</li>
+
+ <li><p><a href=#fire-a-simple-event>Fire a simple event</a> named <code title=event-stream-play>play</code> at the object.</li>
+
+ </ol><hr><p>The <a href=#task-source>task source</a> for the <a href=#concept-task title=concept-task>tasks</a> queued for the <code title=dom-stream-stop><a href=#dom-stream-stop>stop()</a></code>, <code title=dom-stream-pause><a href=#dom-stream-pause>pause()</a></code>, and <code title=dom-stream-resume><a href=#dom-stream-resume>resume()</a></code> methods is the <a href=#dom-manipulation-task-source>DOM
+ manipulation task source</a>.</p>
+
+ <hr><p>The following are the <a href=#event-handlers>event handlers</a> (and their
+ corresponding <a href=#event-handler-event-type title="event handler event type">event handler
+ event types</a>) that must be supported, as IDL attributes, by
+ all objects implementing the <code><a href=#stream>Stream</a></code> interface:</p>
+
+ <table><thead><tr><th><a href=#event-handlers title="event handlers">Event handler</a> <th><a href=#event-handler-event-type>Event handler event type</a>
+ <tbody><tr><td><dfn id=handler-stream-onreadystatechange title=handler-stream-onreadystatechange><code>onreadystatechange</code></dfn> <td> <code title=event-stream-readystatechange>readystatechange</code>
+ <tr><td><dfn id=handler-stream-onended title=handler-stream-onended><code>onended</code></dfn> <td> <code title=event-stream-ended>ended</code>
+ </table><p>The following are the additional <a href=#event-handlers>event handlers</a> (and
+ their corresponding <a href=#event-handler-event-type title="event handler event type">event
+ handler event types</a>) that must be supported, as IDL
+ attributes, by all objects implementing the
+ <code><a href=#generatedstream>GeneratedStream</a></code> interface:</p>
+
+ <table><thead><tr><th><a href=#event-handlers title="event handlers">Event handler</a> <th><a href=#event-handler-event-type>Event handler event type</a>
+ <tbody><tr><td><dfn id=handler-stream-onpause title=handler-stream-onpause><code>onpause</code></dfn> <td> <code title=event-stream-pause>pause</code>
+ <tr><td><dfn id=handler-stream-onplay title=handler-stream-onplay><code>onplay</code></dfn> <td> <code title=event-stream-play>play</code>
+ </table></div>
+
+ <div class=example>
+
+ <p>This sample code exposes a button. When clicked, the button is
+ disabled and the user is prompted to offer a stream. The user can
+ cause the button to be re-enabled by providing a stream (e.g.
+ giving the page access to the local camera) and then disabling the
+ stream (e.g. revoking that access).</p>
+
+ <pre>
+<input type="button" value="Start" onclick="start()" id="startBtn">
+<script>
+ var startBtn = document.getElementById('startBtn');
+ function start() {
+ navigator.getUserMedia('audio,video', gotStream);
+ startBtn.disabled = true;
+ }
+ function gotStream(stream) {
+ stream.onended = function () {
+ startBtn.disabled = false;
+ }
+ }
+</script></pre>
+
+ </div>
+
+ <pre class=idl>interface <dfn id=streamrecorder>StreamRecorder</dfn> {
+ <span>Blob</span> <a href=#dom-streamrecorder-getrecordeddata title=dom-StreamRecorder-getRecordedData>getRecordedData</a>(in <a href=#blobcallback>BlobCallback</a> callback);
+};
+
+[Callback=FunctionOnly, NoInterfaceObject]
+interface <dfn id=blobcallback>BlobCallback</dfn> {
+ void <span title=dom-BlobCallback-handleEvent>handleEvent</span>(in <span>Blob</span> blob);
+};</pre>
+
+ <dl class=domintro><dt><var title="">recorder</var> . <code title=dom-StreamRecorder-getRecordedData><a href=#dom-streamrecorder-getrecordeddata>getRecordedData</a></code>(<var title="">callback</var>)</dt>
+
+ <dd>
+
+ <p>Creates a <code>Blob</code> of the recorded data, and invokes
+ the provided callback with that <code>Blob</code>.</p>
+
+ </dd>
+
+ </dl><div class=impl>
+
+ <p>When the <dfn id=dom-streamrecorder-getrecordeddata title=dom-StreamRecorder-getRecordedData><code>getRecordedData()</code></dfn>
+ method is called, the user agent must run the following steps:</p>
+
+ <ol><li><p>Let <var title="">callback</var> be the callback
+ indicated by the method's first argument.</li>
+
+ <li><p>If <var title="">callback</var> is null, abort these
+ steps.</li> <!-- we could throw an exception instead (that's
+ why the method doesn't return until later: so that we can add an
+ exception here without changing the algorithm) -->
+
+ <li><p>Let <var title="">data</var> be the data that was streamed
+ by the <code><a href=#stream>Stream</a></code> object from which the
+ <code><a href=#streamrecorder>StreamRecorder</a></code> was created since the creation of the
+ <code><a href=#streamrecorder>StreamRecorder</a></code> object.</li>
+
+ <li><p>Return, and run the remaining steps asynchronously.</li>
+
+ <li><p>Generate a file that containing <var title="">data</var> in
+ a format supported by the user agent for use in <code><a href=#audio>audio</a></code>
+ and <code><a href=#video>video</a></code> elements.</li>
+
+ <li><p>Let <var title="">blob</var> be a <code>Blob</code> object
+ representing the contents of the file generated in the previous
+ step. <a href=#refsFILEAPI>[FILEAPI]</a></p>
+
+ <li><p><a href=#queue-a-task>Queue a task</a> to invoke <var title="">callback</var> with <var title="">blob</var> as its
+ argument.</li>
+
+ </ol><p class=note>The <code title=dom-StreamRecorder-getRecordedData><a href=#dom-streamrecorder-getrecordeddata>getRecordedData()</a></code>
+ method can be called multiple times on one
+ <code><a href=#streamrecorder>StreamRecorder</a></code> object; each time, it will create a new
+ file as if this was the first time the method was being called. In
+ particular, the method does not stop or reset the recording when the
+ method is called.</p>
+
+ </div>
+
+ <div class=example>
+
+ <p>This example allows people to record a short audio message and
+ upload it to the server. This example even shows rudimentary error
+ handling.</p>
+
+ <pre><input type="button" value="⚫" onclick="msgRecord()" id="recBtn">
+<input type="button" value="◼" onclick="msgStop()" id="stopBtn" disabled>
+<p id="status">To start recording, press the ⚫ button.</p>
+<script>
+ var recBtn = document.getElementById('recBtn');
+ var stopBtn = document.getElementById('stopBtn');
+ function report(s) {
+ document.getElementById('status').textContent = s;
+ }
+ function msgRecord() {
+ report('Attempting to access microphone...');
+ navigator.getUserMedia('audio', gotStream, noStream);
+ recBtn.disabled = true;
+ }
+ var msgStream;
+ function gotStream(stream) {
+ report('Recording... To stop, press to ◼ button.');
+ msgStream = stream;
+ stopBtn.disabled = false;
+ stream.onended = function () {
+ msgStop();
+ }
+ }
+ function msgStop() {
+ report('Creating file...');
+ stopBtn.disabled = true;
+ stream.onended = null;
+ stream.stop();
+ stream.getRecordedData(msgSave);
+ }
+ function msgSave(blob) {
+ report('Uploading file...');
+ var x = new XMLHttpRequest();
+ x.open('POST', 'uploadMessage');
+ x.send(blob);
+ x.onload = function () {
+ report('Done! To record a new message, press the ⚫ button.');
+ recBtn.disabled = false;
+ };
+ x.onerror = function () {
+ report('Failed to upload message. To try recording a message again, press the ⚫ button.');
+ recBtn.disabled = false;
+ };
+ }
+ funciton noStream() {
+ report('Could not obtain access to your microphone. To try again, press the ⚫ button.');
+ recBtn.disabled = false;
+ }
+</script></pre>
+
+ </div>
+
+ <pre class=idl>[Supplemental]
+interface <dfn id=dom-url title=dom-URL>URL</dfn> {
+ static DOMString <a href=#dom-url-createobjecturl title=dom-URL-createObjectURL>createObjectURL</a>(in <a href=#stream>Stream</a> stream);
+};</pre>
+
+ <dl class=domintro><dt><var title="">window</var> . <code title=dom-URL><a href=#dom-url>URL</a></code> . <code title=dom-URL-createObjectURL><a href=#dom-url-createobjecturl>createObjectURL</a></code>(<var title="">stream</var>)</dt>
+
+ <dd>
+
+ <p>Mints a <a href=#blob-url>Blob URL</a> to refer to the given <code><a href=#stream>Stream</a></code>.</p>
+
+ </dd>
+
+ </dl><div class=impl>
+
+ <p>When the <dfn id=dom-url-createobjecturl title=dom-URL-createObjectURL><code>createObjectURL()</code></dfn>
+ method is called with a <code><a href=#stream>Stream</a></code> argument, the user agent
+ must return a unique <a href=#blob-url>Blob URL</a> for the given
+ <code><a href=#stream>Stream</a></code>. <a href=#refsFILEAPI>[FILEAPI]</a></p>
+
+ <p>For audio and video streams, the data exposed on that stream must
+ be in a format supported by the user agent for use in
+ <code><a href=#audio>audio</a></code> and <code><a href=#video>video</a></code> elements.</p>
+
+ <p class=bookkeeping>A <dfn id=blob-url>Blob URL</dfn> is the same as what the
+ File API specification calls a <span>Blob URI</span>, except that
+ anything in the definition of that feature that refers to
+ <code>File</code> and <code>Blob</code> objects is hereby extended
+ to also apply to <code><a href=#stream>Stream</a></code> and
+ <code><a href=#generatedstream>GeneratedStream</a></code> objects.</p>
+
+ </div>
+
+ <div class=example>
+
+ <p>This example allows people to take photos of themselves from the
+ local video camera.</p>
+
+ <pre><article>
+ <style scoped>
+ video { transform: scaleX(-1); }
+ p { text-align: center; }
+ </style>
+ <h1>Snapshot Kiosk</h1>
+ <section id="splash">
+ <p id="errorMessage">Loading...</p>
+ </section>
+ <section id="app" hidden>
+ <p><video id="monitor"></video> <canvas id="photo"></canvas>
+ <p><input type=button value="📷" onclick="snapshot()">
+ </section>
+ <script>
+ navigator.getUserMedia('video', gotStream, noStream);
+ var video = document.getElementById('monitor');
+ var canvas = document.getElementById('photo');
+ function gotStream(stream) {
+ video.src = URL.getObjectURL(stream);
+ video.onerror = function () {
+ stream.stop();
+ noStream();
+ }
+ video.onloadedmetadata = function () {
+ canvas.width = video.videoWidth;
+ canvas.height = video.videoHeight;
+ document.getElementById('splash').hidden = true;
+ document.getElementById('app').hidden = false;
+ }
+ }
+ function noStream() {
+ document.getElementById('errorMessage').textContent = 'No camera available.';
+ }
+ function snapshot() {
+ canvas.getContext('2d').drawImage(video, 0, 0);
+ }
+ </script>
+</article></pre>
+
+ </div>
+
+
+
+ <h4 id=peer-to-peer-connections><span class=secno>9.1.3 </span>Peer-to-peer connections</h4>
+
+ <pre class=idl>[<a href=#dom-peerconnection title=dom-PeerConnection>Constructor</a>(in DOMString configuration, in <a href=#signalingcallback>SignalingCallback</a> signalingCallback)]
+interface <dfn id=peerconnection>PeerConnection</dfn> {
+ void <a href=#dom-peerconnection-signalingmessage title=dom-PeerConnection-signalingMessage>signalingMessage</a>(in DOMString message);
+
+ // <span class=XXX>readyState, etc</span>
+
+ void <a href=#dom-peerconnection-send title=dom-PeerConnection-send>send</a>(in DOMString text);
+ void <a href=#dom-peerconnection-addstream title=dom-PeerConnection-addStream>addStream</a>(in <a href=#stream>Stream</a> stream);
+ void <a href=#dom-peerconnection-removestream title=dom-PeerConnection-removeStream>removeStream</a>(in <a href=#stream>Stream</a> stream);
+ readonly attribute <a href=#stream>Stream</a>[] <a href=#dom-peerconnection-localstreams title=dom-PeerConnection-localStreams>localStreams</a>;
+ readonly attribute <a href=#stream>Stream</a>[] <a href=#dom-peerconnection-remotestreams title=dom-PeerConnection-remoteStreams>remoteStreams</a>;
+
+ // <span class=XXX>connection quality information</span>
+
+ attribute <a href=#function>Function</a> <a href=#handler-peerconnection-ontext title=handler-PeerConnection-ontext>ontext</a>;
+ attribute <a href=#function>Function</a> <a href=#handler-peerconnection-onaddstream title=handler-PeerConnection-onaddstream>onaddstream</a>;
+ attribute <a href=#function>Function</a> <a href=#handler-peerconnection-onremovestream title=handler-PeerConnection-onremovestream>onremovestream</a>;
+};
+<a href=#peerconnection>PeerConnection</a> implements <a href=#eventtarget>EventTarget</a>;
+
+[Callback=FunctionOnly, NoInterfaceObject]
+interface <dfn id=signalingcallback>SignalingCallback</dfn> {
+ void <span title=dom-SignalingCallback-handleEvent>handleEvent</span>(in <a href=#peerconnection>PeerConnection</a> source, in DOMString message);
+};</pre>
+
+ <p>A <code><a href=#peerconnection>PeerConnection</a></code> allows two users to communicate
+ directly, browser-to-browser. Communications are coordinated via a
+ signaling channel provided by script in the page via the server,
+ e.g. using <code>XMLHttpRequest</code>.</p>
+
+ <dl class=domintro><dt><var title="">connection</var> = new <code title=dom-PeerConnection><a href=#dom-peerconnection>PeerConnection</a></code>(<var title="">configuration</var>, <var title="">signalingCallback</var>)</dt>
+
+ <dd>
+
+ <p>Creates a <code><a href=#peerconnection>PeerConnection</a></code> object.</p>
+
+ <p>The <var title="">configuration</var> string gives the address
+ of a STUN or TURN server to use to establish the connection. <a href=#refsSTUN>[STUN]</a> <a href=#refsTURN>[TURN]</a></p>
+
+ <p>The allowed formats for this string are:</p>
+
+ <dl><dt>"<code title=""><var title="">TYPE</var> 203.0.113.2:3478</code>"
+ <dd>
+ <p>Indicates a specific IP address and port for the server.</p>
+ </dd>
+
+ <dt>"<code title=""><var title="">TYPE</var> relay.example.net:3478</code>"
+ <dd>
+ <p>Indicates a specific host and port for the server; the user agent will look up the IP address in DNS.</p>
+ </dd>
+
+ <dt>"<code title=""><var title="">TYPE</var> example.net</code>"
+ <dd>
+ <p>Indicates a specific domain for the server; the user agent will look up the IP address and port in DNS.</p>
+ </dd>
+
+ </dl><p>The "<code title=""><var title="">TYPE</var></code>" is one of:</p>
+
+ <dl><dt><code title="">STUN</code></dt>
+ <dd>Indicates a STUN server
+
+ <dt><code title="">STUNS</code></dt>
+ <dd>Indicates a STUN server that is to be contacted using a TLS session.
+
+ <dt><code title="">TURN</code></dt>
+ <dd>Indicates a TURN server
+
+ <dt><code title="">TURNS</code></dt>
+ <dd>Indicates a TURN server that is to be contacted using a TLS session.
+
+ </dl><p>The <var title="">signalingCallback</var> argument is a method
+ that will be invoked when the user agent needs to send a message
+ to the other host over the signaling channel. When the callback
+ is invoked, convey its argument (a string) to the other peer using
+ whatever method is being used by the Web application to relay
+ signaling messages. (Messages returned from the other peer are
+ provided back to the user agent using the <code title=dom-PeerConnection-signalingMessage><a href=#dom-peerconnection-signalingmessage>signalingMessage()</a></code>
+ method.)</p>
+
+ </dd>
+
+
+ <dt><var title="">connection</var> . <code title=dom-PeerConnection-signalingMessage><a href=#dom-peerconnection-signalingmessage>signalingMessage</a></code>(<var title="">message</var>)</dt>
+
+ <dd>
+
+ <p>When a message is relayed from the remote peer over the
+ signaling channel is received by the Web application, pass it to
+ the user agent by calling the <code title=dom-PeerConnection-signalingMessage><a href=#dom-peerconnection-signalingmessage>signalingMessage()</a></code>
+ method.</p>
+
+ <p>The order of messages is important. Passing messages to the
+ user agent in a different order than they were generated by the
+ remote peer's user agent can prevent a successful connection from
+ being established or degrade the connection's quality if one is
+ established.</p>
+
+ </dd>
+
+ <dt><var title="">connection</var> . <code title=dom-PeerConnection-send><a href=#dom-peerconnection-send>send</a></code>(<var title="">text</var>)</dt>
+
+ <dd>
+
+ <p>Attempts to send the given text to the remote peer. This uses
+ UDP, which is inherently unreliable; there is no guarantee that
+ every message will be received.</p>
+
+ <p>When a message sent in this manner from the other peer is
+ received, a <code title=event-PeerConnection-text>text</code>
+ event is dispatched at the <code><a href=#peerconnection>PeerConnection</a></code> object.</p>
+
+ </dd>
+
+ <dt><var title="">connection</var> . <code title=dom-PeerConnection-addStream><a href=#dom-peerconnection-addstream>addStream</a></code>(<var title="">stream</var>)</dt>
+
+ <dd>
+
+ <p>Attempts to starting sending the given stream to the remote
+ peer.</p>
+
+ <p>When the other peer starts sending a stream in this manner, an
+ <code title=event-PeerConnection-addstream>addstream</code>
+ event is dispatched at the <code><a href=#peerconnection>PeerConnection</a></code> object.</p>
+
+ </dd>
+
+ <dt><var title="">connection</var> . <code title=dom-PeerConnection-removeStream><a href=#dom-peerconnection-removestream>removeStream</a></code>(<var title="">stream</var>)</dt>
+
+ <dd>
+
+ <p>Steps sending the given stream to the remote peer.</p>
+
+ <p>When the other peer stops sending a stream in this manner, a
+ <code title=event-PeerConnection-removestream>removestream</code>
+ event is dispatched at the <code><a href=#peerconnection>PeerConnection</a></code> object.</p>
+
+ </dd>
+
+ <dt><var title="">connection</var> . <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code></dt>
+
+ <dd>
+
+ <p>Returns a live array containing the streams that the user agent
+ is currently attempting to transmit to the remote peer (those that
+ were added with <code title=dom-PeerConnection-addStream><a href=#dom-peerconnection-addstream>addStream()</a></code>).</p>
+
+ </dd>
+
+ <dt><var title="">connection</var> . <code title=dom-PeerConnection-remoteStreams><a href=#dom-peerconnection-remotestreams>remoteStreams</a></code></dt>
+
+ <dd>
+
+ <p>Returns a live array containing the streams that the user agent
+ is currently receiving from the remote peer.</p>
+
+ <p>This array is updated when <code title=event-PeerConnection-addstream>addstream</code> and <code title=event-PeerConnection-removestream>removestream</code>
+ events are fired.</p>
+
+ </dd>
+
+ </dl><div class=impl>
+
+ <p>A <code><a href=#peerconnection>PeerConnection</a></code> object has an associated
+ <dfn id=peerconnection-signaling-callback><code>PeerConnection</code> signaling callback</dfn>, a
+ <dfn id=peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</dfn>, a
+ <dfn id=peerconnection-data-udp-media-stream><code>PeerConnection</code> data UDP media stream</dfn> and an
+ <dfn id=ice-started-flag>ICE started flag</dfn>. These are initialized when the object
+ is created.</p>
+
+ <p>When the <dfn id=dom-peerconnection title=dom-PeerConnection><code>PeerConnection()</code></dfn>
+ constructor is invoked, the user agent must run the following steps.
+ This algorithm has a <a href=#synchronous-section>synchronous section</a> (which is
+ triggered as part of the <a href=#event-loop>event loop</a> algorithm). Steps
+ in the <a href=#synchronous-section>synchronous section</a> are marked with
+ ⌛.</p>
+
+ <ol><li><p>Let <var title="">serverConfiguration</var> be the constructor's
+ first argument.</li>
+
+ <li><p>Let <var title="">signalingCallback</var> be the
+ constructor's second argument.</li>
+
+ <li><p>If <var title="">signalingCallback</var> is null, throw a
+ <code>TypeError</code> exception and abort these steps.</li>
+
+ <li><p>Let <var title="">connection</var> be a newly created
+ <code><a href=#peerconnection>PeerConnection</a></code> object.</li>
+
+ <li><p>Create an ICE Agent and let <var title="">connection</var>'s
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> be that ICE
+ Agent. <a href=#refsICE>[ICE]</a></li>
+
+ <li><p>If <var title="">serverConfiguration</var> contains a U+000A LINE
+ FEED (LF) character or a U+000D CARRIAGE RETURN (CR) character (or
+ both), remove all characters from <var title="">serverConfiguration</var>
+ after the first such character.</li>
+
+ <li><p><a href=#split-a-string-on-spaces title="split a string on spaces">Split <var title="">serverConfiguration</var> on spaces</a> to obtain <var title="">configuration components</var>.</li>
+
+ <li>
+
+ <p>If <var title="">configuration components</var> has two or more
+ components, and the first component is a
+ <a href=#case-sensitive>case-sensitive</a> match for one of the following
+ strings:</p>
+
+ <ul class=brief><li>"<code title="">STUN</code>"
+ <li>"<code title="">STUNS</code>"
+ <li>"<code title="">TURN</code>"
+ <li>"<code title="">TURNS</code>"
+ </ul><p>...then run the following substeps:</p>
+
+ <ol><li><p>Let <var title="">server type</var> be STUN if the first
+ component of <var title="">configuration components</var> is
+ "<code title="">STUN</code>" or "<code title="">STUNS</code>",
+ and TURN otherwise (the first component of <var title="">configuration components</var> is "<code title="">TURN</code>" or "<code title="">TURNS</code>").</p>
+
+ <li><p>Let <var title="">secure</var> be true if the first
+ component of <var title="">configuration components</var> is
+ "<code title="">STUNS</code>" or "<code title="">TURNS</code>",
+ and false otherwise.</p>
+
+ <li><p>Let <var title="">host</var> be the contents of the second
+ component of <var title="">configuration components</var> up to
+ the character before the first U+003A COLON character (:), if
+ any, or the entire string otherwise.</li>
+
+ <li><p>Let <var title="">port</var> be the contents of the second
+ component of <var title="">configuration components</var> from
+ the character after the first U+003A COLON character (:) up to
+ the end, if any, or the empty string otherwise.</li>
+
+ <li>
+
+ <p>Configure the <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE
+ Agent</a>'s STUN or TURN server as follows:</p>
+
+ <ul><li>If <var title="">server type</var> is STUN, the server is a
+ STUN server. Otherwise, <var title="">server type</var> is TURN
+ and the server is a TURN server.</li>
+
+ <li>If <var title="">secure</var> is true, the server is to be
+ contacted using TLS-over-TCP, otherwise, it is to be contacted
+ using UDP.</li>
+
+ <li>The IP address, host name, or domain name of the server is
+ <var title="">host</var>.</li>
+
+ <li>The port to use is <var title="">port</var>. If this is the
+ empty string, then only a domain name is configured (and the
+ ICE Agent will use DNS SRV requests to determine the IP address
+ and port).</li>
+
+ <li>The long-term username for the the STUN or TURN server is
+ the <a href=#ascii-serialization-of-an-origin title="ASCII serialization of an origin">ASCII
+ serialization</a> of the <a href=#entry-script>entry script</a>'s
+ <a href=#origin>origin</a>; the long-term password is the empty
+ string.</li>
+
+ </ul><p>If the given IP address, host name, domain name, or port are
+ invalid, then the user agent must act as if no STUN or TURN
+ server is configured.</p>
+
+ </li>
+
+ </ol></li>
+
+ <li><p>Let the <var title="">connection</var>'s
+ <a href=#peerconnection-signaling-callback><code>PeerConnection</code> signaling callback</a> be
+ <var title="">signalingCallback</var>.</li>
+
+ <li><p>Set <var title="">connection</var>'s <a href=#ice-started-flag>ICE started
+ flag</a> to false.</li>
+
+ <li><p>Let <var title="">connection</var>'s
+ <a href=#peerconnection-data-udp-media-stream><code>PeerConnection</code> data UDP media stream</a> be a
+ new <a href=#data-udp-media-stream>data UDP media stream</a>.</li>
+
+ <li><p>Let <var title="">connection</var>'s <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code>
+ attribute be an empty read-only <code><a href=#stream>Stream</a></code> array. <a href=#refsWEBIDL>[WEBIDL]</a></li>
+
+ <li><p>Let <var title="">connection</var>'s <code title=dom-PeerConnection-remoteStreams><a href=#dom-peerconnection-remotestreams>remoteStreams</a></code>
+ attribute be an empty read-only <code><a href=#stream>Stream</a></code> array. <a href=#refsWEBIDL>[WEBIDL]</a></li>
+
+ <li><p>Return <var title="">connection</var>, but continue these
+ steps asynchronously.</li>
+
+ <li><p><a href=#await-a-stable-state>Await a stable state</a>. The <a href=#synchronous-section>synchronous
+ section</a> consists of the remaining steps of this
+ algorithm. (Steps in <a href=#synchronous-section title="synchronous section">synchronous
+ sections</a> are marked with ⌛.)</li>
+
+ <li><p>⌛ If <var title="">connection</var>'s <a href=#ice-started-flag>ICE
+ started flag</a> is still false, start the
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> and send the
+ initial offer. The initial offer must include a media description
+ for the <a href=#peerconnection-data-udp-media-stream><code>PeerConnection</code> data UDP media
+ stream</a> and for all the streams in <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code>. <a href=#refsICE>[ICE]</a></li>
+
+ <li><p>⌛ Let <var title="">connection</var>'s <a href=#ice-started-flag>ICE
+ started flag</a> be true.</li>
+
+ </ol><p>When a <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> is
+ required to send SDP offers or answers, the user agent must follow
+ these steps:</p>
+
+ <ol><li><p>Let <var title="">sdp</var> be the SDP offer or answer to be
+ sent. <a href=#refsSDPOFFERANSWER>[SDPOFFERANSWER]</a></li>
+
+ <li><p>Let <var title="">message</var> be the concatenation of the
+ string "<code title="">SDP</code>", a U+000A LINE FEED (LF)
+ character, and <var title="">sdp</var>, in that order.</li>
+
+ <li><p><a href=#queue-a-task>Queue a task</a> to invoke that
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a>'s
+ <a href=#peerconnection-signaling-callback><code>PeerConnection</code> signaling callback</a> with
+ <var title="">message</var> as its argument.</li>
+
+ </ol><p>All SDP media descriptions for streams represented by
+ <code><a href=#stream>Stream</a></code> objects must include a label attribute ("<code title="">a=label:</code>") whose value is the value of the
+ <code><a href=#stream>Stream</a></code> object's <code title=dom-stream-label><a href=#dom-stream-label>label</a></code> attribute. <a href=#refsSDP>[SDP]</a> <a href=#refsSDPLABEL>[SDPLABEL]</a></p>
+
+ <p><a href=#peerconnection-ice-agent title="PeerConnection ICE
+ Agent"><code>PeerConnection</code> ICE Agents</a> must not
+ generate any candidates for media streams whose media descriptions
+ do not have a label attribute ("<code title="">a=label:</code>"). <a href=#refsICE>[ICE]</a> <a href=#refsSDP>[SDP]</a> <a href=#refsSDPLABEL>[SDPLABEL]</a></p>
+
+ <p>When a user agent starts receiving media for a component an a
+ candidate provided for that component by a
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a>, the user agent
+ must follow these steps:</p>
+
+ <ol><li><p>Let <var title="">connection</var> be the
+ <code><a href=#peerconnection>PeerConnection</a></code> whose ICE Agent is expecting this
+ media.</li>
+
+ <li><p>If there is already a <code><a href=#stream>Stream</a></code> object for the
+ media stream to which this component belongs, then associate the
+ component with that media stream and abort these steps. (Some media
+ streams have multiple components; this API does not expose the
+ role of these individual components in ICE.)</li>
+
+ <li><p>Create a <code><a href=#stream>Stream</a></code> object to represent the media
+ stream. Set its <code title=attr-stream-label>label</code>
+ attribute to the value of the SDP Label attribute for that
+ component's media stream.</li>
+
+ <li><p><a href=#queue-a-task>Queue a task</a> to add the newly created
+ <code><a href=#stream>Stream</a></code> object to the end of <var title="">connection</var>'s <code title=dom-PeerConnection-remoteStreams><a href=#dom-peerconnection-remotestreams>remoteStreams</a></code>
+ array, then <a href=#fire-a-stream-event>fire a stream event</a> named <code title=event-stream-addstream>addstream</code> with the newly
+ created <code><a href=#stream>Stream</a></code> object at the <var title="">connection</var> object.</li>
+
+ </ol><p>When a <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> finds
+ that a stream from the remote peer has been removed (its port has
+ been set to zero in a media description sent on the signaling
+ channel), the user agent must follow these steps:</p>
+
+ <ol><li><p>Let <var title="">connection</var> be the
+ <code><a href=#peerconnection>PeerConnection</a></code> whose <a href=#peerconnection-ice-agent><code>PeerConnection</code>
+ ICE Agent</a> has determined that a stream is being removed.</li>
+
+ <li><p>Let <var title="">stream</var> be the <code><a href=#stream>Stream</a></code>
+ object that represents the media stream being removed, if any. If
+ there isn't one, then abort these steps.</li>
+
+ <li><p><a href=#queue-a-task>Queue a task</a> to remove <var title="">stream</var> from <var title="">connection</var>'s <code title=dom-PeerConnection-remoteStreams><a href=#dom-peerconnection-remotestreams>remoteStreams</a></code>
+ array, then <a href=#fire-a-stream-event>fire a stream event</a> named <code title=event-stream-removestream>removestream</code> with <var title="">stream</var> at the <var title="">connection</var>
+ object.</li>
+
+ </ol><p>When the <dfn id=dom-peerconnection-signalingmessage title=dom-PeerConnection-signalingMessage><code title="">signalingMessage()</code></dfn> method is invoked, the
+ user agent must run the following steps:</p>
+
+ <ol><li><p>Let <var title="">message</var> be the method's
+ argument.</li>
+
+ <li>
+
+ <p>If the first four characters of <var title="">message</var> are
+ not "<code title="">SDP</code>" followed by a U+000A LINE FEED
+ (LF) character, then abort these steps. (This indicates an error
+ in the signaling channel implementation. User agents may report
+ such errors to their developer consoles to aid debugging.)</p>
+
+ <p class=note>Future extensions to the
+ <code><a href=#peerconnection>PeerConnection</a></code> interface might use other prefix
+ values to implement additional features.</p>
+
+ </li>
+
+ <li><p>Let <var title="">sdp</var> be the string consisting of all
+ but the first four characters of <var title="">message</var>.</li>
+
+ <li>
+
+ <p>If <var title="">connection</var>'s <a href=#ice-started-flag>ICE started
+ flag</a> is still false, start the
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> and pass it
+ <var title="">sdp</var> as the initial offer from the other peer;
+ the ICE Agent will then (asynchronously) construct the initial
+ answer and transmit it as described above. The initial answer must
+ include a media description for the
+ <a href=#peerconnection-data-udp-media-stream><code>PeerConnection</code> data UDP media stream</a> and
+ for all the streams in <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code>. <a href=#refsICE>[ICE]</a></p>
+
+ <p>If <var title="">connection</var>'s <a href=#ice-started-flag>ICE started
+ flag</a> is true, then pass <var title="">sdp</var> to the
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> as a subsequent
+ offer or answer, to be interpreted as appropriate given the
+ current state of the ICE Agent. <a href=#refsICE>[ICE]</a></p>
+
+ </li>
+
+ <li><p>Let <var title="">connection</var>'s <a href=#ice-started-flag>ICE started
+ flag</a> be true.</li>
+
+ </ol><p>When the <dfn id=dom-peerconnection-send title=dom-PeerConnection-send><code title="">send()</code></dfn> method is invoked, the
+ user agent must run the following steps:</p>
+
+ <ol><li><p>Let <var title="">message</var> be the method's first
+ argument.</li>
+
+ <li><p>Let <var title="">data</var> be <var title="">message</var>
+ encoded as UTF-8. <a href=#refsRFC3629>[RFC3629]</a></li>
+
+ <li><p>If <var title="">data</var> is longer than 65470 bytes,
+ throw an <code><a href=#invalid_access_err>INVALID_ACCESS_ERR</a></code> exception and abort these
+ steps.</li>
+ <!-- 65470 = 65535 (64K, max IP size) - 40 (IP header) - 8 (UDP header) - 16 (nonce) - 1 (payload type byte) -->
+
+ <li><p>If the <code><a href=#peerconnection>PeerConnection</a></code>'s
+ <a href=#peerconnection-data-udp-media-stream><code>PeerConnection</code> data UDP media stream</a> is
+ not an <a href=#active-data-udp-media-stream>active data UDP media stream</a>, abort these
+ steps. No message is sent.</li>
+
+ <li><p><a href=#transmit-a-data-packet-to-a-peer>Transmit a data packet to a peer</a> using the
+ <code><a href=#peerconnection>PeerConnection</a></code>'s <a href=#peerconnection-data-udp-media-stream><code>PeerConnection</code>
+ data UDP media stream</a> with <var title="">data</var> as the
+ message.</li>
+
+ </ol><p>When the <dfn id=dom-peerconnection-addstream title=dom-PeerConnection-addStream><code title="">addStream()</code></dfn> method is invoked, the user agent
+ must run the following steps:</p>
+
+ <ol><li><p>Let <var title="">stream</var> be the method's
+ argument.</li>
+
+ <li><p>If <var title="">stream</var> is null, throw a
+ <code>TypeError</code> exception and abort these steps.</li>
+
+ <li><p>If <var title="">stream</var> is already in the
+ <code><a href=#peerconnection>PeerConnection</a></code> object's <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code> object,
+ then abort these steps.</li>
+
+ <li><p>Add <var title="">stream</var> to the end of the
+ <code><a href=#peerconnection>PeerConnection</a></code> object's <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code>
+ object.</li>
+
+ <li><p>If the <code><a href=#peerconnection>PeerConnection</a></code>'s <a href=#ice-started-flag>ICE
+ started flag</a> is false, then abort these steps.</li>
+
+ <li><p>Have the <code><a href=#peerconnection>PeerConnection</a></code>'s
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> add a media
+ stream for <var title="">stream</var>. <a href=#refsICE>[ICE]</a></li> <!-- section 9.1.1.3 -->
+
+ </ol><p>When the <dfn id=dom-peerconnection-removestream title=dom-PeerConnection-removeStream><code title="">removeStream()</code></dfn> method is invoked, the user agent
+ must run the following steps:</p>
+
+ <ol><li><p>Let <var title="">stream</var> be the method's
+ argument.</li>
+
+ <li><p>If <var title="">stream</var> is null, throw a
+ <code>TypeError</code> exception and abort these steps.</li>
+
+ <li><p>If <var title="">stream</var> is not in the
+ <code><a href=#peerconnection>PeerConnection</a></code> object's <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code> object,
+ then abort these steps.</li>
+
+ <li><p>Remove <var title="">stream</var> from the
+ <code><a href=#peerconnection>PeerConnection</a></code> object's <code title=dom-PeerConnection-localStreams><a href=#dom-peerconnection-localstreams>localStreams</a></code>
+ object.</li>
+
+ <li><p>If the <code><a href=#peerconnection>PeerConnection</a></code>'s <a href=#ice-started-flag>ICE
+ started flag</a> is false, then abort these steps.</li>
+
+ <li><p>Have the <code><a href=#peerconnection>PeerConnection</a></code>'s
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> remove the media
+ stream for <var title="">stream</var>. <a href=#refsICE>[ICE]</a></li> <!-- section 9.1.1.2 -->
+
+ </ol><p>The <dfn id=dom-peerconnection-localstreams title=dom-PeerConnection-localStreams><code>localStreams</code></dfn>
+ and <dfn id=dom-peerconnection-remotestreams title=dom-PeerConnection-remoteStreams><code>remoteStreams</code></dfn>
+ attributes must return the read-only <code><a href=#stream>Stream</a></code> arrays that
+ the attributes were respectively set to when the
+ <code><a href=#peerconnection>PeerConnection</a></code>'s constructor ran.</p>
+
+ <hr><p>The following are the <a href=#event-handlers>event handlers</a> (and their
+ corresponding <a href=#event-handler-event-type title="event handler event type">event handler
+ event types</a>) that must be supported, as IDL attributes, by
+ all objects implementing the <code><a href=#peerconnection>PeerConnection</a></code>
+ interface:</p>
+
+ <table><thead><tr><th><a href=#event-handlers title="event handlers">Event handler</a> <th><a href=#event-handler-event-type>Event handler event type</a>
+ <tbody><tr><td><dfn id=handler-peerconnection-ontext title=handler-PeerConnection-ontext><code>ontext</code></dfn> <td> <code title=event-stream-text>text</code>
+ <tr><td><dfn id=handler-peerconnection-onaddstream title=handler-PeerConnection-onaddstream><code>onaddstream</code></dfn> <td> <code title=event-stream-addstream>addstream</code>
+ <tr><td><dfn id=handler-peerconnection-onremovestream title=handler-PeerConnection-onremovestream><code>onremovestream</code></dfn> <td> <code title=event-stream-removestream>removestream</code>
+ </table><hr><p>The <a href=#task-source>task source</a> for the <a href=#concept-task title=concept-task>tasks</a> listed in this section is the
+ <a href=#networking-task-source>networking task source</a>.</p>
+
+ </div>
+
+ <div class=example>
+
+ <p>When two peers decide they are going to set up a connection to
+ each other, they both go through these steps. The STUN/TURN server
+ configuration describes a server they can use to get things like
+ their public IP address or to set up NAT traversal. They also have
+ to send data for the signaling channel to each other using the same
+ out-of-band mechanism they used to establish that they were going
+ to communicate in the first place.</p>
+
+ <pre>// the first argument describes the STUN/TURN server configuration
+var local = new PeerConnection('TURNS example.net', sendSignalingChannel);
+local.signalingChannel(...); // if we have a message from the other side, pass it along here
+
+// (aLocalStream is some GeneratedStream object)
+local.addStream(aLocalStream); // start sending video
+
+function sendSignalingChannel(message) {
+ ... // send message to the other side via the signaling channel
+}
+
+function receiveSignalingChannel (message) {
+ // call this whenever we get a message on the signaling channel
+ local.signalingChannel(message);
+}
+
+local.onaddstream = function (event) {
+ // (videoElement is some <video> element)
+ videoElement.src = URL.getObjectURL(event.stream);
+};</pre>
+
+ </div>
+
+ <p class=warning>To prevent network sniffing from allowing a
+ fourth party to establish a connection to a peer using the
+ information sent out-of-band to the other peer and thus spoofing the
+ client, the configuration information should always be transmitted
+ using an encrypted connection.</p>
+
+
+
+ <h4 id=the-data-stream><span class=secno>9.1.4 </span>The data stream</h4>
+
+ <p>All <code><a href=#peerconnection>PeerConnection</a></code> connections include a <dfn id=data-udp-media-stream>data
+ UDP media stream</dfn>, which is used to send data packets
+ peer-to-peer, for instance game control packets. This data channel
+ is unreliable (packets are not guaranteed to be delivered, and are
+ not guaranteed to be delivered in the right order).</p>
+
+ <p>All SDP media descriptions for <a href=#data-udp-media-stream title="data UDP media
+ stream">data UDP media streams</a> must include a label attribute
+ ("<code title="">a=label:</code>") whose value is the string "<code title="">data</code>". <a href=#refsSDP>[SDP]</a> <a href=#refsSDPLABEL>[SDPLABEL]</a></p>
+
+ <p>All SDP media descriptions for <a href=#data-udp-media-stream title="data UDP media
+ stream">data UDP media streams</a> must also include a key field
+ ("<code title="">k=</code>"), with the value being a base64-encoded
+ representation of 16 cryptographically random bytes determined on a
+ per-ICE-Agent basis. <a href=#refsSDP>[SDP]</a></p>
+
+ <p><a href=#peerconnection-ice-agent title="PeerConnection ICE
+ Agent"><code>PeerConnection</code> ICE Agents</a> must attempt to
+ establish a connection for their <a href=#peerconnection-data-udp-media-stream><code>PeerConnection</code>
+ data UDP media stream</a> during the initial offer/answer
+ exchange, and must maintain that UDP media stream for the ICE
+ Agents' whole lifetime.</p>
+
+ <p>A <a href=#data-udp-media-stream>data UDP media stream</a> is an <dfn id=active-data-udp-media-stream>active data UDP
+ media stream</dfn> if the <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE
+ Agent</a> has selected a destination for it. A <a href=#data-udp-media-stream>data UDP
+ media stream</a> can change active status many times during the
+ lifetime of its <code><a href=#peerconnection>PeerConnection</a></code> object (e.g. any time
+ the network topology changes and the ICE Agent performs an ICE
+ Restart). <a href=#refsICE>[ICE]</a></p>
+
+ <p>Bytes transmitted on a <a href=#data-udp-media-stream>data UDP media stream</a> are
+ masked so as to prevent cross-protocol attacks (<a href=#data-udp-media-stream>data UDP media
+ stream</a> always appear to contain random noise to other
+ protocols). For the purposes of masking, the <dfn id=data-udp-media-stream-salt>data UDP media
+ stream salt</dfn> is defined to be the following 16 bytes, described
+ here as hexadecimal numbers: DB 68 B5 FD 17 0E 15 77 56 AF 7A 3A 1A
+ 57 75 02</p> <!-- obtained thusly: head -c 16 /dev/urandom |
+ hexdump -C -->
+
+ <p>When the user agent is to <dfn id=transmit-a-data-packet-to-a-peer>transmit a data packet to a
+ peer</dfn> using a <a href=#data-udp-media-stream>data UDP media stream</a> and with a
+ byte string payload <var title="">data</var>, the user agent must
+ run the following steps:</p>
+
+ <ol><li><p>Let <var title="">nonce</var> be 16 cryptographically random
+ bytes.</li>
+
+ <li><p>Let <var title="">ice-key</var> be the 16 bytes given as the
+ encryption key for the <a href=#data-udp-media-stream>data UDP media stream</a> in its
+ media description, as defined above.</li>
+
+ <li><p>Let <var title="">key</var> be the first 16 bytes of the
+ HMAC-SHA1 of the 16 <var title="">nonce</var> bytes concatenated
+ with the 16 <var title="">ice-key</var> bytes concatenated with the
+ 16 <a href=#data-udp-media-stream-salt>data UDP media stream salt</a> bytes. <a href=#refsHMAC>[HMAC]</a> <a href=#refsSHA1>[SHA1]</a></li>
+
+ <li><p>Let <var title="">message</var> be a 0x01 byte followed by
+ <var title="">data</var>.</li>
+
+ <li><p>Let <var title="">masked message</var> be the result of
+ encrypting <var title="">message</var> using AES-128-CTR keyed with
+ <var title="">key</var>. <a href=#refsAES128CTR>[AES128CTR]</a></li>
+
+ <li><p>Send the concatenation of <var title="">nonce</var> and <var title="">masked message</var> in a UDP packet to the destination
+ that the relevant <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE
+ Agent</a> has selected a destination for the <a href=#data-udp-media-stream>data UDP
+ media stream</a>.</li>
+
+ </ol><p>A <dfn id=remote-data-udp-media-stream>remote data UDP media stream</dfn> is the first UDP media
+ stream whose sender is the remote peer, whose label attribute
+ ("<code title="">a=label:</code>") has the value "<code title="">data</code>", and for which a
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> has selected a
+ destination, if that media stream has an encryption key advertised
+ in its media description, and if that encryption key is 16 bytes
+ long. A <a href=#remote-data-udp-media-stream>remote data UDP media stream</a> is associated with
+ the <code><a href=#peerconnection>PeerConnection</a></code> object for which the
+ <a href=#peerconnection-ice-agent><code>PeerConnection</code> ICE Agent</a> in question is
+ operating.</p>
+
+ <p>When a packet from a <a href=#remote-data-udp-media-stream>remote data UDP media stream</a> is
+ received, the user agent must run the following steps:</p>
+
+ <ol><li><p>Let <var title="">data</var> be the UDP packet's data.</li>
+
+ <li><p>If <var title="">data</var> is shorter than 17 bytes, then
+ abort these steps.</li>
+
+ <li><p>Let <var title="">nonce</var> be the first 16 bytes of the
+ <var title="">data</var>.</li>
+
+ <li><p>Let <var title="">ice-key</var> be the 16 bytes given as the
+ encryption key for the <a href=#remote-data-udp-media-stream>remote data UDP media stream</a> in
+ the media description for this media stream. <a href=#refsSDP>[SDP]</a></li>
+
+ <li><p>Let <var title="">key</var> be the first 16 bytes of the
+ HMAC-SHA1 of the 16 <var title="">nonce</var> bytes concatenated
+ with the 16 <var title="">ice-key</var> bytes concatenated with the
+ 16 <a href=#data-udp-media-stream-salt>data UDP media stream salt</a> bytes. <a href=#refsHMAC>[HMAC]</a> <a href=#refsSHA1>[SHA1]</a></li>
+
+ <li><p>Let <var title="">unmasked data</var> be the result of
+ decrypting <var title="">message</var> using AES-128-CTR keyed with
+ <var title="">key</var>. <a href=#refsAES128CTR>[AES128CTR]</a></li>
+
+ <li><p>If the first byte of <var title="">unmasked data</var> is
+ not 0x01, then abort these steps.</li>
+
+ <li><p>Let <var title="">raw message</var> be the string consisting
+ of all but the first character of <var title="">unmasked
+ message</var>.</li>
+
+ <li><p>Let <var title="">message</var> be <var title="">raw
+ message</var> <a href=#decoded-as-utf-8,-with-error-handling>decoded as UTF-8, with error
+ handling</a>.</li>
+
+ <li><p>Create an event that uses the <code><a href=#messageevent>MessageEvent</a></code>
+ interface, with the name <code title=event-text>text</code>,
+ which does not bubble, is not cancelable, has no default action,
+ and has a <code title=dom-MessageEvent-data><a href=#dom-messageevent-data>data</a></code> attribute
+ whose value is <var title="">message</var>, and <a href=#queue-a-task>queue a
+ task</a> to dispatch the event at the
+ <code><a href=#peerconnection>PeerConnection</a></code> object that the <a href=#remote-data-udp-media-stream>remote data UDP
+ media stream</a> is associated with.</li>
+
+ </ol><h4 id=event-definitions-0><span class=secno>9.1.5 </span>Event definitions</h4>
+
+ <p>The <code title=event-stream-addstream>addstream</code> and
+ <code title=event-stream-removestream>removestream</code> events
+ use the <code><a href=#streamevent>StreamEvent</a></code> interface:</p>
+
+ <pre class=idl>interface <dfn id=streamevent>StreamEvent</dfn> : <a href=#event>Event</a> {
+ readonly attribute <a href=#stream>Stream</a> <a href=#dom-streamevent-stream title=dom-StreamEvent-stream>stream</a>;
+ void <span title=dom-CloseEvent-initCloseEvent>initCloseEvent</span>(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in <a href=#stream>Stream</a> streamArg);
+};</pre>
+
+ <p>The <dfn id=dom-streamevent-initstreamevent title=dom-StreamEvent-initStreamEvent><code>initStreamEvent()</code></dfn>
+ method must initialize the event in a manner analogous to the
+ similarly-named method in the DOM Events interfaces. <a href=#refsDOMEVENTS>[DOMEVENTS]</a></p>
+
+ <p>The <dfn id=dom-streamevent-stream title=dom-StreamEvent-stream><code>stream</code></dfn>
+ attribute represents the <code><a href=#stream>Stream</a></code> object associated with
+ the event.</p>
+
+ <p><dfn id=fire-a-stream-event title="fire a stream event">Firing a stream event named <var title="">e</var></dfn> with a <code><a href=#stream>Stream</a></code> <var title="">stream</var> means that an event with the name <var title="">e</var>, which does not bubble (except where otherwise
+ stated) and is not cancelable (except where otherwise stated), and
+ which uses the <code><a href=#streamevent>StreamEvent</a></code> interface with the <code title=dom-StreamEvent-stream><a href=#dom-streamevent-stream>stream</a></code> attribute set to <var title="">stream</var>, must be dispatched at the given target.</p>
+
+
+ <h4 id=event-summary><span class=secno>9.1.6 </span>Event Summary</h4>
+
+ <p class=XXX>...will add event summary for streams here...</p>
+
+</div>
+
+
+ <h2 id=comms><span class=secno>10 </span>Communication</h2>
+
<div data-component="Web Messaging (editor: Ian Hickson)">
- <h3 id=event-definitions-0><span class=secno>9.1 </span>Event definitions</h3>
+ <h3 id=event-definitions-1><span class=secno>10.1 </span>Event definitions</h3>
<p>Messages in <span>server-sent events</span>, <span>Web
sockets</span>, <a href=#web-messaging>cross-document messaging</a>, and
@@ -71332,7 +72542,7 @@
- <h3 id=web-messaging><span class=secno>9.2 </span><dfn id=crossDocumentMessages>Cross-document messaging</dfn></h3>
+ <h3 id=web-messaging><span class=secno>10.2 </span><dfn id=crossDocumentMessages>Cross-document messaging</dfn></h3>
<p>Web browsers, for security and privacy reasons, prevent documents
in different domains from affecting each other; that is, cross-site
@@ -71353,7 +72563,7 @@
</div>
- <h4 id=introduction-8><span class=secno>9.2.1 </span>Introduction</h4>
+ <h4 id=introduction-9><span class=secno>10.2.1 </span>Introduction</h4>
<p><i>This section is non-normative.</i></p>
@@ -71394,11 +72604,11 @@
</div>
- <h4 id=security-postmsg><span class=secno>9.2.2 </span>Security</h4>
+ <h4 id=security-postmsg><span class=secno>10.2.2 </span>Security</h4>
<div class=impl>
- <h5 id=authors><span class=secno>9.2.2.1 </span>Authors</h5>
+ <h5 id=authors><span class=secno>10.2.2.1 </span>Authors</h5>
</div>
@@ -71426,7 +72636,7 @@
<div class=impl>
- <h5 id=user-agents><span class=secno>9.2.2.2 </span>User agents</h5>
+ <h5 id=user-agents><span class=secno>10.2.2.2 </span>User agents</h5>
<p>The integrity of this API is based on the inability for scripts
of one <a href=#origin>origin</a> to post arbitrary events (using <code title="">dispatchEvent()</code> or otherwise) to objects in other
@@ -71442,7 +72652,7 @@
</div>
- <h4 id=posting-messages><span class=secno>9.2.3 </span>Posting messages</h4>
+ <h4 id=posting-messages><span class=secno>10.2.3 </span>Posting messages</h4>
<dl class=domintro><dt><var title="">window</var> . <code title=dom-window-postMessage><a href=#dom-window-postmessage>postMessage</a></code>(<var title="">message</var>, <var title="">targetOrigin</var> [, <var title="">ports</var> ])</dt>
@@ -71584,9 +72794,9 @@
- <h3 id=channel-messaging><span class=secno>9.3 </span><dfn>Channel messaging</dfn></h3>
+ <h3 id=channel-messaging><span class=secno>10.3 </span><dfn>Channel messaging</dfn></h3>
- <h4 id=introduction-9><span class=secno>9.3.1 </span>Introduction</h4>
+ <h4 id=introduction-10><span class=secno>10.3.1 </span>Introduction</h4>
<p><i>This section is non-normative.</i></p>
@@ -71623,7 +72833,7 @@
}</pre>
- <h4 id=message-channels><span class=secno>9.3.2 </span>Message channels</h4>
+ <h4 id=message-channels><span class=secno>10.3.2 </span>Message channels</h4>
<pre class=idl>[<a href=#dom-messagechannel title=dom-MessageChannel>Constructor</a>]
interface <dfn id=messagechannel>MessageChannel</dfn> {
@@ -71692,7 +72902,7 @@
- <h4 id=message-ports><span class=secno>9.3.3 </span>Message ports</h4>
+ <h4 id=message-ports><span class=secno>10.3.3 </span>Message ports</h4>
<p>Each channel has two message ports. Data sent through one port is
received by the other port, and vice versa.</p>
@@ -71979,7 +73189,7 @@
</div>
- <h5 id=ports-and-garbage-collection><span class=secno>9.3.3.1 </span>Ports and garbage collection</h5>
+ <h5 id=ports-and-garbage-collection><span class=secno>10.3.3.1 </span>Ports and garbage collection</h5>
<div class=impl>
@@ -72030,7 +73240,7 @@
- <h2 id=syntax><span class=secno>10 </span><dfn>The HTML syntax</dfn></h2>
+ <h2 id=syntax><span class=secno>11 </span><dfn>The HTML syntax</dfn></h2>
<p class=note>This section only describes the rules for resources
labeled with an <a href=#html-mime-type>HTML MIME type</a>. Rules for XML resources
@@ -72038,7 +73248,7 @@
syntax</a>".</p>
- <h3 id=writing><span class=secno>10.1 </span>Writing HTML documents</h3>
+ <h3 id=writing><span class=secno>11.1 </span>Writing HTML documents</h3>
<div class=impl>
@@ -72100,7 +73310,7 @@
as "case-insensitive".</p>
- <h4 id=the-doctype><span class=secno>10.1.1 </span>The DOCTYPE</h4>
+ <h4 id=the-doctype><span class=secno>11.1.1 </span>The DOCTYPE</h4>
<p>A <dfn id=syntax-doctype title=syntax-doctype>DOCTYPE</dfn> is a <!-- mostly
useless but nonetheless --> required preamble.</p>
@@ -72184,7 +73394,7 @@
- <h4 id=elements-0><span class=secno>10.1.2 </span>Elements</h4>
+ <h4 id=elements-0><span class=secno>11.1.2 </span>Elements</h4>
<p>There are five different kinds of <dfn id=syntax-elements title=syntax-elements>elements</dfn>: <a href=#void-elements>void elements</a>,
<a href=#raw-text-elements>raw text elements</a>, <a href=#rcdata-elements>RCDATA elements</a>,
@@ -72306,7 +73516,7 @@
tag name; tag names are case-insensitive.</p>
- <h5 id=start-tags><span class=secno>10.1.2.1 </span>Start tags</h5>
+ <h5 id=start-tags><span class=secno>11.1.2.1 </span>Start tags</h5>
<p><dfn id=syntax-start-tag title=syntax-start-tag>Start tags</dfn> must have the
following format:</p>
@@ -72341,7 +73551,7 @@
<li>Finally, start tags must be closed by a U+003E GREATER-THAN
SIGN character (>).</li>
- </ol><h5 id=end-tags><span class=secno>10.1.2.2 </span>End tags</h5>
+ </ol><h5 id=end-tags><span class=secno>11.1.2.2 </span>End tags</h5>
<p><dfn id=syntax-end-tag title=syntax-end-tag>End tags</dfn> must have the
following format:</p>
@@ -72361,7 +73571,7 @@
<li>Finally, end tags must be closed by a U+003E GREATER-THAN SIGN
character (>).</li>
- </ol><h5 id=attributes-0><span class=secno>10.1.2.3 </span>Attributes</h5>
+ </ol><h5 id=attributes-0><span class=secno>11.1.2.3 </span>Attributes</h5>
<p><dfn id=syntax-attributes title=syntax-attributes>Attributes</dfn> for an element
are expressed inside the element's start tag.</p>
@@ -72555,7 +73765,7 @@
HTML syntax</a>.</p>
- <h5 id=optional-tags><span class=secno>10.1.2.4 </span>Optional tags</h5>
+ <h5 id=optional-tags><span class=secno>11.1.2.4 </span>Optional tags</h5>
<p>Certain tags can be <dfn id=syntax-tag-omission title=syntax-tag-omission>omitted</dfn>.</p>
@@ -72732,7 +73942,7 @@
tag</a> must never be omitted if it has any attributes.</p>
- <h5 id=element-restrictions><span class=secno>10.1.2.5 </span>Restrictions on content models</h5>
+ <h5 id=element-restrictions><span class=secno>11.1.2.5 </span>Restrictions on content models</h5>
<p>For historical reasons, certain elements have extra restrictions
beyond even the restrictions given by their content model.</p>
@@ -72761,7 +73971,7 @@
</div>
- <h5 id=cdata-rcdata-restrictions><span class=secno>10.1.2.6 </span>Restrictions on the contents of raw text and RCDATA elements</h5>
+ <h5 id=cdata-rcdata-restrictions><span class=secno>11.1.2.6 </span>Restrictions on the contents of raw text and RCDATA elements</h5>
<p>The text in <a href=#raw-text-elements title="raw text elements">raw text</a> and
<a href=#rcdata-elements>RCDATA elements</a> must not contain any occurrences of the
@@ -72773,7 +73983,7 @@
U+002F SOLIDUS (/).</p>
- <h4 id=text-1><span class=secno>10.1.3 </span>Text</h4>
+ <h4 id=text-1><span class=secno>11.1.3 </span>Text</h4>
<p><dfn id=syntax-text title=syntax-text>Text</dfn> is allowed inside elements,
attribute values, and comments. Text must consist of Unicode
@@ -72784,7 +73994,7 @@
the text is to be put, as described in the other sections.</p>
- <h5 id=newlines><span class=secno>10.1.3.1 </span>Newlines</h5>
+ <h5 id=newlines><span class=secno>11.1.3.1 </span>Newlines</h5>
<p><dfn id=syntax-newlines title=syntax-newlines>Newlines</dfn> in HTML may be
represented either as U+000D CARRIAGE RETURN (CR) characters, U+000A
@@ -72797,7 +74007,7 @@
represents a <a href=#syntax-newlines title=syntax-newlines>newline</a>.</p>
- <h4 id=character-references><span class=secno>10.1.4 </span>Character references</h4>
+ <h4 id=character-references><span class=secno>11.1.4 </span>Character references</h4>
<p>In certain cases described in other sections, <a href=#syntax-text title=syntax-text>text</a> may be mixed with <dfn id=syntax-charref title=syntax-charref>character references</dfn>. These can be used
to escape characters that couldn't otherwise legally be included in
@@ -72855,7 +74065,7 @@
the <a href=#named-character-references>named character references</a> section.</p>
- <h4 id=cdata-sections><span class=secno>10.1.5 </span>CDATA sections</h4>
+ <h4 id=cdata-sections><span class=secno>11.1.5 </span>CDATA sections</h4>
<p><dfn id=syntax-cdata title=syntax-cdata>CDATA sections</dfn> must consist of
the following components, in this order:</p>
@@ -72886,7 +74096,7 @@
</div>
- <h4 id=comments><span class=secno>10.1.6 </span>Comments</h4>
+ <h4 id=comments><span class=secno>11.1.6 </span>Comments</h4>
<p><dfn id=syntax-comments title=syntax-comments>Comments</dfn> must start with the
four character sequence U+003C LESS-THAN SIGN, U+0021 EXCLAMATION
@@ -72904,7 +74114,7 @@
<div class=impl>
- <h3 id=parsing><span class=secno>10.2 </span>Parsing HTML documents</h3>
+ <h3 id=parsing><span class=secno>11.2 </span>Parsing HTML documents</h3>
<p><i>This section only applies to user agents, data mining tools,
and conformance checkers.</i></p>
@@ -72973,7 +74183,7 @@
<div class=impl>
- <h4 id=overview-of-the-parsing-model><span class=secno>10.2.1 </span>Overview of the parsing model</h4>
+ <h4 id=overview-of-the-parsing-model><span class=secno>11.2.1 </span>Overview of the parsing model</h4>
<p>The input to the HTML parsing process consists of a stream of
Unicode characters, which is passed through a
@@ -73023,7 +74233,7 @@
<div class=impl>
- <h4 id=the-input-stream><span class=secno>10.2.2 </span>The <dfn>input stream</dfn></h4>
+ <h4 id=the-input-stream><span class=secno>11.2.2 </span>The <dfn>input stream</dfn></h4>
<p>The stream of Unicode characters that comprises the input to the
tokenization stage will be initially seen by the user agent as a
@@ -73037,7 +74247,7 @@
specification. This section does not apply to XML documents. <a href=#refsXML>[XML]</a></p>
- <h5 id=determining-the-character-encoding><span class=secno>10.2.2.1 </span>Determining the character encoding</h5>
+ <h5 id=determining-the-character-encoding><span class=secno>11.2.2.1 </span>Determining the character encoding</h5>
<p>In some cases, it might be impractical to unambiguously determine
the encoding before parsing the document. Because of this, this
@@ -73591,7 +74801,7 @@
desire to be maximally compatible with legacy content. <a href=#refsHTTP>[HTTP]</a> <a href=#refsRFC2046>[RFC2046]</a></p>
- <h5 id=character-encodings-0><span class=secno>10.2.2.2 </span>Character encodings</h5>
+ <h5 id=character-encodings-0><span class=secno>11.2.2.2 </span>Character encodings</h5>
<p>User agents must at a minimum support the UTF-8 and Windows-1252
encodings, but may support more. <a href=#refsRFC3629>[RFC3629]</a> <a href=#refsWIN1252>[WIN1252]</a></p>
@@ -73681,7 +74891,7 @@
- <h5 id=preprocessing-the-input-stream><span class=secno>10.2.2.3 </span>Preprocessing the input stream</h5>
+ <h5 id=preprocessing-the-input-stream><span class=secno>11.2.2.3 </span>Preprocessing the input stream</h5>
<p>Given an encoding, the bytes in the input stream must be
converted to Unicode characters for the tokenizer, as described by
@@ -73760,7 +74970,7 @@
the stream, but rather the lack of any further characters.</p>
- <h5 id=changing-the-encoding-while-parsing><span class=secno>10.2.2.4 </span>Changing the encoding while parsing</h5>
+ <h5 id=changing-the-encoding-while-parsing><span class=secno>11.2.2.4 </span>Changing the encoding while parsing</h5>
<p>When the parser requires the user agent to <dfn id=change-the-encoding>change the
encoding</dfn>, it must run the following steps. This might happen
@@ -73817,9 +75027,9 @@
<div class=impl>
- <h4 id=parse-state><span class=secno>10.2.3 </span>Parse state</h4>
+ <h4 id=parse-state><span class=secno>11.2.3 </span>Parse state</h4>
- <h5 id=the-insertion-mode><span class=secno>10.2.3.1 </span>The insertion mode</h5>
+ <h5 id=the-insertion-mode><span class=secno>11.2.3.1 </span>The insertion mode</h5>
<p>The <dfn id=insertion-mode>insertion mode</dfn> is a state variable that controls
the primary operation of the tree construction stage.</p>
@@ -73952,7 +75162,7 @@
<li>Return to the step labeled <i>loop</i>.</li>
- </ol><h5 id=the-stack-of-open-elements><span class=secno>10.2.3.2 </span>The stack of open elements</h5>
+ </ol><h5 id=the-stack-of-open-elements><span class=secno>11.2.3.2 </span>The stack of open elements</h5>
<p>Initially, the <dfn id=stack-of-open-elements>stack of open elements</dfn> is empty. The
stack grows downwards; the topmost node on the stack is the first
@@ -74115,7 +75325,7 @@
the stack is manipulated in a random-access fashion.</p>
- <h5 id=the-list-of-active-formatting-elements><span class=secno>10.2.3.3 </span>The list of active formatting elements</h5>
+ <h5 id=the-list-of-active-formatting-elements><span class=secno>11.2.3.3 </span>The list of active formatting elements</h5>
<p>Initially, the <dfn id=list-of-active-formatting-elements>list of active formatting elements</dfn> is
empty. It is used to handle mis-nested <a href=#formatting title=formatting>formatting element tags</a>.</p>
@@ -74233,7 +75443,7 @@
<li>Go to step 1.</li>
- </ol><h5 id=the-element-pointers><span class=secno>10.2.3.4 </span>The element pointers</h5>
+ </ol><h5 id=the-element-pointers><span class=secno>11.2.3.4 </span>The element pointers</h5>
<p>Initially, the <dfn id=head-element-pointer><code title="">head</code> element
pointer</dfn> and the <dfn id=form-element-pointer><code title="">form</code> element
@@ -74250,7 +75460,7 @@
markup, for historical reasons.</p>
- <h5 id=other-parsing-state-flags><span class=secno>10.2.3.5 </span>Other parsing state flags</h5>
+ <h5 id=other-parsing-state-flags><span class=secno>11.2.3.5 </span>Other parsing state flags</h5>
<p>The <dfn id=scripting-flag>scripting flag</dfn> is set to "enabled" if <a href=#concept-n-script title=concept-n-script>scripting was enabled</a> for the
<code><a href=#document>Document</a></code> with which the parser is associated when the
@@ -74269,7 +75479,7 @@
<div class=impl>
- <h4 id=tokenization><span class=secno>10.2.4 </span><dfn>Tokenization</dfn></h4>
+ <h4 id=tokenization><span class=secno>11.2.4 </span><dfn>Tokenization</dfn></h4>
<p>Implementations must act as if they used the following state
machine to tokenize HTML. The state machine must start in the
@@ -74340,7 +75550,7 @@
error, by unicode, then EOF, ending with "anything else" -->
- <h5 id=data-state><span class=secno>10.2.4.1 </span><dfn>Data state</dfn></h5>
+ <h5 id=data-state><span class=secno>11.2.4.1 </span><dfn>Data state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74362,7 +75572,7 @@
<dd>Emit the <a href=#current-input-character>current input character</a> as a character
token.</dd>
- </dl><h5 id=character-reference-in-data-state><span class=secno>10.2.4.2 </span><dfn>Character reference in data state</dfn></h5>
+ </dl><h5 id=character-reference-in-data-state><span class=secno>11.2.4.2 </span><dfn>Character reference in data state</dfn></h5>
<p>Attempt to <a href=#consume-a-character-reference>consume a character reference</a>, with no
<a href=#additional-allowed-character>additional allowed character</a>.</p>
@@ -74375,7 +75585,7 @@
<p>Finally, switch to the <a href=#data-state>data state</a>.</p>
- <h5 id=rcdata-state><span class=secno>10.2.4.3 </span><dfn>RCDATA state</dfn></h5>
+ <h5 id=rcdata-state><span class=secno>11.2.4.3 </span><dfn>RCDATA state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74397,7 +75607,7 @@
<dd>Emit the <a href=#current-input-character>current input character</a> as a character
token.</dd>
- </dl><h5 id=character-reference-in-rcdata-state><span class=secno>10.2.4.4 </span><dfn>Character reference in RCDATA state</dfn></h5>
+ </dl><h5 id=character-reference-in-rcdata-state><span class=secno>11.2.4.4 </span><dfn>Character reference in RCDATA state</dfn></h5>
<p>Attempt to <a href=#consume-a-character-reference>consume a character reference</a>, with no
<a href=#additional-allowed-character>additional allowed character</a>.</p>
@@ -74410,7 +75620,7 @@
<p>Finally, switch to the <a href=#rcdata-state>RCDATA state</a>.</p>
- <h5 id=rawtext-state><span class=secno>10.2.4.5 </span><dfn>RAWTEXT state</dfn></h5>
+ <h5 id=rawtext-state><span class=secno>11.2.4.5 </span><dfn>RAWTEXT state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74428,7 +75638,7 @@
<dd>Emit the <a href=#current-input-character>current input character</a> as a character
token.</dd>
- </dl><h5 id=script-data-state><span class=secno>10.2.4.6 </span><dfn>Script data state</dfn></h5>
+ </dl><h5 id=script-data-state><span class=secno>11.2.4.6 </span><dfn>Script data state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74446,7 +75656,7 @@
<dd>Emit the <a href=#current-input-character>current input character</a> as a character
token.</dd>
- </dl><h5 id=plaintext-state><span class=secno>10.2.4.7 </span><dfn>PLAINTEXT state</dfn></h5>
+ </dl><h5 id=plaintext-state><span class=secno>11.2.4.7 </span><dfn>PLAINTEXT state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74461,7 +75671,7 @@
<dd>Emit the <a href=#current-input-character>current input character</a> as a character
token.</dd>
- </dl><h5 id=tag-open-state><span class=secno>10.2.4.8 </span><dfn>Tag open state</dfn></h5>
+ </dl><h5 id=tag-open-state><span class=secno>11.2.4.8 </span><dfn>Tag open state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74493,7 +75703,7 @@
character token and reconsume the <a href=#current-input-character>current input
character</a> in the <a href=#data-state>data state</a>.</dd>
- </dl><h5 id=end-tag-open-state><span class=secno>10.2.4.9 </span><dfn>End tag open state</dfn></h5>
+ </dl><h5 id=end-tag-open-state><span class=secno>11.2.4.9 </span><dfn>End tag open state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74523,7 +75733,7 @@
<dd><a href=#parse-error>Parse error</a>. Switch to the <a href=#bogus-comment-state>bogus
comment state</a>.</dd>
- </dl><h5 id=tag-name-state><span class=secno>10.2.4.10 </span><dfn>Tag name state</dfn></h5>
+ </dl><h5 id=tag-name-state><span class=secno>11.2.4.10 </span><dfn>Tag name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74558,7 +75768,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
tag token's tag name.</dd>
- </dl><h5 id=rcdata-less-than-sign-state><span class=secno>10.2.4.11 </span><dfn>RCDATA less-than sign state</dfn></h5>
+ </dl><h5 id=rcdata-less-than-sign-state><span class=secno>11.2.4.11 </span><dfn>RCDATA less-than sign state</dfn></h5>
<!-- identical to the RAWTEXT less-than sign state, except s/RAWTEXT/RCDATA/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74572,7 +75782,7 @@
<a href=#current-input-character>current input character</a> in the <a href=#rcdata-state>RCDATA
state</a>.</dd>
- </dl><h5 id=rcdata-end-tag-open-state><span class=secno>10.2.4.12 </span><dfn>RCDATA end tag open state</dfn></h5>
+ </dl><h5 id=rcdata-end-tag-open-state><span class=secno>11.2.4.12 </span><dfn>RCDATA end tag open state</dfn></h5>
<!-- identical to the RAWTEXT (and Script data) end tag open state, except s/RAWTEXT/RCDATA/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74599,7 +75809,7 @@
character token, and reconsume the <a href=#current-input-character>current input
character</a> in the <a href=#rcdata-state>RCDATA state</a>.</dd>
- </dl><h5 id=rcdata-end-tag-name-state><span class=secno>10.2.4.13 </span><dfn>RCDATA end tag name state</dfn></h5>
+ </dl><h5 id=rcdata-end-tag-name-state><span class=secno>11.2.4.13 </span><dfn>RCDATA end tag name state</dfn></h5>
<!-- identical to the RAWTEXT (and Script data) end tag name state, except s/RAWTEXT/RCDATA/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74644,7 +75854,7 @@
the buffer), and reconsume the <a href=#current-input-character>current input character</a>
in the <a href=#rcdata-state>RCDATA state</a>.</dd>
- </dl><h5 id=rawtext-less-than-sign-state><span class=secno>10.2.4.14 </span><dfn>RAWTEXT less-than sign state</dfn></h5>
+ </dl><h5 id=rawtext-less-than-sign-state><span class=secno>11.2.4.14 </span><dfn>RAWTEXT less-than sign state</dfn></h5>
<!-- identical to the RCDATA less-than sign state, except s/RCDATA/RAWTEXT/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74658,7 +75868,7 @@
<a href=#current-input-character>current input character</a> in the <a href=#rawtext-state>RAWTEXT
state</a>.</dd>
- </dl><h5 id=rawtext-end-tag-open-state><span class=secno>10.2.4.15 </span><dfn>RAWTEXT end tag open state</dfn></h5>
+ </dl><h5 id=rawtext-end-tag-open-state><span class=secno>11.2.4.15 </span><dfn>RAWTEXT end tag open state</dfn></h5>
<!-- identical to the RCDATA (and Script data) end tag open state, except s/RCDATA/RAWTEXT/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74685,7 +75895,7 @@
character token, and reconsume the <a href=#current-input-character>current input
character</a> in the <a href=#rawtext-state>RAWTEXT state</a>.</dd>
- </dl><h5 id=rawtext-end-tag-name-state><span class=secno>10.2.4.16 </span><dfn>RAWTEXT end tag name state</dfn></h5>
+ </dl><h5 id=rawtext-end-tag-name-state><span class=secno>11.2.4.16 </span><dfn>RAWTEXT end tag name state</dfn></h5>
<!-- identical to the RCDATA (and Script data) end tag name state, except s/RCDATA/RAWTEXT/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74730,7 +75940,7 @@
the buffer), and reconsume the <a href=#current-input-character>current input character</a>
in the <a href=#rawtext-state>RAWTEXT state</a>.</dd>
- </dl><h5 id=script-data-less-than-sign-state><span class=secno>10.2.4.17 </span><dfn>Script data less-than sign state</dfn></h5>
+ </dl><h5 id=script-data-less-than-sign-state><span class=secno>11.2.4.17 </span><dfn>Script data less-than sign state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74748,7 +75958,7 @@
<a href=#current-input-character>current input character</a> in the <a href=#script-data-state>script data
state</a>.</dd>
- </dl><h5 id=script-data-end-tag-open-state><span class=secno>10.2.4.18 </span><dfn>Script data end tag open state</dfn></h5>
+ </dl><h5 id=script-data-end-tag-open-state><span class=secno>11.2.4.18 </span><dfn>Script data end tag open state</dfn></h5>
<!-- identical to the RCDATA (and RAWTEXT) end tag open state, except s/RCDATA/Script data/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74775,7 +75985,7 @@
character token, and reconsume the <a href=#current-input-character>current input
character</a> in the <a href=#script-data-state>script data state</a>.</dd>
- </dl><h5 id=script-data-end-tag-name-state><span class=secno>10.2.4.19 </span><dfn>Script data end tag name state</dfn></h5>
+ </dl><h5 id=script-data-end-tag-name-state><span class=secno>11.2.4.19 </span><dfn>Script data end tag name state</dfn></h5>
<!-- identical to the RCDATA (and RAWTEXT) end tag name state, except s/RCDATA/Script data/g -->
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74820,7 +76030,7 @@
the buffer), and reconsume the <a href=#current-input-character>current input character</a>
in the <a href=#script-data-state>script data state</a>.</dd>
- </dl><h5 id=script-data-escape-start-state><span class=secno>10.2.4.20 </span><dfn>Script data escape start state</dfn></h5>
+ </dl><h5 id=script-data-escape-start-state><span class=secno>11.2.4.20 </span><dfn>Script data escape start state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74832,7 +76042,7 @@
<dd>Reconsume the <a href=#current-input-character>current input character</a> in the
<a href=#script-data-state>script data state</a>.</dd>
- </dl><h5 id=script-data-escape-start-dash-state><span class=secno>10.2.4.21 </span><dfn>Script data escape start dash state</dfn></h5>
+ </dl><h5 id=script-data-escape-start-dash-state><span class=secno>11.2.4.21 </span><dfn>Script data escape start dash state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74844,7 +76054,7 @@
<dd>Reconsume the <a href=#current-input-character>current input character</a> in the
<a href=#script-data-state>script data state</a>.</dd>
- </dl><h5 id=script-data-escaped-state><span class=secno>10.2.4.22 </span><dfn>Script data escaped state</dfn></h5>
+ </dl><h5 id=script-data-escaped-state><span class=secno>11.2.4.22 </span><dfn>Script data escaped state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74868,7 +76078,7 @@
<dd>Emit the <a href=#current-input-character>current input character</a> as a character
token.</dd>
- </dl><h5 id=script-data-escaped-dash-state><span class=secno>10.2.4.23 </span><dfn>Script data escaped dash state</dfn></h5>
+ </dl><h5 id=script-data-escaped-dash-state><span class=secno>11.2.4.23 </span><dfn>Script data escaped dash state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74893,7 +76103,7 @@
<dd>Switch to the <a href=#script-data-escaped-state>script data escaped state</a>. Emit the
<a href=#current-input-character>current input character</a> as a character token.</dd>
- </dl><h5 id=script-data-escaped-dash-dash-state><span class=secno>10.2.4.24 </span><dfn>Script data escaped dash dash state</dfn></h5>
+ </dl><h5 id=script-data-escaped-dash-dash-state><span class=secno>11.2.4.24 </span><dfn>Script data escaped dash dash state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74921,7 +76131,7 @@
<dd>Switch to the <a href=#script-data-escaped-state>script data escaped state</a>. Emit the
<a href=#current-input-character>current input character</a> as a character token.</dd>
- </dl><h5 id=script-data-escaped-less-than-sign-state><span class=secno>10.2.4.25 </span><dfn>Script data escaped less-than sign state</dfn></h5>
+ </dl><h5 id=script-data-escaped-less-than-sign-state><span class=secno>11.2.4.25 </span><dfn>Script data escaped less-than sign state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74949,7 +76159,7 @@
<a href=#current-input-character>current input character</a> in the <a href=#script-data-escaped-state>script data
escaped state</a>.</dd>
- </dl><h5 id=script-data-escaped-end-tag-open-state><span class=secno>10.2.4.26 </span><dfn>Script data escaped end tag open state</dfn></h5>
+ </dl><h5 id=script-data-escaped-end-tag-open-state><span class=secno>11.2.4.26 </span><dfn>Script data escaped end tag open state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -74975,7 +76185,7 @@
character token, and reconsume the <a href=#current-input-character>current input
character</a> in the <a href=#script-data-escaped-state>script data escaped state</a>.</dd>
- </dl><h5 id=script-data-escaped-end-tag-name-state><span class=secno>10.2.4.27 </span><dfn>Script data escaped end tag name state</dfn></h5>
+ </dl><h5 id=script-data-escaped-end-tag-name-state><span class=secno>11.2.4.27 </span><dfn>Script data escaped end tag name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75019,7 +76229,7 @@
the buffer), and reconsume the <a href=#current-input-character>current input character</a>
in the <a href=#script-data-escaped-state>script data escaped state</a>.</dd>
- </dl><h5 id=script-data-double-escape-start-state><span class=secno>10.2.4.28 </span><dfn>Script data double escape start state</dfn></h5>
+ </dl><h5 id=script-data-double-escape-start-state><span class=secno>11.2.4.28 </span><dfn>Script data double escape start state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75050,7 +76260,7 @@
<dd>Reconsume the <a href=#current-input-character>current input character</a> in the
<a href=#script-data-escaped-state>script data escaped state</a>.</dd>
- </dl><h5 id=script-data-double-escaped-state><span class=secno>10.2.4.29 </span><dfn>Script data double escaped state</dfn></h5>
+ </dl><h5 id=script-data-double-escaped-state><span class=secno>11.2.4.29 </span><dfn>Script data double escaped state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75075,7 +76285,7 @@
<dd>Emit the <a href=#current-input-character>current input character</a> as a character
token.</dd>
- </dl><h5 id=script-data-double-escaped-dash-state><span class=secno>10.2.4.30 </span><dfn>Script data double escaped dash state</dfn></h5>
+ </dl><h5 id=script-data-double-escaped-dash-state><span class=secno>11.2.4.30 </span><dfn>Script data double escaped dash state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75102,7 +76312,7 @@
state</a>. Emit the <a href=#current-input-character>current input character</a> as a
character token.</dd>
- </dl><h5 id=script-data-double-escaped-dash-dash-state><span class=secno>10.2.4.31 </span><dfn>Script data double escaped dash dash state</dfn></h5>
+ </dl><h5 id=script-data-double-escaped-dash-dash-state><span class=secno>11.2.4.31 </span><dfn>Script data double escaped dash dash state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75132,7 +76342,7 @@
state</a>. Emit the <a href=#current-input-character>current input character</a> as a
character token.</dd>
- </dl><h5 id=script-data-double-escaped-less-than-sign-state><span class=secno>10.2.4.32 </span><dfn>Script data double escaped less-than sign state</dfn></h5>
+ </dl><h5 id=script-data-double-escaped-less-than-sign-state><span class=secno>11.2.4.32 </span><dfn>Script data double escaped less-than sign state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75145,7 +76355,7 @@
<dd>Reconsume the <a href=#current-input-character>current input character</a> in the
<a href=#script-data-double-escaped-state>script data double escaped state</a>.</dd>
- </dl><h5 id=script-data-double-escape-end-state><span class=secno>10.2.4.33 </span><dfn>Script data double escape end state</dfn></h5>
+ </dl><h5 id=script-data-double-escape-end-state><span class=secno>11.2.4.33 </span><dfn>Script data double escape end state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75176,7 +76386,7 @@
<dd>Reconsume the <a href=#current-input-character>current input character</a> in the
<a href=#script-data-double-escaped-state>script data double escaped state</a>.</dd>
- </dl><h5 id=before-attribute-name-state><span class=secno>10.2.4.34 </span><dfn>Before attribute name state</dfn></h5>
+ </dl><h5 id=before-attribute-name-state><span class=secno>11.2.4.34 </span><dfn>Before attribute name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75224,7 +76434,7 @@
its value to the empty string. Switch to the <a href=#attribute-name-state>attribute name
state</a>.</dd>
- </dl><h5 id=attribute-name-state><span class=secno>10.2.4.35 </span><dfn>Attribute name state</dfn></h5>
+ </dl><h5 id=attribute-name-state><span class=secno>11.2.4.35 </span><dfn>Attribute name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75277,7 +76487,7 @@
associated with it (if any).</p>
- <h5 id=after-attribute-name-state><span class=secno>10.2.4.36 </span><dfn>After attribute name state</dfn></h5>
+ <h5 id=after-attribute-name-state><span class=secno>11.2.4.36 </span><dfn>After attribute name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75327,7 +76537,7 @@
its value to the empty string. Switch to the <a href=#attribute-name-state>attribute name
state</a>.</dd>
- </dl><h5 id=before-attribute-value-state><span class=secno>10.2.4.37 </span><dfn>Before attribute value state</dfn></h5>
+ </dl><h5 id=before-attribute-value-state><span class=secno>11.2.4.37 </span><dfn>Before attribute value state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75372,7 +76582,7 @@
attribute's value. Switch to the <a href=#attribute-value-(unquoted)-state>attribute value (unquoted)
state</a>.</dd>
- </dl><h5 id=attribute-value-(double-quoted)-state><span class=secno>10.2.4.38 </span><dfn>Attribute value (double-quoted) state</dfn></h5>
+ </dl><h5 id=attribute-value-(double-quoted)-state><span class=secno>11.2.4.38 </span><dfn>Attribute value (double-quoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75397,7 +76607,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
attribute's value.</dd>
- </dl><h5 id=attribute-value-(single-quoted)-state><span class=secno>10.2.4.39 </span><dfn>Attribute value (single-quoted) state</dfn></h5>
+ </dl><h5 id=attribute-value-(single-quoted)-state><span class=secno>11.2.4.39 </span><dfn>Attribute value (single-quoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75422,7 +76632,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
attribute's value.</dd>
- </dl><h5 id=attribute-value-(unquoted)-state><span class=secno>10.2.4.40 </span><dfn>Attribute value (unquoted) state</dfn></h5>
+ </dl><h5 id=attribute-value-(unquoted)-state><span class=secno>11.2.4.40 </span><dfn>Attribute value (unquoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75462,7 +76672,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
attribute's value.</dd>
- </dl><h5 id=character-reference-in-attribute-value-state><span class=secno>10.2.4.41 </span><dfn>Character reference in attribute value state</dfn></h5>
+ </dl><h5 id=character-reference-in-attribute-value-state><span class=secno>11.2.4.41 </span><dfn>Character reference in attribute value state</dfn></h5>
<p>Attempt to <a href=#consume-a-character-reference>consume a character reference</a>.</p>
@@ -75476,7 +76686,7 @@
into this state.</p>
- <h5 id=after-attribute-value-(quoted)-state><span class=secno>10.2.4.42 </span><dfn>After attribute value (quoted) state</dfn></h5>
+ <h5 id=after-attribute-value-(quoted)-state><span class=secno>11.2.4.42 </span><dfn>After attribute value (quoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75502,7 +76712,7 @@
<dd><a href=#parse-error>Parse error</a>. Reconsume the character in
the <a href=#before-attribute-name-state>before attribute name state</a>.</dd>
- </dl><h5 id=self-closing-start-tag-state><span class=secno>10.2.4.43 </span><dfn>Self-closing start tag state</dfn></h5>
+ </dl><h5 id=self-closing-start-tag-state><span class=secno>11.2.4.43 </span><dfn>Self-closing start tag state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75519,7 +76729,7 @@
<dd><a href=#parse-error>Parse error</a>. Reconsume the character in
the <a href=#before-attribute-name-state>before attribute name state</a>.</dd>
- </dl><h5 id=bogus-comment-state><span class=secno>10.2.4.44 </span><dfn>Bogus comment state</dfn></h5>
+ </dl><h5 id=bogus-comment-state><span class=secno>11.2.4.44 </span><dfn>Bogus comment state</dfn></h5>
<p>Consume every character up to and including the first U+003E
GREATER-THAN SIGN character (>) or the end of the file (EOF),
@@ -75538,7 +76748,7 @@
character.</p>
- <h5 id=markup-declaration-open-state><span class=secno>10.2.4.45 </span><dfn>Markup declaration open state</dfn></h5>
+ <h5 id=markup-declaration-open-state><span class=secno>11.2.4.45 </span><dfn>Markup declaration open state</dfn></h5>
<p>If the next two characters are both U+002D HYPHEN-MINUS
characters (-), consume those two characters, create a comment token
@@ -75562,7 +76772,7 @@
comment.</p>
- <h5 id=comment-start-state><span class=secno>10.2.4.46 </span><dfn>Comment start state</dfn></h5>
+ <h5 id=comment-start-state><span class=secno>11.2.4.46 </span><dfn>Comment start state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75587,7 +76797,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the comment
token's data. Switch to the <a href=#comment-state>comment state</a>.</dd>
- </dl><h5 id=comment-start-dash-state><span class=secno>10.2.4.47 </span><dfn>Comment start dash state</dfn></h5>
+ </dl><h5 id=comment-start-dash-state><span class=secno>11.2.4.47 </span><dfn>Comment start dash state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75614,7 +76824,7 @@
<a href=#current-input-character>current input character</a> to the comment token's
data. Switch to the <a href=#comment-state>comment state</a>.</dd>
- </dl><h5 id=comment-state><span class=secno>10.2.4.48 </span><dfn id=comment>Comment state</dfn></h5>
+ </dl><h5 id=comment-state><span class=secno>11.2.4.48 </span><dfn id=comment>Comment state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75634,7 +76844,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the comment
token's data.</dd>
- </dl><h5 id=comment-end-dash-state><span class=secno>10.2.4.49 </span><dfn>Comment end dash state</dfn></h5>
+ </dl><h5 id=comment-end-dash-state><span class=secno>11.2.4.49 </span><dfn>Comment end dash state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75657,7 +76867,7 @@
<a href=#current-input-character>current input character</a> to the comment token's
data. Switch to the <a href=#comment-state>comment state</a>.</dd>
- </dl><h5 id=comment-end-state><span class=secno>10.2.4.50 </span><dfn>Comment end state</dfn></h5>
+ </dl><h5 id=comment-end-state><span class=secno>11.2.4.50 </span><dfn>Comment end state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75693,7 +76903,7 @@
comment token's data. Switch to the <a href=#comment-state>comment
state</a>.</dd>
- </dl><h5 id=comment-end-bang-state><span class=secno>10.2.4.51 </span><dfn>Comment end bang state</dfn></h5>
+ </dl><h5 id=comment-end-bang-state><span class=secno>11.2.4.51 </span><dfn>Comment end bang state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75723,7 +76933,7 @@
character</a> to the comment token's data. Switch to the
<a href=#comment-state>comment state</a>.</dd>
- </dl><h5 id=doctype-state><span class=secno>10.2.4.52 </span><dfn>DOCTYPE state</dfn></h5>
+ </dl><h5 id=doctype-state><span class=secno>11.2.4.52 </span><dfn>DOCTYPE state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75743,7 +76953,7 @@
<dd><a href=#parse-error>Parse error</a>. Reconsume the character in the
<a href=#before-doctype-name-state>before DOCTYPE name state</a>.</dd>
- </dl><h5 id=before-doctype-name-state><span class=secno>10.2.4.53 </span><dfn>Before DOCTYPE name state</dfn></h5>
+ </dl><h5 id=before-doctype-name-state><span class=secno>11.2.4.53 </span><dfn>Before DOCTYPE name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75780,7 +76990,7 @@
<a href=#current-input-character>current input character</a>. Switch to the <a href=#doctype-name-state>DOCTYPE name
state</a>.</dd>
- </dl><h5 id=doctype-name-state><span class=secno>10.2.4.54 </span><dfn>DOCTYPE name state</dfn></h5>
+ </dl><h5 id=doctype-name-state><span class=secno>11.2.4.54 </span><dfn>DOCTYPE name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75813,7 +77023,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
DOCTYPE token's name.</dd>
- </dl><h5 id=after-doctype-name-state><span class=secno>10.2.4.55 </span><dfn>After DOCTYPE name state</dfn></h5>
+ </dl><h5 id=after-doctype-name-state><span class=secno>11.2.4.55 </span><dfn>After DOCTYPE name state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75853,7 +77063,7 @@
</dd>
- </dl><h5 id=after-doctype-public-keyword-state><span class=secno>10.2.4.56 </span><dfn>After DOCTYPE public keyword state</dfn></h5>
+ </dl><h5 id=after-doctype-public-keyword-state><span class=secno>11.2.4.56 </span><dfn>After DOCTYPE public keyword state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75890,7 +77100,7 @@
<i>force-quirks flag</i> to <i>on</i>. Switch to the <a href=#bogus-doctype-state>bogus
DOCTYPE state</a>.</dd>
- </dl><h5 id=before-doctype-public-identifier-state><span class=secno>10.2.4.57 </span><dfn>Before DOCTYPE public identifier state</dfn></h5>
+ </dl><h5 id=before-doctype-public-identifier-state><span class=secno>11.2.4.57 </span><dfn>Before DOCTYPE public identifier state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75926,7 +77136,7 @@
<i>force-quirks flag</i> to <i>on</i>. Switch to the <a href=#bogus-doctype-state>bogus
DOCTYPE state</a>.</dd>
- </dl><h5 id=doctype-public-identifier-(double-quoted)-state><span class=secno>10.2.4.58 </span><dfn>DOCTYPE public identifier (double-quoted) state</dfn></h5>
+ </dl><h5 id=doctype-public-identifier-(double-quoted)-state><span class=secno>11.2.4.58 </span><dfn>DOCTYPE public identifier (double-quoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75951,7 +77161,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
DOCTYPE token's public identifier.</dd>
- </dl><h5 id=doctype-public-identifier-(single-quoted)-state><span class=secno>10.2.4.59 </span><dfn>DOCTYPE public identifier (single-quoted) state</dfn></h5>
+ </dl><h5 id=doctype-public-identifier-(single-quoted)-state><span class=secno>11.2.4.59 </span><dfn>DOCTYPE public identifier (single-quoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -75976,7 +77186,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
DOCTYPE token's public identifier.</dd>
- </dl><h5 id=after-doctype-public-identifier-state><span class=secno>10.2.4.60 </span><dfn>After DOCTYPE public identifier state</dfn></h5>
+ </dl><h5 id=after-doctype-public-identifier-state><span class=secno>11.2.4.60 </span><dfn>After DOCTYPE public identifier state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -76012,7 +77222,7 @@
<i>force-quirks flag</i> to <i>on</i>. Switch to the <a href=#bogus-doctype-state>bogus
DOCTYPE state</a>.</dd>
- </dl><h5 id=between-doctype-public-and-system-identifiers-state><span class=secno>10.2.4.61 </span><dfn>Between DOCTYPE public and system identifiers state</dfn></h5>
+ </dl><h5 id=between-doctype-public-and-system-identifiers-state><span class=secno>11.2.4.61 </span><dfn>Between DOCTYPE public and system identifiers state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -76047,7 +77257,7 @@
<i>force-quirks flag</i> to <i>on</i>. Switch to the <a href=#bogus-doctype-state>bogus
DOCTYPE state</a>.</dd>
- </dl><h5 id=after-doctype-system-keyword-state><span class=secno>10.2.4.62 </span><dfn>After DOCTYPE system keyword state</dfn></h5>
+ </dl><h5 id=after-doctype-system-keyword-state><span class=secno>11.2.4.62 </span><dfn>After DOCTYPE system keyword state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -76084,7 +77294,7 @@
<i>force-quirks flag</i> to <i>on</i>. Switch to the <a href=#bogus-doctype-state>bogus
DOCTYPE state</a>.</dd>
- </dl><h5 id=before-doctype-system-identifier-state><span class=secno>10.2.4.63 </span><dfn>Before DOCTYPE system identifier state</dfn></h5>
+ </dl><h5 id=before-doctype-system-identifier-state><span class=secno>11.2.4.63 </span><dfn>Before DOCTYPE system identifier state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -76120,7 +77330,7 @@
<i>force-quirks flag</i> to <i>on</i>. Switch to the <a href=#bogus-doctype-state>bogus
DOCTYPE state</a>.</dd>
- </dl><h5 id=doctype-system-identifier-(double-quoted)-state><span class=secno>10.2.4.64 </span><dfn>DOCTYPE system identifier (double-quoted) state</dfn></h5>
+ </dl><h5 id=doctype-system-identifier-(double-quoted)-state><span class=secno>11.2.4.64 </span><dfn>DOCTYPE system identifier (double-quoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -76146,7 +77356,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
DOCTYPE token's system identifier.</dd>
- </dl><h5 id=doctype-system-identifier-(single-quoted)-state><span class=secno>10.2.4.65 </span><dfn>DOCTYPE system identifier (single-quoted) state</dfn></h5>
+ </dl><h5 id=doctype-system-identifier-(single-quoted)-state><span class=secno>11.2.4.65 </span><dfn>DOCTYPE system identifier (single-quoted) state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -76172,7 +77382,7 @@
<dd>Append the <a href=#current-input-character>current input character</a> to the current
DOCTYPE token's system identifier.</dd>
- </dl><h5 id=after-doctype-system-identifier-state><span class=secno>10.2.4.66 </span><dfn>After DOCTYPE system identifier state</dfn></h5>
+ </dl><h5 id=after-doctype-system-identifier-state><span class=secno>11.2.4.66 </span><dfn>After DOCTYPE system identifier state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -76197,7 +77407,7 @@
state</a>. (This does <em>not</em> set the DOCTYPE token's
<i>force-quirks flag</i> to <i>on</i>.)</dd>
- </dl><h5 id=bogus-doctype-state><span class=secno>10.2.4.67 </span><dfn>Bogus DOCTYPE state</dfn></h5>
+ </dl><h5 id=bogus-doctype-state><span class=secno>11.2.4.67 </span><dfn>Bogus DOCTYPE state</dfn></h5>
<p>Consume the <a href=#next-input-character>next input character</a>:</p>
@@ -76212,7 +77422,7 @@
<dt>Anything else</dt>
<dd>Ignore the character.</dd>
- </dl><h5 id=cdata-section-state><span class=secno>10.2.4.68 </span><dfn>CDATA section state</dfn></h5>
+ </dl><h5 id=cdata-section-state><span class=secno>11.2.4.68 </span><dfn>CDATA section state</dfn></h5>
<p>Consume every character up to the next occurrence of the three
character sequence U+005D RIGHT SQUARE BRACKET U+005D RIGHT SQUARE
@@ -76231,7 +77441,7 @@
- <h5 id=tokenizing-character-references><span class=secno>10.2.4.69 </span>Tokenizing character references</h5>
+ <h5 id=tokenizing-character-references><span class=secno>11.2.4.69 </span>Tokenizing character references</h5>
<p>This section defines how to <dfn id=consume-a-character-reference>consume a character
reference</dfn>. This definition is used when parsing character
@@ -76442,7 +77652,7 @@
thing to do is to close some formatting elements from the middle of
the stack when you hit a limit, or something. -->
- <h4 id=tree-construction><span class=secno>10.2.5 </span><dfn>Tree construction</dfn></h4>
+ <h4 id=tree-construction><span class=secno>11.2.5 </span><dfn>Tree construction</dfn></h4>
<p>The input to the tree construction stage is a sequence of tokens
from the <a href=#tokenization>tokenization</a> stage. The tree construction
@@ -76549,7 +77759,7 @@
constraints.</p>
- <h5 id=creating-and-inserting-elements><span class=secno>10.2.5.1 </span>Creating and inserting elements</h5>
+ <h5 id=creating-and-inserting-elements><span class=secno>11.2.5.1 </span>Creating and inserting elements</h5>
<p>When the steps below require the UA to <dfn id=create-an-element-for-the-token title="create an
element for the token">create an element for a token</dfn> in a
@@ -76729,7 +77939,7 @@
<li><p>Then, switch the <a href=#insertion-mode>insertion mode</a> to "<a href=#parsing-main-incdata title="insertion mode: text">text</a>".</li>
- </ol><h5 id=closing-elements-that-have-implied-end-tags><span class=secno>10.2.5.2 </span>Closing elements that have implied end tags</h5>
+ </ol><h5 id=closing-elements-that-have-implied-end-tags><span class=secno>11.2.5.2 </span>Closing elements that have implied end tags</h5>
<p>When the steps below require the UA to <dfn id=generate-implied-end-tags>generate implied end
tags</dfn>, then, while the <a href=#current-node>current node</a> is a
@@ -76745,7 +77955,7 @@
above steps as if that element was not in the above list.</p>
- <h5 id=foster-parenting><span class=secno>10.2.5.3 </span>Foster parenting</h5>
+ <h5 id=foster-parenting><span class=secno>11.2.5.3 </span>Foster parenting</h5>
<p>Foster parenting happens when content is misnested in tables.</p>
@@ -76783,10 +77993,10 @@
- <h5 id=parsing-main-inhtml><span class=secno>10.2.5.4 </span>The rules for parsing tokens in HTML content</h5>
+ <h5 id=parsing-main-inhtml><span class=secno>11.2.5.4 </span>The rules for parsing tokens in HTML content</h5>
- <h6 id=the-initial-insertion-mode><span class=secno>10.2.5.4.1 </span>The "<dfn title="insertion mode: initial">initial</dfn>" insertion mode</h6>
+ <h6 id=the-initial-insertion-mode><span class=secno>11.2.5.4.1 </span>The "<dfn title="insertion mode: initial">initial</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#the-initial-insertion-mode title="insertion mode: initial">initial</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -76979,7 +78189,7 @@
</dd>
- </dl><h6 id=the-before-html-insertion-mode><span class=secno>10.2.5.4.2 </span>The "<dfn title="insertion mode: before html">before html</dfn>" insertion mode</h6>
+ </dl><h6 id=the-before-html-insertion-mode><span class=secno>11.2.5.4.2 </span>The "<dfn title="insertion mode: before html">before html</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#the-before-html-insertion-mode title="insertion mode: before html">before html</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -77062,7 +78272,7 @@
as described in the next section.</p>
- <h6 id=the-before-head-insertion-mode><span class=secno>10.2.5.4.3 </span>The "<dfn title="insertion mode: before head">before head</dfn>" insertion mode</h6>
+ <h6 id=the-before-head-insertion-mode><span class=secno>11.2.5.4.3 </span>The "<dfn title="insertion mode: before head">before head</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#the-before-head-insertion-mode title="insertion mode: before head">before head</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -77127,7 +78337,7 @@
</dd>
- </dl><h6 id=parsing-main-inhead><span class=secno>10.2.5.4.4 </span>The "<dfn title="insertion mode: in head">in head</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-inhead><span class=secno>11.2.5.4.4 </span>The "<dfn title="insertion mode: in head">in head</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-inhead title="insertion mode: in head">in head</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -77293,7 +78503,7 @@
</dd>
- </dl><h6 id=parsing-main-inheadnoscript><span class=secno>10.2.5.4.5 </span>The "<dfn title="insertion mode: in head noscript">in head noscript</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-inheadnoscript><span class=secno>11.2.5.4.5 </span>The "<dfn title="insertion mode: in head noscript">in head noscript</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-inheadnoscript title="insertion mode: in head noscript">in head noscript</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -77353,7 +78563,7 @@
</dd>
- </dl><h6 id=the-after-head-insertion-mode><span class=secno>10.2.5.4.6 </span>The "<dfn title="insertion mode: after head">after head</dfn>" insertion mode</h6>
+ </dl><h6 id=the-after-head-insertion-mode><span class=secno>11.2.5.4.6 </span>The "<dfn title="insertion mode: after head">after head</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#the-after-head-insertion-mode title="insertion mode: after head">after head</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -77443,7 +78653,7 @@
token.</p>
</dd>
- </dl><h6 id=parsing-main-inbody><span class=secno>10.2.5.4.7 </span>The "<dfn title="insertion mode: in body">in body</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-inbody><span class=secno>11.2.5.4.7 </span>The "<dfn title="insertion mode: in body">in body</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-inbody title="insertion mode: in body">in body</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -78705,7 +79915,7 @@
</ol></dd>
- </dl><h6 id=parsing-main-incdata><span class=secno>10.2.5.4.8 </span>The "<dfn title="insertion mode: text">text</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-incdata><span class=secno>11.2.5.4.8 </span>The "<dfn title="insertion mode: text">text</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-incdata title="insertion mode: text">text</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -78857,7 +80067,7 @@
</dd>
- </dl><h6 id=parsing-main-intable><span class=secno>10.2.5.4.9 </span>The "<dfn title="insertion mode: in table">in table</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-intable><span class=secno>11.2.5.4.9 </span>The "<dfn title="insertion mode: in table">in table</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-intable title="insertion mode: in table">in table</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -79060,7 +80270,7 @@
- <h6 id=parsing-main-intabletext><span class=secno>10.2.5.4.10 </span>The "<dfn title="insertion mode: in table text">in table text</dfn>" insertion mode</h6>
+ <h6 id=parsing-main-intabletext><span class=secno>11.2.5.4.10 </span>The "<dfn title="insertion mode: in table text">in table text</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-intabletext title="insertion mode: in table text">in table text</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -79101,7 +80311,7 @@
</dd>
- </dl><h6 id=parsing-main-incaption><span class=secno>10.2.5.4.11 </span>The "<dfn title="insertion mode: in caption">in caption</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-incaption><span class=secno>11.2.5.4.11 </span>The "<dfn title="insertion mode: in caption">in caption</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-incaption title="insertion mode: in caption">in caption</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -79158,7 +80368,7 @@
mode</a>.</p>
</dd>
- </dl><h6 id=parsing-main-incolgroup><span class=secno>10.2.5.4.12 </span>The "<dfn title="insertion mode: in column group">in column group</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-incolgroup><span class=secno>11.2.5.4.12 </span>The "<dfn title="insertion mode: in column group">in column group</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-incolgroup title="insertion mode: in column group">in column group</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -79244,7 +80454,7 @@
</dd>
- </dl><h6 id=parsing-main-intbody><span class=secno>10.2.5.4.13 </span>The "<dfn title="insertion mode: in table body">in table body</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-intbody><span class=secno>11.2.5.4.13 </span>The "<dfn title="insertion mode: in table body">in table body</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-intbody title="insertion mode: in table body">in table body</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -79332,7 +80542,7 @@
case</a>.</p>
- <h6 id=parsing-main-intr><span class=secno>10.2.5.4.14 </span>The "<dfn title="insertion mode: in row">in row</dfn>" insertion mode</h6>
+ <h6 id=parsing-main-intr><span class=secno>11.2.5.4.14 </span>The "<dfn title="insertion mode: in row">in row</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-intr title="insertion mode: in row">in row</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -79422,7 +80632,7 @@
case</a>.</p>
- <h6 id=parsing-main-intd><span class=secno>10.2.5.4.15 </span>The "<dfn title="insertion mode: in cell">in cell</dfn>" insertion mode</h6>
+ <h6 id=parsing-main-intd><span class=secno>11.2.5.4.15 </span>The "<dfn title="insertion mode: in cell">in cell</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-intd title="insertion mode: in cell">in cell</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -79515,7 +80725,7 @@
cell</a> algorithm is invoked.</p>
- <h6 id=parsing-main-inselect><span class=secno>10.2.5.4.16 </span>The "<dfn title="insertion mode: in select">in select</dfn>" insertion mode</h6>
+ <h6 id=parsing-main-inselect><span class=secno>11.2.5.4.16 </span>The "<dfn title="insertion mode: in select">in select</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-inselect title="insertion mode: in select">in select</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -79665,7 +80875,7 @@
<p><a href=#parse-error>Parse error</a>. Ignore the token.</p>
</dd>
- </dl><h6 id=parsing-main-inselectintable><span class=secno>10.2.5.4.17 </span>The "<dfn title="insertion mode: in select in table">in select in table</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-inselectintable><span class=secno>11.2.5.4.17 </span>The "<dfn title="insertion mode: in select in table">in select in table</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-inselectintable title="insertion mode: in select in table">in select in table</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -79696,7 +80906,7 @@
mode</a>.</p>
</dd>
- </dl><h6 id=parsing-main-afterbody><span class=secno>10.2.5.4.18 </span>The "<dfn title="insertion mode: after body">after body</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-afterbody><span class=secno>11.2.5.4.18 </span>The "<dfn title="insertion mode: after body">after body</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-afterbody title="insertion mode: after body">after body</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -79753,7 +80963,7 @@
</dd>
- </dl><h6 id=parsing-main-inframeset><span class=secno>10.2.5.4.19 </span>The "<dfn title="insertion mode: in frameset">in frameset</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-inframeset><span class=secno>11.2.5.4.19 </span>The "<dfn title="insertion mode: in frameset">in frameset</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-inframeset title="insertion mode: in frameset">in frameset</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -79845,7 +81055,7 @@
<p><a href=#parse-error>Parse error</a>. Ignore the token.</p>
</dd>
- </dl><h6 id=parsing-main-afterframeset><span class=secno>10.2.5.4.20 </span>The "<dfn title="insertion mode: after frameset">after frameset</dfn>" insertion mode</h6>
+ </dl><h6 id=parsing-main-afterframeset><span class=secno>11.2.5.4.20 </span>The "<dfn title="insertion mode: after frameset">after frameset</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#parsing-main-afterframeset title="insertion mode: after frameset">after frameset</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -79898,7 +81108,7 @@
<p><a href=#parse-error>Parse error</a>. Ignore the token.</p>
</dd>
- </dl><h6 id=the-after-after-body-insertion-mode><span class=secno>10.2.5.4.21 </span>The "<dfn title="insertion mode: after after body">after after body</dfn>" insertion mode</h6>
+ </dl><h6 id=the-after-after-body-insertion-mode><span class=secno>11.2.5.4.21 </span>The "<dfn title="insertion mode: after after body">after after body</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#the-after-after-body-insertion-mode title="insertion mode: after after body">after after body</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -79931,7 +81141,7 @@
reprocess the token.</p>
</dd>
- </dl><h6 id=the-after-after-frameset-insertion-mode><span class=secno>10.2.5.4.22 </span>The "<dfn title="insertion mode: after after frameset">after after frameset</dfn>" insertion mode</h6>
+ </dl><h6 id=the-after-after-frameset-insertion-mode><span class=secno>11.2.5.4.22 </span>The "<dfn title="insertion mode: after after frameset">after after frameset</dfn>" insertion mode</h6>
<p>When the user agent is to apply the rules for the "<a href=#the-after-after-frameset-insertion-mode title="insertion mode: after after frameset">after after frameset</a>" <a href=#insertion-mode>insertion mode</a>, the user agent must handle the token as follows:</p>
@@ -79968,7 +81178,7 @@
<p><a href=#parse-error>Parse error</a>. Ignore the token.</p>
</dd>
- </dl><h5 id=parsing-main-inforeign><span class=secno>10.2.5.5 </span>The rules for parsing tokens <dfn title="insertion mode: in foreign content">in foreign content</dfn></h5>
+ </dl><h5 id=parsing-main-inforeign><span class=secno>11.2.5.5 </span>The rules for parsing tokens <dfn title="insertion mode: in foreign content">in foreign content</dfn></h5>
<p>When the user agent is to apply the rules for parsing tokens in foreign content, the user agent must handle the token as follows:</p>
@@ -80190,7 +81400,7 @@
<div class=impl>
- <h4 id=the-end><span class=secno>10.2.6 </span>The end</h4>
+ <h4 id=the-end><span class=secno>11.2.6 </span>The end</h4>
<p>Once the user agent <dfn id=stop-parsing title="stop parsing">stops parsing</dfn>
the document, the user agent must run the following steps:</p>
@@ -80316,7 +81526,7 @@
<div class=impl>
- <h4 id=coercing-an-html-dom-into-an-infoset><span class=secno>10.2.7 </span>Coercing an HTML DOM into an infoset</h4>
+ <h4 id=coercing-an-html-dom-into-an-infoset><span class=secno>11.2.7 </span>Coercing an HTML DOM into an infoset</h4>
<p>When an application uses an <a href=#html-parser>HTML parser</a> in
conjunction with an XML pipeline, it is possible that the
@@ -80405,7 +81615,7 @@
<div class=impl>
- <h4 id=an-introduction-to-error-handling-and-strange-cases-in-the-parser><span class=secno>10.2.8 </span>An introduction to error handling and strange cases in the parser</h4>
+ <h4 id=an-introduction-to-error-handling-and-strange-cases-in-the-parser><span class=secno>11.2.8 </span>An introduction to error handling and strange cases in the parser</h4>
<p><i>This section is non-normative.</i></p>
@@ -80413,7 +81623,7 @@
the <a href=#html-parser>HTML parser</a> handles these cases.</p>
- <h5 id=misnested-tags:-b-i-/b-/i><span class=secno>10.2.8.1 </span>Misnested tags: <b><i></b></i></h5>
+ <h5 id=misnested-tags:-b-i-/b-/i><span class=secno>11.2.8.1 </span>Misnested tags: <b><i></b></i></h5>
<p><i>This section is non-normative.</i></p>
@@ -80447,7 +81657,7 @@
received, and the "5" text node is inserted, the DOM looks as
follows:</p>
- <ul class=domTree><li class=t1><code><a href=#the-html-element-0>html</a></code><ul><li class=t1><code><a href=#the-head-element-0>head</a></code><li class=t1><code><a href=#the-body-element-0>body</a></code><ul><li class=t1><code><a href=#the-p-element>p</a></code><ul><li class=t3><code>#text</code>: <span title="">1</span><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">2</span><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t3><code>#text</code>: <span title="">3</span></ul></ul><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t3><code>#text</code>: <span title="">4</span></ul><li class=t3><code>#text</code>: <span title="">5</span></ul></ul></ul></ul><h5 id=misnested-tags:-b-p-/b-/p><span class=secno>10.2.8.2 </span>Misnested tags: <b><p></b></p></h5>
+ <ul class=domTree><li class=t1><code><a href=#the-html-element-0>html</a></code><ul><li class=t1><code><a href=#the-head-element-0>head</a></code><li class=t1><code><a href=#the-body-element-0>body</a></code><ul><li class=t1><code><a href=#the-p-element>p</a></code><ul><li class=t3><code>#text</code>: <span title="">1</span><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">2</span><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t3><code>#text</code>: <span title="">3</span></ul></ul><li class=t1><code><a href=#the-i-element>i</a></code><ul><li class=t3><code>#text</code>: <span title="">4</span></ul><li class=t3><code>#text</code>: <span title="">5</span></ul></ul></ul></ul><h5 id=misnested-tags:-b-p-/b-/p><span class=secno>11.2.8.2 </span>Misnested tags: <b><p></b></p></h5>
<p><i>This section is non-normative.</i></p>
@@ -80496,7 +81706,7 @@
elements</a>, so that when the "3" is parsed, it is appended to
the <code><a href=#the-p-element>p</a></code> element:</p>
- <ul class=domTree><li class=t1><code><a href=#the-html-element-0>html</a></code><ul><li class=t1><code><a href=#the-head-element-0>head</a></code><li class=t1><code><a href=#the-body-element-0>body</a></code><ul><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">1</span></ul><li class=t1><code><a href=#the-p-element>p</a></code><ul><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">2</span></ul><li class=t3><code>#text</code>: <span title="">3</span></ul></ul></ul></ul><h5 id=unexpected-markup-in-tables><span class=secno>10.2.8.3 </span>Unexpected markup in tables</h5>
+ <ul class=domTree><li class=t1><code><a href=#the-html-element-0>html</a></code><ul><li class=t1><code><a href=#the-head-element-0>head</a></code><li class=t1><code><a href=#the-body-element-0>body</a></code><ul><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">1</span></ul><li class=t1><code><a href=#the-p-element>p</a></code><ul><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">2</span></ul><li class=t3><code>#text</code>: <span title="">3</span></ul></ul></ul></ul><h5 id=unexpected-markup-in-tables><span class=secno>11.2.8.3 </span>Unexpected markup in tables</h5>
<p><i>This section is non-normative.</i></p>
@@ -80595,7 +81805,7 @@
result in yet another <code><a href=#the-b-element>b</a></code> element being created, this
time after the table:</p>
- <ul class=domTree><li class=t1><code><a href=#the-html-element-0>html</a></code><ul><li class=t1><code><a href=#the-head-element-0>head</a></code><li class=t1><code><a href=#the-body-element-0>body</a></code><ul><li class=t1><code><a href=#the-b-element>b</a></code><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">bbb</span></ul><li class=t1><code><a href=#the-table-element>table</a></code><ul><li class=t1><code><a href=#the-tbody-element>tbody</a></code><ul><li class=t1><code><a href=#the-tr-element>tr</a></code><ul><li class=t1><code><a href=#the-td-element>td</a></code><ul><li class=t3><code>#text</code>: <span title="">aaa</span></ul></ul></ul></ul><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">ccc</span></ul></ul></ul></ul><h5 id=scripts-that-modify-the-page-as-it-is-being-parsed><span class=secno>10.2.8.4 </span>Scripts that modify the page as it is bein
g parsed</h5>
+ <ul class=domTree><li class=t1><code><a href=#the-html-element-0>html</a></code><ul><li class=t1><code><a href=#the-head-element-0>head</a></code><li class=t1><code><a href=#the-body-element-0>body</a></code><ul><li class=t1><code><a href=#the-b-element>b</a></code><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">bbb</span></ul><li class=t1><code><a href=#the-table-element>table</a></code><ul><li class=t1><code><a href=#the-tbody-element>tbody</a></code><ul><li class=t1><code><a href=#the-tr-element>tr</a></code><ul><li class=t1><code><a href=#the-td-element>td</a></code><ul><li class=t3><code>#text</code>: <span title="">aaa</span></ul></ul></ul></ul><li class=t1><code><a href=#the-b-element>b</a></code><ul><li class=t3><code>#text</code>: <span title="">ccc</span></ul></ul></ul></ul><h5 id=scripts-that-modify-the-page-as-it-is-being-parsed><span class=secno>11.2.8.4 </span>Scripts that modify the page as it is bein
g parsed</h5>
<p><i>This section is non-normative.</i></p>
@@ -80652,7 +81862,7 @@
<ul class=domTree><li class=t1><code><a href=#the-html-element-0>html</a></code><ul><li class=t1><code><a href=#the-head-element-0>head</a></code><li class=t1><code><a href=#the-body-element-0>body</a></code><ul><li class=t1><code><a href=#script>script</a></code><ul><li class=t3><code>#text</code>: <span title="">alert(document.URL);</span></ul></ul></ul></ul><p>This second alert will say "http://example.com/inner".</p>
- <h5 id=the-execution-of-scripts-that-are-moving-across-multiple-documents><span class=secno>10.2.8.5 </span>The execution of scripts that are moving across multiple documents</h5>
+ <h5 id=the-execution-of-scripts-that-are-moving-across-multiple-documents><span class=secno>11.2.8.5 </span>The execution of scripts that are moving across multiple documents</h5>
<p><i>This section is non-normative.</i></p>
@@ -80668,7 +81878,7 @@
- <h5 id=unclosed-formatting-elements><span class=secno>10.2.8.6 </span>Unclosed formatting elements</h5>
+ <h5 id=unclosed-formatting-elements><span class=secno>11.2.8.6 </span>Unclosed formatting elements</h5>
<p><i>This section is non-normative.</i></p>
@@ -80700,7 +81910,7 @@
- <h3 id=serializing-html-fragments><span class=secno>10.3 </span>Serializing HTML fragments</h3>
+ <h3 id=serializing-html-fragments><span class=secno>11.3 </span>Serializing HTML fragments</h3>
<p>The following steps form the <dfn id=html-fragment-serialization-algorithm>HTML fragment serialization
algorithm</dfn>. The algorithm takes as input a DOM
@@ -80964,7 +82174,7 @@
<li><p>If the algorithm was <em>not</em> invoked in the
<i>attribute mode</i>, replace any occurrences of the "<code title=""><</code>" character by the string "<code title=""><</code>", and any occurrences of the "<code title="">></code>" character by the string "<code title="">></code>".</li>
- </ol><h3 id=parsing-html-fragments><span class=secno>10.4 </span>Parsing HTML fragments</h3>
+ </ol><h3 id=parsing-html-fragments><span class=secno>11.4 </span>Parsing HTML fragments</h3>
<p>The following steps form the <dfn id=html-fragment-parsing-algorithm>HTML fragment parsing
algorithm</dfn>. The algorithm optionally takes as input an
@@ -81138,7 +82348,7 @@
- <h3 id=named-character-references><span class=secno>10.5 </span><dfn>Named character references</dfn></h3>
+ <h3 id=named-character-references><span class=secno>11.5 </span><dfn>Named character references</dfn></h3>
<p>This table lists the character reference names that are supported
by HTML, and the code points to which they refer. It is referenced
@@ -81159,7 +82369,7 @@
- <h2 id=the-xhtml-syntax><span class=secno>11 </span><dfn id=xhtml>The XHTML syntax</dfn></h2>
+ <h2 id=the-xhtml-syntax><span class=secno>12 </span><dfn id=xhtml>The XHTML syntax</dfn></h2>
<p class=note>This section only describes the rules for XML
resources. Rules for <code><a href=#text/html>text/html</a></code> resources are discussed
@@ -81168,7 +82378,7 @@
<div class=impl>
- <h3 id=writing-xhtml-documents><span class=secno>11.1 </span>Writing XHTML documents</h3>
+ <h3 id=writing-xhtml-documents><span class=secno>12.1 </span>Writing XHTML documents</h3>
</div>
@@ -81193,7 +82403,7 @@
<div class=impl>
- <h3 id=parsing-xhtml-documents><span class=secno>11.2 </span>Parsing XHTML documents</h3>
+ <h3 id=parsing-xhtml-documents><span class=secno>12.2 </span>Parsing XHTML documents</h3>
<p>This section describes the relationship between XML and the DOM,
with a particular emphasis on how this interacts with HTML.</p>
@@ -81308,7 +82518,7 @@
- <h3 id=serializing-xhtml-fragments><span class=secno>11.3 </span>Serializing XHTML fragments</h3>
+ <h3 id=serializing-xhtml-fragments><span class=secno>12.3 </span>Serializing XHTML fragments</h3>
<p>The <dfn id=xml-fragment-serialization-algorithm>XML fragment serialization algorithm</dfn> for a
<code><a href=#document>Document</a></code> or <code><a href=#element>Element</a></code> node either returns a
@@ -81405,7 +82615,7 @@
- <h3 id=parsing-xhtml-fragments><span class=secno>11.4 </span>Parsing XHTML fragments</h3>
+ <h3 id=parsing-xhtml-fragments><span class=secno>12.4 </span>Parsing XHTML fragments</h3>
<p>The <dfn id=xml-fragment-parsing-algorithm>XML fragment parsing algorithm</dfn> either returns
a <code><a href=#document>Document</a></code> or raises a <code><a href=#syntax_err>SYNTAX_ERR</a></code>
@@ -81480,7 +82690,7 @@
<div class=impl>
- <h2 id=rendering><span class=secno>12 </span>Rendering</h2>
+ <h2 id=rendering><span class=secno>13 </span>Rendering</h2>
<p><i>User agents are not required to present HTML documents in any
particular way. However, this section provides a set of suggestions
@@ -81496,7 +82706,7 @@
"must".</i></p>
- <h3 id=introduction-10><span class=secno>12.1 </span>Introduction</h3>
+ <h3 id=introduction-11><span class=secno>13.1 </span>Introduction</h3>
<p>In general, user agents are expected to support CSS, and many of
the suggestions in this section are expressed in CSS terms. User
@@ -81532,9 +82742,9 @@
<div class=impl>
- <h3 id=the-css-user-agent-style-sheet-and-presentational-hints><span class=secno>12.2 </span>The CSS user agent style sheet and presentational hints</h3>
+ <h3 id=the-css-user-agent-style-sheet-and-presentational-hints><span class=secno>13.2 </span>The CSS user agent style sheet and presentational hints</h3>
- <h4 id=introduction-11><span class=secno>12.2.1 </span>Introduction</h4>
+ <h4 id=introduction-12><span class=secno>13.2.1 </span>Introduction</h4>
<p>The CSS rules given in these subsections are, except where
otherwise specified, expected to be used as part of the user-agent
@@ -81586,7 +82796,7 @@
<div class=impl>
- <h4 id=display-types><span class=secno>12.2.2 </span>Display types</h4>
+ <h4 id=display-types><span class=secno>13.2.2 </span>Display types</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -81664,7 +82874,7 @@
<div class=impl>
- <h4 id=margins-and-padding><span class=secno>12.2.3 </span>Margins and padding</h4>
+ <h4 id=margins-and-padding><span class=secno>13.2.3 </span>Margins and padding</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -81845,7 +83055,7 @@
<div class=impl>
- <h4 id=alignment><span class=secno>12.2.4 </span>Alignment</h4>
+ <h4 id=alignment><span class=secno>13.2.4 </span>Alignment</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -81966,7 +83176,7 @@
<div class=impl>
- <h4 id=fonts-and-colors><span class=secno>12.2.5 </span>Fonts and colors</h4>
+ <h4 id=fonts-and-colors><span class=secno>13.2.5 </span>Fonts and colors</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -82209,7 +83419,7 @@
<div class=impl>
- <h4 id=punctuation-and-decorations><span class=secno>12.2.6 </span>Punctuation and decorations</h4>
+ <h4 id=punctuation-and-decorations><span class=secno>13.2.6 </span>Punctuation and decorations</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -82385,7 +83595,7 @@
<div class=impl>
- <h4 id=resetting-rules-for-inherited-properties><span class=secno>12.2.7 </span>Resetting rules for inherited properties</h4>
+ <h4 id=resetting-rules-for-inherited-properties><span class=secno>13.2.7 </span>Resetting rules for inherited properties</h4>
<p>The following rules are also expected to be in play, resetting
certain properties to block inheritance by default.</p>
@@ -82422,7 +83632,7 @@
<div class=impl>
- <h4 id=the-hr-element-0><span class=secno>12.2.8 </span>The <code><a href=#the-hr-element>hr</a></code> element</h4>
+ <h4 id=the-hr-element-0><span class=secno>13.2.8 </span>The <code><a href=#the-hr-element>hr</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -82475,7 +83685,7 @@
<div class=impl>
- <h4 id=the-fieldset-element-0><span class=secno>12.2.9 </span>The <code><a href=#the-fieldset-element>fieldset</a></code> element</h4>
+ <h4 id=the-fieldset-element-0><span class=secno>13.2.9 </span>The <code><a href=#the-fieldset-element>fieldset</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -82527,9 +83737,9 @@
<div class=impl>
- <h3 id=replaced-elements><span class=secno>12.3 </span>Replaced elements</h3>
+ <h3 id=replaced-elements><span class=secno>13.3 </span>Replaced elements</h3>
- <h4 id=embedded-content-2><span class=secno>12.3.1 </span>Embedded content</h4>
+ <h4 id=embedded-content-2><span class=secno>13.3.1 </span>Embedded content</h4>
<p>The <code><a href=#the-embed-element>embed</a></code>, <code><a href=#the-iframe-element>iframe</a></code>, and
<code><a href=#video>video</a></code> elements are expected to be treated as replaced
@@ -82606,13 +83816,13 @@
<!--<div data-component="other Hixie drafts (editor: Ian Hickson)">-->
<div class=impl>
- <h4 id=timed-text-tracks-0><span class=secno>12.3.2 </span>Timed text tracks</h4>
+ <h4 id=timed-text-tracks-0><span class=secno>13.3.2 </span>Timed text tracks</h4>
<p class=note>This section is intended to be moved to its own CSS
module once an editor is found to run with it.</p>
- <h5 id=webvtt-cue-text-rendering-rules><span class=secno>12.3.2.1 </span><dfn>WebVTT cue text rendering rules</dfn></h5>
+ <h5 id=webvtt-cue-text-rendering-rules><span class=secno>13.3.2.1 </span><dfn>WebVTT cue text rendering rules</dfn></h5>
<p>The <dfn id=rules-for-updating-the-display-of-webvtt-text-tracks>rules for updating the display of WebVTT text
tracks</dfn> render the <a href=#text-track title="text track">text
@@ -83157,7 +84367,7 @@
<li><p>Return <var title="">output</var>.</li>
- </ol><h5 id=applying-css-properties-to-webvtt-node-objects><span class=secno>12.3.2.2 </span>Applying CSS properties to <a href=#webvtt-node-object title="WebVTT Node Object">WebVTT Node Objects</a></h5>
+ </ol><h5 id=applying-css-properties-to-webvtt-node-objects><span class=secno>13.3.2.2 </span>Applying CSS properties to <a href=#webvtt-node-object title="WebVTT Node Object">WebVTT Node Objects</a></h5>
<p>When following the <a href=#rules-for-updating-the-display-of-webvtt-text-tracks>rules for updating the display of WebVTT
text tracks</a>, user agents must set properties of <a href=#webvtt-node-object title="WebVTT Node Object">WebVTT Node Objects</a> as defined in
@@ -83216,7 +84426,7 @@
values.</p>
- <h5 id=css-extensions><span class=secno>12.3.2.3 </span>CSS extensions</h5>
+ <h5 id=css-extensions><span class=secno>13.3.2.3 </span>CSS extensions</h5>
<p>When a user agent is rendering one or more <a href=#text-track-cue title="text
track cue">text track cues</a> according to the <a href=#webvtt-cue-text-rendering-rules>WebVTT cue
@@ -83248,7 +84458,7 @@
':past' and ':future' pseudo-classes.</p>
- <h6 id="the-'::cue'-pseudo-element"><span class=secno>12.3.2.3.1 </span>The '::cue' pseudo-element</h6>
+ <h6 id="the-'::cue'-pseudo-element"><span class=secno>13.3.2.3.1 </span>The '::cue' pseudo-element</h6>
<p>The '<dfn id=pseudo-cue title=pseudo-cue>::cue</dfn>' pseudo-element (with no
argument) matches any <a href=#list-of-webvtt-node-objects>List of WebVTT Node Objects</a>
@@ -83380,7 +84590,7 @@
the <a href=#webvtt-cue-background-box>WebVTT cue background box</a>.</p>
- <h6 id="the-':past'-and-':future'-pseudo-classes"><span class=secno>12.3.2.3.2 </span>The ':past' and ':future' pseudo-classes</h6>
+ <h6 id="the-':past'-and-':future'-pseudo-classes"><span class=secno>13.3.2.3.2 </span>The ':past' and ':future' pseudo-classes</h6>
<p>The <dfn id=past-pseudo-class title=past-pseudo-class>':past'</dfn> and <dfn id=future-pseudo-class title=future-pseudo-class>':future'</dfn> pseudo-classes only
match <a href=#webvtt-node-object title="WebVTT Node Object">WebVTT Node Objects</a>.</p>
@@ -83419,7 +84629,7 @@
<div class=impl>
- <h4 id=images-0><span class=secno>12.3.3 </span>Images</h4>
+ <h4 id=images-0><span class=secno>13.3.3 </span>Images</h4>
<p>When an <code><a href=#the-img-element>img</a></code> element or an <code><a href=#the-input-element>input</a></code> element
when its <code title=attr-input-type><a href=#attr-input-type>type</a></code> attribute is in
@@ -83479,7 +84689,7 @@
up if the user interacted with the actual image.</p>
<hr><p>All animated images with the same <a href=#absolute-url>absolute URL</a> and
- the same image data are expected to be rendered synchronised to the
+ the same image data are expected to be rendered synchronized to the
same timeline as a group, with the timeline starting at the time of
the most recent addition to the group.</p>
@@ -83501,7 +84711,7 @@
<div class=impl>
- <h4 id=attributes-for-embedded-content-and-images><span class=secno>12.3.4 </span>Attributes for embedded content and images</h4>
+ <h4 id=attributes-for-embedded-content-and-images><span class=secno>13.3.4 </span>Attributes for embedded content and images</h4>
<p>The following CSS rules are expected to apply as
<a href=#presentational-hints>presentational hints</a>:</p>
@@ -83597,7 +84807,7 @@
<div class=impl>
- <h4 id=image-maps-0><span class=secno>12.3.5 </span>Image maps</h4>
+ <h4 id=image-maps-0><span class=secno>13.3.5 </span>Image maps</h4>
<p>Shapes on an <a href=#image-map>image map</a> are expected to act, for the
purpose of the CSS cascade, as elements independent of the original
@@ -83625,7 +84835,7 @@
<div class=impl>
- <h4 id=toolbars-0><span class=secno>12.3.6 </span>Toolbars</h4>
+ <h4 id=toolbars-0><span class=secno>13.3.6 </span>Toolbars</h4>
<p>When a <code><a href=#menus>menu</a></code> element's <code title=attr-menu-type><a href=#attr-menu-type>type</a></code> attribute is in the <a href=#toolbar-state title="toolbar state">toolbar</a> state, the element is
expected to be treated as a replaced element with a height about two
@@ -83641,9 +84851,9 @@
<div class=impl>
- <h3 id=bindings><span class=secno>12.4 </span>Bindings</h3>
+ <h3 id=bindings><span class=secno>13.4 </span>Bindings</h3>
- <h4 id=introduction-12><span class=secno>12.4.1 </span>Introduction</h4>
+ <h4 id=introduction-13><span class=secno>13.4.1 </span>Introduction</h4>
<p>A number of elements have their rendering defined in terms of the
'binding' property. <a href=#refsBECSS>[BECSS]</a></p>
@@ -83666,7 +84876,7 @@
<div class=impl>
- <h4 id=the-button-element-0><span class=secno>12.4.2 </span>The <code><a href=#the-button-element>button</a></code> element</h4>
+ <h4 id=the-button-element-0><span class=secno>13.4.2 </span>The <code><a href=#the-button-element>button</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -83682,7 +84892,7 @@
<div class=impl>
- <h4 id=the-details-element-0><span class=secno>12.4.3 </span>The <code><a href=#the-details-element>details</a></code> element</h4>
+ <h4 id=the-details-element-0><span class=secno>13.4.3 </span>The <code><a href=#the-details-element>details</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -83717,7 +84927,7 @@
<div class=impl>
- <h4 id=the-input-element-as-a-text-entry-widget><span class=secno>12.4.4 </span>The <code><a href=#the-input-element>input</a></code> element as a text entry widget</h4>
+ <h4 id=the-input-element-as-a-text-entry-widget><span class=secno>13.4.4 </span>The <code><a href=#the-input-element>input</a></code> element as a text entry widget</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -83764,7 +84974,7 @@
<div class=impl>
- <h4 id=the-input-element-as-domain-specific-widgets><span class=secno>12.4.5 </span>The <code><a href=#the-input-element>input</a></code> element as domain-specific widgets</h4>
+ <h4 id=the-input-element-as-domain-specific-widgets><span class=secno>13.4.5 </span>The <code><a href=#the-input-element>input</a></code> element as domain-specific widgets</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -83819,7 +85029,7 @@
<div class=impl>
- <h4 id=the-input-element-as-a-range-control><span class=secno>12.4.6 </span>The <code><a href=#the-input-element>input</a></code> element as a range control</h4>
+ <h4 id=the-input-element-as-a-range-control><span class=secno>13.4.6 </span>The <code><a href=#the-input-element>input</a></code> element as a range control</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -83845,7 +85055,7 @@
<div class=impl>
- <h4 id=the-input-element-as-a-color-well><span class=secno>12.4.7 </span>The <code><a href=#the-input-element>input</a></code> element as a color well</h4>
+ <h4 id=the-input-element-as-a-color-well><span class=secno>13.4.7 </span>The <code><a href=#the-input-element>input</a></code> element as a color well</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -83867,7 +85077,7 @@
<div class=impl>
- <h4 id=the-input-element-as-a-checkbox-and-radio-button-widgets><span class=secno>12.4.8 </span>The <code><a href=#the-input-element>input</a></code> element as a checkbox and radio button widgets</h4>
+ <h4 id=the-input-element-as-a-checkbox-and-radio-button-widgets><span class=secno>13.4.8 </span>The <code><a href=#the-input-element>input</a></code> element as a checkbox and radio button widgets</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -83889,7 +85099,7 @@
<div class=impl>
- <h4 id=the-input-element-as-a-file-upload-control><span class=secno>12.4.9 </span>The <code><a href=#the-input-element>input</a></code> element as a file upload control</h4>
+ <h4 id=the-input-element-as-a-file-upload-control><span class=secno>13.4.9 </span>The <code><a href=#the-input-element>input</a></code> element as a file upload control</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -83907,7 +85117,7 @@
<div class=impl>
- <h4 id=the-input-element-as-a-button><span class=secno>12.4.10 </span>The <code><a href=#the-input-element>input</a></code> element as a button</h4>
+ <h4 id=the-input-element-as-a-button><span class=secno>13.4.10 </span>The <code><a href=#the-input-element>input</a></code> element as a button</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -83928,7 +85138,7 @@
<div class=impl>
- <h4 id=the-marquee-element-0><span class=secno>12.4.11 </span>The <code><a href=#the-marquee-element>marquee</a></code> element</h4>
+ <h4 id=the-marquee-element-0><span class=secno>13.4.11 </span>The <code><a href=#the-marquee-element>marquee</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -84092,7 +85302,7 @@
<div class=impl>
- <h4 id=the-meter-element-0><span class=secno>12.4.12 </span>The <code><a href=#the-meter-element>meter</a></code> element</h4>
+ <h4 id=the-meter-element-0><span class=secno>13.4.12 </span>The <code><a href=#the-meter-element>meter</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -84123,7 +85333,7 @@
<div class=impl>
- <h4 id=the-progress-element-0><span class=secno>12.4.13 </span>The <code><a href=#the-progress-element>progress</a></code> element</h4>
+ <h4 id=the-progress-element-0><span class=secno>13.4.13 </span>The <code><a href=#the-progress-element>progress</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -84160,7 +85370,7 @@
<div class=impl>
- <h4 id=the-select-element-0><span class=secno>12.4.14 </span>The <code><a href=#the-select-element>select</a></code> element</h4>
+ <h4 id=the-select-element-0><span class=secno>13.4.14 </span>The <code><a href=#the-select-element>select</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -84228,7 +85438,7 @@
<div class=impl>
- <h4 id=the-textarea-element-0><span class=secno>12.4.15 </span>The <code><a href=#the-textarea-element>textarea</a></code> element</h4>
+ <h4 id=the-textarea-element-0><span class=secno>13.4.15 </span>The <code><a href=#the-textarea-element>textarea</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -84283,7 +85493,7 @@
<div class=impl>
- <h4 id=the-keygen-element-0><span class=secno>12.4.16 </span>The <code><a href=#the-keygen-element>keygen</a></code> element</h4>
+ <h4 id=the-keygen-element-0><span class=secno>13.4.16 </span>The <code><a href=#the-keygen-element>keygen</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -84299,7 +85509,7 @@
<div class=impl>
- <h4 id=the-time-element-0><span class=secno>12.4.17 </span>The <code><a href=#the-time-element>time</a></code> element</h4>
+ <h4 id=the-time-element-0><span class=secno>13.4.17 </span>The <code><a href=#the-time-element>time</a></code> element</h4>
<pre class=css>@namespace url(http://www.w3.org/1999/xhtml);
@@ -84319,7 +85529,7 @@
<div class=impl>
- <h3 id=frames-and-framesets><span class=secno>12.5 </span>Frames and framesets</h3>
+ <h3 id=frames-and-framesets><span class=secno>13.5 </span>Frames and framesets</h3>
<p>When an <code><a href=#the-html-element-0>html</a></code> element's second child element is a
<code><a href=#frameset>frameset</a></code> element, the user agent is expected to render
@@ -84604,9 +85814,9 @@
<div class=impl>
- <h3 id=interactive-media><span class=secno>12.6 </span>Interactive media</h3>
+ <h3 id=interactive-media><span class=secno>13.6 </span>Interactive media</h3>
- <h4 id=links,-forms,-and-navigation><span class=secno>12.6.1 </span>Links, forms, and navigation</h4>
+ <h4 id=links,-forms,-and-navigation><span class=secno>13.6.1 </span>Links, forms, and navigation</h4>
<p>User agents are expected to allow the user to control aspects of
<a href=#hyperlink>hyperlink</a> activation and <a href=#form-submission>form submission</a>,
@@ -84642,7 +85852,7 @@
- <h4 id=the-title-attribute-0><span class=secno>12.6.2 </span>The <code title=attr-title><a href=#the-title-attribute>title</a></code> attribute</h4>
+ <h4 id=the-title-attribute-0><span class=secno>13.6.2 </span>The <code title=attr-title><a href=#the-title-attribute>title</a></code> attribute</h4>
<p>Given an element (e.g. the element designated by the mouse
cursor), if the element, or one of its ancestors, has a <code title=attr-title><a href=#the-title-attribute>title</a></code> attribute, and the nearest such
@@ -84676,7 +85886,7 @@
</div>
- <h4 id=editing-hosts><span class=secno>12.6.3 </span>Editing hosts</h4>
+ <h4 id=editing-hosts><span class=secno>13.6.3 </span>Editing hosts</h4>
<p>The current text editing caret (the one at the <a href=#caret-position>caret
position</a> in a focused <a href=#editing-host>editing host</a>) is expected
@@ -84690,7 +85900,7 @@
- <h4 id=text-rendered-in-native-user-interfaces><span class=secno>12.6.4 </span>Text rendered in native user interfaces</h4>
+ <h4 id=text-rendered-in-native-user-interfaces><span class=secno>13.6.4 </span>Text rendered in native user interfaces</h4>
<p>User agents are expected to honor the Unicode semantics of text
that is exposed in user interfaces, for example supporting the
@@ -84786,7 +85996,7 @@
- <h3 id=print-media><span class=secno>12.7 </span>Print media</h3>
+ <h3 id=print-media><span class=secno>13.7 </span>Print media</h3>
<p>User agents are expected to allow the user to request the
opportunity to <dfn id=obtain-a-physical-form>obtain a physical form</dfn> (or a
@@ -84806,9 +86016,9 @@
- <h2 id=obsolete><span class=secno>13 </span>Obsolete features</h2>
+ <h2 id=obsolete><span class=secno>14 </span>Obsolete features</h2>
- <h3 id=obsolete-but-conforming-features><span class=secno>13.1 </span>Obsolete but conforming features</h3>
+ <h3 id=obsolete-but-conforming-features><span class=secno>14.1 </span>Obsolete but conforming features</h3>
<p>Features listed in this section will trigger warnings in
conformance checkers.</p>
@@ -84855,7 +86065,7 @@
<div class=impl>
- <h4 id=warnings-for-obsolete-but-conforming-features><span class=secno>13.1.1 </span>Warnings for obsolete but conforming features</h4>
+ <h4 id=warnings-for-obsolete-but-conforming-features><span class=secno>14.1.1 </span>Warnings for obsolete but conforming features</h4>
<p>To ease the transition from HTML4 Transitional documents to the
language defined in <em>this</em> specification, and to discourage
@@ -84904,7 +86114,7 @@
</div>
- <h3 id=non-conforming-features><span class=secno>13.2 </span>Non-conforming features</h3>
+ <h3 id=non-conforming-features><span class=secno>14.2 </span>Non-conforming features</h3>
<p>Elements in the following list are entirely obsolete, and must
not be used by authors:</p>
@@ -85174,9 +86384,9 @@
</dl><div class=impl>
- <h3 id=requirements-for-implementations><span class=secno>13.3 </span>Requirements for implementations</h3>
+ <h3 id=requirements-for-implementations><span class=secno>14.3 </span>Requirements for implementations</h3>
- <h4 id=the-applet-element><span class=secno>13.3.1 </span>The <dfn><code>applet</code></dfn> element</h4>
+ <h4 id=the-applet-element><span class=secno>14.3.1 </span>The <dfn><code>applet</code></dfn> element</h4>
<p>The <code><a href=#the-applet-element>applet</a></code> element is a Java-specific variant of the
<code><a href=#the-embed-element>embed</a></code> element. The <code><a href=#the-applet-element>applet</a></code> element is now
@@ -85252,7 +86462,7 @@
<a href=#url>URL</a>.</p>
- <h4 id=the-marquee-element><span class=secno>13.3.2 </span>The <dfn><code>marquee</code></dfn> element</h4>
+ <h4 id=the-marquee-element><span class=secno>14.3.2 </span>The <dfn><code>marquee</code></dfn> element</h4>
<p>The <code><a href=#the-marquee-element>marquee</a></code> element is a presentational element that
animates content. CSS transitions and animations are a more
@@ -85429,7 +86639,7 @@
attribute.</p>
- <h4 id=frames><span class=secno>13.3.3 </span>Frames</h4>
+ <h4 id=frames><span class=secno>14.3.3 </span>Frames</h4>
<p>The <dfn id=frameset><code>frameset</code></dfn> element acts as <a href=#the-body-element>the
body element</a> in documents that use frames.</p>
@@ -85608,7 +86818,7 @@
- <h4 id=other-elements,-attributes-and-apis><span class=secno>13.3.4 </span>Other elements, attributes and APIs</h4> <!-- alphabetical by name and attribute -->
+ <h4 id=other-elements,-attributes-and-apis><span class=secno>14.3.4 </span>Other elements, attributes and APIs</h4> <!-- alphabetical by name and attribute -->
<p>User agents must treat <code><a href=#acronym>acronym</a></code> elements in a manner
equivalent to <code><a href=#the-abbr-element>abbr</a></code> elements in terms of semantics and
@@ -86324,13 +87534,13 @@
- <h2 id=iana><span class=secno>14 </span>IANA considerations</h2>
+ <h2 id=iana><span class=secno>15 </span>IANA considerations</h2>
<!-- http://www.w3.org/2002/06/registering-mediatype.html -->
- <h3 id=text/html><span class=secno>14.1 </span><dfn><code>text/html</code></dfn></h3>
+ <h3 id=text/html><span class=secno>15.1 </span><dfn><code>text/html</code></dfn></h3>
<p>This registration is for community review and will be submitted
to the IESG for review, approval, and registration with IANA.</p>
@@ -86457,7 +87667,7 @@
refer to <a href=#the-indicated-part-of-the-document>the indicated part of the document</a>.</p>
- <h3 id=text/html-sandboxed><span class=secno>14.2 </span><dfn><code>text/html-sandboxed</code></dfn></h3>
+ <h3 id=text/html-sandboxed><span class=secno>15.2 </span><dfn><code>text/html-sandboxed</code></dfn></h3>
<p>This registration is for community review and will be submitted
to the IESG for review, approval, and registration with IANA.</p>
@@ -86539,7 +87749,7 @@
document</a>.</p>
- <h3 id=application/xhtml+xml><span class=secno>14.3 </span><dfn><code>application/xhtml+xml</code></dfn></h3>
+ <h3 id=application/xhtml+xml><span class=secno>15.3 </span><dfn><code>application/xhtml+xml</code></dfn></h3>
<p>This registration is for community review and will be submitted
to the IESG for review, approval, and registration with IANA.</p>
@@ -86604,7 +87814,7 @@
type</a>. <a href=#refsRFC3023>[RFC3023]</a></p>
- <h3 id=text/cache-manifest><span class=secno>14.4 </span><dfn><code>text/cache-manifest</code></dfn></h3>
+ <h3 id=text/cache-manifest><span class=secno>15.4 </span><dfn><code>text/cache-manifest</code></dfn></h3>
<p>This registration is for community review and will be submitted
to the IESG for review, approval, and registration with IANA.</p>
@@ -86675,7 +87885,7 @@
<!--PING-->
- <h3 id=text/ping><span class=secno>14.5 </span><dfn><code>text/ping</code></dfn></h3>
+ <h3 id=text/ping><span class=secno>15.5 </span><dfn><code>text/ping</code></dfn></h3>
<p>This registration is for community review and will be submitted
to the IESG for review, approval, and registration with IANA.</p>
@@ -86740,7 +87950,7 @@
<!--TT-->
<div data-component="other Hixie drafts (editor: Ian Hickson)">
- <h3 id=text/vtt><span class=secno>14.6 </span><dfn><code>text/vtt</code></dfn></h3>
+ <h3 id=text/vtt><span class=secno>15.6 </span><dfn><code>text/vtt</code></dfn></h3>
<p>This registration is for community review and will be submitted
to the IESG for review, approval, and registration with IANA.</p>
@@ -86821,7 +88031,7 @@
<!--MD-->
- <h3 id=application/microdata+json><span class=secno>14.7 </span><dfn><code>application/microdata+json</code></dfn></h3>
+ <h3 id=application/microdata+json><span class=secno>15.7 </span><dfn><code>application/microdata+json</code></dfn></h3>
<p>This registration is for community review and will be submitted
@@ -86890,7 +88100,7 @@
<!--MD-->
<!--PING-->
- <h3 id=ping-from><span class=secno>14.8 </span><dfn title=http-ping-from><code>Ping-From</code></dfn></h3>
+ <h3 id=ping-from><span class=secno>15.8 </span><dfn title=http-ping-from><code>Ping-From</code></dfn></h3>
<p>This section describes a header field for registration in the
Permanent Message Header Field Registry. <a href=#refsRFC3864>[RFC3864]</a></p>
@@ -86909,7 +88119,7 @@
</dd>
<dt>Related information</dt>
<dd>None.</dd>
- </dl><h3 id=ping-to><span class=secno>14.9 </span><dfn title=http-ping-to><code>Ping-To</code></dfn></h3>
+ </dl><h3 id=ping-to><span class=secno>15.9 </span><dfn title=http-ping-to><code>Ping-To</code></dfn></h3>
<p>This section describes a header field for registration in the
Permanent Message Header Field Registry. <a href=#refsRFC3864>[RFC3864]</a></p>
@@ -89971,6 +91181,9 @@
<dd><cite><a href=http://tools.ietf.org/html/draft-holsten-about-uri-scheme>The
'about' URI scheme</a></cite>, J. Holsten, L. Hunt. IETF.</dd>
+ <dt id=refsAES128CTR>[AES128CTR]</dt>
+ <dd><cite><a href=http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf>Advanced Encryption Standard (AES)</a></cite>. NIST.</dd>
+
<dt id=refsARIA>[ARIA]</dt>
<dd><cite><a href=http://www.w3.org/WAI/PF/aria/>Accessible Rich
Internet Applications (WAI-ARIA)</a></cite>, J. Craig, M. Cooper, L. Pappas,
@@ -90178,6 +91391,9 @@
<dd>(Non-normative) <cite><a href=http://microformats.org/wiki/hatom>hAtom</a></cite>, D
Janes. Microformats.</dd>
+ <dt id=refsHMAC>[HMAC]</dt>
+ <dd><cite><a href=http://csrc.nist.gov/publications/fips/fips198/fips-198a.pdf>The Keyed-Hash Message Authentication Code (HMAC)</a></cite>. NIST.</dd>
+
<dt id=refsHTMLDIFF>[HTMLDIFF]</dt>
<!--
<dd>(Non-normative) <cite><a
@@ -90200,6 +91416,9 @@
<dd><cite><a href=http://www.iana.org/assignments/message-headers/perm-headers.html>Permanent
Message Header Field Names</a></cite>. IANA.</dd>
+ <dt id=refsICE>[ICE]</dt>
+ <dd><cite><a href=http://tools.ietf.org/html/rfc5245>Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal for Offer/Answer Protocols</a></cite>, J. Rosenberg. IETF.</dd>
+
<dt id=refsISO8601>[ISO8601]</dt>
<dd><cite><a href="http://isotc.iso.org/livelink/livelink/4021199/ISO_8601_2004_E.zip?func=doc.Fetch&nodeid=4021199">ISO8601: Data elements and interchange formats — Information interchange — Representation of dates and times</a></cite>. ISO.</dd>
@@ -90449,11 +91668,23 @@
Compression Scheme For Unicode</a></cite>, M. Wolf, K. Whistler,
C. Wicksteed, M. Davis, A. Freytag, M. Scherer. Unicode Consortium.</dd>
+ <dt id=refsSDP>[SDP]</dt>
+ <dd><cite><a href=http://tools.ietf.org/html/rfc4566>SDP: Session Description Protocol</a></cite>, M. Handley, V. Jacobson, C. Perkins. IETF.</dd>
+
+ <dt id=refsSDPLABEL>[SDPLABEL]</dt>
+ <dd><cite><a href=http://tools.ietf.org/html/rfc4574>The Session Description Protocol (SDP) Label Attribute</a></cite>, O. Levin, G. Camarillo. IETF.</dd>
+
+ <dt id=refsSDPOFFERANSWER>[SDPOFFERANSWER]</dt>
+ <dd><cite><a href=http://tools.ietf.org/html/rfc3264>An Offer/Answer Model with the Session Description Protocol (SDP)</a></cite>, J. Rosenberg, H. Schulzrinne. IETF.</dd>
+
<dt id=refsSELECTORS>[SELECTORS]</dt>
<dd><cite><a href=http://www.w3.org/TR/css3-selectors>Selectors</a></cite>,
T. Çelik, E. Etemad, D. Glazman, I. Hickson, P. Linss,
J. Williams. W3C.</dd>
+ <dt id=refsSHA1>[SHA1]</dt>
+ <dd><cite><a href=http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf>Secure Hash Standard</a></cite>. NIST.</dd>
+
<dt id=refsSHIFTJIS>[SHIFTJIS]</dt>
<dd><cite>JIS X0208: 7-bit and 8-bit double byte coded KANJI sets
for information interchange</cite>. Japanese Industrial Standards Committee.</dd>
@@ -90464,6 +91695,9 @@
and management — Part 2-1: Colour management — Default RGB colour
space — sRGB</a></cite>. IEC.</dd>
+ <dt id=refsSTUN>[STUN]</dt>
+ <dd><cite><a href=http://tools.ietf.org/html/rfc5389>Session Traversal Utilities for NAT (STUN)</a></cite>, J. Rosenberg, R. Mahy, P. Matthews, D. Wing. IETF.</dd>
+
<dt id=refsSVG>[SVG]</dt>
<dd><cite><a href=http://www.w3.org/TR/SVGTiny12/>Scalable Vector
Graphics (SVG) Tiny 1.2 Specification</a></cite>, O. Andersson,
@@ -90478,6 +91712,9 @@
Ministry of Industry, Royal Thai Government. ISBN
974-606-153-4.</dd>
+ <dt id=refsTURN>[TURN]</dt>
+ <dd><cite><a href=http://tools.ietf.org/html/rfc5766>Traversal Using Relays around NAT (TURN): Relay Extensions to Session Traversal Utilities for NAT (STUN)</a></cite>, R. Mahy, P. Matthews, J. Rosenberg. IETF.</dd>
+
<dt id=refsUAAG>[UAAG]</dt>
<dd>(Non-normative) <cite><a href=http://www.w3.org/TR/UAAG20/>Web Content Accessibility
Guidelines (UAAG) 2.0</a></cite>, J. Allan, K. Ford, J. Richards,
Modified: source
===================================================================
--- source 2011-03-05 00:12:36 UTC (rev 5944)
+++ source 2011-03-14 10:19:45 UTC (rev 5945)
@@ -74,7 +74,7 @@
of HTML5) currently consist of:</p>
<ul class="brief">
- <li>The <code>device</code> element.</li> <!--DEVICE-->
+ <li>The <code>PeerConnection</code> API and related video-conferencing features.</li> <!--DEVICE-->
<li>The <code title="attr-hyperlink-ping">ping</code> attribute and related <span>hyperlink auditing</span> features.</li> <!--PING-->
<li>The <span>WebVTT</span> format and some <span>text track</span> API features.</li> <!--TT--> <!--TTVTT-->
<li>Rules for <a href="#atom">converting HTML to Atom</a>.</li> <!--MD-->
@@ -26631,7 +26631,7 @@
zero or more <code>track</code> elements, then
<!--KEEP-START w3c-html--><!--TT-->
<span>transparent</span>, but with no <span>media element</span> descendants.</dd>
- <dd>If the element does not have a <code title="attr-media-src">src</code> attribute: one or more <code>source</code> elements, then
+ <dd>If the element does not have a <code title="attr-media-src">src</code> attribute: zero or more <code>source</code> elements, then
<!--KEEP-END w3c-html--><!--TT-->
zero or more <code>track</code> elements, then
<!--KEEP-START w3c-html--><!--TT-->
@@ -29593,8 +29593,8 @@
<span>queue a task</span> to <span>fire a simple event</span>
named <code title="event-media-playing">playing</code>.</p>
- <p class="note">User agents are not required to autoplay, and it
- is suggested that user agents honor user preferences on the
+ <p class="note">User agents do not need to support autoplay,
+ and it is suggested that user agents honor user preferences on the
matter. Authors are urged to use the <code
title="attr-media-autoplay">autoplay</code> attribute rather than
using script to force the video to play, so as to allow the user
@@ -57097,256 +57097,8 @@
</div>
-<!--END w3c-html--><!--DEVICE-->
-<div data-component="other Hixie drafts (editor: Ian Hickson)">
-<!--START html-device-->
- <h4 id="devices">The <dfn><code>device</code></dfn> element</h4>
- <dl class="element">
- <dt>Categories</dt>
- <dd><span>Flow content</span>.</dd>
- <dd><span>Phrasing content</span>.</dd>
- <dd><span>Interactive content</span>.</dd>
- <dt>Contexts in which this element can be used:</dt>
- <dd>Where <span>phrasing content</span> is expected.</dd>
- <dt>Content model:</dt>
- <dd>Empty.</dd>
- <dt>Content attributes:</dt>
- <dd><span>Global attributes</span></dd>
- <dd><code title="attr-device-type">type</code></dd>
- <dt>DOM interface:</dt>
- <dd>
-<pre class="idl">interface <dfn>HTMLDeviceElement</dfn> : <span>HTMLElement</span> {
- attribute DOMString <span title="dom-device-type">type</span>;
- readonly attribute any <span title="dom-device-data">data</span>;
-};</pre>
- </dl>
-
- <p>The <code>device</code> element represents a device selector, to
- allow the user to give the page access to a device, for example a
- video camera.</p>
-
- <p>The <dfn title="attr-device-type"><code>type</code></dfn>
- attribute allows the author to specify which kind of device the page
- would like access to. The attribute is an <span>enumerated
- attribute</span> with the keywords given in the first column of the
- following table, and their corresponding states given in the cell in
- second column of the same row.</p>
-
- <p class="XXX">RS232 and USB are only included below to give an idea
- of where we could go with this. <strong>Should we instead just make
- this only useful for audiovisual streams?</strong> Unless there are
- compelling reasons, we probably should not be this generic. So far,
- the reasons for RS232 aren't that compelling. For USB, slightly more
- so.</p>
-
- <table>
- <thead>
- <tr>
- <th>Keyword
- <th>State
- <th>Device description
- <th>Examples
- <tbody>
- <tr>
- <td><dfn title="attr-device-type-keyword-media"><code>media</code></dfn>
- <td><span title="attr-device-type-media">Media</span>
- <td>Stream of audio and/or video data.
- <td>A webcam.
- <tr>
- <td><dfn title="attr-device-type-keyword-fs"><code>fs</code></dfn>
- <td><span title="attr-device-type-fs">File system</span>
- <td>File system.
- <td>A USB-connected media player.
- <tr>
- <td><dfn title="attr-device-type-keyword-rs232"><code>rs232</code></dfn>
- <td><span title="attr-device-type-rs232">RS232</span>
- <td>RS232 device.
- <td>A serial port.
- <tr>
- <td><dfn title="attr-device-type-keyword-usb"><code>usb</code></dfn>
- <td><span title="attr-device-type-usb">USB</span>
- <td>USB device.
- <td>A scanner, a music player, a disk jockey, a fish tank.
- </table>
-
- <p class="XXX">processing model: 'change' event fires once user
- selects a new device; .data is set to new Stream, LocalFS, USB, or
- RS232 object as appropriate.</p>
-
- <div class="example">
-
- <pre><p>To start chatting, select a video camera: <device type=media onchange="update(this.data)"></p>
-<video autoplay></video>
-<script>
- function update(stream) {
- document.getElementsByTagName('video')[0].src = stream.url;
- }
-</script></pre>
-
- </div>
-
- <p class="XXX">The <code>device</code> element is intended to be a
- void element, but the parser spec hasn't yet been updated. This
- section of the spec is very much awaiting implementation
- experience.</p>
-
-
- <h5>Stream API</h5>
-
- <p>The <code>Stream</code> interface is used to represent
- streams.</p>
-
- <pre class="idl">interface <dfn>Stream</dfn> {
- readonly attribute DOMString <span title="dom-stream-url">url</span>;
- <span>StreamRecorder</span> <span title="dom-stream-record">record</span>();
-};</pre>
-
- <p>The <dfn title="dom-stream-url"><code>url</code></dfn> attribute
- must return a <span title="fileURN">File URN</span> representing the
- stream. <a href="#refsFILEAPI">[FILEAPI]</a></p>
-
- <p>For audio and video streams, the stream must be in a format
- supported by the user agent for use in <code>audio</code> and
- <code>video</code> elements.</p>
-
- <p class="XXX">This will be pinned down to a specific codec.</p>
-
- <p>When the <dfn
- title="dom-stream-record"><code>record()</code></dfn> method is
- invoked, the user agent must return a new
- <code>StreamRecorder</code> object associated with the stream.</p>
-
- <pre class="idl">interface <dfn>StreamRecorder</dfn> {
- <span>File</span> <span title="dom-StreamRecorder-stop">stop</span>();
-};</pre>
-
- <p>The <dfn
- title="dom-StreamRecorder-stop"><code>stop()</code></dfn> method
- must return a new <code>File</code> object representing the data
- that was streamed between the creation of the
- <code>StreamRecorder</code> object and the invocation of the <code
- title="dom-StreamRecorder-stop">stop()</code> method. <a
- href="#refsFILEAPI">[FILEAPI]</a></p>
-
- <p>For audio and video streams, the file must be in a format
- supported by the user agent for use in <code>audio</code> and
- <code>video</code> elements.</p>
-
- <p class="XXX">This again will be pinned down to a specific codec.</p>
-
-
- <h5>Peer-to-peer connections</h5>
-
- <p class="XXX">This section will be moved to a more appropriate
- location in due course; it is here currently to keep it near the
- <code>device</code> element to allow reviewers to look at it.</p>
-
- <pre class="idl">[Constructor(in DOMString serverConfiguration)]
-interface <dfn>ConnectionPeer</dfn> {
- void sendText(in DOMString text, in optional boolean unimportant); // if second arg is true, then use unreliable low-latency transport (UDP-like), otherwise guarantee delivery (TCP-like)
- attribute <span>Function</span> ontext; // receiving
-
- void sendBitmap(in HTMLImageElement image);
- attribute <span>Function</span> onbitmap; // receiving
-
- void sendFile(in File file);
- attribute <span>Function</span> onfile; // receiving
-
- void addStream(in Stream stream);
- void removeStream(in Stream stream);
- readonly attribute Stream[] localStreams;
- readonly attribute Stream[] remoteStreams;
- attribute <span>Function</span> onstream; // receiving
-
- void <span title="dom-ConnectionPeer-getLocalConfiguration">getLocalConfiguration</span>(in <span>ConnectionPeerConfigurationCallback</span> callback); // maybe this should be in the constructor, or be an event
- void <span title="dom-ConnectionPeer-addRemoteConfiguration">addRemoteConfiguration</span>(in DOMString configuration, in optional DOMString remoteOrigin); // remote origin is assumed to be same-origin if not specified. If specified, has to match remote origin (checked in handshake). Should support leading "*." to mean "any subdomain of".
- void close(); // disconnects and stops listening
-
- attribute <span>Function</span> onconnect;
- attribute <span>Function</span> onerror;
- attribute <span>Function</span> ondisconnect;
-};
-<span>ConnectionPeer</span> implements <span>EventTarget</span>;
-
-[Callback=FunctionOnly, NoInterfaceObject]
-interface <dfn>ConnectionPeerConfigurationCallback</dfn> {
- void <span title="dom-ConnectionPeerConfigurationCallback-handleEvent">handleEvent</span>(in <span>ConnectionPeer</span> server, in DOMString configuration);
-};</pre>
-
- <p class="XXX">...</p>
-
- <div class="XXX">
-
- <p>This relies on some currently hypothetical other standard to
- define:</p>
-
- <ul>
- <li>The format of server configuration strings.
- <li>The format of client configuration strings.
- <li>The protocols that clients use to talk to third-party servers mentioned in the server configuration strings.
- <li>The protocols that clients use to talk to each other.
- </ul>
-
- </div>
-
- <div class="example">
-
- <p>When two peers decide they are going to set up a connection to
- each other, they both go through these steps. The serverConfig
- comes from a third-party server they can use to get things like
- their public IP address or to set up NAT traversal. They also have
- to send their respective configuration to each other using the same
- out-of-band mechanism they used to establish that they were going
- to communicate in the first place.</p>
-
- <pre>var serverConfig = ...; // configuration string obtained from server
-// contains details such as the IP address of a server that can speak some
-// protocol to help the client determine its public IP address, route packets
-// if necessary, etc.
-
-var local = new ConnectionPeer(serverConfig);
-local.getLocalConfiguration(function (configuration) {
- if (configuration != '') {
- ...; // send configuration to other peer using out-of-band mechanism
- } else {
- // we've exhausted our options; wait for connection
- }
-});
-
-function ... (configuration) {
- // called whenever we get configuration information out-of-band
- local.addRemoteConfiguration(configuration);
-}
-
-local.onconnect = function (event) {
- // we are connected!
- local.sendText('Hello');
- local.addStream(...); // send video
- local.onstream = function (event) {
- // receive video
- // (videoElement is some <video> element)
- if (local.remoteStreams.length > 0)
- videoElement.src = local.remoteStreams[0].url;
- };
-};</pre>
-
- </div>
-
- <p class="warning">To prevent network sniffing from allowing a
- fourth party to establish a connection to a peer using the
- information sent out-of-band to the other peer and thus spoofing the
- client, the configuration information should always be transmitted
- using an encrypted connection.</p>
-
-<!--END html-device-->
-</div>
-<!--START w3c-html--><!--DEVICE-->
-
-
-
-
<h3 id="links">Links</h3>
<h4>Introduction</h4>
@@ -75962,7 +75714,6 @@
-
<h2 id="editing"><dfn>User interaction</dfn></h2>
@@ -81193,9 +80944,1711 @@
"justifycenter", "justifyright", "justifyfull", "indent", "outdent"
-->
+<!--END w3c-html-->
+<div data-component="other Hixie drafts (editor: Ian Hickson)">
-<!--END html--><!--END dev-html--><!--END w3c-html-->
+ <h2>Video conferencing and peer-to-peer communication</h2>
+ <h3>Introduction</h3>
+
+ <!--END dev-html--><p><i>This section is non-normative.</i></p><!--START dev-html-->
+
+ <p>There are a number of facets to video-conferencing in HTML:</p>
+
+ <ul>
+
+ <li>Getting a multimedia stream (video, audio, or both) from local
+ devices (video cameras, microphones, Web cams) or from prerecorded
+ files provided by the user.</li>
+
+ <li>Recording such streams locally.</li>
+
+ <li>Connecting to remote peers using NAT-traversal technologies
+ such as ICE, STUN, and TURN.</li>
+
+ <li>Sending the locally-produced streams to remote peers and
+ receiving streams from remote peers.</li>
+
+ <li>Displaying such streams (both the locally-produced ones and the
+ remotely-obtained ones) locally using the <code>video</code> or
+ <code>audio</code> elements.</li>
+
+ <li>Sending arbitrary data to remote peers.</li>
+
+ </ul>
+
+ <p>This section defines the APIs used for these features.</p>
+
+
+ <h4>Obtaining local multimedia content</h4>
+
+ <pre class="idl">[Supplemental, NoInterfaceObject]
+interface <dfn>NavigatorUserMedia</dfn> {
+ void <span title="dom-navigator-getUserMedia">getUserMedia</span>(in DOMString options, in <span>NavigatorUserMediaSuccessCallback</span> successCallback, in optional <span>NavigatorUserMediaErrorCallback</span> errorCallback);
+};
+<span>Navigator</span> implements <span>NavigatorUserMedia</span>;
+
+[Callback=FunctionOnly, NoInterfaceObject]
+interface <dfn>NavigatorUserMediaSuccessCallback</dfn> {
+ void <span title="dom-NavigatorUserMediaSuccessCallback-handleEvent">handleEvent</span>(in <span>GeneratedStream</span> stream);
+};
+
+[NoInterfaceObject]<!-- this is based on PositionError in geolocation -->
+interface <dfn>NavigatorUserMediaError</dfn> {
+ const unsigned short <span title="dom-NavigatorUserMediaError-PERMISSION_DENIED">PERMISSION_DENIED</span> = 1;<!--
+ const unsigned short <span title="dom-NavigatorUserMediaError-UNAVAILABLE">UNAVAILABLE</span> = 2;
+ const unsigned short <span title="dom-NavigatorUserMediaError-TIMEOUT">TIMEOUT</span> = 3;-->
+ readonly attribute unsigned short <span title="dom-NavigatorUserMediaError-code">code</span>;<!--
+ readonly attribute DOMString <span title="dom-NavigatorUserMediaError-message">message</span>;-->
+};
+
+[Callback=FunctionOnly, NoInterfaceObject]
+interface <dfn>NavigatorUserMediaErrorCallback</dfn> {
+ void <span title="dom-NavigatorUserMediaSuccessCallback-handleEvent">handleEvent</span>(in <span>NavigatorUserMediaError</span> error);
+};</pre>
+
+ <dl class="domintro">
+
+ <dt><var title="">window</var> . <code title="dom-navigator">navigator</code> . <code title="dom-navigator-getUserMedia">getUserMedia</code>(<var title="">options</var>, <var title="">successCallback</var> [, <var title="">errorCallback</var> ] )</dt>
+
+ <dd>
+
+ <p>Prompts the user for permission to use their Web cam or other
+ video or audio input.</p>
+
+ <p>The <var title="">options</var> argument is a string of
+ comma-separated values from the following list:</p>
+
+ <dl>
+
+
+ <dt>"<code title="">audio</code>"</dt>
+
+ <dd>The provided media needs to include audio data.</dd>
+
+
+ <dt>"<code title="">video</code>"</dt>
+
+ <dd>The provided media needs to include video data.</dd>
+
+
+ </dl>
+
+ <p>If the user accepts, the <var title="">successCallback</var> is
+ invoked, with a suitable <code>GeneratedStream</code> object as
+ its argument.</p>
+
+ <p>If the user declines, the <var title="">errorCallback</var> (if
+ any) is invoked.</p>
+
+ </dd>
+
+
+ <dt><var title="">error</var> . <code title="dom-NavigatorUserMediaError-code">code</code></dt>
+
+ <dd>
+
+ <p>Returns the current error's error code. At this time, this will
+ always be 1, for which the constant <code
+ title="dom-NavigatorUserMediaError-PERMISSION_DENIED">PERMISSION_DENIED</code>
+ is defined.</p>
+
+ </dd>
+
+ </dl>
+
+ <div class="impl">
+
+ <p>When the <dfn
+ title="dom-navigator-getUserMedia"><code>getUserMedia()</code></dfn>
+ method is called, the user agent must run the following steps:</p>
+
+ <ol>
+
+ <li><p>Let <var title="">options</var> be the method's first
+ argument.</p></li>
+
+ <li><p>Let <var title="">successCallback</var> be the callback
+ indicated by the method's second argument.</p></li>
+
+ <li><p>Let <var title="">errorCallback</var> be the callback
+ indicated by the method's third argument, if any, or null
+ otherwise.</p></li>
+
+ <li><p>If <var title="">successCallback</var> is null, abort these
+ steps.</p></li> <!-- we could throw an exception instead (that's
+ why the method doesn't return until later: so that we can add an
+ exception here, or for /options/ below, without changing the
+ algorithm) -->
+
+ <li><p><span title="split a string on spaces">Split <var
+ title="">options</var> on spaces</span> to obtain <var
+ title="">list of options</var>.</p></li>
+
+ <li><p>If one of the tokens in <var title="">list of options</var>
+ is a <span>case-sensitive</span> match for the string "<code
+ title="">audio</code>", let <var title="">audio</var> be true.
+ Otherwise, let it be false.</p></li>
+
+ <li><p>If one of the tokens in <var title="">list of options</var>
+ is a <span>case-sensitive</span> match for the string "<code
+ title="">video</code>", let <var title="">video</var> be true.
+ Otherwise, let it be false.</p></li>
+
+ <!-- any error handling for /options/ should be done here (that's
+ why the method doesn't return until the next step: so we can add
+ exception throwing here) -->
+
+ <li><p>Return, and run the remaining steps asynchronously.</p></li>
+
+ <li><p>Optionally, e.g. based on a previously-established user
+ preference, for security reasons, or due to platform limitations,
+ jump to the step labeled <i>failure</i> below.</p></li>
+
+ <li>
+
+ <p>Prompt the user in a user-agent-specific manner for permission
+ to provide the <span>entry script</span>'s <span>origin</span>
+ with a <code>GeneratedStream</code> object representing a media
+ stream.</p>
+
+ <p>If <var title="">audio</var> is true, then the provided media
+ should include an audio component. If <var title="">audio</var>
+ is false, then the provided media must not include an audio
+ component.</p>
+
+ <p>If <var title="">video</var> is true, then the provided media
+ should include a video component. If <var title="">video</var> is
+ false, then the provided media must not include a video
+ component.</p>
+
+ <p>User agents are encouraged to default to using the user's
+ primary or system default camera and/or microphone (as
+ appropriate) to generate the media stream. User agents may allow
+ users to use any media source, including pre-recorded media
+ files.</p>
+
+ <p>If the user grants permission to use local recording devices,
+ user agents are encouraged to include a prominent indicator that
+ the devices are "hot" (i.e. an "on-air" or "recording"
+ indicator).</p>
+
+ <p>If the user denies permission, jump to the step labeled
+ <i>failure</i> below. If the user never responds, this algorithm
+ stalls on this step.</p>
+
+ </li>
+
+ <li><p>Let <var title="">stream</var> be the
+ <code>GeneratedStream</code> object for which the user granted
+ permission.</p></li>
+
+ <li><p><span>Queue a task</span> to invoke <var
+ title="">successCallback</var> with <var title="">stream</var> as
+ its argument.</p></li>
+
+ <li><p>Abort these steps.</p></li>
+
+ <li><p><i>Failure</i>: If <var title="">errorCallback</var> is
+ null, abort these steps.</p></li>
+
+ <li><p>Let <var title="">error</var> be a new
+ <code>NavigatorUserMediaError</code> object whose <code
+ title="dom-NavigatorUserMediaError-code">code</code> attribute has
+ the numeric value 1 (<code
+ title="dom-NavigatorUserMediaError-PERMISSION_DENIED">PERMISSION_DENIED</code>).</p></li>
+
+ <li><p><span>Queue a task</span> to invoke <var
+ title="">errorCallback</var> with <var title="">error</var> as its
+ argument.</p></li>
+
+ </ol>
+
+ <p>The <span>task source</span> for these <span
+ title="concept-task">tasks</span> is the <span>user interaction task
+ source</span>.</p>
+
+ <hr>
+
+ <p>The <dfn title="dom-NavigatorUserMediaError-code"><code>code</code></dfn>
+ attribute of a <code>NavigatorUserMediaError</code> object must return the code
+ for the error, which must be <!--one of--> the following:</p>
+
+ <dl>
+
+ <dt><dfn title="dom-NavigatorUserMediaError-PERMISSION_DENIED"><code>PERMISSION_DENIED</code></dfn> (numeric value 1)</dt>
+
+ <dd>The user denied the page permission to use the user's media devices.</dd>
+
+ </dl>
+
+ </div>
+
+ <div class="example">
+
+ <p>A voice chat feature in a game could attempt to get access to
+ the user's microphone by calling the API as follows:</p>
+
+ <pre><script>
+ navigator.getUserMedia('audio', gotAudio);
+ function gotAudio(stream) {
+ // ... use 'stream' ...
+ }
+</script></pre>
+
+ </div>
+
+ <div class="example">
+
+ <p>A video-conferencing system would ask for both audio and video:</p>
+
+ <pre><script>
+ function beginCall() {
+ navigator.getUserMedia('audio,video', gotStream);
+ }
+ function gotStream(stream) {
+ // ... use 'stream' ...
+ }
+</script></pre>
+
+ </div>
+
+
+
+ <h4>Stream API</h4>
+
+ <p>The <code>Stream</code> interface is used to represent streams,
+ typically (but not necessarily) of audio and/or video content, e.g.
+ from a local camera or a remote site.</p>
+
+ <p>The <code>GeneratedStream</code> interface is used when the user
+ agent is generating the stream's data (e.g. from a camera or
+ streaming it from a local video file). It allows authors to pause
+ the generation of the content, e.g. to allow the user to temporarily
+ disable a local camera during a video-conference chat.</p>
+
+ <p>When a <code>GeneratedStream</code> object is being generated
+ from a local file (as opposed to a live audio/video source), the
+ user agent should stream the data from the file in real time, not
+ all at once. This reduces the ease with which pages can distinguish
+ live video from pre-recorded video, which can help protect the
+ user's privacy.</p>
+
+ <!-- v2: support reading the bits from the stream directly, for use
+ with streaming over WebSocket? Or do we rely on FileReader for that? -->
+
+ <pre class="idl">interface <dfn>Stream</dfn> {
+ readonly attribute DOMString <span title="dom-stream-label">label</span>;
+ <span>StreamRecorder</span> <span title="dom-stream-record">record</span>();
+<!--
+ const unsigned short <span title="dom-stream-LOADING">LOADING</span> = 0; -->
+ const unsigned short <span title="dom-stream-LIVE">LIVE</span> = 1;
+ const unsigned short <span title="dom-stream-ENDED">ENDED</span> = 2;
+ readonly attribute unsigned short <span title="dom-stream-readyState">readyState</span>;
+ attribute <span>Function</span> <span title="handler-stream-onreadystatechange">onreadystatechange</span>;
+ attribute <span>Function</span> <span title="handler-stream-onended">onended</span>;
+};
+<span>Stream</span> implements <span>EventTarget</span>;
+
+interface <dfn>GeneratedStream</dfn> {
+ void <span title="dom-stream-stop">stop</span>();
+
+ // temporarily pausing the stream
+ const unsigned short <span title="dom-stream-PAUSED">PAUSED</span> = 3;
+ void <span title="dom-stream-pause">pause</span>();
+ void <span title="dom-stream-resume">resume</span>();
+ attribute <span>Function</span> <span title="handler-stream-onpause">onpause</span>;
+ attribute <span>Function</span> <span title="handler-stream-onplay">onplay</span>;
+};</pre>
+
+ <dl class="domintro">
+
+ <dt><var title="">stream</var> . <code title="dom-stream-label">label</code></dt>
+
+ <dd>
+
+ <p>Returns a label that is unique to this stream, so that streams
+ can be recognised after they are sent through the
+ <code>PeerConnection</code> API.</p>
+
+ </dd>
+
+
+ <dt><var title="">recorder</var> = <var title="">stream</var> . <code title="dom-stream-record">record</code>()</dt>
+
+ <dd>
+
+ <p>Begins recording the stream. The returned
+ <code>StreamRecorder</code> object provides access to the recorded
+ data.</p>
+
+ </dd>
+
+
+ <dt><var title="">stream</var> . <code title="dom-stream-stop">stop</code>()</dt>
+
+ <dd>
+
+ <p>Permanently stops the generation of media data for the stream.</p>
+
+ </dd>
+
+
+ <dt><var title="">stream</var> . <code title="dom-stream-paused">paused</code></dt>
+
+ <dd>
+
+ <p>Returns false if the stream is generating data; true if it is pause.</p>
+
+ </dd>
+
+
+ <dt><var title="">stream</var> . <code title="dom-stream-pause">pause</code>()</dt>
+
+ <dd>
+
+ <p>Temporarily stops the generation of media data for the stream.</p>
+
+ </dd>
+
+
+ <dt><var title="">stream</var> . <code title="dom-stream-resume">resume</code>()</dt>
+
+ <dd>
+
+ <p>Resumes the generation of media data for the stream if it was temporarily stopped.</p>
+
+ </dd>
+
+ </dl>
+
+ <div class="impl">
+
+ <p>The <dfn
+ title="dom-stream-readyState"><code>readyState</code></dfn>
+ attribute represents the state of the stream. It must return the
+ value to which the user agent last set it (as defined below). It can
+ have the following values:</p>
+
+ <dl>
+
+ <dt><dfn title="dom-stream-LIVE"><code>LIVE</code></dfn> (numeric value 1)</dt>
+
+ <dd>The stream is active (the user agent is making a best-effort
+ attempt to receive or generate data in real time).</dd>
+
+ <dt><dfn title="dom-stream-ENDED"><code>ENDED</code></dfn> (numeric value 2)</dt>
+
+ <dd>The stream has finished (the user agent is no longer receiving
+ or generating data, and will never receive or generate more data
+ for this stream).</dd>
+
+ <dt><dfn title="dom-stream-PAUSED"><code>PAUSED</code></dfn> (numeric value 3)</dt>
+
+ <dd>The stream is not generating data at this time, but could still
+ be resumed. Only <code>GeneratedStream</code> objects can be in
+ this state.</dd>
+
+ </dl>
+
+ <p>When a <code>Stream</code> object is created, its <code
+ title="dom-stream-readyState">readyState</code> attribute must be
+ set to <code title="dom-stream-LIVE">LIVE</code> (1).</p>
+
+ <p>When a <code>Stream</code> object ends for any reason other than
+ the <code title="dom-stream-stop">stop()</code> method being invoke
+ (e.g. because the user rescinds the permission for the page to use
+ the local camera, or because the data comes from a finite file and
+ the file's end has been reached and the user has not requested that
+ it be looped, or because the stream comes from a remote peer and the
+ remote peer has permanently stopped sending data), the user agent
+ must <span>queue a task</span> that runs the following steps:</p>
+
+ <ol>
+
+ <li><p>If the object's <code
+ title="dom-stream-readyState">readyState</code> attribute has the
+ value <code title="dom-stream-ENDED">ENDED</code> (2) already, then
+ abort these steps. (The <code title="dom-stream-stop">stop()</code>
+ method was probably called just before the stream stopped for other
+ reasons, e.g. the user clicked an in-page stop button and then the
+ user-agent-provided stop button.)</p></li>
+
+ <li><p>Set the object's <code
+ title="dom-stream-readyState">readyState</code> attribute to <code
+ title="dom-stream-ENDED">ENDED</code> (2).</p></li>
+
+ <li><p><span>Fire a simple event</span> named <code
+ title="event-readystatechange">readystatechange</code> at the
+ object.</p></li>
+
+ <li><p><span>Fire a simple event</span> named <code
+ title="event-stream-ended">ended</code> at the object.</p></li>
+
+ </ol>
+
+ <p>If the end of the stream was reached due to a user request, the
+ <span>task source</span> for this <span
+ title="concept-task">task</span> is the <span>user interaction task
+ source</span>. Otherwise the <span>task source</span> for this <span
+ title="concept-task">task</span> is the <span>networking task
+ source</span>.</p>
+
+ <hr>
+
+ <p>When a <code>GeneratedStream</code> object is created, the user
+ agent must generate a globally unique identifier string, and must
+ initialize the object's <code title="dom-stream-label">label</code>
+ attribute to that string. Such strings must only use characters in
+ the ranges U+0021, U+0023 to U+0027, U+002A to U+002B, U+002D to
+ U+002E, U+0030 to U+0039, U+0041 to U+005A, U+005E to U+007E, and
+ must be 36 characters long.</p> <!-- UUIDs have 36 characters
+ including hyphens; the ranges above comes from RFC4574 (the a=label:
+ thing in SDP) -->
+
+ <p>When a <code>Stream</code> is created to represent a stream
+ obtained from a remote peer, the <code
+ title="dom-stream-label">label</code> attribute is initialized from
+ information provided by the remote source.</p> <!-- described below
+ -->
+
+ <p>The <dfn title="dom-stream-label"><code>label</code></dfn>
+ attribute must return the value to which it was initialized when the
+ object was created.</p>
+
+ <hr>
+
+ <p>When the <dfn
+ title="dom-stream-record"><code>record()</code></dfn> method is
+ invoked, the user agent must return a new
+ <code>StreamRecorder</code> object associated with the stream.</p>
+
+ <hr>
+
+ <p>When a <code>GeneratedStream</code> object's <dfn
+ title="dom-stream-stop"><code>stop()</code></dfn> method is invoked,
+ the user agent must <span>queue a task</span> that runs the
+ following steps:</p>
+
+ <ol>
+
+ <li><p>If the object's <code
+ title="dom-stream-readyState">readyState</code> attribute is in the
+ <code title="dom-stream-ENDED">ENDED</code> (2) state, then abort
+ these steps.</p></li>
+
+ <li><p>Permanently stop the generation of data for the stream. If
+ the data is being generated from a live source (e.g. a microphone
+ or camera), and no other stream is being generated from a live
+ source, then the user agent should remove any active "on-air"
+ indicator. If the data is being generated from a prerecorded source
+ (e.g. a video file), any remaining content in the file is
+ ignored.</p></li>
+
+ <li><p>Set the object's <code
+ title="dom-stream-readyState">readyState</code> attribute to <code
+ title="dom-stream-ENDED">ENDED</code> (2).</p></li>
+
+ <li><p><span>Fire a simple event</span> named <code
+ title="event-readystatechange">readystatechange</code> at the
+ object.</p></li>
+
+ <li><p><span>Fire a simple event</span> named <code
+ title="event-stream-ended">ended</code> at the object.</p></li>
+
+ </ol>
+
+ <hr>
+
+ <p>When a <code>GeneratedStream</code> object's <dfn
+ title="dom-stream-pause"><code>pause()</code></dfn> method is
+ invoked, the user agent must <span>queue a task</span> that runs the
+ following steps:</p>
+
+ <ol>
+
+ <li><p>If the object's <code
+ title="dom-stream-readyState">readyState</code> attribute is not in
+ the <code title="dom-stream-LIVE">LIVE</code> (1) state, then abort
+ these steps.</p></li>
+
+ <li><p>Pause the generation of data for the stream. If the data is
+ being generated from a live source (e.g. a microphone or camera),
+ then data collected for this stream while the stream is paused must
+ be discarded. If the data is being generated from a prerecorded
+ source (e.g. a video file), the user agent should follow user
+ preferences for handling a pause (either skipping over data in real
+ time or resuming from the same point when the stream is later
+ resumed).</p></li>
+
+ <li><p>Set the object's <code
+ title="dom-stream-readyState">readyState</code> attribute to <code
+ title="dom-stream-PAUSED">PAUSED</code> (3).</p></li>
+
+ <li><p><span>Fire a simple event</span> named <code
+ title="event-readystatechange">readystatechange</code> at the
+ object.</p></li>
+
+ <li><p><span>Fire a simple event</span> named <code
+ title="event-stream-pause">pause</code> at the object.</p></li>
+
+ </ol>
+
+ <p>When a <code>GeneratedStream</code> object's <dfn
+ title="dom-stream-resume"><code>resume()</code></dfn> method is
+ invoked, the user agent must <span>queue a task</span> that runs the
+ following steps:</p>
+
+ <ol>
+
+ <li><p>If the object's <code
+ title="dom-stream-readyState">readyState</code> attribute is not in
+ the <code title="dom-stream-PAUSED">PAUSED</code> (3) state, then
+ abort these steps.</p></li>
+
+ <li><p>Resume the generation of data for the stream.</p></li>
+
+ <li><p>Set the object's <code
+ title="dom-stream-readyState">readyState</code> attribute to <code
+ title="dom-stream-LIVE">LIVE</code> (1).</p></li>
+
+ <li><p><span>Fire a simple event</span> named <code
+ title="event-readystatechange">readystatechange</code> at the
+ object.</p></li>
+
+ <li><p><span>Fire a simple event</span> named <code
+ title="event-stream-play">play</code> at the object.</p></li>
+
+ </ol>
+
+ <hr>
+
+ <p>The <span>task source</span> for the <span
+ title="concept-task">tasks</span> queued for the <code
+ title="dom-stream-stop">stop()</code>, <code
+ title="dom-stream-pause">pause()</code>, and <code
+ title="dom-stream-resume">resume()</code> methods is the <span>DOM
+ manipulation task source</span>.</p>
+
+ <hr>
+
+ <p>The following are the <span>event handlers</span> (and their
+ corresponding <span title="event handler event type">event handler
+ event types</span>) that must be supported, as IDL attributes, by
+ all objects implementing the <code>Stream</code> interface:</p>
+
+ <table>
+ <thead>
+ <tr><th><span title="event handlers">Event handler</span> <th><span>Event handler event type</span>
+ <tbody>
+ <tr><td><dfn title="handler-stream-onreadystatechange"><code>onreadystatechange</code></dfn> <td> <code title="event-stream-readystatechange">readystatechange</code>
+ <tr><td><dfn title="handler-stream-onended"><code>onended</code></dfn> <td> <code title="event-stream-ended">ended</code>
+ </table>
+
+ <p>The following are the additional <span>event handlers</span> (and
+ their corresponding <span title="event handler event type">event
+ handler event types</span>) that must be supported, as IDL
+ attributes, by all objects implementing the
+ <code>GeneratedStream</code> interface:</p>
+
+ <table>
+ <thead>
+ <tr><th><span title="event handlers">Event handler</span> <th><span>Event handler event type</span>
+ <tbody>
+ <tr><td><dfn title="handler-stream-onpause"><code>onpause</code></dfn> <td> <code title="event-stream-pause">pause</code>
+ <tr><td><dfn title="handler-stream-onplay"><code>onplay</code></dfn> <td> <code title="event-stream-play">play</code>
+ </table>
+
+ </div>
+
+ <div class="example">
+
+ <p>This sample code exposes a button. When clicked, the button is
+ disabled and the user is prompted to offer a stream. The user can
+ cause the button to be re-enabled by providing a stream (e.g.
+ giving the page access to the local camera) and then disabling the
+ stream (e.g. revoking that access).</p>
+
+ <pre>
+<input type="button" value="Start" onclick="start()" id="startBtn">
+<script>
+ var startBtn = document.getElementById('startBtn');
+ function start() {
+ navigator.getUserMedia('audio,video', gotStream);
+ startBtn.disabled = true;
+ }
+ function gotStream(stream) {
+ stream.onended = function () {
+ startBtn.disabled = false;
+ }
+ }
+</script></pre>
+
+ </div>
+
+ <pre class="idl">interface <dfn>StreamRecorder</dfn> {
+ <span>Blob</span> <span title="dom-StreamRecorder-getRecordedData">getRecordedData</span>(in <span>BlobCallback</span> callback);
+};
+
+[Callback=FunctionOnly, NoInterfaceObject]
+interface <dfn>BlobCallback</dfn> {
+ void <span title="dom-BlobCallback-handleEvent">handleEvent</span>(in <span>Blob</span> blob);
+};</pre>
+
+ <dl class="domintro">
+
+ <dt><var title="">recorder</var> . <code title="dom-StreamRecorder-getRecordedData">getRecordedData</code>(<var title="">callback</var>)</dt>
+
+ <dd>
+
+ <p>Creates a <code>Blob</code> of the recorded data, and invokes
+ the provided callback with that <code>Blob</code>.</p>
+
+ </dd>
+
+ </dl>
+
+ <div class="impl">
+
+ <p>When the <dfn
+ title="dom-StreamRecorder-getRecordedData"><code>getRecordedData()</code></dfn>
+ method is called, the user agent must run the following steps:</p>
+
+ <ol>
+
+ <li><p>Let <var title="">callback</var> be the callback
+ indicated by the method's first argument.</p></li>
+
+ <li><p>If <var title="">callback</var> is null, abort these
+ steps.</p></li> <!-- we could throw an exception instead (that's
+ why the method doesn't return until later: so that we can add an
+ exception here without changing the algorithm) -->
+
+ <li><p>Let <var title="">data</var> be the data that was streamed
+ by the <code>Stream</code> object from which the
+ <code>StreamRecorder</code> was created since the creation of the
+ <code>StreamRecorder</code> object.</li>
+
+ <li><p>Return, and run the remaining steps asynchronously.</p></li>
+
+ <li><p>Generate a file that containing <var title="">data</var> in
+ a format supported by the user agent for use in <code>audio</code>
+ and <code>video</code> elements.</p></li>
+
+ <li><p>Let <var title="">blob</var> be a <code>Blob</code> object
+ representing the contents of the file generated in the previous
+ step. <a href="#refsFILEAPI">[FILEAPI]</a></p>
+
+ <li><p><span>Queue a task</span> to invoke <var
+ title="">callback</var> with <var title="">blob</var> as its
+ argument.</p></li>
+
+ </ol>
+
+ <p class="note">The <code
+ title="dom-StreamRecorder-getRecordedData">getRecordedData()</code>
+ method can be called multiple times on one
+ <code>StreamRecorder</code> object; each time, it will create a new
+ file as if this was the first time the method was being called. In
+ particular, the method does not stop or reset the recording when the
+ method is called.</p>
+
+ </div>
+
+ <div class="example">
+
+ <p>This example allows people to record a short audio message and
+ upload it to the server. This example even shows rudimentary error
+ handling.</p>
+
+ <pre><input type="button" value="⚫" onclick="msgRecord()" id="recBtn">
+<input type="button" value="◼" onclick="msgStop()" id="stopBtn" disabled>
+<p id="status">To start recording, press the ⚫ button.</p>
+<script>
+ var recBtn = document.getElementById('recBtn');
+ var stopBtn = document.getElementById('stopBtn');
+ function report(s) {
+ document.getElementById('status').textContent = s;
+ }
+ function msgRecord() {
+ report('Attempting to access microphone...');
+ navigator.getUserMedia('audio', gotStream, noStream);
+ recBtn.disabled = true;
+ }
+ var msgStream;
+ function gotStream(stream) {
+ report('Recording... To stop, press to ◼ button.');
+ msgStream = stream;
+ stopBtn.disabled = false;
+ stream.onended = function () {
+ msgStop();
+ }
+ }
+ function msgStop() {
+ report('Creating file...');
+ stopBtn.disabled = true;
+ stream.onended = null;
+ stream.stop();
+ stream.getRecordedData(msgSave);
+ }
+ function msgSave(blob) {
+ report('Uploading file...');
+ var x = new XMLHttpRequest();
+ x.open('POST', 'uploadMessage');
+ x.send(blob);
+ x.onload = function () {
+ report('Done! To record a new message, press the ⚫ button.');
+ recBtn.disabled = false;
+ };
+ x.onerror = function () {
+ report('Failed to upload message. To try recording a message again, press the ⚫ button.');
+ recBtn.disabled = false;
+ };
+ }
+ funciton noStream() {
+ report('Could not obtain access to your microphone. To try again, press the ⚫ button.');
+ recBtn.disabled = false;
+ }
+</script></pre>
+
+ </div>
+
+ <pre class="idl">[Supplemental]
+interface <dfn title="dom-URL">URL</dfn> {
+ static DOMString <span title="dom-URL-createObjectURL">createObjectURL</span>(in <span>Stream</span> stream);
+};</pre>
+
+ <dl class="domintro">
+
+ <dt><var title="">window</var> . <code title="dom-URL">URL</code> . <code title="dom-URL-createObjectURL">createObjectURL</code>(<var title="">stream</var>)</dt>
+
+ <dd>
+
+ <p>Mints a <span>Blob URL</span> to refer to the given <code>Stream</code>.</p>
+
+ </dd>
+
+ </dl>
+
+ <div class="impl">
+
+ <p>When the <dfn
+ title="dom-URL-createObjectURL"><code>createObjectURL()</code></dfn>
+ method is called with a <code>Stream</code> argument, the user agent
+ must return a unique <span>Blob URL</span> for the given
+ <code>Stream</code>. <a href="#refsFILEAPI">[FILEAPI]</a></p>
+
+ <p>For audio and video streams, the data exposed on that stream must
+ be in a format supported by the user agent for use in
+ <code>audio</code> and <code>video</code> elements.</p>
+
+ <p class="bookkeeping">A <dfn>Blob URL</dfn> is the same as what the
+ File API specification calls a <span>Blob URI</span>, except that
+ anything in the definition of that feature that refers to
+ <code>File</code> and <code>Blob</code> objects is hereby extended
+ to also apply to <code>Stream</code> and
+ <code>GeneratedStream</code> objects.</p>
+
+ </div>
+
+ <div class="example">
+
+ <p>This example allows people to take photos of themselves from the
+ local video camera.</p>
+
+ <pre><article>
+ <style scoped>
+ video { transform: scaleX(-1); }
+ p { text-align: center; }
+ </style>
+ <h1>Snapshot Kiosk</h1>
+ <section id="splash">
+ <p id="errorMessage">Loading...</p>
+ </section>
+ <section id="app" hidden>
+ <p><video id="monitor"></video> <canvas id="photo"></canvas>
+ <p><input type=button value="📷" onclick="snapshot()">
+ </section>
+ <script>
+ navigator.getUserMedia('video', gotStream, noStream);
+ var video = document.getElementById('monitor');
+ var canvas = document.getElementById('photo');
+ function gotStream(stream) {
+ video.src = URL.getObjectURL(stream);
+ video.onerror = function () {
+ stream.stop();
+ noStream();
+ }
+ video.onloadedmetadata = function () {
+ canvas.width = video.videoWidth;
+ canvas.height = video.videoHeight;
+ document.getElementById('splash').hidden = true;
+ document.getElementById('app').hidden = false;
+ }
+ }
+ function noStream() {
+ document.getElementById('errorMessage').textContent = 'No camera available.';
+ }
+ function snapshot() {
+ canvas.getContext('2d').drawImage(video, 0, 0);
+ }
+ </script>
+</article></pre>
+
+ </div>
+
+
+
+ <h4>Peer-to-peer connections</h4>
+
+ <pre class="idl">[<span title="dom-PeerConnection">Constructor</span>(in DOMString configuration, in <span>SignalingCallback</span> signalingCallback)]
+interface <dfn>PeerConnection</dfn> {
+ void <span title="dom-PeerConnection-signalingMessage">signalingMessage</span>(in DOMString message);
+
+ // <span class="XXX">readyState, etc</span>
+
+ void <span title="dom-PeerConnection-send">send</span>(in DOMString text);
+ void <span title="dom-PeerConnection-addStream">addStream</span>(in <span>Stream</span> stream);
+ void <span title="dom-PeerConnection-removeStream">removeStream</span>(in <span>Stream</span> stream);
+ readonly attribute <span>Stream</span>[] <span title="dom-PeerConnection-localStreams">localStreams</span>;
+ readonly attribute <span>Stream</span>[] <span title="dom-PeerConnection-remoteStreams">remoteStreams</span>;
+
+ // <span class="XXX">connection quality information</span>
+
+ attribute <span>Function</span> <span title="handler-PeerConnection-ontext">ontext</span>;
+ attribute <span>Function</span> <span title="handler-PeerConnection-onaddstream">onaddstream</span>;
+ attribute <span>Function</span> <span title="handler-PeerConnection-onremovestream">onremovestream</span>;
+};
+<span>PeerConnection</span> implements <span>EventTarget</span>;
+
+[Callback=FunctionOnly, NoInterfaceObject]
+interface <dfn>SignalingCallback</dfn> {
+ void <span title="dom-SignalingCallback-handleEvent">handleEvent</span>(in <span>PeerConnection</span> source, in DOMString message);
+};</pre>
+
+ <p>A <code>PeerConnection</code> allows two users to communicate
+ directly, browser-to-browser. Communications are coordinated via a
+ signaling channel provided by script in the page via the server,
+ e.g. using <code>XMLHttpRequest</code>.</p>
+
+ <dl class="domintro">
+
+ <dt><var title="">connection</var> = new <code title="dom-PeerConnection">PeerConnection</code>(<var title="">configuration</var>, <var title="">signalingCallback</var>)</dt>
+
+ <dd>
+
+ <p>Creates a <code>PeerConnection</code> object.</p>
+
+ <p>The <var title="">configuration</var> string gives the address
+ of a STUN or TURN server to use to establish the connection. <a
+ href="#refsSTUN">[STUN]</a> <a href="#refsTURN">[TURN]</a></p>
+
+ <p>The allowed formats for this string are:</p>
+
+ <dl>
+
+ <dt>"<code title=""><var title="">TYPE</var> 203.0.113.2:3478</code>"
+ <dd>
+ <p>Indicates a specific IP address and port for the server.</p>
+ </dd>
+
+ <dt>"<code title=""><var title="">TYPE</var> relay.example.net:3478</code>"
+ <dd>
+ <p>Indicates a specific host and port for the server; the user agent will look up the IP address in DNS.</p>
+ </dd>
+
+ <dt>"<code title=""><var title="">TYPE</var> example.net</code>"
+ <dd>
+ <p>Indicates a specific domain for the server; the user agent will look up the IP address and port in DNS.</p>
+ </dd>
+
+ </dl>
+
+ <p>The "<code title=""><var title="">TYPE</var></code>" is one of:</p>
+
+ <dl>
+
+ <dt><code title="">STUN</code></dt>
+ <dd>Indicates a STUN server
+
+ <dt><code title="">STUNS</code></dt>
+ <dd>Indicates a STUN server that is to be contacted using a TLS session.
+
+ <dt><code title="">TURN</code></dt>
+ <dd>Indicates a TURN server
+
+ <dt><code title="">TURNS</code></dt>
+ <dd>Indicates a TURN server that is to be contacted using a TLS session.
+
+ </dl>
+
+ <p>The <var title="">signalingCallback</var> argument is a method
+ that will be invoked when the user agent needs to send a message
+ to the other host over the signaling channel. When the callback
+ is invoked, convey its argument (a string) to the other peer using
+ whatever method is being used by the Web application to relay
+ signaling messages. (Messages returned from the other peer are
+ provided back to the user agent using the <code
+ title="dom-PeerConnection-signalingMessage">signalingMessage()</code>
+ method.)</p>
+
+ </dd>
+
+
+ <dt><var title="">connection</var> . <code title="dom-PeerConnection-signalingMessage">signalingMessage</code>(<var title="">message</var>)</dt>
+
+ <dd>
+
+ <p>When a message is relayed from the remote peer over the
+ signaling channel is received by the Web application, pass it to
+ the user agent by calling the <code
+ title="dom-PeerConnection-signalingMessage">signalingMessage()</code>
+ method.</p>
+
+ <p>The order of messages is important. Passing messages to the
+ user agent in a different order than they were generated by the
+ remote peer's user agent can prevent a successful connection from
+ being established or degrade the connection's quality if one is
+ established.</p>
+
+ </dd>
+
+ <dt><var title="">connection</var> . <code title="dom-PeerConnection-send">send</code>(<var title="">text</var>)</dt>
+
+ <dd>
+
+ <p>Attempts to send the given text to the remote peer. This uses
+ UDP, which is inherently unreliable; there is no guarantee that
+ every message will be received.</p>
+
+ <p>When a message sent in this manner from the other peer is
+ received, a <code title="event-PeerConnection-text">text</code>
+ event is dispatched at the <code>PeerConnection</code> object.</p>
+
+ </dd>
+
+ <dt><var title="">connection</var> . <code title="dom-PeerConnection-addStream">addStream</code>(<var title="">stream</var>)</dt>
+
+ <dd>
+
+ <p>Attempts to starting sending the given stream to the remote
+ peer.</p>
+
+ <p>When the other peer starts sending a stream in this manner, an
+ <code title="event-PeerConnection-addstream">addstream</code>
+ event is dispatched at the <code>PeerConnection</code> object.</p>
+
+ </dd>
+
+ <dt><var title="">connection</var> . <code title="dom-PeerConnection-removeStream">removeStream</code>(<var title="">stream</var>)</dt>
+
+ <dd>
+
+ <p>Steps sending the given stream to the remote peer.</p>
+
+ <p>When the other peer stops sending a stream in this manner, a
+ <code
+ title="event-PeerConnection-removestream">removestream</code>
+ event is dispatched at the <code>PeerConnection</code> object.</p>
+
+ </dd>
+
+ <dt><var title="">connection</var> . <code title="dom-PeerConnection-localStreams">localStreams</code></dt>
+
+ <dd>
+
+ <p>Returns a live array containing the streams that the user agent
+ is currently attempting to transmit to the remote peer (those that
+ were added with <code
+ title="dom-PeerConnection-addStream">addStream()</code>).</p>
+
+ </dd>
+
+ <dt><var title="">connection</var> . <code title="dom-PeerConnection-remoteStreams">remoteStreams</code></dt>
+
+ <dd>
+
+ <p>Returns a live array containing the streams that the user agent
+ is currently receiving from the remote peer.</p>
+
+ <p>This array is updated when <code
+ title="event-PeerConnection-addstream">addstream</code> and <code
+ title="event-PeerConnection-removestream">removestream</code>
+ events are fired.</p>
+
+ </dd>
+
+ </dl>
+
+ <div class="impl">
+
+ <p>A <code>PeerConnection</code> object has an associated
+ <dfn><code>PeerConnection</code> signaling callback</dfn>, a
+ <dfn><code>PeerConnection</code> ICE Agent</dfn>, a
+ <dfn><code>PeerConnection</code> data UDP media stream</dfn> and an
+ <dfn>ICE started flag</dfn>. These are initialized when the object
+ is created.</p>
+
+ <p>When the <dfn
+ title="dom-PeerConnection"><code>PeerConnection()</code></dfn>
+ constructor is invoked, the user agent must run the following steps.
+ This algorithm has a <span>synchronous section</span> (which is
+ triggered as part of the <span>event loop</span> algorithm). Steps
+ in the <span>synchronous section</span> are marked with
+ ⌛.</p>
+
+ <ol>
+
+ <li><p>Let <var title="">serverConfiguration</var> be the constructor's
+ first argument.</p></li>
+
+ <li><p>Let <var title="">signalingCallback</var> be the
+ constructor's second argument.</p></li>
+
+ <li><p>If <var title="">signalingCallback</var> is null, throw a
+ <code>TypeError</code> exception and abort these steps.</p></li>
+
+ <li><p>Let <var title="">connection</var> be a newly created
+ <code>PeerConnection</code> object.</p></li>
+
+ <li><p>Create an ICE Agent and let <var title="">connection</var>'s
+ <span><code>PeerConnection</code> ICE Agent</span> be that ICE
+ Agent. <a href="#refsICE">[ICE]</a></p></li>
+
+ <li><p>If <var title="">serverConfiguration</var> contains a U+000A LINE
+ FEED (LF) character or a U+000D CARRIAGE RETURN (CR) character (or
+ both), remove all characters from <var title="">serverConfiguration</var>
+ after the first such character.</p></li>
+
+ <li><p><span title="split a string on spaces">Split <var
+ title="">serverConfiguration</var> on spaces</span> to obtain <var
+ title="">configuration components</var>.</p></li>
+
+ <li>
+
+ <p>If <var title="">configuration components</var> has two or more
+ components, and the first component is a
+ <span>case-sensitive</span> match for one of the following
+ strings:</p>
+
+ <ul class="brief">
+ <li>"<code title="">STUN</code>"
+ <li>"<code title="">STUNS</code>"
+ <li>"<code title="">TURN</code>"
+ <li>"<code title="">TURNS</code>"
+ </ul>
+
+ <p>...then run the following substeps:</p>
+
+ <ol>
+
+ <li><p>Let <var title="">server type</var> be STUN if the first
+ component of <var title="">configuration components</var> is
+ "<code title="">STUN</code>" or "<code title="">STUNS</code>",
+ and TURN otherwise (the first component of <var
+ title="">configuration components</var> is "<code
+ title="">TURN</code>" or "<code title="">TURNS</code>").</p>
+
+ <li><p>Let <var title="">secure</var> be true if the first
+ component of <var title="">configuration components</var> is
+ "<code title="">STUNS</code>" or "<code title="">TURNS</code>",
+ and false otherwise.</p>
+
+ <li><p>Let <var title="">host</var> be the contents of the second
+ component of <var title="">configuration components</var> up to
+ the character before the first U+003A COLON character (:), if
+ any, or the entire string otherwise.</p></li>
+
+ <li><p>Let <var title="">port</var> be the contents of the second
+ component of <var title="">configuration components</var> from
+ the character after the first U+003A COLON character (:) up to
+ the end, if any, or the empty string otherwise.</p></li>
+
+ <li>
+
+ <p>Configure the <span><code>PeerConnection</code> ICE
+ Agent</span>'s STUN or TURN server as follows:</p>
+
+ <ul>
+
+ <li>If <var title="">server type</var> is STUN, the server is a
+ STUN server. Otherwise, <var title="">server type</var> is TURN
+ and the server is a TURN server.</li>
+
+ <li>If <var title="">secure</var> is true, the server is to be
+ contacted using TLS-over-TCP, otherwise, it is to be contacted
+ using UDP.</li>
+
+ <li>The IP address, host name, or domain name of the server is
+ <var title="">host</var>.</li>
+
+ <li>The port to use is <var title="">port</var>. If this is the
+ empty string, then only a domain name is configured (and the
+ ICE Agent will use DNS SRV requests to determine the IP address
+ and port).</li>
+
+ <li>The long-term username for the the STUN or TURN server is
+ the <span title="ASCII serialization of an origin">ASCII
+ serialization</span> of the <span>entry script</span>'s
+ <span>origin</span>; the long-term password is the empty
+ string.</li>
+
+ </ul>
+
+ <p>If the given IP address, host name, domain name, or port are
+ invalid, then the user agent must act as if no STUN or TURN
+ server is configured.</p>
+
+ </li>
+
+ </ol>
+
+ </li>
+
+ <li><p>Let the <var title="">connection</var>'s
+ <span><code>PeerConnection</code> signaling callback</span> be
+ <var title="">signalingCallback</var>.</p></li>
+
+ <li><p>Set <var title="">connection</var>'s <span>ICE started
+ flag</span> to false.</p></li>
+
+ <li><p>Let <var title="">connection</var>'s
+ <span><code>PeerConnection</code> data UDP media stream</span> be a
+ new <span>data UDP media stream</span>.</p></li>
+
+ <li><p>Let <var title="">connection</var>'s <code
+ title="dom-PeerConnection-localStreams">localStreams</code>
+ attribute be an empty read-only <code>Stream</code> array. <a
+ href="#refsWEBIDL">[WEBIDL]</a></p></li>
+
+ <li><p>Let <var title="">connection</var>'s <code
+ title="dom-PeerConnection-remoteStreams">remoteStreams</code>
+ attribute be an empty read-only <code>Stream</code> array. <a
+ href="#refsWEBIDL">[WEBIDL]</a></p></li>
+
+ <li><p>Return <var title="">connection</var>, but continue these
+ steps asynchronously.</p></li>
+
+ <li><p><span>Await a stable state</span>. The <span>synchronous
+ section</span> consists of the remaining steps of this
+ algorithm. (Steps in <span title="synchronous section">synchronous
+ sections</span> are marked with ⌛.)</p></li>
+
+ <li><p>⌛ If <var title="">connection</var>'s <span>ICE
+ started flag</span> is still false, start the
+ <span><code>PeerConnection</code> ICE Agent</span> and send the
+ initial offer. The initial offer must include a media description
+ for the <span><code>PeerConnection</code> data UDP media
+ stream</span> and for all the streams in <code
+ title="dom-PeerConnection-localStreams">localStreams</code>. <a
+ href="#refsICE">[ICE]</a></p></li>
+
+ <li><p>⌛ Let <var title="">connection</var>'s <span>ICE
+ started flag</span> be true.</p></li>
+
+ </ol>
+
+ <p>When a <span><code>PeerConnection</code> ICE Agent</span> is
+ required to send SDP offers or answers, the user agent must follow
+ these steps:</p>
+
+ <ol>
+
+ <li><p>Let <var title="">sdp</var> be the SDP offer or answer to be
+ sent. <a href="#refsSDPOFFERANSWER">[SDPOFFERANSWER]</a></p></li>
+
+ <li><p>Let <var title="">message</var> be the concatenation of the
+ string "<code title="">SDP</code>", a U+000A LINE FEED (LF)
+ character, and <var title="">sdp</var>, in that order.</p></li>
+
+ <li><p><span>Queue a task</span> to invoke that
+ <span><code>PeerConnection</code> ICE Agent</span>'s
+ <span><code>PeerConnection</code> signaling callback</span> with
+ <var title="">message</var> as its argument.</p></li>
+
+ </ol>
+
+ <p>All SDP media descriptions for streams represented by
+ <code>Stream</code> objects must include a label attribute ("<code
+ title="">a=label:</code>") whose value is the value of the
+ <code>Stream</code> object's <code
+ title="dom-stream-label">label</code> attribute. <a
+ href="#refsSDP">[SDP]</a> <a href="#refsSDPLABEL">[SDPLABEL]</a></p>
+
+ <p><span title="PeerConnection ICE
+ Agent"><code>PeerConnection</code> ICE Agents</span> must not
+ generate any candidates for media streams whose media descriptions
+ do not have a label attribute ("<code title="">a=label:</code>"). <a
+ href="#refsICE">[ICE]</a> <a href="#refsSDP">[SDP]</a> <a
+ href="#refsSDPLABEL">[SDPLABEL]</a></p>
+
+ <p>When a user agent starts receiving media for a component an a
+ candidate provided for that component by a
+ <span><code>PeerConnection</code> ICE Agent</span>, the user agent
+ must follow these steps:</p>
+
+ <ol>
+
+ <li><p>Let <var title="">connection</var> be the
+ <code>PeerConnection</code> whose ICE Agent is expecting this
+ media.</p></li>
+
+ <li><p>If there is already a <code>Stream</code> object for the
+ media stream to which this component belongs, then associate the
+ component with that media stream and abort these steps. (Some media
+ streams have multiple components; this API does not expose the
+ role of these individual components in ICE.)</p></li>
+
+ <li><p>Create a <code>Stream</code> object to represent the media
+ stream. Set its <code title="attr-stream-label">label</code>
+ attribute to the value of the SDP Label attribute for that
+ component's media stream.</p></li>
+
+ <li><p><span>Queue a task</span> to add the newly created
+ <code>Stream</code> object to the end of <var
+ title="">connection</var>'s <code
+ title="dom-PeerConnection-remoteStreams">remoteStreams</code>
+ array, then <span>fire a stream event</span> named <code
+ title="event-stream-addstream">addstream</code> with the newly
+ created <code>Stream</code> object at the <var
+ title="">connection</var> object.</p></li>
+
+ </ol>
+
+ <p>When a <span><code>PeerConnection</code> ICE Agent</span> finds
+ that a stream from the remote peer has been removed (its port has
+ been set to zero in a media description sent on the signaling
+ channel), the user agent must follow these steps:</p>
+
+ <ol>
+
+ <li><p>Let <var title="">connection</var> be the
+ <code>PeerConnection</code> whose <span><code>PeerConnection</code>
+ ICE Agent</span> has determined that a stream is being removed.</p></li>
+
+ <li><p>Let <var title="">stream</var> be the <code>Stream</code>
+ object that represents the media stream being removed, if any. If
+ there isn't one, then abort these steps.</p></li>
+
+ <li><p><span>Queue a task</span> to remove <var
+ title="">stream</var> from <var title="">connection</var>'s <code
+ title="dom-PeerConnection-remoteStreams">remoteStreams</code>
+ array, then <span>fire a stream event</span> named <code
+ title="event-stream-removestream">removestream</code> with <var
+ title="">stream</var> at the <var title="">connection</var>
+ object.</p></li>
+
+ </ol>
+
+ <p>When the <dfn title="dom-PeerConnection-signalingMessage"><code
+ title="">signalingMessage()</code></dfn> method is invoked, the
+ user agent must run the following steps:</p>
+
+ <ol>
+
+ <li><p>Let <var title="">message</var> be the method's
+ argument.</p></li>
+
+ <li>
+
+ <p>If the first four characters of <var title="">message</var> are
+ not "<code title="">SDP</code>" followed by a U+000A LINE FEED
+ (LF) character, then abort these steps. (This indicates an error
+ in the signaling channel implementation. User agents may report
+ such errors to their developer consoles to aid debugging.)</p>
+
+ <p class="note">Future extensions to the
+ <code>PeerConnection</code> interface might use other prefix
+ values to implement additional features.</p>
+
+ </li>
+
+ <li><p>Let <var title="">sdp</var> be the string consisting of all
+ but the first four characters of <var
+ title="">message</var>.</p></li>
+
+ <li>
+
+ <p>If <var title="">connection</var>'s <span>ICE started
+ flag</span> is still false, start the
+ <span><code>PeerConnection</code> ICE Agent</span> and pass it
+ <var title="">sdp</var> as the initial offer from the other peer;
+ the ICE Agent will then (asynchronously) construct the initial
+ answer and transmit it as described above. The initial answer must
+ include a media description for the
+ <span><code>PeerConnection</code> data UDP media stream</span> and
+ for all the streams in <code
+ title="dom-PeerConnection-localStreams">localStreams</code>. <a
+ href="#refsICE">[ICE]</a></p>
+
+ <p>If <var title="">connection</var>'s <span>ICE started
+ flag</span> is true, then pass <var title="">sdp</var> to the
+ <span><code>PeerConnection</code> ICE Agent</span> as a subsequent
+ offer or answer, to be interpreted as appropriate given the
+ current state of the ICE Agent. <a href="#refsICE">[ICE]</a></p>
+
+ </li>
+
+ <li><p>Let <var title="">connection</var>'s <span>ICE started
+ flag</span> be true.</p></li>
+
+ </ol>
+
+ <p>When the <dfn title="dom-PeerConnection-send"><code
+ title="">send()</code></dfn> method is invoked, the
+ user agent must run the following steps:</p>
+
+ <ol>
+
+ <li><p>Let <var title="">message</var> be the method's first
+ argument.</p></li>
+
+ <li><p>Let <var title="">data</var> be <var title="">message</var>
+ encoded as UTF-8. <a href="#refsRFC3629">[RFC3629]</a></p></li>
+
+ <li><p>If <var title="">data</var> is longer than 65470 bytes,
+ throw an <code>INVALID_ACCESS_ERR</code> exception and abort these
+ steps.</p></li>
+ <!-- 65470 = 65535 (64K, max IP size) - 40 (IP header) - 8 (UDP header) - 16 (nonce) - 1 (payload type byte) -->
+
+ <li><p>If the <code>PeerConnection</code>'s
+ <span><code>PeerConnection</code> data UDP media stream</span> is
+ not an <span>active data UDP media stream</span>, abort these
+ steps. No message is sent.</p></li>
+
+ <li><p><span>Transmit a data packet to a peer</span> using the
+ <code>PeerConnection</code>'s <span><code>PeerConnection</code>
+ data UDP media stream</span> with <var title="">data</var> as the
+ message.</p></li>
+
+ </ol>
+
+ <p>When the <dfn title="dom-PeerConnection-addStream"><code
+ title="">addStream()</code></dfn> method is invoked, the user agent
+ must run the following steps:</p>
+
+ <ol>
+
+ <li><p>Let <var title="">stream</var> be the method's
+ argument.</p></li>
+
+ <li><p>If <var title="">stream</var> is null, throw a
+ <code>TypeError</code> exception and abort these steps.</p></li>
+
+ <li><p>If <var title="">stream</var> is already in the
+ <code>PeerConnection</code> object's <code
+ title="dom-PeerConnection-localStreams">localStreams</code> object,
+ then abort these steps.</p></li>
+
+ <li><p>Add <var title="">stream</var> to the end of the
+ <code>PeerConnection</code> object's <code
+ title="dom-PeerConnection-localStreams">localStreams</code>
+ object.</p></li>
+
+ <li><p>If the <code>PeerConnection</code>'s <span>ICE
+ started flag</span> is false, then abort these steps.</p></li>
+
+ <li><p>Have the <code>PeerConnection</code>'s
+ <span><code>PeerConnection</code> ICE Agent</span> add a media
+ stream for <var title="">stream</var>. <a
+ href="#refsICE">[ICE]</a></p></li> <!-- section 9.1.1.3 -->
+
+ </ol>
+
+ <p>When the <dfn title="dom-PeerConnection-removeStream"><code
+ title="">removeStream()</code></dfn> method is invoked, the user agent
+ must run the following steps:</p>
+
+ <ol>
+
+ <li><p>Let <var title="">stream</var> be the method's
+ argument.</p></li>
+
+ <li><p>If <var title="">stream</var> is null, throw a
+ <code>TypeError</code> exception and abort these steps.</p></li>
+
+ <li><p>If <var title="">stream</var> is not in the
+ <code>PeerConnection</code> object's <code
+ title="dom-PeerConnection-localStreams">localStreams</code> object,
+ then abort these steps.</p></li>
+
+ <li><p>Remove <var title="">stream</var> from the
+ <code>PeerConnection</code> object's <code
+ title="dom-PeerConnection-localStreams">localStreams</code>
+ object.</p></li>
+
+ <li><p>If the <code>PeerConnection</code>'s <span>ICE
+ started flag</span> is false, then abort these steps.</p></li>
+
+ <li><p>Have the <code>PeerConnection</code>'s
+ <span><code>PeerConnection</code> ICE Agent</span> remove the media
+ stream for <var title="">stream</var>. <a
+ href="#refsICE">[ICE]</a></p></li> <!-- section 9.1.1.2 -->
+
+ </ol>
+
+ <p>The <dfn
+ title="dom-PeerConnection-localStreams"><code>localStreams</code></dfn>
+ and <dfn
+ title="dom-PeerConnection-remoteStreams"><code>remoteStreams</code></dfn>
+ attributes must return the read-only <code>Stream</code> arrays that
+ the attributes were respectively set to when the
+ <code>PeerConnection</code>'s constructor ran.</p>
+
+ <hr>
+
+ <p>The following are the <span>event handlers</span> (and their
+ corresponding <span title="event handler event type">event handler
+ event types</span>) that must be supported, as IDL attributes, by
+ all objects implementing the <code>PeerConnection</code>
+ interface:</p>
+
+ <table>
+ <thead>
+ <tr><th><span title="event handlers">Event handler</span> <th><span>Event handler event type</span>
+ <tbody>
+ <tr><td><dfn title="handler-PeerConnection-ontext"><code>ontext</code></dfn> <td> <code title="event-stream-text">text</code>
+ <tr><td><dfn title="handler-PeerConnection-onaddstream"><code>onaddstream</code></dfn> <td> <code title="event-stream-addstream">addstream</code>
+ <tr><td><dfn title="handler-PeerConnection-onremovestream"><code>onremovestream</code></dfn> <td> <code title="event-stream-removestream">removestream</code>
+ </table>
+
+ <hr>
+
+ <p>The <span>task source</span> for the <span
+ title="concept-task">tasks</span> listed in this section is the
+ <span>networking task source</span>.</p>
+
+ </div>
+
+ <div class="example">
+
+ <p>When two peers decide they are going to set up a connection to
+ each other, they both go through these steps. The STUN/TURN server
+ configuration describes a server they can use to get things like
+ their public IP address or to set up NAT traversal. They also have
+ to send data for the signaling channel to each other using the same
+ out-of-band mechanism they used to establish that they were going
+ to communicate in the first place.</p>
+
+ <pre>// the first argument describes the STUN/TURN server configuration
+var local = new PeerConnection('TURNS example.net', sendSignalingChannel);
+local.signalingChannel(...); // if we have a message from the other side, pass it along here
+
+// (aLocalStream is some GeneratedStream object)
+local.addStream(aLocalStream); // start sending video
+
+function sendSignalingChannel(message) {
+ ... // send message to the other side via the signaling channel
+}
+
+function receiveSignalingChannel (message) {
+ // call this whenever we get a message on the signaling channel
+ local.signalingChannel(message);
+}
+
+local.onaddstream = function (event) {
+ // (videoElement is some <video> element)
+ videoElement.src = URL.getObjectURL(event.stream);
+};</pre>
+
+ </div>
+
+ <p class="warning">To prevent network sniffing from allowing a
+ fourth party to establish a connection to a peer using the
+ information sent out-of-band to the other peer and thus spoofing the
+ client, the configuration information should always be transmitted
+ using an encrypted connection.</p>
+
+
+
+ <h4>The data stream</h4>
+
+ <p>All <code>PeerConnection</code> connections include a <dfn>data
+ UDP media stream</dfn>, which is used to send data packets
+ peer-to-peer, for instance game control packets. This data channel
+ is unreliable (packets are not guaranteed to be delivered, and are
+ not guaranteed to be delivered in the right order).</p>
+
+ <p>All SDP media descriptions for <span title="data UDP media
+ stream">data UDP media streams</span> must include a label attribute
+ ("<code title="">a=label:</code>") whose value is the string "<code
+ title="">data</code>". <a href="#refsSDP">[SDP]</a> <a
+ href="#refsSDPLABEL">[SDPLABEL]</a></p>
+
+ <p>All SDP media descriptions for <span title="data UDP media
+ stream">data UDP media streams</span> must also include a key field
+ ("<code title="">k=</code>"), with the value being a base64-encoded
+ representation of 16 cryptographically random bytes determined on a
+ per-ICE-Agent basis. <a href="#refsSDP">[SDP]</a></p>
+
+ <p><span title="PeerConnection ICE
+ Agent"><code>PeerConnection</code> ICE Agents</span> must attempt to
+ establish a connection for their <span><code>PeerConnection</code>
+ data UDP media stream</span> during the initial offer/answer
+ exchange, and must maintain that UDP media stream for the ICE
+ Agents' whole lifetime.</p>
+
+ <p>A <span>data UDP media stream</span> is an <dfn>active data UDP
+ media stream</dfn> if the <span><code>PeerConnection</code> ICE
+ Agent</span> has selected a destination for it. A <span>data UDP
+ media stream</span> can change active status many times during the
+ lifetime of its <code>PeerConnection</code> object (e.g. any time
+ the network topology changes and the ICE Agent performs an ICE
+ Restart). <a href="#refsICE">[ICE]</a></p>
+
+ <p>Bytes transmitted on a <span>data UDP media stream</span> are
+ masked so as to prevent cross-protocol attacks (<span>data UDP media
+ stream</span> always appear to contain random noise to other
+ protocols). For the purposes of masking, the <dfn>data UDP media
+ stream salt</dfn> is defined to be the following 16 bytes, described
+ here as hexadecimal numbers: DB 68 B5 FD 17 0E 15 77 56 AF 7A 3A 1A
+ 57 75 02</p> <!-- obtained thusly: head -c 16 /dev/urandom |
+ hexdump -C -->
+
+ <p>When the user agent is to <dfn>transmit a data packet to a
+ peer</dfn> using a <span>data UDP media stream</span> and with a
+ byte string payload <var title="">data</var>, the user agent must
+ run the following steps:</p>
+
+ <ol>
+
+ <li><p>Let <var title="">nonce</var> be 16 cryptographically random
+ bytes.</p></li>
+
+ <li><p>Let <var title="">ice-key</var> be the 16 bytes given as the
+ encryption key for the <span>data UDP media stream</span> in its
+ media description, as defined above.</p></li>
+
+ <li><p>Let <var title="">key</var> be the first 16 bytes of the
+ HMAC-SHA1 of the 16 <var title="">nonce</var> bytes concatenated
+ with the 16 <var title="">ice-key</var> bytes concatenated with the
+ 16 <span>data UDP media stream salt</span> bytes. <a
+ href="#refsHMAC">[HMAC]</a> <a href="#refsSHA1">[SHA1]</a></p></li>
+
+ <li><p>Let <var title="">message</var> be a 0x01 byte followed by
+ <var title="">data</var>.</p></li>
+
+ <li><p>Let <var title="">masked message</var> be the result of
+ encrypting <var title="">message</var> using AES-128-CTR keyed with
+ <var title="">key</var>. <a
+ href="#refsAES128CTR">[AES128CTR]</a></p></li>
+
+ <li><p>Send the concatenation of <var title="">nonce</var> and <var
+ title="">masked message</var> in a UDP packet to the destination
+ that the relevant <span><code>PeerConnection</code> ICE
+ Agent</span> has selected a destination for the <span>data UDP
+ media stream</span>.</p></li>
+
+ </ol>
+
+ <p>A <dfn>remote data UDP media stream</dfn> is the first UDP media
+ stream whose sender is the remote peer, whose label attribute
+ ("<code title="">a=label:</code>") has the value "<code
+ title="">data</code>", and for which a
+ <span><code>PeerConnection</code> ICE Agent</span> has selected a
+ destination, if that media stream has an encryption key advertised
+ in its media description, and if that encryption key is 16 bytes
+ long. A <span>remote data UDP media stream</span> is associated with
+ the <code>PeerConnection</code> object for which the
+ <span><code>PeerConnection</code> ICE Agent</span> in question is
+ operating.</p>
+
+ <p>When a packet from a <span>remote data UDP media stream</span> is
+ received, the user agent must run the following steps:</p>
+
+ <ol>
+
+ <li><p>Let <var title="">data</var> be the UDP packet's data.</p></li>
+
+ <li><p>If <var title="">data</var> is shorter than 17 bytes, then
+ abort these steps.</p></li>
+
+ <li><p>Let <var title="">nonce</var> be the first 16 bytes of the
+ <var title="">data</var>.</p></li>
+
+ <li><p>Let <var title="">ice-key</var> be the 16 bytes given as the
+ encryption key for the <span>remote data UDP media stream</span> in
+ the media description for this media stream. <a
+ href="#refsSDP">[SDP]</a></p></li>
+
+ <li><p>Let <var title="">key</var> be the first 16 bytes of the
+ HMAC-SHA1 of the 16 <var title="">nonce</var> bytes concatenated
+ with the 16 <var title="">ice-key</var> bytes concatenated with the
+ 16 <span>data UDP media stream salt</span> bytes. <a
+ href="#refsHMAC">[HMAC]</a> <a href="#refsSHA1">[SHA1]</a></li>
+
+ <li><p>Let <var title="">unmasked data</var> be the result of
+ decrypting <var title="">message</var> using AES-128-CTR keyed with
+ <var title="">key</var>. <a
+ href="#refsAES128CTR">[AES128CTR]</a></p></li>
+
+ <li><p>If the first byte of <var title="">unmasked data</var> is
+ not 0x01, then abort these steps.</p></li>
+
+ <li><p>Let <var title="">raw message</var> be the string consisting
+ of all but the first character of <var title="">unmasked
+ message</var>.</p></li>
+
+ <li><p>Let <var title="">message</var> be <var title="">raw
+ message</var> <span>decoded as UTF-8, with error
+ handling</span>.</p></li>
+
+ <li><p>Create an event that uses the <code>MessageEvent</code>
+ interface, with the name <code title="event-text">text</code>,
+ which does not bubble, is not cancelable, has no default action,
+ and has a <code title="dom-MessageEvent-data">data</code> attribute
+ whose value is <var title="">message</var>, and <span>queue a
+ task</span> to dispatch the event at the
+ <code>PeerConnection</code> object that the <span>remote data UDP
+ media stream</span> is associated with.</p></li>
+
+ </ol>
+
+
+ <h4>Event definitions</h4>
+
+ <p>The <code title="event-stream-addstream">addstream</code> and
+ <code title="event-stream-removestream">removestream</code> events
+ use the <code>StreamEvent</code> interface:</p>
+
+ <pre class="idl">interface <dfn>StreamEvent</dfn> : <span>Event</span> {
+ readonly attribute <span>Stream</span> <span title="dom-StreamEvent-stream">stream</span>;
+ void <span title="dom-CloseEvent-initCloseEvent">initCloseEvent</span>(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in <span>Stream</span> streamArg);
+};</pre>
+
+ <p>The <dfn
+ title="dom-StreamEvent-initStreamEvent"><code>initStreamEvent()</code></dfn>
+ method must initialize the event in a manner analogous to the
+ similarly-named method in the DOM Events interfaces. <a
+ href="#refsDOMEVENTS">[DOMEVENTS]</a></p>
+
+ <p>The <dfn title="dom-StreamEvent-stream"><code>stream</code></dfn>
+ attribute represents the <code>Stream</code> object associated with
+ the event.</p>
+
+ <p><dfn title="fire a stream event">Firing a stream event named <var
+ title="">e</var></dfn> with a <code>Stream</code> <var
+ title="">stream</var> means that an event with the name <var
+ title="">e</var>, which does not bubble (except where otherwise
+ stated) and is not cancelable (except where otherwise stated), and
+ which uses the <code>StreamEvent</code> interface with the <code
+ title="dom-StreamEvent-stream">stream</code> attribute set to <var
+ title="">stream</var>, must be dispatched at the given target.</p>
+
+
+ <h4>Event Summary</h4>
+
+ <p class="XXX">...will add event summary for streams here...</p>
+
+</div>
+
+<!--END html--><!--END dev-html-->
+
+
+
+
+
+
<div data-component="Web Workers (editor: Ian Hickson)">
<h2 id="workers">Web workers</h2>
@@ -81261,7 +82714,7 @@
<p>The bulk of this code is simply an unoptimized search for a prime
number. To send a message back to the page, the <code
- title="dom-DedicatedWorkerGlobalScope-postMessage">postMessage()</code>
+ title="dom-DedicatedWorkerGlobalScope-send">send()</code>
method is used to post a message when a prime is found.</p>
<p><a href="http://www.whatwg.org/demos/workers/primes/page.html">View this example online</a>.</p>
@@ -99096,7 +100549,7 @@
<hr>
<p>All animated images with the same <span>absolute URL</span> and
- the same image data are expected to be rendered synchronised to the
+ the same image data are expected to be rendered synchronized to the
same timeline as a group, with the timeline starting at the time of
the most recent addition to the group.</p>
@@ -106877,6 +108330,9 @@
href="http://tools.ietf.org/html/draft-holsten-about-uri-scheme">The
'about' URI scheme</a></cite>, J. Holsten, L. Hunt. IETF.</dd>
+ <dt id="refsAES128CTR">[AES128CTR]</dt>
+ <dd><cite><a href="http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf">Advanced Encryption Standard (AES)</a></cite>. NIST.</dd>
+
<dt id="refsARIA">[ARIA]</dt>
<dd><cite><a href="http://www.w3.org/WAI/PF/aria/">Accessible Rich
Internet Applications (WAI-ARIA)</a></cite>, J. Craig, M. Cooper, L. Pappas,
@@ -107110,6 +108566,9 @@
href="http://microformats.org/wiki/hatom">hAtom</a></cite>, D
Janes. Microformats.</dd>
+ <dt id="refsHMAC">[HMAC]</dt>
+ <dd><cite><a href="http://csrc.nist.gov/publications/fips/fips198/fips-198a.pdf">The Keyed-Hash Message Authentication Code (HMAC)</a></cite>. NIST.</dd>
+
<dt id="refsHTML4">[HTML4]</dt>
<dd>(Non-normative) <cite><a
href="http://www.w3.org/TR/html4/">HTML 4.01
@@ -107158,6 +108617,9 @@
href="http://www.iana.org/assignments/message-headers/perm-headers.html">Permanent
Message Header Field Names</a></cite>. IANA.</dd>
+ <dt id="refsICE">[ICE]</dt>
+ <dd><cite><a href="http://tools.ietf.org/html/rfc5245">Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal for Offer/Answer Protocols</a></cite>, J. Rosenberg. IETF.</dd>
+
<dt id="refsIEEE754">[IEEE754]</dt>
<dd><cite><a
href="http://ieeexplore.ieee.org/servlet/opac?punumber=4610933">IEEE
@@ -107463,12 +108925,24 @@
Compression Scheme For Unicode</a></cite>, M. Wolf, K. Whistler,
C. Wicksteed, M. Davis, A. Freytag, M. Scherer. Unicode Consortium.</dd>
+ <dt id="refsSDP">[SDP]</dt>
+ <dd><cite><a href="http://tools.ietf.org/html/rfc4566">SDP: Session Description Protocol</a></cite>, M. Handley, V. Jacobson, C. Perkins. IETF.</dd>
+
+ <dt id="refsSDPLABEL">[SDPLABEL]</dt>
+ <dd><cite><a href="http://tools.ietf.org/html/rfc4574">The Session Description Protocol (SDP) Label Attribute</a></cite>, O. Levin, G. Camarillo. IETF.</dd>
+
+ <dt id="refsSDPOFFERANSWER">[SDPOFFERANSWER]</dt>
+ <dd><cite><a href="http://tools.ietf.org/html/rfc3264">An Offer/Answer Model with the Session Description Protocol (SDP)</a></cite>, J. Rosenberg, H. Schulzrinne. IETF.</dd>
+
<dt id="refsSELECTORS">[SELECTORS]</dt>
<dd><cite><a
href="http://www.w3.org/TR/css3-selectors">Selectors</a></cite>,
T. Çelik, E. Etemad, D. Glazman, I. Hickson, P. Linss,
J. Williams. W3C.</dd>
+ <dt id="refsSHA1">[SHA1]</dt>
+ <dd><cite><a href="http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf">Secure Hash Standard</a></cite>. NIST.</dd>
+
<dt id="refsSHIFTJIS">[SHIFTJIS]</dt>
<dd><cite>JIS X0208: 7-bit and 8-bit double byte coded KANJI sets
for information interchange</cite>. Japanese Industrial Standards Committee.</dd>
@@ -107480,6 +108954,9 @@
and management — Part 2-1: Colour management — Default RGB colour
space — sRGB</a></cite>. IEC.</dd>
+ <dt id="refsSTUN">[STUN]</dt>
+ <dd><cite><a href="http://tools.ietf.org/html/rfc5389">Session Traversal Utilities for NAT (STUN)</a></cite>, J. Rosenberg, R. Mahy, P. Matthews, D. Wing. IETF.</dd>
+
<dt id="refsSVG">[SVG]</dt>
<dd><cite><a href="http://www.w3.org/TR/SVGTiny12/">Scalable Vector
Graphics (SVG) Tiny 1.2 Specification</a></cite>, O. Andersson,
@@ -107495,6 +108972,9 @@
Ministry of Industry, Royal Thai Government. ISBN
974-606-153-4.</dd>
+ <dt id="refsTURN">[TURN]</dt>
+ <dd><cite><a href="http://tools.ietf.org/html/rfc5766">Traversal Using Relays around NAT (TURN): Relay Extensions to Session Traversal Utilities for NAT (STUN)</a></cite>, R. Mahy, P. Matthews, J. Rosenberg. IETF.</dd>
+
<dt id="refsUAAG">[UAAG]</dt>
<dd>(Non-normative) <cite><a
href="http://www.w3.org/TR/UAAG20/">Web Content Accessibility
More information about the Commit-Watchers
mailing list