<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.py?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.py?test=appcache-fallback&path=/appcache/resources/not-in-cache.txt";
var nonexistentURL = "resources/does-not-exist";
var redirectURL = "resources/fallback-redirect.py";

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>
