<!-- webkit-test-runner [ enableBackForwardCache=true ] -->
<!DOCTYPE html>
<html>
<body>
<script src="/resources/js-test-pre.js"></script>
<script>
description("A frame in provisional load stage should prevent page caching.");
window.jsTestIsAsync = true;

if (window.testRunner) {
    if (testRunner.setShouldDecideNavigationPolicyAfterDelay)
          testRunner.setShouldDecideNavigationPolicyAfterDelay(true);
}

window.addEventListener("pageshow", function(event) {
    debug("pageshow - " + (event.persisted ? "" : "not ") + "from cache");

    if (!window.sessionStorage.page_cache_provisional_load_test_started)
        return;

    delete window.sessionStorage.page_cache_provisional_load_test_started;

    if (event.persisted)
        testFailed("Page was restored from PageCache");
    else
        testPassed("Page was not restored from PageCache");

    finishJSTest();
}, false);

window.addEventListener("pagehide", function(event) {
    testFailed("pagehide - Page went into PageCache");
}, false);

function loadSubframeAndNavigateAway()
{
    window.sessionStorage.page_cache_provisional_load_test_started = true;

    // Force a back navigation back to this page after the subframe starts provisional navigation.
    var testFrame = document.getElementById("testFrame");
    testFrame.onbeforeunload = function() {
        setTimeout(function() {
            window.location.href = "resources/page-cache-helper.html";
        }, 0);
    };
    testFrame.src = "http://127.0.0.1:8000/navigation/resources/slow-resource.pl?delay=3000";
}

window.addEventListener('load', loadSubframeAndNavigateAway, false);

</script>
<iframe id="testFrame" src="about:blank"></iframe>
<script src="/resources/js-test-post.js"></script>
</body>
</html>
