<html manifest="resources/versioned-manifest.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.layoutTestController) {
    layoutTestController.dumpAsText();
    layoutTestController.waitUntilDone();
}

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

function modifyManifest()
{
    var req = new XMLHttpRequest;
    req.open("GET", "resources/versioned-manifest.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.layoutTestController)
        layoutTestController.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>
