Test features of IndexedDB's unique indices.

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)
db.createObjectStore('store')
store.createIndex('index', 'x', {unique: true})
setVersionCompleted():
transaction = db.transaction(['store'], 'readwrite')
transaction.objectStore('store').put({x: 1}, 'foo')
addMoreData():
transaction.objectStore('store').put({x: 1}, 'bar')
addMoreDataFailed():
event.preventDefault()
PASS event.target.error.name is 'ConstraintError'
transaction.objectStore('store').put({x: 0}, 'foo')
changeDataSuccess():
transaction.objectStore('store').index('index').openCursor(IDBKeyRange.lowerBound(1))
cursorSuccess():
PASS event.target.result is null
transaction.objectStore('store').index('index').openKeyCursor(IDBKeyRange.lowerBound(1))
keyCursorSuccess():
PASS event.target.result is null
transaction.objectStore('store').put({x: 1}, 'bar')
addMoreDataSucces():
transaction.objectStore('store').delete('bar')
deleteSuccess():
transaction.objectStore('store').put({x: 1}, 'baz')
finalAddSuccess():
transaction.objectStore('store').put({x: 1}, 'baz')
PASS successfullyParsed is true

TEST COMPLETE

