| <body> |
| <p>Test WorkerContext.close functionality. Should print a series of PASS messages, followed with DONE.</p> |
| <div id=result></div> |
| <script> |
| function log(message) |
| { |
| document.getElementById("result").innerHTML += message + "<br>"; |
| } |
| |
| if (window.testRunner) |
| { |
| testRunner.dumpAsText(); |
| testRunner.waitUntilDone(); |
| } |
| |
| var worker = new Worker('resources/worker-close.js'); |
| var timeout = 0; |
| |
| worker.postMessage("typeofClose"); |
| worker.onmessage = testTypeofClose; |
| |
| function testTypeofClose(evt) |
| { |
| if (evt.data == "typeof close: function") |
| log("PASS: " + evt.data); |
| else |
| log("FAIL: " + evt.data); |
| worker.onmessage = testMessageAfterClose; |
| worker.postMessage("ping"); |
| } |
| |
| function testMessageAfterClose(evt) { |
| if (evt.data == "pong") |
| log("PASS: received message before close"); |
| else |
| log("FAIL: received unknown response: " + evt.data); |
| |
| // Tell the worker to close, then send a followup message. This message should not be delivered, |
| // since that would require JS to invoke the onmessage handler, which does not happen after the JS |
| // fragment with 'close()' in it exits. So, the 'ping' should not come back as 'pong'. |
| worker.postMessage("close"); |
| worker.postMessage("ping"); |
| worker.onmessage = function(evt) { |
| if (evt.data != "pong") { |
| log("PASS: Received message posted right after close() was invoked: " + evt.data); |
| timeout = setTimeout(testErrorAfterClose, 1000); |
| } else { |
| log("FAIL: Received a message originated from a handler in the worker after the JS fragment with close() exited" + evt.data); |
| done(); |
| } |
| }; |
| } |
| |
| function testErrorAfterClose() |
| { |
| log("PASS: no messages arrive to worker after JS fragment with close() exits"); |
| // Test that errors are delivered after close. |
| worker = new Worker('resources/worker-close.js'); |
| worker.postMessage("closeWithError"); |
| worker.onerror = function(event) { |
| log("PASS: Error arrived after close: " + event.message); |
| testPendingEvents(); |
| return false; |
| } |
| } |
| |
| function testPendingEvents() |
| { |
| // Now test that workers do not deliver pending events |
| worker = new Worker('resources/worker-close.js'); |
| worker.postMessage("closeWithPendingEvents"); |
| worker.onmessage = function(evt) { |
| log("FAIL: pending events should not fire:" + evt.data); |
| done(); |
| } |
| worker.onerror = function(evt) { |
| log("FAIL: pending events should not fire:" + evt.message); |
| done(); |
| } |
| timeout = setTimeout(testTerminateAfterClose, 500); |
| } |
| |
| function testTerminateAfterClose() |
| { |
| log("PASS: close() did not dispatch pending events"); |
| worker = new Worker('resources/worker-close.js'); |
| worker.postMessage("close"); |
| worker.onmessage = function(evt) { |
| log("PASS: Received message after worker closed: " + evt.data); |
| // Give worker a chance to close first, then terminate it. |
| timeout = setTimeout(function() { |
| worker.terminate(); |
| done(); |
| }, 500); |
| }; |
| } |
| |
| function done() { |
| if (timeout) |
| clearTimeout(timeout); |
| log("DONE"); |
| if (window.testRunner) |
| testRunner.notifyDone(); |
| } |
| </script> |
| </body> |
| </html> |
| |