<html manifest="resources/update-cache.php">
<body>
<p>Test a simple offline application self-update process. Should print a series of messages followed with DONE:</p>
<div id=result></div>

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

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

function modifyManifest()
{
    var req = new XMLHttpRequest;
    req.open("GET", "resources/update-cache.php?command=step", false);
    req.send(false);
}

function test()
{
    modifyManifest();

    applicationCache.oncached = function() { log("FAIL: Unexpected cached event") }
    applicationCache.onnoupdate = function() { log("FAIL: Unexpected noupdate event") }
    applicationCache.onupdateready = function() { setTimeout(test2, 0) }

    log("Updating cache group...");
    setTimeout("applicationCache.update()", 0);
}

function test2()
{
    log((applicationCache.status == applicationCache.UPDATEREADY) ? "Cache status is UPDATEREADY" : ("FAIL: Incorrect cache status, " + applicationCache.status));

    modifyManifest();
    applicationCache.onupdateready = function() { setTimeout(test3, 0) }

    log("Updating cache group once more...");
    setTimeout("applicationCache.update()", 0);
}

function test3()
{
    log((applicationCache.status == applicationCache.UPDATEREADY) ? "Cache status is UPDATEREADY" : ("FAIL: Incorrect cache status, " + applicationCache.status));

    log("Associating document with the newest cache version...");
    applicationCache.swapCache();

    log((applicationCache.status == applicationCache.IDLE) ? "Cache status is IDLE" : ("FAIL: Incorrect cache status, " + applicationCache.status));

    log("DONE");
    if (window.testRunner)
        testRunner.notifyDone();
}

applicationCache.oncached = test;
applicationCache.onnoupdate = test;
applicationCache.onupdateready = function() { log("FAIL: Unexpected updateready event") }
applicationCache.onerror = function() { log("FAIL: Unexpected error event") }
applicationCache.onobsolete = function() { log("FAIL: Unexpected obsolete event") }

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