<!doctype html>
<title>Cross Origin Embedder Policy: requests initiated from a service worker with 'require-corp'</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
<script>
'use strict';

const SCRIPT = 'resources/require-corp-sw.js';
const SCOPE = 'resources/in-scope';
let worker = null;

promise_test(async t => {
  const registration =
      await service_worker_unregister_and_register(t, SCRIPT, SCOPE);
  promise_test(async t => registration.unregister(), 'Clean up global state');
  worker = registration.installing;
  await wait_for_state(t, worker, 'activated');
}, 'Set up global state');

promise_test(async t => {
  const p = new Promise(resolve =>
      navigator.serviceWorker.addEventListener('message', resolve,
                                               {once: true}));
  worker.postMessage('WithCorp');
  assert_equals((await p).data, 'opaque');
}, "fetch() to 'CORP: cross-origin' response should succeed.");

promise_test(async t => {
  const p = new Promise(resolve =>
      navigator.serviceWorker.addEventListener('message', resolve,
                                               {once: true}));
  worker.postMessage('WithoutCorp');
  assert_equals((await p).data, 'Exception: TypeError');
}, "fetch() to no CORP response should not succeed.");

promise_test(async t => {
  const scope = `${SCOPE}-2`;
  await service_worker_unregister(t, scope);
  const promise = navigator.serviceWorker.register(
      'resources/require-corp-sw-import-scripts.js', {scope});
  await promise_rejects_js(t, TypeError, promise, 'register() should fail.');
}, 'importScripts() fails for a script with no corp.');

promise_test(async t => {
  const scope = `${SCOPE}-3`;
  await service_worker_unregister(t, scope);
  const registration = await navigator.serviceWorker.register(
      'resources/require-corp-sw-import-scripts.js?corp=cross-origin', {scope});
  t.add_cleanup(() => registration.unregister());
}, 'importScripts() succeeds for a script with corp: cross-origin.');
</script>
