tor-browser

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

test_idle_maintenance.js (4277B)


      1 /**
      2 * Any copyright is dedicated to the Public Domain.
      3 * http://creativecommons.org/publicdomain/zero/1.0/
      4 */
      5 /* eslint-disable mozilla/no-arbitrary-setTimeout */
      6 
      7 /* exported testGenerator */
      8 var testGenerator = testSteps();
      9 
     10 function* testSteps() {
     11  let uri = Services.io.newURI("https://www.example.com");
     12  let principal = Services.scriptSecurityManager.createContentPrincipal(
     13    uri,
     14    {}
     15  );
     16 
     17  info("Setting permissions");
     18 
     19  Services.perms.addFromPrincipal(
     20    principal,
     21    "indexedDB",
     22    Ci.nsIPermissionManager.ALLOW_ACTION
     23  );
     24 
     25  info("Creating databases");
     26 
     27  // Keep at least one database open.
     28  let req = indexedDB.open("foo-a", 1);
     29  req.onerror = errorHandler;
     30  req.onsuccess = grabEventAndContinueHandler;
     31  let event = yield undefined;
     32 
     33  // Keep at least one factory operation alive by deleting a database that is
     34  // stil open.
     35  req = indexedDB.open("foo-b", 1);
     36  req.onerror = errorHandler;
     37  req.onsuccess = grabEventAndContinueHandler;
     38  event = yield undefined;
     39 
     40  indexedDB.deleteDatabase("foo-b");
     41 
     42  // Create a database which we will later try to open while maintenance is
     43  // performed.
     44  req = indexedDB.open("foo-c", 1);
     45  req.onerror = errorHandler;
     46  req.onsuccess = grabEventAndContinueHandler;
     47  event = yield undefined;
     48 
     49  let dbC = event.target.result;
     50  dbC.close();
     51 
     52  let dbCount = 0;
     53 
     54  for (let persistence of ["persistent", "temporary", "default"]) {
     55    for (let i = 1; i <= 5; i++) {
     56      let dbName = "foo-" + i;
     57      let dbPersistence = persistence;
     58      let req = indexedDB.openForPrincipal(principal, dbName, {
     59        version: 1,
     60        storage: dbPersistence,
     61      });
     62      req.onerror = event => {
     63        if (dbPersistence != "persistent") {
     64          errorHandler(event);
     65          return;
     66        }
     67 
     68        // Explicit persistence is currently blocked on mobile.
     69        info(
     70          "Failed to create persistent database '" +
     71            dbPersistence +
     72            "/" +
     73            dbName +
     74            "', hopefully this is on mobile!"
     75        );
     76 
     77        event.preventDefault();
     78 
     79        if (!--dbCount) {
     80          continueToNextStep();
     81        }
     82      };
     83      req.onupgradeneeded = event => {
     84        let db = event.target.result;
     85        let objectStore = db.createObjectStore("foo");
     86 
     87        // Add lots of data...
     88        for (let j = 0; j < 100; j++) {
     89          objectStore.add("abcdefghijklmnopqrstuvwxyz0123456789", j);
     90        }
     91 
     92        // And then clear it so that maintenance has some space to reclaim.
     93        objectStore.clear();
     94      };
     95      req.onsuccess = event => {
     96        let db = event.target.result;
     97        ok(db, "Created database '" + dbPersistence + "/" + dbName + "'");
     98 
     99        db.close();
    100 
    101        if (!--dbCount) {
    102          continueToNextStep();
    103        }
    104      };
    105      dbCount++;
    106    }
    107  }
    108  yield undefined;
    109 
    110  info("Getting usage before maintenance");
    111 
    112  let usageBeforeMaintenance;
    113 
    114  Services.qms.getUsageForPrincipal(principal, request => {
    115    let usage = request.result.usage;
    116    ok(usage > 0, "Usage is non-zero");
    117    usageBeforeMaintenance = usage;
    118    continueToNextStep();
    119  });
    120  yield undefined;
    121 
    122  info("Starting idle maintenance");
    123 
    124  const indexedDatabaseManager = Cc[
    125    "@mozilla.org/dom/indexeddb/manager;1"
    126  ].getService(Ci.nsIIndexedDatabaseManager);
    127 
    128  const maintenancePromise = indexedDatabaseManager.doMaintenance();
    129 
    130  info("Opening database while maintenance is performed");
    131 
    132  req = indexedDB.open("foo-c", 1);
    133  req.onerror = errorHandler;
    134  req.onsuccess = grabEventAndContinueHandler;
    135  yield undefined;
    136 
    137  info("Waiting for maintenance to finish");
    138 
    139  maintenancePromise.then(continueToNextStep);
    140  yield undefined;
    141 
    142  info("Getting usage after maintenance");
    143 
    144  let usageAfterMaintenance;
    145 
    146  Services.qms.getUsageForPrincipal(principal, request => {
    147    let usage = request.result.usage;
    148    ok(usage > 0, "Usage is non-zero");
    149    usageAfterMaintenance = usage;
    150    continueToNextStep();
    151  });
    152  yield undefined;
    153 
    154  info(
    155    "Usage before: " +
    156      usageBeforeMaintenance +
    157      ". " +
    158      "Usage after: " +
    159      usageAfterMaintenance
    160  );
    161 
    162  ok(
    163    usageAfterMaintenance <= usageBeforeMaintenance,
    164    "Maintenance decreased file sizes or left them the same"
    165  );
    166 
    167  finishTest();
    168  yield undefined;
    169 }