| <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> |