<html> <head> <script> function log(message) { document.getElementById("console").innerHTML += message + "<br>"; } // signal to layoutTestController 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.layoutTestController) layoutTestController.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.layoutTestController) { layoutTestController.clearAllDatabases(); layoutTestController.dumpAsText(); layoutTestController.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>