summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/cross-origin-embedder-policy/cross-origin-isolated-permission-worker.https.window.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /testing/web-platform/tests/html/cross-origin-embedder-policy/cross-origin-isolated-permission-worker.https.window.js
parentInitial commit. (diff)
downloadfirefox-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.js170
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