tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

storage-buckets.https.any.js (3832B)


      1 // META: title=Buckets API: Tests for indexedDB API.
      2 // META: global=window,worker
      3 // META: script=resources/support-promises.js
      4 // META: script=/storage/buckets/resources/util.js
      5 'use strict';
      6 
      7 promise_test(async testCase => {
      8  await prepareForBucketTest(testCase);
      9  const inboxBucket = await navigator.storageBuckets.open('inbox_bucket');
     10  const outboxBucket = await navigator.storageBuckets.open('outbox_bucket');
     11 
     12  // Set up similar databases in two buckets.
     13  const inboxDb = await new Promise((resolve, reject) => {
     14    const request = inboxBucket.indexedDB.open('messages');
     15    request.onupgradeneeded = (event) => {
     16      const inboxStore =
     17          event.target.result.createObjectStore('primary', {keyPath: 'id'});
     18      event.target.transaction.commit();
     19    };
     20    request.onsuccess = () => resolve(request.result);
     21    request.onerror = () => reject(request.error);
     22  });
     23 
     24  const txn = inboxDb.transaction(['primary'], 'readwrite');
     25  const inboxStore = txn.objectStore('primary');
     26  inboxStore.put({ subject: 'Bonjour', id: '42'});
     27  txn.commit();
     28  await promiseForTransaction(testCase, txn);
     29 
     30  const outboxDb = await new Promise((resolve, reject) => {
     31    const request = outboxBucket.indexedDB.open('messages');
     32    request.onupgradeneeded = (event) => {
     33      const outboxStore =
     34          event.target.result.createObjectStore('primary', {keyPath: 'id'});
     35      event.target.transaction.commit();
     36    };
     37    request.onsuccess = () => resolve(request.result);
     38    request.onerror = () => reject(request.error);
     39  });
     40 
     41  const txn2 = outboxDb.transaction(['primary'], 'readwrite');
     42  const outboxStore = txn2.objectStore('primary');
     43  outboxStore.put({ subject: 're: Bonjour', id: '47'});
     44  txn2.commit();
     45  await promiseForTransaction(testCase, txn2);
     46 
     47  // Make sure it's possible to read from the bucket database.
     48  const inboxMessage = await new Promise((resolve, reject) => {
     49    const txn3 = inboxDb.transaction(['primary'], 'readonly');
     50    const inboxLookup = txn3.objectStore('primary').get('42');
     51    inboxLookup.onsuccess = (e) => resolve(inboxLookup.result);
     52    inboxLookup.onerror = (e) => reject(inboxLookup.error);
     53  });
     54  assert_equals(inboxMessage.subject, 'Bonjour');
     55 
     56  // Make sure it's possible to read from the other bucket database.
     57  const outboxMessage = await new Promise((resolve, reject) => {
     58    const txn4 = outboxDb.transaction(['primary'], 'readonly');
     59    const outboxLookup = txn4.objectStore('primary').get('47');
     60    outboxLookup.onsuccess = (e) => resolve(outboxLookup.result);
     61    outboxLookup.onerror = (e) => reject(outboxLookup.error);
     62  });
     63  assert_equals(outboxMessage.subject, 're: Bonjour');
     64 
     65  // Make sure they are different databases (looking up the data keyed on `47`
     66  // fails in the first database).
     67  const nonexistentInboxMessage = await new Promise((resolve, reject) => {
     68    const txn5 = inboxDb.transaction(['primary'], 'readonly');
     69    const nonexistentInboxLookup = txn5.objectStore('primary').get('47');
     70    nonexistentInboxLookup.onsuccess = (e) =>
     71        resolve(nonexistentInboxLookup.result);
     72    nonexistentInboxLookup.onerror = (e) =>
     73        reject(nonexistentInboxLookup.error);
     74  });
     75  assert_equals(nonexistentInboxMessage, undefined);
     76 }, 'Basic test that buckets create independent databases.');
     77 
     78 promise_test(async testCase => {
     79  await prepareForBucketTest(testCase);
     80  const inboxBucket = await navigator.storageBuckets.open('inbox');
     81  await navigator.storageBuckets.delete('inbox');
     82 
     83  return promise_rejects_dom(
     84      testCase, 'UnknownError', new Promise((resolve, reject) => {
     85        const request = inboxBucket.indexedDB.open('messages');
     86        request.onsuccess = () => resolve(request.result);
     87        request.onerror = () => reject(request.error);
     88      }));
     89 }, 'Tests trying to use indexedDB in a deleted bucket.');