<html manifest="resources/subframes-2.manifest">
<body>
<p>Test that a subframe without manifest gets picked by a relevant application cache that
contains its resource.</p>
<p>Should say SUCCESS:</p>
<div id=result></div>

<script>
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

function log(message)
{
    document.getElementById("result").innerHTML += message + "<br>";
}

function debug(message)
{
    // If running manually in the browser, print the sequence of events.
    if (!window.testRunner)
        log(message);
}

var receivedExpectedMessage = false;
var receivedCheckingEvent = false;
var receivedNoupdateEvent = false;

function checkDone()
{
    if (receivedExpectedMessage && receivedCheckingEvent && receivedNoupdateEvent) {
        log("SUCCESS");
        if (window.testRunner)
            testRunner.notifyDone();
    }
}

function test()
{
    applicationCache.onnoupdate = null;
    applicationCache.oncached = null;

    // When a new main resource is associated with the cache, an update should be started.
    applicationCache.onchecking = function() { debug("checking"); receivedCheckingEvent = true; checkDone();  }
    applicationCache.onnoupdate = function() { debug("noupdate"); receivedNoupdateEvent = true; checkDone();  }

    var ifr = document.createElement("iframe");
    ifr.setAttribute("src", "resources/subframe-2.html");
    document.body.appendChild(ifr);
}

applicationCache.onnoupdate = function() { test() }
applicationCache.oncached = function() { test() }

applicationCache.onupdateready = function() { log("FAIL: received unexpected updateready event") }
applicationCache.onerror = function() { log("FAIL: received unexpected error event") }

window.addEventListener("message", function() { debug("message"); receivedExpectedMessage = true; checkDone(); }, false);

</script>
</body>
</html>
