| <!DOCTYPE html> | |
| <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 rcHelper = new PrerenderingRemoteContextHelper(); | |
| const referrerRC = await rcHelper.addWindow(undefined, { features: 'noopener' }); | |
| assert_equals(await referrerRC.executeScript(() => navigation.entries().length), 1); | |
| let referrerRCCurrentId = await referrerRC.executeScript(() => navigation.currentEntry.id); | |
| const prerenderedRC = await referrerRC.addPrerender(); | |
| let activationStateBeforeActivation = await prerenderedRC.executeScript(() => { | |
| return { | |
| entries: navigation.entries().map(e => ({ id: e.id, })), | |
| activationEntryId: navigation.activation.entry?.id, | |
| activationFromId: navigation.activation.from?.id, | |
| activationNavigationType : navigation.activation.navigationType, | |
| } | |
| }); | |
| assert_equals(activationStateBeforeActivation.entries.length, 1); | |
| assert_equals(activationStateBeforeActivation.activationFromId, referrerRCCurrentId); | |
| assert_equals(activationStateBeforeActivation.activationEntryId, activationStateBeforeActivation.entries[0].id); | |
| assert_equals(activationStateBeforeActivation.activationNavigationType, "push"); | |
| // Save the current entry before activation. | |
| await prerenderedRC.executeScript(() => window.currentEntryBeforeActivation = navigation.currentEntry); | |
| await referrerRC.navigateExpectingPrerenderingActivation(prerenderedRC, url => { | |
| location.replace(url); | |
| }); | |
| let activationStateAfterActivation = await prerenderedRC.executeScript(() => { | |
| return { | |
| entries: navigation.entries().map(e => ({ id: e.id, })), | |
| activationEntryId: navigation.activation.entry?.id, | |
| activationFromId: navigation.activation.from?.id, | |
| activationNavigationType : navigation.activation.navigationType, | |
| } | |
| }); | |
| assert_equals(activationStateAfterActivation.entries.length, 1); | |
| assert_equals(activationStateAfterActivation.activationFromId, referrerRCCurrentId); | |
| assert_equals(activationStateAfterActivation.activationEntryId, activationStateAfterActivation.entries[0].id); | |
| assert_equals(activationStateAfterActivation.activationNavigationType, "replace"); | |
| let currentEntryIdentity = await prerenderedRC.executeScript(() => { | |
| return window.currentEntryBeforeActivation === navigation.currentEntry && | |
| navigation.currentEntry === navigation.entries()[navigation.entries().length - 1]; | |
| }); | |
| assert_true(currentEntryIdentity); | |
| },`navigation.entries() and navigation.activation should be updated on activation and handle replacing correctly`); | |
| </script> |