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

var restoredFromPageCache = false;

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

    if (event.persisted) {
        testPassed("Page did enter and was restored from the page cache");
        restoredFromPageCache = true;
    }
}, false);

window.addEventListener("pagehide", function(event) {
    debug("pagehide - " + (event.persisted ? "" : "not ") + "entering cache");
    if (!event.persisted) {
        testFailed("Page did not enter the page cache.");
        finishJSTest();
    }
    xhr = new XMLHttpRequest();
    xhr.onload = xhrLoaded;
    xhr.onabort = xhrAbort;
    xhr.onerror = xhrError;
    // Slow loading XHR (3-second stall).
    xhr.open("GET", "/resources/load-and-stall.cgi?name=load-and-stall.cgi&stallFor=3&stallAt=0&mimeType=text/plain", true);
    xhr.send();
}, false);

function xhrLoaded()
{
    testFailed("The XMLHttpRequest should not haved loaded");
    finishJSTest();
}

function xhrAbort() {
    testFailed("Executed the XHR abort handler unexpectedly");
    finishJSTest();
}

function xhrError() {
    if (restoredFromPageCache)
    	testPassed("Executed the XHR error handler after restoring from PageCache");
    else
        testFailed("Executed the XHR error handler before entering PageCache");
    shouldBe("xhr.status", "0");
    finishJSTest();
}

window.addEventListener('load', function() {
    // This needs to happen in a setTimeout because a navigation inside the onload handler would
    // not create a history entry.
    setTimeout(function() {
      // Force a back navigation back to this page.
      window.location.href = "resources/page-cache-helper.html";
    }, 0);
}, false);

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