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

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