| // META: global=window,worker |
| // META: title=IndexedDB: keys and values |
| // META: script=resources/support.js |
| // @author Odin Hørthe Omdal <mailto:[email protected]> |
| |
| 'use_strict'; |
| |
| function setOnUpgradeNeeded(t, predicate, _instanceof, value) { |
| createdb(t).onupgradeneeded = t.step_func(e => { |
| const db = e.target.result; |
| const store = db.createObjectStore("store"); |
| store.add(value, 1); |
| |
| e.target.onsuccess = t.step_func(e => { |
| const transaction = db.transaction("store", "readonly"); |
| const objectStore = transaction.objectStore("store"); |
| objectStore.get(1).onsuccess = t.step_func(e => { |
| if (predicate) { |
| assert_true(predicate(e.target.result), |
| "Predicate should return true for the deserialized result."); |
| } else if (_instanceof) { |
| assert_true(e.target.result instanceof _instanceof, "instanceof"); |
| } |
| t.done(); |
| }); |
| }); |
| }); |
| } |
| |
| // BigInt and BigInt objects are supported in serialization, per |
| // https://github.com/whatwg/html/pull/3480 |
| // This support allows them to be used as IndexedDB values. |
| |
| function value_test(value, predicate, name) { |
| async_test(t => { |
| t.step(function () { |
| assert_true(predicate(value), |
| "Predicate should return true for the initial value."); |
| }); |
| |
| setOnUpgradeNeeded(t, predicate, null, value); |
| }, "BigInts as values in IndexedDB - " + name); |
| } |
| |
| value_test(1n, |
| x => x === 1n, |
| "primitive BigInt"); |
| value_test(Object(1n), |
| x => typeof x === 'object' && |
| x instanceof BigInt && |
| x.valueOf() === 1n, |
| "BigInt object"); |
| value_test({ val: 1n }, |
| x => x.val === 1n, |
| "primitive BigInt inside object"); |
| value_test({ val: Object(1n) }, |
| x => x.val.valueOf() === 1n && |
| x.val instanceof BigInt && |
| x.val.valueOf() === 1n, |
| "BigInt object inside object"); |
| |
| // However, BigInt is not supported as an IndexedDB key; support |
| // has been proposed in the following PR, but that change has not |
| // landed at the time this patch was written |
| // https://github.com/w3c/IndexedDB/pull/231 |
| |
| function invalidKey(key, name) { |
| test(t => { |
| assert_throws_dom("DataError", () => indexedDB.cmp(0, key)); |
| }, "BigInts as keys in IndexedDB - " + name); |
| } |
| |
| invalidKey(1n, "primitive BigInt"); |
| // Still an error even if the IndexedDB patch lands |
| invalidKey(Object(1n), "BigInt object"); |
| |
| function value(value, _instanceof) { |
| async_test(t => { |
| t.step(function () { |
| assert_true(value instanceof _instanceof, "TEST ERROR, instanceof"); |
| }); |
| |
| setOnUpgradeNeeded(t, null, _instanceof, value); |
| }, "Values - " + _instanceof.name); |
| } |
| |
| value(new Date(), Date); |
| value(new Array(), Array); |