123 lines
3.6 KiB
JavaScript
123 lines
3.6 KiB
JavaScript
if (this.importScripts) {
|
|
importScripts('../../../resources/js-test.js');
|
|
importScripts('shared.js');
|
|
}
|
|
|
|
description("Test IndexedDB transaction internal active flag.");
|
|
|
|
indexedDBTest(prepareDatabase, runTransaction);
|
|
function prepareDatabase()
|
|
{
|
|
db = event.target.result;
|
|
event.target.transaction.onabort = unexpectedAbortCallback;
|
|
evalAndLog("store = db.createObjectStore('store')");
|
|
evalAndLog("store.createIndex('index', 'keypath')");
|
|
}
|
|
|
|
function runTransaction()
|
|
{
|
|
debug("");
|
|
debug("runTransaction():");
|
|
evalAndLog("transaction = db.transaction('store', 'readwrite')");
|
|
|
|
debug("");
|
|
debug("Verify that transactions are created with |active| flag set:");
|
|
evalAndLog("store = transaction.objectStore('store')");
|
|
evalAndLog("index = store.index('index')");
|
|
for (i = 0; i < statements.length; ++i) {
|
|
shouldNotThrow(statements[i]);
|
|
}
|
|
|
|
debug("");
|
|
debug("Transaction shouldn't be active inside a non-IDB-event callback");
|
|
evalAndLog("setTimeout(testTimeout, 0)");
|
|
|
|
timeoutComplete = false;
|
|
|
|
// Keep transaction alive until timeout callback completes - don't log
|
|
// anything here as this could run a variable number of times depending
|
|
// on the port.
|
|
function busy() {
|
|
if (timeoutComplete) {
|
|
testEventCallback();
|
|
return;
|
|
}
|
|
busyRequest = transaction.objectStore('store').get(0);
|
|
busyRequest.onerror = unexpectedErrorCallback;
|
|
busyRequest.onsuccess = function () {
|
|
busy();
|
|
};
|
|
}
|
|
busy();
|
|
|
|
transaction.oncomplete = transactionComplete;
|
|
}
|
|
|
|
var statements = [
|
|
"store.add(0, 0)",
|
|
"store.put(0, 0)",
|
|
"store.get(0)",
|
|
"store.get(IDBKeyRange.only(0))",
|
|
"store.delete(0)",
|
|
"store.delete(IDBKeyRange.only(0))",
|
|
"store.count()",
|
|
"store.count(0)",
|
|
"store.count(IDBKeyRange.only(0))",
|
|
"store.clear()",
|
|
"store.openCursor()",
|
|
"store.openCursor(0)",
|
|
"store.openCursor(0, 'next')",
|
|
"store.openCursor(IDBKeyRange.only(0))",
|
|
"store.openCursor(IDBKeyRange.only(0), 'next')",
|
|
"index.get(0)",
|
|
"index.get(IDBKeyRange.only(0))",
|
|
"index.getKey(0)",
|
|
"index.getKey(IDBKeyRange.only(0))",
|
|
"index.count()",
|
|
"index.count(0)",
|
|
"index.count(IDBKeyRange.only(0))",
|
|
"index.openCursor()",
|
|
"index.openCursor(0)",
|
|
"index.openCursor(0, 'next')",
|
|
"index.openCursor(IDBKeyRange.only(0))",
|
|
"index.openCursor(IDBKeyRange.only(0), 'next')",
|
|
"index.openKeyCursor()",
|
|
"index.openKeyCursor(0)",
|
|
"index.openKeyCursor(0, 'next')",
|
|
"index.openKeyCursor(IDBKeyRange.only(0))",
|
|
"index.openKeyCursor(IDBKeyRange.only(0), 'next')"
|
|
];
|
|
|
|
function testTimeout()
|
|
{
|
|
debug("");
|
|
debug("testTimeout():");
|
|
evalAndLog("store = transaction.objectStore('store')");
|
|
evalAndLog("index = store.index('index')");
|
|
for (i = 0; i < statements.length; ++i) {
|
|
evalAndExpectException(statements[i], "0", "'TransactionInactiveError'");
|
|
}
|
|
timeoutComplete = true;
|
|
}
|
|
|
|
function testEventCallback()
|
|
{
|
|
debug("");
|
|
debug("testEventCallback():");
|
|
|
|
debug("Transaction should be active inside a non-IDB-event callback");
|
|
evalAndLog("store = transaction.objectStore('store')");
|
|
evalAndLog("index = store.index('index')");
|
|
for (i = 0; i < statements.length; ++i) {
|
|
shouldNotThrow(statements[i]);
|
|
}
|
|
}
|
|
|
|
function transactionComplete()
|
|
{
|
|
debug("");
|
|
debug("transactionComplete():");
|
|
evalAndExpectException("store = transaction.objectStore('store')", "DOMException.INVALID_STATE_ERR", "'InvalidStateError'");
|
|
finishJSTest();
|
|
}
|