<html manifest="resources/subframes-3.manifest">
<body>
<p>Test that a subframe with manifest that matches top frame manifest works correctly.</p>
<p>In this case, the subframe resource is NOT listed in manifest explicitly.</p>
<p>Should say SUCCESS:</p>
<div id=result></div>

<script>
if (window.layoutTestController) {
    layoutTestController.dumpAsText();
    layoutTestController.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.layoutTestController)
        log(message);
}

var receivedExpectedMessage = false;
var receivedCheckingEventsCounter = 0;
var receivedNoupdateEventsCounter = 0;

function checkDone()
{
    if (receivedExpectedMessage && receivedCheckingEventsCounter == 2 && receivedNoupdateEventsCounter == 2) {
        log("SUCCESS");
        if (window.layoutTestController)
            layoutTestController.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"); receivedCheckingEventsCounter++; checkDone() }
    applicationCache.onnoupdate = function() { debug("noupdate"); receivedNoupdateEventsCounter++; checkDone();  }

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

function test2()
{
    window.removeEventListener("message", test2, false);
    window.addEventListener("message", test3, false);

    // Add an identical frame, to test that loading its resources from appcache works.
    var ifr = document.createElement("iframe");
    ifr.setAttribute("src", "resources/subframe-3.html");
    document.body.appendChild(ifr);
}

function test3()
{
    debug("message");
    receivedExpectedMessage = true;
    checkDone();
}

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", test2, false);

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