<!DOCTYPE html>
<html>
<head>
<title>Cache Storage: testing persistency</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
    <div id="check">
    </div>
    <script>
    promise_test(test => {
        return self.caches.keys().then(keys => {
            var pending = [];
            for (key of keys)
                pending.push(self.caches.delete(keys[0]));
            return Promise.all(pending);
        });
    }, "Cleaning existing caches");

    promise_test(test => {
        check.innerHTML = "<iframe id='cacheFrame' src='resources/cache-remove-twice-iframe.html'></iframe>";
        
        var cacheName = "test-remove-twice";
        return new Promise((resolve, reject) => {
            window.addEventListener("message", test.step_func((event) => {
                return Promise.all([self.caches.open(cacheName), cacheFrame.window.caches.open(cacheName) ]).then(() => {
                    return Promise.all([self.caches.delete(cacheName), cacheFrame.window.caches.delete(cacheName)]);
                }).then(resolve, reject);
	    }));
	});
    }, "Removing the same cache from two different documents");

   promise_test(test => {
        return self.caches.keys().then(keys => {
            var pending = [];
            for (key of keys)
                pending.push(self.caches.delete(keys[0]));
            return Promise.all(pending);
        });
    }, "Cleaning added caches");
    </script>
</body>
</html>

