Test IndexedDB's key generator behavior. 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; Verify that each object store has an independent key generator. indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB; indexedDB.deleteDatabase(dbname) indexedDB.open(dbname) store1 = db.createObjectStore('store1', { autoIncrement: true }) store1.put('a') request = store.get(1) store2 = db.createObjectStore('store2', { autoIncrement: true }) store2.put('a') request = store.get(1) store1.put('b') request = store.get(2) store2.put('b') request = store.get(2) PASS Got "a" for key: 1 PASS Got "a" for key: 1 PASS Got "b" for key: 2 PASS Got "b" for key: 2 db.close() Verify that the key generator is not updated if insertion fails indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB; indexedDB.deleteDatabase(dbname) indexedDB.open(dbname) store = db.createObjectStore('store1', { autoIncrement: true }) index = store.createIndex('index1', 'ix', { unique: true }) store.put({ ix: 'a'}) request = store.get(1) store.put({ ix: 'a'}) store.put({ ix: 'b'}) request = store.get(2) PASS Got {"ix":"a"} for key: 1 PASS Got {"ix":"b"} for key: 2 db.close() Verify that the key generator is not affected by item removal (delete or clear). indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB; indexedDB.deleteDatabase(dbname) indexedDB.open(dbname) store = db.createObjectStore('store1', { autoIncrement: true }) store.put('a') request = store.get(1) store.delete(1) store.put('b') request = store.get(2) store.clear() store.put('c') request = store.get(3) store.delete(IDBKeyRange.lowerBound(0)) store.put('d') request = store.get(4) PASS Got "a" for key: 1 PASS Got "b" for key: 2 PASS Got "c" for key: 3 PASS Got "d" for key: 4 db.close() Verify that the key generator is only set if and only if a numeric key greater than the last generated key is used. indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB; indexedDB.deleteDatabase(dbname) indexedDB.open(dbname) store = db.createObjectStore('store1', { autoIncrement: true }) store.put('a') request = store.get(1) store.put('b', 3) request = store.get(3) store.put('c') request = store.get(4) store.put('d', -10) request = store.get(-10) store.put('e') request = store.get(5) store.put('f', 6.00001) request = store.get(6.00001) store.put('g') request = store.get(7) store.put('f', 8.9999) request = store.get(8.9999) store.put('g') request = store.get(9) store.put('h', 'foo') request = store.get("foo") store.put('i') request = store.get(10) store.put('j', [1000]) request = store.get([1000]) store.put('k') request = store.get(11) PASS Got "a" for key: 1 PASS Got "b" for key: 3 PASS Got "c" for key: 4 PASS Got "d" for key: -10 PASS Got "e" for key: 5 PASS Got "f" for key: 6.00001 PASS Got "g" for key: 7 PASS Got "f" for key: 8.9999 PASS Got "g" for key: 9 PASS Got "h" for key: "foo" PASS Got "i" for key: 10 PASS Got "j" for key: [1000] PASS Got "k" for key: 11 db.close() Verify that aborting a transaction resets the key generator state. indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB; indexedDB.deleteDatabase(dbname) indexedDB.open(dbname) trans1 = db.transaction(['store'], 'readwrite') store_t1 = trans1.objectStore('store') store_t1.put('a') request = store.get(1) store_t1.put('b') request = store.get(2) PASS Got "a" for key: 1 PASS Got "b" for key: 2 aborting... trans1.abort() aborted! trans2 = db.transaction(['store'], 'readwrite') store_t2 = trans2.objectStore('store') store_t2.put('c') request = store.get(1) store_t2.put('d') request = store.get(2) PASS Got "c" for key: 1 PASS Got "d" for key: 2 db.close() Verify that keys above 2^53 result in errors. indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB; indexedDB.deleteDatabase(dbname) indexedDB.open(dbname) trans1 = db.transaction(['store'], 'readwrite') store_t1 = trans1.objectStore('store') store_t1.put('a') request = store.get(1) store_t1.put('b', 9007199254740992) request = store.get(9007199254740992) store_t1.put('c') store_t1.put('d', 2) request = store.get(2) PASS Got "a" for key: 1 PASS Got "b" for key: 9007199254740992 Error event fired auto-incrementing past 2^53 (as expected) PASS event.target.error.name is 'ConstraintError' event.preventDefault() PASS Got "d" for key: 2 db.close() Verify that keys above 2^64 result in errors. indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB; indexedDB.deleteDatabase(dbname) indexedDB.open(dbname) trans1 = db.transaction(['store'], 'readwrite') store_t1 = trans1.objectStore('store') store_t1.put('a') request = store.get(1) store_t1.put('b', Math.pow(2, 64)) request = store.get(18446744073709552000) store_t1.put('c') store_t1.put('d', 2) request = store.get(2) PASS Got "a" for key: 1 PASS Got "b" for key: 18446744073709552000 Error event fired auto-incrementing past 2^64 (as expected) PASS event.target.error.name is 'ConstraintError' event.preventDefault() PASS Got "d" for key: 2 db.close() Ensure key generator state is maintained across connections: indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB; indexedDB.deleteDatabase(dbname) indexedDB.open(dbname) db.createObjectStore('store', {autoIncrement: true}) trans = db.transaction('store', 'readwrite') request = trans.objectStore('store').put('value1') PASS request.result is 1 trans.objectStore('store').clear() db.close() request = indexedDB.open(dbname) db = request.result trans = db.transaction('store', 'readwrite') request = trans.objectStore('store').put('value2') PASS request.result is 2 PASS successfullyParsed is true TEST COMPLETE