<!DOCTYPE html>
<title>SharedWorker: parse error failure</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../support/check-error-arguments.js"></script>
<script>

// Check if module shared worker is supported.
// In this test scope, we only use simple non-nested static import as a feature
// of module shared worker, so we only check if static import is supported.
//
// This check is necessary to appropriately test parse error handling because
// we need to distingusih the parse error invoked by unsupported "import" in
// the top-level script from the parse error invoked by the statically imported
// script which is the one we want to check in this test.
promise_setup(async () => {
  const scriptURL = 'resources/static-import-worker.js';
  const worker = new SharedWorker(scriptURL, { type: 'module' });
  const supportsModuleWorkers = await new Promise((resolve, reject) => {
    worker.port.onmessage = e => {
      resolve(e.data.length == 1 && e.data[0] == 'export-on-load-script.js');
    };
    worker.onerror = () => resolve(false);
  });
  assert_implements(
    supportsModuleWorkers,
    "Static import must be supported on module shared worker to run this test."
  );
});

promise_test(async () => {
  const scriptURL = 'resources/syntax-error.js';
  const worker = new SharedWorker(scriptURL, { type: 'module' });
  const args = await new Promise(resolve =>
      worker.onerror = (...args) => resolve(args));
  window.checkErrorArguments(args);
}, 'Module shared worker construction for script with syntax error should ' +
   'dispatch an event named error.');

promise_test(async () => {
  const scriptURL = 'resources/static-import-syntax-error.js';
  const worker = new SharedWorker(scriptURL, { type: 'module' });
  const args = await new Promise(resolve =>
      worker.onerror = (...args) => resolve(args));
  window.checkErrorArguments(args);
}, 'Static import on module shared worker for script with syntax error ' +
   'should dispatch an event named error.');

</script>
