embedded_forwarder.js (1376B)
1 "use strict"; 2 3 test_driver.set_test_context(window.top); 4 5 function waitForMessage(timestamp) { 6 return new Promise(resolve => { 7 const listener = (event) => { 8 if (!timestamp || event.data.timestamp == timestamp) { 9 window.removeEventListener("message", listener); 10 resolve(event.data); 11 } 12 }; 13 window.addEventListener("message", listener); 14 }); 15 } 16 17 var iframe = document.createElement('iframe'); 18 const queryString = window.location.search; 19 const urlParams = new URLSearchParams(queryString); 20 iframe.src = urlParams.get("inner_url"); 21 document.body.appendChild(iframe); 22 23 window.addEventListener("message", async (event) => { 24 function replyToParent(data) { 25 parent.postMessage( 26 {timestamp: event.data.timestamp, data}, "*"); 27 } 28 29 if (!event.data["command"]) { 30 return; 31 } 32 33 switch (event.data["command"]) { 34 case "navigate_child": 35 iframe.onload = () => replyToParent(event.data.url); 36 iframe.src = event.data.url; 37 break; 38 case "reload": 39 case "navigate": 40 iframe.contentWindow.postMessage({timestamp, ...event.data}, "*"); 41 break; 42 default:{ 43 const timestamp = event.data.timestamp; 44 const p = waitForMessage(timestamp); 45 iframe.contentWindow.postMessage({timestamp, ...event.data}, "*"); 46 replyToParent(await p.then(resp => resp.data)); 47 break; 48 } 49 } 50 });