Rubber-stamped by Brady Eidson.
[webbrowser.git] / LayoutTests / fast / workers / worker-close.html
blobfd8dfd8dba7e9c34c5b95bc140ff9310ec0dfe4c
1 <body>
2 <p>Test WorkerContext.close functionality. Should print a series of PASS messages, followed with DONE.</p>
3 <div id=result></div>
4 <script>
5 function log(message)
7 document.getElementById("result").innerHTML += message + "<br>";
10 if (window.layoutTestController)
12 layoutTestController.dumpAsText();
13 layoutTestController.waitUntilDone();
16 var worker = new Worker('resources/worker-close.js');
17 var timeout = 0;
19 worker.postMessage("typeofClose");
20 worker.onmessage = testTypeofClose;
22 function testTypeofClose(evt)
24 if (evt.data == "typeof close: function")
25 log("PASS: " + evt.data);
26 else
27 log("FAIL: " + evt.data);
28 worker.onmessage = testMessageAfterClose;
29 worker.postMessage("ping");
32 function testMessageAfterClose(evt) {
33 if (evt.data == "pong")
34 log("PASS: received message before close");
35 else
36 log("FAIL: received unknown response: " + evt.data);
38 // Tell the worker to close, then send a followup message
39 // which should not be delivered.
40 worker.postMessage("close");
41 worker.onmessage = function(evt) {
42 log("FAIL: Received message after worker closed: " + evt.data);
43 done();
45 // Make sure that messages don't arrive at the remote end - since they
46 // can't send back response messages, we'll have the worker throw an
47 // exception instead (errors are still propagated to the caller even after
48 // close()).
49 worker.postMessage("throw");
50 worker.onerror = function(evt) {
51 log("FAIL: message delivered after close(): " + evt.message);
52 done();
54 timeout = setTimeout(testErrorAfterClose, 1000);
57 function testErrorAfterClose()
59 log("PASS: messages sent after close() are ignored");
60 // Test that errors are delivered after close.
61 worker = new Worker('resources/worker-close.js');
62 worker.postMessage("closeWithError");
63 worker.onerror = function(event) {
64 log("PASS: Error arrived after close: " + event.message);
65 testPendingEvents();
66 return false;
70 function testPendingEvents()
72 // Now test that workers do not deliver pending events
73 worker = new Worker('resources/worker-close.js');
74 worker.postMessage("closeWithPendingEvents");
75 worker.onmessage = function(evt) {
76 log("FAIL: pending events should not fire:" + evt.data);
77 done();
79 worker.onerror = function(evt) {
80 log("FAIL: pending events should not fire:" + evt.message);
81 done();
83 timeout = setTimeout(testTerminateAfterClose, 500);
86 function testTerminateAfterClose()
88 log("PASS: close() did not dispatch pending events");
89 worker = new Worker('resources/worker-class.js');
90 worker.postMessage("close");
91 worker.onmessage = function(evt) {
92 log("FAIL: Received message after worker closed: " + evt.data);
93 done();
95 // Give worker a chance to close first, then terminate it.
96 timeout = setTimeout(function() {
97 worker.terminate();
98 done();
99 }, 500);
102 function done() {
103 if (timeout)
104 clearTimeout(timeout);
105 log("DONE");
106 if (window.layoutTestController)
107 layoutTestController.notifyDone();
109 </script>
110 </body>
111 </html>