[Pkg-mozext-commits] [jpm.sh] 10/43: Using the new sdk/addon/bootstrap.js

Hema Prathaban hemaprathaban-guest at moszumanska.debian.org
Thu Aug 17 07:52:34 UTC 2017


This is an automated email from the git hooks/post-receive script.

hemaprathaban-guest pushed a commit to branch master
in repository jpm.sh.

commit 179ef3387d3910260002ba85b0b1ae8cba84248f
Author: Erik Vold <evold at mozilla.com>
Date:   Thu Feb 5 11:04:23 2015 -0800

    Using the new sdk/addon/bootstrap.js
---
 data/bootstrap.js | 390 ++----------------------------------------------------
 1 file changed, 8 insertions(+), 382 deletions(-)

diff --git a/data/bootstrap.js b/data/bootstrap.js
index 58b2a41..57e5efe 100644
--- a/data/bootstrap.js
+++ b/data/bootstrap.js
@@ -1,385 +1,11 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-// @see http://mxr.mozilla.org/mozilla-central/source/js/src/xpconnect/loader/mozJSComponentLoader.cpp
-
-'use strict';
-
-// IMPORTANT: Avoid adding any initialization tasks here, if you need to do
-// something before add-on is loaded consider addon/runner module instead!
-
-const { classes: Cc, Constructor: CC, interfaces: Ci, utils: Cu,
-        results: Cr, manager: Cm } = Components;
-const ioService = Cc['@mozilla.org/network/io-service;1'].
-                  getService(Ci.nsIIOService);
-const resourceHandler = ioService.getProtocolHandler('resource').
-                        QueryInterface(Ci.nsIResProtocolHandler);
-const systemPrincipal = CC('@mozilla.org/systemprincipal;1', 'nsIPrincipal')();
-const scriptLoader = Cc['@mozilla.org/moz/jssubscript-loader;1'].
-                     getService(Ci.mozIJSSubScriptLoader);
-const prefService = Cc['@mozilla.org/preferences-service;1'].
-                    getService(Ci.nsIPrefService).
-                    QueryInterface(Ci.nsIPrefBranch);
-const { get, exists } = Cc['@mozilla.org/process/environment;1'].
-                        getService(Ci.nsIEnvironment);
-
-const prefSvc = Cc["@mozilla.org/preferences-service;1"].
-                getService(Ci.nsIPrefService).getBranch(null);
-
-const { NetUtil } = Cu.import("resource://gre/modules/NetUtil.jsm", {});
-const { Promise: { defer } } = Cu.import("resource://gre/modules/Promise.jsm", {});
-const { Task: { spawn } } = Cu.import("resource://gre/modules/Task.jsm", {});
-// load below now, so that it can be used by sdk/addon/runner
-// see bug https://bugzilla.mozilla.org/show_bug.cgi?id=1042239
-const Startup = Cu.import("resource://gre/modules/sdk/system/Startup.js", {}).exports;
-
-const REASON = [ 'unknown', 'startup', 'shutdown', 'enable', 'disable',
-                 'install', 'uninstall', 'upgrade', 'downgrade' ];
-
-const bind = Function.call.bind(Function.bind);
-
-let loader = null;
-let unload = null;
-let loaderSandbox = null;
-let nukeTimer = null;
-
-function getPref(name, defaultValue) {
-  defaultValue = defaultValue || null;
-  switch (prefSvc.getPrefType(name)) {
-  case Ci.nsIPrefBranch.PREF_STRING:
-    return prefSvc.getComplexValue(name, Ci.nsISupportsString).data;
-
-  case Ci.nsIPrefBranch.PREF_INT:
-    return prefSvc.getIntPref(name);
-
-  case Ci.nsIPrefBranch.PREF_BOOL:
-    return prefSvc.getBoolPref(name);
-
-  default:
-    return defaultValue;
-  }
-}
-
-// Utility function reads URI async. Returns promise for the read
-// content.
-const readURI = (uri, charset="utf-8") => {
-  const channel = NetUtil.newChannel(uri, charset, null);
-  const { promise, resolve, reject } = defer();
-
-  try {
-    NetUtil.asyncFetch(channel, (stream, result) => {
-      if (Components.isSuccessCode(result)) {
-        const count = stream.available();
-        const data = NetUtil.readInputStreamToString(stream, count, {charset : charset});
-
-        resolve(data);
-      } else {
-        reject(Error("Failed to read: '" + uri + "' (Error Code: " + result + ")"));
-      }
-    });
-  }
-  catch ({message}) {
-    reject(Error("Failed to read: '" + uri + "' (Error: " + message + ")"));
-  }
-
-  return promise;
-}
-
-
-// We don't do anything on install & uninstall yet, but in a future
-// we should allow add-ons to cleanup after uninstall.
-const install = (data, reason) => {}
-const uninstall = (data, reason) => {}
-
-// Reads run configuration asynchronously, returns promise
-// for the config JSON.
-const readConfig = (rootURI) => {
-  const { resolve, reject, promise } = defer();
-  spawn(function () {
-    let config = null;
-    try {
-      const options = JSON.parse(yield (readURI(rootURI + "./harness-options.json")));
-      config = {
-        options: options,
-        metadata: options.metadata[options.name],
-        isNative: false
-      };
-    }
-    catch (_) {
-      try {
-        config = {
-          isNative: true,
-          options: {},
-          metadata: JSON.parse(yield readURI(rootURI + './package.json'))
-        };
-      }
-      catch(_) {}
-    }
-    resolve(config);
-  });
-
-  return promise;
-}
-
-const UUID_PATTERN = /^\{([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\}$/;
-// Takes add-on ID and normalizes it to a domain name so that add-on
-// can be mapped to resource://domain/
-const readDomain = id =>
-  // If only `@` character is the first one, than just substract it,
-  // otherwise fallback to legacy normalization code path. Note: `.`
-  // is valid character for resource substitutaiton & we intend to
-  // make add-on URIs intuitive, so it's best to just stick to an
-  // add-on author typed input.
-  id.lastIndexOf("@") === 0 ? id.substr(1).toLowerCase() :
-  id.toLowerCase().
-     replace(/@/g, "-at-").
-     replace(/\./g, "-dot-").
-     replace(UUID_PATTERN, "$1");
-
-const readPaths = (options, id, name, domain, baseURI, isNative=false) => {
-  let paths = {
-    "": "resource://gre/modules/commonjs/",
-    "./": isNative ? baseURI : baseURI + name + '/lib/',
-    "./tests/": (isNative ? baseURI : baseURI + name + '/') + 'tests/'
-  };
-
-  Object.keys(options.manifest || {}).reduce((paths, prefix) => {
-    paths[prefix + "/"] = baseURI + prefix + "/lib/";
-    paths[prefix + "tests/"] = baseURI + prefix + "/tests/";
-    return paths;
-  }, paths);
-
-  if (name == "addon-sdk")
-    paths["tests/"] = baseURI + "addon-sdk/tests/";
-
-
-  // If SDK is bundled and it is required to use bundled version
-  // of the SDK setup paths to do so.
-  const isSDKBundled = options["is-sdk-bundled"];
-  const useBundledSDK = options["force-use-bundled-sdk"] ||
-                        getPref("extensions.addon-sdk.useBundledSDK");
-
-  if (isSDKBundled && useBundledSDK) {
-    paths[""] = baseURI + "addon-sdk/lib/";
-    paths["test"] = baseURI + "addon-sdk/lib/sdk/test.js";
-  }
-
-  const branch = prefService.getBranch("extensions.modules." + id + ".path");
-  branch.getChildList("", {}).reduce((paths, name) => {
-    const path = name.substr(1).split(".").join("/");
-    const prefix = path.length ? path + "/" : path;
-    const value = branch.getCharPref(name);
-    const fileURI = value[value.length - 1] === "/" ? value :
-                    value + "/";
-    const key = "extensions.modules." + domain + ".commonjs.path" + name;
-    const uri = ioService.newURI(fileURI, null, null);
-    resourceHandler.setSubstitution(key, uri);
-
-    paths[prefix] = "resource://" + key + "/";
-    return paths;
-  }, paths);
-
-  return paths;
-}
-
-// Takes JSON `options` and sets prefs for each key under
-// the given `root`. Given `options` may contain nested
-// objects.
-const setPrefs = (root, options) =>
-  void Object.keys(options).forEach(id => {
-    const key = root + "." + id;
-    const value = options[id]
-    const type = typeof(value);
-
-    value === null ? void(0) :
-    value === undefined ? void(0) :
-    type === "boolean" ? prefService.setBoolPref(key, value) :
-    type === "string" ? prefService.setCharPref(key, value) :
-    type === "number" ? prefService.setIntPref(key, parseInt(value)) :
-    type === "object" ? setPrefs(key, value) :
-    void(0);
-  });
-
-const startup = (addon, reasonCode) => {
-  const reason = REASON[reasonCode];
-  const { id, version, resourceURI: { spec: rootURI } } = addon;
-  const loadCommand = exists("CFX_COMMAND") ?
-                        get("CFX_COMMAND") :
-                        getPref("extensions." + id + ".sdk.load.command", undefined);
-
-  spawn(function() {
-    try {
-      const config = readConfig(rootURI);
-      const { metadata, options, isNative } = (yield config);
-      const permissions = Object.freeze(metadata.permissions || {});
-      const domain = readDomain(id);
-      const name = metadata.name;
-
-      const baseURI = "resource://" + domain + "/";
-
-      const prefsURI = baseURI + "defaults/preferences/prefs.js";
-
-      const mappedURI = isNative ? rootURI + '/' : rootURI + '/resources/';
-      resourceHandler.setSubstitution(domain, ioService.newURI(mappedURI, null, null));
-
-      const paths = readPaths(options, id, name, domain, baseURI, isNative);
-
-      const loaderID = isNative ? "toolkit/loader" : "sdk/loader/cuddlefish";
-      const loaderURI = paths[""] + loaderID + ".js";
-
-      loaderSandbox = loadSandbox(loaderURI);
-
-      const loaderModule = loaderSandbox.exports;
-
-      unload = loaderModule.unload;
-
-      setPrefs("extensions." + id + ".sdk", {
-        id: id,
-        version: version,
-        domain: domain,
-        mainPath: options.mainPath,
-        baseURI: baseURI,
-        rootURI: rootURI,
-        load: {
-          reason: reason,
-          command: loadCommand
-        },
-        input: {
-          staticArgs: JSON.stringify(options.staticArgs)
-        },
-        output: {
-          resultFile: options.resultFile,
-          style: options.parseable ? "tbpl" : null,
-          logLevel: options.verbose ? "verbose" : null,
-        },
-        test: {
-          stop: options.stopOnError ? 1 : null,
-          filter: options.filter,
-          iterations: options.iterations,
-        },
-        profile: {
-          memory: options.profileMemory,
-          leaks: options.check_memory ? "refcount" : null
-        }
-      });
-
-      const modules = {};
-
-      // Manually set the loader's module cache to include itself;
-      // which otherwise fails due to lack of `Components`.
-      modules[loaderID] = loaderModule;
-      modules["@test/options"] = Object.freeze({});
-
-      loader = loaderModule.Loader({
-        id: id,
-        isNative: isNative,
-        prefixURI: baseURI,
-        rootURI: baseURI,
-        name: name,
-        paths: paths,
-        manifest: options.manifest || metadata,
-        metadata: metadata,
-        modules: modules,
-        noQuit: getPref("extensions." + id + ".sdk.test.no-quit", false)
-      });
-
-      const module = loaderModule.Module(loaderID, loaderURI);
-      const require = loaderModule.Require(loader, module);
-      const mainPath = (loadCommand == "test") ? "sdk/test/runner" : options.mainPath;
-
-      require("sdk/addon/runner").startup(reason, {
-        loader: loader,
-        prefsURI: prefsURI,
-        main: mainPath
-      });
-    }
-    catch (error) {
-      console.error("Failed to bootstrap addon: ", id, error);
-      throw error;
-    }
-  });
-};
-
-const loadSandbox = (uri) => {
-  let proto = {
-    sandboxPrototype: {
-      loadSandbox: loadSandbox,
-      ChromeWorker: ChromeWorker
-    }
-  };
-  let sandbox = Cu.Sandbox(systemPrincipal, proto);
-  // Create a fake commonjs environnement just to enable loading loader.js
-  // correctly
-  sandbox.exports = {};
-  sandbox.module = { uri: uri, exports: sandbox.exports };
-  sandbox.require = function (id) {
-    if (id !== "chrome")
-      throw new Error("Bootstrap sandbox `require` method isn't implemented.");
-
-    return Object.freeze({ Cc: Cc, Ci: Ci, Cu: Cu, Cr: Cr, Cm: Cm,
-      CC: bind(CC, Components), components: Components,
-      ChromeWorker: ChromeWorker });
-  };
-  scriptLoader.loadSubScript(uri, sandbox, 'UTF-8');
-  return sandbox;
-}
-
-const unloadSandbox = sandbox =>
-  Cu.nukeSandbox && sandbox && Cu.nukeSandbox(sandbox);
-
-const setTimeout = (callback, delay=0) => {
-  const timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
-  timer.initWithCallback({ notify: callback },
-                         delay,
-                         Ci.nsITimer.TYPE_ONE_SHOT);
-  return timer;
-}
-
-const shutdown = (data, reasonCode) => {
-  let reason = REASON[reasonCode];
-  if (loader) {
-    unload(loader, reason);
-    unload = null;
-
-    // Don't waste time cleaning up if the application is shutting down
-    if (reason != "shutdown") {
-      // Avoid leaking all modules when something goes wrong with one particular
-      // module. Do not clean it up immediatly in order to allow executing some
-      // actions on addon disabling.
-      // We need to keep a reference to the timer, otherwise it is collected
-      // and won't ever fire.
-      nukeTimer = setTimeout(nukeModules, 1000);
-    }
-  }
-};
-
-function nukeModules() {
-  nukeTimer = null;
-  // module objects store `exports` which comes from sandboxes
-  // We should avoid keeping link to these object to avoid leaking sandboxes
-  for (let id in loader.modules) {
-    delete loader.modules[id];
-  }
-
-  // Direct links to sandboxes should be removed too
-  for (let id in loader.sandboxes) {
-    let sandbox = loader.sandboxes[id];
-    delete loader.sandboxes[id];
-    // Bug 775067: From FF17 we can kill all CCW from a given sandbox
-    unloadSandbox(sandbox);
-  }
-  loader = null;
-
-  // both `toolkit/loader` and `system/xul-app` are loaded as JSM's via
-  // `cuddlefish.js`, and needs to be unloaded to avoid memory leaks, when
-  // the addon is unload.
-
-  unloadSandbox(loaderSandbox.loaderSandbox);
-  unloadSandbox(loaderSandbox.xulappSandbox);
-
-  // Bug 764840: We need to unload cuddlefish otherwise it will stay alive
-  // and keep a reference to this compartment.
-  unloadSandbox(loaderSandbox);
-  loaderSandbox = null;
-}
+"use strict";
+
+const { utils: Cu } = Components;
+const rootURI = __SCRIPT_URI_SPEC__.replace("bootstrap.js", "");
+const COMMONJS_URI = "resource://gre/modules/commonjs";
+const { require } = Cu.import(`${COMMONJS_URI}/toolkit/require.js`, {});
+const { Bootstrap } = require(`${COMMONJS_URI}/sdk/addon/bootstrap.js`);
+const { startup, shutdown, install, uninstall } = new Bootstrap(rootURI);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/jpm.sh.git



More information about the Pkg-mozext-commits mailing list