<html manifest="resources/fail-on-update-2.php">
<script>
if (window.layoutTestController) {
    layoutTestController.dumpAsText();
    layoutTestController.waitUntilDone();
}

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

    setManifestDeleted(true);
    applicationCache.update();
    
    // Create two subframes at different times to make hitting the race condition more likely.
    var ifr = document.createElement("iframe");
    ifr.setAttribute("src", 'resources/fail-on-update-2.html');
    document.body.appendChild(ifr);

    setTimeout(function() {
        var ifr = document.createElement("iframe");
        ifr.setAttribute("src", 'resources/fail-on-update-2.html');
        document.body.appendChild(ifr);
    }, 0);
}

var subframesLeft = 2;
function subframeLoaded()
{
    if (!--subframesLeft) {
        document.write('<p>SUCCESS: No crash.</p>');
        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.addEventListener('noupdate', function() { setTimeout(test, 0) }, false);
applicationCache.addEventListener('cached', function() { setTimeout(test, 0) }, false);

// If the manifest script happened to be in a wrong state, reset it.
var timeoutId = setTimeout(resetManifest, 100);

</script>
<p>Test for a particular incorrect assertion failure.</p>

</html>
