<!-- webkit-test-runner [ dumpJSConsoleLogInStdErr=true ] -->
<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>
