diff options
Diffstat (limited to 'testing/web-platform/tests/web-locks/opaque-origin.https.html')
-rw-r--r-- | testing/web-platform/tests/web-locks/opaque-origin.https.html | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/testing/web-platform/tests/web-locks/opaque-origin.https.html b/testing/web-platform/tests/web-locks/opaque-origin.https.html new file mode 100644 index 0000000000..3ba636ecd8 --- /dev/null +++ b/testing/web-platform/tests/web-locks/opaque-origin.https.html @@ -0,0 +1,87 @@ +<!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> |