service-workers.https.html (4555B)
1 <!DOCTYPE html> 2 <title>Service Workers APIs with prerendering</title> 3 <meta name="timeout" content="long"> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script src="/common/utils.js"></script> 7 <script src="/common/dispatcher/dispatcher.js"></script> 8 <script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> 9 <script src="../resources/utils.js"></script> 10 <script src="resources/utils.js"></script> 11 12 <body> 13 <script> 14 setup(() => assertSpeculationRulesIsSupported()); 15 16 // This delay is to prevent a race condition which can cause false passes - 17 // a service worker might take some time to install, and if activation is too quick it might 18 // end up occuring after activation by chance. 19 const ACTIVATION_DELAY = 500; 20 21 promise_test(async t => { 22 const reg = await service_worker_unregister_and_register( 23 t, "./resources/service-worker.js", `resources/`); 24 25 t.add_cleanup(() => reg.unregister()); 26 const {exec} = await create_prerendered_page(t); 27 const {text, prerendering} = await exec(async () => { 28 const text = await (await fetch(`ping`)).text(); 29 return {text, prerendering: document.prerendering}; 30 }); 31 32 assert_true(prerendering); 33 assert_equals(text, 'pong'); 34 }, 'A prerendered page should be able to access an existing Service Worker'); 35 36 promise_test(async t => { 37 const {exec, activate} = await create_prerendered_page(t); 38 const scope = `./${token()}/`; 39 await exec(async scope => { 40 window.serviceWorkerInstalled = new Promise(resolve => { 41 navigator.serviceWorker.register('./service-worker.js', {scope}) 42 .then(reg => { 43 reg.unregister(); 44 resolve({prerendering: document.prerendering}); 45 }); 46 }); 47 }, [scope]); 48 49 await new Promise(resolve => t.step_timeout(resolve, ACTIVATION_DELAY)); 50 51 await activate(); 52 53 const {prerendering} = await exec(async () => { return await window.serviceWorkerInstalled}); 54 assert_false(prerendering, 'Service Worker Installation should occur after activation'); 55 }, 'Registering a new service worker from a prerendered page should be delayed'); 56 57 promise_test(async t => { 58 const uid = token(); 59 const reg = await service_worker_unregister_and_register( 60 t, "./resources/service-worker.js", `./resources/${uid}/`); 61 t.add_cleanup(() => reg.unregister()); 62 63 const {exec, activate} = await create_prerendered_page(t); 64 await exec(async uid => { 65 window.serviceWorkerUnregistered = (async () => { 66 const regs = await navigator.serviceWorker.getRegistrations(); 67 const reg = regs.find(r => r.scope.includes(uid)); 68 await reg.unregister(); 69 return {prerendering: document.prerendering}; 70 })(); 71 }, [uid]); 72 73 await new Promise(resolve => t.step_timeout(resolve, ACTIVATION_DELAY)); 74 75 await activate(); 76 77 const {prerendering} = await exec(() => window.serviceWorkerUnregistered); 78 assert_false(prerendering, 'Service Worker deregistration should occur after activation'); 79 }, 'Unregistering an exsiting service worker from a prerendered page should be delayed'); 80 81 promise_test(async t => { 82 const uid = token(); 83 const reg = await service_worker_unregister_and_register( 84 t, "./resources/service-worker.js", `./resources/${uid}/`); 85 t.add_cleanup(() => reg.unregister()); 86 87 const {exec, activate} = await create_prerendered_page(t); 88 await exec(async uid => { 89 window.serviceWorkerUpdated = (async () => { 90 const regs = await navigator.serviceWorker.getRegistrations(); 91 const reg = regs.find(r => r.scope.includes(uid)); 92 await reg.update(); 93 return {prerendering: document.prerendering}; 94 })(); 95 }, [uid]); 96 97 await new Promise(resolve => t.step_timeout(resolve, ACTIVATION_DELAY)); 98 99 await activate(); 100 101 const {prerendering} = await exec(() => window.serviceWorkerUpdated); 102 assert_false(prerendering, 'Service Worker updates should occur after activation'); 103 }, 'Updating an exsiting service worker from a prerendered page should be delayed'); 104 105 promise_test(async t => { 106 const reg = await service_worker_unregister_and_register( 107 t, "./resources/service-worker.js", 'resources/'); 108 109 t.add_cleanup(() => reg.unregister()); 110 const {exec} = await create_prerendered_page(t); 111 const {clientInfo} = await exec(async () => (await fetch(`client`)).json()); 112 assert_not_equals(clientInfo.id, null); 113 assert_equals(clientInfo.visibilityState, 'hidden'); 114 assert_equals(clientInfo.focused, false); 115 }, 'A prerendered page should be accessible as a hidden & unfocused SW client'); 116 </script>