<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>

<window id="303267Test"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        width="600"
        height="600"
        onload="setTimeout(nextTest,0);"
        title="bug 662200 test">

  <script type="application/javascript"
  src="docshell_helpers.js">
  </script>
  <script type="application/javascript" src= "chrome://mochikit/content/chrome-harness.js" />
  <script type="application/javascript"><![CDATA[
  
    // Define the generator-iterator for the tests.
    var tests = testIterator();

    ////
    // Execute the next test in the generator function.
    //
    function nextTest() {
      tests.next();
    }

    ////
    // Generator function for test steps for bug 662200:  
    // Description goes here.
    //
    function testIterator()
    {
      // Load the first test page
      var navData = {
        uri: getHttpUrl("662200a.html"),
        eventsToListenFor: ["pageshow"],
        expectedEvents: [ {type: "pageshow", title: "A"} ],
        onNavComplete: nextTest
      };
      doPageNavigation(navData);
      yield undefined;
      
      // Load the second test page.
      navData = {
        eventsToListenFor: ["pageshow", "pagehide"],
        expectedEvents: [ {type: "pagehide", 
                           title: "A"},
                          {type: "pageshow", 
                           title: "B"} ],
        onNavComplete: nextTest
      }
      waitForPageEvents(navData);
      var link = TestWindow.getDocument().getElementById("link");
      var event = TestWindow.getDocument().createEvent("MouseEvents");
      event.initMouseEvent("click", true, true, TestWindow.getWindow(),
                           0, 0, 0, 0, 0, false, false, false, false, 0, null);
      link.dispatchEvent(event);
      yield undefined;

      // Load the third test page.
      navData = {
        eventsToListenFor: ["pageshow", "pagehide"],
        expectedEvents: [ {type: "pagehide", 
                           title: "B"},
                          {type: "pageshow", 
                           title: "C"} ],
        onNavComplete: nextTest
      };
      waitForPageEvents(navData);
      var link = TestWindow.getDocument().getElementById("link");
      var event = TestWindow.getDocument().createEvent("MouseEvents");
      event.initMouseEvent("click", true, true, TestWindow.getWindow(),
                           0, 0, 0, 0, 0, false, false, false, false, 0, null);
      link.dispatchEvent(event);
      yield undefined;
      
      // Go back.
      navData = {
        back: true,
        eventsToListenFor: ["pageshow", "pagehide"],
        expectedEvents: [ {type: "pagehide", 
                           title: "C"},
                          {type: "pageshow", 
                           title: "B"} ],
        onNavComplete: nextTest
      };
      doPageNavigation(navData);
      yield undefined;

      var Ci = Components.interfaces;
      var docshell = TestWindow.getWindow()
                               .QueryInterface(Ci.nsIInterfaceRequestor)
                               .getInterface(Ci.nsIWebNavigation)
                               .QueryInterface(Ci.nsIDocShell);
      var shistory = docshell.QueryInterface(Ci.nsIInterfaceRequestor)
                             .getInterface(Ci.nsISHistory)
                             .QueryInterface(Ci.nsIWebNavigation);

      // Reload.
      navData = {
        eventsToListenFor: ["pageshow", "pagehide"],
        expectedEvents: [ {type: "pagehide", 
                           title: "B"},
                          {type: "pageshow", 
                           title: "B"} ],
        onNavComplete: nextTest
      };
      // Asking the docshell harness to reload for us will call reload on
      // nsDocShell which has different behavior than the reload on nsSHistory
      // so we call reload explicitly here
      waitForPageEvents(navData);
      shistory.reload(0);
      yield undefined;

      // After this sequence of events, we should be able to go back and forward
      is(TestWindow.getBrowser().canGoBack, true, "Should be able to go back!");
      is(TestWindow.getBrowser().canGoForward, true, "Should be able to go forward!");
      is(shistory.requestedIndex, -1, "Requested index should be cleared!");

      // Tell the framework the test is finished.  Include the final 'yield' 
      // statement to prevent a StopIteration exception from being thrown.
      finish();
      yield undefined;
    }
    
  ]]></script>

  <browser type="content-primary" flex="1" id="content" src="about:blank"/>
</window>
