/[suikacvs]/markup/html/html5/spec-ja/.workers-spec.en.html
Suika

Contents of /markup/html/html5/spec-ja/.workers-spec.en.html

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.173 - (hide annotations) (download) (as text)
Sun Oct 18 06:18:04 2009 UTC (16 years, 5 months ago) by wakaba
Branch: MAIN
Changes since 1.172: +1 -1 lines
File MIME type: text/html
make

1 wakaba 1.130 <!DOCTYPE html><html lang=en-US-x-hixie><meta charset=ascii><title>Web Workers</title><link href=/style/specification rel=stylesheet><link href=/images/icon rel=icon><body class=draft>
2 wakaba 1.171
3     <header class=head><p><a class=logo href=http://www.whatwg.org/ rel=home><img alt=WHATWG src=/images/logo></a></p>
4     <hgroup><h1>Web Workers</h1>
5 wakaba 1.173 <h2 class="no-num no-toc">Draft Recommendation &mdash; 17 October 2009</h2>
6 wakaba 1.171 </hgroup><p>You can take part in this work. <a href=http://www.whatwg.org/mailing-list>Join the working group's discussion list.</a></p>
7 wakaba 1.82 <p><strong>Web designers!</strong> We have a <a href=http://blog.whatwg.org/faq/>FAQ</a>, a <a href=http://forums.whatwg.org/>forum</a>, and a <a href=http://www.whatwg.org/mailing-list#help>help mailing list</a> for you!</p>
8 wakaba 1.130 <dl><dt>This version:</dt>
9 wakaba 1.82 <dd><a href=http://www.whatwg.org/specs/web-workers/current-work/>http://whatwg.org/ww</a></dd>
10     <dt>Version history:</dt>
11     <dd>Twitter messages (non-editorial changes only): <a href=http://twitter.com/WHATWG>http://twitter.com/WHATWG</a></dd>
12     <dd>Commit-Watchers mailing list: <a href=http://lists.whatwg.org/listinfo.cgi/commit-watchers-whatwg.org>http://lists.whatwg.org/listinfo.cgi/commit-watchers-whatwg.org</a></dd>
13     <dd>Interactive Web interface: <a href=http://html5.org/tools/web-workers-tracker>http://html5.org/tools/web-workers-tracker</a></dd>
14     <dd>Subversion interface: <a href=http://svn.whatwg.org/webworkers/>http://svn.whatwg.org/webworkers/</a></dd>
15     <dt>Issues:</dt>
16     <dd>To send feedback: <a href=http://www.whatwg.org/mailing-list>whatwg@whatwg.org</a></dd>
17     <dd>To view and vote on feedback: <a href=http://www.whatwg.org/issues/>http://www.whatwg.org/issues/</a></dd>
18     <dt>Editor:</dt>
19     <dd>Ian Hickson, Google, ian@hixie.ch</dd>
20 wakaba 1.130 </dl><p class=copyright>&copy; Copyright 2004-2008 Apple Computer, Inc.,
21 wakaba 1.82 Mozilla Foundation, and Opera Software ASA.</p>
22     <p class=copyright>You are granted a license to use, reproduce
23     and create derivative works of this document.</p>
24 wakaba 1.171 </header><hr><h2 class="no-num no-toc" id=abstract>Abstract</h2>
25 wakaba 1.82
26     <p>This specification defines an API that allows Web application
27     authors to spawn background workers running scripts in parallel to
28     their main page. This allows for thread-like operation with
29     message-passing as the coordination mechanism.</p>
30    
31    
32     <h2 class="no-num no-toc" id=status>Status of this document</h2>
33    
34     <p><strong>This is a work in progress!</strong> This document is
35     changing on a daily if not hourly basis in response to comments and
36     as a general part of its development process. Comments are very
37     welcome, please send them to <a href=mailto:whatwg@whatwg.org>whatwg@whatwg.org</a>. Thank
38     you.</p>
39    
40     <p>The current focus is in developing a first draft proposal.</p>
41    
42     <p>Implementors should be aware that this specification is not
43     stable. <strong>Implementors who are not taking part in the
44     discussions are likely to find the specification changing out from
45     under them in incompatible ways.</strong> Vendors interested in
46     implementing this specification before it eventually reaches the
47     call for implementations should join the <a href=/mailing-list>WHATWG mailing list</a> and take part in the
48     discussions.</p>
49    
50     <p>This specification is also being produced by the <a href=http://www.w3.org/2008/webapps/>W3C Web Apps WG</a>. The two
51     specifications are identical from the table of contents onwards.</p>
52    
53     <h2 class="no-num no-toc" id=contents>Table of contents</h2>
54    
55     <!--begin-toc-->
56     <ol class=toc>
57     <li><a href=#introduction><span class=secno>1 </span>Introduction</a>
58     <ol>
59     <li><a href=#scope><span class=secno>1.1 </span>Scope</a></li>
60     <li><a href=#tutorial><span class=secno>1.2 </span>Tutorial</a>
61     <ol>
62     <li><a href=#a-background-number-crunching-worker><span class=secno>1.2.1 </span>A background number-crunching worker</a></li>
63     <li><a href=#a-worker-for-updating-a-client-side-database><span class=secno>1.2.2 </span>A worker for updating a client-side database</a></li>
64     <li><a href=#worker-used-for-background-i/o><span class=secno>1.2.3 </span>Worker used for background I/O</a></li>
65     <li><a href=#shared-workers><span class=secno>1.2.4 </span>Shared workers</a></li>
66     <li><a href=#delegation><span class=secno>1.2.5 </span>Delegation</a></li>
67     <li><a href=#providing-libraries><span class=secno>1.2.6 </span>Providing libraries</a></ol></ol></li>
68 wakaba 1.110 <li><a href=#conformance-requirements><span class=secno>2 </span>Conformance requirements</a>
69 wakaba 1.82 <ol>
70 wakaba 1.110 <li><a href=#dependencies><span class=secno>2.1 </span>Dependencies</a></ol></li>
71     <li><a href=#terminology><span class=secno>3 </span>Terminology</a></li>
72     <li><a href=#infrastructure><span class=secno>4 </span>Infrastructure</a>
73     <ol>
74     <li><a href=#the-global-scope><span class=secno>4.1 </span>The global scope</a>
75 wakaba 1.82 <ol>
76 wakaba 1.110 <li><a href=#the-workerglobalscope-abstract-interface><span class=secno>4.1.1 </span>The <code>WorkerGlobalScope</code> abstract interface</a></li>
77     <li><a href=#dedicated-workers-and-the-dedicatedworkerglobalscope-interface><span class=secno>4.1.2 </span>Dedicated workers and the <code>DedicatedWorkerGlobalScope</code> interface</a></li>
78     <li><a href=#shared-workers-and-the-sharedworkerglobalscope-inteface><span class=secno>4.1.3 </span>Shared workers and the <code>SharedWorkerGlobalScope</code> inteface</a></ol></li>
79 wakaba 1.141 <li><a href=#origins-of-workers><span class=secno>4.2 </span>Origins of workers</a></li>
80 wakaba 1.172 <li><a href=#the-event-loop><span class=secno>4.3 </span>The event loop</a></li>
81     <li><a href="#the-worker's-lifetime"><span class=secno>4.4 </span>The worker's lifetime</a></li>
82     <li><a href=#processing-model><span class=secno>4.5 </span>Processing model</a></li>
83     <li><a href=#runtime-script-errors><span class=secno>4.6 </span>Runtime script errors</a></li>
84     <li><a href=#creating-workers><span class=secno>4.7 </span>Creating workers</a>
85 wakaba 1.82 <ol>
86 wakaba 1.172 <li><a href=#the-abstractworker-abstract-interface><span class=secno>4.7.1 </span>The <code>AbstractWorker</code> abstract interface</a></li>
87     <li><a href=#dedicated-workers-and-the-worker-interface><span class=secno>4.7.2 </span>Dedicated workers and the <code>Worker</code> interface</a></li>
88     <li><a href=#shared-workers-and-the-sharedworker-interface><span class=secno>4.7.3 </span>Shared workers and the <code>SharedWorker</code> interface</a></ol></ol></li>
89 wakaba 1.110 <li><a href=#apis-available-to-workers><span class=secno>5 </span>APIs available to workers</a>
90 wakaba 1.82 <ol>
91 wakaba 1.110 <li><a href=#importing-scripts-and-libraries><span class=secno>5.1 </span>Importing scripts and libraries</a></li>
92     <li><a href=#the-navigator-object><span class=secno>5.2 </span>The <code title=worker-Navigator>Navigator</code> object</a></li>
93     <li><a href=#apis-defined-in-other-specifications><span class=secno>5.3 </span>APIs defined in other specifications</a></li>
94     <li><a href=#interface-objects-and-constructors><span class=secno>5.4 </span>Interface objects and constructors</a></li>
95     <li><a href=#worker-locations><span class=secno>5.5 </span>Worker locations</a></ol></li>
96 wakaba 1.82 <li><a class=no-num href=#references>References</a></li>
97     <li><a class=no-num href=#acknowledgements>Acknowledgements</a></ol>
98     <!--end-toc-->
99 wakaba 1.130 <hr><h2 id=introduction><span class=secno>1 </span>Introduction</h2>
100 wakaba 1.82
101     <h3 id=scope><span class=secno>1.1 </span>Scope</h3>
102    
103 wakaba 1.106 <p><i>This section is non-normative.</i></p>
104 wakaba 1.82
105     <p>This specification defines an API for running scripts in the
106     background independently of any user interface scripts.</p>
107    
108     <p>This allows for long-running scripts that are not interrupted by
109     scripts that respond to clicks or other user interactions, and
110     allows long tasks to be executed without yielding to keep the page
111     responsive.</p>
112    
113     <p>Workers (as these background scripts are called herein) are
114     relatively heavy-weight, and are not intended to be used in large
115     numbers. For example, it would be inappropriate to launch one worker
116     for each pixel of a four megapixel image. The examples below show
117     some appropriate uses of workers.</p>
118    
119     <p>Generally, workers are expected to be long-lived, have a high
120     start-up performance cost, and a high per-instance memory cost.</p>
121    
122    
123     <h3 id=tutorial><span class=secno>1.2 </span>Tutorial</h3>
124    
125 wakaba 1.106 <p><i>This section is non-normative.</i></p>
126 wakaba 1.82
127     <p>There are a variety of uses that workers can be put to. The
128     following subsections show various examples of this use.</p>
129    
130     <h4 id=a-background-number-crunching-worker><span class=secno>1.2.1 </span>A background number-crunching worker</h4>
131    
132 wakaba 1.106 <p><i>This section is non-normative.</i></p>
133 wakaba 1.82
134     <p>The simplest use of workers is for performing a computationally
135     expensive task without interrupting the user interface.</p>
136    
137     <p>In this example, the main document spawns a worker to
138 wakaba 1.130 (na&iuml;vely) compute prime numbers, and progressively displays the
139 wakaba 1.82 most recently found prime number.</p>
140    
141     <p>The main page is as follows:</p>
142    
143     <pre>&lt;!DOCTYPE HTML&gt;
144     &lt;html&gt;
145     &lt;head&gt;
146     &lt;title&gt;Worker example: One-core computation&lt;/title&gt;
147     &lt;/head&gt;
148     &lt;body&gt;
149     &lt;p&gt;The highest prime number discovered so far is: &lt;output id="result"&gt;&lt;/output&gt;&lt;/p&gt;
150     &lt;script&gt;
151     var worker = new Worker('worker.js');
152     worker.onmessage = function (event) {
153     document.getElementById('result').textContent = event.data;
154     };
155     &lt;/script&gt;
156     &lt;/body&gt;
157     &lt;/html&gt;</pre>
158    
159     <p>The <code title=dom-Worker><a href=#dom-worker>Worker()</a></code> constructor call
160     creates a worker and returns a <code><a href=#worker>Worker</a></code> object
161     representing that worker, which is used to communicate with the
162 wakaba 1.162 worker. That object's <code title=handler-Worker-onmessage><a href=#handler-worker-onmessage>onmessage</a></code> event handler allows the code to receive messages from the worker.</p>
163 wakaba 1.82
164     <p>The worker itself is as follows:</p>
165    
166     <pre>var n = 1;
167     search: while (true) {
168     n += 1;
169     for (var i = 2; i &lt;= Math.sqrt(n); i += 1)
170     if (n % i == 0)
171     continue search;
172     // found a prime!
173     postMessage(n);
174     }</pre>
175    
176     <p>The bulk of this code is simply an unoptimized search for a prime
177     number. To send a message back to the page, the <code title=dom-DedicatedWorkerGlobalScope-postMessage><a href=#dom-dedicatedworkerglobalscope-postmessage>postMessage()</a></code>
178     method is used to post a message when a prime is found.</p>
179    
180     <p><a href=http://www.whatwg.org/demos/workers/primes/page.html>View this example online</a>.</p>
181    
182    
183    
184     <h4 id=a-worker-for-updating-a-client-side-database><span class=secno>1.2.2 </span>A worker for updating a client-side database</h4>
185    
186 wakaba 1.106 <p><i>This section is non-normative.</i></p>
187 wakaba 1.82
188     <p>In this example, the main document spawns a worker whose only
189     task is to listen for notifications from the server, and, when
190     appropriate, either add or remove data from the client-side
191     database.</p>
192    
193     <p>Since no communication occurs between the worker and the main
194     page, the main page can start the worker by just doing:</p>
195    
196     <pre>&lt;script&gt;
197     new Worker('worker.js');
198     &lt;/script&gt;</pre>
199    
200     <p>The worker itself is as follows:</p>
201    
202     <pre>var server = new WebSocket('ws://whatwg.org/database');
203     var database = openDatabase('demobase', '1.0', 'Demo Database', 10240);
204     server.onmessage = function (event) {
205     // data is in the format "command key value"
206     var data = event.data.split(' ');
207     switch (data[0]) {
208     case '+':
209     database.transaction(function(tx) {
210     tx.executeSql('INSERT INTO pairs (key, value) VALUES (?, ?)', data[1], data[2]);
211     });
212     case '-':
213     database.transaction(function(tx) {
214     tx.executeSql('DELETE FROM pairs WHERE key=? AND value=?', data[1], data[2]);
215     });
216     }
217     };</pre>
218    
219     <p>This connects to the server using the <code>WebSocket</code>
220     mechanism and opens the local database (which, we presume, has been
221     created earlier). The worker then just listens for messages from the
222     server and acts on them as appropriate, forever (or until the main
223     page is closed).</p>
224    
225     <p><a href=http://www.whatwg.org/demos/workers/database-updater/page.html>View
226     this example online</a>. (This example will not actually function,
227     since the server does not actually exist and the database is not
228     created by this sample code.)</p>
229    
230    
231    
232     <h4 id=worker-used-for-background-i/o><span class=secno>1.2.3 </span>Worker used for background I/O</h4>
233    
234 wakaba 1.106 <p><i>This section is non-normative.</i></p>
235 wakaba 1.82
236     <p>In this example, the main document uses two workers, one for
237     fetching stock updates for at regular intervals, and one for
238     fetching performing search queries that the user requests.</p>
239    
240     <p>The main page is as follows:</p>
241    
242     <pre>&lt;!DOCTYPE HTML&gt;
243     &lt;html&gt;
244     &lt;head&gt;
245     &lt;title&gt;Worker example: Stock ticker&lt;/title&gt;
246     &lt;script&gt;
247     // TICKER
248     var symbol = 'GOOG'; // default symbol to watch
249     var ticker = new Worker('ticker.js');
250    
251     // SEARCHER
252     var searcher = new Worker('searcher.js');
253     function search(query) {
254     searcher.postMessage(query);
255     }
256    
257     // SYMBOL SELECTION UI
258     function select(newSymbol) {
259     symbol = newSymbol;
260     ticker.postMessage(symbol);
261     }
262     &lt;/script&gt;
263     &lt;/head&gt;
264     &lt;body onload="search('')"&gt;
265     &lt;p&gt;&lt;output id="symbol"&gt;&lt;/output&gt; &lt;output id="value"&gt;&lt;/output&gt;&lt;/p&gt;
266     &lt;script&gt;
267     ticker.onmessage = function (event) {
268     var data = event.data.split(' ');
269     document.getElementById('symbol').textContent = data[0];
270     document.getElementById('value').textContent = data[1];
271     };
272     ticker.postMessage(symbol);
273     &lt;/script&gt;
274     &lt;p&gt;&lt;label&gt;Search: &lt;input type="text" autofocus oninput="search(this.value)"&gt;&lt;/label&gt;&lt;/p&gt;
275     &lt;ul id="results"&gt;&lt;/ul&gt;
276     &lt;script&gt;
277     searcher.onmessage = function (event) {
278     var data = event.data.split(' ');
279     var results = document.getElementById('results');
280     while (results.hasChildNodes()) // clear previous results
281     results.removeChild(results.firstChild);
282     for (var i = 0; i &lt; data.length; i += 1) {
283     // add a list item with a button for each result
284     var li = document.createElement('li');
285     var button = document.createElement('button');
286     button.value = data[i];
287     button.type = 'button';
288     button.onclick = function () { select(this.value); };
289     button.textContent = data[i];
290     li.appendChild(button);
291     results.appendChild(li);
292     }
293     };
294     &lt;/script&gt;
295     &lt;p&gt;(The data in this example is not real. Try searching for "Google" or "Apple".)&lt;/p&gt;
296     &lt;/body&gt;
297     &lt;/html&gt;</pre>
298    
299     <p>The two workers use a common library for performing the actual
300     network calls. This library is as follows:</p>
301    
302     <pre>function get(url) {
303     try {
304     var xhr = new XMLHttpRequest();
305     xhr.open('GET', url, false);
306     xhr.send();
307     return xhr.responseText;
308     } catch (e) {
309     return ''; // turn all errors into empty results
310     }
311     }</pre>
312    
313     <p>The stock updater worker is as follows:</p>
314    
315     <pre>importScripts('io.js');
316     var timer;
317     var symbol;
318     function update() {
319     postMessage(symbol + ' ' + get('stock.cgi?' + symbol));
320     timer = setTimeout(update, 10000);
321     }
322     onmessage = function (event) {
323     if (timer)
324     clearTimeout(timer);
325     symbol = event.data;
326     update();
327     };</pre>
328    
329     <p>The search query worker is as follows:</p>
330    
331     <pre>importScripts('io.js');
332     onmessage = function (event) {
333     postMessage(get('search.cgi?' + event.data));
334     };</pre>
335    
336     <p><a href=http://www.whatwg.org/demos/workers/stocks/page.html>View this example online</a>.</p>
337    
338    
339     <h4 id=shared-workers><span class=secno>1.2.4 </span>Shared workers</h4>
340    
341 wakaba 1.106 <p><i>This section is non-normative.</i></p>
342 wakaba 1.82
343     <p>In this example, multiple windows (viewers) can be opened that
344     are all viewing the same map. All the windows share the same map
345     information, with a single worker coordinating all the viewers. Each
346     viewer can move around independently, but if they set any data on
347     the map, all the viewers are updated.</p>
348    
349     <p>The main page isn't interesting, it merely provides a way to open
350     the viewers:</p>
351    
352     <pre>&lt;!DOCTYPE HTML&gt;
353     &lt;html&gt;
354     &lt;head&gt;
355     &lt;title&gt;Workers example: Multiviewer&lt;/title&gt;
356     &lt;script&gt;
357     function openViewer() {
358     window.open('viewer.html');
359     }
360     &lt;/script&gt;
361     &lt;/head&gt;
362     &lt;body&gt;
363     &lt;p&gt;&lt;button type=button onclick="openViewer()"&gt;Open a new
364     viewer&lt;/button&gt;&lt;/p&gt;
365     &lt;p&gt;Each viewer opens in a new window. You can have as many viewers
366     as you like, they all view the same data.&lt;/p&gt;
367     &lt;/body&gt;
368     &lt;/html&gt;</pre>
369    
370     <p>The viewer is more involved:</p>
371    
372     <pre>&lt;!DOCTYPE HTML&gt;
373     &lt;html&gt;
374     &lt;head&gt;
375     &lt;title&gt;Workers example: Multiviewer viewer&lt;/title&gt;
376     &lt;script&gt;
377     var worker = new SharedWorker('worker.js', 'core');
378    
379     // CONFIGURATION
380     function configure(event) {
381     if (event.data.substr(0, 4) != 'cfg ') return;
382     var name = event.data.substr(4).split(' ', 1);
383     // update display to mention our name is name
384     document.getElementsByTagName('h1')[0].textContent += ' ' + name;
385     // no longer need this listener
386     worker.port.removeEventListener('message', configure, false);
387     }
388     worker.port.addEventListener('message', configure, false);
389    
390     // MAP
391     function paintMap(event) {
392     if (event.data.substr(0, 4) != 'map ') return;
393     var data = event.data.substr(4).split(',');
394     // display tiles data[0] .. data[8]
395     var canvas = document.getElementById('map');
396     var context = canvas.getContext('2d');
397     for (var y = 0; y &lt; 3; y += 1) {
398     for (var x = 0; x &lt; 3; x += 1) {
399     var tile = data[y * 3 + x];
400     if (tile == '0')
401     context.fillStyle = 'green';
402     else
403     context.fillStyle = 'maroon';
404     fillRect(x * 50, y * 50, 50, 50);
405     }
406     }
407     }
408     worker.port.addEventListener('message', paintMap, false);
409    
410     // PUBLIC CHAT
411     function updatePublicChat(event) {
412     if (event.data.substr(0, 4) != 'txt ') return;
413     var name = event.data.substr(4).split(' ', 1);
414     var message = event.data.substr(4 + length(name) + 1);
415     // display "&lt;name&gt; message" in public chat
416     var dialog = document.getElementById('public');
417     var dt = document.createElement('dt');
418     dt.textContent = name;
419     dialog.appendChild(dt);
420     var dd = document.createElement('dd');
421     dd.textContent = message;
422     dialog.appendChild(dd);
423     }
424     worker.port.addEventListener('message', updatePublicChat, false);
425    
426     // PRIVATE CHAT
427     function startPrivateChat(event) {
428     if (event.data.substr(0, 4) != 'msg ') return;
429     var name = event.data.substr(4).split(' ', 1);
430     var port = event.ports[0];
431     // display a private chat UI
432     var ul = document.getElementById('private');
433     var li = document.createElement('li');
434     var h3 = document.createElement('h3');
435     h3.textContent = 'Private chat with ' + name;
436     li.appendChild(h3);
437     var dialog = document.createElement('dialog');
438     var addMessage = function(name, message) {
439     var dt = document.createElement('dt');
440     dt.textContent = name;
441     dialog.appendChild(dt);
442     var dd = document.createElement('dd');
443     dd.textContent = message;
444     dialog.appendChild(dd);
445     };
446     port.onmessage = function (event) {
447     addMessage(name, event.data);
448     };
449     li.appendChild(dialog);
450     var form = document.createElement('form');
451     var p = document.createElement('p');
452     var input = document.createElement('input');
453     input.size = 50;
454     p.appendChild(input);
455     p.appendChild(document.createTextNode(' '));
456     var button = document.createElement('button');
457     button.textContent = 'Post';
458     p.appendChild(button);
459     form.onsubmit = function () {
460     port.postMessage(input.value);
461     addMessage('me', input.value);
462     input.value = '';
463     return false;
464     };
465     form.appendChild(p);
466     li.appendChild(form);
467     }
468     worker.port.addEventListener('message', startPrivateChat, false);
469     &lt;/script&gt;
470     &lt;/head&gt;
471     &lt;body&gt;
472     &lt;h1&gt;Viewer&lt;/h1&gt;
473     &lt;h2&gt;Map&lt;/h2&gt;
474     &lt;p&gt;&lt;canvas id="map" height=150 width=150&gt;&lt;/canvas&gt;&lt;/p&gt;
475     &lt;p&gt;
476     &lt;button type=button onclick="worker.port.postMessage('mov left')"&gt;Left&lt;/button&gt;
477     &lt;button type=button onclick="worker.port.postMessage('mov up')"&gt;Up&lt;/button&gt;
478     &lt;button type=button onclick="worker.port.postMessage('mov down')"&gt;Down&lt;/button&gt;
479     &lt;button type=button onclick="worker.port.postMessage('mov right')"&gt;Right&lt;/button&gt;
480     &lt;button type=button onclick="worker.port.postMessage('set 0')"&gt;Set 0&lt;/button&gt;
481     &lt;button type=button onclick="worker.port.postMessage('set 1')"&gt;Set 1&lt;/button&gt;
482     &lt;/p&gt;
483     &lt;h2&gt;Public Chat&lt;/h2&gt;
484     &lt;dialog id="public"&gt;&lt;/dialog&gt;
485     &lt;form onsubmit="worker.port.postMessage('txt ' + message.value); message.value = ''; return false;"&gt;
486     &lt;p&gt;
487     &lt;input type="text" name="message" size="50"&gt;
488     &lt;button&gt;Post&lt;/button&gt;
489     &lt;/p&gt;
490     &lt;/form&gt;
491     &lt;h2&gt;Private Chat&lt;/h2&gt;
492     &lt;ul id="private"&gt;&lt;/ul&gt;
493     &lt;/body&gt;
494     &lt;/html&gt;
495     </pre>
496    
497     <p>There are several key things worth noting about the way the
498     viewer is written.</p>
499    
500     <p><strong>Multiple listeners</strong>. Instead of a single message
501     processing function, the code here attaches multiple event
502     listeners, each one performing a quick check to see if it is
503     relevant for the message. In this example it doesn't make much
504     difference, but if multiple authors wanted to collaborate using a
505     single port to communicate with a worker, it would allow for
506     independent code instead of changes having to all be made to a
507     single event handling function.</p>
508    
509     <p>Registering event listeners in this way also allows you to
510     unregister specific listeners when you are done with them, as is
511     done with the <code title="">configure()</code> method in this
512     example.</p>
513    
514     <p>Finally, the worker:</p>
515    
516 wakaba 1.130 <pre>
517     var nextName = 0;
518 wakaba 1.82 function getNextName() {
519     // this could use more friendly names
520     // but for now just return a number
521     return nextName++;
522     }
523    
524     var map = [
525     [0, 0, 0, 0, 0, 0, 0],
526     [1, 1, 0, 1, 0, 1, 1],
527     [0, 1, 0, 1, 0, 0, 0],
528     [0, 1, 0, 1, 0, 1, 1],
529     [0, 0, 0, 1, 0, 0, 0],
530     [1, 0, 0, 1, 1, 1, 1],
531     [1, 1, 0, 1, 1, 0, 1],
532     ];
533    
534     function wrapX(x) {
535     if (x &lt; 0) return wrapX(x + map[0].length);
536     if (x &gt;= map[0].length) return wrapX(x - map[0].length);
537     return x;
538     }
539    
540     function wrapY(y) {
541     if (y &lt; 0) return wrapY(y + map.length);
542     if (y &gt;= map[0].length) return wrapY(y - map.length);
543     return y;
544     }
545    
546     function sendMapData(callback) {
547     var data = '';
548     for (var y = viewer.y-1; y &lt;= viewer.y+1; y += 1) {
549     for (var x = viewer.x-1; x &lt;= viewer.x+1; x += 1) {
550     if (data != '')
551     data += ',';
552     data += map[y][x];
553     }
554     }
555     callback('map ' + data);
556     }
557    
558     var viewers = {};
559     onconnect = function (event) {
560     event.ports[0]._name = getNextName();
561     event.ports[0]._data = { port: event.port, x: 0, y: 0, };
562     viewers[event.ports[0]._name] = event.port._data;
563     event.ports[0].postMessage('cfg ' + name);
564     event.ports[0].onmessage = getMessage;
565     sendMapData(event.ports[0].postMessage);
566     };
567    
568     function getMessage(event) {
569     switch (event.data.substr(0, 4)) {
570     case 'mov ':
571     var direction = event.data.substr(4);
572     var dx = 0;
573     var dy = 0;
574     switch (direction) {
575     case 'up': dy = -1; break;
576     case 'down': dy = 1; break;
577     case 'left': dx = -1; break;
578     case 'right': dx = 1; break;
579     }
580     event.target._data.x = wrapX(event.target._data.x + dx);
581     event.target._data.y = wrapY(event.target._data.y + dy);
582     sendMapData(event.target.postMessage);
583     break;
584     case 'set ':
585     var value = event.data.substr(4);
586     map[event.target._data.y][event.target._data.x] = value;
587     for (var viewer in viewers)
588     sendMapData(viewers[viewer].port.postMessage);
589     break;
590     case 'txt ':
591     var name = event.target._name;
592     var message = event.data.substr(4);
593     for (var viewer in viewers)
594     viewers[viewer].port.postMessage('txt ' + name + ' ' + message);
595     break;
596     case 'msg ':
597     var party1 = event._data;
598     var party2 = viewers[event.data.substr(4).split(' ', 1)];
599     if (party2) {
600     var channel = new MessageChannel();
601     party1.port.postMessage('msg ' + party2.name, [channel.port1]);
602     party2.port.postMessage('msg ' + party1.name, [channel.port2]);
603     }
604     break;
605     }
606     }</pre>
607    
608     <p><strong>Connecting to multiple pages</strong>. The script uses
609     the <code title=handler-SharedWorkerGlobalScope-onconnect><a href=#handler-sharedworkerglobalscope-onconnect>onconnect</a></code>
610     event listener to listen for multiple connections.</p>
611    
612     <p><strong>Direct channels</strong>. When the worker receives a
613     "msg" message from one viewer naming another viewer, it sets up a
614     direct connection between the two, so that the two viewers can
615     communicate directly without the worker having to proxy all the
616     messages.</p>
617    
618     <p><a href=http://www.whatwg.org/demos/workers/multiviewer/page.html>View this example online</a>.</p>
619    
620    
621     <h4 id=delegation><span class=secno>1.2.5 </span>Delegation</h4>
622    
623 wakaba 1.106 <p><i>This section is non-normative.</i></p>
624 wakaba 1.82
625     <p>With multicore CPUs becoming prevalent, one way to obtain better
626     performance is to split computationally expensive tasks amongst
627     multiple workers. In this example, a computationally expensive task
628     that is to be performed for every number from 1 to 10,000,000 is
629     farmed out to ten subworkers.</p>
630    
631     <p>The main page is as follows, it just reports the result:</p>
632    
633     <pre>&lt;!DOCTYPE HTML&gt;
634     &lt;html&gt;
635     &lt;head&gt;
636     &lt;title&gt;Worker example: One-core computation&lt;/title&gt;
637     &lt;/head&gt;
638     &lt;body&gt;
639     &lt;p&gt;The highest prime number discovered so far is: &lt;output id="result"&gt;&lt;/output&gt;&lt;/p&gt;
640     &lt;script&gt;
641     var worker = new Worker('worker.js');
642     worker.onmessage = function (event) {
643     document.getElementById('result').textContent = event.data;
644     };
645     &lt;/script&gt;
646     &lt;/body&gt;
647     &lt;/html&gt;</pre>
648    
649     <p>The worker itself is as follows:</p>
650    
651     <pre>// settings
652     var num_workers = 10;
653     var items_per_worker = 1000000;
654    
655     // start the workers
656     var result = 0;
657     var pending_workers = num_workers;
658     for (var i = 0; i &lt; num_workers; i += 1) {
659     var worker = new Worker('core.js');
660     worker.postMessage(i * items_per_worker);
661     worker.postMessage((i+1) * items_per_worker);
662     worker.onmessage = storeResult;
663     }
664    
665     // handle the results
666     function storeResult(event) {
667     result += 1*event.data;
668     pending_workers -= 1;
669     if (pending_workers &lt;= 0)
670     postMessage(result); // finished!
671     }</pre>
672    
673     <p>It consists of a loop to start the subworkers, and then a handler
674     that waits for all the subworkers to respond.</p>
675    
676     <p>The subworkers are implemented as follows:</p>
677    
678     <pre>var start;
679     onmessage = getStart;
680     function getStart(event) {
681     start = 1*event.data;
682     onmessage = getEnd;
683     }
684    
685     var end;
686     function getEnd(event) {
687     end = 1*event.data;
688     onmessage = null;
689     work();
690     }
691    
692     function work() {
693     var result = 0;
694     for (var i = start; i &lt; end; i += 1) {
695     // perform some complex calculation here
696     result += 1;
697     }
698     postMessage(result);
699     close();
700     }</pre>
701    
702     <p>They receive two numbers in two events, perform the computation
703     for the range of numbers thus specified, and then report the result
704     back to the parent.</p>
705    
706     <p><a href=http://www.whatwg.org/demos/workers/multicore/page.html>View this example online</a>.</p>
707    
708    
709     <h4 id=providing-libraries><span class=secno>1.2.6 </span>Providing libraries</h4>
710    
711 wakaba 1.106 <p><i>This section is non-normative.</i></p>
712 wakaba 1.82
713     <p>Suppose that a cryptography library is made available that
714     provides three tasks:</p>
715    
716 wakaba 1.130 <dl><dt>Generate a public/private key pair</dt>
717 wakaba 1.82
718     <dd>Takes a port, on which it will send two messages, first the
719     public key and then the private key.</dd>
720    
721     <dt>Given a plaintext and a public key, return the corresponding cyphertext</dt>
722    
723     <dd>Takes a port, to which any number of messages can be sent, the
724     first giving the public key, and the remainder giving the
725     plaintext, each of which is encrypted and then sent on that same
726     channel as the cyphertext. The user can close the port when it is
727     done encrypting content.</dd>
728    
729     <dt>Given a cyphertext and a private key, return the corresponding plaintext</dt>
730    
731     <dd>Takes a port, to which any number of messages can be sent, the
732     first giving the private key, and the remainder giving the
733     cyphertext, each of which is decrypted and then sent on that same
734     channel as the plaintext. The user can close the port when it is
735     done decrypting content.</dd>
736    
737 wakaba 1.130 </dl><p>The library itself is as follows:</p>
738 wakaba 1.82
739     <pre>function handleMessage(e) {
740     if (e.data == "genkeys")
741     genkeys(e.ports[0]);
742     else if (e.data == "encrypt")
743     encrypt(e.ports[0]);
744     else if (e.data == "decrypt")
745     decrypt(e.ports[0]);
746     }
747    
748     function genkeys(p) {
749     var keys = _generateKeyPair();
750     p.postMessage(keys[0]);
751     p.postMessage(keys[1]);
752     }
753    
754     function encrypt(p) {
755     var key, state = 0;
756     p.onmessage = function (e) {
757     if (state == 0) {
758     key = e.data;
759     state = 1;
760     } else {
761     p.postMessage(_encrypt(key, e.data));
762     }
763     };
764     }
765    
766     function decrypt(p) {
767     var key, state = 0;
768     p.onmessage = function (e) {
769     if (state == 0) {
770     key = e.data;
771     state = 1;
772     } else {
773     p.postMessage(_decrypt(key, e.data));
774     }
775     };
776     }
777    
778     // support being used as a shared worker as well as a dedicated worker
779     if (this.onmessage) // dedicated worker
780     onmessage = handleMessage;
781     else // shared worker
782     onconnect = function (e) { e.port.onmessage = handleMessage; }
783    
784    
785     // the "crypto" functions:
786    
787     function _generateKeyPair() {
788     return [Math.random(), Math.random()];
789     }
790    
791     function _encrypt(k, s) {
792     return 'encrypted-' + k + ' ' + s;
793     }
794    
795     function _decrypt(k, s) {
796     return s.substr(s.indexOf(' ')+1);
797     }</pre>
798    
799     <p>Note that the crypto functions here are just stubs and don't do
800     real cryptography.</p>
801    
802     <p>This library could be used as follows:</p>
803    
804     <pre>&lt;!DOCTYPE HTML&gt;
805     &lt;html&gt;
806     &lt;head&gt;
807     &lt;title&gt;Worker example: Crypto library&lt;/title&gt;
808     &lt;script&gt;
809     var crytoLib = new Worker('libcrypto-v1.js'); // or could use 'libcrypto-v2.js'
810     function getKeys() {
811     var state = 0;
812     cryptoLib.startConversation("genkeys").onmessage = function (e) {
813     if (state == 0)
814     document.getElementById('public').value = e.data;
815     else if (state == 1)
816     document.getElementById('private').value = e.data;
817     state += 1;
818     };
819     }
820     function enc() {
821     var port = cryptoLib.startConversation("encrypt");
822     port.postMessage(document.getElementById('public').value);
823     port.postMessage(document.getElementById('input').value);
824     port.onmessage = function (e) {
825     document.getElementById('input').value = e.data;
826     port.close();
827     };
828     }
829     function dec() {
830     var port = cryptoLib.startConversation("decrypt");
831     port.postMessage(document.getElementById('private').value);
832     port.postMessage(document.getElementById('input').value);
833     port.onmessage = function (e) {
834     document.getElementById('input').value = e.data;
835     port.close();
836     };
837     }
838     &lt;/script&gt;
839     &lt;style&gt;
840     textarea { display: block; }
841     &lt;/style&gt;
842     &lt;/head&gt;
843     &lt;body onload="getKeys()"&gt;
844     &lt;fieldset&gt;
845     &lt;legend&gt;Keys&lt;/legend&gt;
846     &lt;p&gt;&lt;label&gt;Public Key: &lt;textarea id="public"&gt;&lt;/textarea&gt;&lt;/label&gt;&lt;/p&gt;
847     &lt;p&gt;&lt;label&gt;Private Key: &lt;textarea id="private"&gt;&lt;/textarea&gt;&lt;/label&gt;&lt;/p&gt;
848     &lt;/fieldset&gt;
849     &lt;p&gt;&lt;label&gt;Input: &lt;textarea id="input"&gt;&lt;/textarea&gt;&lt;/label&gt;&lt;/p&gt;
850     &lt;p&gt;&lt;button onclick="enc()"&gt;Encrypt&lt;/button&gt; &lt;button onclick="dec()"&gt;Decrypt&lt;/button&gt;&lt;/p&gt;
851     &lt;/body&gt;
852     &lt;/html&gt;</pre>
853    
854     <p>A later version of the API, though, might want to offload all the
855     crypto work onto subworkers. This could be done as follows:</p>
856    
857     <pre>function handleMessage(e) {
858     if (e.data == "genkeys")
859     genkeys(e.ports[0]);
860     else if (e.data == "encrypt")
861     encrypt(e.ports[0]);
862     else if (e.data == "decrypt")
863     decrypt(e.ports[0]);
864     }
865    
866     function genkeys(p) {
867     var generator = new Worker('libcrypto-v2-generator.js');
868     generator.postMessage('', [p]);
869     }
870    
871     function encrypt(p) {
872     p.onmessage = function (e) {
873     var key = e.data;
874     var encryptor = new Worker('libcrypto-v2-encryptor.js');
875     encryptor.postMessage(key, [p]);
876     };
877     }
878    
879     function encrypt(p) {
880     p.onmessage = function (e) {
881     var key = e.data;
882     var decryptor = new Worker('libcrypto-v2-decryptor.js');
883     decryptor.postMessage(key, [p]);
884     };
885     }
886    
887     // support being used as a shared worker as well as a dedicated worker
888     if (this.onmessage) // dedicated worker
889     onmessage = handleMessage;
890     else // shared worker
891     onconnect = function (e) { e.ports[0].onmessage = handleMessage };
892     </pre>
893    
894     <p>The little subworkers would then be as follows.</p>
895    
896     <p>For generating key pairs:</p>
897    
898     <pre>onmessage = function (e) {
899     var k = _generateKeyPair();
900     e.ports[0].postMessage(k[0]);
901     e.ports[0].postMessage(k[1]);
902     close();
903     }
904    
905     function _generateKeyPair() {
906     return [Math.random(), Math.random()];
907     }</pre>
908    
909     <p>For encrypting:</p>
910    
911     <pre>onmessage = function (e) {
912     var key = e.data;
913     e.ports[0].onmessage = function (e) {
914     var s = e.data;
915     postMessage(_encrypt(key, s));
916     }
917     }
918    
919     function _encrypt(k, s) {
920     return 'encrypted-' + k + ' ' + s;
921     }</pre>
922    
923     <p>For decrypting:</p>
924    
925     <pre>onmessage = function (e) {
926     var key = e.data;
927     e.ports[0].onmessage = function (e) {
928     var s = e.data;
929     postMessage(_decrypt(key, s));
930     }
931     }
932    
933     function _decrypt(k, s) {
934     return s.substr(s.indexOf(' ')+1);
935     }</pre>
936    
937     <p>Notice how the users of the API don't have to even know that this
938 wakaba 1.130 is happening &mdash; the API hasn't changed; the library can
939 wakaba 1.82 delegate to subworkers without changing its API, even though it is
940     accepting data using message channels.</p>
941    
942     <p><a href=http://www.whatwg.org/demos/workers/crypto/page.html>View this example online</a>.</p>
943    
944    
945    
946    
947     <h2 id=conformance-requirements><span class=secno>2 </span>Conformance requirements</h2>
948    
949     <p>All diagrams, examples, and notes in this specification are
950     non-normative, as are all sections explicitly marked non-normative.
951     Everything else in this specification is normative.</p>
952    
953     <p>The key words "MUST", "MUST NOT", "REQUIRED", <!--"SHALL", "SHALL
954     NOT",--> "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and
955     "OPTIONAL" in the normative parts of this document are to be
956     interpreted as described in RFC2119. For readability, these words do
957     not appear in all uppercase letters in this specification. <a href=#refsRFC2119>[RFC2119]</a></p>
958    
959     <p>Requirements phrased in the imperative as part of algorithms
960     (such as "strip any leading space characters" or "return false and
961     abort these steps") are to be interpreted with the meaning of the
962     key word ("must", "should", "may", etc) used in introducing the
963     algorithm.</p>
964    
965     <p>Some conformance requirements are phrased as requirements on
966     attributes, methods or objects. Such requirements are to be
967     interpreted as requirements on user agents.</p>
968    
969     <p>Conformance requirements phrased as algorithms or specific steps
970     may be implemented in any manner, so long as the end result is
971     equivalent. (In particular, the algorithms defined in this
972     specification are intended to be easy to follow, and not intended to
973     be performant.)</p>
974    
975     <p>The only conformance class defined by this specification is user
976     agents.</p>
977    
978     <p>User agents may impose implementation-specific limits on
979     otherwise unconstrained inputs, e.g. to prevent denial of service
980     attacks, to guard against running out of memory, or to work around
981     platform-specific limitations.</p>
982    
983    
984 wakaba 1.110 <h3 id=dependencies><span class=secno>2.1 </span>Dependencies</h3>
985 wakaba 1.82
986     <p>This specification relies on several other underlying
987     specifications.</p>
988    
989 wakaba 1.130 <dl><dt>HTML5</dt>
990 wakaba 1.82
991     <dd>
992    
993     <p>Many fundamental concepts from HTML5 are used by this
994     specification. <a href=#refsHTML5>[HTML5]</a></p>
995    
996     </dd>
997    
998     <dt>WebIDL</dt>
999    
1000     <dd>
1001    
1002     <p>The IDL blocks in this specification use the semantics of the
1003 wakaba 1.129 WebIDL specification. <a href=#refsWEBIDL>[WEBIDL]</a></p>
1004 wakaba 1.82
1005     </dd>
1006    
1007 wakaba 1.130 </dl><h2 id=terminology><span class=secno>3 </span>Terminology</h2>
1008 wakaba 1.82
1009     <p>The construction "a <code title="">Foo</code> object", where
1010     <code title="">Foo</code> is actually an interface, is sometimes
1011     used instead of the more accurate "an object implementing the
1012     interface <code title="">Foo</code>".</p>
1013    
1014     <p>The term DOM is used to refer to the API set made available to
1015     scripts in Web applications, and does not necessarily imply the
1016     existence of an actual <code>Document</code> object or of any other
1017     <code>Node</code> objects as defined in the DOM Core
1018 wakaba 1.129 specifications. <a href=#refsDOMCORE>[DOMCORE]</a></p>
1019 wakaba 1.82
1020 wakaba 1.154 <p>An IDL attribute is said to be <em>getting</em> when its value is
1021 wakaba 1.82 being retrieved (e.g. by author script), and is said to be
1022     <em>setting</em> when a new value is assigned to it.</p>
1023    
1024     <p>The term "JavaScript" is used to refer to ECMA262, rather than
1025     the official term ECMAScript, since the term JavaScript is more
1026     widely known. <a href=#refsECMA262>[ECMA262]</a></p>
1027    
1028    
1029 wakaba 1.110 <h2 id=infrastructure><span class=secno>4 </span>Infrastructure</h2>
1030 wakaba 1.82
1031     <p>There are two kinds of workers; dedicated workers, and shared
1032     workers. Dedicated workers, once created, and are linked to their
1033     creator; but message ports can be used to communicate from a
1034     dedicated worker to multiple other browsing contexts or
1035     workers. Shared workers, on the other hand, are named, and once
1036     created any script running in the same <span>origin</span> can
1037     obtain a reference to that worker and communicate with it.</p>
1038    
1039    
1040 wakaba 1.110 <h3 id=the-global-scope><span class=secno>4.1 </span>The global scope</h3>
1041 wakaba 1.82
1042     <p>The global scope is the "inside" of a worker.</p>
1043    
1044 wakaba 1.110 <h4 id=the-workerglobalscope-abstract-interface><span class=secno>4.1.1 </span>The <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> abstract interface</h4>
1045 wakaba 1.82
1046     <pre class=idl>interface <dfn id=workerglobalscope>WorkerGlobalScope</dfn> {
1047     readonly attribute <a href=#workerglobalscope>WorkerGlobalScope</a> <a href=#dom-workerglobalscope-self title=dom-WorkerGlobalScope-self>self</a>;
1048     readonly attribute <a href=#workerlocation>WorkerLocation</a> <a href=#dom-workerglobalscope-location title=dom-WorkerGlobalScope-location>location</a>;
1049    
1050     void <a href=#dom-workerglobalscope-close title=dom-WorkerGlobalScope-close>close</a>();
1051 wakaba 1.108 <!-- v2-onclose attribute <span>Function</span> <span title="handler-WorkerGlobalScope-onclose">onclose</span>;
1052     --> attribute <span>Function</span> <a href=#handler-workerglobalscope-onerror title=handler-WorkerGlobalScope-onerror>onerror</a>;
1053 wakaba 1.125 };
1054 wakaba 1.155 <a href=#workerglobalscope>WorkerGlobalScope</a> implements <a href=#workerutils>WorkerUtils</a>;
1055     <a href=#workerglobalscope>WorkerGlobalScope</a> implements <span>EventTarget</span>;</pre>
1056 wakaba 1.82
1057     <p>The <dfn id=dom-workerglobalscope-self title=dom-WorkerGlobalScope-self><code>self</code></dfn> attribute
1058     must return the <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object itself.</p>
1059    
1060     <p>The <dfn id=dom-workerglobalscope-location title=dom-WorkerGlobalScope-location><code>location</code></dfn>
1061     attribute must return the <code><a href=#workerlocation>WorkerLocation</a></code> object created
1062     for the <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object when the worker was
1063     created. It represents the <span>absolute URL</span> of the script
1064 wakaba 1.83 that was used to initialize the worker, after any redirects.</p>
1065 wakaba 1.82
1066 wakaba 1.130 <hr><p>When a script invokes the <dfn id=dom-workerglobalscope-close title=dom-WorkerGlobalScope-close><code>close()</code></dfn>
1067 wakaba 1.82 method on a <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object, the user agent
1068     must run the following steps (atomically):</p>
1069    
1070 wakaba 1.130 <ol><li><p>Discard any <span title=concept-task>tasks</span> that
1071 wakaba 1.82 have been added to the <span>event loop</span>'s <span title="task
1072     queue">task queues</span>.</p>
1073    
1074     <!-- v2-onclose
1075     <li><p><span>Queue a task</span> to <span>fire a simple
1076 wakaba 1.166 event</span> named <code title="event-close">close</code> at the
1077 wakaba 1.82 <code>WorkerGlobalScope</code> object.</p></li>
1078     -->
1079    
1080     <li><p>Set the worker's <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object's
1081     <a href=#dom-workerglobalscope-closing title=dom-WorkerGlobalScope-closing>closing</a> flag to
1082     true. (This prevents any further tasks from being queued.)</li>
1083    
1084     <li><p>Disentangle all the ports in the list of <a href="#the-worker's-ports">the worker's
1085     ports</a>.</li>
1086    
1087 wakaba 1.162 </ol><p>The following are the <span>event handlers</span> (and their
1088     corresponding <span title="event handler event type">event handler
1089     event types</span>) that must be supported, as IDL attributes, by
1090     objects implementing the <code><a href=#workerglobalscope>WorkerGlobalScope</a></code>
1091     interface:</p>
1092 wakaba 1.82
1093 wakaba 1.162 <table><thead><tr><th><span title="event handlers">Event handler</span> <th><span>Event handler event type</span>
1094 wakaba 1.130 <tbody><!-- v2-onclose <tr><td><dfn title="handler-WorkerGlobalScope-onclose"><code>onclose</code></dfn> <td> <code title="event-close">close</code> --><tr><td><dfn id=handler-workerglobalscope-onerror title=handler-WorkerGlobalScope-onerror><code>onerror</code></dfn> <td> <code title=event-error>error</code>
1095     </table><h4 id=dedicated-workers-and-the-dedicatedworkerglobalscope-interface><span class=secno>4.1.2 </span>Dedicated workers and the <code><a href=#dedicatedworkerglobalscope>DedicatedWorkerGlobalScope</a></code> interface</h4>
1096 wakaba 1.82
1097 wakaba 1.125 <pre class=idl>[Supplemental, NoInterfaceObject]
1098     interface <dfn id=dedicatedworkerglobalscope>DedicatedWorkerGlobalScope</dfn> : <a href=#workerglobalscope>WorkerGlobalScope</a> {
1099 wakaba 1.159 void <a href=#dom-dedicatedworkerglobalscope-postmessage title=dom-DedicatedWorkerGlobalScope-postMessage>postMessage</a>(in any message, in optional <span>MessagePortArray</span> ports);<!--
1100 wakaba 1.82 <span>MessagePort</span> <span title="dom-DedicatedWorkerGlobalScope-startConversation">startConversation</span>(in any message);-->
1101 wakaba 1.108 attribute <span>Function</span> <a href=#handler-dedicatedworkerglobalscope-onmessage title=handler-DedicatedWorkerGlobalScope-onmessage>onmessage</a>;
1102 wakaba 1.82 };</pre>
1103    
1104     <p><code><a href=#dedicatedworkerglobalscope>DedicatedWorkerGlobalScope</a></code> objects act as if they
1105     had an implicit <code>MessagePort</code> associated with them. This
1106     port is part of a channel that is set up when the worker is created,
1107     but it is not exposed. This object must never be garbage collected
1108     before the <code><a href=#dedicatedworkerglobalscope>DedicatedWorkerGlobalScope</a></code> object.</p>
1109    
1110     <p>All messages received by that port must immediately be retargeted
1111     at the <code><a href=#dedicatedworkerglobalscope>DedicatedWorkerGlobalScope</a></code> object.</p>
1112    
1113     <p>The <dfn id=dom-dedicatedworkerglobalscope-postmessage title=dom-DedicatedWorkerGlobalScope-postMessage><code>postMessage()</code></dfn><!--
1114     and <dfn
1115     title="dom-DedicatedWorkerGlobalScope-startConversation"><code>startConversation()</code></dfn>-->
1116     method<!--s (startConversation)--> on
1117     <code><a href=#dedicatedworkerglobalscope>DedicatedWorkerGlobalScope</a></code> objects must act as if, when
1118     invoked, it<!--/they (startConversation)--> immediately invoked the
1119     method of the same name on the port, with the same arguments, and
1120     returned the same return value.</p>
1121    
1122 wakaba 1.162 <p>The following are the <span>event handlers</span> (and their
1123     corresponding <span title="event handler event type">event handler
1124     event types</span>) that must be supported, as IDL attributes, by
1125     objects implementing the <code><a href=#dedicatedworkerglobalscope>DedicatedWorkerGlobalScope</a></code>
1126     interface:</p>
1127 wakaba 1.82
1128 wakaba 1.162 <table><thead><tr><th><span title="event handlers">Event handler</span> <th><span>Event handler event type</span>
1129 wakaba 1.130 <tbody><tr><td><dfn id=handler-dedicatedworkerglobalscope-onmessage title=handler-DedicatedWorkerGlobalScope-onmessage><code>onmessage</code></dfn> <td> <code title=event-message>message</code>
1130     </table><p>For the purposes of the <span>offline application cache</span>
1131 wakaba 1.82 networking model, a dedicated worker is an extension of the
1132     <span>cache host</span> from which it was created.</p>
1133    
1134    
1135    
1136 wakaba 1.110 <h4 id=shared-workers-and-the-sharedworkerglobalscope-inteface><span class=secno>4.1.3 </span>Shared workers and the <code><a href=#sharedworkerglobalscope>SharedWorkerGlobalScope</a></code> inteface</h4>
1137 wakaba 1.82
1138 wakaba 1.125 <pre class=idl>[Supplemental, NoInterfaceObject]
1139     interface <dfn id=sharedworkerglobalscope>SharedWorkerGlobalScope</dfn> : <a href=#workerglobalscope>WorkerGlobalScope</a> {
1140 wakaba 1.82 readonly attribute DOMString <a href=#dom-sharedworkerglobalscope-name title=dom-SharedWorkerGlobalScope-name>name</a>;
1141 wakaba 1.171 readonly attribute <span>ApplicationCache</span> <span title=dom-SharedWorkerGlobalScope-applicationCache>applicationCache</span>;
1142 wakaba 1.108 attribute <span>Function</span> <a href=#handler-sharedworkerglobalscope-onconnect title=handler-SharedWorkerGlobalScope-onconnect>onconnect</a>;
1143 wakaba 1.82 };</pre>
1144    
1145     <p>Shared workers receive message ports through <code title=event-WorkerGlobalScope-connect>connect</code> events on
1146     their global object for each connection.</p>
1147    
1148     <p>The <dfn id=dom-sharedworkerglobalscope-name title=dom-SharedWorkerGlobalScope-name><code>name</code></dfn>
1149     attribute must return the value it was assigned when the
1150     <code><a href=#sharedworkerglobalscope>SharedWorkerGlobalScope</a></code> object was created by the
1151     "<a href=#run-a-worker>run a worker</a>" algorithm. Its value represents the name
1152     that can be used to obtain a reference to the worker using the
1153     <code><a href=#sharedworker>SharedWorker</a></code> constructor.</p>
1154    
1155 wakaba 1.162 <p>The following are the <span>event handlers</span> (and their
1156     corresponding <span title="event handler event type">event handler
1157     event types</span>) that must be supported, as IDL attributes, by
1158     objects implementing the <code><a href=#sharedworkerglobalscope>SharedWorkerGlobalScope</a></code>
1159     interface:</p>
1160 wakaba 1.82
1161 wakaba 1.162 <table><thead><tr><th><span title="event handlers">Event handler</span> <th><span>Event handler event type</span>
1162 wakaba 1.130 <tbody><tr><td><dfn id=handler-sharedworkerglobalscope-onconnect title=handler-SharedWorkerGlobalScope-onconnect><code>onconnect</code></dfn> <td> <code title=event-connect>connect</code>
1163     </table><p>For the purposes of the <span>offline application cache</span>
1164 wakaba 1.82 networking model, a shared worker is its own <span>cache
1165     host</span>. The <a href=#run-a-worker>run a worker</a> algorithm takes care of
1166     associating the worker with an <span>application cache</span>.</p>
1167    
1168 wakaba 1.171 <p class=note>The <code title=dom-SharedWorkerGlobalScope-applicationCache>applicationCache</code>
1169 wakaba 1.82 attribute returns the <code>ApplicationCache</code> object for the
1170     worker.</p><!-- normative conf criteria is in the appcache section
1171     -->
1172    
1173    
1174 wakaba 1.141 <h3 id=origins-of-workers><span class=secno>4.2 </span>Origins of workers</h3>
1175 wakaba 1.82
1176     <p>Both the <span>origin</span> and <span>effective script
1177     origin</span> of scripts running in workers are the
1178     <span>origin</span> of the <span>absolute URL</span> given in that
1179     the worker's <code title=dom-WorkerGlobalScope-location><a href=#dom-workerglobalscope-location>location</a></code> attribute
1180     represents.</p>
1181    
1182    
1183    
1184 wakaba 1.172 <h3 id=the-event-loop><span class=secno>4.3 </span>The event loop</h3>
1185 wakaba 1.82
1186 wakaba 1.83 <p>Each <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object has an <span>event
1187     loop</span> distinct from those defined for <span title="unit of
1188     related similar-origin browsing contexts">units of related
1189     similar-origin browsing contexts</span>. This <span>event
1190     loop</span> has no associated <span>browsing context</span>, and its
1191     <span title="task queue">task queues</span> only have events,
1192     callbacks, and networking activity as <span title=concept-task>tasks</span>. The processing model of these
1193     <span title="event loop">event loops</span> is defined below in the
1194     <a href=#run-a-worker>run a worker</a> algorithm.</p>
1195 wakaba 1.82
1196     <p>Each <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object also has a <dfn id=dom-workerglobalscope-closing title=dom-WorkerGlobalScope-closing>closing</dfn> flag, which must
1197     initially be false, but which can get set to true by the algorithms
1198     in the processing model section below.</p>
1199    
1200     <p>Once the <code><a href=#workerglobalscope>WorkerGlobalScope</a></code>'s <a href=#dom-workerglobalscope-closing title=dom-WorkerGlobalScope-closing>closing</a> flag is set to
1201     true, the <span>event loop</span>'s <span title="task queue">task
1202     queues</span> must discard any further <span title=concept-task>tasks</span> that would be added to them (tasks
1203 wakaba 1.161 already on the queue are unaffected except where otherwise
1204 wakaba 1.82 specified). Effectively, once the <a href=#dom-workerglobalscope-closing title=dom-WorkerGlobalScope-closing>closing</a> flag is true,
1205     timers stop firing, notifications for all pending asynchronous
1206     operations are dropped, etc.</p>
1207    
1208    
1209 wakaba 1.104
1210 wakaba 1.172 <h3 id="the-worker's-lifetime"><span class=secno>4.4 </span>The worker's lifetime</h3>
1211 wakaba 1.82
1212     <p>Workers communicate with other workers and with <span title="browsing context">browsing contexts</span> through <span title="channel messaging">message channels</span> and their
1213     <code>MessagePort</code> objects.</p>
1214    
1215     <p>Each <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> <var title="">worker global
1216     scope</var> has a list of <dfn id="the-worker's-ports">the worker's ports</dfn>, which
1217     consists of all the <code>MessagePort</code> objects that are
1218     entangled with another port and that have one (but only one) port
1219     owned by <var title="">worker global scope</var>. This list includes
1220     <!--all the <code>MessagePort</code> objects that are in events
1221     pending in the <span>event loop</span>, as well as (commented out
1222     because in practice it makes no difference either way as far as I
1223     can tell, and it would be hard to strictly implement since these
1224     ports might not yet be across the thread boundary)--> the implicit
1225     <code>MessagePort</code> in the case of <a href=#dedicatedworkerglobalscope title=DedicatedWorkerGlobalScope>dedicated workers</a>.</p>
1226    
1227     <p>Each <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> also has a list of <dfn id="the-worker's-workers">the
1228     worker's workers</dfn>. Initially this list is empty; it is
1229     populated when the worker creates or obtains further workers.</p>
1230    
1231     <p>Finally, each <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> also has a list of
1232     <dfn id="the-worker's-documents">the worker's <code>Document</code>s</dfn>. Initially this list
1233     is empty; it is populated when the worker is created.</p>
1234    
1235     <p>Whenever a <code>Document</code> <var title="">d</var> is <dfn id="add-a-document-to-the-worker's-documents" title="add a document to the worker's documents">added to the
1236     worker's <code>Document</code>s</dfn>, the user agent must, for each
1237     worker in the list of <a href="#the-worker's-workers">the worker's workers</a> whose list
1238     of <a href="#the-worker's-documents">the worker's <code>Document</code>s</a> does not contain
1239     <var title="">d</var>, <a href="#add-a-document-to-the-worker's-documents" title="add a document to the worker's
1240     documents">add <var title="">d</var> to <var title="">q</var>'s
1241     <code>WorkerGlobalScope</code> owner's list of <span>the worker's
1242     <code>Document</code>s</span></a>.</p> <!-- suggestions welcome
1243     on making this sentence into understandable English -->
1244    
1245     <p>Whenever a <code>Document</code> object is <span title="discard a
1246     Document">discarded</span>, it must be removed from the list of
1247     <a href="#the-worker's-documents">the worker's <code>Document</code>s</a> of each worker
1248     whose list contains that <code>Document</code>.</p>
1249    
1250     <p>Given a <span>script's global scope</span> <var title="">o</var>
1251     when creating or obtaining a worker, the <dfn id=list-of-relevant-document-objects-to-add>list of relevant
1252     <code>Document</code> objects to add</dfn> depends on the type of
1253     <var title="">o</var>. If <var title="">o</var> is a
1254     <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object (i.e. if we are creating a
1255     nested worker), then the relevant <code>Document</code>s are the
1256     <code>Document</code>s that are in <var title="">o</var>'s own list
1257     of <a href="#the-worker's-documents">the worker's <code>Document</code>s</a>. Otherwise, <var title="">o</var> is a <code>Window</code> object, and the relevant
1258     <code>Document</code> is just the <code>Document</code> that is the
1259     <span>active document</span> of the <code>Window</code> object <var title="">o</var>.</p>
1260    
1261 wakaba 1.130 <hr><p>A worker is said to be a <dfn id=permissible-worker>permissible worker</dfn> if its
1262 wakaba 1.82 list of <a href="#the-worker's-documents">the worker's <code>Document</code>s</a> is not
1263     empty.</p>
1264    
1265     <p>A worker is said to be a <dfn id=protected-worker>protected worker</dfn> if it is a
1266     <a href=#permissible-worker>permissible worker</a> and either it has outstanding
1267     timers, database transactions, or network connections, or its list
1268     of <a href="#the-worker's-ports">the worker's ports</a> is not empty, or its
1269     <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> is actually a
1270     <code><a href=#sharedworkerglobalscope>SharedWorkerGlobalScope</a></code> object (i.e. the worker is a
1271     shared worker).</p>
1272    
1273     <p>A worker is said to be an <dfn id=active-needed-worker>active needed worker</dfn> if any
1274     of the <code>Document</code> objects in <a href="#the-worker's-documents">the worker's
1275     <code>Document</code>s</a> are <span>fully active</span>.</p>
1276    
1277     <p>A worker is said to be a <dfn id=suspendable-worker>suspendable worker</dfn> if it is
1278     not an <a href=#active-needed-worker>active needed worker</a> but it is a
1279     <a href=#permissible-worker>permissible worker</a>.</p>
1280    
1281    
1282 wakaba 1.172 <h3 id=processing-model><span class=secno>4.5 </span>Processing model</h3>
1283 wakaba 1.82
1284     <p>When a user agent is to <dfn id=run-a-worker>run a worker</dfn> for a script with
1285 wakaba 1.162 <span>URL</span> <var title="">url</var>, a browsing context <var title="">owner browsing context</var>, an origin <var title="">owner
1286     origin</var>, and with global scope <var title="">worker global
1287     scope</var>, it must run the following steps:</p>
1288 wakaba 1.82
1289 wakaba 1.130 <ol><li>
1290 wakaba 1.82
1291     <p>Create a completely separate and parallel execution environment
1292     (i.e. a separate thread or process or equivalent construct), and
1293     run the rest of these steps asynchronously in that context.</p>
1294    
1295     </li>
1296    
1297     <li><p>If <var title="">worker global scope</var> is actually a
1298     <code><a href=#sharedworkerglobalscope>SharedWorkerGlobalScope</a></code> object (i.e. the worker is a
1299     shared worker), and there are any <span title="relevant application
1300     cache">relevant application caches</span> that are identified by a
1301     manifest URL with the <span>same origin</span> as <var title="">url</var> and that have <var title="">url</var> as one of
1302     their entries, <em>not</em> excluding entries marked as <span title=concept-appcache-foreign>foreign</span>, then associate the
1303     <var title="">worker global scope</var> with the <span title=concept-appcache-selection>most appropriate application
1304     cache</span> of those that match.</li>
1305    
1306     <li>
1307    
1308 wakaba 1.162 <p>Attempt to <span>fetch</span> the resource identified by <var title="">url</var>, from the <var title="">owner origin</var>.</p>
1309     <!-- not http-origin privacy sensitive -->
1310 wakaba 1.82
1311 wakaba 1.83 <p>If the attempt fails, or if the attempt involves any redirects
1312     to URIs that do not have the <span>same origin</span> as <var title="">url</var> (even if the final URI is at the <span>same
1313     origin</span> as the original <var title="">url</var>), then for
1314     each <code><a href=#worker>Worker</a></code> or <code><a href=#sharedworker>SharedWorker</a></code> object
1315     associated with <var title="">worker global scope</var>,
1316     <span>queue a task</span> to <span>fire a simple event</span>
1317 wakaba 1.166 named <code title=event-error>error</code> at that
1318 wakaba 1.83 object. Abort these steps.</p>
1319 wakaba 1.82
1320 wakaba 1.172 <p>If the attempt succeeds, then convert the script resource to
1321     Unicode by assuming it was encoded as UTF-8, to obtain its <var title="">source</var>.</p>
1322 wakaba 1.82
1323     <p>Let <var title="">language</var> be JavaScript.</p>
1324    
1325     <p class=note>As with <code>script</code> elements, the MIME
1326     type of the script is ignored. Unlike with <code>script</code>
1327     elements, there is no way to override the type. It's always
1328 wakaba 1.154 assumed to be JavaScript.</p>
1329 wakaba 1.82
1330     </li>
1331    
1332     <li>
1333    
1334     <p>A new <span title=concept-script>script</span> is now
1335     created, as follows.</p>
1336    
1337     <p>Create a new <span>script execution environment</span>
1338     set up as appropriate for the scripting language <var title="">language</var>.</p>
1339    
1340     <p>Parse/compile/initialize <var title="">source</var> using that
1341     <span>script execution environment</span>, as appropriate for <var title="">language</var>, and thus obtain a <span>list of code
1342     entry-points</span>; set the <i>initial code entry-point</i> to
1343     the entry-point for any executable code to be immediately run.</p>
1344    
1345     <p>Set the <span>script's global object</span> to <var title="">worker global scope</var>.</p>
1346    
1347     <p>Set the <span>script's browsing context</span> to <var title="">owner browsing context</var>.</p>
1348    
1349     <p>Set the <span>script's URL character encoding</span> to
1350     UTF-8. (This is just used for encoding non-ASCII characters in the
1351     query component of URLs.)</p>
1352    
1353     <p>Set the <span>script's base URL</span> to <var title="">url</var>.</p>
1354    
1355     </li>
1356    
1357     <li>
1358    
1359     <p><strong>Closing orphan workers</strong>: Start monitoring the
1360     worker such that no sooner than it stops being either a
1361     <a href=#protected-worker>protected worker</a> or a <a href=#suspendable-worker>suspendable
1362     worker</a>, and no later than it stops being a
1363     <a href=#permissible-worker>permissible worker</a>, <var title="">worker global
1364     scope</var>'s <a href=#dom-workerglobalscope-closing title=dom-WorkerGlobalScope-closing>closing</a> flag is set
1365     to true<!-- v2-onclose and <span title="queue a task">a task is
1366 wakaba 1.166 queued</span> to <span>fire a simple event</span> named <code
1367 wakaba 1.82 title="event-close">close</code> at <var title="">worker global
1368     scope</var>-->.</p>
1369    
1370     </li>
1371    
1372     <li>
1373    
1374     <p><strong>Suspending workers</strong>: Start monitoring the
1375     worker, such that whenever <var title="">worker global
1376     scope</var>'s <a href=#dom-workerglobalscope-closing title=dom-WorkerGlobalScope-closing>closing</a> flag is false
1377     and the worker is a <a href=#suspendable-worker>suspendable worker</a>, the user
1378     agent suspends execution of script in that worker until such time
1379     as either the <a href=#dom-workerglobalscope-closing title=dom-WorkerGlobalScope-closing>closing</a> flag switches
1380     to true or the worker stops being a <a href=#suspendable-worker>suspendable
1381     worker</a>.</p>
1382    
1383     </li>
1384    
1385     <li>
1386    
1387     <p><span title="jump to a code entry-point">Jump</span> to the
1388     <span title=concept-script>script</span>'s <i>initial code
1389     entry-point</i>, and let that run until it either returns, fails
1390     to catch an exception, or gets prematurely aborted by the
1391     "<a href=#kill-a-worker>kill a worker</a>" or "<a href=#terminate-a-worker>terminate a worker</a>"
1392     algorithms defined below.</p>
1393    
1394 wakaba 1.122 <!-- v2-onclose
1395     <p class="note">If the script gets aborted by the "<span>kill a
1396     worker</span>" algorithm, then that same algorithm will cause
1397     there to only be a single <span title="concept-task">task</span>
1398 wakaba 1.82 in the <span>event loop</span> at the next step, namely the task
1399 wakaba 1.122 for the <code title="message-close">close</code> event. The
1400     "<span>terminate a worker</span>" algorithm removes all the
1401 wakaba 1.82 events.</p>
1402 wakaba 1.122 -->
1403 wakaba 1.82
1404     </li>
1405    
1406     <li><p>If <var title="">worker global scope</var> is actually a
1407     <code><a href=#dedicatedworkerglobalscope>DedicatedWorkerGlobalScope</a></code> object (i.e. the worker is
1408     a dedicated worker), then enable the <span>port message
1409     queue</span> of the worker's implicit port.</li>
1410    
1411     <li>
1412    
1413     <p><i title="">Event loop</i>: Wait until either there is a <span title=concept-task>task</span> in one of the <span>event
1414     loop</span>'s <span title="task queue">task queues</span> or <var title="">worker global scope</var>'s <a href=#dom-workerglobalscope-closing title=dom-WorkerGlobalScope-closing>closing</a> flag is set
1415     to true.</p>
1416    
1417     </li>
1418    
1419     <li>
1420    
1421     <p>Run the oldest task on one of the <span>event loop</span>'s
1422     <span title="task queue">task queues</span>, if any. The user
1423     agent may pick any <span>task queue</span>.</p>
1424    
1425     <p class=note>The handling of events or the execution of
1426     callbacks might get prematurely aborted by the "<a href=#kill-a-worker>kill a
1427     worker</a>" or "<a href=#terminate-a-worker>terminate a worker</a>" algorithms
1428     defined below.</p>
1429    
1430     </li>
1431    
1432     <li>
1433    
1434     <p>Remove the task run in the previous step, if any, from its
1435     <span>task queue</span>.</p>
1436    
1437     </li>
1438    
1439     <li>
1440    
1441     <p>If there are any more events in the <span>event loop</span>'s
1442     <span title="task queue">task queues</span> or if <var title="">worker global scope</var>'s <a href=#dom-workerglobalscope-closing title=dom-WorkerGlobalScope-closing>closing</a> flag is set
1443     to false, then jump back to the step above labeled <i>event
1444     loop</i>.</p>
1445    
1446     </li>
1447    
1448     <li>
1449    
1450     <p>If there are any outstanding transactions that have callbacks
1451     that involve <span title=concept-script>scripts</span> whose
1452     <span title="script's global object">global object</span> is the
1453     <var title="">worker global scope</var>, roll them back (without
1454     invoking any of the callbacks).</p>
1455    
1456     </li>
1457    
1458     <li>
1459    
1460     <p>Empty the <var title="">worker global scope</var>'s <span>list
1461     of active timeouts</span> and its <span>list of active
1462     intervals</span>.</p>
1463    
1464     </li>
1465    
1466     <!-- v2-onclose
1467     <li>
1468    
1469     <p>For each <code>Worker</code> or <code>SharedWorker</code>
1470     object associated with <var title="">worker global scope</var>,
1471     <span>queue a task</span> to <span>fire a simple event</span>
1472 wakaba 1.166 named <code title="event-close">close</code> at that object.</p>
1473 wakaba 1.82
1474     </li>
1475     -->
1476 wakaba 1.130 </ol><hr><p>When a user agent is to <dfn id=kill-a-worker>kill a worker</dfn> it must
1477 wakaba 1.82 run the following steps in parallel with the worker's main loop (the
1478     "<a href=#run-a-worker>run a worker</a>" processing model defined above):</p>
1479    
1480 wakaba 1.130 <ol><!-- v2-onclose
1481 wakaba 1.82 <li><p>If the worker's <code>WorkerGlobalScope</code> object's
1482     <span title="dom-WorkerGlobalScope-closing">closing</span> flag is
1483     false, <span>queue a task</span> to <span>fire a simple
1484 wakaba 1.166 event</span> named <code title="event-close">close</code> at the
1485 wakaba 1.82 worker's <code>WorkerGlobalScope</code> object.</p></li>
1486 wakaba 1.130 --><li><p>Set the worker's <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object's <a href=#dom-workerglobalscope-closing title=dom-WorkerGlobalScope-closing>closing</a> flag to
1487 wakaba 1.82 true.</li>
1488    
1489     <!-- v2-onclose
1490     <li><p>Wait a user-agent-defined amount of time. If the "<span>run
1491     a worker</span>" processing model defined above immediately starts
1492     running event listeners registered for the <code
1493     title="event-close">close</code> event, this time should not be
1494     zero &mdash; the idea is that the <code
1495     title="event-close">close</code> event can be used to clean up
1496     when shutting down unexpectedly.</p></li>
1497     -->
1498    
1499     <li><p>If there are any <span title=concept-task>tasks</span>
1500     queued in the <span>event loop</span>'s <span title="task
1501     queue">task queues</span><!-- v2-onclose other than the <code
1502     title="event-close">close</code> event that this algorithm just
1503     added-->, discard them without processing them.</li>
1504    
1505     <!-- v2-onclose
1506     <li><p>If the <code title="event-close">close</code> event that
1507     this algorithm just queued hasn't yet been dispatched, then abort
1508     the script currently running in the worker.</p></li>
1509     -->
1510    
1511     <li><p>Wait a user-agent-defined amount of time.</li>
1512    
1513     <li><p>Abort the script currently running in the worker<!--
1514     v2-onclose (if any script is running, then it will be a handler for
1515     the <code title="event-close">close</code> event)-->.</li>
1516    
1517 wakaba 1.130 </ol><p>User agents may invoke the "<a href=#kill-a-worker>kill a worker</a>"
1518 wakaba 1.82 processing model on a worker at any time, e.g. in response to user
1519     requests, in response to CPU quota management, or when a worker
1520     stops being an <a href=#active-needed-worker>active needed worker</a> if the worker
1521     continues executing even after its <a href=#dom-workerglobalscope-closing title=dom-WorkerGlobalScope-closing>closing</a> flag was
1522     set to true.</p>
1523    
1524 wakaba 1.130 <hr><p>When a user agent is to <dfn id=terminate-a-worker>terminate a worker</dfn> it must run
1525 wakaba 1.82 the following steps in parallel with the worker's main loop (the
1526     "<a href=#run-a-worker>run a worker</a>" processing model defined above):</p>
1527    
1528 wakaba 1.130 <ol><li><p>Set the worker's <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object's
1529 wakaba 1.82 <a href=#dom-workerglobalscope-closing title=dom-WorkerGlobalScope-closing>closing</a> flag to
1530     true.</li>
1531    
1532     <li><p>If there are any <span title=concept-task>tasks</span>
1533     queued in the <span>event loop</span>'s <span title="task
1534     queue">task queues</span>, discard them without processing
1535     them.</li>
1536    
1537     <li><p>Abort the script currently running in the worker.</li>
1538    
1539     <li><p>If the worker's <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object is
1540     actually a <code><a href=#dedicatedworkerglobalscope>DedicatedWorkerGlobalScope</a></code> object (i.e. the
1541     worker is a dedicated worker), then empty the <span>port message
1542     queue</span> of the port that the worker's implicit port is
1543     entangled with.</li>
1544    
1545 wakaba 1.130 </ol><hr><p>The <span>task source</span> for the tasks mentioned above is the
1546 wakaba 1.104 <span>DOM manipulation task source</span>.</p>
1547    
1548    
1549 wakaba 1.172 <h3 id=runtime-script-errors><span class=secno>4.6 </span>Runtime script errors</h3>
1550 wakaba 1.82
1551 wakaba 1.108 <p>Whenever an uncaught runtime script error occurs in one of the
1552     worker's scripts, if the error did not occur while handling a
1553     previous script error, the user agent must <span>report the
1554     error</span> using the <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object's <code title=handler-WorkerGlobalScope-onerror><a href=#handler-workerglobalscope-onerror>onerror</a></code>
1555     attribute. <a href=#refsHTML5>[HTML5]</a></p>
1556 wakaba 1.82
1557     <p>For shared workers, if the error is still <i title=concept-error-nothandled>not handled</i> afterwards, or if
1558 wakaba 1.91 the error occurred while handling a previous script error, the error
1559 wakaba 1.108 should be reported to the user. <a href=#refsHTML5>[HTML5]</a></p>
1560 wakaba 1.82
1561     <p>For dedicated workers, if the error is still <i title=concept-error-nothandled>not handled</i> afterwards, or if
1562 wakaba 1.91 the error occurred while handling a previous script error, the user
1563 wakaba 1.82 agent must <span>queue a task</span> to <a href=#fire-a-worker-error-event>fire a worker error
1564     event</a> at the <code><a href=#worker>Worker</a></code> object associated with the
1565     worker.</p>
1566    
1567     <p>When the user agent is to <dfn id=fire-a-worker-error-event>fire a worker error event</dfn> at
1568     a <code><a href=#worker>Worker</a></code> object, it must dispatch an event that uses
1569     the <code><a href=#errorevent>ErrorEvent</a></code> interface, with the name <code title=event-error>error</code>, that doesn't bubble and is
1570     cancelable, with its <code title=dom-ErrorEvent-message><a href=#dom-errorevent-message>message</a></code>, <code title=dom-ErrorEvent-filename><a href=#dom-errorevent-filename>filename</a></code>, and <code title=dom-ErrorEvent-lineno><a href=#dom-errorevent-lineno>lineno</a></code> attributes set
1571     appropriately. The default action of this event depends on whether
1572     the <code><a href=#worker>Worker</a></code> object is itself in a worker. If it is, and
1573     that worker is also a dedicated worker, then the user agent must
1574     again <span>queue a task</span> to <a href=#fire-a-worker-error-event>fire a worker error
1575     event</a> at the <code><a href=#worker>Worker</a></code> object associated with
1576     <em>that</em> worker. Otherwise, then the error should be reported
1577     to the user.</p>
1578    
1579 wakaba 1.104 <p>The <span>task source</span> for the tasks mentioned above is the
1580     <span>DOM manipulation task source</span>.</p>
1581    
1582 wakaba 1.130 <hr><pre class=idl>interface <dfn id=errorevent>ErrorEvent</dfn> : Event {
1583 wakaba 1.109 readonly attribute DOMString <a href=#dom-errorevent-message title=dom-ErrorEvent-message>message</a>;
1584     readonly attribute DOMString <a href=#dom-errorevent-filename title=dom-ErrorEvent-filename>filename</a>;
1585 wakaba 1.82 readonly attribute unsigned long <a href=#dom-errorevent-lineno title=dom-ErrorEvent-lineno>lineno</a>;
1586 wakaba 1.109 void <a href=#dom-errorevent-initerrorevent title=dom-ErrorEvent-initErrorEvent>initErrorEvent</a>(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in DOMString messageArg, in DOMString filenameArg, in unsigned long linenoArg);
1587     void <a href=#dom-errorevent-initerroreventns title=dom-ErrorEvent-initErrorEventNS>initErrorEventNS</a>(in DOMString namespaceURIArg, in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in DOMString messageArg, in DOMString filenameArg, in unsigned long linenoArg);
1588 wakaba 1.82 };</pre>
1589    
1590     <p>The <dfn id=dom-errorevent-initerrorevent title=dom-ErrorEvent-initErrorEvent><code>initErrorEvent()</code></dfn>
1591     and <dfn id=dom-errorevent-initerroreventns title=dom-ErrorEvent-initErrorEventNS><code>initErrorEventNS()</code></dfn>
1592     methods must initialize the event in a manner analogous to the
1593 wakaba 1.126 similarly-named methods in the DOM Events interfaces. <a href=#refsDOMEVENTS>[DOMEVENTS]</a></p>
1594 wakaba 1.82
1595     <p>The <dfn id=dom-errorevent-message title=dom-ErrorEvent-message><code>message</code></dfn>
1596     attribute represents the error message.</p>
1597    
1598     <p>The <dfn id=dom-errorevent-filename title=dom-ErrorEvent-filename><code>filename</code></dfn>
1599     attribute represents the <span>absolute URL</span> of the script in
1600 wakaba 1.91 which the error originally occurred.</p>
1601 wakaba 1.82
1602     <p>The <dfn id=dom-errorevent-lineno title=dom-ErrorEvent-lineno><code>lineno</code></dfn>
1603 wakaba 1.91 attribute represents the line number where the error occurred in the
1604 wakaba 1.82 script.</p>
1605    
1606    
1607    
1608 wakaba 1.172 <h3 id=creating-workers><span class=secno>4.7 </span>Creating workers</h3>
1609 wakaba 1.82
1610 wakaba 1.172 <h4 id=the-abstractworker-abstract-interface><span class=secno>4.7.1 </span>The <code><a href=#abstractworker>AbstractWorker</a></code> abstract interface</h4>
1611 wakaba 1.82
1612     <pre class=idl>interface <dfn id=abstractworker>AbstractWorker</dfn> {
1613 wakaba 1.108 attribute <span>Function</span> <a href=#handler-abstractworker-onerror title=handler-AbstractWorker-onerror>onerror</a>;
1614     <!-- v2-onclose attribute <span>Function</span> <span title="handler-AbstractWorker-onclose">onclose</span>; -->
1615 wakaba 1.155 };
1616     <a href=#abstractworker>AbstractWorker</a> implements <span>EventTarget</span>;</pre>
1617 wakaba 1.82
1618 wakaba 1.162 <p>The following are the <span>event handlers</span> (and their
1619     corresponding <span title="event handler event type">event handler
1620     event types</span>) that must be supported, as IDL attributes, by
1621     objects implementing the <code><a href=#abstractworker>AbstractWorker</a></code> interface:</p>
1622 wakaba 1.82
1623 wakaba 1.162 <table><thead><tr><th><span title="event handlers">Event handler</span> <th><span>Event handler event type</span>
1624 wakaba 1.130 <tbody><tr><td><dfn id=handler-abstractworker-onerror title=handler-AbstractWorker-onerror><code>onerror</code></dfn> <td> <code title=event-error>error</code>
1625 wakaba 1.82 <!-- v2-onclose <tr><td><dfn title="handler-AbstractWorker-onclose"><code>onclose</code></dfn> <td> <code title="event-close">close</code> -->
1626 wakaba 1.172 </table><h4 id=dedicated-workers-and-the-worker-interface><span class=secno>4.7.2 </span>Dedicated workers and the <code><a href=#worker>Worker</a></code> interface</h4>
1627 wakaba 1.82
1628     <pre class=idl>[<a href=#dom-worker title=dom-Worker>Constructor</a>(in DOMString scriptURL)]
1629     interface <dfn id=worker>Worker</dfn> : <a href=#abstractworker>AbstractWorker</a> {
1630     void <a href=#dom-worker-terminate title=dom-Worker-terminate>terminate</a>();
1631    
1632 wakaba 1.159 void <a href=#dom-worker-postmessage title=dom-Worker-postMessage>postMessage</a>(in any message, in optional <span>MessagePortArray</span> ports);<!--
1633 wakaba 1.82 <span>MessagePort</span> <span title="dom-Worker-startConversation">startConversation</span>(in any message);-->
1634 wakaba 1.108 attribute <span>Function</span> <a href=#handler-worker-onmessage title=handler-Worker-onmessage>onmessage</a>;
1635 wakaba 1.82 };</pre>
1636    
1637     <p>The <dfn id=dom-worker-terminate title=dom-Worker-terminate><code>terminate()</code></dfn> method,
1638     when invoked, must cause the "<a href=#terminate-a-worker>terminate a worker</a>"
1639     algorithm to be run on the worker with with the object is
1640     associated.</p>
1641    
1642     <p><code><a href=#worker>Worker</a></code> objects act as if they had an implicit
1643     <code>MessagePort</code> associated with them. This port is part of
1644     a channel that is set up when the worker is created, but it is not
1645     exposed. This object must never be garbage collected before the
1646     <code><a href=#worker>Worker</a></code> object.</p>
1647    
1648     <p>All messages received by that port must immediately be retargeted
1649     at the <code><a href=#worker>Worker</a></code> object.</p>
1650    
1651     <p>The <dfn id=dom-worker-postmessage title=dom-Worker-postMessage><code>postMessage()</code></dfn><!--
1652     and <dfn
1653     title="dom-Worker-startConversation"><code>startConversation()</code></dfn>-->
1654     method<!--s (startConversation)--> on <code><a href=#worker>Worker</a></code> objects
1655     must act as if, when invoked, it<!--/they (startConversation)-->
1656     immediately invoked the method of the same name on the port, with
1657     the same arguments, and returned the same return value.</p>
1658    
1659 wakaba 1.162 <p>The following are the <span>event handlers</span> (and their
1660     corresponding <span title="event handler event type">event handler
1661     event types</span>) that must be supported, as IDL attributes, by
1662     objects implementing the <code><a href=#worker>Worker</a></code> interface:</p>
1663 wakaba 1.82
1664 wakaba 1.162 <table><thead><tr><th><span title="event handlers">Event handler</span> <th><span>Event handler event type</span>
1665 wakaba 1.130 <tbody><tr><td><dfn id=handler-worker-onmessage title=handler-Worker-onmessage><code>onmessage</code></dfn> <td> <code title=event-message>message</code>
1666     </table><hr><p>When the <dfn id=dom-worker title=dom-Worker><code>Worker(<var title="">scriptURL</var>)</code></dfn> constructor is invoked, the
1667 wakaba 1.82 user agent must run the following steps:</p>
1668    
1669 wakaba 1.130 <ol><li><p><span title="resolve a url">Resolve</span> the <var title="">scriptURL</var> argument relative to the <span>first
1670 wakaba 1.92 script</span>'s <span title="script's base URL">base URL</span>,
1671     when the method is invoked.</li>
1672 wakaba 1.82
1673     <li><p>If this fails, throw a <code>SYNTAX_ERR</code>
1674     exception.</li>
1675    
1676 wakaba 1.152 <li>
1677    
1678     <p>If the <span>origin</span> of the resulting <span>absolute
1679     URL</span> is not the <span title="same origin">same</span> as the
1680 wakaba 1.162 origin of the <span>first script</span>, then throw a
1681 wakaba 1.172 <code>SECURITY_ERR</code> exception.</p>
1682 wakaba 1.152
1683     <p class=note>Thus, scripts must be external files with the same
1684     scheme as the original page: you can't load a script from a <code title="">data:</code> URL or <code title="">javascript:</code>
1685     URL, and a <code>https:</code> page couldn't start workers using
1686     scripts with <code>http:</code> URLs.</p>
1687    
1688     </li>
1689 wakaba 1.82
1690 wakaba 1.172 <li><p>Create a new <code><a href=#dedicatedworkerglobalscope>DedicatedWorkerGlobalScope</a></code>
1691     object. Let <var title="">worker global scope</var> be this new
1692     object.</li>
1693 wakaba 1.82
1694     <li><p>Create a new <code><a href=#worker>Worker</a></code> object, associated with
1695     <var title="">worker global scope</var>. Let <var title="">worker</var> be this new object.</li>
1696    
1697 wakaba 1.172 <li><p><span>Create a new <code>MessagePort</code> object</span>
1698     owned by the <span title="script's global scope">global
1699     scope</span> of the <span title=concept-script>script</span> that
1700     invoked the constructor. Let this be the <var title="">outside
1701 wakaba 1.82 port</var>.</li>
1702    
1703     <li><p>Associate the <var title="">outside port</var> with <var title="">worker</var>.</li>
1704    
1705 wakaba 1.172 <li><p><span>Create a new <code>MessagePort</code> object</span>
1706     owned by <var title="">worker global scope</var>. Let <var title="">inside port</var> be this new object.</li>
1707 wakaba 1.82
1708     <li><p>Associate <var title="">inside port</var> with <var title="">worker global scope</var>.</li>
1709    
1710     <li><p><span>Entangle</span> <var title="">outside port</var> and
1711     <var title="">inside port</var>.</li>
1712    
1713     <li><p>Return <var title="">worker</var>, and run the following
1714     steps asynchronously.</li>
1715    
1716     <li><p>Enable <var title="">inside port</var>'s <span>port message
1717     queue</span>.</li>
1718    
1719     <li><p>Enable <var title="">outside port</var>'s <span>port message
1720     queue</span>.</li>
1721    
1722     <li>
1723    
1724     <p>Let <var title="">docs</var> be the <a href=#list-of-relevant-document-objects-to-add>list of relevant
1725     <code>Document</code> objects to add</a> given the <span title="script's global scope">global scope</span> of the <span title=concept-script>script</span> that invoked the
1726     constructor.</p>
1727    
1728     </li>
1729    
1730     <li>
1731    
1732     <p><a href="#add-a-document-to-the-worker's-documents" title="add a document to the worker's documents">Add to
1733     <var title="">worker global scope</var>'s list of <span>the
1734     worker's <code>Document</code>s</span></a> the
1735     <code>Document</code> objects in <var title="">docs</var>.</p>
1736    
1737     </li>
1738    
1739     <li>
1740    
1741     <p>If the <span title="script's global scope">global scope</span>
1742     of the <span title=concept-script>script</span> that invoked the
1743     constructor is a <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object (i.e. we
1744     are creating a nested worker), add <var title="">worker global
1745     scope</var> to the list of <a href="#the-worker's-workers">the worker's workers</a> of the
1746     <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object that is the <span title="script's global scope">global scope</span> of the <span title=concept-script>script</span> that invoked the
1747     constructor.</p>
1748    
1749     </li>
1750    
1751     <li>
1752    
1753     <p><a href=#run-a-worker>Run a worker</a> for the resulting <span>absolute
1754     URL</span>, with the <span>script browsing context</span> of the
1755     script that invoked the method as the <var title="">owner browsing
1756 wakaba 1.162 context</var>, with the <span>origin</span> of the <span>first
1757     script</span> as the <var title="">owner origin</var>, and with
1758     <var title="">worker global scope</var> as the global scope.</p>
1759 wakaba 1.82
1760     </li>
1761    
1762 wakaba 1.130 </ol><p>This constructor must be visible when the <span>script's global
1763 wakaba 1.95 scope</span> is either a <code>Window</code> object or an object
1764     implementing the <code><a href=#workerutils>WorkerUtils</a></code> interface.</p>
1765    
1766    
1767 wakaba 1.172 <h4 id=shared-workers-and-the-sharedworker-interface><span class=secno>4.7.3 </span>Shared workers and the <code><a href=#sharedworker>SharedWorker</a></code> interface</h4>
1768 wakaba 1.82
1769 wakaba 1.159 <pre class=idl>[<a href=#dom-sharedworker title=dom-SharedWorker>Constructor</a>(in DOMString scriptURL, in optional DOMString name)]
1770 wakaba 1.82 interface <dfn id=sharedworker>SharedWorker</dfn> : <a href=#abstractworker>AbstractWorker</a> {
1771     readonly attribute <span>MessagePort</span> <a href=#dom-sharedworker-port title=dom-SharedWorker-port>port</a>;
1772     };</pre>
1773    
1774     <p>The <dfn id=dom-sharedworker-port title=dom-SharedWorker-port><code>port</code></dfn>
1775     attribute must return the value it was assigned by the object's
1776     constructor. It represents the <code>MessagePort</code> for
1777     communicating with the shared worker.</p>
1778    
1779     <p>When the <dfn id=dom-sharedworker title=dom-SharedWorker><code>SharedWorker(<var title="">scriptURL</var>, <var title="">name</var>)</code></dfn>
1780     constructor is invoked, the user agent must run the following
1781     steps:</p>
1782    
1783 wakaba 1.130 <ol><li><p><span title="resolve a url">Resolve</span> the <var title="">scriptURL</var> argument.</li>
1784 wakaba 1.82
1785     <li><p>If this fails, throw a <code>SYNTAX_ERR</code>
1786     exception.</li>
1787    
1788 wakaba 1.139 <li><p>Otherwise, let <var title="">scriptURL</var> be the
1789     resulting <span>absolute URL</span>.</li>
1790    
1791     <li><p>Let <var title="">name</var> be the value of the second
1792 wakaba 1.144 argument, or the empty string if the second argument was
1793     omitted.</li>
1794 wakaba 1.139
1795 wakaba 1.152 <li>
1796    
1797     <p>If the <span>origin</span> of <var title="">scriptURL</var> is
1798     not the <span title="same origin">same</span> as the origin of the
1799 wakaba 1.172 <span>first script</span>, then throw a <code>SECURITY_ERR</code>
1800     exception.</p>
1801 wakaba 1.152
1802     <p class=note>Thus, scripts must be external files with the same
1803     scheme as the original page: you can't load a script from a <code title="">data:</code> URL or <code title="">javascript:</code>
1804     URL, and a <code>https:</code> page couldn't start workers using
1805     scripts with <code>http:</code> URLs.</p>
1806    
1807     </li>
1808 wakaba 1.82
1809     <li>
1810    
1811     <p>Let <var title="">docs</var> be the <a href=#list-of-relevant-document-objects-to-add>list of relevant
1812     <code>Document</code> objects to add</a> given the <span title="script's global scope">global scope</span> of the <span title=concept-script>script</span> that invoked the
1813     constructor.</p>
1814    
1815     </li>
1816    
1817     <li>
1818    
1819     <p>Execute the following substeps atomically:</p>
1820    
1821 wakaba 1.130 <ol><li><p>Create a new <code><a href=#sharedworker>SharedWorker</a></code> object, which will
1822 wakaba 1.82 shortly be associated with a <code><a href=#sharedworkerglobalscope>SharedWorkerGlobalScope</a></code>
1823     object. Let this <code><a href=#sharedworker>SharedWorker</a></code> object be <var title="">worker</var>.</li>
1824    
1825 wakaba 1.172 <li><p><span>Create a new <code>MessagePort</code> object</span>
1826 wakaba 1.82 owned by the <span title="script's global scope">global
1827     scope</span> of the script that invoked the method. Let this be
1828     the <var title="">outside port</var>.</li>
1829    
1830     <li><p>Assign <var title="">outside port</var> to the <code title=dom-SharedWorker-port><a href=#dom-sharedworker-port>port</a></code> attribute of <var title="">worker</var>.</li>
1831    
1832 wakaba 1.144 <li><p>Let <var title="">worker global scope</var> be
1833     null.</li>
1834    
1835     <li><p>If <var title="">name</var> is not the empty string and
1836     there exists a <code><a href=#sharedworkerglobalscope>SharedWorkerGlobalScope</a></code> object whose
1837     <a href=#dom-workerglobalscope-closing title=dom-WorkerGlobalScope-closing>closing</a> flag
1838     is false, whose <code title=dom-WorkerGlobalScope-name>name</code> attribute is
1839     exactly equal to <var title="">name</var>, and whose <code title=dom-WorkerGlobalScope-location><a href=#dom-workerglobalscope-location>location</a></code> attribute
1840     represents an <span>absolute URL</span> with the <span>same
1841     origin</span> as <var title="">scriptURL</var>, then let <var title="">worker global scope</var> be that
1842     <code><a href=#sharedworkerglobalscope>SharedWorkerGlobalScope</a></code> object.</li>
1843    
1844     <li><p>Otherwise, if <var title="">name</var> is the empty string
1845     and there exists a <code><a href=#sharedworkerglobalscope>SharedWorkerGlobalScope</a></code> object
1846     whose <a href=#dom-workerglobalscope-closing title=dom-WorkerGlobalScope-closing>closing</a>
1847     flag is false, and whose <code title=dom-WorkerGlobalScope-location><a href=#dom-workerglobalscope-location>location</a></code> attribute
1848     is exactly equal to <var title="">scriptURL</var>, then let <var title="">worker global scope</var> be that
1849     <code><a href=#sharedworkerglobalscope>SharedWorkerGlobalScope</a></code> object.</li>
1850    
1851 wakaba 1.82 <li>
1852    
1853 wakaba 1.144 <p>If <var title="">worker global scope</var> is not null, then
1854     run these steps:</p>
1855 wakaba 1.82
1856 wakaba 1.144 <ol><li><p>If <var title="">worker global scope</var>'s <code title=dom-WorkerGlobalScope-location><a href=#dom-workerglobalscope-location>location</a></code>
1857 wakaba 1.82 attribute represents an <span>absolute URL</span> that is not
1858 wakaba 1.139 exactly equal to <var title="">scriptURL</var>, then throw a
1859     <code>URL_MISMATCH_ERR</code> exception and abort all these
1860     steps.</li>
1861 wakaba 1.82
1862     <li><p>Associate <var title="">worker</var> with <var title="">worker global scope</var>.</li>
1863    
1864 wakaba 1.172 <li><p><span>Create a new <code>MessagePort</code>
1865     object</span> owned by <var title="">worker global
1866     scope</var>. Let this be the <var title="">inside
1867     port</var>.</li>
1868 wakaba 1.82
1869     <li><p><span>Entangle</span> <var title="">outside port</var>
1870     and <var title="">inside port</var>.</li>
1871    
1872     <li><p>Return <var title="">worker</var> and perform the next
1873     step asynchronously.</li>
1874    
1875     <li><p>Create an event that uses the <code>MessageEvent</code>
1876     interface, with the name <code title=event-connect>connect</code>, which does not bubble, is
1877     not cancelable, has no default action, has a <code title=dom-MessageEvent-data>data</code> attribute whose value
1878     is the empty string and has a <code title=dom-MessageEvent-ports>ports</code> attribute whose
1879     value is an array containing only the newly created port, and
1880     <span>queue a task</span> to dispatch the event at <var title="">worker global scope</var>.</li>
1881    
1882     <li>
1883    
1884     <p><a href="#add-a-document-to-the-worker's-documents" title="add a document to the worker's documents">Add to
1885     <var title="">worker global scope</var>'s list of <span>the
1886     worker's <code>Document</code>s</span></a> the
1887     <code>Document</code> objects in <var title="">docs</var>.</p>
1888    
1889     </li>
1890    
1891     <li>
1892    
1893     <p>If the <span title="script's global scope">global
1894     scope</span> of the <span title=concept-script>script</span>
1895     that invoked the constructor is a
1896     <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object, add <var title="">worker global scope</var> to the list of <a href="#the-worker's-workers">the
1897     worker's workers</a> of the <code><a href=#workerglobalscope>WorkerGlobalScope</a></code>
1898     object that is the <span title="script's global scope">global
1899     scope</span> of the <span title=concept-script>script</span>
1900     that invoked the constructor.</p>
1901    
1902     </li>
1903    
1904     <li><p>Abort all these steps.</li>
1905    
1906 wakaba 1.130 </ol></li>
1907 wakaba 1.82
1908 wakaba 1.172 <li><p>Create a new <code><a href=#sharedworkerglobalscope>SharedWorkerGlobalScope</a></code>
1909     object. Let <var title="">worker global scope</var> be this new
1910     object.</li>
1911 wakaba 1.82
1912     <li><p>Associate <var title="">worker</var> with <var title="">worker global scope</var>.</li>
1913    
1914     <li><p>Set the <code title=dom-SharedWorkerGlobalScope-name><a href=#dom-sharedworkerglobalscope-name>name</a></code> attribute of
1915     <var title="">worker global scope</var> to <var title="">name</var>.</li>
1916    
1917 wakaba 1.172 <li><p><span>Create a new <code>MessagePort</code> object</span>
1918 wakaba 1.82 owned by <var title="">worker global scope</var>. Let <var title="">inside port</var> be this new object.</li>
1919    
1920     <li><p><span>Entangle</span> <var title="">outside port</var> and
1921     <var title="">inside port</var>.</li>
1922    
1923 wakaba 1.130 </ol></li>
1924 wakaba 1.82
1925     <li><p>Return <var title="">worker</var> and perform the remaining
1926     steps asynchronously.</li>
1927    
1928     <li><p>Create an event that uses the <code>MessageEvent</code>
1929     interface, with the name <code title=event-connect>connect</code>, which does not bubble, is not
1930     cancelable, has no default action, has a <code title=dom-MessageEvent-data>data</code> attribute whose value is
1931     the empty string and has a <code title=dom-MessageEvent-ports>ports</code> attribute whose value
1932     is an array containing only the newly created port, and <span>queue
1933     a task</span> to dispatch the event at <var title="">worker global
1934     scope</var>.</li>
1935    
1936     <li>
1937    
1938     <p><a href="#add-a-document-to-the-worker's-documents" title="add a document to the worker's documents">Add to
1939     <var title="">worker global scope</var>'s list of <span>the
1940     worker's <code>Document</code>s</span></a> the
1941     <code>Document</code> objects in <var title="">docs</var>.</p>
1942    
1943     </li>
1944    
1945     <li>
1946    
1947     <p>If the <span title="script's global scope">global scope</span>
1948     of the <span title=concept-script>script</span> that invoked the
1949     constructor is a <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object, add <var title="">worker global scope</var> to the list of <a href="#the-worker's-workers">the
1950     worker's workers</a> of the <code><a href=#workerglobalscope>WorkerGlobalScope</a></code>
1951     object that is the <span title="script's global scope">global
1952     scope</span> of the <span title=concept-script>script</span>
1953     that invoked the constructor.</p>
1954    
1955     </li>
1956    
1957     <li>
1958    
1959 wakaba 1.139 <p><a href=#run-a-worker>Run a worker</a> for <var title="">scriptURL</var>,
1960     with the <span>script browsing context</span> of the script that
1961     invoked the method as the <var title="">owner browsing
1962 wakaba 1.162 context</var>, with the <span>origin</span> of the <span>first
1963     script</span> as the <var title="">owner origin</var>, and with
1964     <var title="">worker global scope</var> as the global scope.</p>
1965 wakaba 1.82
1966     </li>
1967    
1968 wakaba 1.130 </ol><p>This constructor must be visible when the <span>script's global
1969 wakaba 1.95 scope</span> is either a <code>Window</code> object or an object
1970     implementing the <code><a href=#workerutils>WorkerUtils</a></code> interface.</p>
1971 wakaba 1.104
1972     <p>The <span>task source</span> for the tasks mentioned above is the
1973     <span>DOM manipulation task source</span>.</p>
1974 wakaba 1.95
1975    
1976    
1977 wakaba 1.110 <h2 id=apis-available-to-workers><span class=secno>5 </span>APIs available to workers</h2>
1978 wakaba 1.82
1979 wakaba 1.125 <pre class=idl>[Supplemental, NoInterfaceObject]
1980     interface <dfn id=workerutils>WorkerUtils</dfn> {
1981     void <a href=#dom-workerglobalscope-importscripts title=dom-WorkerGlobalScope-importScripts>importScripts</a>(in DOMString... urls);
1982 wakaba 1.82 readonly attribute <a href=#worker-navigator title=worker-Navigator>Navigator</a> <a href=#dom-worker-navigator title=dom-worker-navigator>navigator</a>;
1983 wakaba 1.125 };
1984 wakaba 1.172 <a href=#workerutils>WorkerUtils</a> implements <span>WindowTimers</span>;</pre>
1985 wakaba 1.82
1986 wakaba 1.155 <p>The DOM APIs (<code>Node</code> objects, <code>Document</code>
1987 wakaba 1.82 objects, etc) are not available to workers in this version of this
1988     specification.</p>
1989    
1990    
1991 wakaba 1.110 <h3 id=importing-scripts-and-libraries><span class=secno>5.1 </span>Importing scripts and libraries</h3>
1992 wakaba 1.82
1993     <p>When a script invokes the <dfn id=dom-workerglobalscope-importscripts title=dom-WorkerGlobalScope-importScripts><code>importScripts(<var title="">urls</var>)</code></dfn> method on a
1994     <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object, the user agent must run the
1995     following steps:</p>
1996    
1997 wakaba 1.130 <ol><li><p>If there are no arguments, return without doing
1998 wakaba 1.82 anything. Abort these steps.</li>
1999    
2000     <li><p><span title="resolve a url">Resolve</span> each
2001     argument.</li>
2002    
2003     <li><p>If any fail, throw a <code>SYNTAX_ERR</code>
2004     exception.</li>
2005    
2006     <!--
2007     <li><p>If any of the resulting <span title="absolute URL">absolute
2008     URLs</span> have an <span>origin</span> that is not the <span
2009     title="same origin">same</span> as the origin of the script that
2010 wakaba 1.172 invoked the method, then throw a <code>SECURITY_ERR</code>
2011     exception.</p></li>
2012 wakaba 1.82 -->
2013    
2014     <li>
2015    
2016     <p>Attempt to <span>fetch</span> each resource identified by the
2017 wakaba 1.162 resulting <span title="absolute URLs">absolute URL</span>, from
2018     the <span>first script</span>'s <span>origin</span>.</p> <!-- not
2019     http-origin privacy sensitive -->
2020 wakaba 1.82
2021     </li>
2022    
2023     <li>
2024    
2025     <p>For each argument in turn, in the order given, starting with
2026     the first one, run these substeps:</p>
2027    
2028 wakaba 1.130 <ol><li>
2029 wakaba 1.82
2030     <p>Wait for the fetching attempt for the corresponding resource
2031     to complete.</p>
2032    
2033     <p>If the fetching attempt failed, throw a
2034     <code>NETWORK_ERR</code> exception and abort all these
2035     steps.</p>
2036    
2037 wakaba 1.172 <p>If the attempt succeeds, then convert the script resource to
2038     Unicode by assuming it was encoded as UTF-8, to obtain its <var title="">source</var>.</p>
2039 wakaba 1.82
2040     <p>Let <var title="">language</var> be JavaScript.</p>
2041    
2042     <p class=note>As with the worker's script, the script here is
2043     always assumed to be JavaScript, regardless of the MIME
2044 wakaba 1.154 type.</p>
2045 wakaba 1.82
2046     </li>
2047    
2048     <li>
2049    
2050     <p><span>Create a script</span>, using <var title="">source</var> as the script source and <var title="">language</var> as the scripting language, using the
2051     same global object, browsing context, character encoding, base
2052     URL, and script group as the <span title=concept-script>script</span> that was created by the
2053     worker's <a href=#run-a-worker>run a worker</a> algorithm.</p>
2054    
2055     <p>Let the newly created <span title=concept-script>script</span> run until it either
2056     returns, fails to parse, fails to catch an exception, or gets
2057     prematurely aborted by the "<a href=#kill-a-worker>kill a worker</a>" or
2058     "<a href=#terminate-a-worker>terminate a worker</a>" algorithms defined above.</p>
2059    
2060 wakaba 1.154 <p>If it failed to parse, then throw a <code>SyntaxError</code>
2061     exception and abort all these steps.</p>
2062 wakaba 1.82
2063     <p>If an exception was raised or if the script was prematurely
2064     aborted, then abort all these steps, letting the exception or
2065     aborting continue to be processed by the script that called the
2066     <code title=dom-WorkerGlobalScope-importScripts><a href=#dom-workerglobalscope-importscripts>importScripts()</a></code>
2067     method.</p>
2068    
2069     <p>If the "<a href=#kill-a-worker>kill a worker</a>" or "<a href=#terminate-a-worker>terminate a
2070     worker</a>" algorithms abort the script then abort all these
2071     steps.</p>
2072    
2073     </li>
2074    
2075 wakaba 1.130 </ol></li>
2076 wakaba 1.82
2077 wakaba 1.130 </ol><h3 id=the-navigator-object><span class=secno>5.2 </span>The <code title=worker-Navigator><a href=#worker-navigator>Navigator</a></code> object</h3>
2078 wakaba 1.82
2079     <p>The <dfn id=dom-worker-navigator title=dom-worker-navigator><code>navigator</code></dfn> attribute
2080     of the <code><a href=#workerutils>WorkerUtils</a></code> interface must return an instance of
2081     the <code title=worker-Navigator><a href=#worker-navigator>Navigator</a></code> interface, which
2082     represents the identity and state of the user agent (the
2083     client):</p>
2084    
2085 wakaba 1.125 <pre class=idl>interface <dfn id=worker-navigator title=worker-Navigator>Navigator</dfn> {};
2086     <a href=#worker-navigator title=worker-Navigator>Navigator</a> implements <span>NavigatorID</span>;
2087     <a href=#worker-navigator title=worker-Navigator>Navigator</a> implements <span>NavigatorOnLine</span>;</pre>
2088    
2089     <p>Objects implementing the <code title=worker-Navigator><a href=#worker-navigator>Navigator</a></code> interface also implement
2090     the <code>NavigatorID</code> and <code>NavigatorOnLine</code>
2091     interfaces. <a href=#refsHTML5>[HTML5]</a></p>
2092 wakaba 1.82
2093     <p class=note>The <code title=worker-Navigator><a href=#worker-navigator>Navigator</a></code>
2094     interface defined in this specification is different than the one
2095 wakaba 1.84 defined in the HTML specification.</p>
2096 wakaba 1.82
2097    
2098    
2099 wakaba 1.110 <h3 id=apis-defined-in-other-specifications><span class=secno>5.3 </span>APIs defined in other specifications</h3>
2100 wakaba 1.82
2101     <p>The <code title=dom-opendatabase>openDatabase()</code> and
2102     <code title=dom-opendatabase-sync>openDatabaseSync()</code>
2103 wakaba 1.108 methods are defined in the Web Database specification. <a href=#refsWEBDATABASE>[WEBDATABASE]</a></p>
2104 wakaba 1.82
2105    
2106    
2107 wakaba 1.110 <h3 id=interface-objects-and-constructors><span class=secno>5.4 </span>Interface objects and constructors</h3>
2108 wakaba 1.82
2109     <p>There must be no interface objects and constructors available in
2110     the global scope of scripts whose <span>script execution
2111     context</span> is a <code><a href=#workerglobalscope>WorkerGlobalScope</a></code> object except for
2112     the following:</p>
2113    
2114 wakaba 1.130 <ul><li><p><code>XMLHttpRequest</code> and all interface objects and
2115 wakaba 1.82 constructors defined by the XMLHttpRequest specifications, except
2116     that the <span>document response entity body</span> must always be
2117 wakaba 1.141 null. The <span><code>XMLHttpRequest</code> base URL</span> is the
2118     <span>script's base URL</span>; the
2119     <span><code>XMLHttpRequest</code> origin</span> is the script's
2120     <span>origin</span>. <a href=#refsXHR>[XHR]</a></li>
2121 wakaba 1.82
2122     <li><p>The <code>WebSocket</code> interface object and
2123     constructor. <a href=#refsWEBSOCKET>[WEBSOCKET]</a></li>
2124    
2125     <li><p>The <code>EventSource</code> interface object and
2126     constructor. <a href=#refsEVENTSOURCE>[EVENTSOURCE]</a></li>
2127    
2128     <li><p>The <code>MessageChannel</code> interface object and
2129     constructor. <a href=#refsHTML5>[HTML5]</a></li>
2130    
2131 wakaba 1.172 <li><p>The <code title=dom-Worker><a href=#dom-worker>Worker</a></code> and <code title=dom-SharedWorker><a href=#dom-sharedworker>SharedWorker</a></code> interface objects and
2132     constructors.</li>
2133 wakaba 1.82
2134 wakaba 1.130 </ul><h3 id=worker-locations><span class=secno>5.5 </span>Worker locations</h3>
2135 wakaba 1.82
2136     <pre class=idl>interface <dfn id=workerlocation>WorkerLocation</dfn> {
2137     readonly attribute DOMString <a href=#dom-workerlocation-href title=dom-WorkerLocation-href>href</a>;
2138     readonly attribute DOMString <a href=#dom-workerlocation-protocol title=dom-WorkerLocation-protocol>protocol</a>;
2139     readonly attribute DOMString <a href=#dom-workerlocation-host title=dom-WorkerLocation-host>host</a>;
2140     readonly attribute DOMString <a href=#dom-workerlocation-hostname title=dom-WorkerLocation-hostname>hostname</a>;
2141     readonly attribute DOMString <a href=#dom-workerlocation-port title=dom-WorkerLocation-port>port</a>;
2142     readonly attribute DOMString <a href=#dom-workerlocation-pathname title=dom-WorkerLocation-pathname>pathname</a>;
2143     readonly attribute DOMString <a href=#dom-workerlocation-search title=dom-WorkerLocation-search>search</a>;
2144     readonly attribute DOMString <a href=#dom-workerlocation-hash title=dom-WorkerLocation-hash>hash</a>;
2145     };</pre>
2146    
2147     <p>A <code><a href=#workerlocation>WorkerLocation</a></code> object represents an <span>absolute
2148     URL</span> set at its creation.</p>
2149    
2150     <p>The <dfn id=dom-workerlocation-href title=dom-WorkerLocation-href><code>href</code></dfn>
2151     attribute must return the <span>absolute URL</span> that the object
2152     represents.</p>
2153    
2154     <p>The <code><a href=#workerlocation>WorkerLocation</a></code> interface also has the complement
2155 wakaba 1.143 of <span>URL decomposition IDL attributes</span>, <dfn id=dom-workerlocation-protocol title=dom-WorkerLocation-protocol><code>protocol</code></dfn>,
2156 wakaba 1.82 <dfn id=dom-workerlocation-host title=dom-WorkerLocation-host><code>host</code></dfn>, <dfn id=dom-workerlocation-port title=dom-WorkerLocation-port><code>port</code></dfn>, <dfn id=dom-workerlocation-hostname title=dom-WorkerLocation-hostname><code>hostname</code></dfn>,
2157     <dfn id=dom-workerlocation-pathname title=dom-WorkerLocation-pathname><code>pathname</code></dfn>,
2158     <dfn id=dom-workerlocation-search title=dom-WorkerLocation-search><code>search</code></dfn>,
2159     and <dfn id=dom-workerlocation-hash title=dom-WorkerLocation-hash><code>hash</code></dfn>. These must
2160 wakaba 1.143 follow the rules given for URL decomposition IDL attributes, with the
2161 wakaba 1.82 <span title=concept-uda-input>input</span> being the
2162     <span>absolute URL</span> that the object represents (same as the
2163     <code title=dom-WorkerLocation-href><a href=#dom-workerlocation-href>href</a></code> attribute), and
2164     the <span title=concept-uda-setter>common setter action</span>
2165     being a no-op, since the attributes are defined to be readonly. <a href=#refsHTML5>[HTML5]</a></p>
2166 wakaba 1.147
2167 wakaba 1.166 <!--START vCard--><!--START vEvent-->
2168 wakaba 1.82
2169 wakaba 1.134 <h2 class=no-num id=references>References</h2><!--REFS-->
2170 wakaba 1.82
2171 wakaba 1.166 <!--END vCard--><!--END vEvent-->
2172 wakaba 1.128 <p>All references are normative unless marked "Non-normative".</p>
2173 wakaba 1.166 <!--START vCard--><!--START vEvent-->
2174 wakaba 1.128
2175 wakaba 1.130 <dl><dt id=refsDOMCORE>[DOMCORE]</dt>
2176 wakaba 1.129 <dd><cite><a href=http://www.w3.org/TR/DOM-Level-3-Core/>Document
2177     Object Model (DOM) Level 3 Core Specification</a></cite>, A. Le
2178     Hors, P. Le Hegaret, L. Wood, G. Nicol, J. Robie, M. Champion,
2179     S. Byrnes. W3C, April 2004.</dd>
2180     <!--
2181     <dd><cite><a href="http://simon.html5.org/specs/web-dom-core">Web
2182     DOM Core</a></cite>, S. Pieters. W3C, June 2009.</dd>
2183     -->
2184    
2185 wakaba 1.128 <dt id=refsDOMEVENTS>[DOMEVENTS]</dt>
2186     <!--
2187     <dd><cite><a
2188     href="http://www.w3.org/TR/DOM-Level-3-Events/">Document Object
2189     Model (DOM) Level 3 Events Specification</a></cite>,
2190     B. H&ouml;hrmann, P. Le Hegaret, T. Pixley. W3C, December
2191     2007.</dd>
2192     -->
2193     <dd><cite><a href=http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html>Document
2194     Object Model (DOM) Level 3 Events Specification</a></cite>,
2195     D. Schepers. W3C, July 2009.</dd>
2196    
2197     <dt id=refsECMA262>[ECMA262]</dt>
2198     <dd><cite><a href=http://www.ecma-international.org/publications/standards/Ecma-262.htm>ECMAScript
2199     Language Specification</a></cite>. ECMA, December 1999.</dd>
2200    
2201     <dt id=refsEVENTSOURCE>[EVENTSOURCE]</dt>
2202     <!--
2203     <dd><cite><a href="http://www.w3.org/TR/eventsource/">Server-Sent
2204     Events</a></cite>, I. Hickson. W3C, April 2009.</dd>
2205     -->
2206     <dd><cite><a href=http://dev.w3.org/html5/eventsource/>Server-Sent
2207     Events</a></cite>, I. Hickson. W3C, July 2009.</dd>
2208    
2209     <dt id=refsHTML5>[HTML5]</dt>
2210     <!--
2211 wakaba 1.142 <dd><cite><a href="http://www.w3.org/TR/html5/">HTML5</a></cite>,
2212 wakaba 1.128 I. Hickson, D. Hyatt. W3C, April 2009.</dd>
2213 wakaba 1.142 <dd><cite><a
2214     href="http://www.w3.org/html/wg/html5/">HTML5</a></cite>,
2215     I. Hickson, D. Hyatt. W3C, August 2009.</dd>
2216 wakaba 1.128 -->
2217 wakaba 1.142 <dd><cite><a href=http://www.whatwg.org/specs/web-apps/current-work/>HTML5</a></cite>,
2218     I. Hickson. WHATWG, August 2009.</dd>
2219 wakaba 1.128
2220 wakaba 1.129 <dt id=refsRFC2119>[RFC2119]</dt>
2221     <dd><cite><a href=http://www.ietf.org/rfc/rfc2119.txt>Key words for use in
2222     RFCs to Indicate Requirement Levels</a></cite>, S. Bradner. IETF, March
2223     1997.</dd>
2224    
2225 wakaba 1.128 <dt id=refsWEBDATABASE>[WEBDATABASE]</dt>
2226     <dd><cite><a href=http://dev.w3.org/html5/webdatabase/>Web
2227     Database</a></cite>, I. Hickson. W3C, July
2228     2009.</dd>
2229 wakaba 1.129
2230     <dt id=refsWEBIDL>[WEBIDL]</dt>
2231     <!--
2232     <dd><cite><a href="http://www.w3.org/TR/WebIDL/">Web
2233     IDL</a></cite>, C. McCormack. W3C, December 2008.</dd>
2234     -->
2235     <dd><cite><a href=http://dev.w3.org/2006/webapi/WebIDL/>Web
2236     IDL</a></cite>, C. McCormack. W3C, July 2009.</dd>
2237 wakaba 1.128
2238     <dt id=refsWEBSOCKET>[WEBSOCKET]</dt>
2239     <!--
2240     <dd><cite><a href="http://www.w3.org/TR/websockets/">The Web Sockets
2241     API</a></cite>, I. Hickson. W3C, April
2242     2009.</dd>
2243     -->
2244     <dd><cite><a href=http://dev.w3.org/html5/websockets/>The Web Sockets
2245     API</a></cite>, I. Hickson. W3C, August
2246     2009.</dd>
2247    
2248     <dt id=refsXHR>[XHR]</dt>
2249     <!--
2250     <dd><cite><a href="http://www.w3.org/TR/XMLHttpRequest/">The XMLHttpRequest
2251     Object</a></cite>, A. van Kesteren. W3C, April
2252     2008.</dd>
2253     -->
2254 wakaba 1.141 <dd><cite><a href=http://dev.w3.org/2006/webapi/XMLHttpRequest-2/><code>XMLHttpRequest</code></a></cite>,
2255 wakaba 1.128 A. van Kesteren. W3C, June 2009.</dd>
2256    
2257 wakaba 1.166 </dl><!--END vCard--><!--END vEvent--><h2 class=no-num id=acknowledgements>Acknowledgements</h2> <!-- ACKS -->
2258 wakaba 1.82
2259     <p>Thanks to
2260    
2261     Aaron Boodman,
2262 wakaba 1.130 &#1040;&#1083;&#1077;&#1082;&#1089;&#1077;&#1081; &#1055;&#1088;&#1086;&#1089;&#1082;&#1091;&#1088;&#1103;&#1082;&#1086;&#1074; (Alexey Proskuryakov),
2263 wakaba 1.82 Anne van Kesteren,
2264     Ben Turner,
2265     Dmitry Titov,
2266     Drew Wilson,
2267     Jeremy Orlow,
2268     Jonas Sicking,
2269     Justin James,
2270     Kevin Hakanson,
2271     Maciej Stachowiak,
2272     Michael Nordman,
2273     Mike Smith,
2274    
2275     and
2276    
2277     Philip Taylor
2278    
2279     for their useful and substantial comments.</p>
2280    
2281     <p>Huge thanks to the whole Gears team, who pioneered this
2282     technology and whose experience has been a huge influence on this
2283     specification.</p>
2284    
2285    

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24