const syncDelay = ms => { const start = performance.now(); let elapsedTime; do { elapsedTime = performance.now() - start; } while (elapsedTime < ms); }; const markTime = (docName, lifecycleEventName) => { // Calculating these values before the below `mark` invocation ensures that delays in // reaching across to the other window object doesn't interfere with the correctness // of the test. const dateNow = Date.now(); const performanceNow = performance.now(); window.opener.mark({ docName, lifecycleEventName, performanceNow: performanceNow, dateNow: dateNow }); }; const setupUnloadPrompt = (docName, msg) => { window.addEventListener("beforeunload", ev => { markTime(docName, "beforeunload"); return ev.returnValue = msg || "Click OK to continue test." }); }; const setupListeners = (docName, nextDocument) => { window.addEventListener("load", () => { markTime(docName, "load"); document.getElementById("proceed").addEventListener("click", ev => { ev.preventDefault(); if (nextDocument) { document.location = nextDocument; } else { window.close(); } }) }); setupUnloadPrompt(docName); window.addEventListener("unload", () => { markTime(docName, "unload"); if (docName !== "c") { syncDelay(1000); } }); };