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 |