idbcursor-continue.any.js (5767B)
1 // META: global=window,worker 2 // META: title=IDBCursor.continue() 3 // META: script=resources/support.js 4 5 // Spec: https://w3c.github.io/IndexedDB/#dom-idbcursor-continue 6 7 'use strict'; 8 9 const store = [ 10 { value: 'cupcake', key: 5 }, 11 { value: 'pancake', key: 3 }, 12 { value: 'pie', key: 1 }, 13 { value: 'pie', key: 4 }, 14 { value: 'taco', key: 2 } 15 ]; 16 17 function upgrade_func(t, db, tx) { 18 let os; 19 let i; 20 os = db.createObjectStore('test'); 21 os.createIndex('index', ''); 22 23 for (i = 0; i < store.length; i++) 24 os.add(store[i].value, store[i].key); 25 } 26 27 indexeddb_test(upgrade_func, function(t, db) { 28 let count = 0; 29 const rq = db.transaction('test', 'readonly') 30 .objectStore('test') 31 .index('index') 32 .openCursor(); 33 34 rq.onsuccess = t.step_func((e) => { 35 if (!e.target.result) { 36 assert_equals(count, 5, 'count'); 37 t.done(); 38 return; 39 } 40 const cursor = e.target.result; 41 42 assert_equals(cursor.value, store[count].value); 43 assert_equals(cursor.primaryKey, store[count].key); 44 45 cursor.continue(); 46 47 count++; 48 }); 49 rq.onerror = t.unreached_func('unexpected error'); 50 }, 'IDBCursor.continue() - continues'); 51 52 53 indexeddb_test(upgrade_func, function(t, db) { 54 let count = 0; 55 const rq = db.transaction('test', 'readonly') 56 .objectStore('test') 57 .index('index') 58 .openCursor(); 59 60 rq.onsuccess = t.step_func((e) => { 61 if (!e.target.result) { 62 assert_equals(count, 3, 'count'); 63 t.done(); 64 return; 65 } 66 const cursor = e.target.result; 67 68 switch (count) { 69 case 0: 70 assert_equals(cursor.value, 'cupcake'); 71 assert_equals(cursor.primaryKey, 5); 72 cursor.continue('pie'); 73 break; 74 75 case 1: 76 assert_equals(cursor.value, 'pie'); 77 assert_equals(cursor.primaryKey, 1); 78 cursor.continue('taco'); 79 break; 80 81 case 2: 82 assert_equals(cursor.value, 'taco'); 83 assert_equals(cursor.primaryKey, 2); 84 cursor.continue(); 85 break; 86 87 default: 88 assert_unreached('Unexpected count: ' + count); 89 } 90 91 count++; 92 }); 93 rq.onerror = t.unreached_func('unexpected error'); 94 }, 'IDBCursor.continue() - with given key'); 95 96 97 indexeddb_test(upgrade_func, function(t, db) { 98 let count = 0; 99 const rq = db.transaction('test', 'readonly') 100 .objectStore('test') 101 .index('index') 102 .openCursor(); 103 104 rq.onsuccess = t.step_func((e) => { 105 if (!e.target.result) { 106 assert_equals(count, 1, 'count'); 107 t.done(); 108 return; 109 } 110 const cursor = e.target.result; 111 112 switch (count) { 113 case 0: 114 assert_equals(cursor.value, 'cupcake'); 115 assert_equals(cursor.primaryKey, 5); 116 break; 117 118 default: 119 assert_unreached('Unexpected count: ' + count); 120 } 121 122 count++; 123 cursor.continue([]); // Arrays are always bigger than strings 124 }); 125 rq.onerror = t.unreached_func('unexpected error2'); 126 }, 'IDBCursor.continue() - skip far forward'); 127 128 129 indexeddb_test(upgrade_func, function(t, db) { 130 let count = 0; 131 const rq = db.transaction('test', 'readonly') 132 .objectStore('test') 133 .index('index') 134 .openCursor(IDBKeyRange.lowerBound('cupcake', true)); 135 136 rq.onsuccess = t.step_func((e) => { 137 if (!e.target.result) { 138 assert_equals(count, 2, 'count'); 139 t.done(); 140 return; 141 } 142 const cursor = e.target.result; 143 144 switch (count) { 145 case 0: 146 assert_equals(cursor.value, 'pancake'); 147 assert_equals(cursor.primaryKey, 3); 148 cursor.continue('pie'); 149 break; 150 151 case 1: 152 assert_equals(cursor.value, 'pie'); 153 assert_equals(cursor.primaryKey, 1); 154 cursor.continue('zzz'); 155 break; 156 157 default: 158 assert_unreached('Unexpected count: ' + count); 159 } 160 161 count++; 162 }); 163 rq.onerror = t.unreached_func('unexpected error1'); 164 }, 'IDBCursor.continue() - within range'); 165 166 167 indexeddb_test(upgrade_func, function(t, db) { 168 let count = 0; 169 const rq = db.transaction('test', 'readonly') 170 .objectStore('test') 171 .index('index') 172 .openCursor('pancake'); 173 174 rq.onsuccess = t.step_func((e) => { 175 if (!e.target.result) { 176 assert_equals(count, 1, 'count'); 177 t.done(); 178 return; 179 } 180 const cursor = e.target.result; 181 182 switch (count) { 183 case 0: 184 assert_equals(cursor.value, 'pancake'); 185 assert_equals(cursor.primaryKey, 3); 186 cursor.continue('pie'); 187 break; 188 189 default: 190 assert_unreached('Unexpected count: ' + count); 191 } 192 193 count++; 194 }); 195 rq.onerror = t.unreached_func('unexpected error1'); 196 }, 'IDBCursor.continue() - within single key range'); 197 198 indexeddb_test(upgrade_func, function(t, db) { 199 let count = 0; 200 const rq = db.transaction('test', 'readonly') 201 .objectStore('test') 202 .index('index') 203 .openCursor('pie'); 204 205 rq.onsuccess = t.step_func((e) => { 206 if (!e.target.result) { 207 assert_equals(count, 2, 'count'); 208 t.done(); 209 return; 210 } 211 const cursor = e.target.result; 212 213 switch (count) { 214 case 0: 215 assert_equals(cursor.value, 'pie'); 216 assert_equals(cursor.primaryKey, 1); 217 cursor.continue(); 218 break; 219 220 case 1: 221 assert_equals(cursor.value, 'pie'); 222 assert_equals(cursor.primaryKey, 4); 223 cursor.continue(); 224 break; 225 226 default: 227 assert_unreached('Unexpected count: ' + count); 228 } 229 230 count++; 231 }); 232 rq.onerror = t.unreached_func('unexpected error1'); 233 }, 'IDBCursor.continue() - within single key range, with several results');