Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test BigInt as keys and values in IndexedDB #10977

Merged
merged 2 commits into from
May 22, 2018
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions IndexedDB/bigint_value.htm
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<!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>