[prev in list] [next in list] [prev in thread] [next in thread] 

List:       html5-commit-watchers
Subject:    [html5] r6273 - [giow] (1) add infrastructure to postMessage() to
From:       whatwg () whatwg ! org
Date:       2011-06-23 23:48:48
Message-ID: 20110623234848.20EEA11C7C00D () ps20323 ! dreamhostps ! com
[Download RAW message or body]

Author: ianh
Date: 2011-06-23 16:48:46 -0700 (Thu, 23 Jun 2011)
New Revision: 6273

Modified:
   complete.html
   index
   source
Log:
[giow] (1) add infrastructure to postMessage() to support ArrayBuffer cloning
Fixing http://www.w3.org/Bugs/Public/show_bug.cgi?id=12947

Modified: complete.html
===================================================================
--- complete.html	2011-06-21 23:30:59 UTC (rev 6272)
+++ complete.html	2011-06-23 23:48:46 UTC (rev 6273)
@@ -239,7 +239,7 @@
 
   <header class=head id=head><p><a class=logo href=http://www.whatwg.org/><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 &mdash; Last Updated 21 June 2011</h2>
+    <h2 class="no-num no-toc">Living Standard &mdash; Last Updated 23 June 2011</h2>
    </hgroup><dl><dt>Multiple-page version:</dt>
     <dd><a href=http://www.whatwg.org/specs/web-apps/current-work/complete/>http://www.whatwg.org/specs/web-apps/current-work/complete/</a></dd>
  <dt>One-page version:</dt>
@@ -377,12 +377,13 @@
        <li><a href=#htmlpropertiescollection-0><span class=secno>2.8.2.5 \
                </span>HTMLPropertiesCollection</a></ol></li>
      <li><a href=#domtokenlist-0><span class=secno>2.8.3 \
                </span>DOMTokenList</a></li>
      <li><a href=#domsettabletokenlist-0><span class=secno>2.8.4 \
                </span>DOMSettableTokenList</a></li>
-     <li><a href=#safe-passing-of-structured-data><span class=secno>2.8.5 \
                </span>Safe passing of structured data</a></li>
-     <li><a href=#domstringmap-0><span class=secno>2.8.6 \
                </span>DOMStringMap</a></li>
-     <li><a href=#domelementmap-0><span class=secno>2.8.7 \
                </span>DOMElementMap</a></li>
-     <li><a href=#dom-feature-strings><span class=secno>2.8.8 </span>DOM feature \
                strings</a></li>
-     <li><a href=#exceptions><span class=secno>2.8.9 </span>Exceptions</a></li>
-     <li><a href=#garbage-collection><span class=secno>2.8.10 </span>Garbage \
collection</a></ol></li> +     <li><a href=#transferable-objects><span \
class=secno>2.8.5 </span>Transferable objects</a></li> +     <li><a \
href=#safe-passing-of-structured-data><span class=secno>2.8.6 </span>Safe passing of \
structured data</a></li> +     <li><a href=#domstringmap-0><span class=secno>2.8.7 \
</span>DOMStringMap</a></li> +     <li><a href=#domelementmap-0><span \
class=secno>2.8.8 </span>DOMElementMap</a></li> +     <li><a \
href=#dom-feature-strings><span class=secno>2.8.9 </span>DOM feature strings</a></li> \
+     <li><a href=#exceptions><span class=secno>2.8.10 </span>Exceptions</a></li> +   \
<li><a href=#garbage-collection><span class=secno>2.8.11 </span>Garbage \
collection</a></ol></li>  <li><a href=#namespaces><span class=secno>2.9 \
</span>Namespaces</a></ol></li>  <li><a href=#dom><span class=secno>3 \
</span>Semantics, structure, and APIs of HTML documents</a>  <ol>
@@ -8630,23 +8631,61 @@
   </div>
 
 
+
+  <h4 id=transferable-objects><span class=secno>2.8.5 </span>Transferable \
objects</h4> +
+  <p>Some objects support being copied and closed in one operation.
+  This is called <i>transferring</i> the object, and is used in
+  particular to transfer ownership of unsharable or expensive
+  resources across worker boundaries.</p>
+
+  <pre class=idl>[NoInterfaceObject]
+interface <dfn id=transferable>Transferable</dfn> { };</pre>
+
   <div class=impl>
 
-  <h4 id=safe-passing-of-structured-data><span class=secno>2.8.5 </span>Safe passing \
of structured data</h4> +  <p>To <dfn id=transfer-a-transferable-object>transfer a \
<code>Transferable</code> object</dfn> to a +  new owner, the user agent must run the \
steps defined for the type of +  object in question. The steps will return a new \
object of the same +  type, and will permanently neuter the original object. (This is \
an +  irreversible and non-idempotent operation; once an object has been
+  transferred, it cannot be transferred, or indeed used, again.)</p>
 
+  </div>
+
+  <p>The following <code><a href=#transferable>Transferable</a></code> types \
exist:</p> +
+  <ul class=brief><li><code><a href=#messageport>MessagePort</a></code>
+   <!--<li><code>ArrayBuffer</code>-->
+  </ul><div class=impl><!-- should move down two sections XXX -->
+
+  <h4 id=safe-passing-of-structured-data><span class=secno>2.8.6 </span>Safe passing \
of structured data</h4> +
   <p>When a user agent is required to obtain a <dfn id=structured-clone>structured
-  clone</dfn> of a value, it must run the following algorithm, which
-  either returns a separate value, or throws an exception.</p>
+  clone</dfn> of a value, optionally with a <i>transfer map</i>, it
+  must run the following algorithm, which either returns a separate
+  value, or throws an exception. If a <i>transfer map</i> is provided,
+  it consists of a association list of pairs of
+  <code><a href=#transferable>Transferable</a></code> objects; in each pair, one is \
the +  <em>old</em> object and one is the <em>new</em> object.</p>
 
   <ol><li><p>Let <var title="">input</var> be the value being
    cloned.</li>
 
+   <li><p>Let <var title="">transfer map</var> be the <i>transfer
+   map</i> passed to the algorithm, if any, or the empty list
+   otherwise.</li>
+
    <li><p>Let <var title="">memory</var> be an association list of
    pairs of objects, initially empty. This is used to handle duplicate
    references. In each pair of objects, one is called the
    <em>source</em> object and the other the <em>destination</em>
    object.</li>
 
+   <li><p>For each pair of objects in <var title="">transfer
+   map</var>, add a mapping from the old object (the source object) to
+   the new object (the destination object) to <var title="">memory</var>.</li>
+
    <li><p>Let <var title="">output</var> be the value resulting from
    calling the <a href=#internal-structured-cloning-algorithm>internal structured \
cloning algorithm</a> with  <var title="">input</var> as the "<var \
title="">input</var>" @@ -8721,6 +8760,16 @@
 
      <dd><p>Let <var title="">output</var> be a newly constructed <code><a \
href=#filelist>FileList</a></code> object containing a list of newly constructed \
<code><a href=#file>File</a></code> objects corresponding to the same underlying data \
as those in <var title="">input</var>, maintaining their relative order.</dd>  
+<!--(when we add this, make sure to throw DATA_CLONE_ERR if these objects are \
already closed) +     <dt>If <var title="">input</var> is an <code>ArrayBuffer</code> \
object</dt> +
+     <dd><p>...</p></dd>
+
+     <dt>If <var title="">input</var> is an <code>ArrayBufferView</code> object</dt>
+
+     <dd><p>...</p></dd>
+-->
+
      <dt>If <var title="">input</var> is an Array object</dt>
 
      <dd><p>Let <var title="">output</var> be a newly constructed empty \
<code>Array</code> object.</dd> @@ -8777,7 +8826,7 @@
   </div>
 
 
-  <h4 id=domstringmap-0><span class=secno>2.8.6 </span>DOMStringMap</h4>
+  <h4 id=domstringmap-0><span class=secno>2.8.7 </span>DOMStringMap</h4>
 
   <p>The <code><a href=#domstringmap>DOMStringMap</a></code> interface represents a \
set of  name-value pairs. It exposes these using the scripting language's
@@ -8861,7 +8910,7 @@
 
 
 <!--CSSREF-->
-  <h4 id=domelementmap-0><span class=secno>2.8.7 </span>DOMElementMap</h4>
+  <h4 id=domelementmap-0><span class=secno>2.8.8 </span>DOMElementMap</h4>
 
   <p>The <code><a href=#domelementmap>DOMElementMap</a></code> interface represents \
a set of  name-element mappings. It exposes these using the scripting
@@ -8910,7 +8959,7 @@
 <!--CSSREF-->
 
 
-  <h4 id=dom-feature-strings><span class=secno>2.8.8 </span>DOM feature strings</h4>
+  <h4 id=dom-feature-strings><span class=secno>2.8.9 </span>DOM feature strings</h4>
 
   <p>DOM3 Core defines mechanisms for checking for interface support,
   and for obtaining implementations of interfaces, using <a \
href=http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMFeatures>feature @@ -8932,7 \
+8981,7 @@  </div>
 
 
-  <h4 id=exceptions><span class=secno>2.8.9 </span>Exceptions</h4>
+  <h4 id=exceptions><span class=secno>2.8.10 </span>Exceptions</h4>
 
   <p>The following are <code><a href=#domexception>DOMException</a></code> codes. <a \
href=#refsDOMCORE>[DOMCORE]</a></p>  
@@ -8977,7 +9026,7 @@
 
   <div class=impl>
 
-  <h4 id=garbage-collection><span class=secno>2.8.10 </span>Garbage collection</h4>
+  <h4 id=garbage-collection><span class=secno>2.8.11 </span>Garbage collection</h4>
 
   <p>There is an <dfn id=implied-strong-reference>implied strong reference</dfn> \
from any IDL  attribute that returns a pre-existing object to that object.</p>
@@ -10095,7 +10144,7 @@
    and return true from the method.<!--SYNCLOAD Otherwise, continue running these
    steps without yet returning.--></li>
 
-   <li><p>Let <var title="">result</var> be an <code><a \
href=#document>Document</a></code> +   <li><p>Let <var title="">result</var> be a \
<code><a href=#document>Document</a></code>  object.</li>
 
    <li><p>Let <var title="">success</var> be false.</li>
@@ -61604,7 +61653,7 @@
   any <a href=#dom-showmodaldialog title=dom-showModalDialog>showModalDialog</a>(in \
DOMString url, in optional any argument<!--, in optional DOMString features-->);  
 <!--POSTMSG-->  // <a href=#web-messaging>cross-document messaging</a>
-  void <a href=#dom-window-postmessage \
title=dom-window-postMessage>postMessage</a>(in any message, in DOMString \
targetOrigin, in optional sequence&lt;<a href=#messageport>MessagePort</a>&gt; \
ports); +  void <a href=#dom-window-postmessage \
title=dom-window-postMessage>postMessage</a>(in any message, in DOMString \
targetOrigin, in optional sequence&lt;<a href=#transferable>Transferable</a>&gt; \
transfer);  <!--POSTMSG-->
   // <a href=#event-handler-idl-attributes>event handler IDL attributes</a>
            attribute <a href=#function>Function</a>? <a href=#handler-onabort \
title=handler-onabort>onabort</a>; @@ -77550,7 +77599,7 @@
 
   <pre class=idl>[Supplemental, NoInterfaceObject]
 interface <dfn id=dedicatedworkerglobalscope>DedicatedWorkerGlobalScope</dfn> : <a \
                href=#workerglobalscope>WorkerGlobalScope</a> {
-  void <a href=#dom-dedicatedworkerglobalscope-postmessage \
title=dom-DedicatedWorkerGlobalScope-postMessage>postMessage</a>(in any message, in \
optional sequence&lt;<a href=#messageport>MessagePort</a>&gt; ports);<!-- +  void <a \
href=#dom-dedicatedworkerglobalscope-postmessage \
title=dom-DedicatedWorkerGlobalScope-postMessage>postMessage</a>(in any message, in \
optional sequence&lt;<a href=#transferable>Transferable</a>&gt; transfer);<!--  \
<span>MessagePort</span> <span \
title="dom-DedicatedWorkerGlobalScope-startConversation">startConversation</span>(in \
any message);-->  attribute <a href=#function>Function</a>? <a \
href=#handler-dedicatedworkerglobalscope-onmessage \
title=handler-DedicatedWorkerGlobalScope-onmessage>onmessage</a>;  };</pre>
@@ -78100,7 +78149,7 @@
 interface <dfn id=worker>Worker</dfn> : <a href=#abstractworker>AbstractWorker</a> {
   void <a href=#dom-worker-terminate title=dom-Worker-terminate>terminate</a>();
 
-  void <a href=#dom-worker-postmessage \
title=dom-Worker-postMessage>postMessage</a>(in any message, in optional \
sequence&lt;<a href=#messageport>MessagePort</a>&gt; ports);<!-- +  void <a \
href=#dom-worker-postmessage title=dom-Worker-postMessage>postMessage</a>(in any \
message, in optional sequence&lt;<a href=#transferable>Transferable</a>&gt; \
transfer);<!--  <span>MessagePort</span> <span \
                title="dom-Worker-startConversation">startConversation</span>(in any \
                message);-->
            attribute <a href=#function>Function</a>? <a \
href=#handler-worker-onmessage title=handler-Worker-onmessage>onmessage</a>;  \
};</pre> @@ -80346,12 +80395,12 @@
 
   <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> +  <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="">transfer</var> ])</dt>  
    <dd>
 
-    <p>Posts a message, optionally with an array of ports, to the
-    given window.</p>
+    <p>Posts a message to the given window. Objects listed in <var \
title="">transfer</var> are transferred, not just cloned, meaning +    that they are \
no longer usable on the sending side.</p>  
     <p>If the origin of the target window doesn't match the given
     origin, the message is discarded, to avoid information leakage. To
@@ -80360,7 +80409,8 @@
     message to same-origin targets only, without needing to explicitly
     state the origin, set the target origin to "<code title="">/</code>".</p>
 
-    <p>Throws an <code><a href=#invalid_state_err>INVALID_STATE_ERR</a></code> if \
the <var title="">ports</var> array contains duplicate ports.</p> +    <p>Throws a \
<code><a href=#data_clone_err>DATA_CLONE_ERR</a></code> if <var \
title="">transfer</var> array contains duplicate objects or if +    <var \
title="">message</var> could not be cloned.</p>  
    </dd>
 
@@ -80378,11 +80428,11 @@
 
   <div class=impl>
 
-  <p>When a script invokes the <dfn id=dom-window-postmessage \
title=dom-window-postMessage><code>postMessage(<var title="">message</var>, <var \
title="">targetOrigin</var>, <var title="">ports</var>)</code></dfn> method (with two \
or three +  <p>When a script invokes the <dfn id=dom-window-postmessage \
title=dom-window-postMessage><code>postMessage(<var title="">message</var>, <var \
title="">targetOrigin</var>, <var title="">transfer</var>)</code></dfn> method (with \
two or three  arguments) on a <code><a href=#window>Window</a></code> object, the \
                user agent must
-  follow these steps:
+  follow these steps:</p>
 
-  <ol><li>
+  <ol><!-- a lot of this is similar or identical to port.postMessage --><li>
 
     <p>If the value of the <var title="">targetOrigin</var> argument
     is neither a single U+002A ASTERISK character (*), a single U+002F
@@ -80394,39 +80444,48 @@
 
    <li>
 
-    <p>Let <var title="">message clone</var> be the result of
-    obtaining a <a href=#structured-clone>structured clone</a> of the <var \
                title="">message</var> argument. If this throws an exception, then
-    throw that exception and abort these steps.</p>
+    <p>Let <var title="">new ports</var> be an empty array.</p>
 
    </li>
 
    <li>
 
-    <p>If the <var title="">ports</var> argument is present but any
-    <code><a href=#messageport>MessagePort</a></code> object is listed in <var \
                title="">ports</var> more than once, or any of the
-    <code><a href=#messageport>MessagePort</a></code> objects listed in <var \
                title="">ports</var> have already been cloned once before, then
-    throw an <code><a href=#invalid_state_err>INVALID_STATE_ERR</a></code> exception \
                and abort these
-    steps.</p>
+    <p>Let <var title="">transfer map</var> be an empty association
+    list of pairs of <code><a href=#transferable>Transferable</a></code> \
objects.</p>  
    </li>
 
    <li>
 
-    <p>Let <var title="">new ports</var> be an empty array.</p>
+    <p>If the method was invoked with a third argument <var title="">transfer</var>, \
run these substeps:</p>  
-    <p>If the <var title="">ports</var> argument is present, then for
-    each port in <var title="">ports</var> in turn, obtain a new port
-    by <a href=#clone-a-port title="clone a port">cloning</a> the port with the
-    <code><a href=#window>Window</a></code> object on which the method was invoked \
                as the
-    owner of the clone, and append the clone to the <var title="">new
-    ports</var> array.</p>
+    <ol><li>
 
-    <p class=note>If the original <var title="">ports</var> argument
-    was omitted or empty, then the <var title="">new ports</var> array
-    will be empty.</p>
+      <p>If any object is listed in <var title="">transfer</var> more
+      than once, or any of the <code><a href=#transferable>Transferable</a></code> \
objects +      listed in <var title="">transfer</var> have already been <a \
href=#transfer-a-transferable-object title="transfer a Transferable \
object">transfered</a> once +      before, then throw a <code><a \
href=#data_clone_err>DATA_CLONE_ERR</a></code> exception and +      abort these \
steps.</p>  
-   </li>
+     </li>
 
+     <li>
+
+      <p>If the <var title="">transfer</var> argument is present, then
+      for each object in <var title="">transfer</var> in turn, obtain
+      a new object by <a href=#transfer-a-transferable-object title="transfer a \
Transferable +      object">transferring</a> the object to the
+      <code><a href=#window>Window</a></code> object on which the method was \
invoked, and +      add a mapping from the old object to the new transferred object
+      to <var title="">transfer map</var>. If the objects are
+      <code><a href=#messageport>MessagePort</a></code> objects, also append the new
+      transferred object to the <var title="">new ports</var>
+      array.</p>
+
+     </li>
+
+    </ol></li>
+
    <li>
 
     <p>Make <var title="">new ports</var> into a <a href=#dfn-read-only-array \
title=dfn-read-only-array>read only</a> array.</p> @@ -80435,6 +80494,15 @@
 
    <li>
 
+    <p>Let <var title="">message clone</var> be the result of
+    obtaining a <a href=#structured-clone>structured clone</a> of the <var \
title="">message</var> argument, with <var title="">transfer +    map</var> as the \
<i>transfer map</i>. If this throws an exception, +    then throw that exception and \
abort these steps.</p> +
+   </li>
+
+   <li>
+
     <p>Return from the <code title=dom-window-postMessage><a \
href=#dom-window-postmessage>postMessage()</a></code> method, but  asynchronously \
continue running these steps.</p>  
@@ -80605,7 +80673,7 @@
 
   <pre class=idl>interface <dfn id=messageport>MessagePort</dfn> {
 <!-- v2-onclose  readonly attribute boolean <span \
                title="dom-MessagePort-active">active</span>;
--->  void <a href=#dom-messageport-postmessage \
title=dom-MessagePort-postMessage>postMessage</a>(in any message, in optional \
sequence&lt;<a href=#messageport>MessagePort</a>&gt; ports);<!-- +-->  void <a \
href=#dom-messageport-postmessage \
title=dom-MessagePort-postMessage>postMessage</a>(in any message, in optional \
sequence&lt;<a href=#transferable>Transferable</a>&gt; transfer);<!--  \
<span>MessagePort</span> <span \
title="dom-MessagePort-startConversation">startConversation</span>(in any \
message);-->  void <a href=#dom-messageport-start \
title=dom-MessagePort-start>start</a>();  void <a href=#dom-messageport-close \
title=dom-MessagePort-close>close</a>(); @@ -80613,7 +80681,8 @@
   // event handlers
            attribute <a href=#function>Function</a>? <a \
href=#handler-messageport-onmessage \
title=handler-MessagePort-onmessage>onmessage</a>;  };
-<a href=#messageport>MessagePort</a> implements <a \
href=#eventtarget>EventTarget</a>;</pre> +<a href=#messageport>MessagePort</a> \
implements <a href=#eventtarget>EventTarget</a>; +<a \
href=#messageport>MessagePort</a> implements <a \
href=#transferable>Transferable</a>;</pre>  
   <dl class=domintro><!-- v2-onclose
    <dt><var title="">port</var> . <code \
title="dom-MessagePort-active">active</code></dt> @@ -80623,15 +80692,16 @@
     <p>Returns true if the port is still active; otherwise, returns false.</p>
 
    </dd>
---><dt><var title="">port</var> . <code \
title=dom-MessagePort-poseMessage>postMessage</code>(<var title="">message</var> [, \
<var title="">ports</var>] )</dt> +--><dt><var title="">port</var> . <code \
title=dom-MessagePort-postMessage><a \
href=#dom-messageport-postmessage>postMessage</a></code>(<var title="">message</var> \
[, <var title="">transfer</var>] )</dt>  
    <dd>
 
-    <p>Posts a message through the channel, optionally with the given
-    ports.</p>
+    <p>Posts a message through the channel. Objects listed in <var \
title="">transfer</var> are transferred, not just cloned, meaning +    that they are \
no longer usable on the sending side.</p>  
-    <p>Throws an <code><a href=#invalid_state_err>INVALID_STATE_ERR</a></code> if \
                the <var title="">ports</var> array contains either duplicate ports, \
                or the
-    source or target port.</p>
+    <p>Throws a <code><a href=#data_clone_err>DATA_CLONE_ERR</a></code> if <var \
title="">transfer</var> array contains duplicate objects or the +    source or target \
ports, or if <var title="">message</var> could +    not be cloned.</p>
 
    </dd>
 
@@ -80668,7 +80738,7 @@
   instantiate a new <code><a href=#messageport>MessagePort</a></code> object, and \
let its owner  be <var title="">owner</var>.</p>
 
-  <hr><p>When the user agent is to <dfn id=entangle>entangle</dfn> two
+  <p>When the user agent is to <dfn id=entangle>entangle</dfn> two
   <code><a href=#messageport>MessagePort</a></code> objects, it must run the \
following  steps:</p>
 
@@ -80689,7 +80759,7 @@
    <code><a href=#messagechannel>MessageChannel</a></code> object that represents \
this  channel.)</li>
 
-  </ol><hr><p>When the user agent is to <dfn id=clone-a-port>clone a port</dfn> <var \
title="">original port</var>, with the clone being owned by <var \
title="">owner</var>, it must run the following steps, which return +  </ol><p>When \
the user agent is to <dfn id=clone-a-port>clone a port</dfn> <var title="">original \
port</var>, with the clone being owned by <var title="">owner</var>, it must run the \
following steps, which return  a new <code><a \
href=#messageport>MessagePort</a></code> object. These steps must be run  \
atomically.</p>  
@@ -80720,7 +80790,11 @@
    <li><p>Return <var title="">new port</var>. It is the
    clone.</li>
 
-  </ol><hr><!-- v2-onclose
+  </ol><p id=transferMessagePort>To <a href=#transfer-a-transferable-object \
title="transfer a Transferable +  object">transfer</a> a <code><a \
href=#messageport>MessagePort</a></code> object <var title="">old</var> to a new \
owner <var title="">owner</var>, a user +  agent must <a href=#clone-a-port \
title="clone a port">clone</a> the <var title="">old</var> object with the cloned \
being owned by <var title="">owner</var>, and must return the resulting object.</p> +
+  <hr><!-- v2-onclose
   <p>The <dfn title="dom-MessagePort-active"><code>active</code></dfn>
   attribute must return true if the port is entangled, and false
   otherwise.</p>
@@ -80730,61 +80804,97 @@
   method, when called on a port <var title="">source port</var>, must
   cause the user agent to run the following steps:</p>
 
-  <ol><li><p>Let <var title="">target port</var> be the port with which
+  <ol><!-- a lot of this is similar or identical to window.postMessage --><li><p>Let \
<var title="">target port</var> be the port with which  <var title="">source \
port</var> is entangled, if any.</li>  
-   <li><p>If the method was called with a second argument <var title="">ports</var>, \
                then, if any <code><a href=#messageport>MessagePort</a></code> object
-   is listed in <var title="">ports</var> more than once, if any of the
-   <code><a href=#messageport>MessagePort</a></code> objects listed in <var \
                title="">ports</var>
-   have already been cloned once before, or if any of the entries
-   in <var title="">ports</var> are either the <var title="">source
-   port</var> or the <var title="">target port</var> (if any), then
-   throw an <code><a href=#invalid_state_err>INVALID_STATE_ERR</a></code> \
exception.</li> +   <li><p>Let <var title="">new owner</var> be the owner of <var \
title="">target port</var>, if there is a <var title="">target +   port</var>, or \
else some arbitrary owner. (This <var title="">new +   owner</var> is used when \
transfering objects below. If there is no +   <var title="">target port</var>, the \
<code><a href=#transferable>Transferable</a></code> +   objects given in the second \
argument, if any, are still <a href=#transfer-a-transferable-object title="transfer a \
Transferable object">transfered</a>, but since +   they are then discarded, it \
doesn't matter where they are +   transfered to.)</li>
 
-   <li><p>Create an event that uses the <code><a \
                href=#messageevent>MessageEvent</a></code>
-   interface, with the name <code title=event-message><a \
                href=#event-message>message</a></code>, which does not bubble, is not
-   cancelable, and has no default action.</li>
+   <li>
 
-   <li><p>Let <var title="">message</var> be the method's first
-   argument.</li>
+    <p>Let <var title="">new ports</var> be an empty array.</p>
 
-   <li><p>Let <var title="">message clone</var> be the result of
-   obtaining a <a href=#structured-clone>structured clone</a> of <var \
                title="">message</var>. If this throws an exception, then throw
-   that exception and abort these steps.</li>
+   </li>
 
-   <li><p>Let the <code title=dom-MessageEvent-data><a \
                href=#dom-messageevent-data>data</a></code>
-   attribute of the event have the value of <var title="">message
-   clone</var>.</li>
+   <li>
 
-   <li><p>If the method was called with a second argument <var title="">ports</var>, \
then run the following substeps:</p> +    <p>Let <var title="">transfer map</var> be \
an empty association +    list of pairs of <code><a \
href=#transferable>Transferable</a></code> objects.</p>  
-    <ol><li>
+   </li>
 
-      <p>Let <var title="">new ports</var> be an empty array.</p>
+   <li>
 
-      <p>For each port in <var title="">ports</var> in turn,
-      obtain a new port by <a href=#clone-a-port title="clone a port">cloning</a>
-      the port with the owner of the <var title="">target port</var>
-      as the owner of the clone, and append the clone to the <var title="">new \
ports</var> array.</p> +    <p>If the method was invoked with a second argument <var \
title="">transfer</var>, run these substeps:</p>  
-      <p class=note>If the original <var title="">ports</var>
-      array was empty, then the <var title="">new ports</var> array will
-      also be empty.</p>
+    <ol><li>
 
+      <p>If any object is listed in <var title="">transfer</var> more
+      than once, or any of the <code><a href=#transferable>Transferable</a></code> \
objects +      listed in <var title="">transfer</var> have already been <a \
href=#transfer-a-transferable-object title="transfer a Transferable \
object">transfered</a> once +      before, then throw a <code><a \
href=#data_clone_err>DATA_CLONE_ERR</a></code> exception and +      abort these \
steps.</p> +
      </li>
 
      <li>
 
-      <p>Make <var title="">new ports</var> into a <a href=#dfn-read-only-array \
title=dfn-read-only-array>read only</a> array.</p> +      <p>If any of the objects in \
<var title="">transfer</var> are +      either the <var title="">source port</var> or \
the <var title="">target port</var> (if any), then throw a +      <code><a \
href=#data_clone_err>DATA_CLONE_ERR</a></code> exception and abort these +      \
steps.</li>  
+     </ol></li>
+
+     <li>
+
+      <p>If the <var title="">transfer</var> argument is present, then
+      for each object in <var title="">transfer</var> in turn, obtain
+      a new object by <a href=#transfer-a-transferable-object title="transfer a \
Transferable +      object">transferring</a> the object to <var title="">new
+      owner</var>, and add a mapping from the old object to the new
+      transferred object to <var title="">transfer map</var>. If the
+      objects are <code><a href=#messageport>MessagePort</a></code> objects, also \
append the +      new transferred object to the <var title="">new ports</var>
+      array.</p>
+
      </li>
 
-     <li><p>Let the <code title=dom-MessageEvent-ports><a \
                href=#dom-messageevent-ports>ports</a></code>
-     attribute of the event be the <var title="">new ports</var>
-     array.</li>
+    </ol><li>
 
-    </ol></li>
+    <p>Make <var title="">new ports</var> into a <a href=#dfn-read-only-array \
title=dfn-read-only-array>read only</a> array.</p>  
+   </li>
+
+   <li><p>Let <var title="">message</var> be the method's first
+   argument.</li>
+
+   <li>
+
+    <p>Let <var title="">message clone</var> be the result of
+    obtaining a <a href=#structured-clone>structured clone</a> of the <var \
title="">message</var> argument, with <var title="">transfer +    map</var> as the \
<i>transfer map</i>. If this throws an exception, +    then throw that exception and \
abort these steps.</p> +
+   </li>
+
+   <li><p>Create an event that uses the <code><a \
href=#messageevent>MessageEvent</a></code> +   interface, with the name <code \
title=event-message><a href=#event-message>message</a></code>, which does not bubble, \
is not +   cancelable, and has no default action.</li>
+
+   <li><p>Let the <code title=dom-MessageEvent-data><a \
href=#dom-messageevent-data>data</a></code> +   attribute of the event have the value \
of <var title="">message +   clone</var>.</li>
+
+   <li><p>Let the <code title=dom-MessageEvent-ports><a \
href=#dom-messageevent-ports>ports</a></code> +   attribute of the event be the <var \
title="">new ports</var> +   array.</li>
+
    <li><p>If there is no <var title="">target port</var> (i.e. if <var \
title="">source port</var> is not entangled), then abort these  steps.</li> <!-- we \
don't raise an exception if there is no  target port because this can happen at a \
moment's notice. we don't @@ -80796,7 +80906,9 @@
 
    <li><p>Add the event to the <a href=#port-message-queue>port message queue</a> of \
<var title="">target port</var>.</li>  
-  </ol><!--
+  
+
+<!--
   <hr>
 
   <p>The <dfn
@@ -80856,7 +80968,8 @@
    title="">target port</var>.</p></li>
 
   </ol>
---><hr><p>The <dfn id=dom-messageport-start \
title=dom-MessagePort-start><code>start()</code></dfn> +-->
+  <hr><p>The <dfn id=dom-messageport-start \
title=dom-MessagePort-start><code>start()</code></dfn>  method must enable its port's \
<a href=#port-message-queue>port message queue</a>, if it  is not already \
enabled.</p>  

Modified: index
===================================================================
--- index	2011-06-21 23:30:59 UTC (rev 6272)
+++ index	2011-06-23 23:48:46 UTC (rev 6273)
@@ -243,7 +243,7 @@
 
   <header class=head id=head><p><a class=logo href=http://www.whatwg.org/><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 &mdash; Last Updated 21 June 2011</h2>
+    <h2 class="no-num no-toc">Living Standard &mdash; Last Updated 23 June 2011</h2>
    </hgroup><dl><dt><strong>Web developer edition</strong></dt>
     <dd><strong><a href=http://developers.whatwg.org/>http://developers.whatwg.org/</a></strong></dd>
  <dt>Multiple-page version:</dt>
@@ -377,12 +377,13 @@
        <li><a href=#htmlpropertiescollection-0><span class=secno>2.8.2.5 \
                </span>HTMLPropertiesCollection</a></ol></li>
      <li><a href=#domtokenlist-0><span class=secno>2.8.3 \
                </span>DOMTokenList</a></li>
      <li><a href=#domsettabletokenlist-0><span class=secno>2.8.4 \
                </span>DOMSettableTokenList</a></li>
-     <li><a href=#safe-passing-of-structured-data><span class=secno>2.8.5 \
                </span>Safe passing of structured data</a></li>
-     <li><a href=#domstringmap-0><span class=secno>2.8.6 \
                </span>DOMStringMap</a></li>
-     <li><a href=#domelementmap-0><span class=secno>2.8.7 \
                </span>DOMElementMap</a></li>
-     <li><a href=#dom-feature-strings><span class=secno>2.8.8 </span>DOM feature \
                strings</a></li>
-     <li><a href=#exceptions><span class=secno>2.8.9 </span>Exceptions</a></li>
-     <li><a href=#garbage-collection><span class=secno>2.8.10 </span>Garbage \
collection</a></ol></li> +     <li><a href=#transferable-objects><span \
class=secno>2.8.5 </span>Transferable objects</a></li> +     <li><a \
href=#safe-passing-of-structured-data><span class=secno>2.8.6 </span>Safe passing of \
structured data</a></li> +     <li><a href=#domstringmap-0><span class=secno>2.8.7 \
</span>DOMStringMap</a></li> +     <li><a href=#domelementmap-0><span \
class=secno>2.8.8 </span>DOMElementMap</a></li> +     <li><a \
href=#dom-feature-strings><span class=secno>2.8.9 </span>DOM feature strings</a></li> \
+     <li><a href=#exceptions><span class=secno>2.8.10 </span>Exceptions</a></li> +   \
<li><a href=#garbage-collection><span class=secno>2.8.11 </span>Garbage \
collection</a></ol></li>  <li><a href=#namespaces><span class=secno>2.9 \
</span>Namespaces</a></ol></li>  <li><a href=#dom><span class=secno>3 \
</span>Semantics, structure, and APIs of HTML documents</a>  <ol>
@@ -8499,23 +8500,61 @@
   </div>
 
 
+
+  <h4 id=transferable-objects><span class=secno>2.8.5 </span>Transferable \
objects</h4> +
+  <p>Some objects support being copied and closed in one operation.
+  This is called <i>transferring</i> the object, and is used in
+  particular to transfer ownership of unsharable or expensive
+  resources across worker boundaries.</p>
+
+  <pre class=idl>[NoInterfaceObject]
+interface <dfn id=transferable>Transferable</dfn> { };</pre>
+
   <div class=impl>
 
-  <h4 id=safe-passing-of-structured-data><span class=secno>2.8.5 </span>Safe passing \
of structured data</h4> +  <p>To <dfn id=transfer-a-transferable-object>transfer a \
<code>Transferable</code> object</dfn> to a +  new owner, the user agent must run the \
steps defined for the type of +  object in question. The steps will return a new \
object of the same +  type, and will permanently neuter the original object. (This is \
an +  irreversible and non-idempotent operation; once an object has been
+  transferred, it cannot be transferred, or indeed used, again.)</p>
 
+  </div>
+
+  <p>The following <code><a href=#transferable>Transferable</a></code> types \
exist:</p> +
+  <ul class=brief><li><code><a href=#messageport>MessagePort</a></code>
+   <!--<li><code>ArrayBuffer</code>-->
+  </ul><div class=impl><!-- should move down two sections XXX -->
+
+  <h4 id=safe-passing-of-structured-data><span class=secno>2.8.6 </span>Safe passing \
of structured data</h4> +
   <p>When a user agent is required to obtain a <dfn id=structured-clone>structured
-  clone</dfn> of a value, it must run the following algorithm, which
-  either returns a separate value, or throws an exception.</p>
+  clone</dfn> of a value, optionally with a <i>transfer map</i>, it
+  must run the following algorithm, which either returns a separate
+  value, or throws an exception. If a <i>transfer map</i> is provided,
+  it consists of a association list of pairs of
+  <code><a href=#transferable>Transferable</a></code> objects; in each pair, one is \
the +  <em>old</em> object and one is the <em>new</em> object.</p>
 
   <ol><li><p>Let <var title="">input</var> be the value being
    cloned.</li>
 
+   <li><p>Let <var title="">transfer map</var> be the <i>transfer
+   map</i> passed to the algorithm, if any, or the empty list
+   otherwise.</li>
+
    <li><p>Let <var title="">memory</var> be an association list of
    pairs of objects, initially empty. This is used to handle duplicate
    references. In each pair of objects, one is called the
    <em>source</em> object and the other the <em>destination</em>
    object.</li>
 
+   <li><p>For each pair of objects in <var title="">transfer
+   map</var>, add a mapping from the old object (the source object) to
+   the new object (the destination object) to <var title="">memory</var>.</li>
+
    <li><p>Let <var title="">output</var> be the value resulting from
    calling the <a href=#internal-structured-cloning-algorithm>internal structured \
cloning algorithm</a> with  <var title="">input</var> as the "<var \
title="">input</var>" @@ -8590,6 +8629,16 @@
 
      <dd><p>Let <var title="">output</var> be a newly constructed <code><a \
href=#filelist>FileList</a></code> object containing a list of newly constructed \
<code><a href=#file>File</a></code> objects corresponding to the same underlying data \
as those in <var title="">input</var>, maintaining their relative order.</dd>  
+<!--(when we add this, make sure to throw DATA_CLONE_ERR if these objects are \
already closed) +     <dt>If <var title="">input</var> is an <code>ArrayBuffer</code> \
object</dt> +
+     <dd><p>...</p></dd>
+
+     <dt>If <var title="">input</var> is an <code>ArrayBufferView</code> object</dt>
+
+     <dd><p>...</p></dd>
+-->
+
      <dt>If <var title="">input</var> is an Array object</dt>
 
      <dd><p>Let <var title="">output</var> be a newly constructed empty \
<code>Array</code> object.</dd> @@ -8646,7 +8695,7 @@
   </div>
 
 
-  <h4 id=domstringmap-0><span class=secno>2.8.6 </span>DOMStringMap</h4>
+  <h4 id=domstringmap-0><span class=secno>2.8.7 </span>DOMStringMap</h4>
 
   <p>The <code><a href=#domstringmap>DOMStringMap</a></code> interface represents a \
set of  name-value pairs. It exposes these using the scripting language's
@@ -8730,7 +8779,7 @@
 
 
 <!--CSSREF-->
-  <h4 id=domelementmap-0><span class=secno>2.8.7 </span>DOMElementMap</h4>
+  <h4 id=domelementmap-0><span class=secno>2.8.8 </span>DOMElementMap</h4>
 
   <p>The <code><a href=#domelementmap>DOMElementMap</a></code> interface represents \
a set of  name-element mappings. It exposes these using the scripting
@@ -8779,7 +8828,7 @@
 <!--CSSREF-->
 
 
-  <h4 id=dom-feature-strings><span class=secno>2.8.8 </span>DOM feature strings</h4>
+  <h4 id=dom-feature-strings><span class=secno>2.8.9 </span>DOM feature strings</h4>
 
   <p>DOM3 Core defines mechanisms for checking for interface support,
   and for obtaining implementations of interfaces, using <a \
href=http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMFeatures>feature @@ -8801,7 \
+8850,7 @@  </div>
 
 
-  <h4 id=exceptions><span class=secno>2.8.9 </span>Exceptions</h4>
+  <h4 id=exceptions><span class=secno>2.8.10 </span>Exceptions</h4>
 
   <p>The following are <code><a href=#domexception>DOMException</a></code> codes. <a \
href=#refsDOMCORE>[DOMCORE]</a></p>  
@@ -8846,7 +8895,7 @@
 
   <div class=impl>
 
-  <h4 id=garbage-collection><span class=secno>2.8.10 </span>Garbage collection</h4>
+  <h4 id=garbage-collection><span class=secno>2.8.11 </span>Garbage collection</h4>
 
   <p>There is an <dfn id=implied-strong-reference>implied strong reference</dfn> \
from any IDL  attribute that returns a pre-existing object to that object.</p>
@@ -9964,7 +10013,7 @@
    and return true from the method.<!--SYNCLOAD Otherwise, continue running these
    steps without yet returning.--></li>
 
-   <li><p>Let <var title="">result</var> be an <code><a \
href=#document>Document</a></code> +   <li><p>Let <var title="">result</var> be a \
<code><a href=#document>Document</a></code>  object.</li>
 
    <li><p>Let <var title="">success</var> be false.</li>
@@ -61476,7 +61525,7 @@
   any <a href=#dom-showmodaldialog title=dom-showModalDialog>showModalDialog</a>(in \
DOMString url, in optional any argument<!--, in optional DOMString features-->);  
 <!--POSTMSG-->  // <a href=#web-messaging>cross-document messaging</a>
-  void <a href=#dom-window-postmessage \
title=dom-window-postMessage>postMessage</a>(in any message, in DOMString \
targetOrigin, in optional sequence&lt;<a href=#messageport>MessagePort</a>&gt; \
ports); +  void <a href=#dom-window-postmessage \
title=dom-window-postMessage>postMessage</a>(in any message, in DOMString \
targetOrigin, in optional sequence&lt;<a href=#transferable>Transferable</a>&gt; \
transfer);  <!--POSTMSG-->
   // <a href=#event-handler-idl-attributes>event handler IDL attributes</a>
            attribute <a href=#function>Function</a>? <a href=#handler-onabort \
title=handler-onabort>onabort</a>; @@ -76614,12 +76663,12 @@
 
   <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> +  <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="">transfer</var> ])</dt>  
    <dd>
 
-    <p>Posts a message, optionally with an array of ports, to the
-    given window.</p>
+    <p>Posts a message to the given window. Objects listed in <var \
title="">transfer</var> are transferred, not just cloned, meaning +    that they are \
no longer usable on the sending side.</p>  
     <p>If the origin of the target window doesn't match the given
     origin, the message is discarded, to avoid information leakage. To
@@ -76628,7 +76677,8 @@
     message to same-origin targets only, without needing to explicitly
     state the origin, set the target origin to "<code title="">/</code>".</p>
 
-    <p>Throws an <code><a href=#invalid_state_err>INVALID_STATE_ERR</a></code> if \
the <var title="">ports</var> array contains duplicate ports.</p> +    <p>Throws a \
<code><a href=#data_clone_err>DATA_CLONE_ERR</a></code> if <var \
title="">transfer</var> array contains duplicate objects or if +    <var \
title="">message</var> could not be cloned.</p>  
    </dd>
 
@@ -76646,11 +76696,11 @@
 
   <div class=impl>
 
-  <p>When a script invokes the <dfn id=dom-window-postmessage \
title=dom-window-postMessage><code>postMessage(<var title="">message</var>, <var \
title="">targetOrigin</var>, <var title="">ports</var>)</code></dfn> method (with two \
or three +  <p>When a script invokes the <dfn id=dom-window-postmessage \
title=dom-window-postMessage><code>postMessage(<var title="">message</var>, <var \
title="">targetOrigin</var>, <var title="">transfer</var>)</code></dfn> method (with \
two or three  arguments) on a <code><a href=#window>Window</a></code> object, the \
                user agent must
-  follow these steps:
+  follow these steps:</p>
 
-  <ol><li>
+  <ol><!-- a lot of this is similar or identical to port.postMessage --><li>
 
     <p>If the value of the <var title="">targetOrigin</var> argument
     is neither a single U+002A ASTERISK character (*), a single U+002F
@@ -76662,39 +76712,48 @@
 
    <li>
 
-    <p>Let <var title="">message clone</var> be the result of
-    obtaining a <a href=#structured-clone>structured clone</a> of the <var \
                title="">message</var> argument. If this throws an exception, then
-    throw that exception and abort these steps.</p>
+    <p>Let <var title="">new ports</var> be an empty array.</p>
 
    </li>
 
    <li>
 
-    <p>If the <var title="">ports</var> argument is present but any
-    <code><a href=#messageport>MessagePort</a></code> object is listed in <var \
                title="">ports</var> more than once, or any of the
-    <code><a href=#messageport>MessagePort</a></code> objects listed in <var \
                title="">ports</var> have already been cloned once before, then
-    throw an <code><a href=#invalid_state_err>INVALID_STATE_ERR</a></code> exception \
                and abort these
-    steps.</p>
+    <p>Let <var title="">transfer map</var> be an empty association
+    list of pairs of <code><a href=#transferable>Transferable</a></code> \
objects.</p>  
    </li>
 
    <li>
 
-    <p>Let <var title="">new ports</var> be an empty array.</p>
+    <p>If the method was invoked with a third argument <var title="">transfer</var>, \
run these substeps:</p>  
-    <p>If the <var title="">ports</var> argument is present, then for
-    each port in <var title="">ports</var> in turn, obtain a new port
-    by <a href=#clone-a-port title="clone a port">cloning</a> the port with the
-    <code><a href=#window>Window</a></code> object on which the method was invoked \
                as the
-    owner of the clone, and append the clone to the <var title="">new
-    ports</var> array.</p>
+    <ol><li>
 
-    <p class=note>If the original <var title="">ports</var> argument
-    was omitted or empty, then the <var title="">new ports</var> array
-    will be empty.</p>
+      <p>If any object is listed in <var title="">transfer</var> more
+      than once, or any of the <code><a href=#transferable>Transferable</a></code> \
objects +      listed in <var title="">transfer</var> have already been <a \
href=#transfer-a-transferable-object title="transfer a Transferable \
object">transfered</a> once +      before, then throw a <code><a \
href=#data_clone_err>DATA_CLONE_ERR</a></code> exception and +      abort these \
steps.</p>  
-   </li>
+     </li>
 
+     <li>
+
+      <p>If the <var title="">transfer</var> argument is present, then
+      for each object in <var title="">transfer</var> in turn, obtain
+      a new object by <a href=#transfer-a-transferable-object title="transfer a \
Transferable +      object">transferring</a> the object to the
+      <code><a href=#window>Window</a></code> object on which the method was \
invoked, and +      add a mapping from the old object to the new transferred object
+      to <var title="">transfer map</var>. If the objects are
+      <code><a href=#messageport>MessagePort</a></code> objects, also append the new
+      transferred object to the <var title="">new ports</var>
+      array.</p>
+
+     </li>
+
+    </ol></li>
+
    <li>
 
     <p>Make <var title="">new ports</var> into a <a href=#dfn-read-only-array \
title=dfn-read-only-array>read only</a> array.</p> @@ -76703,6 +76762,15 @@
 
    <li>
 
+    <p>Let <var title="">message clone</var> be the result of
+    obtaining a <a href=#structured-clone>structured clone</a> of the <var \
title="">message</var> argument, with <var title="">transfer +    map</var> as the \
<i>transfer map</i>. If this throws an exception, +    then throw that exception and \
abort these steps.</p> +
+   </li>
+
+   <li>
+
     <p>Return from the <code title=dom-window-postMessage><a \
href=#dom-window-postmessage>postMessage()</a></code> method, but  asynchronously \
continue running these steps.</p>  
@@ -76873,7 +76941,7 @@
 
   <pre class=idl>interface <dfn id=messageport>MessagePort</dfn> {
 <!-- v2-onclose  readonly attribute boolean <span \
                title="dom-MessagePort-active">active</span>;
--->  void <a href=#dom-messageport-postmessage \
title=dom-MessagePort-postMessage>postMessage</a>(in any message, in optional \
sequence&lt;<a href=#messageport>MessagePort</a>&gt; ports);<!-- +-->  void <a \
href=#dom-messageport-postmessage \
title=dom-MessagePort-postMessage>postMessage</a>(in any message, in optional \
sequence&lt;<a href=#transferable>Transferable</a>&gt; transfer);<!--  \
<span>MessagePort</span> <span \
title="dom-MessagePort-startConversation">startConversation</span>(in any \
message);-->  void <a href=#dom-messageport-start \
title=dom-MessagePort-start>start</a>();  void <a href=#dom-messageport-close \
title=dom-MessagePort-close>close</a>(); @@ -76881,7 +76949,8 @@
   // event handlers
            attribute <a href=#function>Function</a>? <a \
href=#handler-messageport-onmessage \
title=handler-MessagePort-onmessage>onmessage</a>;  };
-<a href=#messageport>MessagePort</a> implements <a \
href=#eventtarget>EventTarget</a>;</pre> +<a href=#messageport>MessagePort</a> \
implements <a href=#eventtarget>EventTarget</a>; +<a \
href=#messageport>MessagePort</a> implements <a \
href=#transferable>Transferable</a>;</pre>  
   <dl class=domintro><!-- v2-onclose
    <dt><var title="">port</var> . <code \
title="dom-MessagePort-active">active</code></dt> @@ -76891,15 +76960,16 @@
     <p>Returns true if the port is still active; otherwise, returns false.</p>
 
    </dd>
---><dt><var title="">port</var> . <code \
title=dom-MessagePort-poseMessage>postMessage</code>(<var title="">message</var> [, \
<var title="">ports</var>] )</dt> +--><dt><var title="">port</var> . <code \
title=dom-MessagePort-postMessage><a \
href=#dom-messageport-postmessage>postMessage</a></code>(<var title="">message</var> \
[, <var title="">transfer</var>] )</dt>  
    <dd>
 
-    <p>Posts a message through the channel, optionally with the given
-    ports.</p>
+    <p>Posts a message through the channel. Objects listed in <var \
title="">transfer</var> are transferred, not just cloned, meaning +    that they are \
no longer usable on the sending side.</p>  
-    <p>Throws an <code><a href=#invalid_state_err>INVALID_STATE_ERR</a></code> if \
                the <var title="">ports</var> array contains either duplicate ports, \
                or the
-    source or target port.</p>
+    <p>Throws a <code><a href=#data_clone_err>DATA_CLONE_ERR</a></code> if <var \
title="">transfer</var> array contains duplicate objects or the +    source or target \
ports, or if <var title="">message</var> could +    not be cloned.</p>
 
    </dd>
 
@@ -76936,7 +77006,7 @@
   instantiate a new <code><a href=#messageport>MessagePort</a></code> object, and \
let its owner  be <var title="">owner</var>.</p>
 
-  <hr><p>When the user agent is to <dfn id=entangle>entangle</dfn> two
+  <p>When the user agent is to <dfn id=entangle>entangle</dfn> two
   <code><a href=#messageport>MessagePort</a></code> objects, it must run the \
following  steps:</p>
 
@@ -76957,7 +77027,7 @@
    <code><a href=#messagechannel>MessageChannel</a></code> object that represents \
this  channel.)</li>
 
-  </ol><hr><p>When the user agent is to <dfn id=clone-a-port>clone a port</dfn> <var \
title="">original port</var>, with the clone being owned by <var \
title="">owner</var>, it must run the following steps, which return +  </ol><p>When \
the user agent is to <dfn id=clone-a-port>clone a port</dfn> <var title="">original \
port</var>, with the clone being owned by <var title="">owner</var>, it must run the \
following steps, which return  a new <code><a \
href=#messageport>MessagePort</a></code> object. These steps must be run  \
atomically.</p>  
@@ -76988,7 +77058,11 @@
    <li><p>Return <var title="">new port</var>. It is the
    clone.</li>
 
-  </ol><hr><!-- v2-onclose
+  </ol><p id=transferMessagePort>To <a href=#transfer-a-transferable-object \
title="transfer a Transferable +  object">transfer</a> a <code><a \
href=#messageport>MessagePort</a></code> object <var title="">old</var> to a new \
owner <var title="">owner</var>, a user +  agent must <a href=#clone-a-port \
title="clone a port">clone</a> the <var title="">old</var> object with the cloned \
being owned by <var title="">owner</var>, and must return the resulting object.</p> +
+  <hr><!-- v2-onclose
   <p>The <dfn title="dom-MessagePort-active"><code>active</code></dfn>
   attribute must return true if the port is entangled, and false
   otherwise.</p>
@@ -76998,61 +77072,97 @@
   method, when called on a port <var title="">source port</var>, must
   cause the user agent to run the following steps:</p>
 
-  <ol><li><p>Let <var title="">target port</var> be the port with which
+  <ol><!-- a lot of this is similar or identical to window.postMessage --><li><p>Let \
<var title="">target port</var> be the port with which  <var title="">source \
port</var> is entangled, if any.</li>  
-   <li><p>If the method was called with a second argument <var title="">ports</var>, \
                then, if any <code><a href=#messageport>MessagePort</a></code> object
-   is listed in <var title="">ports</var> more than once, if any of the
-   <code><a href=#messageport>MessagePort</a></code> objects listed in <var \
                title="">ports</var>
-   have already been cloned once before, or if any of the entries
-   in <var title="">ports</var> are either the <var title="">source
-   port</var> or the <var title="">target port</var> (if any), then
-   throw an <code><a href=#invalid_state_err>INVALID_STATE_ERR</a></code> \
exception.</li> +   <li><p>Let <var title="">new owner</var> be the owner of <var \
title="">target port</var>, if there is a <var title="">target +   port</var>, or \
else some arbitrary owner. (This <var title="">new +   owner</var> is used when \
transfering objects below. If there is no +   <var title="">target port</var>, the \
<code><a href=#transferable>Transferable</a></code> +   objects given in the second \
argument, if any, are still <a href=#transfer-a-transferable-object title="transfer a \
Transferable object">transfered</a>, but since +   they are then discarded, it \
doesn't matter where they are +   transfered to.)</li>
 
-   <li><p>Create an event that uses the <code><a \
                href=#messageevent>MessageEvent</a></code>
-   interface, with the name <code title=event-message><a \
                href=#event-message>message</a></code>, which does not bubble, is not
-   cancelable, and has no default action.</li>
+   <li>
 
-   <li><p>Let <var title="">message</var> be the method's first
-   argument.</li>
+    <p>Let <var title="">new ports</var> be an empty array.</p>
 
-   <li><p>Let <var title="">message clone</var> be the result of
-   obtaining a <a href=#structured-clone>structured clone</a> of <var \
                title="">message</var>. If this throws an exception, then throw
-   that exception and abort these steps.</li>
+   </li>
 
-   <li><p>Let the <code title=dom-MessageEvent-data><a \
                href=#dom-messageevent-data>data</a></code>
-   attribute of the event have the value of <var title="">message
-   clone</var>.</li>
+   <li>
 
-   <li><p>If the method was called with a second argument <var title="">ports</var>, \
then run the following substeps:</p> +    <p>Let <var title="">transfer map</var> be \
an empty association +    list of pairs of <code><a \
href=#transferable>Transferable</a></code> objects.</p>  
-    <ol><li>
+   </li>
 
-      <p>Let <var title="">new ports</var> be an empty array.</p>
+   <li>
 
-      <p>For each port in <var title="">ports</var> in turn,
-      obtain a new port by <a href=#clone-a-port title="clone a port">cloning</a>
-      the port with the owner of the <var title="">target port</var>
-      as the owner of the clone, and append the clone to the <var title="">new \
ports</var> array.</p> +    <p>If the method was invoked with a second argument <var \
title="">transfer</var>, run these substeps:</p>  
-      <p class=note>If the original <var title="">ports</var>
-      array was empty, then the <var title="">new ports</var> array will
-      also be empty.</p>
+    <ol><li>
 
+      <p>If any object is listed in <var title="">transfer</var> more
+      than once, or any of the <code><a href=#transferable>Transferable</a></code> \
objects +      listed in <var title="">transfer</var> have already been <a \
href=#transfer-a-transferable-object title="transfer a Transferable \
object">transfered</a> once +      before, then throw a <code><a \
href=#data_clone_err>DATA_CLONE_ERR</a></code> exception and +      abort these \
steps.</p> +
      </li>
 
      <li>
 
-      <p>Make <var title="">new ports</var> into a <a href=#dfn-read-only-array \
title=dfn-read-only-array>read only</a> array.</p> +      <p>If any of the objects in \
<var title="">transfer</var> are +      either the <var title="">source port</var> or \
the <var title="">target port</var> (if any), then throw a +      <code><a \
href=#data_clone_err>DATA_CLONE_ERR</a></code> exception and abort these +      \
steps.</li>  
+     </ol></li>
+
+     <li>
+
+      <p>If the <var title="">transfer</var> argument is present, then
+      for each object in <var title="">transfer</var> in turn, obtain
+      a new object by <a href=#transfer-a-transferable-object title="transfer a \
Transferable +      object">transferring</a> the object to <var title="">new
+      owner</var>, and add a mapping from the old object to the new
+      transferred object to <var title="">transfer map</var>. If the
+      objects are <code><a href=#messageport>MessagePort</a></code> objects, also \
append the +      new transferred object to the <var title="">new ports</var>
+      array.</p>
+
      </li>
 
-     <li><p>Let the <code title=dom-MessageEvent-ports><a \
                href=#dom-messageevent-ports>ports</a></code>
-     attribute of the event be the <var title="">new ports</var>
-     array.</li>
+    </ol><li>
 
-    </ol></li>
+    <p>Make <var title="">new ports</var> into a <a href=#dfn-read-only-array \
title=dfn-read-only-array>read only</a> array.</p>  
+   </li>
+
+   <li><p>Let <var title="">message</var> be the method's first
+   argument.</li>
+
+   <li>
+
+    <p>Let <var title="">message clone</var> be the result of
+    obtaining a <a href=#structured-clone>structured clone</a> of the <var \
title="">message</var> argument, with <var title="">transfer +    map</var> as the \
<i>transfer map</i>. If this throws an exception, +    then throw that exception and \
abort these steps.</p> +
+   </li>
+
+   <li><p>Create an event that uses the <code><a \
href=#messageevent>MessageEvent</a></code> +   interface, with the name <code \
title=event-message><a href=#event-message>message</a></code>, which does not bubble, \
is not +   cancelable, and has no default action.</li>
+
+   <li><p>Let the <code title=dom-MessageEvent-data><a \
href=#dom-messageevent-data>data</a></code> +   attribute of the event have the value \
of <var title="">message +   clone</var>.</li>
+
+   <li><p>Let the <code title=dom-MessageEvent-ports><a \
href=#dom-messageevent-ports>ports</a></code> +   attribute of the event be the <var \
title="">new ports</var> +   array.</li>
+
    <li><p>If there is no <var title="">target port</var> (i.e. if <var \
title="">source port</var> is not entangled), then abort these  steps.</li> <!-- we \
don't raise an exception if there is no  target port because this can happen at a \
moment's notice. we don't @@ -77064,7 +77174,9 @@
 
    <li><p>Add the event to the <a href=#port-message-queue>port message queue</a> of \
<var title="">target port</var>.</li>  
-  </ol><!--
+  
+
+<!--
   <hr>
 
   <p>The <dfn
@@ -77124,7 +77236,8 @@
    title="">target port</var>.</p></li>
 
   </ol>
---><hr><p>The <dfn id=dom-messageport-start \
title=dom-MessagePort-start><code>start()</code></dfn> +-->
+  <hr><p>The <dfn id=dom-messageport-start \
title=dom-MessagePort-start><code>start()</code></dfn>  method must enable its port's \
<a href=#port-message-queue>port message queue</a>, if it  is not already \
enabled.</p>  

Modified: source
===================================================================
--- source	2011-06-21 23:30:59 UTC (rev 6272)
+++ source	2011-06-23 23:48:46 UTC (rev 6273)
@@ -8616,25 +8616,68 @@
   </div>
 
 
+
+  <h4>Transferable objects</h4>
+
+  <p>Some objects support being copied and closed in one operation.
+  This is called <i>transferring</i> the object, and is used in
+  particular to transfer ownership of unsharable or expensive
+  resources across worker boundaries.</p>
+
+  <pre class="idl">[NoInterfaceObject]
+interface <dfn>Transferable</dfn> { };</pre>
+
   <div class="impl">
 
+  <p>To <dfn>transfer a <code>Transferable</code> object</dfn> to a
+  new owner, the user agent must run the steps defined for the type of
+  object in question. The steps will return a new object of the same
+  type, and will permanently neuter the original object. (This is an
+  irreversible and non-idempotent operation; once an object has been
+  transferred, it cannot be transferred, or indeed used, again.)</p>
+
+  </div>
+
+  <p>The following <code>Transferable</code> types exist:</p>
+
+  <ul class="brief">
+   <li><code>MessagePort</code>
+   <!--<li><code>ArrayBuffer</code>-->
+  </ul>
+
+
+  <div class="impl"><!-- should move down two sections XXX -->
+
   <h4>Safe passing of structured data</h4>
 
   <p>When a user agent is required to obtain a <dfn>structured
-  clone</dfn> of a value, it must run the following algorithm, which
-  either returns a separate value, or throws an exception.</p>
+  clone</dfn> of a value, optionally with a <i>transfer map</i>, it
+  must run the following algorithm, which either returns a separate
+  value, or throws an exception. If a <i>transfer map</i> is provided,
+  it consists of a association list of pairs of
+  <code>Transferable</code> objects; in each pair, one is the
+  <em>old</em> object and one is the <em>new</em> object.</p>
 
   <ol>
 
    <li><p>Let <var title="">input</var> be the value being
    cloned.</p></li>
 
+   <li><p>Let <var title="">transfer map</var> be the <i>transfer
+   map</i> passed to the algorithm, if any, or the empty list
+   otherwise.</p></li>
+
    <li><p>Let <var title="">memory</var> be an association list of
    pairs of objects, initially empty. This is used to handle duplicate
    references. In each pair of objects, one is called the
    <em>source</em> object and the other the <em>destination</em>
    object.</p></li>
 
+   <li><p>For each pair of objects in <var title="">transfer
+   map</var>, add a mapping from the old object (the source object) to
+   the new object (the destination object) to <var
+   title="">memory</var>.</p></li>
+
    <li><p>Let <var title="">output</var> be the value resulting from
    calling the <span>internal structured cloning algorithm</span> with
    <var title="">input</var> as the "<var title="">input</var>"
@@ -8720,6 +8763,16 @@
 
      <dd><p>Let <var title="">output</var> be a newly constructed \
<code>FileList</code> object containing a list of newly constructed <code>File</code> \
objects corresponding to the same underlying data as those in <var \
title="">input</var>, maintaining their relative order.</p></dd>  
+<!--(when we add this, make sure to throw DATA_CLONE_ERR if these objects are \
already closed) +     <dt>If <var title="">input</var> is an <code>ArrayBuffer</code> \
object</dt> +
+     <dd><p>...</p></dd>
+
+     <dt>If <var title="">input</var> is an <code>ArrayBufferView</code> object</dt>
+
+     <dd><p>...</p></dd>
+-->
+
      <dt>If <var title="">input</var> is an Array object</dt>
 
      <dd><p>Let <var title="">output</var> be a newly constructed empty \
<code>Array</code> object.</p></dd> @@ -10346,7 +10399,7 @@
    and return true from the method.<!--SYNCLOAD Otherwise, continue running these
    steps without yet returning.--></p></li>
 
-   <li><p>Let <var title="">result</var> be an <code>Document</code>
+   <li><p>Let <var title="">result</var> be a <code>Document</code>
    object.</p></li>
 
    <li><p>Let <var title="">success</var> be false.</p></li>
@@ -70066,7 +70119,7 @@
   any <span title="dom-showModalDialog">showModalDialog</span>(in DOMString url, in \
optional any argument<!--, in optional DOMString features-->);  
 <!--END w3c-html--><!--POSTMSG-->  // <span>cross-document messaging</span>
-  void <span title="dom-window-postMessage">postMessage</span>(in any message, in \
DOMString targetOrigin, in optional sequence&lt;<span>MessagePort</span>&gt; ports); \
+  void <span title="dom-window-postMessage">postMessage</span>(in any message, in \
DOMString targetOrigin, in optional sequence&lt;<span>Transferable</span>&gt; \
transfer);  <!--START w3c-html--><!--POSTMSG-->
   // <span>event handler IDL attributes</span>
            attribute <span>Function</span>? <span \
title="handler-onabort">onabort</span>; @@ -87839,7 +87892,7 @@
 
   <pre class="idl">[Supplemental, NoInterfaceObject]
 interface <dfn>DedicatedWorkerGlobalScope</dfn> : <span>WorkerGlobalScope</span> {
-  void <span title="dom-DedicatedWorkerGlobalScope-postMessage">postMessage</span>(in \
any message, in optional sequence&lt;<span>MessagePort</span>&gt; ports);<!-- +  void \
<span title="dom-DedicatedWorkerGlobalScope-postMessage">postMessage</span>(in any \
message, in optional sequence&lt;<span>Transferable</span>&gt; transfer);<!--  \
<span>MessagePort</span> <span \
title="dom-DedicatedWorkerGlobalScope-startConversation">startConversation</span>(in \
                any message);-->
            attribute <span>Function</span>? <span \
title="handler-DedicatedWorkerGlobalScope-onmessage">onmessage</span>;  };</pre>
@@ -88488,7 +88541,7 @@
 interface <dfn>Worker</dfn> : <span>AbstractWorker</span> {
   void <span title="dom-Worker-terminate">terminate</span>();
 
-  void <span title="dom-Worker-postMessage">postMessage</span>(in any message, in \
optional sequence&lt;<span>MessagePort</span>&gt; ports);<!-- +  void <span \
title="dom-Worker-postMessage">postMessage</span>(in any message, in optional \
sequence&lt;<span>Transferable</span>&gt; transfer);<!--  <span>MessagePort</span> \
<span title="dom-Worker-startConversation">startConversation</span>(in any \
                message);-->
            attribute <span>Function</span>? <span \
title="handler-Worker-onmessage">onmessage</span>;  };</pre>
@@ -91156,12 +91209,13 @@
 
   <dl class="domintro">
 
-   <dt><var title="">window</var> . <code \
title="dom-window-postMessage">postMessage</code>(<var title="">message</var>, <var \
title="">targetOrigin</var> [, <var title="">ports</var> ])</dt> +   <dt><var \
title="">window</var> . <code title="dom-window-postMessage">postMessage</code>(<var \
title="">message</var>, <var title="">targetOrigin</var> [, <var \
title="">transfer</var> ])</dt>  
    <dd>
 
-    <p>Posts a message, optionally with an array of ports, to the
-    given window.</p>
+    <p>Posts a message to the given window. Objects listed in <var
+    title="">transfer</var> are transferred, not just cloned, meaning
+    that they are no longer usable on the sending side.</p>
 
     <p>If the origin of the target window doesn't match the given
     origin, the message is discarded, to avoid information leakage. To
@@ -91171,8 +91225,9 @@
     state the origin, set the target origin to "<code
     title="">/</code>".</p>
 
-    <p>Throws an <code>INVALID_STATE_ERR</code> if the <var
-    title="">ports</var> array contains duplicate ports.</p>
+    <p>Throws a <code>DATA_CLONE_ERR</code> if <var
+    title="">transfer</var> array contains duplicate objects or if
+    <var title="">message</var> could not be cloned.</p>
 
    </dd>
 
@@ -91195,11 +91250,11 @@
   <p>When a script invokes the <dfn
   title="dom-window-postMessage"><code>postMessage(<var
   title="">message</var>, <var title="">targetOrigin</var>, <var
-  title="">ports</var>)</code></dfn> method (with two or three
+  title="">transfer</var>)</code></dfn> method (with two or three
   arguments) on a <code>Window</code> object, the user agent must
-  follow these steps:
+  follow these steps:</p>
 
-  <ol>
+  <ol> <!-- a lot of this is similar or identical to port.postMessage -->
 
    <li>
 
@@ -91213,40 +91268,52 @@
 
    <li>
 
-    <p>Let <var title="">message clone</var> be the result of
-    obtaining a <span>structured clone</span> of the <var
-    title="">message</var> argument. If this throws an exception, then
-    throw that exception and abort these steps.</p>
+    <p>Let <var title="">new ports</var> be an empty array.</p>
 
    </li>
 
    <li>
 
-    <p>If the <var title="">ports</var> argument is present but any
-    <code>MessagePort</code> object is listed in <var
-    title="">ports</var> more than once, or any of the
-    <code>MessagePort</code> objects listed in <var
-    title="">ports</var> have already been cloned once before, then
-    throw an <code>INVALID_STATE_ERR</code> exception and abort these
-    steps.</p>
+    <p>Let <var title="">transfer map</var> be an empty association
+    list of pairs of <code>Transferable</code> objects.</p>
 
    </li>
 
    <li>
 
-    <p>Let <var title="">new ports</var> be an empty array.</p>
+    <p>If the method was invoked with a third argument <var
+    title="">transfer</var>, run these substeps:</p>
 
-    <p>If the <var title="">ports</var> argument is present, then for
-    each port in <var title="">ports</var> in turn, obtain a new port
-    by <span title="clone a port">cloning</span> the port with the
-    <code>Window</code> object on which the method was invoked as the
-    owner of the clone, and append the clone to the <var title="">new
-    ports</var> array.</p>
+    <ol>
 
-    <p class="note">If the original <var title="">ports</var> argument
-    was omitted or empty, then the <var title="">new ports</var> array
-    will be empty.</p>
+     <li>
 
+      <p>If any object is listed in <var title="">transfer</var> more
+      than once, or any of the <code>Transferable</code> objects
+      listed in <var title="">transfer</var> have already been <span
+      title="transfer a Transferable object">transfered</span> once
+      before, then throw a <code>DATA_CLONE_ERR</code> exception and
+      abort these steps.</p>
+
+     </li>
+
+     <li>
+
+      <p>If the <var title="">transfer</var> argument is present, then
+      for each object in <var title="">transfer</var> in turn, obtain
+      a new object by <span title="transfer a Transferable
+      object">transferring</span> the object to the
+      <code>Window</code> object on which the method was invoked, and
+      add a mapping from the old object to the new transferred object
+      to <var title="">transfer map</var>. If the objects are
+      <code>MessagePort</code> objects, also append the new
+      transferred object to the <var title="">new ports</var>
+      array.</p>
+
+     </li>
+
+    </ol>
+
    </li>
 
    <li>
@@ -91258,6 +91325,16 @@
 
    <li>
 
+    <p>Let <var title="">message clone</var> be the result of
+    obtaining a <span>structured clone</span> of the <var
+    title="">message</var> argument, with <var title="">transfer
+    map</var> as the <i>transfer map</i>. If this throws an exception,
+    then throw that exception and abort these steps.</p>
+
+   </li>
+
+   <li>
+
     <p>Return from the <code
     title="dom-window-postMessage">postMessage()</code> method, but
     asynchronously continue running these steps.</p>
@@ -91456,7 +91533,7 @@
 
   <pre class="idl">interface <dfn>MessagePort</dfn> {
 <!-- v2-onclose  readonly attribute boolean <span \
                title="dom-MessagePort-active">active</span>;
--->  void <span title="dom-MessagePort-postMessage">postMessage</span>(in any \
message, in optional sequence&lt;<span>MessagePort</span>&gt; ports);<!-- +-->  void \
<span title="dom-MessagePort-postMessage">postMessage</span>(in any message, in \
optional sequence&lt;<span>Transferable</span>&gt; transfer);<!--  \
<span>MessagePort</span> <span \
title="dom-MessagePort-startConversation">startConversation</span>(in any \
message);-->  void <span title="dom-MessagePort-start">start</span>();
   void <span title="dom-MessagePort-close">close</span>();
@@ -91464,7 +91541,8 @@
   // event handlers
            attribute <span>Function</span>? <span \
title="handler-MessagePort-onmessage">onmessage</span>;  };
-<span>MessagePort</span> implements <span>EventTarget</span>;</pre>
+<span>MessagePort</span> implements <span>EventTarget</span>;
+<span>MessagePort</span> implements <span>Transferable</span>;</pre>
 
   <dl class="domintro">
 <!-- v2-onclose
@@ -91476,16 +91554,18 @@
 
    </dd>
 -->
-   <dt><var title="">port</var> . <code \
title="dom-MessagePort-poseMessage">postMessage</code>(<var title="">message</var> [, \
<var title="">ports</var>] )</dt> +   <dt><var title="">port</var> . <code \
title="dom-MessagePort-postMessage">postMessage</code>(<var title="">message</var> [, \
<var title="">transfer</var>] )</dt>  
    <dd>
 
-    <p>Posts a message through the channel, optionally with the given
-    ports.</p>
+    <p>Posts a message through the channel. Objects listed in <var
+    title="">transfer</var> are transferred, not just cloned, meaning
+    that they are no longer usable on the sending side.</p>
 
-    <p>Throws an <code>INVALID_STATE_ERR</code> if the <var
-    title="">ports</var> array contains either duplicate ports, or the
-    source or target port.</p>
+    <p>Throws a <code>DATA_CLONE_ERR</code> if <var
+    title="">transfer</var> array contains duplicate objects or the
+    source or target ports, or if <var title="">message</var> could
+    not be cloned.</p>
 
    </dd>
 
@@ -91524,8 +91604,6 @@
   instantiate a new <code>MessagePort</code> object, and let its owner
   be <var title="">owner</var>.</p>
 
-  <hr>
-
   <p>When the user agent is to <dfn>entangle</dfn> two
   <code>MessagePort</code> objects, it must run the following
   steps:</p>
@@ -91551,8 +91629,6 @@
 
   </ol>
 
-  <hr>
-
   <p>When the user agent is to <dfn>clone a port</dfn> <var
   title="">original port</var>, with the clone being owned by <var
   title="">owner</var>, it must run the following steps, which return
@@ -91595,6 +91671,13 @@
 
   </ol>
 
+  <p id="transferMessagePort">To <span title="transfer a Transferable
+  object">transfer</span> a <code>MessagePort</code> object <var
+  title="">old</var> to a new owner <var title="">owner</var>, a user
+  agent must <span title="clone a port">clone</span> the <var
+  title="">old</var> object with the cloned being owned by <var
+  title="">owner</var>, and must return the resulting object.</p>
+
   <hr>
 <!-- v2-onclose
   <p>The <dfn title="dom-MessagePort-active"><code>active</code></dfn>
@@ -91608,74 +91691,113 @@
   method, when called on a port <var title="">source port</var>, must
   cause the user agent to run the following steps:</p>
 
-  <ol>
+  <ol> <!-- a lot of this is similar or identical to window.postMessage -->
 
    <li><p>Let <var title="">target port</var> be the port with which
    <var title="">source port</var> is entangled, if any.</p></li>
 
-   <li><p>If the method was called with a second argument <var
-   title="">ports</var>, then, if any <code>MessagePort</code> object
-   is listed in <var title="">ports</var> more than once, if any of the
-   <code>MessagePort</code> objects listed in <var title="">ports</var>
-   have already been cloned once before, or if any of the entries
-   in <var title="">ports</var> are either the <var title="">source
-   port</var> or the <var title="">target port</var> (if any), then
-   throw an <code>INVALID_STATE_ERR</code> exception.</p></li>
+   <li><p>Let <var title="">new owner</var> be the owner of <var
+   title="">target port</var>, if there is a <var title="">target
+   port</var>, or else some arbitrary owner. (This <var title="">new
+   owner</var> is used when transfering objects below. If there is no
+   <var title="">target port</var>, the <code>Transferable</code>
+   objects given in the second argument, if any, are still <span
+   title="transfer a Transferable object">transfered</span>, but since
+   they are then discarded, it doesn't matter where they are
+   transfered to.)</p></li>
 
-   <li><p>Create an event that uses the <code>MessageEvent</code>
-   interface, with the name <code
-   title="event-message">message</code>, which does not bubble, is not
-   cancelable, and has no default action.</p></li>
+   <li>
 
-   <li><p>Let <var title="">message</var> be the method's first
-   argument.</p></li>
+    <p>Let <var title="">new ports</var> be an empty array.</p>
 
-   <li><p>Let <var title="">message clone</var> be the result of
-   obtaining a <span>structured clone</span> of <var
-   title="">message</var>. If this throws an exception, then throw
-   that exception and abort these steps.</p></li>
+   </li>
 
-   <li><p>Let the <code title="dom-MessageEvent-data">data</code>
-   attribute of the event have the value of <var title="">message
-   clone</var>.</p></li>
+   <li>
 
-   <li><p>If the method was called with a second argument <var
-   title="">ports</var>, then run the following substeps:</p>
+    <p>Let <var title="">transfer map</var> be an empty association
+    list of pairs of <code>Transferable</code> objects.</p>
 
+   </li>
+
+   <li>
+
+    <p>If the method was invoked with a second argument <var
+    title="">transfer</var>, run these substeps:</p>
+
     <ol>
 
      <li>
 
-      <p>Let <var title="">new ports</var> be an empty array.</p>
+      <p>If any object is listed in <var title="">transfer</var> more
+      than once, or any of the <code>Transferable</code> objects
+      listed in <var title="">transfer</var> have already been <span
+      title="transfer a Transferable object">transfered</span> once
+      before, then throw a <code>DATA_CLONE_ERR</code> exception and
+      abort these steps.</p>
 
-      <p>For each port in <var title="">ports</var> in turn,
-      obtain a new port by <span title="clone a port">cloning</span>
-      the port with the owner of the <var title="">target port</var>
-      as the owner of the clone, and append the clone to the <var
-      title="">new ports</var> array.</p>
+     </li>
 
-      <p class="note">If the original <var title="">ports</var>
-      array was empty, then the <var title="">new ports</var> array will
-      also be empty.</p>
+     <li>
 
+      <p>If any of the objects in <var title="">transfer</var> are
+      either the <var title="">source port</var> or the <var
+      title="">target port</var> (if any), then throw a
+      <code>DATA_CLONE_ERR</code> exception and abort these
+      steps.</p></li>
+
      </li>
 
      <li>
 
-      <p>Make <var title="">new ports</var> into a <span
-      title="dfn-read-only-array">read only</span> array.</p>
+      <p>If the <var title="">transfer</var> argument is present, then
+      for each object in <var title="">transfer</var> in turn, obtain
+      a new object by <span title="transfer a Transferable
+      object">transferring</span> the object to <var title="">new
+      owner</var>, and add a mapping from the old object to the new
+      transferred object to <var title="">transfer map</var>. If the
+      objects are <code>MessagePort</code> objects, also append the
+      new transferred object to the <var title="">new ports</var>
+      array.</p>
 
      </li>
 
-     <li><p>Let the <code
-     title="dom-MessageEvent-ports">ports</code>
-     attribute of the event be the <var title="">new ports</var>
-     array.</p></li>
-
     </ol>
 
    </li>
 
+   <li>
+
+    <p>Make <var title="">new ports</var> into a <span
+    title="dfn-read-only-array">read only</span> array.</p>
+
+   </li>
+
+   <li><p>Let <var title="">message</var> be the method's first
+   argument.</p></li>
+
+   <li>
+
+    <p>Let <var title="">message clone</var> be the result of
+    obtaining a <span>structured clone</span> of the <var
+    title="">message</var> argument, with <var title="">transfer
+    map</var> as the <i>transfer map</i>. If this throws an exception,
+    then throw that exception and abort these steps.</p>
+
+   </li>
+
+   <li><p>Create an event that uses the <code>MessageEvent</code>
+   interface, with the name <code
+   title="event-message">message</code>, which does not bubble, is not
+   cancelable, and has no default action.</p></li>
+
+   <li><p>Let the <code title="dom-MessageEvent-data">data</code>
+   attribute of the event have the value of <var title="">message
+   clone</var>.</p></li>
+
+   <li><p>Let the <code title="dom-MessageEvent-ports">ports</code>
+   attribute of the event be the <var title="">new ports</var>
+   array.</p></li>
+
    <li><p>If there is no <var title="">target port</var> (i.e. if <var
    title="">source port</var> is not entangled), then abort these
    steps.</p></li> <!-- we don't raise an exception if there is no

_______________________________________________
Commit-Watchers mailing list
Commit-Watchers@lists.whatwg.org
http://lists.whatwg.org/listinfo.cgi/commit-watchers-whatwg.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic