<!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)'
  },
  {
    url: 'support/Worker-run-forever-during-top-level-await.js',
    options: {type: 'module'},
    description: 'Worker is terminated during top-level await'
  }
]) {
  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>
