windowclient-navigate.https.html (2479B)
1 <!DOCTYPE html> 2 <title>WindowClient.navigate() for prerendered main 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/get-host-info.sub.js"></script> 7 <script src="/common/utils.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 const uid = token(); 17 18 const PAGE_URL = `resources/prerendered-page.html?uid=${uid}`; 19 const WORKER_URL = `resources/windowclient-navigate-worker.js?uid=${uid}`; 20 const SAME_ORIGIN_DESTINATION = 21 get_host_info()['HTTPS_ORIGIN'] + base_path() + 'resources/empty.html'; 22 23 promise_test(async t => { 24 const registration = 25 await service_worker_unregister_and_register(t, WORKER_URL, PAGE_URL); 26 t.add_cleanup(() => registration.unregister()); 27 await wait_for_state(t, get_newest_worker(registration), 'activated'); 28 29 const readyChannel = new PrerenderChannel('prerender-channel', uid); 30 t.add_cleanup(_ => readyChannel.close()); 31 32 const readyPromise = new Promise(resolve => { 33 readyChannel.addEventListener('message', e => { 34 resolve(e.data); 35 }, { 36 once: true 37 }); 38 }); 39 40 startPrerendering(PAGE_URL); 41 42 const prerenderResult = await readyPromise; 43 assert_equals(prerenderResult, 'prerender success', 44 'should succeed to prerender a page'); 45 46 const resultChannel = new PrerenderChannel('test-channel', uid); 47 t.add_cleanup(_ => resultChannel.close()); 48 49 const navigationPromise = new Promise(resolve => { 50 resultChannel.addEventListener('message', e => { 51 resolve(e.data); 52 }, { 53 once: true 54 }); 55 }); 56 57 // Asks the service worker to navigate the prerendered page to `navigationUrl` 58 // via `WindowClient.navigate(url)`. 59 const bc = new PrerenderChannel('navigation-channel', uid); 60 bc.postMessage(JSON.stringify({ 61 navigationUrl: SAME_ORIGIN_DESTINATION, 62 clientUrl: new URL(PAGE_URL, window.location).toString(), 63 respondTo: 'test-channel', 64 })); 65 bc.close(); 66 67 const navigationResult = await navigationPromise; 68 assert_equals(navigationResult, 'navigate() failed with TypeError', 69 'should fail the navigation with TypeError'); 70 }, 'WindowClient.navigate() for a prerendered main page should throw a' + 71 'TypeError'); 72 </script>