1const syncDelay = ms => { 2 const start = performance.now(); 3 let elapsedTime; 4 do { 5 elapsedTime = performance.now() - start; 6 } while (elapsedTime < ms); 7}; 8 9const markTime = (docName, lifecycleEventName) => { 10 // Calculating these values before the below `mark` invocation ensures that delays in 11 // reaching across to the other window object doesn't interfere with the correctness 12 // of the test. 13 const dateNow = Date.now(); 14 const performanceNow = performance.now(); 15 16 window.opener.mark({ 17 docName, 18 lifecycleEventName, 19 performanceNow: performanceNow, 20 dateNow: dateNow 21 }); 22}; 23 24const setupUnloadPrompt = (docName, msg) => { 25 window.addEventListener("beforeunload", ev => { 26 markTime(docName, "beforeunload"); 27 return ev.returnValue = msg || "Click OK to continue test." 28 }); 29}; 30 31const setupListeners = (docName, nextDocument) => { 32 window.addEventListener("load", () => { 33 markTime(docName, "load"); 34 document.getElementById("proceed").addEventListener("click", ev => { 35 ev.preventDefault(); 36 if (nextDocument) { 37 document.location = nextDocument; 38 } else { 39 window.close(); 40 } 41 }) 42 }); 43 44 setupUnloadPrompt(docName); 45 46 window.addEventListener("unload", () => { 47 markTime(docName, "unload"); 48 if (docName !== "c") { syncDelay(1000); } 49 }); 50}; 51