/[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.165 - (hide annotations) (download) (as text)
Sun Oct 4 06:18:54 2009 UTC (16 years, 5 months ago) by wakaba
Branch: MAIN
Changes since 1.164: +1 -1 lines
File MIME type: text/html
make

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

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24