tor-browser

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

test_view_put_get_values.js (4594B)


      1 /**
      2 * Any copyright is dedicated to the Public Domain.
      3 * http://creativecommons.org/publicdomain/zero/1.0/
      4 */
      5 
      6 /* exported testSteps, disableWorkerTest */
      7 var disableWorkerTest = "Need a way to set temporary prefs from a worker";
      8 
      9 async function testSteps() {
     10  // Setting dom.indexedDB.dataThreshold to 99999 ensures that the first random
     11  // view (size 100000) is stored as a separate file when
     12  // dom.indexedDB.preprocessing is true. The second random view (size 10000)
     13  // is always stored directly in the database. This setup creates a scenario
     14  // where requests in a transaction are processed in the wrong order if they
     15  // are not properly queued internally.
     16  const dataThreshold = 99999;
     17 
     18  const name = this.window
     19    ? window.location.pathname
     20    : "test_view_put_get_values.js";
     21 
     22  const objectStoreName = "Views";
     23 
     24  const viewDataArray = [
     25    { key: 1, view: getRandomView(100000) },
     26    { key: 2, view: getRandomView(10000) },
     27  ];
     28 
     29  const tests = [
     30    {
     31      external: false,
     32      preprocessing: false,
     33    },
     34    {
     35      external: true,
     36      preprocessing: false,
     37    },
     38    {
     39      external: true,
     40      preprocessing: true,
     41    },
     42  ];
     43 
     44  for (let test of tests) {
     45    if (test.external) {
     46      info("Setting data threshold pref");
     47 
     48      if (this.window) {
     49        await SpecialPowers.pushPrefEnv({
     50          set: [["dom.indexedDB.dataThreshold", dataThreshold]],
     51        });
     52      } else {
     53        setDataThreshold(dataThreshold);
     54      }
     55    }
     56 
     57    if (test.preprocessing) {
     58      info("Setting preprocessing pref");
     59 
     60      if (this.window) {
     61        await SpecialPowers.pushPrefEnv({
     62          set: [["dom.indexedDB.preprocessing", true]],
     63        });
     64      } else {
     65        enablePreprocessing();
     66      }
     67    }
     68 
     69    info("Opening database");
     70 
     71    const db = await (async function () {
     72      const request = indexedDB.open(name);
     73 
     74      {
     75        const event = await expectingUpgrade(request);
     76 
     77        const database = event.target.result;
     78 
     79        database.createObjectStore(objectStoreName);
     80      }
     81 
     82      const event = await expectingSuccess(request);
     83 
     84      const database = event.target.result;
     85 
     86      return database;
     87    })();
     88 
     89    {
     90      const objectStore = db
     91        .transaction([objectStoreName], "readwrite")
     92        .objectStore(objectStoreName);
     93 
     94      info("Storing views");
     95 
     96      for (const viewData of viewDataArray) {
     97        const request = objectStore.add(viewData.view, viewData.key);
     98 
     99        await requestSucceeded(request);
    100 
    101        is(request.result, viewData.key, "Got correct key");
    102      }
    103 
    104      info("Getting views");
    105 
    106      for (const viewData of viewDataArray) {
    107        const request = objectStore.get(viewData.key);
    108 
    109        await requestSucceeded(request);
    110 
    111        verifyView(request.result, viewData.view);
    112      }
    113    }
    114 
    115    info("Getting views in separate transactions");
    116 
    117    for (const viewData of viewDataArray) {
    118      const request = db
    119        .transaction([objectStoreName])
    120        .objectStore(objectStoreName)
    121        .get(viewData.key);
    122 
    123      await requestSucceeded(request);
    124 
    125      verifyView(request.result, viewData.view);
    126    }
    127 
    128    info("Getting file usage");
    129 
    130    {
    131      const fileUsage = await new Promise(function (resolve) {
    132        getCurrentUsage(function (request) {
    133          resolve(request.result.fileUsage);
    134        });
    135      });
    136 
    137      if (test.external) {
    138        ok(fileUsage > 0, "File usage is not zero");
    139      } else {
    140        ok(fileUsage == 0, "File usage is zero");
    141      }
    142    }
    143 
    144    info("Getting views in parallel");
    145 
    146    {
    147      const objectStore = db
    148        .transaction([objectStoreName])
    149        .objectStore(objectStoreName);
    150 
    151      const promises = [];
    152      const keys = [];
    153 
    154      for (const viewData of viewDataArray) {
    155        const request = objectStore.get(viewData.key);
    156 
    157        promises.push(
    158          requestSucceeded(request, function () {
    159            keys.push(viewData.key);
    160          })
    161        );
    162      }
    163 
    164      await Promise.all(promises);
    165 
    166      is(keys.length, viewDataArray.length, "Correct number of keys");
    167 
    168      for (let i = 0; i < keys.length; i++) {
    169        is(keys[i], viewDataArray[i].key, "Correct key");
    170      }
    171    }
    172 
    173    info("Deleting database");
    174 
    175    {
    176      db.close();
    177      const request = indexedDB.deleteDatabase(name);
    178      await expectingSuccess(request);
    179    }
    180 
    181    info("Resetting prefs");
    182 
    183    if (this.window) {
    184      await SpecialPowers.popPrefEnv();
    185    } else {
    186      if (test.external) {
    187        resetDataThreshold();
    188      }
    189 
    190      if (test.preprocessing) {
    191        resetPreprocessing();
    192      }
    193    }
    194  }
    195 }