| <!doctype html> |
| <meta charset=utf-8> |
| <script src="/resources/testharness.js"></script> |
| <script src="support.js"></script> |
| <!-- TODO(crbug.com/1218100): We should verify the full IDB surface area inside |
| an iframe, but for now a single test with an assortment of verifications is |
| sufficient to test third party storage partitioning didn't break anything. --> |
| |
| <!-- This block is from delete-request-queue.htm --> |
| <script> |
| let saw; |
| indexeddb_test( |
| (t, db) => { |
| saw = expect(t, ['delete1', 'delete2']); |
| let r = indexedDB.deleteDatabase(db.name); |
| r.onerror = t.unreached_func('delete should succeed'); |
| r.onsuccess = t.step_func(e => saw('delete1')); |
| }, |
| (t, db) => { |
| let r = indexedDB.deleteDatabase(db.name); |
| r.onerror = t.unreached_func('delete should succeed'); |
| r.onsuccess = t.step_func(e => saw('delete2')); |
| |
| db.close(); |
| }, |
| 'Deletes are processed in order'); |
| </script> |
| |
| <!-- This block is from idbcursor-advance-continue-async.htm --> |
| <script> |
| function upgrade_func(t, db, tx) { |
| var objStore = db.createObjectStore("test"); |
| objStore.createIndex("index", ""); |
| |
| objStore.add("data", 1); |
| objStore.add("data2", 2); |
| } |
| |
| indexeddb_test( |
| upgrade_func, |
| function(t, db) { |
| var count = 0; |
| var rq = db.transaction("test", "readonly").objectStore("test").openCursor(); |
| |
| rq.onsuccess = t.step_func(function(e) { |
| if (!e.target.result) { |
| assert_equals(count, 2, 'count'); |
| t.done(); |
| return; |
| } |
| var cursor = e.target.result; |
| |
| switch(count) { |
| case 0: |
| assert_equals(cursor.value, "data") |
| assert_equals(cursor.key, 1) |
| cursor.advance(1) |
| assert_equals(cursor.value, "data") |
| assert_equals(cursor.key, 1) |
| break |
| |
| case 1: |
| assert_equals(cursor.value, "data2") |
| assert_equals(cursor.key, 2) |
| cursor.advance(1) |
| assert_equals(cursor.value, "data2") |
| assert_equals(cursor.key, 2) |
| break |
| |
| default: |
| assert_unreached("Unexpected count: " + count) |
| } |
| |
| count++; |
| }); |
| rq.onerror = t.unreached_func("unexpected error") |
| }, |
| document.title + " - advance" |
| ); |
| |
| indexeddb_test( |
| upgrade_func, |
| function(t, db) { |
| var count = 0; |
| var rq = db.transaction("test", "readonly").objectStore("test").index("index").openCursor(); |
| |
| rq.onsuccess = t.step_func(function(e) { |
| if (!e.target.result) { |
| assert_equals(count, 2, 'count'); |
| t.done(); |
| return; |
| } |
| var cursor = e.target.result; |
| |
| switch(count) { |
| case 0: |
| assert_equals(cursor.value, "data") |
| assert_equals(cursor.key, "data") |
| assert_equals(cursor.primaryKey, 1) |
| cursor.continue("data2") |
| assert_equals(cursor.value, "data") |
| assert_equals(cursor.key, "data") |
| assert_equals(cursor.primaryKey, 1) |
| break |
| |
| case 1: |
| assert_equals(cursor.value, "data2") |
| assert_equals(cursor.key, "data2") |
| assert_equals(cursor.primaryKey, 2) |
| cursor.continue() |
| assert_equals(cursor.value, "data2") |
| assert_equals(cursor.key, "data2") |
| assert_equals(cursor.primaryKey, 2) |
| break |
| |
| default: |
| assert_unreached("Unexpected count: " + count) |
| } |
| |
| count++; |
| }); |
| rq.onerror = t.unreached_func("unexpected error") |
| }, |
| document.title + " - continue" |
| ); |
| |
| indexeddb_test( |
| upgrade_func, |
| function(t, db) { |
| var count = 0; |
| var rq = db.transaction("test", "readonly").objectStore("test").index("index").openCursor(); |
| |
| rq.onsuccess = t.step_func(function(e) { |
| if (!e.target.result) { |
| assert_equals(count, 2, 'count'); |
| t.done(); |
| return; |
| } |
| var cursor = e.target.result; |
| cursor.advance(1) |
| |
| switch(count) { |
| case 0: |
| assert_equals(cursor.value, "data") |
| assert_equals(cursor.key, "data") |
| assert_equals(cursor.primaryKey, 1) |
| break |
| |
| case 1: |
| assert_equals(cursor.value, "data2") |
| assert_equals(cursor.key, "data2") |
| assert_equals(cursor.primaryKey, 2) |
| break |
| |
| default: |
| assert_unreached("Unexpected count: " + count) |
| } |
| |
| count++; |
| }); |
| rq.onerror = t.unreached_func("unexpected error") |
| }, |
| document.title + " - fresh advance still async" |
| ); |
| |
| indexeddb_test( |
| upgrade_func, |
| function(t, db) { |
| var count = 0; |
| var rq = db.transaction("test", "readonly").objectStore("test").openCursor(); |
| |
| rq.onsuccess = t.step_func(function(e) { |
| if (!e.target.result) { |
| assert_equals(count, 2, 'count'); |
| t.done(); |
| return; |
| } |
| var cursor = e.target.result; |
| cursor.continue() |
| |
| switch(count) { |
| case 0: |
| assert_equals(cursor.value, "data") |
| assert_equals(cursor.key, 1) |
| break |
| |
| case 1: |
| assert_equals(cursor.value, "data2") |
| assert_equals(cursor.key, 2) |
| break |
| |
| default: |
| assert_unreached("Unexpected count: " + count) |
| } |
| |
| count++; |
| }); |
| rq.onerror = t.unreached_func("unexpected error") |
| }, |
| document.title + " - fresh continue still async" |
| ); |
| </script> |
| <script src="nested-cloning-common.js"></script> |
| <script src="support-get-all.js"></script> |
| <script src="support-promises.js"></script> |
| <!-- Run the `IDBIndex::getAll()` tests. --> |
| <script src="/IndexedDB/idbindex_getAll.any.js"></script> |
| |
| <!-- This block is from idbobjectstore_openKeyCursor.htm --> |
| <script> |
| function store_test(func, name) { |
| indexeddb_test( |
| function(t, db, tx) { |
| var store = db.createObjectStore("store"); |
| for (var i = 0; i < 10; ++i) { |
| store.put("value: " + i, i); |
| } |
| }, |
| function(t, db) { |
| var tx = db.transaction("store", "readonly"); |
| var store = tx.objectStore("store"); |
| func(t, db, tx, store); |
| }, name); |
| } |
| |
| store_test(function(t, db, tx, store) { |
| var expected = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; |
| var actual = []; |
| var request = store.openKeyCursor(); |
| request.onsuccess = t.step_func(function() { |
| var cursor = request.result; |
| if (!cursor) |
| return; |
| assert_equals(cursor.direction, "next"); |
| assert_false("value" in cursor); |
| assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0); |
| actual.push(cursor.key); |
| cursor.continue(); |
| }); |
| |
| tx.onabort = t.unreached_func("transaction aborted"); |
| tx.oncomplete = t.step_func(function() { |
| assert_array_equals(expected, actual, "keys should match"); |
| t.done(); |
| }); |
| |
| }, "IDBObjectStore.openKeyCursor() - forward iteration"); |
| |
| store_test(function(t, db, tx, store) { |
| var expected = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]; |
| var actual = []; |
| var request = store.openKeyCursor(null, "prev"); |
| request.onsuccess = t.step_func(function() { |
| var cursor = request.result; |
| if (!cursor) |
| return; |
| assert_equals(cursor.direction, "prev"); |
| assert_false("value" in cursor); |
| assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0); |
| actual.push(cursor.key); |
| cursor.continue(); |
| }); |
| |
| tx.onabort = t.unreached_func("transaction aborted"); |
| tx.oncomplete = t.step_func(function() { |
| assert_array_equals(expected, actual, "keys should match"); |
| t.done(); |
| }); |
| |
| }, "IDBObjectStore.openKeyCursor() - reverse iteration"); |
| |
| store_test(function(t, db, tx, store) { |
| var expected = [4, 5, 6]; |
| var actual = []; |
| var request = store.openKeyCursor(IDBKeyRange.bound(4, 6)); |
| request.onsuccess = t.step_func(function() { |
| var cursor = request.result; |
| if (!cursor) |
| return; |
| assert_equals(cursor.direction, "next"); |
| assert_false("value" in cursor); |
| assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0); |
| actual.push(cursor.key); |
| cursor.continue(); |
| }); |
| |
| tx.onabort = t.unreached_func("transaction aborted"); |
| tx.oncomplete = t.step_func(function() { |
| assert_array_equals(expected, actual, "keys should match"); |
| t.done(); |
| }); |
| |
| }, "IDBObjectStore.openKeyCursor() - forward iteration with range"); |
| |
| store_test(function(t, db, tx, store) { |
| var expected = [6, 5, 4]; |
| var actual = []; |
| var request = store.openKeyCursor(IDBKeyRange.bound(4, 6), "prev"); |
| request.onsuccess = t.step_func(function() { |
| var cursor = request.result; |
| if (!cursor) |
| return; |
| assert_equals(cursor.direction, "prev"); |
| assert_false("value" in cursor); |
| assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0); |
| actual.push(cursor.key); |
| cursor.continue(); |
| }); |
| |
| tx.onabort = t.unreached_func("transaction aborted"); |
| tx.oncomplete = t.step_func(function() { |
| assert_array_equals(expected, actual, "keys should match"); |
| t.done(); |
| }); |
| |
| }, "IDBObjectStore.openKeyCursor() - reverse iteration with range"); |
| |
| store_test(function(t, db, tx, store) { |
| assert_throws_dom("DataError", function() { store.openKeyCursor(NaN); }, |
| "openKeyCursor should throw on invalid number key"); |
| assert_throws_dom("DataError", function() { store.openKeyCursor(new Date(NaN)); }, |
| "openKeyCursor should throw on invalid date key"); |
| assert_throws_dom("DataError", function() { |
| var cycle = []; |
| cycle.push(cycle); |
| store.openKeyCursor(cycle); |
| }, "openKeyCursor should throw on invalid array key"); |
| assert_throws_dom("DataError", function() { store.openKeyCursor({}); }, |
| "openKeyCursor should throw on invalid key type"); |
| setTimeout(t.step_func(function() { |
| assert_throws_dom("TransactionInactiveError", function() { store.openKeyCursor(); }, |
| "openKeyCursor should throw if transaction is inactive"); |
| t.done(); |
| }), 0); |
| |
| }, "IDBObjectStore.openKeyCursor() - invalid inputs"); |
| </script> |
| |
| <!-- This block is from idbtransaction.htm --> |
| <script> |
| async_test(function(t) { |
| var dbname = "idbtransaction-" + document.location + t.name; |
| indexedDB.deleteDatabase(dbname); |
| var open_rq = indexedDB.open(dbname); |
| |
| open_rq.onblocked = t.unreached_func('open_rq.onblocked'); |
| open_rq.onerror = t.unreached_func('open_rq.onerror'); |
| |
| open_rq.onupgradeneeded = t.step_func(function(e) { |
| t.add_cleanup(function() { |
| open_rq.onerror = function(e) { |
| e.preventDefault(); |
| }; |
| open_rq.result.close(); |
| indexedDB.deleteDatabase(open_rq.result.name); |
| }); |
| |
| assert_equals(e.target, open_rq, "e.target is reusing the same IDBOpenDBRequest"); |
| assert_equals(e.target.transaction, open_rq.transaction, "IDBOpenDBRequest.transaction"); |
| |
| assert_true(e.target.transaction instanceof IDBTransaction, "transaction instanceof IDBTransaction"); |
| t.done(); |
| }); |
| |
| }, document.title + " - request gotten by the handler"); |
| |
| async_test(function(t) { |
| var dbname = "idbtransaction-" + document.location + t.name; |
| indexedDB.deleteDatabase(dbname); |
| var open_rq = indexedDB.open(dbname); |
| |
| assert_equals(open_rq.transaction, null, "IDBOpenDBRequest.transaction"); |
| assert_equals(open_rq.source, null, "IDBOpenDBRequest.source"); |
| assert_equals(open_rq.readyState, "pending", "IDBOpenDBRequest.readyState"); |
| |
| assert_true(open_rq instanceof IDBOpenDBRequest, "open_rq instanceof IDBOpenDBRequest"); |
| assert_equals(open_rq + "", "[object IDBOpenDBRequest]", "IDBOpenDBRequest (open_rq)"); |
| |
| open_rq.onblocked = t.unreached_func('open_rq.onblocked'); |
| open_rq.onerror = t.unreached_func('open_rq.onerror'); |
| |
| open_rq.onupgradeneeded = t.step_func(function() { |
| t.add_cleanup(function() { |
| open_rq.onerror = function(e) { |
| e.preventDefault(); |
| }; |
| open_rq.result.close(); |
| indexedDB.deleteDatabase(open_rq.result.name); |
| }); |
| t.done(); |
| }); |
| |
| }, document.title + " - request returned by open()"); |
| </script> |