<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>