<html> <head> <script> if (window.testRunner) { if (!sessionStorage.stage) testRunner.clearBackForwardList(); testRunner.dumpAsText(); testRunner.waitUntilDone(); } function lastPathComponent(url) { return url.split('/').pop(); } function hashOf(url) { return url.substring(url.lastIndexOf('#')); } function runFirstStageOfTest() { history.replaceState("FirstEntry", null, "#FirstEntry"); history.pushState("SecondEntry", null, "#SecondEntry"); history.back(); } function runTest() { alert("LOADED"); if (!sessionStorage.stage) runFirstStageOfTest(); } function continueTest(state) { // FIXME: Once the popstate and hashchange events fire asynchronously, we // can eliminate this setTimeout hack. The hashchange event currently runs // synchronously following the popstate event, but the calls to // replaceState cause the location to change immediately. That confuses // our hashchange handler, which expects to see the "old" value of the // location. setTimeout(function() { if (state == "FirstEntry") { history.replaceState("FirstEntryWillLaterBeReactivated", null, "#FirstEntryWillLaterBeReactivated"); history.forward(); } else if (state == "SecondEntry") { history.replaceState("SecondEntryWillLaterBeReactivated", null, "#SecondEntryWillLaterBeReactivated"); window.location = "resources/navigate-back.html"; } else if (state == "SecondEntryWillLaterBeReactivated") history.back(); }, 0); } window.onpopstate = function statePopped() { var state = event.state; alert("State popped - " + state + " (type " + typeof state + ")"); continueTest(state); } window.onpageshow = function pageShown() { if (sessionStorage.stage == 2) { var state = history.state; alert("Page shown - " + state + " (type " + typeof state + ")"); continueTest(state); } } window.onhashchange = function hashChanged(event) { alert("hashChanged - Last path component of location is " + lastPathComponent(event.newURL)); if (hashOf(event.newURL) == "#FirstEntryWillLaterBeReactivated") { alert("Test complete"); sessionStorage.clear(); if (window.testRunner) testRunner.notifyDone(); } } </script> <body onload="runTest();" 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 and hashchanged events are fired. -Navigates away to a new document, with the old document being destroyed. -Navigates back to the state object entries and verifies the pageshow or popstate events are fired on the new documents. </pre> </body> </html>