| // META: global=window,worker |
| // META: title=IDBCursor direction - index with keyrange |
| // META: script=resources/support.js |
| |
| // Spec: https://w3c.github.io/IndexedDB/#cursor-iteration-operation |
| |
| 'use strict'; |
| |
| let records = [1337, 'Alice', 'Bob', 'Bob', 'Greg', 'Åke', ['Anne']]; |
| let cases = [ |
| {dir: 'next', expect: ['Alice:1', 'Bob:2', 'Bob:3', 'Greg:4']}, |
| {dir: 'prev', expect: ['Greg:4', 'Bob:3', 'Bob:2', 'Alice:1']}, |
| {dir: 'nextunique', expect: ['Alice:1', 'Bob:2', 'Greg:4']}, |
| {dir: 'prevunique', expect: ['Greg:4', 'Bob:2', 'Alice:1']} |
| ]; |
| |
| cases.forEach(function(testcase) { |
| let dir = testcase.dir; |
| let expect = testcase.expect; |
| indexeddb_test( |
| function(t, db, tx) { |
| let objStore = db.createObjectStore('test'); |
| objStore.createIndex('idx', 'name'); |
| |
| for (let i = 0; i < records.length; i++) { |
| objStore.add({name: records[i]}, i); |
| } |
| }, |
| function(t, db) { |
| let count = 0; |
| let rq = db.transaction('test', 'readonly') |
| .objectStore('test') |
| .index('idx') |
| .openCursor(IDBKeyRange.bound('AA', 'ZZ'), dir); |
| rq.onsuccess = t.step_func(function(e) { |
| let cursor = e.target.result; |
| if (!cursor) { |
| assert_equals(count, expect.length, 'cursor runs'); |
| t.done(); |
| return; |
| } |
| assert_equals( |
| cursor.value.name + ':' + cursor.primaryKey, expect[count], |
| 'cursor.value'); |
| count++; |
| cursor.continue(); |
| }); |
| rq.onerror = t.step_func(function(e) { |
| e.preventDefault(); |
| e.stopPropagation(); |
| assert_unreached('rq.onerror - ' + e.message); |
| }); |
| }, |
| 'IDBCursor direction - index with keyrange - ' + dir); |
| }); |