• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<script>
4
5function log(message)
6{
7    document.getElementById("console").innerHTML += message + "<br>";
8}
9
10// signal to layoutTestController when this reaches zero.
11var testCount = 4;
12// we first retrieve and store the number of rows already in our test database.
13// our goal is to keep the number unchanged through the tests.
14var initialRowCount = 0;
15var database;
16var successCallbackCalled;
17
18function finishTest()
19{
20    if (--testCount)
21        return;
22
23    log("All Tests are complete.");
24
25    if (window.layoutTestController)
26        layoutTestController.notifyDone();
27}
28
29function successCallback()
30{
31    successCallbackCalled = true;
32}
33
34function verifySuccess(msg)
35{
36    database.transaction(function(tx)
37    {
38        tx.executeSql("SELECT count(*) AS count FROM ErrorCallbackTest", [], function(tx, rs)
39        {
40            log(msg + " : " + (rs.rows.item(0).count == initialRowCount && !successCallbackCalled ? "SUCCESS" : "FAILURE"));
41            finishTest();
42        });
43    });
44}
45
46function failMidWay(errorCallback)
47{
48    successCallbackCalled = false;
49    database.transaction(function(tx)
50    {
51        tx.executeSql("INSERT INTO ErrorCallbackTest(someValue) VALUES(?);", [ 1 ]);
52        tx.executeSql("MUTTER SOMETHING ILLEGIBLE");
53    }, errorCallback, successCallback);
54}
55
56function statementCallbackThrowsException(errorCallback)
57{
58    successCallbackCalled = false;
59    database.transaction(function(tx)
60    {
61        tx.executeSql("INSERT INTO ErrorCallbackTest(someValue) VALUES(?);", [ 1 ], function()
62        {
63            throw {};
64        });
65    });
66}
67
68function runTest()
69{
70    if (window.layoutTestController) {
71        layoutTestController.clearAllDatabases();
72        layoutTestController.dumpAsText();
73        layoutTestController.waitUntilDone();
74    }
75
76    database = openDatabase("ErrorCallbackDatabase", "1.0", "Test for error callback", 1);
77    database.transaction(function(tx)
78    {
79        tx.executeSql("CREATE TABLE IF NOT EXISTS ErrorCallbackTest (someValue)", []);
80        tx.executeSql("SELECT count(*) AS count FROM ErrorCallbackTest", [], function(tx, rs)
81        {
82            initialRowCount = rs.rows.item(0).count;
83        });
84    });
85
86    failMidWay(function() { return true; });
87    verifySuccess("Testing transaction failing mid-way and error callback returning true");
88    failMidWay(function() { return false; });
89    verifySuccess("Testing transaction failing mid-way and error callback return false");
90    statementCallbackThrowsException(function() { return true; });
91    verifySuccess("Testing statement callback throwing exception and error callback returning true");
92    statementCallbackThrowsException(function() { return false; });
93    verifySuccess("Testing statement callback throwing exception and error callback returning false");
94}
95
96</script>
97</head>
98
99<body onload="runTest()">
100This test confirms that <code>SQLTransactionErrorCallback</code> is invoked correctly and regardless of its output, the transaction is always rolled back on failure.
101<pre id="console">
102</pre>
103</body>
104
105</html>
106