<!-- webkit-test-runner [ UsesBackForwardCache=true ] -->
<!DOCTYPE html>
<html>
<body>
<script src="../../resources/js-test.js"></script>
<script>
description('Tests that a page with an active fetch request is able to enter the back/forward cache.');
window.jsTestIsAsync = true;
let restoredFromCache = 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 back/forward cache");
        restoredFromCache = true;
    }
}, false);

window.addEventListener("pagehide", function(event) {
    debug("pagehide - " + (event.persisted ? "" : "not ") + "entering cache");
    if (!event.persisted) {
        testFailed("Page did not enter the back/forward cache.");
        finishJSTest();
    }
}, false);

var textData = JSON.stringify("This is the body");

function tryGetRequestBlob()
{
    blob = new Blob([textData], { "type" : "text/plain" });
    request = new Request("", {"method": "POST", "body": blob });
    request.text().then((_text) => {
        if (restoredFromCache) {
            testPassed("Promise resolved after restoring from the back/forward cache.");
            text = _text;
            shouldBeEqualToString("text", "" + textData);
            finishJSTest();
            return;
        }
        setTimeout(tryGetRequestBlob, 0);
    }, (e) => {
        setTimeout(tryGetRequestBlob, 0);
    });
}

window.addEventListener('load', function() {
    setTimeout(() => {
      tryGetRequestBlob();
      window.location.href = "resources/page-cache-helper.html";
    }, 0);
}, false);

</script>
</body>
</html>
