| if (this.importScripts) { |
| importScripts('../../../resources/js-test.js'); |
| importScripts('shared.js'); |
| } |
| |
| description("Test IndexedDB transaction basics."); |
| |
| indexedDBTest(prepareDatabase, testSetVersionAbort1); |
| function prepareDatabase() |
| { |
| db = event.target.result; |
| } |
| |
| function testSetVersionAbort1() |
| { |
| checkMetadataEmpty(); |
| evalAndLog("request = newConnection()"); |
| request.onupgradeneeded = addRemoveIDBObjects; |
| request.onsuccess = unexpectedSuccessCallback; |
| request.onerror = testSetVersionAbort2; |
| } |
| |
| function addRemoveIDBObjects() |
| { |
| debug("addRemoveIDBObjects():"); |
| db = event.target.result; |
| evalAndLog("trans = event.target.transaction"); |
| shouldBeNonNull("trans"); |
| trans.oncomplete = unexpectedCompleteCallback; |
| |
| var store = evalAndLog("store = db.createObjectStore('storeFail', null)"); |
| var index = evalAndLog("index = store.createIndex('indexFail', 'x')"); |
| |
| evalAndLog("db.deleteObjectStore('storeFail')"); |
| evalAndExpectException("store.deleteIndex('indexFail')", "DOMException.INVALID_STATE_ERR", "'InvalidStateError'"); |
| |
| trans.abort(); |
| } |
| |
| function testSetVersionAbort2() |
| { |
| debug(""); |
| debug("testSetVersionAbort2():"); |
| checkMetadataEmpty(); |
| evalAndLog("request = newConnection()"); |
| request.onupgradeneeded = addRemoveAddIDBObjects; |
| request.onerror = null; |
| } |
| |
| function addRemoveAddIDBObjects() |
| { |
| debug("addRemoveAddIDBObjects():"); |
| db = event.target.result; |
| var trans = evalAndLog("trans = event.target.transaction"); |
| shouldBeNonNull("trans"); |
| trans.addEventListener('abort', testSetVersionAbort3, false); |
| trans.oncomplete = unexpectedCompleteCallback; |
| |
| var store = evalAndLog("store = db.createObjectStore('storeFail', null)"); |
| var index = evalAndLog("index = store.createIndex('indexFail', 'x')"); |
| |
| evalAndLog("db.deleteObjectStore('storeFail')"); |
| evalAndExpectException("store.deleteIndex('indexFail')", "DOMException.INVALID_STATE_ERR", "'InvalidStateError'"); |
| |
| var store = evalAndLog("store = db.createObjectStore('storeFail', null)"); |
| var index = evalAndLog("index = store.createIndex('indexFail', 'x')"); |
| |
| trans.abort(); |
| } |
| |
| function testSetVersionAbort3() |
| { |
| debug(""); |
| debug("testSetVersionAbort3():"); |
| shouldBeFalse("event.cancelable"); |
| checkMetadataEmpty(); |
| evalAndLog("request = newConnection()"); |
| request.onupgradeneeded = addIDBObjects; |
| request.onsuccess = unexpectedSuccessCallback; |
| request.onerror = testSetVersionAbort4; |
| } |
| |
| function addIDBObjects() |
| { |
| debug("addIDBObjects():"); |
| db = event.target.result; |
| shouldBeFalse("event.cancelable"); |
| var trans = evalAndLog("trans = event.target.transaction"); |
| shouldBeNonNull("trans"); |
| trans.onabort = testInactiveAbortedTransaction; |
| trans.oncomplete = unexpectedCompleteCallback; |
| |
| store = evalAndLog("store = db.createObjectStore('storeFail', null)"); |
| index = evalAndLog("index = store.createIndex('indexFail', 'x')"); |
| |
| trans.abort(); |
| } |
| |
| function testInactiveAbortedTransaction() |
| { |
| debug(""); |
| debug("testInactiveAbortedTransaction():"); |
| evalAndExpectException("index.openCursor()", "11", "'InvalidStateError'"); |
| evalAndExpectException("index.openKeyCursor()", "11", "'InvalidStateError'"); |
| evalAndExpectException("index.get(0)", "11", "'InvalidStateError'"); |
| evalAndExpectException("index.getKey(0)", "11", "'InvalidStateError'"); |
| evalAndExpectException("index.count()", "11", "'InvalidStateError'"); |
| |
| evalAndExpectException("store.put(0, 0)", "11", "'InvalidStateError'"); |
| evalAndExpectException("store.add(0, 0)", "11", "'InvalidStateError'"); |
| evalAndExpectException("store.delete(0)", "11", "'InvalidStateError'"); |
| evalAndExpectException("store.clear()", "11", "'InvalidStateError'"); |
| evalAndExpectException("store.get(0)", "11", "'InvalidStateError'"); |
| evalAndExpectException("store.openCursor()", "11", "'InvalidStateError'"); |
| } |
| |
| function testSetVersionAbort4() |
| { |
| debug(""); |
| debug("testSetVersionAbort4():"); |
| checkMetadataEmpty(); |
| evalAndLog("request = newConnection()"); |
| request.onupgradeneeded = addIDBObjectsAndCommit; |
| request.onerror = unexpectedErrorCallback; |
| request.onsuccess = testSetVersionAbort5; |
| } |
| |
| function addIDBObjectsAndCommit() |
| { |
| db = event.target.result; |
| debug("addIDBObjectsAndCommit():"); |
| var trans = evalAndLog("trans = event.target.transaction"); |
| shouldBeNonNull("trans"); |
| trans.onabort = unexpectedAbortCallback; |
| |
| store = evalAndLog("store = db.createObjectStore('storeFail', null)"); |
| index = evalAndLog("index = store.createIndex('indexFail', 'x')"); |
| |
| trans.oncomplete = testInactiveCompletedTransaction; |
| } |
| |
| function testInactiveCompletedTransaction() |
| { |
| debug(""); |
| debug("testInactiveCompletedTransaction():"); |
| evalAndExpectException("index.openCursor()", "0", "'TransactionInactiveError'"); |
| evalAndExpectException("index.openKeyCursor()", "0", "'TransactionInactiveError'"); |
| evalAndExpectException("index.get(0)", "0", "'TransactionInactiveError'"); |
| evalAndExpectException("index.getKey(0)", "0", "'TransactionInactiveError'"); |
| evalAndExpectException("index.count()", "0", "'TransactionInactiveError'"); |
| |
| evalAndExpectException("store.put(0, 0)", "0", "'TransactionInactiveError'"); |
| evalAndExpectException("store.add(0, 0)", "0", "'TransactionInactiveError'"); |
| evalAndExpectException("store.delete(0)", "0", "'TransactionInactiveError'"); |
| evalAndExpectException("store.clear()", "0", "'TransactionInactiveError'"); |
| evalAndExpectException("store.get(0)", "0", "'TransactionInactiveError'"); |
| evalAndExpectException("store.openCursor()", "0", "'TransactionInactiveError'"); |
| } |
| |
| function testSetVersionAbort5() |
| { |
| debug(""); |
| debug("testSetVersionAbort5():"); |
| checkMetadataExistingObjectStore(); |
| evalAndLog("request = newConnection()"); |
| request.onupgradeneeded = removeIDBObjects; |
| request.onsuccess = unexpectedSuccessCallback; |
| request.onerror = testSetVersionAbort6; |
| } |
| |
| function removeIDBObjects() |
| { |
| db = event.target.result; |
| debug("removeIDBObjects():"); |
| var trans = evalAndLog("trans = event.target.transaction"); |
| shouldBeNonNull("trans"); |
| trans.oncomplete = unexpectedCompleteCallback; |
| |
| var store = evalAndLog("store = trans.objectStore('storeFail')"); |
| evalAndLog("store.deleteIndex('indexFail')"); |
| evalAndLog("db.deleteObjectStore('storeFail')"); |
| |
| trans.abort(); |
| } |
| |
| function testSetVersionAbort6() |
| { |
| debug(""); |
| debug("testSetVersionAbort6():"); |
| checkMetadataExistingObjectStore(); |
| evalAndLog("request = newConnection()"); |
| request.onupgradeneeded = setVersionSuccess; |
| request.onsuccess = completeCallback; |
| } |
| |
| function checkMetadataEmpty() |
| { |
| shouldBe("self.db.objectStoreNames", "[]"); |
| shouldBe("self.db.objectStoreNames.length", "0"); |
| shouldBe("self.db.objectStoreNames.contains('storeFail')", "false"); |
| } |
| |
| function checkMetadataExistingObjectStore() |
| { |
| shouldBe("db.objectStoreNames", "['storeFail']"); |
| shouldBe("db.objectStoreNames.length", "1"); |
| shouldBe("db.objectStoreNames.contains('storeFail')", "true"); |
| } |
| |
| var version = 1; |
| function newConnection() |
| { |
| db.close(); |
| var request = evalAndLog("indexedDB.open(dbname, " + (++version) + ")"); |
| request.onerror = unexpectedErrorCallback; |
| request.onblocked = unexpectedBlockedCallback; |
| return request; |
| } |
| |
| function setVersionSuccess() |
| { |
| db = event.target.result; |
| debug(""); |
| debug("setVersionSuccess():"); |
| evalAndLog("trans = event.target.transaction"); |
| shouldBeNonNull("trans"); |
| trans.onabort = unexpectedAbortCallback; |
| |
| deleteAllObjectStores(db); |
| |
| evalAndLog("db.createObjectStore('storeName', null)"); |
| } |
| |
| function completeCallback() |
| { |
| preamble(); |
| shouldBeFalse("event.cancelable"); |
| testPassed("complete event fired"); |
| transaction = evalAndLog("db.transaction(['storeName'])"); |
| transaction.oncomplete = emptyCompleteCallback; |
| var store = evalAndLog("store = transaction.objectStore('storeName')"); |
| shouldBeEqualToString("store.name", "storeName"); |
| } |
| |
| function emptyCompleteCallback() |
| { |
| testPassed("complete event fired"); |
| testDOMStringList(); |
| } |
| |
| function testDOMStringList() |
| { |
| debug(""); |
| debug("Verifying DOMStringList works as argument for IDBDatabase.transaction()"); |
| debug("db.objectStoreNames is " + db.objectStoreNames); |
| debug("... which contains: " + JSON.stringify(Array.prototype.slice.call(db.objectStoreNames))); |
| evalAndLog("transaction = db.transaction(db.objectStoreNames)"); |
| testPassed("no exception thrown"); |
| for (var i = 0; i < db.objectStoreNames.length; ++i) { |
| shouldBeNonNull("transaction.objectStore(" + JSON.stringify(db.objectStoreNames[i]) + ")"); |
| } |
| testPassed("all stores present in transaction"); |
| transaction.oncomplete = testInvalidMode; |
| } |
| |
| function testInvalidMode() |
| { |
| debug(""); |
| debug("Verify that specifying an invalid mode raises an exception"); |
| evalAndExpectExceptionClass("db.transaction(['storeName'], 'lsakjdf')", "TypeError"); |
| testDegenerateNames(); |
| } |
| |
| function testDegenerateNames() |
| { |
| debug(""); |
| debug("Test that null and undefined are treated as strings"); |
| |
| evalAndExpectException("db.transaction(null)", "DOMException.NOT_FOUND_ERR", "'NotFoundError'"); |
| evalAndExpectException("db.transaction(undefined)", "DOMException.NOT_FOUND_ERR", "'NotFoundError'"); |
| |
| evalAndLog("request = newConnection()"); |
| request.onerror = unexpectedErrorCallback; |
| request.onupgradeneeded = function () { |
| var trans = request.transaction; |
| db = event.target.result; |
| evalAndLog("db.createObjectStore('null')"); |
| evalAndLog("db.createObjectStore('undefined')"); |
| trans.oncomplete = verifyDegenerateNames; |
| }; |
| function verifyDegenerateNames() { |
| shouldNotThrow("transaction = db.transaction(null)"); |
| shouldBeNonNull("transaction.objectStore('null')"); |
| shouldNotThrow("transaction = db.transaction(undefined)"); |
| shouldBeNonNull("transaction.objectStore('undefined')"); |
| finishJSTest(); |
| } |
| } |