<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?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?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>
