| OLD | NEW |
| (Empty) |
| 1 <!DOCTYPE html> | |
| 2 <meta charset="utf-8"> | |
| 3 <meta name="timeout" content="long"> | |
| 4 <title>IDBCursor.continuePrimaryKey() - Exception Orders </title> | |
| 5 <link rel="author" title="Mozilla" href="https://www.mozilla.org"> | |
| 6 <link rel="help" href="http://w3c.github.io/IndexedDB/#dom-idbcursor-continuepri
marykey"> | |
| 7 <script src="/resources/testharness.js"></script> | |
| 8 <script src="/resources/testharnessreport.js"></script> | |
| 9 <script src="support.js"></script> | |
| 10 | |
| 11 <script> | |
| 12 function setup_test_store(db) { | |
| 13 var records = [ { iKey: "A", pKey: 1 }, | |
| 14 { iKey: "A", pKey: 2 }, | |
| 15 { iKey: "A", pKey: 3 }, | |
| 16 { iKey: "A", pKey: 4 }, | |
| 17 { iKey: "B", pKey: 5 }, | |
| 18 { iKey: "B", pKey: 6 }, | |
| 19 { iKey: "B", pKey: 7 }, | |
| 20 { iKey: "C", pKey: 8 }, | |
| 21 { iKey: "C", pKey: 9 }, | |
| 22 { iKey: "D", pKey: 10 } ]; | |
| 23 | |
| 24 var store = db.createObjectStore("test", { keyPath: "pKey" }); | |
| 25 var index = store.createIndex("idx", "iKey"); | |
| 26 | |
| 27 for(var i = 0; i < records.length; i++) { | |
| 28 store.add(records[i]); | |
| 29 } | |
| 30 | |
| 31 return store; | |
| 32 } | |
| 33 | |
| 34 indexeddb_test( | |
| 35 function(t, db, txn) { | |
| 36 var store = setup_test_store(db); | |
| 37 var index = store.index("idx"); | |
| 38 var cursor_rq = index.openCursor(); | |
| 39 var cursor; | |
| 40 | |
| 41 cursor_rq.onerror = t.unreached_func('openCursor should succeed'); | |
| 42 cursor_rq.onsuccess = t.step_func(function(e) { | |
| 43 cursor = e.target.result; | |
| 44 assert_true(!!cursor, "acquire cursor"); | |
| 45 | |
| 46 store.deleteIndex("idx"); | |
| 47 }); | |
| 48 txn.oncomplete = function() { | |
| 49 assert_throws("TransactionInactiveError", function() { | |
| 50 cursor.continuePrimaryKey("A", 4); | |
| 51 }, "transaction-state check should precede deletion check"); | |
| 52 t.done(); | |
| 53 }; | |
| 54 }, | |
| 55 null, | |
| 56 "TransactionInactiveError v.s. InvalidStateError(deleted index)" | |
| 57 ); | |
| 58 | |
| 59 indexeddb_test( | |
| 60 function(t, db, txn) { | |
| 61 var store = setup_test_store(db); | |
| 62 var cursor_rq = store.openCursor(); | |
| 63 var cursor; | |
| 64 | |
| 65 cursor_rq.onerror = t.unreached_func('openCursor should succeed'); | |
| 66 cursor_rq.onsuccess = t.step_func(function(e) { | |
| 67 cursor = e.target.result; | |
| 68 assert_true(!!cursor, "acquire cursor"); | |
| 69 | |
| 70 db.deleteObjectStore("test"); | |
| 71 | |
| 72 assert_throws("InvalidStateError", function() { | |
| 73 cursor.continuePrimaryKey("A", 4); | |
| 74 }, "deletion check should precede index source check"); | |
| 75 t.done(); | |
| 76 }); | |
| 77 }, | |
| 78 null, | |
| 79 "InvalidStateError(deleted source) v.s. InvalidAccessError(incorrect source)
" | |
| 80 ); | |
| 81 | |
| 82 indexeddb_test( | |
| 83 function(t, db, txn) { | |
| 84 var store = setup_test_store(db); | |
| 85 var index = store.index("idx"); | |
| 86 var cursor_rq = index.openCursor(null, "nextunique"); | |
| 87 var cursor; | |
| 88 | |
| 89 cursor_rq.onerror = t.unreached_func('openCursor should succeed'); | |
| 90 cursor_rq.onsuccess = t.step_func(function(e) { | |
| 91 cursor = e.target.result; | |
| 92 assert_true(!!cursor, "acquire cursor"); | |
| 93 | |
| 94 store.deleteIndex("idx"); | |
| 95 | |
| 96 assert_throws("InvalidStateError", function() { | |
| 97 cursor.continuePrimaryKey("A", 4); | |
| 98 }, "deletion check should precede cursor direction check"); | |
| 99 t.done(); | |
| 100 }); | |
| 101 }, | |
| 102 null, | |
| 103 "InvalidStateError(deleted source) v.s. InvalidAccessError(incorrect directi
on)" | |
| 104 ); | |
| 105 | |
| 106 indexeddb_test( | |
| 107 function(t, db, txn) { | |
| 108 var store = db.createObjectStore("test", {keyPath:"pKey"}); | |
| 109 var index = store.createIndex("idx", "iKey"); | |
| 110 | |
| 111 store.add({ iKey: "A", pKey: 1 }); | |
| 112 | |
| 113 var cursor_rq = index.openCursor(null, "nextunique"); | |
| 114 var cursor; | |
| 115 | |
| 116 cursor_rq.onerror = t.unreached_func('openCursor should succeed'); | |
| 117 cursor_rq.onsuccess = t.step_func(function(e) { | |
| 118 if (e.target.result) { | |
| 119 cursor = e.target.result; | |
| 120 cursor.continue(); | |
| 121 return; | |
| 122 } | |
| 123 | |
| 124 assert_throws("InvalidAccessError", function() { | |
| 125 cursor.continuePrimaryKey("A", 4); | |
| 126 }, "direction check should precede got_value_flag check"); | |
| 127 t.done(); | |
| 128 }); | |
| 129 }, | |
| 130 null, | |
| 131 "InvalidAccessError(incorrect direction) v.s. InvalidStateError(iteration co
mplete)" | |
| 132 ); | |
| 133 | |
| 134 indexeddb_test( | |
| 135 function(t, db, txn) { | |
| 136 var store = db.createObjectStore("test", {keyPath:"pKey"}); | |
| 137 var index = store.createIndex("idx", "iKey"); | |
| 138 | |
| 139 store.add({ iKey: "A", pKey: 1 }); | |
| 140 | |
| 141 var cursor_rq = index.openCursor(null, "nextunique"); | |
| 142 var cursor; | |
| 143 | |
| 144 cursor_rq.onerror = t.unreached_func('openCursor should succeed'); | |
| 145 cursor_rq.onsuccess = t.step_func(function(e) { | |
| 146 if (!cursor) { | |
| 147 cursor = e.target.result; | |
| 148 assert_true(!!cursor, "acquire cursor"); | |
| 149 | |
| 150 cursor.continue(); | |
| 151 | |
| 152 assert_throws("InvalidAccessError", function() { | |
| 153 cursor.continuePrimaryKey("A", 4); | |
| 154 }, "direction check should precede iteration ongoing check"); | |
| 155 t.done(); | |
| 156 } | |
| 157 }); | |
| 158 }, | |
| 159 null, | |
| 160 "InvalidAccessError(incorrect direction) v.s. InvalidStateError(iteration on
going)" | |
| 161 ); | |
| 162 | |
| 163 indexeddb_test( | |
| 164 function(t, db, txn) { | |
| 165 var store = setup_test_store(db); | |
| 166 var cursor_rq = store.openCursor(); | |
| 167 var cursor; | |
| 168 | |
| 169 cursor_rq.onerror = t.unreached_func('openCursor should succeed'); | |
| 170 cursor_rq.onsuccess = t.step_func(function(e) { | |
| 171 if (!cursor) { | |
| 172 cursor = e.target.result; | |
| 173 assert_true(!!cursor, "acquire cursor"); | |
| 174 | |
| 175 cursor.continue(); | |
| 176 | |
| 177 assert_throws("InvalidAccessError", function() { | |
| 178 cursor.continuePrimaryKey("A", 4); | |
| 179 }, "index source check should precede iteration ongoing check"); | |
| 180 t.done(); | |
| 181 } | |
| 182 }); | |
| 183 }, | |
| 184 null, | |
| 185 "InvalidAccessError(incorrect source) v.s. InvalidStateError(iteration ongoi
ng)" | |
| 186 ); | |
| 187 | |
| 188 indexeddb_test( | |
| 189 function(t, db, txn) { | |
| 190 var store = db.createObjectStore("test", {keyPath:"pKey"}); | |
| 191 | |
| 192 store.add({ iKey: "A", pKey: 1 }); | |
| 193 | |
| 194 var cursor_rq = store.openCursor(); | |
| 195 var cursor; | |
| 196 | |
| 197 cursor_rq.onerror = t.unreached_func('openCursor should succeed'); | |
| 198 cursor_rq.onsuccess = t.step_func(function(e) { | |
| 199 if (e.target.result) { | |
| 200 cursor = e.target.result; | |
| 201 cursor.continue(); | |
| 202 return; | |
| 203 } | |
| 204 | |
| 205 assert_throws("InvalidAccessError", function() { | |
| 206 cursor.continuePrimaryKey("A", 4); | |
| 207 }, "index source check should precede got_value_flag check"); | |
| 208 t.done(); | |
| 209 }); | |
| 210 }, | |
| 211 null, | |
| 212 "InvalidAccessError(incorrect source) v.s. InvalidStateError(iteration compl
ete)" | |
| 213 ); | |
| 214 | |
| 215 indexeddb_test( | |
| 216 function(t, db, txn) { | |
| 217 var store = setup_test_store(db); | |
| 218 var index = store.index("idx"); | |
| 219 var cursor_rq = index.openCursor(); | |
| 220 var cursor; | |
| 221 | |
| 222 cursor_rq.onerror = t.unreached_func('openCursor should succeed'); | |
| 223 cursor_rq.onsuccess = t.step_func(function(e) { | |
| 224 if (!cursor) { | |
| 225 cursor = e.target.result; | |
| 226 assert_true(!!cursor, "acquire cursor"); | |
| 227 | |
| 228 cursor.continue(); | |
| 229 | |
| 230 assert_throws("InvalidStateError", function() { | |
| 231 cursor.continuePrimaryKey(null, 4); | |
| 232 }, "iteration ongoing check should precede unset key check"); | |
| 233 t.done(); | |
| 234 } | |
| 235 }); | |
| 236 }, | |
| 237 null, | |
| 238 "InvalidStateError(iteration ongoing) v.s. DataError(unset key)" | |
| 239 ); | |
| 240 | |
| 241 indexeddb_test( | |
| 242 function(t, db, txn) { | |
| 243 var store = db.createObjectStore("test", {keyPath:"pKey"}); | |
| 244 var index = store.createIndex("idx", "iKey"); | |
| 245 | |
| 246 store.add({ iKey: "A", pKey: 1 }); | |
| 247 | |
| 248 var cursor_rq = index.openCursor(); | |
| 249 var cursor; | |
| 250 | |
| 251 cursor_rq.onerror = t.unreached_func('openCursor should succeed'); | |
| 252 cursor_rq.onsuccess = t.step_func(function(e) { | |
| 253 if (e.target.result) { | |
| 254 cursor = e.target.result; | |
| 255 cursor.continue(); | |
| 256 return; | |
| 257 } | |
| 258 | |
| 259 assert_throws("InvalidStateError", function() { | |
| 260 cursor.continuePrimaryKey(null, 4); | |
| 261 }, "got_value_flag check should precede unset key check"); | |
| 262 t.done(); | |
| 263 }); | |
| 264 }, | |
| 265 null, | |
| 266 "InvalidStateError(iteration complete) v.s. DataError(unset key)" | |
| 267 ); | |
| 268 | |
| 269 indexeddb_test( | |
| 270 function(t, db, txn) { | |
| 271 var store = setup_test_store(db); | |
| 272 var index = store.index("idx"); | |
| 273 var cursor_rq = index.openCursor(); | |
| 274 var cursor; | |
| 275 | |
| 276 cursor_rq.onerror = t.unreached_func('openCursor should succeed'); | |
| 277 cursor_rq.onsuccess = t.step_func(function(e) { | |
| 278 cursor = e.target.result; | |
| 279 assert_true(!!cursor, "acquire cursor"); | |
| 280 | |
| 281 assert_throws("DataError", function() { | |
| 282 cursor.continuePrimaryKey(null, 4); | |
| 283 }, "DataError is expected if key is unset."); | |
| 284 t.done(); | |
| 285 }); | |
| 286 }, | |
| 287 null, | |
| 288 "DataError(unset key)" | |
| 289 ); | |
| 290 | |
| 291 indexeddb_test( | |
| 292 function(t, db, txn) { | |
| 293 var store = setup_test_store(db); | |
| 294 var index = store.index("idx"); | |
| 295 var cursor_rq = index.openCursor(); | |
| 296 var cursor; | |
| 297 | |
| 298 cursor_rq.onerror = t.unreached_func('openCursor should succeed'); | |
| 299 cursor_rq.onsuccess = t.step_func(function(e) { | |
| 300 cursor = e.target.result; | |
| 301 assert_true(!!cursor, "acquire cursor"); | |
| 302 | |
| 303 assert_throws("DataError", function() { | |
| 304 cursor.continuePrimaryKey("A", null); | |
| 305 }, "DataError is expected if primary key is unset."); | |
| 306 t.done(); | |
| 307 }); | |
| 308 }, | |
| 309 null, | |
| 310 "DataError(unset primary key)" | |
| 311 ); | |
| 312 | |
| 313 indexeddb_test( | |
| 314 function(t, db, txn) { | |
| 315 var store = setup_test_store(db); | |
| 316 var index = store.index("idx"); | |
| 317 var cursor_rq = index.openCursor(IDBKeyRange.lowerBound("B")); | |
| 318 var cursor; | |
| 319 | |
| 320 cursor_rq.onerror = t.unreached_func('openCursor should succeed'); | |
| 321 cursor_rq.onsuccess = t.step_func(function(e) { | |
| 322 cursor = e.target.result; | |
| 323 assert_true(!!cursor, "acquire cursor"); | |
| 324 | |
| 325 assert_equals(cursor.key, "B", "expected key"); | |
| 326 assert_equals(cursor.primaryKey, 5, "expected primary key"); | |
| 327 | |
| 328 assert_throws("DataError", function() { | |
| 329 cursor.continuePrimaryKey("A", 6); | |
| 330 }, "DataError is expected if key is lower then current one."); | |
| 331 | |
| 332 assert_throws("DataError", function() { | |
| 333 cursor.continuePrimaryKey("B", 5); | |
| 334 }, "DataError is expected if primary key is equal to current one."); | |
| 335 | |
| 336 assert_throws("DataError", function() { | |
| 337 cursor.continuePrimaryKey("B", 4); | |
| 338 }, "DataError is expected if primary key is lower than current one."
); | |
| 339 | |
| 340 t.done(); | |
| 341 }); | |
| 342 }, | |
| 343 null, | |
| 344 "DataError(keys are lower then current one) in 'next' direction" | |
| 345 ); | |
| 346 | |
| 347 indexeddb_test( | |
| 348 function(t, db, txn) { | |
| 349 var store = setup_test_store(db); | |
| 350 var index = store.index("idx"); | |
| 351 var cursor_rq = index.openCursor(IDBKeyRange.upperBound("B"), "prev"); | |
| 352 var cursor; | |
| 353 | |
| 354 cursor_rq.onerror = t.unreached_func('openCursor should succeed'); | |
| 355 cursor_rq.onsuccess = t.step_func(function(e) { | |
| 356 cursor = e.target.result; | |
| 357 assert_true(!!cursor, "acquire cursor"); | |
| 358 | |
| 359 assert_equals(cursor.key, "B", "expected key"); | |
| 360 assert_equals(cursor.primaryKey, 7, "expected primary key"); | |
| 361 | |
| 362 assert_throws("DataError", function() { | |
| 363 cursor.continuePrimaryKey("C", 6); | |
| 364 }, "DataError is expected if key is larger then current one."); | |
| 365 | |
| 366 assert_throws("DataError", function() { | |
| 367 cursor.continuePrimaryKey("B", 7); | |
| 368 }, "DataError is expected if primary key is equal to current one."); | |
| 369 | |
| 370 assert_throws("DataError", function() { | |
| 371 cursor.continuePrimaryKey("B", 8); | |
| 372 }, "DataError is expected if primary key is larger than current one.
"); | |
| 373 | |
| 374 t.done(); | |
| 375 }); | |
| 376 }, | |
| 377 null, | |
| 378 "DataError(keys are larger then current one) in 'prev' direction" | |
| 379 ); | |
| 380 </script> | |
| 381 | |
| 382 <div id="log"></div> | |
| OLD | NEW |