<!-- webkit-test-runner [ enablePageCache=true ] -->
<!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();
    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>
