helpers.js (2417B)
1 // This file contains general helpers for navigation/history tests. The goal is 2 // to make tests more imperative and ordered, instead of requiring lots of 3 // nested callbacks and jumping back and forth. However, 4 // html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js 5 // might be even better at that, so prefer that when you can. 6 // 7 // TODO(domenic): consider unifying with 8 // overlapping-navigations-and-traversals/resources/helpers.mjs. 9 10 window.openWindow = (url, t) => { 11 const w = window.open(url); 12 t?.add_cleanup(() => w.close()); 13 14 return new Promise(resolve => { 15 w.addEventListener("load", () => resolve(w), { once: true }); 16 }); 17 }; 18 19 window.addIframe = (url = "/common/blank.html", doc = document) => { 20 const iframe = doc.createElement("iframe"); 21 iframe.src = url; 22 doc.body.append(iframe); 23 24 return new Promise(resolve => { 25 iframe.addEventListener("load", () => resolve(iframe), { once: true }); 26 }); 27 }; 28 29 window.addSrcdocIframe = async () => { 30 const iframe = document.createElement("iframe"); 31 iframe.srcdoc = `<script>window.parent.postMessage("srcdoc ready", "*")</scr` + `ipt>`; 32 document.body.append(iframe); 33 34 assert_equals(await waitForMessage(iframe.contentWindow), "srcdoc ready"); 35 36 return iframe; 37 }; 38 39 window.waitToAvoidReplace = t => { 40 return new Promise(resolve => t.step_timeout(resolve, 0)); 41 }; 42 43 window.waitForIframeLoad = iframe => { 44 return new Promise(resolve => { 45 iframe.addEventListener("load", () => resolve(), { once: true }); 46 }); 47 }; 48 49 window.waitForMessage = expectedSource => { 50 return new Promise(resolve => { 51 window.addEventListener("message", ({ source, data }) => { 52 if (source === expectedSource) { 53 resolve(data); 54 } 55 }); 56 }); 57 }; 58 59 window.waitForHashchange = w => { 60 return new Promise(resolve => { 61 w.addEventListener("hashchange", () => resolve(), { once: true }); 62 }); 63 }; 64 65 window.srcdocThatPostsParentOpener = text => { 66 return ` 67 <p>${text}</p> 68 <script> 69 window.onload = () => { 70 window.top.opener.postMessage('ready', '*'); 71 }; 72 <\/script> 73 `; 74 }; 75 76 window.failOnMessage = expectedSource => { 77 return new Promise((_, reject) => { 78 window.addEventListener("message", ({ source, data }) => { 79 if (source === expectedSource) { 80 reject(new Error(`Received message "${data}" but expected to receive no message`)); 81 } 82 }); 83 }); 84 };