restriction-service-worker-postmessage.https.html (2196B)
1 <!DOCTYPE html> 2 <title>postMessage() between service worker and prerendered page</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="/service-workers/service-worker/resources/test-helpers.sub.js"></script> 8 <script src="../resources/utils.js"></script> 9 <script src="resources/utils.js"></script> 10 11 <body> 12 <script> 13 setup(() => assertSpeculationRulesIsSupported()); 14 15 const uid = token(); 16 17 const PAGE_URL = `resources/postmessage-to-service-worker.html?uid=${uid}`; 18 const WORKER_URL = 'resources/postmessage-to-client-worker.js'; 19 20 // Message sequence: prerendered page => service worker => prerendered page => 21 // main page 22 promise_test(async t => { 23 const registration = 24 await service_worker_unregister_and_register(t, WORKER_URL, PAGE_URL); 25 t.add_cleanup(() => registration.unregister()); 26 await wait_for_state(t, registration.installing, 'activated'); 27 28 const bc = new PrerenderChannel('test-channel', uid); 29 t.add_cleanup(_ => bc.close()); 30 31 const gotMessage = new Promise(resolve => { 32 bc.addEventListener('message', e => { 33 resolve(e.data); 34 }, { 35 once: true 36 }); 37 }); 38 window.open(PAGE_URL, '_blank', 'noopener'); 39 40 const result = await gotMessage; 41 const expected = [ 42 {event: 'started waiting ServiceWorker.postMessage', prerendering: true}, 43 {event: 'prerendering change', prerendering: false}, 44 {event: 'postmessage to client', prerendering: false}, 45 {event: 'finished waiting ServiceWorker.postMessage', prerendering: false}, 46 ]; 47 assert_equals(result.length, expected.length); 48 for (let i = 0; i < result.length; i++) { 49 assert_equals(result[i].event, expected[i].event, `event[${i}]`); 50 assert_equals(result[i].prerendering, expected[i].prerendering, 51 `prerendering[${i}]`); 52 } 53 54 // Send a close signal to PrerenderEventCollector on the prerendered page. 55 new PrerenderChannel('close', uid).postMessage(''); 56 }, 'ServiceWorker#postMessage() from a prerendered page should be deferred ' + 57 'until page activation.'); 58 </script>