function terminateTest() { if (window.layoutTestController) layoutTestController.notifyDone(); } function openTestDatabase() { return openDatabaseWithSuffix("ReadAndWriteTransactionsDontRunTogetherTest", "1.0", "Test to make sure that read and write transactions on different DB handles to the same DB don't run at the same time.", 32768); } var readTransactionsInProgress = 0; var writeTransactionsInProgress = 0; var totalTransactions = 0; var finishedTransactions = 0; function runTransaction(db, readOnly) { var transactionFunction = (readOnly ? db.readTransaction : db.transaction); transactionFunction.call(db, function(tx) { if (readOnly) { if (writeTransactionsInProgress != 0) { log("Read transaction starting while write transaction in progress."); terminateTest(); } readTransactionsInProgress++; } else { if ((readTransactionsInProgress != 0) || (writeTransactionsInProgress != 0)) { log("Write transaction starting while another transaction in progress."); terminateTest(); } writeTransactionsInProgress++; } tx.executeSql("SELECT * FROM Test;"); }, function(error) { log((readOnly ? "Read" : "Write") + " transaction failed: " + error.message); terminateTest(); }, function() { finishedTransactions++; if (readOnly) readTransactionsInProgress--; else writeTransactionsInProgress--; log("Transaction successful."); if ((finishedTransactions == totalTransactions) && (readTransactionsInProgress == 0) && (writeTransactionsInProgress == 0)) terminateTest(); }); } function runReadAndWriteTransactions(db1, db2, db3) { totalTransactions = 10; finishedTransactions = 0; runTransaction(db1, true); runTransaction(db2, true); runTransaction(db1, false); runTransaction(db1, true); runTransaction(db2, true); runTransaction(db3, true); runTransaction(db1, false); runTransaction(db2, false); runTransaction(db1, true); runTransaction(db3, true); } function runTest() { var db1 = openTestDatabase(); var db2 = openTestDatabase(); var db3 = openTestDatabase(); db1.transaction(function(tx) { tx.executeSql("CREATE TABLE IF NOT EXISTS Test (Foo int);"); }, function(error) { log("Cannot create the Test table: " + error.message); terminateTest(); }, function() { runReadAndWriteTransactions(db1, db2, db3); }); }