<!DOCTYPE html>
<html>
<head>
<title>Cache Storage: testing Cache persistency</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
    <script>
function compareClientOrigins(a, b)
{
    if (a.origin.clientOrigin < b.clientOrigin)
        return 1;
    if (a.origin.clientOrigin > b.origin.clientOrigin)
        return -1;
    return 0;
}

promise_test(() => {
    if (!window.internals || !window.testRunner)
        return Promise.reject("Test requires internals and test runner");

    return new Promise((resolve, reject) => {
        var counter = 0;
        window.addEventListener("message", async (event) => {
            var representation = JSON.parse(await internals.cacheStorageEngineRepresentation()).origins;
            test(() => {
                representation.sort(compareClientOrigins);
                var cache = representation[0].origin.clientOrigin === "https://localhost:8443"
                assert_equals(representation[0].origin.topOrigin, "https://127.0.0.1:8443", "top origin of cache 1");
                assert_equals(representation[0].origin.clientOrigin, "https://localhost:8443", "client origin of cache 1");
                assert_array_equals(representation[0].caches.persistent, ["cache1"]);
            }, "Validating cache representation before clearing");

            testRunner.clearDOMCache('https://localhost:8443');

            representation = JSON.parse(await internals.cacheStorageEngineRepresentation()).origins;
            test(() => {
                representation.sort(compareClientOrigins);
                assert_equals(representation[0].origin.topOrigin, "https://127.0.0.1:8443", "top origin of cache 1");
                assert_equals(representation[0].origin.clientOrigin, "https://localhost:8443", "client origin of cache 1");
                assert_array_equals(representation[0].caches.persistent, []);
            }, "Validating cache representation after clearing");
            resolve();
        });
    })
}, "Create a cache storage from localhost and clear it");

promise_test(async test => {
    var cache = await self.caches.open("test-cache-records-persistency");
    await cache.put("https://example.com/foo", new Response("body", { statusText: "status" }));

    if (!window.testRunner)
        return Promise.reject("test runner needed");

    assert_false(testRunner.hasDOMCache('https://localhost:80'), 'hasDOMCache with fake origin');
    assert_true(testRunner.hasDOMCache(window.location.origin), "hasDOMCache with actual origin");

    testRunner.clearDOMCache('https://localhost:80');

    var keys = await self.caches.keys();
    assert_not_equals(keys.length, 0, "keys should not be empty");
    assert_true(testRunner.domCacheSize(window.location.origin) > 0, "Actual origin cache size is not zero");

    testRunner.clearDOMCache(window.location.origin);
    assert_false(testRunner.hasDOMCache(window.location.origin), "Actual origin cache is cleared");
    assert_equals(testRunner.domCacheSize(window.location.origin), 0, "Actual origin cache size is zero");

    keys = await self.caches.keys();
    assert_equals(keys.length, 0, "keys should be empty");

    cache = await self.caches.open("test-cache-records-persistency");
    keys = await cache.keys();
    assert_equals(keys.length, 0, "records should be empty");
}, 'Clearing disk cache of a given origin');
    </script>
    <iframe src="https://localhost:8443/cache-storage/resources/cache-persistency-iframe.html#name=cache1"></iframe>
</body>
</html>
