<html manifest="resources/fail-on-update.php"> <p>Test that a 404 response for manifest results in cache removal.</p> <body> <ul> <li>Frame 1: Manifest is still available, so a new master resource is added to the cache. <li>Frame 2: Manifest loading results in 404 response, so the cache group becomes obsolete, and an obsolete event is dispatched (because the document in frame was associated with a cache in the group). <li>Frame 3: Manifest is still 404 - the document is never associated with a cache. <li>Frame 4: Manifest is now available, so the document gets associated with a cache in a newly created group; the obsolete cache group is not affected. </ul> <p>Should say SUCCESS:</p> <div id=result></div> <script> if (window.layoutTestController) { layoutTestController.dumpAsText(); layoutTestController.waitUntilDone(); } function log(message) { document.getElementById("result").innerHTML += message + "<br>"; } function setManifestDeleted(state) { var req = new XMLHttpRequest; req.open("GET", "resources/fail-on-update.php?command=" + (state ? "delete" : "reset"), false); req.send(null); } function test() { clearTimeout(timeoutId); // The frame will be associated to a cache, and its main resource will be added to the cache. var ifr = document.createElement("iframe"); ifr.setAttribute("src", "resources/remove-cache-frame.html"); document.body.appendChild(ifr); applicationCache.onnoupdate = test2; } function test2() { applicationCache.onnoupdate = function() { log("Unexpected noupdate event") } applicationCache.oncached = function() { log("Unexpected cached event") } setManifestDeleted(true); // The frame will be associated to a cache, but update will obsolete it. var ifr = document.createElement("iframe"); ifr.setAttribute("src", "resources/remove-cache-frame.html"); document.body.appendChild(ifr); applicationCache.onobsolete = test3; } function test3() { applicationCache.onchecking = function() { log("Unexpected checking event after obsolete event") } applicationCache.onupdateready = function() { log("Unexpected updateready event after obsolete event") } applicationCache.onerror = function() { log("Unexpected error event after obsolete event") } applicationCache.onnoupdate = function() { log("Unexpected noupdate event after obsolete event") } applicationCache.oncached = function() { log("Unexpected cached event after obsolete event") } // The frame will not be associated to a cache. var ifr = document.createElement("iframe"); ifr.setAttribute("src", "resources/remove-cache-frame.html"); document.body.appendChild(ifr); window.addEventListener("message", test4, false); } function test4() { setManifestDeleted(false); window.removeEventListener("message", test4, false); applicationCache.onupdateready = null; // The frame will be associated to a cache. var ifr = document.createElement("iframe"); ifr.setAttribute("src", "resources/remove-cache-frame-2.html"); document.body.appendChild(ifr); window.addEventListener("message", test5, false); } function test5() { log("SUCCESS"); if (window.layoutTestController) layoutTestController.notifyDone(); } function resetManifest() { if (applicationCache.status != applicationCache.UNCACHED && applicationCache.status != applicationCache.OBSOLETE) { timeoutId = setTimeout(resetManifest, 100); return; } setManifestDeleted(false); location.reload(); } applicationCache.onupdateready = function() { log("Unexpected updateready event") } applicationCache.onnoupdate = test; applicationCache.oncached = test; // If the manifest script happened to be in a wrong state, reset it. var timeoutId = setTimeout(resetManifest, 100); </script> </body> </html>