1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
  
     | 
    
      <!DOCTYPE html>
<!--
 "Activation" suffix in these test names communicates to the test harness that
 this part of the test is run post-activation.
-->
<script src="/speculation-rules/prerender/resources/utils.js"></script>
<script src="session-history-harness.js"></script>
<script src="session-history-test-util.js"></script>
<body>
  <script>
    function testHistoryPushStateInPrerender() {
      assert(history.length == 1, "Initial history length");
      assert(!history.state, "Initial history state");
      history.pushState("teststate", null, null);
      assert(history.length == 1, "History length unchanged");
      assert(history.state == "teststate", "Update state");
    }
    function testHistoryReplaceStateInPrerender() {
      assert(history.length == 1, "Initial history length");
      assert(!history.state, "Initial history state");
      history.replaceState("teststate", null, null);
      assert(history.length == 1, "History length unchanged");
      assert(history.state == "teststate", "Update state");
    }
    function testLocationAssignInPrerender() {
      assert(history.length == 1, "Initial history length");
      const initialLocation = location.href;
      location.assign("#test");
      assert(history.length == 1, "History length unchanged");
      assert(location.href != initialLocation, "Update location");
    }
    function testLocationReplaceInPrerender() {
      assert(history.length == 1, "Initial history length");
      const initialLocation = location.href;
      location.replace("#test");
      assert(history.length == 1, "History length unchanged");
      assert(location.href != initialLocation, "Update location");
    }
    function testSetLocationHrefInPrerender() {
      assert(history.length == 1, "Initial history length");
      const initialLocation = location.href;
      location.href = "#test";
      assert(history.length == 1, "History length unchanged");
      assert(location.href != initialLocation, "Update location");
    }
    function testSyntheticAnchorClickInPrerender() {
      assert(history.length == 1, "Initial history length");
      const initialLocation = location.href;
      const anchor = document.createElement("a");
      anchor.href = "#test";
      document.body.appendChild(anchor);
      anchor.click();
      assert(history.length == 1, "History length unchanged");
      assert(location.href != initialLocation, "Update location");
    }
    function testHistoryLengthInPrerender() {
      assert(history.length == 1, "Initial history length");
    }
    function testHistoryLengthInPrerenderActivation() {
      assert(history.length == 2, "History length after activation");
      // TODO(http://crbug.com/1220992): Test whether calling history.back()
      // after activation should go back to the initiator page correctly.
      // We might need a non-trivial refactoring to test this scenario correctly.
    }
    // This test runs testSubfrarmeNavigationInPrerenderInSubframe() in a
    // subframe, and waits for a message from a navigated subframe.
    async function testSubframeNavigationInPrerender() {
      assert(window.parent == window, "not the top frame");
      const params = new URLSearchParams(window.location.search);
      const testName = params.get("testName");
      const uid = params.get("uid");
      const resultPromise = waitChannelMessage(
          `prerender-channel-${testName}InSubframeAfterNavigation`, uid);
      params.set("testName", testName + "InSubframe");
      const frame = document.createElement("iframe");
      const url = location.pathname + "?" + params.toString();
      frame.src = url;
      document.body.appendChild(frame);
      const result = await resultPromise;
      assert(result == "Passed", result);
    }
    function testSubframeNavigationInPrerenderInSubframe() {
      assert(window.parent != window, "not in a subframe");
      assert(window.parent == window.top, "the direct parent isn't the top");
      assert(history.length == 1, "Initial history length");
      const params = new URLSearchParams(window.location.search);
      const testName = params.get("testName");
      params.set("testName", testName + "AfterNavigation");
      location.href = location.pathname + "?" + params.toString();
    }
    function testSubframeNavigationInPrerenderInSubframeAfterNavigation() {
      assert(window.parent != window, "not in a subframe");
      assert(window.parent == window.top, "the direct parent isn't the top");
      assert(history.length == 1, "History length after subframe navigation");
    }
    // This test runs testSubframeReloadInPrerenderInSubframe() in a
    // subframe, and waits for a message from a navigated subframe.
    async function testSubframeReloadInPrerender() {
      assert(window.parent == window, "not the top frame");
      const params = new URLSearchParams(window.location.search);
      const testName = params.get("testName");
      const uid = params.get("uid");
      const resultPromise = waitChannelMessage(
          `prerender-channel-${testName}InSubframe`, uid);
      params.set("testName", testName + "InSubframe");
      const frame = document.createElement("iframe");
      const url = location.pathname + "?" + params.toString();
      frame.src = url;
      document.body.appendChild(frame);
      const result = await resultPromise;
      assert(result == "Passed", result);
      const second_result = await waitChannelMessage(
          `prerender-channel-${testName}InSubframe`, uid);
      assert(second_result == "Passed", second_result);
    }
    function testSubframeReloadInPrerenderInSubframe() {
      assert(window.parent != window, "not in a subframe");
      assert(window.parent == window.top, "the direct parent isn't the top");
      assert(history.length == 1, "Initial history length");
      window.location.reload();
    }
  </script>
</body>
 
     |