| <!DOCTYPE html> |
| <script src="/common/utils.js"></script> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/speculation-rules/prerender/resources/utils.js"></script> |
| <script src="/speculation-rules/prerender/resources/deferred-promise-utils.js"></script> |
| <script> |
| |
| // The main test page loads the initiator page, then the initiator page will |
| // prerender itself with the `prerendering` parameter. The prerendered page will |
| // trigger a main frame navigation with the `navigation` parameter. |
| const params = new URLSearchParams(location.search); |
| const uid = params.get('uid'); |
| |
| const isPrerendering = params.has('prerendering'); |
| const isNavigation = params.has('navigation'); |
| |
| if (isPrerendering && isNavigation) { |
| assert_true(document.prerendering); |
| |
| const result = { |
| // Check the value of document.prerendering now and after activation. |
| prerenderingValueBeforeActivation: document.prerendering, |
| prerenderingValueAfterActivation: null, |
| |
| // True if the prerenderingchange event is fired. |
| onprerenderingchangeCalled: false, |
| }; |
| |
| window.addEventListener('load', () => { |
| const prerenderChannel = new PrerenderChannel('prerender-channel', uid); |
| prerenderChannel.postMessage('readyToActivate'); |
| prerenderChannel.close(); |
| }); |
| |
| document.addEventListener('prerenderingchange', (e) => { |
| assert_false(document.prerendering); |
| |
| const entry = performance.getEntriesByType('navigation')[0]; |
| assert_greater_than_equal(entry.activationStart, 0, |
| 'activationStart must be greater than 0') |
| |
| result.onprerenderingchangeCalled = true; |
| result.prerenderingValueAfterActivation = document.prerendering; |
| |
| const resultChannel = new PrerenderChannel('result', uid); |
| resultChannel.postMessage(result); |
| resultChannel.close(); |
| window.close(); |
| }); |
| } else if (isPrerendering) { |
| assert_true(document.prerendering); |
| |
| location.href = location.href + '&navigation'; |
| } else { |
| assert_false(document.prerendering); |
| |
| const prerenderingUrl = location.href + '&prerendering'; |
| |
| const prerenderChannel = new PrerenderChannel('prerender-channel', uid); |
| const readyToActivate = new Promise((resolve, reject) => { |
| prerenderChannel.addEventListener('message', e => { |
| if (e.data === 'readyToActivate') { |
| resolve(); |
| } else { |
| reject(`The initiator page receives an unsupported message: ${e.data}`); |
| } |
| }); |
| }); |
| |
| // Activate the page when prerendering is ready. |
| readyToActivate.then(() => { |
| window.location = prerenderingUrl.toString(); |
| }).catch(e => { |
| const resultChannel = new PrerenderChannel('result', uid); |
| resultChannel.postMessage( |
| `Failed to navigate the prerendered page: ${e.toString()}`); |
| resultChannel.close(); |
| window.close(); |
| }); |
| |
| startPrerendering(prerenderingUrl); |
| } |
| </script> |