Skip to content

Commit 531d153

Browse files
Editorial: clarify worker event retargeting
Previously, the standard used the ill-defined phrase "All messages received by that port must immediately be retargeted at the Worker object." This was not a sufficiently clear processing model. Instead, introduce the "message event target" concept to fire the events on the appropriate EventTarget. This also adds linkable definitions for "inside port" and "outside port", and references them appropriately.
1 parent e60b5e6 commit 531d153

File tree

1 file changed

+77
-71
lines changed

1 file changed

+77
-71
lines changed

source

Lines changed: 77 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -112761,7 +112761,7 @@ import "https://example.com/foo/../module2.mjs";</code></pre>
112761112761
</ol>
112762112762

112763112763
<p class="note">Certain <span>event handler IDL attributes</span> have additional requirements, in
112764-
particular the <code data-x="handler-MessagePort-onmessage">onmessage</code> attribute of
112764+
particular the <code data-x="handler-MessageEventTarget-onmessage">onmessage</code> attribute of
112765112765
<code>MessagePort</code> objects.</p>
112766112766

112767112767
</div>
@@ -118994,13 +118994,13 @@ function handleMessage(event) {
118994118994
<p>The key difference is that when using <code
118995118995
data-x="dom-EventTarget-addEventListener">addEventListener()</code>, the <code
118996118996
data-x="dom-MessagePort-start">start()</code> method must also be invoked. When using <code
118997-
data-x="handler-MessagePort-onmessage">onmessage</code>, the call to <code
118997+
data-x="handler-MessageEventTarget-onmessage">onmessage</code>, the call to <code
118998118998
data-x="dom-MessagePort-start">start()</code> is implied.</p>
118999118999

119000119000
<p>The <code data-x="dom-MessagePort-start">start()</code> method, whether called explicitly or
119001-
implicitly (by setting <code data-x="handler-MessagePort-onmessage">onmessage</code>), starts the
119002-
flow of messages: messages posted on message ports are initially paused, so that they don't get
119003-
dropped on the floor before the script has had a chance to set up its handlers.</p>
119001+
implicitly (by setting <code data-x="handler-MessageEventTarget-onmessage">onmessage</code>),
119002+
starts the flow of messages: messages posted on message ports are initially paused, so that they
119003+
don't get dropped on the floor before the script has had a chance to set up its handlers.</p>
119004119004

119005119005
</div>
119006119006

@@ -119142,7 +119142,29 @@ interface <dfn interface>MessageChannel</dfn> {
119142119142

119143119143
</div>
119144119144

119145+
<h4 w-nodev><span id="the-messageeventtarget-abstract-interface"></span>The
119146+
<code>MessageEventTarget</code> mixin</h4>
119147+
<h4 w-dev>Properties present on <code>MessagePort</code>, <code>Worker</code>, and
119148+
<code>DedicatedWorkerGlobalScope</code></h4>
119145119149

119150+
<pre><code class="idl">interface mixin <dfn interface>MessageEventTarget</dfn> {
119151+
attribute <span>EventHandler</span> <span data-x="handler-MessageEventTarget-onmessage">onmessage</span>;
119152+
attribute <span>EventHandler</span> <span data-x="handler-MessageEventTarget-onmessageerror">onmessageerror</span>;
119153+
};</code></pre>
119154+
119155+
<p>The following are the <span>event handlers</span> (and their corresponding <span data-x="event
119156+
handler event type">event handler event types</span>) <span w-nodev>that must be</span> supported,
119157+
as <span>event handler IDL attributes</span>, by <span w-nodev>objects implementing the
119158+
<code>MessageEventTarget</code> interface</span><span w-dev><code>MessagePort</code>,
119159+
<code>Worker</code>, and <code>DedicatedWorkerGlobalScope</code> objects</span>:</p>
119160+
119161+
<table>
119162+
<thead>
119163+
<tr><th><span data-x="event handlers">Event handler</span> <th><span>Event handler event type</span>
119164+
<tbody>
119165+
<tr><td><span id="handler-messageport-onmessage"></span><span id="handler-worker-onmessage"></span><span id="handler-dedicatedworkerglobalscope-onmessage"></span><dfn attribute for="MessageEventTarget"><code data-x="handler-MessageEventTarget-onmessage">onmessage</code></dfn> <td> <code data-x="event-message">message</code>
119166+
<tr><td><span id="handler-messageport-onmessageerror"></span><span id="handler-worker-onmessageerror"></span><span id="handler-dedicatedworkerglobalscope-onmessageerror"></span><dfn attribute for="MessageEventTarget"><code data-x="handler-MessageEventTarget-onmessageerror">onmessageerror</code></dfn> <td> <code data-x="event-messageerror">messageerror</code>
119167+
</table>
119146119168

119147119169
<h4>Message ports</h4>
119148119170

@@ -119157,11 +119179,11 @@ interface <dfn interface>MessagePort</dfn> : <span>EventTarget</span> {
119157119179
undefined <span data-x="dom-MessagePort-close">close</span>();
119158119180

119159119181
// event handlers
119160-
attribute <span>EventHandler</span> <span data-x="handler-MessagePort-onmessage">onmessage</span>;
119161-
attribute <span>EventHandler</span> <span data-x="handler-MessagePort-onmessageerror">onmessageerror</span>;
119162119182
attribute <span>EventHandler</span> <span data-x="handler-MessagePort-onclose">onclose</span>;
119163119183
};
119164119184

119185+
<span>MessagePort</span> includes <span>MessageEventTarget</span>;
119186+
119165119187
dictionary <dfn dictionary>StructuredSerializeOptions</dfn> {
119166119188
sequence&lt;<span data-x="idl-object">object</span>&gt; <dfn dict-member for="StructuredSerializeOptions" data-x="dom-StructuredSerializeOptions-transfer">transfer</dfn> = [];
119167119189
};</code></pre>
@@ -119187,6 +119209,11 @@ dictionary <dfn dictionary>StructuredSerializeOptions</dfn> {
119187119209

119188119210
<div w-nodev>
119189119211

119212+
<p>Each <code>MessagePort</code> object has a <dfn>message event target</dfn> (a
119213+
<code>MessageEventTarget</code>), to which the <code data-x="event-message">message</code> and <code
119214+
data-x="event-messageerror">messageerror</code> events are dispatched. Unless otherwise
119215+
specified, it defaults to the <code>MessagePort</code> object itself.</p>
119216+
119190119217
<p>Each <code>MessagePort</code> object can be entangled with another (a symmetric relationship).
119191119218
Each <code>MessagePort</code> object also has a <span>task source</span> called the <dfn>port
119192119219
message queue</dfn>, initially empty. A <span>port message queue</span> can be enabled or
@@ -119377,6 +119404,9 @@ dictionary <dfn dictionary>StructuredSerializeOptions</dfn> {
119377119404
itself was transferred and thus all its tasks moved along with it.</p>
119378119405
</li>
119379119406

119407+
<li><p>Let <var>messageEventTarget</var> be <var>finalTargetPort</var>'s <span>message event
119408+
target</span>.</p></li>
119409+
119380119410
<li><p>Let <var>targetRealm</var> be <var>finalTargetPort</var>'s <span
119381119411
data-x="concept-relevant-realm">relevant realm</span>.</p></li>
119382119412

@@ -119387,7 +119417,7 @@ dictionary <dfn dictionary>StructuredSerializeOptions</dfn> {
119387119417

119388119418
<p>If this throws an exception, catch it, <span data-x="concept-event-fire">fire an
119389119419
event</span> named <code data-x="event-messageerror">messageerror</code> at
119390-
<var>finalTargetPort</var>, using <code>MessageEvent</code>, and then return.
119420+
<var>messageEventTarget</var>, using <code>MessageEvent</code>, and then return.
119391119421
</li>
119392119422

119393119423
<li><p>Let <var>messageClone</var> be <var>deserializeRecord</var>.[[Deserialized]].</p></li>
@@ -119397,7 +119427,7 @@ dictionary <dfn dictionary>StructuredSerializeOptions</dfn> {
119397119427
maintaining their relative order.</p></li>
119398119428

119399119429
<li><p><span data-x="concept-event-fire">Fire an event</span> named <code
119400-
data-x="event-message">message</code> at <var>finalTargetPort</var>, using
119430+
data-x="event-message">message</code> at <var>messageEventTarget</var>, using
119401119431
<code>MessageEvent</code>, with the <code data-x="dom-MessageEvent-data">data</code> attribute
119402119432
initialized to <var>messageClone</var> and the <code
119403119433
data-x="dom-MessageEvent-ports">ports</code> attribute initialized to
@@ -119462,15 +119492,13 @@ dictionary <dfn dictionary>StructuredSerializeOptions</dfn> {
119462119492
<thead>
119463119493
<tr><th><span data-x="event handlers">Event handler</span> <th><span>Event handler event type</span>
119464119494
<tbody>
119465-
<tr><td><dfn attribute for="MessagePort"><code data-x="handler-MessagePort-onmessage">onmessage</code></dfn> <td> <code data-x="event-message">message</code>
119466-
<tr><td><dfn attribute for="MessagePort"><code data-x="handler-MessagePort-onmessageerror">onmessageerror</code></dfn> <td> <code data-x="event-messageerror">messageerror</code>
119467119495
<tr><td><dfn attribute for="MessagePort"><code data-x="handler-MessagePort-onclose">onclose</code></dfn> <td> <code data-x="event-close">close</code>
119468119496
</table>
119469119497

119470119498
<p>The first time a <code>MessagePort</code> object's <code
119471-
data-x="handler-MessagePort-onmessage">onmessage</code> IDL attribute is set, the port's <span>port
119472-
message queue</span> must be enabled, as if the <code data-x="dom-MessagePort-start">start()</code>
119473-
method had been called.</p>
119499+
data-x="handler-MessageEventTarget-onmessage">onmessage</code> IDL attribute is set, the port's
119500+
<span>port message queue</span> must be enabled, as if the <code
119501+
data-x="dom-MessagePort-start">start()</code> method had been called.</p>
119474119502

119475119503
</div>
119476119504

@@ -119797,8 +119825,8 @@ function showLogout() {
119797119825

119798119826
<p>The <code data-x="dom-Worker">Worker()</code> constructor call creates a worker and returns a
119799119827
<code>Worker</code> object representing that worker, which is used to communicate with the worker.
119800-
That object's <code data-x="handler-Worker-onmessage">onmessage</code> event handler allows the
119801-
code to receive messages from the worker.</p>
119828+
That object's <code data-x="handler-MessageEventTarget-onmessage">onmessage</code> event handler
119829+
allows the code to receive messages from the worker.</p>
119802119830

119803119831
<p>The worker itself is as follows:</p>
119804119832

@@ -120065,8 +120093,8 @@ function showLogout() {
120065120093
other ports.</p>
120066120094

120067120095
<p>To receive messages from a dedicated worker, use the <code
120068-
data-x="handler-worker-onmessage">onmessage</code> <span data-x="event handler IDL attributes">event
120069-
handler IDL attribute</span> on the <code>Worker</code> object:</p>
120096+
data-x="handler-MessageEventTarget-onmessage">onmessage</code> <span data-x="event handler IDL
120097+
attributes">event handler IDL attribute</span> on the <code>Worker</code> object:</p>
120070120098

120071120099
<pre><code class="js">worker.onmessage = function (event) { ... };</code></pre>
120072120100

@@ -120091,7 +120119,7 @@ function showLogout() {
120091120119
}, [buffer]);</code></pre>
120092120120

120093120121
<p>To receive a message inside the worker, the <code
120094-
data-x="handler-DedicatedWorkerGlobalScope-onmessage">onmessage</code> <span data-x="event handler
120122+
data-x="handler-MessageEventTarget-onmessage">onmessage</code> <span data-x="event handler
120095120123
IDL attributes">event handler IDL attribute</span> is used.</p>
120096120124

120097120125
<pre><code class="js">onmessage = function (event) { ... };</code></pre>
@@ -120295,18 +120323,14 @@ interface <dfn interface>DedicatedWorkerGlobalScope</dfn> : <span>WorkerGlobalSc
120295120323
undefined <span data-x="dom-DedicatedWorkerGlobalScope-postMessage-options">postMessage</span>(any message, optional <span>StructuredSerializeOptions</span> options = {});
120296120324

120297120325
undefined <span data-x="dom-DedicatedWorkerGlobalScope-close">close</span>();
120326+
};
120298120327

120299-
attribute <span>EventHandler</span> <span data-x="handler-DedicatedWorkerGlobalScope-onmessage">onmessage</span>;
120300-
attribute <span>EventHandler</span> <span data-x="handler-DedicatedWorkerGlobalScope-onmessageerror">onmessageerror</span>;
120301-
};</code></pre>
120302-
120303-
<p><code>DedicatedWorkerGlobalScope</code> objects act as if they had an implicit
120304-
<code>MessagePort</code> associated with them. This port is part of a channel that is set up when
120305-
the worker is created, but it is not exposed.<span w-nodev> This object must never be garbage
120306-
collected before the <code>DedicatedWorkerGlobalScope</code> object.</span></p>
120328+
<span>DedicatedWorkerGlobalScope</span> includes <span>MessageEventTarget</span>;</code></pre>
120307120329

120308-
<p w-nodev>All messages received by that port must immediately be retargeted at the
120309-
<code>DedicatedWorkerGlobalScope</code> object.</p>
120330+
<p><code>DedicatedWorkerGlobalScope</code> objects have an associated <dfn>inside port</dfn> (a
120331+
<code>MessagePort</code>). This port is part of a channel that is set up when the worker is
120332+
created, but it is not exposed.<span w-nodev> This object must never be garbage collected before
120333+
the <code>DedicatedWorkerGlobalScope</code> object.</span></p>
120310120334

120311120335
<dl class="domintro">
120312120336
<dt><code data-x=""><var>dedicatedWorkerGlobal</var>.<span subdfn data-x="dom-DedicatedWorkerGlobalScope-name">name</span></code></dt>
@@ -120363,21 +120387,6 @@ interface <dfn interface>DedicatedWorkerGlobalScope</dfn> : <span>WorkerGlobalSc
120363120387

120364120388
</div>
120365120389

120366-
<p>The following are the <span>event handlers</span> (and their corresponding <span data-x="event
120367-
handler event type">event handler event types</span>) <span w-nodev>that must be</span> supported,
120368-
as <span>event handler IDL attributes</span>, by objects implementing the
120369-
<code>DedicatedWorkerGlobalScope</code> interface:</p>
120370-
120371-
<table>
120372-
<thead>
120373-
<tr><th><span data-x="event handlers">Event handler</span> <th><span>Event handler event type</span>
120374-
<tbody>
120375-
<tr><td><dfn attribute for="DedicatedWorkerGlobalScope"><code data-x="handler-DedicatedWorkerGlobalScope-onmessage">onmessage</code></dfn> <td> <code data-x="event-message">message</code>
120376-
<tr><td><dfn attribute for="DedicatedWorkerGlobalScope"><code data-x="handler-DedicatedWorkerGlobalScope-onmessageerror">onmessageerror</code></dfn> <td> <code data-x="event-messageerror">messageerror</code>
120377-
</table>
120378-
120379-
120380-
120381120390
<h5>Shared workers and the <code subdfn>SharedWorkerGlobalScope</code> interface</h5>
120382120391

120383120392
<pre><code class="idl">[Global=(Worker,SharedWorker),Exposed=SharedWorker]
@@ -120733,7 +120742,17 @@ interface <dfn interface>SharedWorkerGlobalScope</dfn> : <span>WorkerGlobalScope
120733120742
<var>inside settings</var>'s <span data-x="environment settings object's
120734120743
realm">realm</span>.</p></li>
120735120744

120736-
<li><p>Associate <var>inside port</var> with <var>worker global scope</var>.</p></li>
120745+
<li>
120746+
<p>If <var>shared</var> is false, then:</p>
120747+
120748+
<ol>
120749+
<li><p>Set <var>inside port</var>'s <span>message event target</span> to <var>worker global
120750+
scope</var>.</p></li>
120751+
120752+
<li><p>Set <var>worker global scope</var>'s <span>inside port</span> to <var>inside
120753+
port</var>.</p></li>
120754+
</ol>
120755+
</li>
120737120756

120738120757
<li><p><span>Entangle</span> <var>outside port</var> and <var>inside port</var>.</p></li>
120739120758

@@ -120987,8 +121006,6 @@ interface <dfn interface>Worker</dfn> : <span>EventTarget</span> {
120987121006

120988121007
undefined <span data-x="dom-Worker-postMessage">postMessage</span>(any message, sequence&lt;<span data-x="idl-object">object</span>&gt; transfer);
120989121008
undefined <span data-x="dom-Worker-postMessage-options">postMessage</span>(any message, optional <span>StructuredSerializeOptions</span> options = {});
120990-
attribute <span>EventHandler</span> <span data-x="handler-Worker-onmessage">onmessage</span>;
120991-
attribute <span>EventHandler</span> <span data-x="handler-Worker-onmessageerror">onmessageerror</span>;
120992121009
};
120993121010

120994121011
dictionary <dfn dictionary>WorkerOptions</dfn> {
@@ -120999,7 +121016,8 @@ dictionary <dfn dictionary>WorkerOptions</dfn> {
120999121016

121000121017
enum <dfn enum>WorkerType</dfn> { "classic", "module" };
121001121018

121002-
<span>Worker</span> includes <span>AbstractWorker</span>;</code></pre>
121019+
<span>Worker</span> includes <span>AbstractWorker</span>;
121020+
<span>Worker</span> includes <span>MessageEventTarget</span>;</code></pre>
121003121021

121004121022
<dl class="domintro">
121005121023
<dt><code data-x=""><var>worker</var> = new <span subdfn data-x="dom-Worker">Worker</span>(<var>scriptURL</var> [, <var>options</var> ])</code></dt>
@@ -121024,17 +121042,15 @@ enum <dfn enum>WorkerType</dfn> { "classic", "module" };
121024121042

121025121043
<div w-nodev>
121026121044

121045+
<p>Each <code>Worker</code> object has an associated <dfn for="Worker">outside port</dfn> (a
121046+
<code>MessagePort</code>). This port is part of a channel that is set up when the worker is
121047+
created, but it is not exposed. This object must never be garbage collected before the
121048+
<code>Worker</code> object.</p>
121049+
121027121050
<p>The <dfn method for="Worker"><code data-x="dom-Worker-terminate">terminate()</code></dfn>
121028121051
method, when invoked, must cause the <span>terminate a worker</span> algorithm to be run on the
121029121052
worker with which the object is associated.</p>
121030121053

121031-
<p><code>Worker</code> objects act as if they had an implicit <code>MessagePort</code> associated
121032-
with them. This port is part of a channel that is set up when the worker is created, but it is not
121033-
exposed. This object must never be garbage collected before the <code>Worker</code> object.</p>
121034-
121035-
<p>All messages received by that port must immediately be retargeted at the <code>Worker</code>
121036-
object.</p>
121037-
121038121054
<p>The <dfn method for="Worker"><code
121039121055
data-x="dom-Worker-postMessage">postMessage(<var>message</var>, <var>transfer</var>)</code></dfn>
121040121056
and <dfn method for="Worker"><code
@@ -121043,8 +121059,8 @@ enum <dfn enum>WorkerType</dfn> { "classic", "module" };
121043121059
they immediately invoked the respective <code
121044121060
data-x="dom-MessagePort-postMessage">postMessage(<var>message</var>, <var>transfer</var>)</code>
121045121061
and <code data-x="dom-MessagePort-postMessage-options">postMessage(<var>message</var>,
121046-
<var>options</var>)</code> on the port, with the same arguments, and returned the same return
121047-
value.</p>
121062+
<var>options</var>)</code> on <span>this</span>'s <span>outside port</span>, with the same
121063+
arguments, and returned the same return value.</p>
121048121064

121049121065
</div>
121050121066

@@ -121057,19 +121073,6 @@ enum <dfn enum>WorkerType</dfn> { "classic", "module" };
121057121073

121058121074
</div>
121059121075

121060-
<p>The following are the <span>event handlers</span> (and their corresponding <span data-x="event
121061-
handler event type">event handler event types</span>) <span w-nodev>that must be</span> supported,
121062-
as <span>event handler IDL attributes</span>, by objects implementing the <code>Worker</code>
121063-
interface:</p>
121064-
121065-
<table>
121066-
<thead>
121067-
<tr><th><span data-x="event handlers">Event handler</span> <th><span>Event handler event type</span>
121068-
<tbody>
121069-
<tr><td><dfn attribute for="Worker"><code data-x="handler-Worker-onmessage">onmessage</code></dfn> <td> <code data-x="event-message">message</code>
121070-
<tr><td><dfn attribute for="Worker"><code data-x="handler-Worker-onmessageerror">onmessageerror</code></dfn> <td> <code data-x="event-messageerror">messageerror</code>
121071-
</table>
121072-
121073121076
<div w-nodev>
121074121077

121075121078
<hr>
@@ -121105,7 +121108,10 @@ enum <dfn enum>WorkerType</dfn> { "classic", "module" };
121105121108
<li><p>Let <var>outside port</var> be a <span>new</span> <code>MessagePort</code> in <var>outside
121106121109
settings</var>'s <span data-x="environment settings object's realm">realm</span>.</p></li>
121107121110

121108-
<li><p>Associate the <var>outside port</var> with <var>worker</var>.</p></li>
121111+
<li><p>Set <var>outside port</var>'s <span>message event target</span> to
121112+
<var>worker</var>.</p></li>
121113+
121114+
<li><p>Set <var>worker</var>'s <span>outside port</span> to <var>outside port</var>.</p></li>
121109121115

121110121116
<li>
121111121117
<p>Run this step <span>in parallel</span>:</p>

0 commit comments

Comments
 (0)