1 <html> 2 <head> 3 <script> 4 5 function log(message) 6 { 7 document.body.innerHTML += message + "<br>"; 8 } 9 10 var complete = 0; 11 12 function checkCompletion() 13 { 14 // The test should end after two transactions 15 if (++complete == 2 && window.layoutTestController) 16 layoutTestController.notifyDone(); 17 } 18 19 // Opens the database used in this test case 20 function openTestDatabase() 21 { 22 return openDatabase("MultipleTransactionsOnDifferentHandlesTest", 23 "1.0", 24 "Test to make sure that queueing multiple transactions on different DB handles does not result in a deadlock.", 25 32768); 26 } 27 28 function statementSuccessCallback(dbName, statementType) 29 { 30 log(dbName + " " + statementType + " statement succeeded"); 31 } 32 33 function statementErrorCallback(dbName, statementType, error) 34 { 35 log(dbName + " " + statementType + " statement failed: " + error.message); 36 } 37 38 // Runs a transaction on the given database 39 function runTransaction(db, dbName, val) 40 { 41 db.transaction(function(tx) { 42 // Execute a read-only statement 43 tx.executeSql("SELECT COUNT(*) FROM Test;", [], 44 function(result) { statementSuccessCallback(dbName, "read"); }, 45 function(tx, error) { statementErrorCallback(dbName, "read", error); }); 46 47 // Execute a write statement to make sure SQLite tries to acquire an exclusive lock on the DB file 48 tx.executeSql("INSERT INTO Test VALUES (?);", [val], 49 function(result) { statementSuccessCallback(dbName, "write"); }, 50 function(tx, error) { statementErrorCallback(dbName, "write", error); }); 51 }, function(error) { 52 // Transaction failure callback 53 log(dbName + " transaction failed: " + error.message); 54 checkCompletion(); 55 }, function() { 56 // Transaction success callback 57 log(dbName + " transaction succeeded"); 58 checkCompletion(); 59 }); 60 } 61 62 // We need to guarantee that the Test table exists before we run our test. 63 // Therefore, the test code is in the successCallback of the transaction that creates the table. 64 function runTest() { 65 if (window.layoutTestController) { 66 layoutTestController.dumpAsText(); 67 layoutTestController.waitUntilDone(); 68 } 69 70 try { 71 var db = openTestDatabase(); 72 db.transaction(function(tx) { 73 // Create the Test table if it does not exist 74 tx.executeSql("CREATE TABLE IF NOT EXISTS Test (Foo int);", [], 75 function(result) {}, function(tx, error) {}); 76 }, function(error) { 77 log("Creating the Test table failed: " + error.message); 78 }, function() { 79 // The Test table was created successfully 80 var db1 = openTestDatabase(); 81 var db2 = openTestDatabase(); 82 if (db1 == db2) 83 log("failure: db1 == db2"); 84 else { 85 runTransaction(db1, "db1", 1); 86 runTransaction(db2, "db2", 2); 87 } 88 }); 89 } catch(err) {} 90 } 91 </script> 92 </head> 93 <body onload="runTest();"> 94 This is a test to see if queueing up multiple transactions on different handles to the same database results in a deadlock.<br> 95 </body> 96 </html> 97