/[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.195 - (hide annotations) (download) (as text)
Wed Mar 3 06:24:31 2010 UTC (16 years, 6 months ago) by wakaba
Branch: MAIN
Changes since 1.194: +2 -2 lines
File MIME type: text/html
make

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24