tor-browser

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

test_slowDatabaseInitialization.js (3697B)


      1 /**
      2 * Any copyright is dedicated to the Public Domain.
      3 * http://creativecommons.org/publicdomain/zero/1.0/
      4 */
      5 
      6 const { PrincipalUtils } = ChromeUtils.importESModule(
      7  "resource://testing-common/dom/quota/test/modules/PrincipalUtils.sys.mjs"
      8 );
      9 const { QuotaUtils } = ChromeUtils.importESModule(
     10  "resource://testing-common/dom/quota/test/modules/QuotaUtils.sys.mjs"
     11 );
     12 const { IndexedDBUtils } = ChromeUtils.importESModule(
     13  "resource://testing-common/dom/indexedDB/test/modules/IndexedDBUtils.sys.mjs"
     14 );
     15 const { TestUtils } = ChromeUtils.importESModule(
     16  "resource://testing-common/TestUtils.sys.mjs"
     17 );
     18 
     19 async function testNewDatabase() {
     20  const principal = PrincipalUtils.createPrincipal("https://example.com");
     21  const name = "test_slowStorageInitialization.js";
     22 
     23  info("Testing origin clearing requested after starting database work");
     24 
     25  info("Starting database opening");
     26 
     27  const openPromise = (function () {
     28    const request = indexedDB.openForPrincipal(principal, name);
     29    const promise = IndexedDBUtils.requestFinished(request);
     30    return promise;
     31  })();
     32 
     33  info("Waiting for database work to start");
     34 
     35  await TestUtils.topicObserved("IndexedDB::DatabaseWorkStarted");
     36 
     37  info("Starting origin clearing");
     38 
     39  const clearPromise = (async function () {
     40    const request = Services.qms.clearStoragesForPrincipal(principal);
     41    const promise = QuotaUtils.requestFinished(request);
     42    return promise;
     43  })();
     44 
     45  info("Waiting for database to finish opening");
     46 
     47  try {
     48    await openPromise;
     49    ok(false, "Should have thrown");
     50  } catch (e) {
     51    ok(true, "Should have thrown");
     52    Assert.strictEqual(e.name, "UnknownError", "Threw right result code");
     53  }
     54 
     55  info("Waiting for origin to finish clearing");
     56 
     57  await clearPromise;
     58 }
     59 
     60 async function testExistingDatabase() {
     61  const principal = PrincipalUtils.createPrincipal("https://example.com");
     62  const name = "test_slowStorageInitialization.js";
     63  const objectStoreName = "foo";
     64 
     65  info("Testing origin clearing requested after starting database work");
     66 
     67  info("Ensuring a pre-existing database");
     68 
     69  {
     70    const request = indexedDB.openForPrincipal(principal, name);
     71    request.onupgradeneeded = function (event) {
     72      const database = event.target.result;
     73      database.createObjectStore(objectStoreName);
     74    };
     75    const promise = IndexedDBUtils.requestFinished(request);
     76    const database = await promise;
     77    database.close();
     78  }
     79 
     80  info("Starting database opening");
     81 
     82  const openPromise = (function () {
     83    const request = indexedDB.openForPrincipal(principal, name);
     84    const promise = IndexedDBUtils.requestFinished(request);
     85    return promise;
     86  })();
     87 
     88  info("Waiting for database work to start");
     89 
     90  await TestUtils.topicObserved("IndexedDB::DatabaseWorkStarted");
     91 
     92  info("Starting origin clearing");
     93 
     94  const clearPromise = (async function () {
     95    const request = Services.qms.clearStoragesForPrincipal(principal);
     96    const promise = QuotaUtils.requestFinished(request);
     97    return promise;
     98  })();
     99 
    100  info("Waiting for database to finish opening");
    101 
    102  try {
    103    await openPromise;
    104    ok(false, "Should have thrown");
    105  } catch (e) {
    106    ok(true, "Should have thrown");
    107    Assert.strictEqual(e.name, "AbortError", "Threw right result code");
    108  }
    109 
    110  info("Waiting for origin to finish clearing");
    111 
    112  await clearPromise;
    113 }
    114 
    115 /* exported testSteps */
    116 async function testSteps() {
    117  add_task(
    118    {
    119      pref_set: [
    120        ["dom.indexedDB.databaseInitialization.pauseOnIOThreadMs", 2000],
    121      ],
    122    },
    123    testNewDatabase
    124  );
    125 
    126  add_task(
    127    {
    128      pref_set: [
    129        ["dom.indexedDB.databaseInitialization.pauseOnIOThreadMs", 2000],
    130      ],
    131    },
    132    testExistingDatabase
    133  );
    134 }