<body>
<p>Test WorkerGlobalScope.close() method. Will print PASS multiple times, followed by DONE.</p>
<div id=result></div>
<script src="resources/worker-util.js"></script>
<script>
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
waitUntilWorkerThreadsExit(runTests);
} else {
log("NOTE: Test relies on window.testRunner to detect when worker threads have exited. Please run this test via DumpRenderTree");
waitUntilWorkerThreadsExit(runTests);
}
var worker;
function startWorker()
{
if (window.testRunner)
log("PASS: workerThreadCount = " + internals.workerThreadCount);
worker = new Worker('resources/worker-close.js');
}
function runTests()
{
log("Test 1: Call close() in the worker, then enter infinite loop. From the Worker object side, call terminate(). Verify the loop is terminated.")
startWorker();
worker.postMessage("close_post_loop"); // Close the worker but put it immediately into infinite loop.
worker.onmessage = function(event) {
if (window.testRunner) {
log("PASS: Worker thread created and closed, received message: " + event.data);
// Terminate the worker.
worker.terminate();
waitUntilWorkerThreadsExit(testCloseWithAccumulatedMessages);
}
}
}
function testCloseWithAccumulatedMessages()
{
log("PASS: Worker exited after terminate() terminated the infinite loop.");
log("Test 2: post 2 messages to a MessagePort into the worker. port.onmessage handler inside the worker will call close(). Verify that the second onmessage was not executed.")
startWorker();
var channel = new MessageChannel();
worker.onmessage = function(event) {
if (event.data == "echo_ping2")
log("FAIL: The MessagePort message was dispatched after a JS fragment that called 'close()' exited.");
else
log("PASS: MessagePort multiple message test, received message: " + event.data);
setTimeout("waitUntilWorkerThreadsExit(workerExited)", 100); // Let it run a bit to catch the echo_ping2 if it arrives.
}
worker.postMessage("take_port", [channel.port2]);
// Queue 2 messages.
channel.port1.postMessage("ping1");
channel.port1.postMessage("ping2");
// Now enable the messages to be delivered. Only first should echo back.
worker.postMessage("start_port");
}
function workerExited()
{
log("PASS: MessagePort messages were not delivered asfter close().");
done();
}
</script>
</body>