<!-- webkit-test-runner [ UsesBackForwardCache=true ] -->
<!DOCTYPE html>
<html>
<head>
<script src="/js-test-resources/js-test.js"></script>
</head>
<body>
<script>
description('Tests that a page with pending DOMCache activity goes into the page cache.');
jsTestIsAsync = true;
let restoredFromPageCache = false;

window.addEventListener("pageshow", function(event) {
    debug("pageshow - " + (event.persisted ? "" : "not ") + "from cache");
    if (event.persisted) {
        testPassed("Page was restored from Page Cache");
        restoredFromPageCache = true;
        handle2 = setTimeout(() => {
            testFailed("Page restored from cache but the promise was not resolved.");
            finishJSTest();
        }, 20000);
    }
});

function tryCache()
{
    cache.add('../navigation/resources/blank.txt').then(() => {
        if (!restoredFromPageCache) {
            setTimeout(tryCache, 0);
            return;
        }
        testPassed("Cache.add() succeeded after restoring from the cache");
        clearTimeout(handle2);
        finishJSTest();
    }, (e) => {
        setTimeout(tryCache, 0);
    });
}

window.addEventListener("pagehide", function(event) {
    debug("pagehide - " + (event.persisted ? "" : "not ") + "entering cache");
    if (!event.persisted) {
        testFailed("Page failed to enter the Page Cache");
        finishJSTest();
    }

    tryCache();
});

onload = () => {
    if (window.testRunner)
        testRunner.clearDOMCaches();

    setTimeout(() => {
        handle1 = setTimeout(async () => {
            testFailed("Timed out while waiting for the cache to open");
            if (window.internals)
                console.log(await internals.cacheStorageEngineRepresentation());
            finishJSTest();
        }, 20000);
        caches.open('page-cache-test').then((_cache) => {
            clearTimeout(handle1);
            cache = _cache;
            testLink.click();
        }, (e) => {
            testFailed("Failed to open the cache: " + e);
            finishJSTest();
        });
    }, 0);
}
</script>
<a id="testLink" href="../navigation/resources/page-cache-helper.html" style="display: none">Link</a>
</body>
</html>
