| 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(); |
| } |