| <!DOCTYPE html> | |
| <meta charset=utf-8> | |
| <title>Web Locks API: Opaque origins</title> | |
| <link rel=help href="https://w3c.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> |