Test that expected exceptions are thrown per IndexedDB spec.

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;

indexedDB.deleteDatabase(dbname)
indexedDB.open(dbname)
store = db.createObjectStore('store')
index = store.createIndex('index', 'id')
store.put({id: 'a'}, 1)
store.put({id: 'b'}, 2)
store.put({id: 'c'}, 3)
store.put({id: 'd'}, 4)
store.put({id: 'e'}, 5)
store.put({id: 'f'}, 6)
store.put({id: 'g'}, 7)
store.put({id: 'h'}, 8)
store.put({id: 'i'}, 9)
store.put({id: 'j'}, 10)
otherStore = db.createObjectStore('otherStore')
inlineKeyStore = db.createObjectStore('inlineKeyStore', {keyPath: 'id'})
request = inlineKeyStore.put({id: 0})
PASS request.readyState is "pending"

3.2.1 The IDBRequest Interface

IDBRequest.error
When the done flag is false, getting this property must throw a DOMException of type InvalidStateError.
Expecting exception from request.error
PASS Exception was thrown.
PASS code is DOMException.INVALID_STATE_ERR
PASS ename is 'InvalidStateError'
Exception message: Failed to read the 'error' property from 'IDBRequest': The request has not finished.

IDBRequest.result
When the done flag is false, getting this property must throw a DOMException of type InvalidStateError.
Expecting exception from request.result
PASS Exception was thrown.
PASS code is DOMException.INVALID_STATE_ERR
PASS ename is 'InvalidStateError'
Exception message: Failed to read the 'result' property from 'IDBRequest': The request has not finished.

3.2.3 Opening a database

IDBFactory.cmp()
One of the supplied keys was not a valid key.
Expecting exception from indexedDB.cmp(null, 0)
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
db.close()

3.2.4 Database
indexedDB.open(dbname, 2)

IDBDatabase.createObjectStore()
If an objectStore with the same name already exists, the implementation must throw a DOMException of type ConstraintError.
Expecting exception from db.createObjectStore('store')
PASS Exception was thrown.
PASS code is 0
PASS ename is 'ConstraintError'
Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': An object store with the specified name already exists.
If keyPath is not a valid key path then a DOMException of type SyntaxError must be thrown.
Expecting exception from db.createObjectStore('fail', {keyPath: '-invalid-'})
PASS Exception was thrown.
PASS code is DOMException.SYNTAX_ERR
PASS ename is 'SyntaxError'
Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
If the optionalParameters parameter is specified, and autoIncrement is set to true, and the keyPath parameter is specified to the empty string, or specified to an Array, this function must throw a InvalidAccessError exception.
Expecting exception from db.createObjectStore('fail', {autoIncrement: true, keyPath: ''})
PASS Exception was thrown.
PASS code is DOMException.INVALID_ACCESS_ERR
PASS ename is 'InvalidAccessError'
Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The autoIncrement option was set but the keyPath option was empty or an array.
Expecting exception from db.createObjectStore('fail', {autoIncrement: true, keyPath: ['a']})
PASS Exception was thrown.
PASS code is DOMException.INVALID_ACCESS_ERR
PASS ename is 'InvalidAccessError'
Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The autoIncrement option was set but the keyPath option was empty or an array.

IDBDatabase.deleteObjectStore()
There is no object store with the given name, compared in a case-sensitive manner, in the connected database.
Expecting exception from db.deleteObjectStore('no-such-store')
PASS Exception was thrown.
PASS code is DOMException.NOT_FOUND_ERR
PASS ename is 'NotFoundError'
Exception message: Failed to execute 'deleteObjectStore' on 'IDBDatabase': The specified object store was not found.

IDBDatabase.transaction()
If this method is called on IDBDatabase object for which a "versionchange" transaction is still running, a InvalidStateError exception must be thrown.
Expecting exception from db.transaction('store')
PASS Exception was thrown.
PASS code is DOMException.INVALID_STATE_ERR
PASS ename is 'InvalidStateError'
Exception message: Failed to execute 'transaction' on 'IDBDatabase': A version change transaction is running.
One of the names provided in the storeNames argument doesn't exist in this database.
Expecting exception from db.transaction('no-such-store')
PASS Exception was thrown.
PASS code is DOMException.NOT_FOUND_ERR
PASS ename is 'NotFoundError'
Exception message: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.
The value for the mode parameter is invalid.
Expecting TypeError exception from db.transaction('store', 'invalid-mode')
PASS Exception was thrown.
PASS db.transaction('store', 'invalid-mode') threw TypeError: Argument 2 ('mode') to IDBDatabase.transaction must be one of: "readonly", "readwrite", "versionchange"
The function was called with an empty list of store names
Expecting exception from db.transaction([])
PASS Exception was thrown.
PASS code is DOMException.INVALID_ACCESS_ERR
PASS ename is 'InvalidAccessError'
Exception message: Failed to execute 'transaction' on 'IDBDatabase': The storeNames parameter was empty.

One more IDBDatabase.createObjectStore() test:
If this function is called from outside a "versionchange" transaction callback ... the implementation must throw a DOMException of type InvalidStateError.
Expecting exception from db.createObjectStore('fail')
PASS Exception was thrown.
PASS code is DOMException.INVALID_STATE_ERR
PASS ename is 'InvalidStateError'
Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The database is not running a version change transaction.

One more IDBDatabase.deleteObjectStore() test:
If this function is called from outside a "versionchange" transaction callback ... the implementation must throw a DOMException of type InvalidStateError.
Expecting exception from db.deleteObjectStore('fail')
PASS Exception was thrown.
PASS code is DOMException.INVALID_STATE_ERR
PASS ename is 'InvalidStateError'
Exception message: Failed to execute 'deleteObjectStore' on 'IDBDatabase': The database is not running a version change transaction.

Prepare an object store and index from an inactive transaction for later use.
finishedTransaction = inactiveTransaction = db.transaction('store')
storeFromInactiveTransaction = inactiveTransaction.objectStore('store')
indexFromInactiveTransaction = storeFromInactiveTransaction.index('index')
request = storeFromInactiveTransaction.openCursor()
cursorFromInactiveTransaction = request.result

3.2.5 Object Store
ro_transaction = db.transaction('store', 'readonly')
storeFromReadOnlyTransaction = ro_transaction.objectStore('store')
rw_transaction = db.transaction('store', 'readwrite')
store = rw_transaction.objectStore('store')

IDBObjectStore.add()
This method throws a DOMException of type ReadOnlyError if the transaction which this IDBObjectStore belongs to is has its mode set to "readonly".
Expecting exception from storeFromReadOnlyTransaction.add(0, 0)
PASS Exception was thrown.
PASS code is 0
PASS ename is 'ReadOnlyError'
Exception message: Failed to store record in an IDBObjectStore: The transaction is read-only.
The transaction this IDBObjectStore belongs to is not active.
Expecting exception from storeFromInactiveTransaction.add(0, 0)
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to store record in an IDBObjectStore: The transaction is inactive or finished.
The data being stored could not be cloned by the internal structured cloning algorithm.
Expecting exception from store.add(self, 0)
PASS Exception was thrown.
PASS code is DOMException.DATA_CLONE_ERR
Exception message: The object can not be cloned.

IDBObjectStore.clear()
This method throws a DOMException of type ReadOnlyError if the transaction which this IDBObjectStore belongs to is has its mode set to "readonly".
Expecting exception from storeFromReadOnlyTransaction.clear()
PASS Exception was thrown.
PASS code is 0
PASS ename is 'ReadOnlyError'
Exception message: Failed to execute 'clear' on 'IDBObjectStore': The transaction is read-only.
The transaction this IDBObjectStore belongs to is not active.
Expecting exception from storeFromInactiveTransaction.clear()
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to execute 'clear' on 'IDBObjectStore': The transaction is inactive or finished.

IDBObjectStore.count()
If the optional key parameter is not a valid key or a key range, this method throws a DOMException of type DataError.
Expecting exception from store.count({})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to execute 'count' on 'IDBObjectStore': The parameter is not a valid key.
The transaction this IDBObjectStore belongs to is not active.
Expecting exception from storeFromInactiveTransaction.count()
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to execute 'count' on 'IDBObjectStore': The transaction is inactive or finished.

IDBObjectStore.delete()
This method throws a DOMException of type ReadOnlyError if the transaction which this IDBObjectStore belongs to is has its mode set to "readonly".
Expecting exception from storeFromReadOnlyTransaction.delete(0)
PASS Exception was thrown.
PASS code is 0
PASS ename is 'ReadOnlyError'
Exception message: Failed to execute 'delete' on 'IDBObjectStore': The transaction is read-only.
If the key parameter is not a valid key or a key range this method throws a DOMException of type DataError.
Expecting exception from store.delete({})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to execute 'delete' on 'IDBObjectStore': The parameter is not a valid key.
The transaction this IDBObjectStore belongs to is not active.
Expecting exception from storeFromInactiveTransaction.add(0, 0)
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to store record in an IDBObjectStore: The transaction is inactive or finished.

IDBObjectStore.get()
If the key parameter is not a valid key or a key range, this method throws a DOMException of type DataError.
Expecting exception from store.get({})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to execute 'get' on 'IDBObjectStore': The parameter is not a valid key.
The transaction this IDBObjectStore belongs to is not active.
Expecting exception from storeFromInactiveTransaction.get(0)
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to execute 'get' on 'IDBObjectStore': The transaction is inactive or finished.

IDBObjectStore.index()
There is no index with the given name, compared in a case-sensitive manner, in the connected database.
Expecting exception from store.index('no-such-index')
PASS Exception was thrown.
PASS code is DOMException.NOT_FOUND_ERR
PASS ename is 'NotFoundError'
Exception message: Failed to execute 'index' on 'IDBObjectStore': The specified index was not found.
Occurs if a request is made on a source object that has been deleted or removed, or if the transaction the object store belongs to has finished.
Expecting exception from storeFromInactiveTransaction.index('index')
PASS Exception was thrown.
PASS code is 11
PASS ename is 'InvalidStateError'
Exception message: Failed to execute 'index' on 'IDBObjectStore': The transaction is finished.

IDBObjectStore.openCursor()
If the range parameter is specified but is not a valid key or a key range, this method throws a DOMException of type DataError.
Expecting exception from store.openCursor({})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The parameter is not a valid key.
The transaction this IDBObjectStore belongs to is not active.
Expecting exception from storeFromInactiveTransaction.openCursor()
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The transaction is inactive or finished.
The value for the direction parameter is invalid.
Expecting TypeError exception from store.openCursor(0, 'invalid-direction')
PASS Exception was thrown.
PASS store.openCursor(0, 'invalid-direction') threw TypeError: Argument 2 ('direction') to IDBObjectStore.openCursor must be one of: "next", "nextunique", "prev", "prevunique"

IDBObjectStore.put()
This method throws a DOMException of type ReadOnlyError if the transaction which this IDBObjectStore belongs to is has its mode set to "readonly".
Expecting exception from storeFromReadOnlyTransaction.put(0, 0)
PASS Exception was thrown.
PASS code is 0
PASS ename is 'ReadOnlyError'
Exception message: Failed to store record in an IDBObjectStore: The transaction is read-only.
The transaction this IDBObjectStore belongs to is not active.
Expecting exception from storeFromInactiveTransaction.put(0, 0)
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to store record in an IDBObjectStore: The transaction is inactive or finished.
The data being stored could not be cloned by the internal structured cloning algorithm.
Expecting exception from store.put(self, 0)
PASS Exception was thrown.
PASS code is DOMException.DATA_CLONE_ERR
Exception message: The object can not be cloned.
db.close()
ro_transaction.oncomplete = transactionComplete
rw_transaction.oncomplete = transactionComplete

transactionComplete():
First transaction completed

transactionComplete():
request = indexedDB.open(dbname, 3)
request.onupgradeneeded = onUpgradeNeeded3

IDBObjectStore.createIndex()
If an index with the same name already exists, the implementation must throw a DOMException of type ConstraintError. 
Expecting exception from store.createIndex('index', 'keyPath')
PASS Exception was thrown.
PASS code is 0
PASS ename is 'ConstraintError'
Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': An index with the specified name already exists.
If keyPath is not a valid key path then a DOMException of type SyntaxError must be thrown.
Expecting exception from store.createIndex('fail', '-invalid-')
PASS Exception was thrown.
PASS code is DOMException.SYNTAX_ERR
PASS ename is 'SyntaxError'
Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
If keyPath is an Array and the multiEntry property in the optionalParameters is true, then a DOMException of type InvalidAccessError must be thrown.
Expecting exception from store.createIndex('fail', ['a'], {multiEntry: true})
PASS Exception was thrown.
PASS code is DOMException.INVALID_ACCESS_ERR
PASS ename is 'InvalidAccessError'
Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument was an array and the multiEntry option is true.

IDBObjectStore.deleteIndex()
There is no index with the given name, compared in a case-sensitive manner, in the connected database.
Expecting exception from store.deleteIndex('no-such-index')
PASS Exception was thrown.
PASS code is DOMException.NOT_FOUND_ERR
PASS ename is 'NotFoundError'
Exception message: Failed to execute 'deleteIndex' on 'IDBObjectStore': The specified index was not found.

One more IDBObjectStore.createIndex() test:
If this function is called from outside a "versionchange" transaction callback ... the implementation must throw a DOMException of type InvalidStateError.
Expecting exception from db.transaction('store').objectStore('store').createIndex('fail', 'keyPath')
PASS Exception was thrown.
PASS code is DOMException.INVALID_STATE_ERR
PASS ename is 'InvalidStateError'
Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The database is not running a version change transaction.

One more IDBObjectStore.deleteIndex() test:
If this function is called from outside a "versionchange" transaction callback ... the implementation must throw a DOMException of type InvalidStateError.
Expecting exception from db.transaction('store').objectStore('store').deleteIndex('fail', 'keyPath')
PASS Exception was thrown.
PASS code is DOMException.INVALID_STATE_ERR
PASS ename is 'InvalidStateError'
Exception message: Failed to execute 'deleteIndex' on 'IDBObjectStore': The database is not running a version change transaction.

3.2.6 Index
indexFromReadOnlyTransaction = db.transaction('store', 'readonly').objectStore('store').index('index')
index = db.transaction('store', 'readwrite').objectStore('store').index('index')

IDBIndex.count()
If the optional key parameter is not a valid key or a key range, this method throws a DOMException of type DataError.
Expecting exception from index.count({})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to execute 'count' on 'IDBIndex': The parameter is not a valid key.
The transaction this IDBIndex belongs to is not active.
Expecting exception from indexFromInactiveTransaction.count()
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to execute 'count' on 'IDBIndex': The transaction is inactive or finished.

IDBIndex.get()
If the key parameter is not a valid key or a key range, this method throws a DOMException of type DataError.
Expecting exception from index.get({})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to execute 'get' on 'IDBIndex': The parameter is not a valid key.
The transaction this IDBIndex belongs to is not active.
Expecting exception from indexFromInactiveTransaction.get(0)
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to execute 'get' on 'IDBIndex': The transaction is inactive or finished.

IDBIndex.getKey()
If the key parameter is not a valid key or a key range, this method throws a DOMException of type DataError.
Expecting exception from index.getKey({})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to execute 'getKey' on 'IDBIndex': The parameter is not a valid key.
The transaction this IDBIndex belongs to is not active.
Expecting exception from indexFromInactiveTransaction.getKey(0)
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to execute 'getKey' on 'IDBIndex': The transaction is inactive or finished.

IDBIndex.openCursor()
If the range parameter is specified but is not a valid key or a key range, this method throws a DOMException of type DataError.
Expecting exception from index.openCursor({})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to execute 'openCursor' on 'IDBIndex': The parameter is not a valid key.
The transaction this IDBIndex belongs to is not active.
Expecting exception from indexFromInactiveTransaction.openCursor()
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to execute 'openCursor' on 'IDBIndex': The transaction is inactive or finished.
The value for the direction parameter is invalid.
Expecting TypeError exception from index.openCursor(0, 'invalid-direction')
PASS Exception was thrown.
PASS index.openCursor(0, 'invalid-direction') threw TypeError: Argument 2 ('direction') to IDBIndex.openCursor must be one of: "next", "nextunique", "prev", "prevunique"

IDBIndex.openKeyCursor()
If the range parameter is specified but is not a valid key or a key range, this method throws a DOMException of type DataError.
Expecting exception from index.openKeyCursor({})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The parameter is not a valid key.
The transaction this IDBIndex belongs to is not active.
Expecting exception from indexFromInactiveTransaction.openKeyCursor()
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The transaction is inactive or finished.
The value for the direction parameter is invalid.
Expecting TypeError exception from index.openKeyCursor(0, 'invalid-direction')
PASS Exception was thrown.
PASS index.openKeyCursor(0, 'invalid-direction') threw TypeError: Argument 2 ('direction') to IDBIndex.openKeyCursor must be one of: "next", "nextunique", "prev", "prevunique"

3.2.7 Cursor
transaction = db.transaction(['store', 'inlineKeyStore'], 'readwrite')
request = transaction.objectStore('store').openCursor()
cursor = request.result
request = transaction.objectStore('store').index('index').openKeyCursor()
keyCursor = request.result
request = transaction.objectStore('store').openCursor(IDBKeyRange.lowerBound(-Infinity), 'prev')
reverseCursor = request.result
request = transaction.objectStore('inlineKeyStore').openCursor()
inlineCursor = request.result

IDBCursor.advance()
Calling this method more than once before new cursor data has been loaded is not allowed and results in a DOMException of type InvalidStateError being thrown.
If the value for count is 0 (zero) or a negative number, this method must throw a JavaScript TypeError exception.
Expecting TypeError exception from cursor.advance(0)
PASS Exception was thrown.
PASS cursor.advance(0) threw TypeError: Failed to execute 'advance' on 'IDBCursor': A count argument with value 0 (zero) was supplied, must be greater than 0.
cursor.advance(1)
Expecting exception from cursor.advance(1)
PASS Exception was thrown.
PASS code is DOMException.INVALID_STATE_ERR
PASS ename is 'InvalidStateError'
Exception message: Failed to execute 'advance' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
The transaction this IDBCursor belongs to is not active.
Expecting exception from cursorFromInactiveTransaction.advance(1)
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to execute 'advance' on 'IDBCursor': The transaction is inactive or finished.

IDBCursor.continue()
The parameter is not a valid key.
Expecting exception from cursor.continue({})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to execute 'continue' on 'IDBCursor': The parameter is not a valid key.
The parameter is less than or equal to this cursor's position and this cursor's direction is "next" or "nextunique".
Expecting exception from cursor.continue(-Infinity)
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to execute 'continue' on 'IDBCursor': The parameter is less than or equal to this cursor's position.
The parameter is greater than or equal to this cursor's position and this cursor's direction is "prev" or "prevunique".
Expecting exception from reverseCursor.continue(100)
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to execute 'continue' on 'IDBCursor': The parameter is greater than or equal to this cursor's position.
Calling this method more than once before new cursor data has been loaded is not allowed and results in a DOMException of type InvalidStateError being thrown.
cursor.continue()
Expecting exception from cursor.continue()
PASS Exception was thrown.
PASS code is DOMException.INVALID_STATE_ERR
PASS ename is 'InvalidStateError'
Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
The transaction this IDBCursor belongs to is not active.
Expecting exception from cursorFromInactiveTransaction.continue()
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to execute 'continue' on 'IDBCursor': The transaction is inactive or finished.

IDBCursor.delete()
If this cursor's got value flag is false, or if this cursor was created using openKeyCursor a DOMException of type InvalidStateError is thrown.
Expecting exception from keyCursor.delete()
PASS Exception was thrown.
PASS code is DOMException.INVALID_STATE_ERR
PASS ename is 'InvalidStateError'
Exception message: Failed to execute 'delete' on 'IDBCursor': The cursor is a key cursor.
The transaction this IDBCursor belongs to is not active.
Expecting exception from cursorFromInactiveTransaction.delete()
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to execute 'delete' on 'IDBCursor': The transaction is inactive or finished.

IDBCursor.update()
If this cursor's got value flag is false or if this cursor was created using openKeyCursor. This method throws a DOMException of type InvalidStateError.
Expecting exception from keyCursor.update({})
PASS Exception was thrown.
PASS code is DOMException.INVALID_STATE_ERR
PASS ename is 'InvalidStateError'
Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is a key cursor.
If the effective object store of this cursor uses in-line keys and evaluating the key path of the value parameter results in a different value than the cursor's effective key, this method throws a DOMException of type DataError.
Expecting exception from inlineCursor.update({id: 1})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'DataError'
Exception message: Failed to execute 'update' on 'IDBCursor': The effective object store of this cursor uses in-line keys and evaluating the key path of the value parameter results in a different value than the cursor's effective key.
If the structured clone algorithm throws an exception, that exception is rethrown.
Expecting exception from cursor.update(self)
PASS Exception was thrown.
PASS code is DOMException.DATA_CLONE_ERR
Exception message: The object can not be cloned.
The transaction this IDBCursor belongs to is not active.
Expecting exception from cursorFromInactiveTransaction.update({})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'TransactionInactiveError'
Exception message: Failed to execute 'update' on 'IDBCursor': The transaction is inactive or finished.
readOnlyTransaction = db.transaction('store', 'readonly')
request = readOnlyTransaction.objectStore('store').openCursor()
cursorFromReadOnlyTransaction = request.result

One more IDBCursor.delete() test:
This method throws a DOMException of type ReadOnlyError if the transaction which this IDBCursor belongs to has its mode set to "readonly".
Expecting exception from cursorFromReadOnlyTransaction.delete()
PASS Exception was thrown.
PASS code is 0
PASS ename is 'ReadOnlyError'
Exception message: Failed to execute 'delete' on 'IDBCursor': The record may not be deleted inside a read-only transaction.

One more IDBCursor.update() test:
This method throws a DOMException of type ReadOnlyError if the transaction which this IDBCursor belongs to has its mode set to "readonly".
Expecting exception from cursorFromReadOnlyTransaction.update({})
PASS Exception was thrown.
PASS code is 0
PASS ename is 'ReadOnlyError'
Exception message: Failed to execute 'update' on 'IDBCursor': The record may not be updated inside a read-only transaction.

3.2.8 Transaction

IDBTransaction.abort()
If this transaction is finished, throw a DOMException of type InvalidStateError. 
Expecting exception from finishedTransaction.abort()
PASS Exception was thrown.
PASS code is DOMException.INVALID_STATE_ERR
PASS ename is 'InvalidStateError'
Exception message: Failed to execute 'abort' on 'IDBTransaction': The transaction is inactive or finished.
If the requested object store is not in this transaction's scope.
Expecting exception from db.transaction('store').objectStore('otherStore')
PASS Exception was thrown.
PASS code is DOMException.NOT_FOUND_ERR
PASS ename is 'NotFoundError'
Exception message: Failed to execute 'objectStore' on 'IDBTransaction': The specified object store was not found.
PASS successfullyParsed is true

TEST COMPLETE

