| <!DOCTYPE html> |
| <meta charset="utf-8"/> |
| <title>Service Worker: Partitioned Service Workers</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="resources/test-helpers.sub.js"></script> |
| <script src="/common/get-host-info.sub.js"></script> |
| <script src="resources/partitioned-utils.js"></script> |
| |
| <body> |
| This test loads a SW in a first-party context and gets has the SW send |
| its list of clients from client.matchAll(). It does the same thing for the |
| SW in a third-party context as well and confirms that each SW see's the correct |
| clients and that they don't see eachother's clients. |
| |
| <script> |
| promise_test(async t => { |
| |
| const script = './resources/partitioned-storage-sw.js' |
| const scope = './resources/partitioned-' |
| |
| // Add service worker to this 1P context. |
| const reg = await service_worker_unregister_and_register(t, script, scope); |
| t.add_cleanup(() => reg.unregister()); |
| await wait_for_state(t, reg.installing, 'activated'); |
| |
| // Register the message listener. |
| self.addEventListener('message', messageEventHandler); |
| |
| // Create a third-party iframe that will send us its SW's clients. |
| const third_party_iframe_url = new URL( |
| './resources/partitioned-service-worker-third-party-iframe-matchAll.html', |
| get_host_info().HTTPS_ORIGIN + self.location.pathname); |
| |
| const {urls_list: frame_3p_urls_list} = await loadAndReturnSwData(t, |
| third_party_iframe_url, 'window'); |
| |
| // Register a listener on the service worker container and then forward to |
| // the self event listener so we can reuse the existing message promise |
| // function. |
| navigator.serviceWorker.addEventListener('message', evt => { |
| self.postMessage(evt.data, '*'); |
| }); |
| |
| const frame_1p_data_promise = makeMessagePromise(); |
| |
| reg.active.postMessage({type: "get-match-all"}); |
| |
| const {urls_list: frame_1p_urls_list} = await frame_1p_data_promise; |
| |
| // If partitioning is working, the 1p and 3p SWs should only see a single |
| // client. |
| assert_equals(frame_3p_urls_list.length, 1); |
| assert_equals(frame_1p_urls_list.length, 1); |
| // Confirm that the expected URL was seen by each. |
| assert_equals(frame_3p_urls_list[0], third_party_iframe_url.toString(), |
| "3p SW has the correct client url."); |
| assert_equals(frame_1p_urls_list[0], window.location.href, |
| "1P SW has the correct client url."); |
| }, "ServiceWorker's matchAll() is partitioned"); |
| |
| |
| </script> |
| |
| </body> |