<html>
<head>
<script>

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

function GC()
{
    // Force GC.
    if (window.GCController)
        GCController.collect();
    else {
        for (var i = 0; i < 10000; ++i) {
            ({ });
        }
    }
}

// Variable for the database that will never be forgotten
var persistentDB = 0;
// Variable for the forgotten database
var forgottenDB = 0;

var completed = 0;
function checkCompletion()
{
    if (++completed == 2 && window.layoutTestController)
        layoutTestController.notifyDone();
}

function runTest()
{
    if (window.layoutTestController) {
        layoutTestController.dumpAsText();
        layoutTestController.waitUntilDone();
    }
    
    persistentDB = openDatabase("MultipleDatabasesTest1", "1.0", "Test one out of a set of databases being destroyed (1)", 32768);
    forgottenDB = openDatabase("MultipleDatabasesTest2", "1.0", "Test one out of a set of databases being destroyed (2)", 32768);

    persistentDB.transaction(function(tx) {
        tx.executeSql("CREATE TABLE IF NOT EXISTS DataTest (randomData)", [], function(tx, result) { 
            for (var i = 0; i < 25; ++i)
                tx.executeSql("INSERT INTO DataTest (randomData) VALUES (1)", []);
        }); 
    }, function(err) {
        log("Persistent Database Transaction Errored - " + err);
        checkCompletion();
    }, function() {
        log("Persistent Database Transaction Complete");
        checkCompletion();
    });

    forgottenDB.transaction(function(tx) {
        tx.executeSql("CREATE TABLE IF NOT EXISTS EmptyTable (unimportantData)", []);
    }, function(err) {
        log("Forgotten Database Transaction Errored - " + err);
        forgottenDB = 0;
        GC();
        checkCompletion();
    }, function() {
        log("Forgotten Database Transaction Complete");
        forgottenDB = 0;
        GC();
        checkCompletion();
    });
}

</script>
<body onload="runTest();">
This test opens two databases, queues up a series of operations on both, then "forgets" about one of them.
After forcing GC, resources associated with that database should be freed gracefully.<br>
</body>
</html>
