<!-- webkit-test-runner [ enableBackForwardCache=true ] -->
<!DOCTYPE html>
<html>
<head>
<script src="/js-test-resources/js-test.js"></script>
</head>
<body>
<script>
description('Tests that a page with pending DOMCacheStorage 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;
    }
});

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

    const 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('test').then(() => {
       clearTimeout(handle1);
       testPassed("Opened the cache");
       shouldBeTrue("!!restoredFromPageCache");
       finishJSTest();
    }, () => {
       testFailed("Failed to open the cache");
       finishJSTest();
    });
});

onload = () => {
    setTimeout(() => {
        testLink.click();
    }, 0);
}
</script>
<a id="testLink" href="../navigation/resources/page-cache-helper.html" style="display: none">Link</a>
</body>
</html>
