<html>
<head>
<script>

if (window.testRunner) {
    if (!sessionStorage.stage)
        testRunner.clearBackForwardList();
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

function lastPathComponent()
{
    return window.location.href.split('/').pop();
}

function runFirstStageOfTest()
{   
    history.replaceState("FirstEntry", null, "?FirstEntry");
    history.pushState("SecondEntry", null, "?SecondEntry");
    history.back();
}

function runSecondStageOfTest()
{
    alert("Last path component of location is " + lastPathComponent());
}

function runThirdStageOfTest()
{
    alert("Final stage of test loaded");
}

function runTest()
{
    if (!sessionStorage.stage) {
        // Location changes need to happen outside the onload handler to generate history entries.
        setTimeout(runFirstStageOfTest, 0);
    } else if (sessionStorage.stage == 2)
        runSecondStageOfTest();
    else if (sessionStorage.stage == 3)
        runThirdStageOfTest();
}

function statePopped()
{
    alert("State popped - " + event.state + " (type " + typeof event.state + ")");
    if (event.state == "FirstEntry") {
        history.replaceState("FirstEntryWillLaterBeReactivated", null, "?FirstEntryWillLaterBeReactivated");
        history.forward();
    } else if (event.state == "SecondEntry") {
        history.replaceState("SecondEntryWillLaterBeReactivated", null, "?SecondEntryWillLaterBeReactivated");
        window.location = "resources/navigate-back.html";
    } else if (event.state == "SecondEntryWillLaterBeReactivated")
        history.back();
    else if (event.state == "FirstEntryWillLaterBeReactivated") {
        alert("Test complete");
        sessionStorage.clear();
        if (window.testRunner)
            testRunner.notifyDone();
    }
}

</script>
<body onload="runTest();" onpopstate="statePopped();" onunload="/* disable page cache */">
<pre>
This test:
-Builds up a list of state object entries with fragment URLs.
-Navigates through them to verify that the popstate event is fired.
-Navigates away to a new document, with the old document being destroyed.
-Navigates back to the state object entries and verifies the popstate event is fired even on the new documents.
</pre><br>
<pre id="logger"></pre>
</body>
</html>
