<html>
<head>
<script>

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

// signal to testRunner when this reaches zero.
var testCount = 4;
// we first retrieve and store the number of rows already in our test database.
// our goal is to keep the number unchanged through the tests.
var initialRowCount = 0;
var database;
var successCallbackCalled;

function finishTest()
{
    if (--testCount)
        return;

    log("All Tests are complete.");

    if (window.testRunner)
        testRunner.notifyDone();
}

function successCallback()
{
    successCallbackCalled = true;
}

function verifySuccess(msg)
{
    database.transaction(function(tx)
    {
        tx.executeSql("SELECT count(*) AS count FROM ErrorCallbackTest", [], function(tx, rs)
        {
            log(msg + " : " + (rs.rows.item(0).count == initialRowCount && !successCallbackCalled ? "SUCCESS" : "FAILURE"));
            finishTest();
        });
    });
}

function failMidWay(errorCallback)
{
    successCallbackCalled = false;
    database.transaction(function(tx)
    {
        tx.executeSql("INSERT INTO ErrorCallbackTest(someValue) VALUES(?);", [ 1 ]);
        tx.executeSql("MUTTER SOMETHING ILLEGIBLE");
    }, errorCallback, successCallback);
}

function statementCallbackThrowsException(errorCallback)
{
    successCallbackCalled = false;
    database.transaction(function(tx)
    {
        tx.executeSql("INSERT INTO ErrorCallbackTest(someValue) VALUES(?);", [ 1 ], function()
        {
            throw {};
        });
    });
}

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

    database = openDatabase("ErrorCallbackDatabase", "1.0", "Test for error callback", 1);
    database.transaction(function(tx)
    {
        tx.executeSql("CREATE TABLE IF NOT EXISTS ErrorCallbackTest (someValue)", []);
        tx.executeSql("SELECT count(*) AS count FROM ErrorCallbackTest", [], function(tx, rs)
        {
            initialRowCount = rs.rows.item(0).count;
        });
    });

    failMidWay(function() { return true; });
    verifySuccess("Testing transaction failing mid-way and error callback returning true");
    failMidWay(function() { return false; });
    verifySuccess("Testing transaction failing mid-way and error callback return false");
    statementCallbackThrowsException(function() { return true; });
    verifySuccess("Testing statement callback throwing exception and error callback returning true");
    statementCallbackThrowsException(function() { return false; });
    verifySuccess("Testing statement callback throwing exception and error callback returning false");
}

</script>
</head>

<body onload="runTest()">
This test confirms that <code>SQLTransactionErrorCallback</code> is invoked correctly and regardless of its output, the transaction is always rolled back on failure.
<pre id="console">
</pre>
</body>

</html>
