<html>
<head>
<script>

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

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

var txCallbackCount = 0;
var NUMBER_OF_TRANSACTIONS = 10;
var database;

function runTransaction(expectedToFail, statementErrorCallback)
{
    database.transaction(function(tx) {
        tx.executeSql("CREATE TABLE IF NOT EXISTS TestTable (RandomData TEXT)");
        tx.executeSql("INSERT INTO TestTable VALUES (?)", ['test']);
        tx.executeSql("THIS STATEMENT WILL FAIL", [],
            function(tx, data) {
                log("FAIL - this statement should have failed");
                finishTest();
            }, statementErrorCallback);
        tx.executeSql("INSERT INTO TestTable VALUES (?)", ['test1'],
            function(error) {
                if (expectedToFail)
                    log("FAIL - This statement should not have been executed");
            }, function() {
                if (expectedToFail)
                    log("FAIL - This statement should not have been executed");
            });
    }, function(error) {
        if (expectedToFail)
            log("PASS - the transaction error callback was invoked.");
        else
            log("FAIL - the transaction error callback should not have been invoked.");
        if (++txCallbackCount == NUMBER_OF_TRANSACTIONS)
            finishTest();
    }, function() {
        if (expectedToFail)
            log("FAIL - the transaction success callback should not have been invoked.");
        else
            log("PASS - the transaction success callback was invoked.");
        if (++txCallbackCount == NUMBER_OF_TRANSACTIONS)
            finishTest();
    });
}

function runTest()
{
    if (window.layoutTestController) {
        layoutTestController.clearAllDatabases();
        layoutTestController.dumpAsText();
        layoutTestController.waitUntilDone();
    }

    database = openDatabase("StatementErrorCallbackTest", "1.0", "statement error callback test", 1024);

    runTransaction(true, function(error) { return true; });
    runTransaction(true, function(error) { throw "Exception in statement error callback"; return false; });
    runTransaction(true, function(error) { return "some string"; });
    runTransaction(true, function(error) { return 1234; });
    runTransaction(true, function(error) { return {a: 2, b: "abc"}; });
    runTransaction(true, function(error) { return "false"; });
    runTransaction(false, function(error) {});
    runTransaction(false, function(error) { return false; });
    runTransaction(false, function(error) { return 0; });
    runTransaction(false, function(error) { return null; });
}

</script>
</head>

<body onload="runTest()">
This test confirms that a transaction is immediately rolled back if and only if a statement's error callback throws an exception, returns true, or doesn't return any value.
<pre id="console">
</pre>
</body>

</html>
