<html xmlns="http://www.w3.org/1999/xhtml"
      manifest="/resources/network-simulator.py?test=appcache-non-html&amp;path=/appcache/resources/non-html.manifest">
<head><title/></head>
<body>
<p>Test that non-HTML main resources work with application cache correctly.</p>
<p>Should say SUCCESS:</p>
<div id="result"></div>
<script type="text/javascript">
if (window.testRunner) {
    testRunner.dumpAsText()
    testRunner.waitUntilDone();
}

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

function setNetworkEnabled(state)
{
    var req = new XMLHttpRequest;
    req.open("GET", "/resources/network-simulator.py?test=appcache-non-html&amp;command=" + (state ? "connect" : "disconnect"), false);
    req.send("");
}

function createFrame()
{
    var ifr = document.createElement("iframe");
    ifr.setAttribute("src", "/resources/network-simulator.py?test=appcache-non-html&amp;path=/appcache/resources/abe.png");
    ifr.onload = frameCreated;
    document.body.appendChild(ifr);
}

function cached()
{
    var hadError = false;

    applicationCache.removeEventListener('noupdate', cached, false);
    applicationCache.removeEventListener('cached', cached, false);

    setNetworkEnabled(false);

    // Load a resource that does not exist in the cache.
    try {
        var req = new XMLHttpRequest();
        req.open("GET", "/resources/network-simulator.py?test=appcache-non-html&amp;path=/appcache/resources/not-in-cache.txt", false);
        req.send();
    } catch (e) {
        if (e.code == DOMException.NETWORK_ERR)
            hadError = true;
    }

    if (!hadError) {
        document.getElementById('result').innerHTML = "FAILURE: Did not get the right exception"
        return;
    }
   
    // Load a resource that exists in the cache.
    try {
        var req = new XMLHttpRequest();
        req.open("GET", "/resources/network-simulator.py?test=appcache-non-html&amp;path=/appcache/resources/simple.txt", false);
        req.send();
    } catch (e) {
        document.getElementById('result').innerHTML = "FAILURE: Could not load data from cache"
        return;
    }
        
    if (req.responseText != 'Hello, World!') {
        document.getElementById('result').innerHTML = "FAILURE: Did not get correct data from cached resource"
        return;
    }

    createFrame();
}

function frameCreated()
{
    setNetworkEnabled(true);
    
    if (frames[0].document.documentElement.innerHTML.match(/abe\.png/))
        log("SUCCESS")
    else
        log("FAIL: Frame.onload was called, but the image doesn't seem to be loaded.");
    
    if (window.testRunner) {
        applicationCache.onerror = null;
        testRunner.notifyDone();
    }
}

function error()
{
    // The simulator was in a wrong state, reset it.
    setNetworkEnabled(true);
    window.location.reload();
}

applicationCache.addEventListener('cached', cached, false);
applicationCache.addEventListener('noupdate', cached, false);

applicationCache.onerror = error;

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