Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[] (0) Add a startConversation() method that wraps new MessageChannel…
… and postMessage() in a less expensive one-step operation. (credit: ab)

git-svn-id: http://svn.whatwg.org/webapps@2043 340c8d12-0b0e-0410-8428-c7bf67bfef74
  • Loading branch information
Hixie committed Aug 11, 2008
1 parent 0aa1334 commit 8f86a0c
Show file tree
Hide file tree
Showing 2 changed files with 129 additions and 0 deletions.
70 changes: 70 additions & 0 deletions index
Expand Up @@ -44009,6 +44009,7 @@ interface <dfn id=messagechannel>MessageChannel</dfn> {
readonly attribute boolean <a href="#active0" title=dom-MessagePort-active>active</a>;
boolean <a href="#postmessage2" title=dom-MessagePort-postMessage>postMessage</a>(in DOMString message);
boolean <a href="#postmessage2" title=dom-MessagePort-postMessage>postMessage</a>(in DOMString message, in <a href="#messageport0">MessagePort</a> messagePort);
<a href="#messageport0">MessagePort</a> <a href="#startconversation" title=dom-MessagePort-startConversation>startConversation</a>(in DOMString message);
void <a href="#start6" title=dom-MessagePort-start>start</a>();
void <a href="#close3" title=dom-MessagePort-close>close</a>();

Expand Down Expand Up @@ -44179,6 +44180,75 @@ interface <dfn id=messagechannel>MessageChannel</dfn> {

<hr>

<p>The <dfn id=startconversation
title=dom-MessagePort-startConversation><code>startConversation(<var
title="">message</var>)</code></dfn> method is a convenience method that
simplifies create a new <code><a
href="#messagechannel">MessageChannel</a></code> and invoking <code
title=dom-MessagePort-postMessage><a
href="#postmessage2">postMessage()</a></code> with one of the new ports.
When invoked on a port <var title="">source port</var>, it must run the
following steps:

<ol>
<li>
<p>Let <var title="">message</var> be the method's first argument.

<li>
<p>If the <var title="">source port</var> is not entangled with another
port, then return null and abort these steps.
</li>
<!--
we don't raise an exception because this can happen moment's
notice, but we return false so that the caller can check whether
the port was active at time of calling without a race
condition. -->

<li>
<p>Let <var title="">target port</var> be the port with which <var
title="">source port</var> is entangled.

<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="#message2">message</a></code>, which
does not bubble, is cancelable, and has no default action.

<li>
<p>Let the <code title=dom-MessageEvent-data><a
href="#data4">data</a></code> attribute of the event have the value of
<var title="">message</var>, the method's first argument.

<li>
<p><a href="#create">Create a new <code>MessagePort</code> object</a>
owned by the <a href="#script2">script execution context</a>, and let
<var title="">port1</var> be that object.

<li>
<p><a href="#create">Create a new <code>MessagePort</code> object</a>
owned by the owner of the <var title="">target port</var>, and let <var
title="">port2</var> be that object.

<li>
<p><a href="#entangle">Entangle</a> the <var title="">port1</var> and
<var title="">port2</var> objects.

<li>
<p>Let the <code title=dom-MessageEvent-messagePort><a
href="#messageport">messagePort</a></code> attribute of the event be
<var title="">port2</var>.

<li>
<p>Return <var title="">port1</var> from the method, but continue with
these steps.

<li>
<p>Add the event to the <a href="#port-message">port message queue</a> of
<var title="">target port</var>.
</ol>

<hr>

<p>The <dfn id=start6
title=dom-MessagePort-start><code>start()</code></dfn> method must open
its port's <a href="#port-message">port message queue</a>, if it is not
Expand Down
59 changes: 59 additions & 0 deletions source
Expand Up @@ -41470,6 +41470,7 @@ interface <dfn>MessageChannel</dfn> {
readonly attribute boolean <span title="dom-MessagePort-active">active</span>;
boolean <span title="dom-MessagePort-postMessage">postMessage</span>(in DOMString message);
boolean <span title="dom-MessagePort-postMessage">postMessage</span>(in DOMString message, in <span>MessagePort</span> messagePort);
<span>MessagePort</span> <span title="dom-MessagePort-startConversation">startConversation</span>(in DOMString message);
void <span title="dom-MessagePort-start">start</span>();
void <span title="dom-MessagePort-close">close</span>();

Expand Down Expand Up @@ -41636,6 +41637,64 @@ interface <dfn>MessageChannel</dfn> {

<hr>

<p>The <dfn
title="dom-MessagePort-startConversation"><code>startConversation(<var
title="">message</var>)</code></dfn> method is a convenience method
that simplifies create a new <code>MessageChannel</code> and
invoking <code
title="dom-MessagePort-postMessage">postMessage()</code> with one of
the new ports. When invoked on a port <var title="">source
port</var>, it must run the following steps:</p>

<ol>

<li><p>Let <var title="">message</var> be the method's first
argument.</p></li>

<li><p>If the <var title="">source port</var> is not entangled with
another port, then return null and abort these steps.</p></li> <!--
we don't raise an exception because this can happen moment's
notice, but we return false so that the caller can check whether
the port was active at time of calling without a race
condition. -->

<li><p>Let <var title="">target port</var> be the port with which
<var title="">source port</var> is entangled.</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
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</var>, the method's first argument.</p></li>

<li><p><span>Create a new <code>MessagePort</code> object</span>
owned by the <span>script execution context</span>, and let <var
title="">port1</var> be that object.</p></li>

<li><p><span>Create a new <code>MessagePort</code> object</span>
owned by the owner of the <var title="">target port</var>, and let
<var title="">port2</var> be that object.</p></li>

<li><p><span>Entangle</span> the <var title="">port1</var> and <var
title="">port2</var> objects.</p></li>

<li><p>Let the <code
title="dom-MessageEvent-messagePort">messagePort</code> attribute
of the event be <var title="">port2</var>.</p></li>

<li><p>Return <var title="">port1</var> from the method, but
continue with these steps.</p></li>

<li><p>Add the event to the <span>port message queue</span> of <var
title="">target port</var>.</p></li>

</ol>

<hr>

<p>The <dfn title="dom-MessagePort-start"><code>start()</code></dfn>
method must open its port's <span>port message queue</span>, if it
is not already open.</p>
Expand Down

0 comments on commit 8f86a0c

Please sign in to comment.