| <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 = " + testRunner.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> |