| <!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> |