| <!DOCTYPE html> | |
| <title>PerformanceNavigationTiming's activationStart in prerendered page</title> | |
| <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="/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"></script> | |
| <script src="../resources/utils.js"></script> | |
| <script src="resources/utils.js"></script> | |
| <body> | |
| <script> | |
| setup(() => assertSpeculationRulesIsSupported()); | |
| promise_test(async t => { | |
| const ACTIVATION_DELAY = 10; | |
| const rcHelper = new PrerenderingRemoteContextHelper(); | |
| const referrerRC = await rcHelper.addWindow(undefined, { features: 'noopener' }); | |
| const prerenderedRC = await referrerRC.addPrerender(); | |
| const iframeRC = await prerenderedRC.addIframe(); | |
| assert_equals( | |
| await getActivationStart(prerenderedRC), | |
| 0, | |
| 'activationStart must be 0 while prerendering' | |
| ); | |
| assert_equals( | |
| await getActivationStart(iframeRC), | |
| 0, | |
| 'activationStart must be 0 while prerendering the iframe' | |
| ); | |
| // Wait ACTIVATION_DELAY ms before activation. | |
| await new Promise(resolve => t.step_timeout(resolve, ACTIVATION_DELAY)); | |
| await referrerRC.navigateExpectingPrerenderingActivation(prerenderedRC); | |
| assert_greater_than_equal( | |
| await getActivationStart(prerenderedRC), | |
| ACTIVATION_DELAY, | |
| 'activationStart after activation must be greater than or equal to ' + | |
| 'ACTIVATION_DELAY' | |
| ); | |
| assert_greater_than_equal( | |
| await getActivationStart(iframeRC), | |
| ACTIVATION_DELAY, | |
| 'activationStart after activation must be greater than or equal to ' + | |
| 'ACTIVATION_DELAY in the iframe' | |
| ); | |
| }); | |
| // A utility to both extract activationStart from the prerendered | |
| // RemoteContextWrapper, and also check that it shows up in toJSON(). | |
| async function getActivationStart(prerenderedRC) { | |
| const [activationStart, activationStartInToJSON] = await prerenderedRC.executeScript(() => { | |
| const entry = performance.getEntriesByType("navigation")[0]; | |
| return [entry.activationStart, entry.toJSON().activationStart]; | |
| }); | |
| assert_equals( | |
| activationStart, | |
| activationStartInToJSON, | |
| "activationStart value must be available in the result of toJSON()" | |
| ); | |
| return activationStart; | |
| } | |
| </script> |