<html>
<head>
<script>

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

function log(txt)
{
    document.getElementById("logger").innerText += txt + "\n";
}

function runTest()
{
    history.pushState("StateStringData", "New title");
    log("History length is " + history.length);
    history.back();
}

function statePopped()
{
    log("State popped - " + event.state + " (type " + typeof event.state + ")");
    if (event.state == null)
        history.forward();
    else if (window.testRunner)
        testRunner.notifyDone();
}

window.onpopstate = statePopped;

</script>
<body onload="runTest();">
<pre>
This test does the following:
-Uses window.onpopstate to add a popstate handler
-Makes a call to pushState()
-Makes sure the history length is correct
-Goes back, and makes sure the popstate event is correct
-Goes forward, and makes sure the popstate event is correct
</pre><br>
<pre id="logger"></pre>
</body>
</html>
