<html manifest="resources/fallback.manifest">
<body>
<p>Test application cache fallback entries.</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-fallback&command=" + (state ? "connect" : "disconnect"), false);
        req.send("");
    } catch (ex) {
        log("Cannot access network simulator URL");
        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 testURL = "/resources/network-simulator.php?test=appcache-fallback&path=/appcache/resources/not-in-cache.txt";
var nonexistentURL = "resources/does-not-exist";
var redirectURL = "resources/fallback-redirect.php";

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

    if (!/not in the cache/.test(load(testURL))) {
        log("FAIL: Cannot load an URL from fallback namespace when network is enabled");
        hadError = true;
    }

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

    if (load(redirectURL) != "Hello, World!") {
        log("FAIL: Fallback resource wasn't used for a redirect to a resource with another origin");
        hadError = true;
    }

    test2();
}

function test2()
{
    var req = new XMLHttpRequest;
    req.open("GET", nonexistentURL);
    req.onerror = function() {
        log("FAIL: Fallback resource wasn't used for a 404 response (async)");
        hadError = true;
        test3();
    }
    req.onload = function() {
        if (req.responseText != "Hello, World!") {
            log("FAIL: Unexpected result for a 404 response (async)");
            hadError = true;
        }
        test3();
    }

    req.send("");
}

function test3()
{
    var req = new XMLHttpRequest;
    req.open("GET", redirectURL);
    req.onerror = function() {
        log("FAIL: Fallback resource wasn't used for a redirect to a resource with another origin (async)");
        hadError = true;
        test4();
    }
    req.onload = function() {
        if (req.responseText != "Hello, World!") {
            log("FAIL: Unexpected result for a redirect response (async)");
            hadError = true;
        }
        test4();
    }

    req.send("");
}

function test4()
{
    // Try loading a fallback resource as main one.

    applicationCache.onnoupdate = test5;

    var ifr = document.createElement("iframe");
    ifr.setAttribute("src", nonexistentURL);
    document.body.appendChild(ifr);
}

function test5()
{
    if (!/Hello, World/.test(window.frames[0].document.documentElement.innerHTML)) {
        log("FAIL: Fallback URL was not honored for main resource");
        hadError = true;
    }
    test6();
}

function test6()
{
    setNetworkEnabled(false);

    if (load(testURL) != load("resources/simple.txt")) {
        log("FAIL: Loading an URL from fallback namespace when network is disabled returned unexpected 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>
