idb-partitioned-coverage-iframe.html (12150B)
1 <!doctype html> 2 <meta charset=utf-8> 3 <script src="/resources/testharness.js"></script> 4 <script src="support.js"></script> 5 <!-- TODO(crbug.com/1218100): We should verify the full IDB surface area inside 6 an iframe, but for now a single test with an assortment of verifications is 7 sufficient to test third party storage partitioning didn't break anything. --> 8 9 <!-- This block is from delete-request-queue.htm --> 10 <script> 11 let saw; 12 indexeddb_test( 13 (t, db) => { 14 saw = expect(t, ['delete1', 'delete2']); 15 let r = indexedDB.deleteDatabase(db.name); 16 r.onerror = t.unreached_func('delete should succeed'); 17 r.onsuccess = t.step_func(e => saw('delete1')); 18 }, 19 (t, db) => { 20 let r = indexedDB.deleteDatabase(db.name); 21 r.onerror = t.unreached_func('delete should succeed'); 22 r.onsuccess = t.step_func(e => saw('delete2')); 23 24 db.close(); 25 }, 26 'Deletes are processed in order'); 27 </script> 28 29 <!-- This block is from idbcursor-advance-continue-async.htm --> 30 <script> 31 function upgrade_func(t, db, tx) { 32 var objStore = db.createObjectStore("test"); 33 objStore.createIndex("index", ""); 34 35 objStore.add("data", 1); 36 objStore.add("data2", 2); 37 } 38 39 indexeddb_test( 40 upgrade_func, 41 function(t, db) { 42 var count = 0; 43 var rq = db.transaction("test", "readonly").objectStore("test").openCursor(); 44 45 rq.onsuccess = t.step_func(function(e) { 46 if (!e.target.result) { 47 assert_equals(count, 2, 'count'); 48 t.done(); 49 return; 50 } 51 var cursor = e.target.result; 52 53 switch(count) { 54 case 0: 55 assert_equals(cursor.value, "data") 56 assert_equals(cursor.key, 1) 57 cursor.advance(1) 58 assert_equals(cursor.value, "data") 59 assert_equals(cursor.key, 1) 60 break 61 62 case 1: 63 assert_equals(cursor.value, "data2") 64 assert_equals(cursor.key, 2) 65 cursor.advance(1) 66 assert_equals(cursor.value, "data2") 67 assert_equals(cursor.key, 2) 68 break 69 70 default: 71 assert_unreached("Unexpected count: " + count) 72 } 73 74 count++; 75 }); 76 rq.onerror = t.unreached_func("unexpected error") 77 }, 78 document.title + " - advance" 79 ); 80 81 indexeddb_test( 82 upgrade_func, 83 function(t, db) { 84 var count = 0; 85 var rq = db.transaction("test", "readonly").objectStore("test").index("index").openCursor(); 86 87 rq.onsuccess = t.step_func(function(e) { 88 if (!e.target.result) { 89 assert_equals(count, 2, 'count'); 90 t.done(); 91 return; 92 } 93 var cursor = e.target.result; 94 95 switch(count) { 96 case 0: 97 assert_equals(cursor.value, "data") 98 assert_equals(cursor.key, "data") 99 assert_equals(cursor.primaryKey, 1) 100 cursor.continue("data2") 101 assert_equals(cursor.value, "data") 102 assert_equals(cursor.key, "data") 103 assert_equals(cursor.primaryKey, 1) 104 break 105 106 case 1: 107 assert_equals(cursor.value, "data2") 108 assert_equals(cursor.key, "data2") 109 assert_equals(cursor.primaryKey, 2) 110 cursor.continue() 111 assert_equals(cursor.value, "data2") 112 assert_equals(cursor.key, "data2") 113 assert_equals(cursor.primaryKey, 2) 114 break 115 116 default: 117 assert_unreached("Unexpected count: " + count) 118 } 119 120 count++; 121 }); 122 rq.onerror = t.unreached_func("unexpected error") 123 }, 124 document.title + " - continue" 125 ); 126 127 indexeddb_test( 128 upgrade_func, 129 function(t, db) { 130 var count = 0; 131 var rq = db.transaction("test", "readonly").objectStore("test").index("index").openCursor(); 132 133 rq.onsuccess = t.step_func(function(e) { 134 if (!e.target.result) { 135 assert_equals(count, 2, 'count'); 136 t.done(); 137 return; 138 } 139 var cursor = e.target.result; 140 cursor.advance(1) 141 142 switch(count) { 143 case 0: 144 assert_equals(cursor.value, "data") 145 assert_equals(cursor.key, "data") 146 assert_equals(cursor.primaryKey, 1) 147 break 148 149 case 1: 150 assert_equals(cursor.value, "data2") 151 assert_equals(cursor.key, "data2") 152 assert_equals(cursor.primaryKey, 2) 153 break 154 155 default: 156 assert_unreached("Unexpected count: " + count) 157 } 158 159 count++; 160 }); 161 rq.onerror = t.unreached_func("unexpected error") 162 }, 163 document.title + " - fresh advance still async" 164 ); 165 166 indexeddb_test( 167 upgrade_func, 168 function(t, db) { 169 var count = 0; 170 var rq = db.transaction("test", "readonly").objectStore("test").openCursor(); 171 172 rq.onsuccess = t.step_func(function(e) { 173 if (!e.target.result) { 174 assert_equals(count, 2, 'count'); 175 t.done(); 176 return; 177 } 178 var cursor = e.target.result; 179 cursor.continue() 180 181 switch(count) { 182 case 0: 183 assert_equals(cursor.value, "data") 184 assert_equals(cursor.key, 1) 185 break 186 187 case 1: 188 assert_equals(cursor.value, "data2") 189 assert_equals(cursor.key, 2) 190 break 191 192 default: 193 assert_unreached("Unexpected count: " + count) 194 } 195 196 count++; 197 }); 198 rq.onerror = t.unreached_func("unexpected error") 199 }, 200 document.title + " - fresh continue still async" 201 ); 202 </script> 203 <script src="nested-cloning-common.js"></script> 204 <script src="support-get-all.js"></script> 205 <script src="support-promises.js"></script> 206 <!-- Run the `IDBIndex::getAll()` tests. --> 207 <script src="/IndexedDB/idbindex_getAll.any.js"></script> 208 209 <!-- This block is from idbobjectstore_openKeyCursor.htm --> 210 <script> 211 function store_test(func, name) { 212 indexeddb_test( 213 function(t, db, tx) { 214 var store = db.createObjectStore("store"); 215 for (var i = 0; i < 10; ++i) { 216 store.put("value: " + i, i); 217 } 218 }, 219 function(t, db) { 220 var tx = db.transaction("store", "readonly"); 221 var store = tx.objectStore("store"); 222 func(t, db, tx, store); 223 }, name); 224 } 225 226 store_test(function(t, db, tx, store) { 227 var expected = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 228 var actual = []; 229 var request = store.openKeyCursor(); 230 request.onsuccess = t.step_func(function() { 231 var cursor = request.result; 232 if (!cursor) 233 return; 234 assert_equals(cursor.direction, "next"); 235 assert_false("value" in cursor); 236 assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0); 237 actual.push(cursor.key); 238 cursor.continue(); 239 }); 240 241 tx.onabort = t.unreached_func("transaction aborted"); 242 tx.oncomplete = t.step_func(function() { 243 assert_array_equals(expected, actual, "keys should match"); 244 t.done(); 245 }); 246 247 }, "IDBObjectStore.openKeyCursor() - forward iteration"); 248 249 store_test(function(t, db, tx, store) { 250 var expected = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]; 251 var actual = []; 252 var request = store.openKeyCursor(null, "prev"); 253 request.onsuccess = t.step_func(function() { 254 var cursor = request.result; 255 if (!cursor) 256 return; 257 assert_equals(cursor.direction, "prev"); 258 assert_false("value" in cursor); 259 assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0); 260 actual.push(cursor.key); 261 cursor.continue(); 262 }); 263 264 tx.onabort = t.unreached_func("transaction aborted"); 265 tx.oncomplete = t.step_func(function() { 266 assert_array_equals(expected, actual, "keys should match"); 267 t.done(); 268 }); 269 270 }, "IDBObjectStore.openKeyCursor() - reverse iteration"); 271 272 store_test(function(t, db, tx, store) { 273 var expected = [4, 5, 6]; 274 var actual = []; 275 var request = store.openKeyCursor(IDBKeyRange.bound(4, 6)); 276 request.onsuccess = t.step_func(function() { 277 var cursor = request.result; 278 if (!cursor) 279 return; 280 assert_equals(cursor.direction, "next"); 281 assert_false("value" in cursor); 282 assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0); 283 actual.push(cursor.key); 284 cursor.continue(); 285 }); 286 287 tx.onabort = t.unreached_func("transaction aborted"); 288 tx.oncomplete = t.step_func(function() { 289 assert_array_equals(expected, actual, "keys should match"); 290 t.done(); 291 }); 292 293 }, "IDBObjectStore.openKeyCursor() - forward iteration with range"); 294 295 store_test(function(t, db, tx, store) { 296 var expected = [6, 5, 4]; 297 var actual = []; 298 var request = store.openKeyCursor(IDBKeyRange.bound(4, 6), "prev"); 299 request.onsuccess = t.step_func(function() { 300 var cursor = request.result; 301 if (!cursor) 302 return; 303 assert_equals(cursor.direction, "prev"); 304 assert_false("value" in cursor); 305 assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0); 306 actual.push(cursor.key); 307 cursor.continue(); 308 }); 309 310 tx.onabort = t.unreached_func("transaction aborted"); 311 tx.oncomplete = t.step_func(function() { 312 assert_array_equals(expected, actual, "keys should match"); 313 t.done(); 314 }); 315 316 }, "IDBObjectStore.openKeyCursor() - reverse iteration with range"); 317 318 store_test(function(t, db, tx, store) { 319 assert_throws_dom("DataError", function() { store.openKeyCursor(NaN); }, 320 "openKeyCursor should throw on invalid number key"); 321 assert_throws_dom("DataError", function() { store.openKeyCursor(new Date(NaN)); }, 322 "openKeyCursor should throw on invalid date key"); 323 assert_throws_dom("DataError", function() { 324 var cycle = []; 325 cycle.push(cycle); 326 store.openKeyCursor(cycle); 327 }, "openKeyCursor should throw on invalid array key"); 328 assert_throws_dom("DataError", function() { store.openKeyCursor({}); }, 329 "openKeyCursor should throw on invalid key type"); 330 setTimeout(t.step_func(function() { 331 assert_throws_dom("TransactionInactiveError", function() { store.openKeyCursor(); }, 332 "openKeyCursor should throw if transaction is inactive"); 333 t.done(); 334 }), 0); 335 336 }, "IDBObjectStore.openKeyCursor() - invalid inputs"); 337 </script> 338 339 <!-- This block is from idbtransaction.htm --> 340 <script> 341 async_test(function(t) { 342 var dbname = "idbtransaction-" + document.location + t.name; 343 indexedDB.deleteDatabase(dbname); 344 var open_rq = indexedDB.open(dbname); 345 346 open_rq.onblocked = t.unreached_func('open_rq.onblocked'); 347 open_rq.onerror = t.unreached_func('open_rq.onerror'); 348 349 open_rq.onupgradeneeded = t.step_func(function(e) { 350 t.add_cleanup(function() { 351 open_rq.onerror = function(e) { 352 e.preventDefault(); 353 }; 354 open_rq.result.close(); 355 indexedDB.deleteDatabase(open_rq.result.name); 356 }); 357 358 assert_equals(e.target, open_rq, "e.target is reusing the same IDBOpenDBRequest"); 359 assert_equals(e.target.transaction, open_rq.transaction, "IDBOpenDBRequest.transaction"); 360 361 assert_true(e.target.transaction instanceof IDBTransaction, "transaction instanceof IDBTransaction"); 362 t.done(); 363 }); 364 365 }, document.title + " - request gotten by the handler"); 366 367 async_test(function(t) { 368 var dbname = "idbtransaction-" + document.location + t.name; 369 indexedDB.deleteDatabase(dbname); 370 var open_rq = indexedDB.open(dbname); 371 372 assert_equals(open_rq.transaction, null, "IDBOpenDBRequest.transaction"); 373 assert_equals(open_rq.source, null, "IDBOpenDBRequest.source"); 374 assert_equals(open_rq.readyState, "pending", "IDBOpenDBRequest.readyState"); 375 376 assert_true(open_rq instanceof IDBOpenDBRequest, "open_rq instanceof IDBOpenDBRequest"); 377 assert_equals(open_rq + "", "[object IDBOpenDBRequest]", "IDBOpenDBRequest (open_rq)"); 378 379 open_rq.onblocked = t.unreached_func('open_rq.onblocked'); 380 open_rq.onerror = t.unreached_func('open_rq.onerror'); 381 382 open_rq.onupgradeneeded = t.step_func(function() { 383 t.add_cleanup(function() { 384 open_rq.onerror = function(e) { 385 e.preventDefault(); 386 }; 387 open_rq.result.close(); 388 indexedDB.deleteDatabase(open_rq.result.name); 389 }); 390 t.done(); 391 }); 392 393 }, document.title + " - request returned by open()"); 394 </script>