<html>
<head>
<script>
var database;

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

function finishTest()
{
    log("Test part 1 Complete");
    if (window.layoutTestController)
        layoutTestController.notifyDone();
}

function errorFunction(tx, error)
{
    log("Test failed - " + error.message);
    finishTest();
}

function addData(db)
{
    db.transaction(function(tx) { 
        log("Inserting some data");
        // Insert a large amount of data that will take a little while to run. Schedule a timout to run that will load a new page
        // whilst the transaction is still in progress, interrupting the transaction. This should not leave the database locked and on
        // the next page we should be able to insert some more data.
        tx.executeSql("INSERT INTO DataTest (testData) VALUES (randomBlob(524200 ))", [], function(tx, result) { }, errorFunction);
        location.href = "./resources/database-lock-after-reload-2.html";
    }, errorFunction, function() { 
        finishTest();
    });
}

function runTest()
{
    if (window.layoutTestController) {
        layoutTestController.clearAllDatabases();
        layoutTestController.dumpAsText();
        layoutTestController.waitUntilDone();
    }
    
    try {
        database = openDatabase("DatabaseLockTest", "1.0", "Test for database locking", 5242880);
    } catch (e) {
        log("Error - could not open database");
        finishTest();
    }
    
    database.transaction(function(tx) {
        log("Adding a table");
        tx.executeSql("CREATE TABLE DataTest (testData)", [], function(tx, result) { }, errorFunction); 
    }, errorFunction, function() { 
        addData(database); 
    });
}

</script>
</head>

<body onload="runTest()">
<pre id="console">
</pre>
</body>

</html>
