session-storage-swap-after-activate.html (2778B)
1 <!DOCTYPE html> 2 <script src="/resources/testharness.js"></script> 3 <script src="/resources/testharnessreport.js"></script> 4 <script src="/speculation-rules/prerender/resources/utils.js"></script> 5 <script src="session-storage-utils.js"></script> 6 <script> 7 const params = new URLSearchParams(location.search); 8 const uid = params.get('uid'); 9 10 RunSessionStorageTest(async (isPrerendering, url, prerenderChannel, done) => { 11 if (!isPrerendering) { 12 sessionStorage.setItem('set by initiator page 1', '1'); 13 startPrerendering(url); 14 // Wait for the message from the prerendering page. 15 assert_equals( 16 await getNextMessage(prerenderChannel), 17 'From prerendering page 1') 18 19 // Add an item to the session storage. 20 sessionStorage.setItem('set by initiator page 2', '1'); 21 22 // Send the message to the prerendering page. 23 prerenderChannel.postMessage('From initiator page'); 24 25 // Wait for the message from the prerendering page. 26 assert_equals( 27 await getNextMessage(prerenderChannel), 28 'From prerendering page 2') 29 30 // Register beforeunload event handler which adds a new item in the 31 // session storage. 32 window.addEventListener('beforeunload', () => { 33 sessionStorage.setItem('set by initiator page 3', '1'); 34 }); 35 36 // Navigate to the prerenderered page. 37 window.location = url; 38 } else { 39 const prerenderingchangePromise = 40 new Promise(resolve => { 41 document.addEventListener('prerenderingchange', () => { 42 sessionStorage.setItem('set by activated page', 1); 43 resolve(); 44 }); 45 }); 46 47 sessionStorage.setItem('set by prerendering page', '1'); 48 49 // Send the message to the initiator page. 50 prerenderChannel.postMessage('From prerendering page 1'); 51 52 // Wait for the message from the initiator page. 53 assert_equals(await getNextMessage(prerenderChannel), 54 'From initiator page'); 55 56 assert_equals( 57 getSessionStorageKeys(), 58 'set by initiator page 1, set by prerendering page', 59 'The session storage item added by the initiator page after ' + 60 'starting prerendering must not be visible in the prerendering ' + 61 'page.'); 62 63 // Send the message to the initiator page. 64 prerenderChannel.postMessage('From prerendering page 2'); 65 66 // Wait until activated. 67 await prerenderingchangePromise; 68 69 assert_equals( 70 getSessionStorageKeys(), 71 'set by activated page, set by initiator page 1, ' + 72 'set by initiator page 2, set by initiator page 3', 73 'The all session storage items added by the initiator page and ' + 74 'the item added by the activated page must be visible in the ' + 75 'activated page.'); 76 done(); 77 } 78 }, uid); 79 </script>