Source code
Revision control
Copy as Markdown
Other Tools
<?xml version="1.0"?>
<window id="690056Test"
        width="600"
        height="600"
        onload="setTimeout(nextTest, 0);"
  <script type="application/javascript" src="docshell_helpers.js" />
  <script type="application/javascript"><![CDATA[
    var tests = testIterator();
    function nextTest() {
      tests.next();
    }
    // Makes sure that we fire the visibilitychange events
    function* testIterator() {
      // Enable bfcache
      enableBFCache(8);
      TestWindow.getBrowser().docShellIsActive = true;
      // Load something for a start
      doPageNavigation({
        uri: 'data:text/html,<title>initial load</title>',
        onNavComplete: nextTest
      });
      yield undefined;
      // Now load a new page
      doPageNavigation({
        uri: 'data:text/html,<title>new load</title>',
        eventsToListenFor: [ "pageshow", "pagehide", "visibilitychange" ],
        expectedEvents: [ { type: "pagehide",
                            title: "initial load",
                            persisted: true },
                          { type: "visibilitychange",
                            title: "initial load",
                            visibilityState: "hidden",
                            hidden: true },
                          // No visibilitychange events fired for initial pageload
                          { type: "pageshow",
                            title: "new load",
                            persisted: false }, // false on initial load
                        ],
        onNavComplete: nextTest
      });
      yield undefined;
      // Now go back
      doPageNavigation({
        back: true,
        eventsToListenFor: [ "pageshow", "pagehide", "visibilitychange" ],
        expectedEvents: [ { type: "pagehide",
                            title: "new load",
                            persisted: true },
                          { type: "visibilitychange",
                            title: "new load",
                            visibilityState: "hidden",
                            hidden: true },
                          { type: "visibilitychange",
                            title: "initial load",
                            visibilityState: "visible",
                            hidden: false },
                          { type: "pageshow",
                            title: "initial load",
                            persisted: true },
                        ],
        onNavComplete: nextTest
      });
      yield undefined;
      // And forward
      doPageNavigation({
        forward: true,
        eventsToListenFor: [ "pageshow", "pagehide", "visibilitychange" ],
        expectedEvents: [ { type: "pagehide",
                            title: "initial load",
                            persisted: true },
                          { type: "visibilitychange",
                            title: "initial load",
                            visibilityState: "hidden",
                            hidden: true },
                          { type: "visibilitychange",
                            title: "new load",
                            visibilityState: "visible",
                            hidden: false },
                          { type: "pageshow",
                            title: "new load",
                            persisted: true },
                        ],
        onNavComplete: nextTest
      });
      yield undefined;
      waitForPageEvents({
        eventsToListenFor: [ "visibilitychange" ],
        expectedEvents: [ { type: "visibilitychange",
                            title: "new load",
                            visibilityState: "hidden",
                            hidden: true },
                        ],
        onNavComplete: nextTest
      });
      // Now flip our docshell to not active
      TestWindow.getBrowser().docShellIsActive = false;
      yield undefined;
      // And navigate back; there should be no visibility state transitions
      doPageNavigation({
        back: true,
        eventsToListenFor: [ "pageshow", "pagehide", "visibilitychange" ],
        expectedEvents: [ { type: "pagehide",
                            title: "new load",
                            persisted: true },
                          { type: "pageshow",
                            title: "initial load",
                            persisted: true },
                        ],
        unexpectedEvents: [ "visibilitychange" ],
        onNavComplete: nextTest
      });
      yield undefined;
      waitForPageEvents({
        eventsToListenFor: [ "visibilitychange" ],
        expectedEvents: [ { type: "visibilitychange",
                            title: "initial load",
                            visibilityState: "visible",
                            hidden: false },
                        ],
        onNavComplete: nextTest
      });
      // Now set the docshell active again
      TestWindow.getBrowser().docShellIsActive = true;
      yield undefined;
      // And forward
      doPageNavigation({
        forward: true,
        eventsToListenFor: [ "pageshow", "pagehide", "visibilitychange" ],
        expectedEvents: [ { type: "pagehide",
                            title: "initial load",
                            persisted: true },
                          { type: "visibilitychange",
                            title: "initial load",
                            visibilityState: "hidden",
                            hidden: true },
                          { type: "visibilitychange",
                            title: "new load",
                            visibilityState: "visible",
                            hidden: false },
                          { type: "pageshow",
                            title: "new load",
                            persisted: true },
                        ],
        onNavComplete: nextTest
      });
      yield undefined;
      // Tell the framework the test is finished.
      finish();
    }
  ]]></script>
  <browser type="content" primary="true" flex="1" id="content" remote="true" maychangeremoteness="true" manualactiveness="true" />
</window>