<!DOCTYPE html>
<meta charset=utf-8>
<title>Web Locks API: Opaque origins</title>
<link rel=help href="https://wicg.github.io/web-locks/">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>

function load_iframe(src, sandbox) {
  return new Promise(resolve => {
    const iframe = document.createElement('iframe');
    iframe.onload = () => { resolve(iframe); };
    if (sandbox)
      iframe.sandbox = sandbox;
    iframe.srcdoc = src;
    iframe.style.display = 'none';
    document.documentElement.appendChild(iframe);
  });
}

function wait_for_message(iframe) {
  return new Promise(resolve => {
    self.addEventListener('message', function listener(e) {
      if (e.source === iframe.contentWindow) {
        resolve(e.data);
        self.removeEventListener('message', listener);
      }
    });
  });
}

const script = `
<script>
  "use strict";
  window.onmessage = async (ev) => {
    try {
      switch (ev.data) {
        case "request":
          await navigator.locks.request('name', lock => {});
          break;
        case "query":
          await navigator.locks.query();
          break;
        default:
          window.parent.postMessage({result: "unexpected message"}, "*");
          return;
      }
      window.parent.postMessage({result: "no exception"}, "*");
    } catch (ex) {
      window.parent.postMessage({result: ex.name}, "*");
    };
  };
<\/script>
`;

promise_test(async t => {
  const iframe = await load_iframe(script);
  iframe.contentWindow.postMessage("request", '*');
  const message = await wait_for_message(iframe);
  assert_equals(message.result, 'no exception',
                'navigator.locks.request() should not throw');
}, 'navigator.locks.request() in non-sandboxed iframe should not throw');

promise_test(async t => {
  const iframe = await load_iframe(script, 'allow-scripts');
  iframe.contentWindow.postMessage("request", '*');
  const message = await wait_for_message(iframe);
  assert_equals(message.result, 'SecurityError',
                'Exception should be SecurityError');
}, 'navigator.locks.request() in sandboxed iframe should throw SecurityError');

promise_test(async t => {
  const iframe = await load_iframe(script);
  iframe.contentWindow.postMessage("query", '*');
  const message = await wait_for_message(iframe);
  assert_equals(message.result, 'no exception',
                'navigator.locks.request() should not throw');
}, 'navigator.locks.query() in non-sandboxed iframe should not throw');

promise_test(async t => {
  const iframe = await load_iframe(script, 'allow-scripts');
  iframe.contentWindow.postMessage("query", '*');
  const message = await wait_for_message(iframe);
  assert_equals(message.result, 'SecurityError',
                'Exception should be SecurityError');
}, 'navigator.locks.query() in sandboxed iframe should throw SecurityError');
</script>
