Updated candidate FPWD
authorAdrian Bateman <adrianba@microsoft.com>
Sat, 04 May 2013 14:31:16 -0700
changeset 111 8bf3e9ae4112
parent 110 29422cdbc179
child 112 9ff5e42736b6
Updated candidate FPWD
encrypted-media/encrypted-media-fpwd.html
encrypted-media/encrypted-media.html
encrypted-media/encrypted-media.xml
--- a/encrypted-media/encrypted-media-fpwd.html	Fri May 03 08:50:35 2013 -0700
+++ b/encrypted-media/encrypted-media-fpwd.html	Sat May 04 14:31:16 2013 -0700
@@ -4,7 +4,6 @@
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     <title>Encrypted Media Extensions</title>
     <link rel="stylesheet" href="video-working-draft.css">
-    <link rel="stylesheet" type="text/css" href="http://www.w3.org/StyleSheets/TR/W3C-WD">
     <style type="text/css">
       div.nonnormative { color: green; margin: 2em 0 2em 0em; padding: 0.5em 1em; border: none; background: #DDFFDD; }
       .nonnormative:before { display: table; margin: -1em -0.5em -0.5em auto; width: auto; content: 'This section is non-normative.'; color: black; font-style: italic; border: solid 2px; background: white; padding: 0 0.25em; }
@@ -14,15 +13,16 @@
       .non-normative em { font-style: normal;}
       .non-normative var { font-style: normal;}
     </style>
+    <link rel="stylesheet" type="text/css" href="http://www.w3.org/StyleSheets/TR/W3C-WD">
   </head>
   <body>
     <div class="head">
       <p><a href="http://www.w3.org/"><img src="http://www.w3.org/Icons/w3c_home" alt="W3C" width="72" height="48"></a></p>
       <h1>Encrypted Media Extensions</h1>
-      <h2 id="draft-date">W3C Working Draft 5 February 2013</h2>
+      <h2 id="draft-date">W3C Working Draft 9 May 2013</h2>
       <dl>
         <dt>This Version:</dt>
-        <dd><a href="http://www.w3.org/TR/2013/WD-encrypted-media-20130124/">http://www.w3.org/TR/2013/WD-encrypted-media-20130124/</a></dd>
+        <dd><a href="http://www.w3.org/TR/2013/WD-encrypted-media-20130509/">http://www.w3.org/TR/2013/WD-encrypted-media-20130509/</a></dd>
         <dt>Latest Published Version:</dt>
         <dd><a href="http://www.w3.org/TR/encrypted-media/">http://www.w3.org/TR/encrypted-media/</a></dd>
         <dt>Latest editor's draft:</dt>
@@ -53,7 +53,6 @@
     <p>This specification does not define a content protection or Digital Rights Management system. Rather, it defines a common API that may be used to discover, select and interact with
     such systems as well as with simpler content encryption systems. Implementation of Digital Rights Management is not required for compliance with this specification: only the simple
     clear key system is required to be implemented as a common baseline.</p>
-    <p class="non-normative">Note: It is an open issue whether and how the spec should do more to encourage/ensure CDM-level interop. See <a href="https://www.w3.org/Bugs/Public/show_bug.cgi?id=20944">Bug 20944</a>.</p>
     <p>The common API supports a simple set of content encryption capabilities, leaving application functions such as authentication and authorization to page authors. This is achieved by
     requiring content protection system-specific messaging to be mediated by the page rather than assuming out-of-band communication between the encryption system and a license
     or other server.</p>
@@ -79,6 +78,8 @@
       Publication as an Editor's Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated,
       replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.
     </p>
+    <p class="non-normative">Note: It is an open issue whether and how the spec should do more to encourage/ensure CDM-level interop. See <a href="https://www.w3.org/Bugs/Public/show_bug.cgi?id=20944">Bug 20944</a>.</p>
+    <p class="non-normative">Note: It is an open issue whether and how the spec should provide privacy guidance for CDM implementations. See <a href="https://www.w3.org/Bugs/Public/show_bug.cgi?id=20965">Bug 20965</a> and <a href="https://www.w3.org/Bugs/Public/show_bug.cgi?id=20966">Bug 20966</a>.</p>
     <p>
       This document was produced by a group operating under the <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/">5 February 2004 W3C Patent Policy</a>.
       W3C maintains a <a href="http://www.w3.org/2004/01/pp-impl/40318/status" rel="disclosure">public list of any patent disclosures</a> made in connection with
@@ -109,7 +110,7 @@
       <li><a href="#algorithms">5. Algorithms</a></li>
         <li><ul style="list-style-type:none">
           <li><a href="#algorithms-enrypted-block">5.1. Encrypted Block Encountered</a></li>
-          <li><a href="#algorithms-encrypted-stream">5.2. Potentially Encrypted Stream Encountered</a></li>
+          <li><a href="#algorithms-encrypted-stream">5.2. First Time a Key Reference is Encountered</a></li>
           <li><a href="#algorithms-load">5.3. Addition to Media Element Load Algorithm</a></li>
         </ul></li>
       <li><a href="#simple-decryption">6. Simple Decryption</a></li>
@@ -350,7 +351,7 @@
               <ol>
                 <li>
 <p>Let <var title="true">key request</var> be a key request generated by the <a href="#cdm">CDM</a> using <var title="true">initData</var>, if provided.</p>
-                  <p>Note: <var title="true">cdm</var> must not use any data, including <a href="http://www.w3.org/TR/html5/embedded-content-0.html#media-data">media data</a>, not provided via <var title="true">initData</var>.</p>
+                  <p>Note: <var title="true">cdm</var> must not use any stream-specific data, including <a href="http://www.w3.org/TR/html5/embedded-content-0.html#media-data">media data</a>, not provided via <var title="true">initData</var>.</p>
                   <p class="non-normative"><var title="true">type</var> may be used to determine how to interpret <var title="true">initData</var>.</p>
                 </li>
                 <li><p>If <var title="true">initData</var> is not null and contains a default URL for <var title="true">keySystem</var>, let <var title="true">defaultURL</var> be that URL.</p></li> 
@@ -437,29 +438,13 @@
               <li>
 <p>For each <var title="true">individual key</var> in <var title="true">key</var>, store the <var title="true">individual key</var>.</p>
                 <ol>
-                  <li><p>Let <var title="true">key ID</var> be null.</p></li>
-                  <li><p>If there is a key ID associated with the <var title="true">individual key</var>, let <var title="true">key ID</var> be that ID.</p></li>
+                  <li><p>Let <var title="true">key ID</var> be the key ID associated with the <var title="true">individual key</var>.</p></li>
                   <li>
 <p>Store the <var title="true">individual key</var> by following the steps for the first matching condition from the following list:</p>  
-                    <dl class="switch">
-                      <dt>If <var title="true">key ID</var> is not null</dt>
-                      <dd>
-                        <ol>
-                          <li><p>Clear any stored key not associated with a key ID.</p></li>
-                          <li><p>If a stored key already exists for <var title="true">key ID</var>, delete that key.</p></li>
-                          <li><p>Store the <var title="true">individual key</var>, license, and/or license information indexed by <var title="true">key ID</var>. <span class="non-normative">The replacement algorithm is <a href="#key-system">Key System</a>-dependent.</span></p></li>
-                        </ol>
-                      </dd>
-                      <dt>Otherwise</dt>
-                      <dd>
-                        <ol>
-                          <li><p>Clear all stored keys.</p></li>
-                          <li><p>Store the <var title="true">individual key</var>, license, and/or license information with no associated key ID.</p></li>
-                        </ol>
-                      </dd>
-                    </dl>
-                    <p class="non-normative">At most one key may be stored if key IDs are not used.</p>
-                    <p class="non-normative">Clearing keys avoids needing to handle a mixture of keys with and without IDs in the <a href="#algorithms-enrypted-block">Encrypted Block Encountered algorithm</a>.</p>
+                    <ol>
+                      <li><p>If a stored key already exists for <var title="true">key ID</var>, delete that key.</p></li>
+                      <li><p>Store the <var title="true">individual key</var>, license, and/or license information indexed by <var title="true">key ID</var>. <span class="non-normative">The replacement algorithm is <a href="#key-system">Key System</a>-dependent.</span></p></li>
+                    </ol>
                     <p class="non-normative">Note: It is recommended that CDMs support a standard and reasonably high minimum number of cached keys/licenses (with IDs) per <code><a href="#dom-mediakeysession">MediaKeySession</a></code> object as well as a standard replacement algorithm.
                     This enables a reasonable number of key rotation algorithms to be implemented across user agents and may reduce the likelihood of playback interruptions in use cases that involve various streams in the same element (i.e. adaptive streams, various audio and video tracks) using different keys.
                     </p>
@@ -748,9 +733,7 @@
 
     <ol>
       <li><p>Let <var title="">cdm</var> be null.</p></li>
-      <li><p>Let <var title="">block initData</var> be null.</p></li>
       <li><p>Let <var title="">block key</var> be null.</p></li>
-      <li><p>If the block (or its parent entity) has <a href="#initialization-data">Initialization Data</a>, let <var title="">block initData</var> be that initialization data.</p></li>
       <li>
 <p>Determine whether there is an active <a href="#cdm">CDM</a> by following the steps for the first matching condition from the following list:</p>
       <dl class="switch">
@@ -763,40 +746,8 @@
       <li>
 <p>Use <var title="true">cdm</var> to select the key:</p>
         <ol>
-          <li><p>Let <var title="">block key ID</var> be null.</p></li>
-          <li><p>If <var title="">block initData</var> is not null and contains a key ID, let <var title="">block key ID</var> be that ID.</p></li>
-          <li>
-<p>Select the key by following the steps for the first matching condition from the following list:</p>  
-          <dl class="switch">
-            <dt>If <var title="">block key ID</var> is not null</dt>
-            <dd>
-            <p>Select the key by using <var title="true">cdm</var> to follow the steps for the first matching condition from the following list:</p>
-            <dl class="switch">
-              <dt>If <var title="true">cdm</var>  has a key cached for <var title="">block key ID</var>
-</dt>
-              <dd>Let <var title="">block key</var> be the matching cached key.</dd>
-              <dt>If <var title="true">cdm</var> has a key cached with no ID <span class="non-normative">(there can be one at most)</span>
-</dt>
-              <dd>Let <var title="">block key</var> be the single cached key.</dd>
-              <dt>Otherwise (<var title="true">cdm</var> has no keys cached OR has one or more keys cached, none of which have a matching key ID)</dt>
-              <dd>Jump to the <i>Key Presence</i> step below.</dd>
-            </dl>
-            </dd>
-            <dt>Otherwise</dt>
-            <dd>
-            <p>Select the key by using <var title="true">cdm</var> to follow the steps for the first matching condition from the following list:</p>
-            <dl class="switch">
-              <dt>If <var title="true">cdm</var> has a single key cached (with or without a key ID)</dt>
-              <dd>Let <var title="">block key</var> be the single cached key.</dd>
-              <dt>If <var title="true">cdm</var> has more than one key cached <span class="non-normative">(all would have IDs)</span>
-</dt>
-              <dd>Abort media element's <a href="http://www.w3.org/TR/html5/embedded-content-0.html#concept-media-load-resource">resource fetch algorithm</a> and run the steps to report a <code><a href="#dom-media_err_encrypted">MEDIA_ERR_ENCRYPTED</a></code> error.</dd>
-              <dt>Otherwise</dt>
-              <dd>Jump to the <i>Key Presence</i> step below.</dd>
-            </dl>
-            </dd>
-          </dl>
-          </li>
+          <li><p>Let <var title="">block key ID</var> be be the key ID for the current block.</p></li>
+          <li><p>If <var title="true">cdm</var> has a key cached for <var title="">block key ID</var>, let <var title="">block key</var> be the matching cached key.</p></li>
         </ol>
       </li>
       <li>
@@ -815,11 +766,7 @@
         <dt>If there is an event handler for <code><a href="#dom-needkey">needkey</a></code>
 </dt>
         <dd>
-        <a href="http://www.w3.org/TR/html5/webappapis.html#queue-a-task">queue a task</a> to <a href="http://www.w3.org/TR/html5/webappapis.html#fire-a-simple-event">fire a simple event</a> named <code><a href="#dom-needkey">needkey</a></code> at the <a href="#media-element">media element</a>.
-        <p>The event is of type <code><a href="#dom-mediakeyneededevent">MediaKeyNeededEvent</a></code> and has:</p>
-        <ul style="list-style-type:none"><li>
-          <code><a href="#dom-initdata">initData</a></code> = <var title="">block initData</var>
-        </li></ul>
+        <p>Take no action.</p>
         <p class="non-normative">The <a href="#media-element">media element</a> is said to be <code><a href="http://www.w3.org/TR/html5/embedded-content-0.html#potentially-playing">potentially playing</a></code>
         unless playback stops because the stream cannot be decrypted, in which case the <a href="#media-element">media element</a> is said to be <a href="#waiting-for-a-key">waiting for a key</a>.
         </p>
@@ -857,7 +804,7 @@
     <li class="non-normative">The media element leaves this state when seeking but could re-enter it if the same conditions exist.</li>
     </ul>
 
-    <h3 id="algorithms-encrypted-stream">5.2. Potentially Encrypted Stream Encountered</h3>
+    <h3 id="algorithms-encrypted-stream">5.2. First Time a Key Reference is Encountered</h3>
     <p>The following steps are run when the <a href="#media-element">media element</a> encounters a source that may contain encrypted blocks or streams during the <a href="http://www.w3.org/TR/html5/embedded-content-0.html#concept-media-load-resource">resource fetch algorithm</a>:</p>
 
     <ol>
@@ -996,7 +943,7 @@
       In the latter case, a subset of the blocks within a Track containing a <a href="http://matroska.org/technical/specs/index.html#ContentEncryption">ContentEncryption</a> element are marked as encrypted.</p>
 
       <h4 id="webm-detect-encrypt">7.1.2. Detecting Encryption</h4>
-      <p>When a WebM <a href="http://matroska.org/technical/specs/index.html#LevelTrack">Track</a> is parsed, the presence of a <a href="http://matroska.org/technical/specs/index.html#ContentEncKeyID">ContentEncKeyID</a> element shall indicate that the stream is <a href="#algorithms-encrypted-stream">potentially encrypted</a>.</p>
+      <p>When a WebM <a href="http://matroska.org/technical/specs/index.html#LevelTrack">Track</a> is parsed, the presence of a <a href="http://matroska.org/technical/specs/index.html#ContentEncKeyID">ContentEncKeyID</a> element shall indicate that the stream is potentially encrypted. Each time a new value is encountered in a ContentEncKeyID element, the <a href="#algorithms-encrypted-stream">First Time a Key Reference is Encountered</a> algorithm shall be invoked with the value in that element as <var title="">initData</var>.</p>
 
       <p><a href="#algorithms-enrypted-block">Encrypted blocks</a> are those marked encrypted by the <a href="http://wiki.webmproject.org/encryption/webm-encryption-rfc#TOC-4.6-Signal-Byte-Format">Signal Byte.</a></p>
 
@@ -1060,7 +1007,7 @@
     if (!keySession)
       throw "Could not create key session";
 
-    keySession.on<a href="#dom-keymessage">keymessage</a>="handleMessage(event)";
+    keySession.addEventListener("<a href="#dom-keymessage">keymessage</a>",handleMessage,false);
   }
 
   function handleMessage(event) {
@@ -1080,8 +1027,6 @@
     <p class="exampledescription">In this case, the <a href="#initialization-data">Initialization Data</a> is contained in the <a href="http://www.w3.org/TR/html5/embedded-content-0.html#media-data">media data</a>.
     If this was not the case, <code>handleKeyNeeded()</code> could obtain and provide it instead of getting it from the event.</p>
 
-    <p class="exampledescription">If any asynchronous operation is required to get the key in <code>handleKeyNeeded()</code>, it could be called a second time if the stream is detected as potentially encrypted before an encrypted block/frame is encountered. In this case, applications may want to handle subsequent calls specially to avoid redundant license requests. This is not shown in the examples below.</p>
-
     <h4 id="example-clear-key" class="exampleheader">8.2.1. Clear Key Encryption</h4>
     <p class="exampledescription">This solution uses the <a href="#simple-decryption-clear-key">Clear Key</a> <a href="#simple-decryption">Simple Decryption</a>.</p>
     <p class="exampledescription">As with the previous example, this one is very simple because it does not care when the key has been added or handle errors.</p>
@@ -1102,7 +1047,7 @@
     if (!keySession)
       throw "Could not create key session";
 
-    keySession.on<a href="#dom-keymessage">keymessage</a>="handleMessage(event)";
+    keySession.addEventListener("<a href="#dom-keymessage">keymessage</a>",handleMessage,false);
   }
 
   function handleMessage(event) {
@@ -1110,10 +1055,14 @@
     var message = event.<a href="#dom-message">message</a>;
 
     var xmlhttp = new XMLHttpRequest();
-    xmlhttp.open("POST", "http://.../getkey", false);
+    xmlhttp.open("POST", "http://.../getkey");
+    xmlhttp.onreadystatechange = function() {
+      if(xmlhttp.readyState==4) {
+        var key = new Uint8Array(xmlhttp.response);
+        keySession.<a href="#dom-update">update</a>(key);
+      }
+    }
     xmlhttp.send(message);
-    var key = new Uint8Array(xmlhttp.response);
-    keySession.<a href="#dom-update">update</a>(key);
   }
 &lt;/script&gt;
 
@@ -1139,7 +1088,7 @@
     if (!keySession)
       throw "Could not create key session";
 
-    keySession.on<a href="#dom-keymessage">keymessage</a>="licenseRequestReady(event)";
+    keySession.addEventListener("<a href="#dom-keymessage">keymessage</a>",licenseRequestReady,false);
   }
 
   function licenseRequestReady(event) {
@@ -1149,10 +1098,14 @@
       throw "Could not create license request";
 
     var xmlhttp = new XMLHttpRequest();
-    xmlhttp.open("POST", "http://.../getkey", false);
+    xmlhttp.open("POST", "http://.../getkey");
+    xmlhttp.onreadystatechange = function() {
+      if(xmlhttp.readyState==4) {
+        var license = new Uint8Array(xmlhttp.response);
+        keySession.<a href="#dom-update">update</a>(license);
+      }
+    }
     xmlhttp.send(request);
-    var license = new Uint8Array(xmlhttp.response);
-    keySession.<a href="#dom-update">update</a>(license);
   }
 &lt;/script&gt;
 
@@ -1200,7 +1153,7 @@
     if (!keySession)
       throw "Could not create key session";
 
-    keySession.on<a href="#dom-keymessage">keymessage</a>="licenseRequestReady(event)";
+    keySession.addEventListener("<a href="#dom-keymessage">keymessage</a>",licenseRequestReady,false);
   }
   
   function licenseRequestReady(event) {
@@ -1210,10 +1163,14 @@
       throw "Could not create license request";
 
     var xmlhttp = new XMLHttpRequest();
-    xmlhttp.open("POST", licenseUrl, false);
+    xmlhttp.open("POST", licenseUrl);
+    xmlhttp.onreadystatechange = function() {
+      if(xmlhttp.readyState==4) {
+        var license = new Uint8Array(xmlhttp.response);
+        keySession.<a href="#dom-update">update</a>(license);
+      }
+    }
     xmlhttp.send(request);
-    var license = new Uint8Array(xmlhttp.response);
-    keySession.<a href="#dom-update">update</a>(license);
   }
 &lt;/script&gt;
 
@@ -1239,7 +1196,7 @@
     xmlhttp = new XMLHttpRequest();
     xmlhttp.keySession = keySession;
     xmlhttp.onreadystatechange = handleMessageResponse;
-    xmlhttp.open("POST", licenseUrl, true);
+    xmlhttp.open("POST", licenseUrl);
     xmlhttp.send(message);
   }
 
@@ -1276,9 +1233,9 @@
     if (!keySession)
       throw "Could not create key session";
 
-    keySession.on<a href="#dom-keymessage">keymessage</a>="handleKeyMessage(event)";
-    keySession.on<a href="#dom-keyadded">keyadded</a>="handleKeyComplete(event)";
-    keySession.on<a href="#dom-keyerror">keyerror</a>="handleKeyError(event)";
+    keySession.addEventListener("<a href="#dom-keymessage">keymessage</a>",handleKeyMessage,false);
+    keySession.addEventListener("<a href="#dom-keyadded">keyadded</a>",handleKeyComplete,false);
+    keySession.addEventListener("<a href="#dom-keyerror">keyerror</a>",handleKeyError,false);
   }
 &lt;/script&gt;
 
@@ -1306,9 +1263,6 @@
     <h4 id="faq-key-rotation" class="faqquestion">Is key rotation supported?</h4>
     <p class="faqanswer">Yes.</p>
 
-    <h4 id="faq-encrypt-captions" class="faqquestion">Can I encrypt captions / &lt;track&gt; elements?</h4>
-    <p class="faqanswer">No, this proposal only supports decrypting audio and video that are part of the <a href="http://www.w3.org/TR/html5/embedded-content-0.html#media-data">media data</a>.</p>
-
     <h4 id="sourceelement" class="faqquestion">Can I let the user agent select the appropriate CDM using <code>&lt;source&gt;</code> elements?</h4>
     <p class="faqanswer">Yes, using the <code><a href="#dom-sourcekeysystem">keySystem</a></code> attribute of the <code><a href="#dom-htmlsourceelement">HTMLSourceElement</a></code>.
     When used with <code><a href="http://www.w3.org/TR/html5/embedded-content-0.html#attr-source-type">type</a></code> attribute, this will select the first <code>&lt;source&gt;</code> element (container, codec, and <a href="#key-system">Key System</a>) that the user agent might support.
@@ -1393,17 +1347,12 @@
     <p class="faqanswer">Without a new error code (<code><a href="#dom-media_err_encrypted">MEDIA_ERR_ENCRYPTED</a></code>), it is not possible for user agents to clearly indicate to an application that playback failed because the content was encrypted and user agents will likely need to fire a <code>MEDIA_ERR_DECODE</code> or <code>MEDIA_ERR_SRC_NOT_SUPPORTED</code>, which would be confusing.</p>
 
     <h4 id="faq-error-break-apps" class="faqquestion">Will adding a new error code to <code><a href="#dom-mediaerror">MediaError</a></code> break existing applications?</h4>
-    <p class="faqanswer">Applications that are not aware of the new error code (<code><a href="#dom-media_err_encrypted">MEDIA_ERR_ENCRYPTED</a></code>) may not correctly handle it, but they should still be able to detect that an error has occurred because a) an error event is fired and b) <var title="">media</var> . <code title="dom-media-error"><code><a href="http://www.w3.org/TR/html5/embedded-content-0.html#mediaerror">error</a></code></code> is not null.</p>
+    <p class="faqanswer">Applications that are not aware of the new error code (<code><a href="#dom-media_err_encrypted">MEDIA_ERR_ENCRYPTED</a></code>) may not correctly handle it, but they should still be able to detect that an error has occurred because a) an error event is fired and b) <var title="">media</var>. <code title="dom-media-error"><code><a href="http://www.w3.org/TR/html5/embedded-content-0.html#mediaerror">error</a></code></code> is not null.</p>
 
-    <h4 id="faq-response-needkey" class="faqquestion">What happens if a response to the <code><a href="#dom-needkey">needkey</a></code> event from a <a href="#algorithms-encrypted-stream">encountering a potentially encrypted stream</a> is not received before <a href="#algorithms-enrypted-block">encountering an encrypted block</a>?</h4>
-    <p class="faqanswer">The <a href="#algorithms-enrypted-block">Encrypted Block Encountered algorithm</a> will proceed as normal.
-    If no appropriate key has been provided, a second <code><a href="#dom-needkey">needkey</a></code> event will be fired and decoding will stop.
-    </p>
+    <h4 id="faq-response-needkey" class="faqquestion">What happens if a response to the <code><a href="#dom-needkey">needkey</a></code> event from the <a href="#algorithms-encrypted-stream">First Time a Key Reference is Encountered</a> is not received before <a href="#algorithms-enrypted-block">encountering an encrypted block</a>?</h4>
+    <p class="faqanswer">The <a href="#algorithms-enrypted-block">Encrypted Block Encountered algorithm</a> will proceed as normal.</p>
 
-    <h4 id="faq-same-needkey" class="faqquestion">The same <code><a href="#dom-needkey">needkey</a></code> event with the same attributes is fired for both <a href="#algorithms-enrypted-block">Encrypted Block Encountered</a> and <a href="#algorithms-encrypted-stream">Potentially Encrypted Stream Encountered</a>. How can an application distinguish between the two?</h4>
-    <p class="faqanswer">The same event was used intentionally to reduce the complexity of applications. Ideally, they would not need to know.</p>
-
-    <h4 id="faq-same-initdata-update" class="faqquestion">What if a key/license for the same <a href="#initialization-data">Initialization Data</a> (i.e. key ID) is provided more than once to <code><a href="#dom-update">update()</a></code>?</h4>
+    <h4 id="faq-same-initdata-update" class="faqquestion">What if a key/license for the same key ID is provided more than once to <code><a href="#dom-update">update()</a></code>?</h4>
     <p class="faqanswer">The CDM will replace previous entries, updating the overall key ordering to reflect that this key ID was most recently added.
     In other words, simply replacing the existing key data is not sufficient.
     The exact algorithm is covered in <code><a href="#dom-update">update()</a></code>.
@@ -1419,13 +1368,7 @@
     <p class="faqanswer">The application must use <code><a href="#dom-update">update()</a></code> to indicate the stream is encrypted and provide the key before decoding starts.</p>
 
     <h4 id="faq-must-init-data" class="faqquestion">Must the container provide Initialization Data or a content key ID?</h4>
-    <p class="faqanswer">This is ideal, but the API would also support the application sending the <a href="#initialization-data">Initialization Data</a> or ID directly to the server or providing it to the <a href="#cdm">CDM</a> via <code><a href="#dom-createsession">createSession()</a></code>.</p>
-
-    <h4 id="faq-not-support-ids" class="faqquestion">What if a container/codec does not support key IDs or bit(s)?</h4>
-    <p class="faqanswer">The application will need to use some other mechanism to select the appropriate key for the content.
-    The user agent will only be able to use one key at a time.
-    <a href="#faq-key-rotation">Key rotation</a> will be much more complex or impossible.
-    </p>
+    <p class="faqanswer">Yes.</p>
 
     <h4 id="faq-adaptive-streaming-multiple-keys" class="faqquestion">Can I use different keys for each stream (<a href="#faq-adaptive-streaming">adaptive streaming</a>)?</h4>
     <p class="faqanswer">Yes, though you may want to consider the complexity and performance drawbacks. For the best user experience, you will want to provide keys for the streams to the user agent before the switch.</p>
@@ -1471,6 +1414,10 @@
       </thead>
       <tbody>
         <tr>
+          <td>4 May 2013</td>
+          <td>Produced updated candidate FPWD.</td>
+        </tr>
+        <tr>
           <td>14 January 2013</td>
           <td>Produced candidate FPWD.</td>
         </tr>
--- a/encrypted-media/encrypted-media.html	Fri May 03 08:50:35 2013 -0700
+++ b/encrypted-media/encrypted-media.html	Sat May 04 14:31:16 2013 -0700
@@ -19,7 +19,7 @@
     <div class="head">
       <p><a href="http://www.w3.org/"><img src="http://www.w3.org/Icons/w3c_home" alt="W3C" width="72" height="48"></a></p>
       <h1>Encrypted Media Extensions</h1>
-      <h2 id="draft-date">W3C Editor's Draft 30 April 2013</h2>
+      <h2 id="draft-date">W3C Editor's Draft 4 May 2013</h2>
       <dl>
         <dt>This Version:</dt>
         <dd><a href="http://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/encrypted-media.html">http://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/encrypted-media.html</a></dd>
@@ -1414,6 +1414,10 @@
       </thead>
       <tbody>
         <tr>
+          <td>4 May 2013</td>
+          <td>Produced updated candidate FPWD.</td>
+        </tr>
+        <tr>
           <td>14 January 2013</td>
           <td>Produced candidate FPWD.</td>
         </tr>
--- a/encrypted-media/encrypted-media.xml	Fri May 03 08:50:35 2013 -0700
+++ b/encrypted-media/encrypted-media.xml	Sat May 04 14:31:16 2013 -0700
@@ -18,7 +18,7 @@
     <div class="head">
       <p><a href="http://www.w3.org/"><img src="http://www.w3.org/Icons/w3c_home" alt="W3C" width="72" height="48" /></a></p>
       <h1>Encrypted Media Extensions</h1>
-      <h2 id="draft-date">W3C Editor's Draft 30 April 2013</h2>
+      <h2 id="draft-date">W3C Editor's Draft 4 May 2013</h2>
       <dl>
         <dt>This Version:</dt>
         <dd><a href="http://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/encrypted-media.html">http://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/encrypted-media.html</a></dd>
@@ -1363,6 +1363,10 @@
       </thead>
       <tbody>
         <tr>
+          <td>4 May 2013</td>
+          <td>Produced updated candidate FPWD.</td>
+        </tr>
+        <tr>
           <td>14 January 2013</td>
           <td>Produced candidate FPWD.</td>
         </tr>