<!DOCTYPE html>
<html>
<body>
<script src="../../../resources/js-test-pre.js"></script>
<div id="description"></div>
<pre id="console"></pre>
<script>
description('Tests that popstate events fire when navigating between pages (and history entries created via pushState) that are in the page cache.');

var testWindow;

onload = function()
{
    if (window.testRunner) {
        testRunner.setCanOpenWindows();
        testRunner.overridePreference('WebKitUsesPageCachePreferenceKey', 1);
    }
    testWindow = window.open('resources/popstate-fires-with-page-cache-1.html');
    if (!testWindow)
        testFailed('Could not open test window');
}

var testWindowLoadFireCount = 0;
var testWindowPopstateFireCount = 0;

function onTestWindowLoad(event)
{
    debug('load fired');
    testWindowLoadFireCount++;

    switch (testWindowLoadFireCount) {
    case 1:
        debug('pushState with new state object for page 1');
        testWindow.history.pushState('newState', '');
        debug('going to page 2');
        // Set the location in a timeout to generate a history entry
        setTimeout(function() {testWindow.location.href = 'resources/popstate-fires-with-page-cache-2.html';}, 0);            
        break;            
    case 2:
        debug('going back to page 1 with new state object');
        setTimeout(function() {testWindow.history.back();}, 0);
        break;
    default:
        testFailed('unexpected load event state');
        break;            
    }
}

function onTestWindowPopState(event)
{
    debug('popstate fired with state ' + event.state);
    testWindowPopstateFireCount++;
    
    switch (testWindowPopstateFireCount) {
        case 1:
            debug('going back to page 1 in initial state');
            setTimeout(function() {testWindow.history.back();}, 0);
            break;
        case 2:
            // Close the window in a timeout to simulate popstate firing asynchronously, otherwise closing the window in a popstate handler results in a crash.
            // FIXME: remove this when http://webkit.org/b/36202 is fixed.
            setTimeout(function() {
                testWindow.close();
                finishJSTest();
            }, 0);
            break;
        default:
            testFailed('unexpected pop state event state');
            break;            
    }
}
var jsTestIsAsync = true;
</script>
<script src="../../../resources/js-test-post.js"></script>
</html>
