Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

// META: title=Buckets API: Tests for indexedDB API.
// META: global=window,worker
// META: script=resources/support-promises.js
// META: script=/storage/buckets/resources/util.js
promise_test(async testCase => {
await prepareForBucketTest(testCase);
const inboxBucket = await navigator.storageBuckets.open('inbox_bucket');
const outboxBucket = await navigator.storageBuckets.open('outbox_bucket');
// Set up similar databases in two buckets.
const inboxDb = await new Promise((resolve, reject) => {
const request = inboxBucket.indexedDB.open('messages');
request.onupgradeneeded = (event) => {
const inboxStore =
event.target.result.createObjectStore('primary', {keyPath: 'id'});
event.target.transaction.commit();
};
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
const txn = inboxDb.transaction(['primary'], 'readwrite');
const inboxStore = txn.objectStore('primary');
inboxStore.put({ subject: 'Bonjour', id: '42'});
txn.commit();
await promiseForTransaction(testCase, txn);
const outboxDb = await new Promise((resolve, reject) => {
const request = outboxBucket.indexedDB.open('messages');
request.onupgradeneeded = (event) => {
const outboxStore =
event.target.result.createObjectStore('primary', {keyPath: 'id'});
event.target.transaction.commit();
};
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
const txn2 = outboxDb.transaction(['primary'], 'readwrite');
const outboxStore = txn2.objectStore('primary');
outboxStore.put({ subject: 're: Bonjour', id: '47'});
txn2.commit();
await promiseForTransaction(testCase, txn2);
// Make sure it's possible to read from the bucket database.
const inboxMessage = await new Promise((resolve, reject) => {
const txn3 = inboxDb.transaction(['primary'], 'readonly');
const inboxLookup = txn3.objectStore('primary').get('42');
inboxLookup.onsuccess = (e) => resolve(inboxLookup.result);
inboxLookup.onerror = (e) => reject(inboxLookup.error);
});
assert_equals(inboxMessage.subject, 'Bonjour');
// Make sure it's possible to read from the other bucket database.
const outboxMessage = await new Promise((resolve, reject) => {
const txn4 = outboxDb.transaction(['primary'], 'readonly');
const outboxLookup = txn4.objectStore('primary').get('47');
outboxLookup.onsuccess = (e) => resolve(outboxLookup.result);
outboxLookup.onerror = (e) => reject(outboxLookup.error);
});
assert_equals(outboxMessage.subject, 're: Bonjour');
// Make sure they are different databases (looking up the data keyed on `47`
// fails in the first database).
const nonexistentInboxMessage = await new Promise((resolve, reject) => {
const txn5 = inboxDb.transaction(['primary'], 'readonly');
const nonexistentInboxLookup = txn5.objectStore('primary').get('47');
nonexistentInboxLookup.onsuccess = (e) =>
resolve(nonexistentInboxLookup.result);
nonexistentInboxLookup.onerror = (e) =>
reject(nonexistentInboxLookup.error);
});
assert_equals(nonexistentInboxMessage, undefined);
}, 'Basic test that buckets create independent databases.');
promise_test(async testCase => {
await prepareForBucketTest(testCase);
const inboxBucket = await navigator.storageBuckets.open('inbox');
await navigator.storageBuckets.delete('inbox');
return promise_rejects_dom(
testCase, 'UnknownError', new Promise((resolve, reject) => {
const request = inboxBucket.indexedDB.open('messages');
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
}));
}, 'Tests trying to use indexedDB in a deleted bucket.');