| <!DOCTYPE html> |
| <meta name=help href="https://privacycg.github.io/storage-partitioning/"> |
| <title>Partitioned estimate() usage details for service workers test</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| |
| <body> |
| <script> |
| const usageDetails = async () => { |
| return (await navigator.storage.estimate()) |
| .usageDetails.serviceWorkerRegistrations || 0; |
| } |
| |
| const createSomeUsage = async () => { |
| const wait_for_active = worker => new Promise(resolve => { |
| if (worker.active) { resolve(worker.active); } |
| |
| const listen_for_active = worker => e => { |
| if (e.target.state === 'activated') { resolve(worker.active); } |
| } |
| |
| if (worker.waiting) { |
| worker.waiting |
| .addEventListener('statechange', listen_for_active(worker.waiting)); |
| } |
| if (worker.installing) { |
| worker.installing.addEventListener('statechange', |
| listen_for_active(worker.installing)); |
| } |
| }); |
| |
| const service_worker_registration = |
| await navigator.serviceWorker.register('resources/worker.js'); |
| await wait_for_active(service_worker_registration); |
| return service_worker_registration; |
| } |
| |
| const testPath = () => location.pathname.split("/").slice(0, -1).join("/"); |
| |
| let alt_origin = "https://{{hosts[alt][]}}:{{ports[https][0]}}"; |
| let details = {}; |
| |
| const iframe = document.createElement("iframe"); |
| iframe.src = `https://{{host}}:{{ports[https][0]}}${testPath()}/resources` + |
| `/partitioned-estimate-usage-details-service-workers-helper-frame.html` |
| document.body.appendChild(iframe); |
| |
| async_test(test => { |
| if (location.origin === alt_origin) |
| return; |
| |
| let service_worker_registration; |
| window.addEventListener("message", test.step_func(async event => { |
| if (event.data === "iframe-is-ready") { |
| details.init = await usageDetails(); |
| service_worker_registration = await createSomeUsage(); |
| details.after = await usageDetails(); |
| assert_greater_than(details.after, details.init); |
| |
| iframe.contentWindow.postMessage("get-details", iframe.origin); |
| } |
| })); |
| |
| window.addEventListener("message", test.step_func(event => { |
| if (event.data.source === "same-site") { |
| details.same_site = event.data; |
| |
| const cross_site_window = window |
| .open(`${alt_origin}${location.pathname}`, "", "noopener=false"); |
| test.add_cleanup(() => cross_site_window.close()); |
| } |
| if (event.data.source === "cross-site") { |
| details.cross_site = event.data; |
| |
| // More cleanup. |
| test.step(() => service_worker_registration.unregister()); |
| |
| test.step(() => { |
| assert_true(details.cross_site.init == 0, "Usage should be 0."); |
| assert_equals(details.same_site.init, details.after); |
| }); |
| |
| test.done(); |
| } |
| })); |
| }, "Partitioned estimate() usage details for service workers test."); |
| </script> |
| </body> |