tor-browser

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

test_data_protocol_registration.js (3574B)


      1 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
      2 * vim: sw=2 ts=2 sts=2 tw=78 expandtab :
      3 * This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 var manifests = [do_get_file("data/test_data_protocol_registration.manifest")];
      8 registerManifests(manifests);
      9 
     10 function run_test() {
     11  const uuidGenerator = Services.uuid;
     12 
     13  let { newAppInfo } = ChromeUtils.importESModule(
     14    "resource://testing-common/AppInfo.sys.mjs"
     15  );
     16  let XULAppInfo = newAppInfo({
     17    name: "XPCShell",
     18    ID: "{39885e5f-f6b4-4e2a-87e5-6259ecf79011}",
     19    version: "5",
     20    platformVersion: "1.9",
     21  });
     22 
     23  let XULAppInfoFactory = {
     24    // These two are used when we register all our factories (and unregister)
     25    CID: uuidGenerator.generateUUID(),
     26    scheme: "XULAppInfo",
     27    contractID: XULAPPINFO_CONTRACTID,
     28    createInstance(iid) {
     29      return XULAppInfo.QueryInterface(iid);
     30    },
     31  };
     32 
     33  // Add our XULAppInfo factory
     34  let factories = [XULAppInfoFactory];
     35  let old_factories = [];
     36  let old_factories_inds = [];
     37 
     38  let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
     39 
     40  // Register our factories
     41  for (let i = 0; i < factories.length; i++) {
     42    let factory = factories[i];
     43 
     44    // Make sure the class ID has not already been registered
     45    if (!registrar.isCIDRegistered(factory.CID)) {
     46      // Check to see if a contract was already registered and
     47      // register it if it is not. Otherwise, store the previous one
     48      // to be restored later and register the new one.
     49      if (registrar.isContractIDRegistered(factory.contractID)) {
     50        dump(
     51          factory.scheme +
     52            " is already registered. Storing currently registered object for restoration later."
     53        );
     54        old_factories.push({
     55          CID: registrar.contractIDToCID(factory.contractID),
     56          factory: Components.manager.getClassObject(
     57            Cc[factory.contractID],
     58            Ci.nsIFactory
     59          ),
     60        });
     61        old_factories_inds.push(true);
     62      } else {
     63        dump(factory.scheme + " has never been registered. Registering...");
     64        old_factories.push({ CID: "", factory: null });
     65        old_factories_inds.push(false);
     66      }
     67 
     68      registrar.registerFactory(
     69        factory.CID,
     70        "test-" + factory.scheme,
     71        factory.contractID,
     72        factory
     73      );
     74    } else {
     75      do_throw("CID " + factory.CID + " has already been registered!");
     76    }
     77  }
     78 
     79  // Check for new chrome
     80  let cr = Cc["@mozilla.org/chrome/chrome-registry;1"].getService(
     81    Ci.nsIChromeRegistry
     82  );
     83  cr.checkForNewChrome();
     84 
     85  // Check that our override worked
     86  let expectedURI = "data:application/xhtml+xml,";
     87  let sourceURI = "chrome://good-package/content/test.xul";
     88  try {
     89    sourceURI = Services.io.newURI(sourceURI);
     90    // this throws for packages that are not registered
     91    let uri = cr.convertChromeURL(sourceURI).spec;
     92 
     93    Assert.equal(expectedURI, uri);
     94  } catch (e) {
     95    dump(e + "\n");
     96    do_throw("Should have registered our URI!");
     97  }
     98 
     99  // Unregister our factories so we do not leak
    100  for (let i = 0; i < factories.length; i++) {
    101    let factory = factories[i];
    102    let ind = old_factories_inds[i];
    103    registrar.unregisterFactory(factory.CID, factory);
    104 
    105    if (ind) {
    106      let old_factory = old_factories[i];
    107      registrar.registerFactory(
    108        old_factory.CID,
    109        factory.scheme,
    110        factory.contractID,
    111        null
    112      );
    113    }
    114  }
    115 }