service-worker-client-postmessage.https.html (2582B)
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 await storeClients(t, registration.active); 42 43 // Navigate to `urlB`. 44 await pageA.execute_script( 45 (url) => prepareNavigation(() => { 46 location.href = url; 47 }), 48 [urlB]); 49 await pageB.execute_script(waitForPageShow); 50 51 // Posting a message to a client should evict it from the bfcache. 52 await postMessageToStoredClients(t, registration.active); 53 54 // Back navigate and check whether the page is restored from BFCache. 55 await pageB.execute_script( 56 () => { 57 prepareNavigation(() => { history.back(); }); 58 } 59 ); 60 await pageA.execute_script(waitForPageShow); 61 await assert_not_bfcached(pageA); 62 63 await pageA.execute_script(() => navigator.serviceWorker.ready); 64 65 assert_true( 66 await pageA.execute_script( 67 () => (navigator.serviceWorker.controller !== null)), 68 'pageA should be controlled after history navigation'); 69 70 }, 'Client.postMessage while a controlled page is in BFCache'); 71 </script>