Test IndexedDB keys ordering and readback from cursors. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". dbname = "cursor-reverse-bug.html" indexedDB.deleteDatabase(dbname) indexedDB.open(dbname) store = db.createObjectStore('store') store.createIndex('index', '') populating store... trans = db.transaction('store', 'readwrite') store = trans.objectStore('store'); store.put(1, 1) store.put(2, 2) store.put(3, 3) testCursor() trans = db.transaction('store', 'readonly') store = trans.objectStore('store'); index = store.index('index'); upperBound: 7 open: false expected: 3 storeReq = store.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev') indexReq = index.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev') indexKeyReq = index.openKeyCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev') cursor = event.target.result PASS cursor.key is test.expected PASS cursor.value is test.expected PASS cursor.primaryKey is test.expected cursor = event.target.result PASS cursor.key is test.expected PASS cursor.value is test.expected PASS cursor.primaryKey is test.expected cursor = event.target.result PASS cursor.key is test.expected PASS cursor.primaryKey is test.expected testCursor() trans = db.transaction('store', 'readonly') store = trans.objectStore('store'); index = store.index('index'); upperBound: 7 open: true expected: 3 storeReq = store.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev') indexReq = index.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev') indexKeyReq = index.openKeyCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev') cursor = event.target.result PASS cursor.key is test.expected PASS cursor.value is test.expected PASS cursor.primaryKey is test.expected cursor = event.target.result PASS cursor.key is test.expected PASS cursor.value is test.expected PASS cursor.primaryKey is test.expected cursor = event.target.result PASS cursor.key is test.expected PASS cursor.primaryKey is test.expected testCursor() trans = db.transaction('store', 'readonly') store = trans.objectStore('store'); index = store.index('index'); upperBound: 3 open: false expected: 3 storeReq = store.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev') indexReq = index.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev') indexKeyReq = index.openKeyCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev') cursor = event.target.result PASS cursor.key is test.expected PASS cursor.value is test.expected PASS cursor.primaryKey is test.expected cursor = event.target.result PASS cursor.key is test.expected PASS cursor.value is test.expected PASS cursor.primaryKey is test.expected cursor = event.target.result PASS cursor.key is test.expected PASS cursor.primaryKey is test.expected testCursor() trans = db.transaction('store', 'readonly') store = trans.objectStore('store'); index = store.index('index'); upperBound: 3 open: true expected: 2 storeReq = store.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev') indexReq = index.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev') indexKeyReq = index.openKeyCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev') cursor = event.target.result PASS cursor.key is test.expected PASS cursor.value is test.expected PASS cursor.primaryKey is test.expected cursor = event.target.result PASS cursor.key is test.expected PASS cursor.value is test.expected PASS cursor.primaryKey is test.expected cursor = event.target.result PASS cursor.key is test.expected PASS cursor.primaryKey is test.expected testCursor() No more tests. PASS successfullyParsed is true TEST COMPLETE