<!doctype html>
<meta charset=utf-8>
<title></title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>

// Tests that a {Dedicated,Shared}Worker keeps running even if its script
// evaluation results in an abrupt completion. This corresponds to the "run a
// worker" algorithm disregarding the return value of "run the {classic,module}
// script" in its step 24:
//
// "If script is a classic script, then run the classic script script.
// Otherwise, it is a module script; run the module script script."

async function testWorker(worker) {
  await new Promise(resolve => {
    worker.onerror = e => {
      assert_not_equals(e.message.search("uncaught-exception"), -1,
                        "Correct uncaught exception thrown by worker");

      // Suppress the exception.
      e.preventDefault();

      resolve();
    }
  });

  return new Promise(resolve => {
    const channel = new MessageChannel();

    channel.port1.onmessage = e => {
      assert_equals(e.data, "handler-before-throw", "Correct message handler.");
      resolve();
    };

    if (worker instanceof SharedWorker) {
      worker.port.postMessage("", [channel.port2]);
    } else {
      worker.postMessage("", [channel.port2]);
    }
  });
}

promise_test(async t => {
  const worker = new Worker("support/abrupt-completion.js");
  return testWorker(worker);
}, "DedicatedWorker should correctly handle abrupt completion");

promise_test(async t => {
  const worker = new SharedWorker("support/abrupt-completion.js");
  return testWorker(worker);
}, "SharedWorker should correctly handle abrupt completion");

</script>
