<html manifest="resources/multi-fallback.manifest">
<body>
<p>Test application cache fallback entries with multiple candidates.</p>
<p>Should say SUCCESS:</p>
<div id=result></div>

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

var hadError = false;

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

function setNetworkEnabled(state)
{
    try {
        var req = new XMLHttpRequest;
        req.open("GET", "/resources/network-simulator.php?test=appcache-multi-fallback&command=" + (state ? "connect" : "disconnect"), false);
        req.send("");
    } catch (ex) {
        log("Cannot access network simulator URL, ex = " + ex);
        hadError = true;
    }
}

function load(url)
{
    try {
        var req = new XMLHttpRequest();
        req.open("GET", url, false);
        req.send("");
        return req.responseText;
    } catch (ex) {
        log("FAIL: Cannot load " + url + ", ex = " + ex);
        hadError = true;
        return ""; // This value should not be expected as the responseText for a url presented to this function.
    }
}

var nonexistentURL = "resources/does-not-exist";

function test()
{
    applicationCache.onnoupdate = function() { log("FAIL: received unexpected noupdate event") }
    applicationCache.oncached = function() { log("FAIL: received unexpected cached event") }

    setNetworkEnabled(true);

    if (load(nonexistentURL) != "Hello, World!") {
        log("FAIL: The longest fallback namespace wasn't used for a 404 response");
        hadError = true;
    }

    log(hadError ? "FAILURE" : "SUCCESS");
    if (window.testRunner)
        testRunner.notifyDone();
}

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") }

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