idbcursor_iterating.any.js (2771B)
1 // META: global=window,worker 2 // META: title=IDBCursor.continue() - object store 3 // META: script=resources/support.js 4 5 'use strict'; 6 7 async_test(t => { 8 let db; 9 let count = 0; 10 11 let open_rq = createdb(t); 12 open_rq.onupgradeneeded = function (e) { 13 db = e.target.result; 14 t.add_cleanup(function () { db.close(); indexedDB.deleteDatabase(db.name); }); 15 let objStore = db.createObjectStore("test", { keyPath: "key" }); 16 17 for (let i = 0; i < 500; i++) 18 objStore.add({ key: i, val: "val_" + i }); 19 20 let rq = objStore.add({ key: 500, val: "val_500" }); 21 22 rq.onsuccess = t.step_func(function () { 23 for (let i = 999; i > 500; i--) 24 objStore.add({ key: i, val: "val_" + i }); 25 }); 26 27 objStore.createIndex('index', ['key', 'val']); 28 }; 29 30 open_rq.onsuccess = function (e) { 31 let cursor_rq = db.transaction("test", "readwrite") 32 .objectStore("test") 33 .openCursor(); 34 35 cursor_rq.onsuccess = t.step_func(function (e) { 36 let cursor = e.target.result, 37 store = e.target.source; 38 if (!cursor) { 39 assert_equals(count, 997, "cursor run count"); 40 41 let rq = e.target.source.count(); 42 rq.onsuccess = t.step_func(function (e) { 43 assert_equals(e.target.result, 995, "object count"); 44 t.done(); 45 }); 46 return; 47 } 48 49 switch (cursor.key) { 50 case 10: 51 assert_equals(count, cursor.key, "count"); 52 store.delete(11); 53 break; 54 55 case 12: 56 case 499: 57 case 500: 58 case 501: 59 assert_equals(count, cursor.key - 1, "count"); 60 break; 61 62 // Delete the next key 63 case 510: 64 store.delete(511); 65 break; 66 67 // Delete randomly 68 case 512: 69 store.delete(611); 70 store.delete(499); 71 store.delete(500); 72 break; 73 74 // Delete and add a new key 75 case 520: 76 store.delete(521); 77 store.add({ key: 521, val: "new" }); 78 break; 79 80 case 521: 81 assert_equals(cursor.value.val, "new"); 82 break; 83 84 // We should only be here once although we're basically making the index 85 // "heavier" with its new key. 86 case 530: 87 assert_equals(cursor.value.val, "val_530"); 88 cursor.update({ key: 530, val: "val_531" }) 89 90 store.get(530).onsuccess = t.step_func(function (e) { 91 assert_equals(e.target.result.val, "val_531"); 92 }); 93 break; 94 95 // Shouldn't happen. 96 case 11: 97 case 511: 98 case 611: 99 assert_unreached(cursor.key + " should be deleted and never run"); 100 break; 101 } 102 103 cursor.continue(); 104 count++; 105 }); 106 }; 107 }, "Iterate and Delete elements");