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

function setManifestDeleted(state)
{
    var req = new XMLHttpRequest;
    req.open("GET", "resources/fail-on-update-2.py?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.testRunner)
            testRunner.notifyDone();
    }
}

function resetManifest()
{
    if (applicationCache.status != applicationCache.UNCACHED && applicationCache.status != applicationCache.OBSOLETE) {
        timeoutId = setTimeout(resetManifest, 400);
        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, 400);

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

</html>
