Test IndexedDB's cursor update. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". 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' 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. 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' 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. 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' 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. 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' 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. 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' Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is a key cursor. 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' Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is a key cursor. 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' Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is a key cursor. 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' Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is a key cursor. event.target.result.continue(); keyCursor() PASS counter is 5 openBasicCursor() trans = db.transaction('basicStore', 'readonly') 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' Exception message: Failed to execute 'update' on 'IDBCursor': The record may not be updated inside a read-only transaction. cursor.continue() attemptUpdate() Expecting exception from cursor.update('myUpdatedValue') 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. cursor.continue() attemptUpdate() Expecting exception from cursor.update('myUpdatedValue') 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. cursor.continue() attemptUpdate() Expecting exception from cursor.update('myUpdatedValue') 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. cursor.continue() attemptUpdate() transactionComplete() PASS successfullyParsed is true TEST COMPLETE