| <!DOCTYPE html> | |
| <title>Test WorkerGlobalScope.close functionality.</title> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script> | |
| setup({ allow_uncaught_exception: true }); | |
| async_test(function(t) { | |
| var worker = new Worker('support/WorkerGlobalScope-close.js'); | |
| worker.postMessage("typeofClose"); | |
| worker.onmessage = t.step_func_done(function(evt) { | |
| assert_equals(evt.data, "typeof close: function"); | |
| }); | |
| }, 'Test type of close function.'); | |
| async_test(function(t) { | |
| var worker = new Worker('support/WorkerGlobalScope-close.js'); | |
| worker.postMessage("ping"); | |
| worker.onmessage = t.step_func(function(evt) { | |
| assert_equals(evt.data, "pong"); | |
| // Tell the worker to close, then send a followup message. | |
| worker.postMessage("close"); | |
| // The worker may or may not be closing/closed by this call. If it is, the | |
| // message won't be enqueued on the worker's event loop. If it isn't, the | |
| // message will be enqueued but shouldn't be handled by the worker because | |
| // the prior postMessage will cause the worker to close. In either case, | |
| // the worker shouldn't postMessage back "pong". | |
| // | |
| // This also means that at this point we can't confidently test | |
| // postMessage-ing a worker that will close nor a worker that is already | |
| // closing/closed. | |
| worker.postMessage("ping"); | |
| worker.onmessage = t.step_func(function(evt) { | |
| assert_not_equals(evt.data, "pong"); | |
| // The worker should definitely be closed by now, so we can confidently | |
| // test postMessage-ing a closed worker. This postMessage shouldn't throw | |
| // or cause the worker to postMessage back "pong" (it shouldn't receive | |
| // any events after closing). | |
| worker.postMessage("ping"); | |
| t.step_timeout(function() { t.done(); }, 500); | |
| }); | |
| }); | |
| }, 'Test sending a message after closing.'); | |
| async_test(function(t) { | |
| var worker = new Worker('support/WorkerGlobalScope-close.js'); | |
| worker.postMessage("closeWithError"); | |
| worker.onerror = function(event) { | |
| t.done() | |
| }; | |
| }, 'Test errors are delivered after close.'); | |
| async_test(function(t) { | |
| var worker = new Worker('support/WorkerGlobalScope-close.js'); | |
| worker.postMessage("closeWithPendingEvents"); | |
| worker.onmessage = t.step_func(function(evt) { | |
| assert_unreached("Pending events should not fire: " + evt.data); | |
| }); | |
| worker.onerror = t.step_func(function(evt) { | |
| assert_unreached("Pending events should not fire:" + evt.message); | |
| }); | |
| t.step_timeout(function() { t.done(); }, 500); | |
| }, 'Test workers do not deliver pending events.'); | |
| async_test(function(t) { | |
| var worker = new Worker('support/WorkerGlobalScope-close.js'); | |
| worker.postMessage("close"); | |
| worker.onmessage = function(evt) { | |
| assert_equals(evt.data, "Should be delivered"); | |
| // Give worker a chance to close first, then terminate it. | |
| t.step_timeout(function() { | |
| worker.terminate(); | |
| t.done(); | |
| }, 500); | |
| }; | |
| }, 'Test terminating a worker after close.'); | |
| </script> |