service-worker-controlled.https.tentative.html (3750B)
1 <!DOCTYPE html> 2 <title> 3 Web Bundle fetching and the inner resouirce fetching should skip service 4 worker 5 </title> 6 <link 7 rel="help" 8 href="https://github.com/WICG/webpackage/blob/main/explainers/subresource-loading.md" 9 /> 10 <script src="/resources/testharness.js"></script> 11 <script src="/resources/testharnessreport.js"></script> 12 <script src="../resources/test-helpers.js"></script> 13 <body> 14 <script> 15 setup(() => { 16 assert_true(HTMLScriptElement.supports("webbundle")); 17 }); 18 19 async function registerServiceWorkerAndReturnActiveWorker( 20 t, 21 script, 22 scope 23 ) { 24 const reg = await navigator.serviceWorker.register(script, { 25 scope: scope, 26 }); 27 t.add_cleanup(() => reg.unregister()); 28 if (reg.active) return reg.active; 29 const worker = reg.installing || reg.waiting; 30 await new Promise((resolve) => { 31 worker.addEventListener("statechange", (event) => { 32 if (event.target.state == "activated") resolve(); 33 }); 34 }); 35 return worker; 36 } 37 38 async function getRequestedUrls(worker) { 39 return new Promise((resolve) => { 40 navigator.serviceWorker.addEventListener( 41 "message", 42 (e) => { 43 resolve(e.data); 44 }, 45 { once: true } 46 ); 47 worker.postMessage(null); 48 }); 49 } 50 51 promise_test(async (t) => { 52 const iframe_path = "./resources/service-worker-controlled-iframe.html"; 53 const iframe_url = new URL(iframe_path, location).href; 54 55 // Register a service worker. 56 const worker = await registerServiceWorkerAndReturnActiveWorker( 57 t, 58 "./resources/service-worker-for-request-monitor.js", 59 iframe_path 60 ); 61 62 // Load an iframe which is controlled by the service worker. 63 const iframe = await new Promise((resolve) => { 64 const frame = document.createElement("iframe"); 65 t.add_cleanup(() => frame.remove()); 66 frame.src = iframe_url; 67 frame.onload = () => { 68 resolve(frame); 69 }; 70 document.body.appendChild(frame); 71 }); 72 // The iframe request should be intercepted by the service worker. 73 assert_array_equals(await getRequestedUrls(worker), [iframe_url]); 74 75 // Add a web bundle element in the service worker controlled iframe. 76 const script_id = "uuid-in-package:020111b3-437a-4c5c-ae07-adb6bbffb720"; 77 78 const element = createWebBundleElement( 79 "../../resources/wbn/uuid-in-package.wbn", 80 /*resources=*/ [script_id] 81 ); 82 83 const element_load_promise = new Promise((resolve) => { 84 element.addEventListener("load", () => { 85 resolve(); 86 }); 87 }); 88 iframe.contentDocument.body.appendChild(element); 89 await element_load_promise; 90 // The web bundle request should not be intercepted by the service worker. 91 assert_array_equals(await getRequestedUrls(worker), []); 92 93 // Add a uuid-in-package URL script element in the service worker 94 // controlled iframe. 95 const result_promise = new Promise((resolve) => { 96 // window.report_result() method will be called by the injected script. 97 iframe.contentWindow.report_result = resolve; 98 }); 99 const script = iframe.contentDocument.createElement("script"); 100 script.src = script_id; 101 iframe.contentDocument.body.appendChild(script); 102 assert_equals(await result_promise, "OK"); 103 // The urn uuld URL script request should not be intercepted by the 104 // service worker. 105 assert_array_equals(await getRequestedUrls(worker), []); 106 107 }, "Both Web Bundle request and Subresource fetch requests inside the Web " + "Bundle should skip the service worker."); 108 </script> 109 </body>