Test IndexedDB's cursor update. 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; dbname = "cursor-update.html" indexedDB.deleteDatabase(dbname) indexedDB.open(dbname) setVersionSuccess(): trans = event.target.transaction PASS trans is non-null. Deleted all object stores. objectStore = db.createObjectStore('basicStore') objectStore.add('myValue1', 'myKey1').onerror = unexpectedErrorCallback objectStore.add('myValue2', 'myKey2').onerror = unexpectedErrorCallback objectStore.add('myValue3', 'myKey3').onerror = unexpectedErrorCallback objectStore.add('myValue4', 'myKey4').onerror = unexpectedErrorCallback objectStore = db.createObjectStore('autoIncrementStore', {autoIncrement: true}) objectStore.add('foo1').onerror = unexpectedErrorCallback objectStore.add('foo2').onerror = unexpectedErrorCallback objectStore.add('foo3').onerror = unexpectedErrorCallback objectStore.add('foo4').onerror = unexpectedErrorCallback objectStore = db.createObjectStore('keyPathStore', {keyPath: 'id'}) objectStore.createIndex('numberIndex', 'number') objectStore.add({number: 1, id: 1}).onerror = unexpectedErrorCallback objectStore.add({number: 2, id: 2}).onerror = unexpectedErrorCallback objectStore.add({number: 3, id: 3}).onerror = unexpectedErrorCallback objectStore.add({number: 4, id: 4}).onerror = unexpectedErrorCallback openBasicCursor() trans = db.transaction(['basicStore', 'autoIncrementStore', 'keyPathStore'], 'readwrite') trans.objectStore('basicStore') objectStore.openCursor(keyRange) basicUpdateCursor() PASS event.target.source is objectStore event.target.result.update('myUpdatedValue' + counter++) event.target.source.continue() basicUpdateCursor() PASS event.target.source is objectStore event.target.result.update('myUpdatedValue' + counter++) event.target.source.continue() basicUpdateCursor() PASS event.target.source is objectStore event.target.result.update('myUpdatedValue' + counter++) event.target.source.continue() basicUpdateCursor() PASS event.target.source is objectStore event.target.result.update('myUpdatedValue' + counter++) event.target.source.continue() basicUpdateCursor() PASS event.target.source is objectStore PASS counter is 5 trans.objectStore('basicStore').openCursor(keyRange) basicCheckCursor() PASS event.target.result.key is "myKey1" PASS event.target.result.value is "myUpdatedValue1" event.target.result.continue() basicCheckCursor() PASS event.target.result.key is "myKey2" PASS event.target.result.value is "myUpdatedValue2" event.target.result.continue() basicCheckCursor() PASS event.target.result.key is "myKey3" PASS event.target.result.value is "myUpdatedValue3" event.target.result.continue() basicCheckCursor() PASS event.target.result.key is "myKey4" PASS event.target.result.value is "myUpdatedValue4" event.target.result.continue() basicCheckCursor() PASS counter is 5 trans.objectStore('autoIncrementStore').openCursor(keyRange) autoIncrementUpdateCursor() event.target.result.update('myUpdatedFoo' + counter++) event.target.source.continue() autoIncrementUpdateCursor() event.target.result.update('myUpdatedFoo' + counter++) event.target.source.continue() autoIncrementUpdateCursor() event.target.result.update('myUpdatedFoo' + counter++) event.target.source.continue() autoIncrementUpdateCursor() event.target.result.update('myUpdatedFoo' + counter++) event.target.source.continue() autoIncrementUpdateCursor() PASS counter is 5 trans.objectStore('autoIncrementStore').openCursor(keyRange) autoIncrementCheckCursor() PASS event.target.result.key is counter PASS event.target.result.value is "myUpdatedFoo1" event.target.result.continue() autoIncrementCheckCursor() PASS event.target.result.key is counter PASS event.target.result.value is "myUpdatedFoo2" event.target.result.continue() autoIncrementCheckCursor() PASS event.target.result.key is counter PASS event.target.result.value is "myUpdatedFoo3" event.target.result.continue() autoIncrementCheckCursor() PASS event.target.result.key is counter PASS event.target.result.value is "myUpdatedFoo4" event.target.result.continue() autoIncrementCheckCursor() PASS counter is 5 trans.objectStore('keyPathStore').openCursor(keyRange) keyPathUpdateCursor() Expecting exception from event.target.result.update({id: 100 + counter, number: 100 + counter}) PASS Exception was thrown. PASS code is 0 PASS ename is 'DataError' event.target.result.update({id: counter, number: 100 + counter++}) event.target.source.continue() keyPathUpdateCursor() Expecting exception from event.target.result.update({id: 100 + counter, number: 100 + counter}) PASS Exception was thrown. PASS code is 0 PASS ename is 'DataError' event.target.result.update({id: counter, number: 100 + counter++}) event.target.source.continue() keyPathUpdateCursor() Expecting exception from event.target.result.update({id: 100 + counter, number: 100 + counter}) PASS Exception was thrown. PASS code is 0 PASS ename is 'DataError' event.target.result.update({id: counter, number: 100 + counter++}) event.target.source.continue() keyPathUpdateCursor() Expecting exception from event.target.result.update({id: 100 + counter, number: 100 + counter}) PASS Exception was thrown. PASS code is 0 PASS ename is 'DataError' event.target.result.update({id: counter, number: 100 + counter++}) event.target.source.continue() keyPathUpdateCursor() PASS counter is 5 trans.objectStore('keyPathStore').openCursor(keyRange) keyPathCheckCursor() PASS event.target.result.key is counter PASS event.target.result.value.id is counter PASS event.target.result.value.number is 101 event.target.result.continue() keyPathCheckCursor() PASS event.target.result.key is counter PASS event.target.result.value.id is counter PASS event.target.result.value.number is 102 event.target.result.continue() keyPathCheckCursor() PASS event.target.result.key is counter PASS event.target.result.value.id is counter PASS event.target.result.value.number is 103 event.target.result.continue() keyPathCheckCursor() PASS event.target.result.key is counter PASS event.target.result.value.id is counter PASS event.target.result.value.number is 104 event.target.result.continue() keyPathCheckCursor() PASS counter is 5 trans.objectStore('keyPathStore').index('numberIndex').openKeyCursor(keyRange) keyCursor() PASS event.target.result.key is counter + 100 PASS event.target.result.primaryKey is counter Expecting exception from event.target.result.update({id: counter, number: counter + 200}) PASS Exception was thrown. PASS code is DOMException.INVALID_STATE_ERR PASS ename is 'InvalidStateError' event.target.result.continue(); keyCursor() PASS event.target.result.key is counter + 100 PASS event.target.result.primaryKey is counter Expecting exception from event.target.result.update({id: counter, number: counter + 200}) PASS Exception was thrown. PASS code is DOMException.INVALID_STATE_ERR PASS ename is 'InvalidStateError' event.target.result.continue(); keyCursor() PASS event.target.result.key is counter + 100 PASS event.target.result.primaryKey is counter Expecting exception from event.target.result.update({id: counter, number: counter + 200}) PASS Exception was thrown. PASS code is DOMException.INVALID_STATE_ERR PASS ename is 'InvalidStateError' event.target.result.continue(); keyCursor() PASS event.target.result.key is counter + 100 PASS event.target.result.primaryKey is counter Expecting exception from event.target.result.update({id: counter, number: counter + 200}) PASS Exception was thrown. PASS code is DOMException.INVALID_STATE_ERR PASS ename is 'InvalidStateError' event.target.result.continue(); keyCursor() PASS counter is 5 openBasicCursor() trans = db.transaction('basicStore') trans.objectStore('basicStore') objectStore.openCursor(keyRange) attemptUpdate() Expecting exception from cursor.update('myUpdatedValue') PASS Exception was thrown. PASS code is 0 PASS ename is 'ReadOnlyError' cursor.continue() attemptUpdate() Expecting exception from cursor.update('myUpdatedValue') PASS Exception was thrown. PASS code is 0 PASS ename is 'ReadOnlyError' cursor.continue() attemptUpdate() Expecting exception from cursor.update('myUpdatedValue') PASS Exception was thrown. PASS code is 0 PASS ename is 'ReadOnlyError' cursor.continue() attemptUpdate() Expecting exception from cursor.update('myUpdatedValue') PASS Exception was thrown. PASS code is 0 PASS ename is 'ReadOnlyError' cursor.continue() attemptUpdate() transactionComplete() PASS successfullyParsed is true TEST COMPLETE