| <!doctype html> |
| |
| <title>about:blank iframe initiator and prerendered page</title> |
| <script src="/common/get-host-info.sub.js"></script> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="utils.js"></script> |
| <script> |
| // Called by iframe-nav-to-about-blank in case empty.html loads before |
| // we can add the proper onload handler below. |
| let iframeLoadedEmptyHtml = false; |
| function onIframeLoadedEmptyHtml() { |
| iframeLoadedEmptyHtml = true; |
| } |
| </script> |
| <body> |
| <iframe id="iframe-no-src"></iframe> |
| <iframe id="iframe-srcdoc" srcdoc="<!doctype html><p>wow look</p>"></iframe> |
| <iframe id="iframe-nav-to-about-blank" src="empty.html" |
| onload="onIframeLoadedEmptyHtml();"></iframe> |
| <script> |
| |
| // When loaded without the "?prerendering" param, this document |
| // is called the "intiator page". It starts a prerender to the same |
| // URL, but with the "?prerendering" param. |
| // |
| // When loaded with the "?prerendering" param, this document is |
| // the "prerendered page". It tells the initiator page when it is |
| // ready to activate, and messages the main test page when it is |
| // finished. |
| |
| // Runs the logic of the prerendered page. |
| // |
| // The prerendered page has about:blank/srcdoc iframes and tests their |
| // document.prerendering state before and after activation. |
| async function main() { |
| // The iframe-no-src iframe has no src attribute. |
| const iframeNoSrc = document.querySelector('#iframe-no-src'); |
| |
| // The iframe-srcdoc iframe has a srcdoc attribute. |
| const iframeSrcdoc = document.querySelector('#iframe-srcdoc'); |
| |
| // The iframe-nav-to-about-blank first navigates to a non-about:blank URL, |
| // then sets src to about:blank. |
| const iframeNavToAboutBlank = |
| document.querySelector('#iframe-nav-to-about-blank'); |
| |
| await new Promise((resolve, reject) => { |
| iframeNavToAboutBlank.addEventListener('load', (e) => { |
| if (iframeNavToAboutBlank.src != 'about:blank') |
| iframeNavToAboutBlank.src = 'about:blank'; |
| else |
| resolve(); |
| }); |
| |
| // In case the original navigation to empty.html already finished before we |
| // added the event listener above, navigate to about:blank now. |
| if (iframeLoadedEmptyHtml) |
| iframeNavToAboutBlank.src = 'about:blank'; |
| }); |
| |
| // Collect the documents. |
| let frames = [ |
| {doc: document, name: 'main'}, |
| {doc: iframeNoSrc.contentDocument, name: 'iframeNoSrc'}, |
| {doc: iframeSrcdoc.contentDocument, name: 'iframeSrcdoc'}, |
| {doc: iframeNavToAboutBlank.contentDocument, name: 'iframeNavToAboutBlank'} |
| ]; |
| |
| // Test document.prerendering pre-activation for each document. |
| for (let i = 0; i < frames.length; i++) { |
| assert_true(frames[i].doc.prerendering, |
| `document.prerendering pre-activation: ${frames[i].name}`); |
| } |
| |
| // Resolves with [bool, bool, bool, ...] upon activation. Each `bool` is the |
| // value of document.prerendering in the prerenderingchange event for the |
| // corresponding document. |
| let activationPromises = frames.map(x => { |
| return new Promise((resolve, reject) => { |
| x.doc.addEventListener('prerenderingchange', (e) => { |
| resolve(document.prerendering); |
| }); |
| }); |
| }); |
| |
| // Ask to activate. |
| const prerenderChannel = new PrerenderChannel('prerender-channel'); |
| prerenderChannel.postMessage('readyToActivate'); |
| |
| // Test document.prerendering post-activation for each document. |
| let activationResults = await Promise.all(activationPromises); |
| for (let i = 0; i < activationResults.length; i++) { |
| assert_false(activationResults[i], |
| `document.prerendering in prerenderingchange for ${frames[i].name}`); |
| } |
| } |
| |
| // See comment at the top of this file. |
| const params = new URLSearchParams(location.search); |
| const isPrerendering = params.has('prerendering'); |
| if (!isPrerendering) { |
| loadInitiatorPage(); |
| } else { |
| // For the prerendering page, run main() then message the test page with the |
| // result. |
| const testChannel = new PrerenderChannel('test-channel'); |
| main().then(() => { |
| testChannel.postMessage('PASS'); |
| }).catch((e) => { |
| testChannel.postMessage('FAIL: ' + e); |
| }); |
| } |
| </script> |
| </body> |