<!-- webkit-test-runner [ enablePageCache=true ] -->
<!DOCTYPE html>
<html>
<body>
<script src="../../resources/js-test-pre.js"></script>
<script>
description("Tests that a page that has called window.open() goes into the page cache.");
window.jsTestIsAsync = true;

if (window.testRunner)
    testRunner.setCanOpenWindows();

window.addEventListener("pageshow", function(event) {
    if (!window.sessionStorage.didStartPageCacheAfterWindowOpenTest) {
        if (event.persisted)
            testFailed("page was restored from the page cache.");
        else
            testPassed("page was not restored from the page cache.");
        return;
    }

    delete window.sessionStorage.didStartPageCacheAfterWindowOpenTest;

    if (event.persisted)
        testPassed("page was restored from the page cache.");
    else
        testFailed("page was not restored from the page cache.");

    finishJSTest();
}, false);

window.addEventListener("pagehide", function(event) {
    if (event.persisted)
        testPassed("page was saved to the page cache.");
    else
        testFailed("page was not saved to the page cache.");
}, false);

window.addEventListener("load", function() {
    newWindow = open("about:blank");
    otherWindowDocument = newWindow.document;

    setTimeout(function() {
        // Force a back navigation back to this page.
        window.sessionStorage.didStartPageCacheAfterWindowOpenTest = true;
        window.location.href = "resources/page-cache-helper.html";
    }, 0);
}, false);

</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
