blob: 1e1c7bf5a1ed05aba70eb07ef9424e9ead11af2e [file] [log] [blame]
if (this.importScripts) {
importScripts('../../../resources/js-test.js');
importScripts('shared.js');
}
description("Check that transactions in different databases can run in parallel.");
function test()
{
removeVendorPrefixes();
setDBNameFromPath();
evalAndLog("dbname1 = dbname + '1'");
evalAndLog("dbname2 = dbname + '2'");
deleteDatabase1();
}
function deleteDatabase1()
{
preamble();
request = evalAndLog("indexedDB.deleteDatabase(dbname1)");
request.onerror = unexpectedBlockedCallback;
request.onblocked = unexpectedBlockedCallback;
request.onsuccess = deleteDatabase2;
}
function deleteDatabase2()
{
preamble();
request = evalAndLog("indexedDB.deleteDatabase(dbname2)");
request.onerror = unexpectedBlockedCallback;
request.onblocked = unexpectedBlockedCallback;
request.onsuccess = openDatabase1;
}
function openDatabase1()
{
preamble();
request = evalAndLog("indexedDB.open(dbname1, 1)");
request.onerror = unexpectedBlockedCallback;
request.onblocked = unexpectedBlockedCallback;
request.onupgradeneeded = function openOnUpgradeNeeded1(evt) {
preamble(evt);
evalAndLog("db1 = event.target.result");
evalAndLog("store1 = db1.createObjectStore('store')");
evalAndLog("store1.put(0, 0)");
};
request.onsuccess = function openOnSuccess1(evt) {
preamble(evt);
evalAndLog("db1 = event.target.result");
openDatabase2();
};
}
function openDatabase2()
{
preamble();
request = evalAndLog("indexedDB.open(dbname2, 1)");
request.onerror = unexpectedBlockedCallback;
request.onblocked = unexpectedBlockedCallback;
request.onupgradeneeded = function onUpgradeNeeded2(evt) {
preamble(evt);
evalAndLog("db2 = event.target.result");
evalAndLog("store2 = db2.createObjectStore('store')");
};
request.onsuccess = function openOnSuccess2(evt) {
preamble(evt);
evalAndLog("db2 = event.target.result");
startWork();
};
}
function startWork()
{
preamble();
evalAndLog("transaction1 = db1.transaction('store', 'readwrite')");
transaction1.onabort = unexpectedAbortCallback;
transaction1.oncomplete = onTransactionComplete;
evalAndLog("transaction2 = db2.transaction('store', 'readwrite')");
transaction1.onabort = unexpectedAbortCallback;
transaction2.oncomplete = onTransactionComplete;
evalAndLog("transaction1PutSuccess = false");
evalAndLog("transaction2PutSuccess = false");
debug("Keep both transactions alive until each has reported at least one successful operation");
function doTransaction1Put() {
// NOTE: No logging since execution order is not deterministic.
request = transaction1.objectStore('store').put(0, 0);
request.onerror = unexpectedErrorCallback;
request.onsuccess = function() {
transaction1PutSuccess = true;
if (!transaction2PutSuccess)
doTransaction1Put();
};
}
function doTransaction2Put() {
// NOTE: No logging since execution order is not deterministic.
request = transaction2.objectStore('store').put(0, 0);
request.onerror = unexpectedErrorCallback;
request.onsuccess = function() {
transaction2PutSuccess = true;
if (!transaction1PutSuccess)
doTransaction2Put();
};
}
doTransaction1Put();
doTransaction2Put();
}
transactionCompletionCount = 0;
function onTransactionComplete(evt)
{
preamble(evt);
++transactionCompletionCount;
if (transactionCompletionCount < 2) {
debug("first transaction complete, still waiting...");
return;
}
shouldBeTrue("transaction1PutSuccess");
shouldBeTrue("transaction2PutSuccess");
evalAndLog("db1.close()");
evalAndLog("db2.close()");
finishJSTest();
}
test();