<!DOCTYPE html>
<title>Same-origin prerendering: sendBeacon</title>
<meta name="variant" content="?target_hint=_self">
<meta name="variant" content="?target_hint=_blank">
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="../resources/utils.js"></script>
<script src="resources/utils.js"></script>
<script>
setup(() => assertSpeculationRulesIsSupported());

promise_test(async t => {
  const STORE_URL = '/speculation-rules/prerender/resources/key-value-store.py';

  // Create a prerendered page.
  const rule_extras = {'target_hint': getTargetHint()};
  const {exec, activate} = await create_prerendered_page(
      t, undefined, undefined, rule_extras);

  // This test will send 3 beacons. Each beacon will be stored with these keys
  // on the server.
  const keys = [token(), token(), token()];

  // Ask the prerendered page to send beacons during prerendering and
  // prerenderingchange.
  await exec(async (store_url, keys) => {
    const url1 = `${store_url}?key=${keys[0]}&value=during-prerendering`;
    navigator.sendBeacon(url1);

    document.onprerenderingchange = _ => {
      const url2 = `${store_url}?key=${keys[1]}&value=onprerenderingchange`;
      navigator.sendBeacon(url2);
    };
  }, [STORE_URL, keys]);

  // Wait for the beacon sent during prerendering.
  assert_equals(await nextValueFromServer(keys[0]), 'during-prerendering');

  await activate();

  // Wait for the beacon sent during the prerenderingchange event.
  assert_equals(await nextValueFromServer(keys[1]), 'onprerenderingchange');

  // Ask the activated page to send a beacon.
  await exec(async (store_url, keys) => {
    const url3 = `${store_url}?key=${keys[2]}&value=after-activation`;
    navigator.sendBeacon(url3);
  }, [STORE_URL, keys]);

  // Wait for the beacon sent after activation.
  assert_equals(await nextValueFromServer(keys[2]), 'after-activation');
}, 'Prerendering page should be able to send beacons');
</script>
<body>
</body>
