| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <title>IndexedDB: BigInt keys and values</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="support.js"></script> |
| |
| <script> |
| // 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."); |
| }); |
| |
| createdb(t).onupgradeneeded = t.step_func(e => { |
| e.target.result |
| .createObjectStore("store") |
| .add(value, 1); |
| |
| e.target.onsuccess = t.step_func(e => { |
| e.target.result |
| .transaction("store") |
| .objectStore("store") |
| .get(1) |
| .onsuccess = t.step_func(e => |
| { |
| assert_true(predicate(e.target.result), |
| "Predicate should return true for the deserialized result."); |
| t.done(); |
| }); |
| }); |
| }); |
| }, "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("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"); |
| </script> |