var complete = 0; function checkCompletion() { // The test should end after two transactions if (++complete == 2 && window.layoutTestController) layoutTestController.notifyDone(); } // Opens the database used in this test case function openTestDatabase() { return openDatabaseWithSuffix("MultipleTransactionsOnDifferentHandlesTest", "1.0", "Test to make sure that queueing multiple transactions on different DB handles does not result in a deadlock.", 32768); } function statementSuccessCallback(dbName, statementType) { log(dbName + " " + statementType + " statement succeeded"); } function statementErrorCallback(dbName, statementType, error) { log(dbName + " " + statementType + " statement failed: " + error.message); } // Runs a transaction on the given database function runTransaction(db, dbName, val) { db.transaction(function(tx) { // Execute a read-only statement tx.executeSql("SELECT COUNT(*) FROM Test;", [], function(result) { statementSuccessCallback(dbName, "read"); }, function(tx, error) { statementErrorCallback(dbName, "read", error); }); // Execute a write statement to make sure SQLite tries to acquire an exclusive lock on the DB file tx.executeSql("INSERT INTO Test VALUES (?);", [val], function(result) { statementSuccessCallback(dbName, "write"); }, function(tx, error) { statementErrorCallback(dbName, "write", error); }); }, function(error) { // Transaction failure callback log(dbName + " transaction failed: " + error.message); checkCompletion(); }, function() { // Transaction success callback log(dbName + " transaction succeeded"); checkCompletion(); }); } // We need to guarantee that the Test table exists before we run our test. // Therefore, the test code is in the successCallback of the transaction that creates the table. function runTest() { try { var db = openTestDatabase(); db.transaction(function(tx) { // Create the Test table if it does not exist tx.executeSql("CREATE TABLE IF NOT EXISTS Test (Foo int);", [], function(result) {}, function(tx, error) {}); }, function(error) { log("Creating the Test table failed: " + error.message); }, function() { // The Test table was created successfully var db1 = openTestDatabase(); var db2 = openTestDatabase(); if (db1 == db2) log("failure: db1 == db2"); else { runTransaction(db1, "db1", 1); runTransaction(db2, "db2", 2); } }); } catch(err) {} }