| <!DOCTYPE html> |
| <title>Test Worker.terminate() for a worker that tries to run forever after top-level script evaluation is started.</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script> |
| // The tests here are to provide execution coverage for the code paths for |
| // forcible worker termination. |
| // Expectation here is: |
| // - Not to crash, not to cause assertion failures |
| // - No WorkerGlobalScope error events and thus Worker error events are fired |
| // (#report-the-exception is not called when a script is terminated during |
| // #run-a-classic-script/#run-a-module-script according to the spec) |
| // - Nothing after infinte loop, promise resolusion/rejection etc. occurs. |
| |
| for (const test of [ |
| { |
| url: 'support/Worker-run-forever.js', |
| description: 'Worker is terminated during top-level script evaluation' |
| }, |
| { |
| url: 'support/Worker-run-forever.js', |
| options: {type: 'module'}, |
| description: 'Worker is terminated during top-level script evaluation (module)' |
| }, |
| { |
| url: 'support/Worker-run-forever-during-importScripts.js', |
| description: 'Worker is terminated during importScripts() call' |
| }, |
| { |
| url: 'support/Worker-run-forever-during-nested-importScripts.js', |
| description: 'Worker is terminated during nested importScripts() call' |
| }, |
| { |
| url: 'support/Worker-run-forever-during-dynamic-import.js', |
| description: 'Worker is terminated during dynamic import()' |
| }, |
| { |
| url: 'support/Worker-run-forever-during-dynamic-import.js', |
| options: {type: 'module'}, |
| description: 'Worker is terminated during dynamic import() (module)' |
| } |
| ]) { |
| async_test((t) => { |
| const worker = new Worker(test.url, test.options); |
| worker.onerror = t.step_func(e => { |
| // Calls preventDefault() to prevent this event from being considered |
| // as an uncaught exception. |
| e.preventDefault(); |
| assert_unreached('onerror'); |
| }); |
| worker.onmessage = t.step_func((e) => { |
| if (e.data === 'start') { |
| worker.terminate(); |
| // To make the worker forcibly terminated, because in Chromium worker is |
| // forcibly terminated after 2 seconds. |
| t.step_timeout(function() { t.done(); }, 4000); |
| } |
| else { |
| assert_unreached('Unexpected message received: ' + e.data); |
| } |
| }); |
| }, test.description); |
| } |
| </script> |