tor-browser

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

AppData.sys.mjs (2354B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 // Reference needed in order for fake app dir provider to be active.
      6 var gFakeAppDirectoryProvider;
      7 
      8 /**
      9 * Installs a fake UAppData directory.
     10 *
     11 * This is needed by tests because a UAppData directory typically isn't
     12 * present in the test environment.
     13 *
     14 * We create the new UAppData directory under the profile's directory
     15 * because the profile directory is automatically cleaned as part of
     16 * test shutdown.
     17 *
     18 * This returns a promise that will be resolved once the new directory
     19 * is created and installed.
     20 */
     21 export var makeFakeAppDir = function () {
     22  let dirMode = 0o700;
     23  let baseFile = Services.dirsvc.get("ProfD", Ci.nsIFile);
     24  let appD = baseFile.clone();
     25  appD.append("UAppData");
     26 
     27  if (gFakeAppDirectoryProvider) {
     28    return Promise.resolve(appD.path);
     29  }
     30 
     31  function makeDir(f) {
     32    if (f.exists()) {
     33      return;
     34    }
     35 
     36    dump("Creating directory: " + f.path + "\n");
     37    f.create(Ci.nsIFile.DIRECTORY_TYPE, dirMode);
     38  }
     39 
     40  makeDir(appD);
     41 
     42  let reportsD = appD.clone();
     43  reportsD.append("Crash Reports");
     44 
     45  let pendingD = reportsD.clone();
     46  pendingD.append("pending");
     47  let submittedD = reportsD.clone();
     48  submittedD.append("submitted");
     49  let eventsD = reportsD.clone();
     50  eventsD.append("events");
     51 
     52  makeDir(reportsD);
     53  makeDir(pendingD);
     54  makeDir(submittedD);
     55  makeDir(eventsD);
     56 
     57  let provider = {
     58    getFile(prop, persistent) {
     59      persistent.value = true;
     60      if (prop == "UAppData") {
     61        return appD.clone();
     62      }
     63 
     64      throw Components.Exception(
     65        "failed to get file: " + prop,
     66        Cr.NS_ERROR_FAILURE
     67      );
     68    },
     69 
     70    QueryInterace(iid) {
     71      if (
     72        iid.equals(Ci.nsIDirectoryServiceProvider) ||
     73        iid.equals(Ci.nsISupports)
     74      ) {
     75        return this;
     76      }
     77 
     78      throw Components.Exception("", Cr.NS_ERROR_NO_INTERFACE);
     79    },
     80  };
     81 
     82  // Register the new provider.
     83  Services.dirsvc.registerProvider(provider);
     84 
     85  // And undefine the old one.
     86  try {
     87    Services.dirsvc.undefine("UAppData");
     88  } catch (ex) {}
     89 
     90  gFakeAppDirectoryProvider = provider;
     91 
     92  dump("Successfully installed fake UAppDir\n");
     93  return Promise.resolve(appD.path);
     94 };