Verify that a transaction with an error aborts unless preventDefault() is called.

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)
setVersionSuccess():
trans = event.target.transaction
PASS trans is non-null.
db.createObjectStore('storeName', null)
trans = db.transaction(['storeName'], 'readwrite')
trans.onabort = unexpectedAbortCallback
trans.oncomplete = transactionCompleted
store = trans.objectStore('storeName')
store.add({x: 'value', y: 'zzz'}, 'key')
event.target.source.add({x: 'value', y: 'zzz'}, 'key')
event.preventDefault()
PASS Transaction completed


trans = db.transaction(['storeName'], 'readwrite')
trans.onabort = transactionAborted1
trans.oncomplete = unexpectedCompleteCallback
store = trans.objectStore('storeName')
store.add({x: 'value', y: 'zzz'}, 'key')
Doing nothing to prevent the default action...
PASS Transaction aborted


trans = db.transaction(['storeName'], 'readwrite')
trans.onabort = transactionAborted2
trans.oncomplete = unexpectedCompleteCallback
store = trans.objectStore('storeName')
store.add({x: 'value', y: 'zzz'}, 'key')
Omitting an onerror handler
PASS Transaction aborted
PASS successfullyParsed is true

TEST COMPLETE

