// META: title=data URL shared worker in data URL context
// META: script=/service-workers/service-worker/resources/test-helpers.sub.js
const mimeType = 'application/javascript';

// Tests creating a data URL shared worker in a data URL iframe.
promise_test(async t => {
  const nestedWorkerScriptURL =
      new URL('/workers/support/post-message-on-load-worker.js', location.href);

  // This code will be executed in a data URL iframe. The iframe tries to create
  // a shared worker from |nestedWorkerScriptURL|, but that should result in a
  // failure. This is because the data URL iframe has an opaque origin, and
  // script fetch is handled as a cross-origin request.
  const frameCode = `
      <script>
      try {
        const worker = new SharedWorker('${nestedWorkerScriptURL}');
        worker.port.onmessage = e => {
          window.parent.postMessage(
              'SharedWorker construction unexpectedly succeeded', '*');
        };
        worker.onerror = e => window.parent.postMessage('PASS', '*');
      } catch (e) {
        // Cross-origin request should asynchronously fail during worker script
        // fetch because its request mode is 'same-origin'.
        window.parent.postMessage(
            'SharedWorker construction unexpectedly synchronously failed', '*');
      }
      </script>
  `;

  const frame = await with_iframe(`data:text/html;base64,${btoa(frameCode)}`);
  const result = await new Promise(r => window.onmessage = e => r(e.data));
  assert_equals(result, 'PASS');
}, 'Create a shared worker in a data url frame');

// Tests creating a data URL shared worker in a data URL iframe.
promise_test(async t => {
  const workerCode = `onconnect = e => e.ports[0].postMessage("PASS");`;

  // This code will be executed in a data URL iframe. The iframe tries to create
  // a data URL shared worker. Fetching a data URL from the data URL shared
  // worker is allowed, so the worker construction should succeed. The worker
  // posts the result to the parent frame.
  const frameCode = `
      <script>
      try {
        const worker = new SharedWorker('data:${mimeType},${workerCode};');
        worker.port.onmessage = e => window.parent.postMessage(e.data, '*');
        worker.onerror = e => {
          window.parent.postMessage('FAIL: ' + e.message, '*');
        };
      } catch (e) {
        window.parent.postMessage(
            'SharedWorker construction unexpectedly synchronously failed', '*');
      }
      </script>
  `;

  const frame = await with_iframe(`data:text/html;base64,${btoa(frameCode)}`);
  const result = await new Promise(r => window.onmessage = e => r(e.data));
  assert_equals(result, 'PASS');
}, 'Create a data url shared worker in a data url frame');
