summaryrefslogtreecommitdiffstats
path: root/LayoutTests/storage/transaction-error-callback.html
diff options
context:
space:
mode:
Diffstat (limited to 'LayoutTests/storage/transaction-error-callback.html')
-rw-r--r--LayoutTests/storage/transaction-error-callback.html105
1 files changed, 105 insertions, 0 deletions
diff --git a/LayoutTests/storage/transaction-error-callback.html b/LayoutTests/storage/transaction-error-callback.html
new file mode 100644
index 0000000..90b2ed0
--- /dev/null
+++ b/LayoutTests/storage/transaction-error-callback.html
@@ -0,0 +1,105 @@
+<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>