service-worker-unregister.https.html (2437B)
1 <!doctype html> 2 <meta name="timeout" content="long"> 3 <script src="/resources/testharness.js"></script> 4 <script src="/resources/testharnessreport.js"></script> 5 <script src="/common/utils.js"></script> 6 <script src="/common/dispatcher/dispatcher.js"></script> 7 <script src="resources/helper.sub.js"></script> 8 <script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> 9 <script> 10 // When a service worker is unregistered when a controlled page is in BFCache, 11 // the page can be still restored from BFCache and remain controlled by the 12 // service worker. 13 promise_test(async t => { 14 // Register a service worker and make this page controlled. 15 const workerUrl = 16 'resources/service-worker.js?pipe=header(Service-Worker-Allowed,../)'; 17 const registration = 18 await service_worker_unregister_and_register(t, workerUrl, './'); 19 t.add_cleanup(_ => registration.unregister()); 20 await wait_for_state(t, registration.installing, 'activated'); 21 const controllerChanged = new Promise( 22 resolve => navigator.serviceWorker.oncontrollerchange = resolve); 23 await claim(t, registration.active); 24 await controllerChanged; 25 26 const pageA = new RemoteContext(token()); 27 const pageB = new RemoteContext(token()); 28 29 const urlA = location.origin + executorPath + pageA.context_id; 30 const urlB = originCrossSite + executorPath + pageB.context_id; 31 32 // Open `urlA`. 33 window.open(urlA, '_blank', 'noopener'); 34 await pageA.execute_script(waitForPageShow); 35 36 assert_true( 37 await pageA.execute_script( 38 () => (navigator.serviceWorker.controller !== null)), 39 'pageA should be controlled before navigation'); 40 41 // Navigate to `urlB`. 42 await pageA.execute_script( 43 (url) => prepareNavigation(() => { 44 location.href = url; 45 }), 46 [urlB]); 47 await pageB.execute_script(waitForPageShow); 48 49 // Unregister the service worker when the controlled `pageA` is in BFCache. 50 await registration.unregister(); 51 52 // Back navigate and check whether the page is restored from BFCache. 53 await pageB.execute_script( 54 () => { 55 prepareNavigation(() => { history.back(); }); 56 } 57 ); 58 await pageA.execute_script(waitForPageShow); 59 await assert_not_bfcached(pageA); 60 61 assert_true( 62 await pageA.execute_script( 63 () => (navigator.serviceWorker.controller === null)), 64 'pageA should not be controlled'); 65 66 }, 'Unregister service worker while a controlled page is in BFCache'); 67 </script>