Source code
Revision control
Copy as Markdown
Other Tools
<?xml version="1.0"?>
<window id="396649Test"
        width="600"
        height="600"
        onload="setTimeout(nextTest, 0);"
  <script type="application/javascript" src="docshell_helpers.js" />
  <script type="application/javascript"><![CDATA[
    Services.prefs.setBoolPref("browser.navigation.requireUserInteraction", false);
  
    // Define the generator-iterator for the tests.
    var tests = testIterator();
    
    // Maximum number of entries in the bfcache for this session history.
    // This number is hardcoded in docshell code.  In the test, we'll
    // navigate through enough pages so that we hit one that's been
    // evicted from the bfcache because it's farther from the current
    // page than this number.
    const MAX_BFCACHE_PAGES = 3;
    ////
    // Execute the next test in the generator function.
    //
    function nextTest() {
      tests.next();
    }
    ////
    // viewers should be evicted from bfcache when going back if more
    // than MAX_BFCACHE_PAGES from the current index.
    //
    function* testIterator()
    {
      // Make sure bfcache is on.
      enableBFCache(true);
      
      // Load enough pages so that the first loaded is eviced from
      // the bfcache, since it is greater the MAX_BFCACHE_PAGES from
      // the current position in the session history. Verify all
      // of the pages are initially stored in the bfcache when
      // they're unloaded.
      for (var i = 0; i <= MAX_BFCACHE_PAGES + 1; i++) {
        let eventsToListenFor = ["pageshow"];
        let expectedEvents = [ { type: "pageshow",
        if (i > 0) {
          eventsToListenFor.push("pagehide");
          expectedEvents.unshift({ type: "pagehide",
        }
        doPageNavigation( {
           uri: "data:text/html,<!DOCTYPE html><html>" + 
                "</title></head>" +
                "<body>" + 
                "test page " + i +
                "</body></html>",
           eventsToListenFor,
           expectedEvents,
           onNavComplete: nextTest 
          } );
        yield undefined;
      }
      // Go back to the first page, one page at a time.  The first 
      // MAX_BFCACHE_PAGES pages loaded via back should come from the bfcache, 
      // the last should not, since it should have been evicted during the 
      // previous navigation sequence.  Verify all pages are initially stored
      // in the bfcache when they're unloaded.
      for (i = MAX_BFCACHE_PAGES + 1; i > 0; i--) {
        doPageNavigation( {
          back: true,
          eventsToListenFor: ["pageshow", "pagehide"],
          expectedEvents: [ { type: "pagehide",
                              persisted: true },
                            { type: "pageshow", 
                              persisted: i > 1 } ],
          onNavComplete: nextTest
        } );
        yield undefined;
      }
      
      // Traverse history forward now.  Again, the first MAX_BFCACHE_PAGES
      // pages should come from the bfcache, the last should not,
      // since it should have been evicted during the backwards
      // traversal above.  Verify all pages are initially stored
      // in the bfcache when they're unloaded.
      for (i = 1; i <= MAX_BFCACHE_PAGES + 1; i++) {
        doPageNavigation( {
          forward: true,
          eventsToListenFor: ["pageshow", "pagehide"],
          expectedEvents: [ { type: "pagehide",
                              persisted: true },
                            { type: "pageshow", 
                              persisted: i < MAX_BFCACHE_PAGES + 1 } ],
          onNavComplete: nextTest
        } );
        yield undefined;
      }
      
      Services.prefs.clearUserPref("browser.navigation.requireUserInteraction");
      // Tell the framework the test is finished.
      finish();
    }
    
  ]]></script>
  <browser type="content" primary="true" flex="1" id="content" remote="true" maychangeremoteness="true" />
</window>