chromium/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/session-history-harness.js

// We don't have the test harness in this context, so we roll our own
// which communicates with our initiator which is actually running the tests.

function assert(condition, message) {
  if (!condition) {
    throw new Error("Assertion failed: " + message);
  }
}

// Run a test after activation.
document.addEventListener("prerenderingchange", async (_) => {
  // history.length is racy on activation. Wait *100ms* as a workaround.
  // See crbug.com/1222893.
  await new Promise((resolve) => {
    window.setTimeout(resolve, 100);
  });

  const urlParams = new URLSearchParams(window.location.search);
  const testName = urlParams.get("testName");
  const uid = urlParams.get("uid");
  const testChannel = new PrerenderChannel(
    `test-channel-${testName}`, uid
  );

  try {
    const activationTestFn = testName + "Activation";
    const testFn = window[activationTestFn];
    if (!testFn) {
      testChannel.postMessage("Missing test: " + testName);
      return;
    }
    testFn();
    testChannel.postMessage("Passed");
  } catch (e) {
    testChannel.postMessage(
      "Failed: " + e.name + ": " + e.message,
    );
  } finally {
    testChannel.close();
  }
})

if (document.prerendering) {
  window.onload = async () => {
    const urlParams = new URLSearchParams(window.location.search);
    const testName = urlParams.get("testName");
    const uid = urlParams.get("uid");
    const prerenderChannel = new PrerenderChannel(
      `prerender-channel-${testName}`, uid
    );

    // The document load event is not finished at this point, so navigations
    // would be done with replacement. This interferes with our tests. We wait
    // for the next task before navigating to avoid this.
    await new Promise((resolve) => {
      window.setTimeout(resolve);
    });

    try {
      let testFn = window[testName];
      if (!testFn) {
        prerenderChannel.postMessage("Missing test: " + testName);
        return;
      }
      await testFn();
      prerenderChannel.postMessage("Passed");
    } catch (e) {
      prerenderChannel.postMessage(
        "Failed: " + e.name + ": " + e.message,
      );
    } finally {
      prerenderChannel.close();
    }
  };
}