diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /testing/web-platform/tests/html/cross-origin-embedder-policy/cross-origin-isolated-permission-worker.https.window.js | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/html/cross-origin-embedder-policy/cross-origin-isolated-permission-worker.https.window.js')
-rw-r--r-- | testing/web-platform/tests/html/cross-origin-embedder-policy/cross-origin-isolated-permission-worker.https.window.js | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/cross-origin-embedder-policy/cross-origin-isolated-permission-worker.https.window.js b/testing/web-platform/tests/html/cross-origin-embedder-policy/cross-origin-isolated-permission-worker.https.window.js new file mode 100644 index 0000000000..d9431cdb50 --- /dev/null +++ b/testing/web-platform/tests/html/cross-origin-embedder-policy/cross-origin-isolated-permission-worker.https.window.js @@ -0,0 +1,170 @@ +// META: script=/common/get-host-info.sub.js +// META: script=/common/utils.js +// META: script=/common/dispatcher/dispatcher.js +// META: script=./credentialless/resources/common.js +// META: script=./resources/common.js + +const cors_coep_headers = coep_require_corp + corp_cross_origin; +const same_origin = get_host_info().HTTPS_ORIGIN; +const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN; +const dedicatedWorkerPostMessage = ` + self.addEventListener('message', (e) => { + e.data.port.postMessage(self.crossOriginIsolated); + }); +`; + +const postMessageIsWorkerCrossOriginIsolated = async ( + test, + frame, + worker_url +) => { + const worker = new frame.contentWindow.Worker(worker_url); + const mc = new MessageChannel(); + worker.postMessage({port: mc.port2}, [mc.port2]); + worker.onerror = test.unreached_func('cannot create dedicated worker'); + return (await new Promise(r => mc.port1.onmessage = r)).data; +} + +const isDataDedicatedWorkerCrossOriginIsolated = async ( + test, + parent_headers +) => { + const [future_child, future_error] = + await createIsolatedFrame('', parent_headers); + future_error.then(test.unreached_func('cannot create isolated iframe')); + + const child = await future_child; + add_completion_callback(() => child.remove()); + + const worker_url = + `data:application/javascript;base64,${btoa(dedicatedWorkerPostMessage)}`; + return postMessageIsWorkerCrossOriginIsolated(test, child, worker_url); +} + +const isBlobURLDedicatedWorkerCrossOriginIsolated = async( + test, + parent_headers +) => { + const [future_child, future_error] = + await createIsolatedFrame("", parent_headers); + future_error.then(test.unreached_func('cannot create isolated iframe')); + + const child = await future_child; + add_completion_callback(() => child.remove()); + + const blob = + new Blob([dedicatedWorkerPostMessage], {type: 'text/plaintext'}); + const workerURL = URL.createObjectURL(blob); + return postMessageIsWorkerCrossOriginIsolated(test, child, workerURL) +} + +const isHTTPSDedicatedWorkerCrossOriginIsolated = async( + test, + parent_headers +) => { + const [future_child, future_error] = + await createIsolatedFrame("", parent_headers); + future_error.then(test.unreached_func('cannot create isolated iframe')); + + const child = await future_child; + add_completion_callback(() => child.remove()); + + const worker_token = token(); + const workerURL = + `${executor_worker_path}${cors_coep_headers}&uuid=${worker_token}`; + const worker = new child.contentWindow.Worker(workerURL); + return IsCrossOriginIsolated(worker_token); +} + +const sharedWorkerIsCrossOriginIsolated = async( + test, + withCoopCoep +) => { + const [worker, future_error] = + environments.shared_worker(withCoopCoep ? cors_coep_headers : ""); + future_error.then(test.unreached_func('cannot create shared worker.')); + return IsCrossOriginIsolated(worker); +} + +const serviceWorkerIsCrossOriginIsolated = async( + test, + withCoopCoep +) => { + const [worker, future_error] = + environments.service_worker(withCoopCoep ? cors_coep_headers : ""); + future_error.then(test.unreached_func('cannot create service worker.')); + return IsCrossOriginIsolated(worker); +} + +const dedicatedWorkerIsCrossOriginIsolated = async ( + test, + scheme, + parent_permission_coi +) => { + let parent_headers = cors_coep_headers; + if (parent_permission_coi !== undefined) { + // Escape right parenthesis in WPT cors_coep_headers: + parent_permission_coi = parent_permission_coi.replace(')', '\\)'); + parent_headers += `|header(permissions-policy,` + + `cross-origin-isolated=${parent_permission_coi})`; + } + switch (scheme) { + case 'https': + return isHTTPSDedicatedWorkerCrossOriginIsolated(test, parent_headers); + case 'data': + return isDataDedicatedWorkerCrossOriginIsolated(test, parent_headers); + case 'blob': + return isBlobURLDedicatedWorkerCrossOriginIsolated(test, parent_headers); + default: + assert_unreached("wrong scheme for dedicated worker test."); + } +} + +const generate_shared_worker_test = async (withCoopCoep, expected) => { + promise_test_parallel(async (test) => { + const isCrossOriginIsolated = + await sharedWorkerIsCrossOriginIsolated(test, withCoopCoep); + assert_equals(isCrossOriginIsolated, expected) + }, `shared_worker (withCoopCoep: ${withCoopCoep}) ` + + `cross origin isolated permission test`); +} + +const generate_dedicated_worker_test = async ( + scheme, + parent_permission_coi, + expected +) => { + promise_test_parallel(async (test) => { + const isCrossOriginIsolated = + await dedicatedWorkerIsCrossOriginIsolated(test, scheme, parent_permission_coi); + assert_equals(isCrossOriginIsolated, expected) + }, `dedicated_worker (scheme: ${scheme}) cross origin ` + + `isolated (${parent_permission_coi}) permission test`); +} + +const generate_service_worker_test = async (withCoopCoep, expected) => { + promise_test_parallel(async (test) => { + const isCrossOriginIsolated = + await serviceWorkerIsCrossOriginIsolated(test, withCoopCoep); + assert_equals(isCrossOriginIsolated, expected) + }, `service_worker (withCoopCoep: ${withCoopCoep}) ` + + `cross origin isolated permission test`); +} + +generate_shared_worker_test(false, false); +generate_shared_worker_test(true, true); + +generate_dedicated_worker_test('https', undefined, true); +generate_dedicated_worker_test('https', '*', true); +generate_dedicated_worker_test('https', 'self', true); +generate_dedicated_worker_test('https', '()', false); +generate_dedicated_worker_test('data', undefined, false); +generate_dedicated_worker_test('data', '*', false); +generate_dedicated_worker_test('data', 'self', false); +generate_dedicated_worker_test('blob', undefined, true); +generate_dedicated_worker_test('blob', '*', true); +generate_dedicated_worker_test('blob', 'self', true); +generate_dedicated_worker_test('blob', '()', false); + +generate_service_worker_test(false, false); +generate_service_worker_test(true, true);
\ No newline at end of file |