Source code
Revision control
Copy as Markdown
Other Tools
<?xml version="1.0"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
   - License, v. 2.0. If a copy of the MPL was not distributed with this
<window id="215405Test"
        width="600"
        height="600"
        onload="onLoad();"
        title="215405 test">
  <script type="application/javascript"><![CDATA[
    const {BrowserTestUtils} = ChromeUtils.importESModule(
    );
    Services.prefs.setBoolPref("browser.navigation.requireUserInteraction", false);
    /* globals SimpleTest, is, isnot, ok */
    var imports = [ "SimpleTest", "is", "isnot", "ok"];
    for (var name of imports) {
      window[name] = window.arguments[0][name];
    }
    const text="MOZILLA";
                       "215405_nostore.html";
                       "215405_nocache.html";
    var gBrowser;
    var gTestsIterator;
    var currScrollX = 0;
    var currScrollY = 0;
    function finish() {
      gBrowser.removeEventListener("pageshow", eventListener, true);
      let historyPurged;
      if (SpecialPowers.Services.appinfo.sessionHistoryInParent) {
        let history = gBrowser.browsingContext.sessionHistory;
        history.purgeHistory(history.count);
        historyPurged = Promise.resolve();
      } else {
        historyPurged = SpecialPowers.spawn(gBrowser, [], () => {
          let history = docShell.QueryInterface(Ci.nsIWebNavigation).sessionHistory
            .legacySHistory;
          history.purgeHistory(history.count);
        });
      }
      historyPurged.then(_ => {
        window.close();
        window.arguments[0].SimpleTest.finish();
      });
    }
    function onLoad() {
      gBrowser = document.getElementById("content");
      gBrowser.addEventListener("pageshow", eventListener, true);
      gTestsIterator = testsIterator();
      nextTest();
    }
    function eventListener() {
      setTimeout(nextTest, 0);
    }
    function nextTest() {
      gTestsIterator.next();
    }
    function* testsIterator() {
      // No-store tests
      var testName = "[nostore]";
      // Load a page with a no-store header
      BrowserTestUtils.startLoadingURIString(gBrowser, nostoreURI);
      yield undefined;
      // Now that the page has loaded, amend the form contents
      var form = gBrowser.contentDocument.getElementById("inp");
      form.value = text;
      // Attempt to scroll the page
      var originalXPosition = gBrowser.contentWindow.scrollX;
      var originalYPosition = gBrowser.contentWindow.scrollY;
      var scrollToX = gBrowser.contentWindow.scrollMaxX;
      var scrollToY = gBrowser.contentWindow.scrollMaxY;
      gBrowser.contentWindow.scrollBy(scrollToX, scrollToY);
      // Save the scroll position for future comparison
      currScrollX = gBrowser.contentWindow.scrollX;
      currScrollY = gBrowser.contentWindow.scrollY;
      isnot(currScrollX, originalXPosition,
            testName + " failed to scroll window horizontally");
      isnot(currScrollY, originalYPosition,
            testName + " failed to scroll window vertically");
      // Load a new document into the browser
      var simple = "data:text/html,<html><head><title>test2</title></head>" +
                     "<body>test2</body></html>";
      BrowserTestUtils.startLoadingURIString(gBrowser, simple);
      yield undefined;
      // Now go back in history. First page should not have been cached.
      gBrowser.goBack();
      yield undefined;
      // First uncacheable page will now be reloaded. Check scroll position
      // restored, and form contents not
      is(gBrowser.contentWindow.scrollX, currScrollX, testName +
         " horizontal axis scroll position not correctly restored");
      is(gBrowser.contentWindow.scrollY, currScrollY, testName +
         " vertical axis scroll position not correctly restored");
      var formValue = gBrowser.contentDocument.getElementById("inp").value;
      isnot(formValue, text, testName + " form value incorrectly restored");
      // https no-cache
      testName = "[nocache]";
      // Load a page with a no-cache header. This should not be
      BrowserTestUtils.startLoadingURIString(gBrowser, nocacheURI);
      yield undefined;
      // Now that the page has loaded, amend the form contents
      form = gBrowser.contentDocument.getElementById("inp");
      form.value = text;
      // Attempt to scroll the page
      originalXPosition = gBrowser.contentWindow.scrollX;
      originalYPosition = gBrowser.contentWindow.scrollY;
      scrollToX = gBrowser.contentWindow.scrollMaxX;
      scrollToY = gBrowser.contentWindow.scrollMaxY;
      gBrowser.contentWindow.scrollBy(scrollToX, scrollToY);
      // Save the scroll position for future comparison
      currScrollX = gBrowser.contentWindow.scrollX;
      currScrollY = gBrowser.contentWindow.scrollY;
      isnot(currScrollX, originalXPosition,
            testName + " failed to scroll window horizontally");
      isnot(currScrollY, originalYPosition,
            testName + " failed to scroll window vertically");
      BrowserTestUtils.startLoadingURIString(gBrowser, simple);
      yield undefined;
      // Now go back in history to the cached page.
      gBrowser.goBack();
      yield undefined;
      // First page will now be reloaded. Check scroll position
      // and form contents are restored
      is(gBrowser.contentWindow.scrollX, currScrollX, testName +
         " horizontal axis scroll position not correctly restored");
      is(gBrowser.contentWindow.scrollY, currScrollY, testName +
         " vertical axis scroll position not correctly restored");
      formValue = gBrowser.contentDocument.getElementById("inp").value;
      is(formValue, text, testName + " form value not correctly restored");
      Services.prefs.clearUserPref("browser.navigation.requireUserInteraction");
      finish();
    }
  ]]></script>
  <browser type="content" primary="true" flex="1" id="content" src="about:blank"/>
</window>