| <meta name="timeout" content="long"> |
| <meta name="variant" content="?1-4"> |
| <meta name="variant" content="?5-last"> |
| <script src=/resources/testharness.js></script> |
| <script src=/resources/testharnessreport.js></script> |
| <script src="/common/subset-tests.js"></script> |
| <script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> |
| <script src="/common/utils.js"></script> |
| <script src="/common/dispatcher/dispatcher.js"></script> |
| <script src="/common/get-host-info.sub.js"></script> |
| <script> |
| |
| const executor_path = '/common/dispatcher/executor.html?pipe='; |
| const executor_service_worker_path = '/common/dispatcher/executor-service-worker.js?pipe='; |
| |
| const coop_header = `|header(Cross-Origin-Opener-Policy,same-origin)`; |
| const coep_header = `|header(Cross-Origin-Embedder-Policy,require-corp)`; |
| |
| const https_origin = get_host_info().HTTPS_ORIGIN; |
| |
| const swap_browsing_context_group = true; |
| const keep_browsing_context_group = false; |
| |
| const opener_basic = ""; |
| const opener_coi = coop_header + coep_header; |
| |
| const sw_basic = ""; |
| const sw_coi = coop_header + coep_header; |
| |
| const openee_basic = { |
| 'content-type': 'text/html', |
| }; |
| const openee_coi = { |
| 'content-type': 'text/html', |
| 'cross-origin-embedder-policy': 'require-corp', |
| 'cross-origin-opener-policy': 'same-origin', |
| }; |
| |
| // A document opens a popup. The popup's document is served from a synthetic |
| // response by a ServiceWorker. Check how cross-origin isolation works in this |
| // case. |
| const popupCoopBySwTest = ( |
| description, |
| // Test parameters: |
| opener_headers, |
| openee_headers, |
| sw_headers, |
| // Test expectations: |
| expected_browing_context_group |
| ) => { |
| subsetTest(promise_test, async test => { |
| const driver_token = token(); |
| |
| // 1. Create the opener. |
| const opener_token = token(); |
| const opener_url = https_origin + executor_path + opener_headers + |
| `&uuid=${opener_token}`; |
| const opener_window = window.open(opener_url); |
| test.add_cleanup(() => opener_window.close()); |
| |
| // 2. Define the openee's URL as being served by the service worker. |
| const openee_url = https_origin + "/common/dispatcher/proxied?" + token(); |
| |
| // 3. Register, install and activate a ServiceWorker serving the openee_url. |
| const sw_token = token(); |
| const sw_url = https_origin + executor_service_worker_path + sw_headers + |
| `&uuid=${sw_token}`; |
| const sw_scope = openee_url; // One-time scope, because of the token. |
| |
| const sw_registration = |
| await service_worker_unregister_and_register(test, sw_url, sw_scope); |
| test.add_cleanup(() => sw_registration.unregister()); |
| await wait_for_state(test, sw_registration.installing, 'activated'); |
| |
| send(sw_token, ` |
| fetchHandler = event => { |
| if (!event.request.url.includes("proxied")) |
| return; |
| |
| const response = new Response(\` |
| <script src="/common/dispatcher/dispatcher.js"></scr\`+\`ipt> |
| <script> |
| send("${driver_token}", opener ? "opener is set" |
| : "opener is null"); |
| </scr\` + \`ipt> |
| \`, { |
| status: 200, |
| headers: ${JSON.stringify(openee_headers)}, |
| }); |
| event.respondWith(response); |
| } |
| |
| await clients.claim(); |
| |
| send("${driver_token}", serviceWorker.state); |
| `) |
| assert_equals(await receive(driver_token), "activated"); |
| |
| // 4. The opener opens a popup. Its document is a synthetic response served |
| // from the Service Worker. |
| send(opener_token, ` |
| window.open("${openee_url}"); |
| `); |
| |
| assert_equals(await receive(driver_token), |
| (expected_browing_context_group == swap_browsing_context_group) |
| ? "opener is null" |
| : "opener is set"); |
| }, description); |
| }; |
| |
| popupCoopBySwTest("opener:basic, openee:basic, sw:basic", |
| opener_basic, openee_basic, sw_basic, |
| keep_browsing_context_group); |
| popupCoopBySwTest("opener:basic, openee:basic, sw:coi", |
| opener_basic, openee_basic, sw_coi, |
| keep_browsing_context_group); |
| popupCoopBySwTest("opener:basic, openee:coi, sw:basic", |
| opener_basic, openee_coi, sw_basic, |
| swap_browsing_context_group); |
| popupCoopBySwTest("opener:basic, openee:coi, sw:coi", |
| opener_basic, openee_coi, sw_coi, |
| swap_browsing_context_group); |
| popupCoopBySwTest("opener:coi, openee:basic, sw:basic", |
| opener_coi, openee_basic, sw_basic, |
| swap_browsing_context_group); |
| popupCoopBySwTest("opener:coi, openee:basic, sw:coi", |
| opener_coi, openee_basic, sw_coi, |
| swap_browsing_context_group); |
| popupCoopBySwTest("opener:coi, openee:coi, sw:basic", |
| opener_coi, openee_coi, sw_basic, |
| keep_browsing_context_group); |
| popupCoopBySwTest("opener:coi, openee:coi, sw:coi", |
| opener_coi, openee_coi, sw_coi, |
| keep_browsing_context_group); |
| </script> |