addon-sdk/source/lib/sdk/test/loader.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/addon-sdk/source/lib/sdk/test/loader.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,122 @@
     1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.7 +
     1.8 +"use strict";
     1.9 +
    1.10 +const { resolveURI, Require,
    1.11 +        unload, override, descriptor } = require('../../toolkit/loader');
    1.12 +const { ensure } = require('../system/unload');
    1.13 +const addonWindow = require('../addon/window');
    1.14 +const { PlainTextConsole } = require('sdk/console/plain-text');
    1.15 +
    1.16 +let defaultGlobals = override(require('../system/globals'), {
    1.17 +  console: console
    1.18 +});
    1.19 +
    1.20 +function CustomLoader(module, globals, packaging, overrides={}) {
    1.21 +  let options = packaging || require("@loader/options");
    1.22 +  options = override(options, {
    1.23 +    id: overrides.id || options.id,
    1.24 +    globals: override(defaultGlobals, globals || {}),
    1.25 +    modules: override(options.modules || {}, {
    1.26 +      'sdk/addon/window': addonWindow
    1.27 +    })
    1.28 +  });
    1.29 +
    1.30 +  let loaderModule = options.isNative ? '../../toolkit/loader' : '../loader/cuddlefish';
    1.31 +  let { Loader } = require(loaderModule);
    1.32 +  let loader = Loader(options);
    1.33 +  let wrapper = Object.create(loader, descriptor({
    1.34 +    require: Require(loader, module),
    1.35 +    sandbox: function(id) {
    1.36 +      let requirement = loader.resolve(id, module.id);
    1.37 +      let uri = resolveURI(requirement, loader.mapping);
    1.38 +      return loader.sandboxes[uri];
    1.39 +    },
    1.40 +    unload: function(reason) {
    1.41 +      unload(loader, reason);
    1.42 +    }
    1.43 +  }));
    1.44 +  ensure(wrapper);
    1.45 +  return wrapper;
    1.46 +};
    1.47 +exports.Loader = CustomLoader;
    1.48 +
    1.49 +function HookedPlainTextConsole(hook, print, innerID) {
    1.50 +  this.log = hook.bind(null, "log", innerID);
    1.51 +  this.info = hook.bind(null, "info", innerID);
    1.52 +  this.warn = hook.bind(null, "warn", innerID);
    1.53 +  this.error = hook.bind(null, "error", innerID);
    1.54 +  this.debug = hook.bind(null, "debug", innerID);
    1.55 +  this.exception = hook.bind(null, "exception", innerID);
    1.56 +  this.time = hook.bind(null, "time", innerID);
    1.57 +  this.timeEnd = hook.bind(null, "timeEnd", innerID);
    1.58 +
    1.59 +  this.__exposedProps__ = {
    1.60 +    log: "rw", info: "rw", warn: "rw", error: "rw", debug: "rw",
    1.61 +    exception: "rw", time: "rw", timeEnd: "rw"
    1.62 +  };
    1.63 +}
    1.64 +
    1.65 +// Creates a custom loader instance whose console module is hooked in order
    1.66 +// to avoid printing messages to the console, and instead, expose them in the
    1.67 +// returned `messages` array attribute
    1.68 +exports.LoaderWithHookedConsole = function (module, callback) {
    1.69 +  let messages = [];
    1.70 +  function hook(type, innerID, msg) {
    1.71 +    messages.push({ type: type, msg: msg, innerID: innerID });
    1.72 +    if (callback)
    1.73 +      callback(type, msg, innerID);
    1.74 +  }
    1.75 +
    1.76 +  return {
    1.77 +    loader: CustomLoader(module, {
    1.78 +      console: new HookedPlainTextConsole(hook, null, null)
    1.79 +    }, override(require("@loader/options"), {
    1.80 +      modules: {
    1.81 +        'sdk/console/plain-text': {
    1.82 +          PlainTextConsole: HookedPlainTextConsole.bind(null, hook)
    1.83 +        }
    1.84 +      }
    1.85 +    })),
    1.86 +    messages: messages
    1.87 +  };
    1.88 +}
    1.89 +
    1.90 +// Same than LoaderWithHookedConsole with lower level, instead we get what is
    1.91 +// actually printed to the command line console
    1.92 +exports.LoaderWithHookedConsole2 = function (module, callback) {
    1.93 +  let messages = [];
    1.94 +  return {
    1.95 +    loader: CustomLoader(module, {
    1.96 +      console: new PlainTextConsole(function (msg) {
    1.97 +        messages.push(msg);
    1.98 +        if (callback)
    1.99 +          callback(msg);
   1.100 +      })
   1.101 +    }),
   1.102 +    messages: messages
   1.103 +  };
   1.104 +}
   1.105 +
   1.106 +// Creates a custom loader with a filtered console. The callback is passed every
   1.107 +// console message type and message and if it returns false the message will
   1.108 +// not be logged normally
   1.109 +exports.LoaderWithFilteredConsole = function (module, callback) {
   1.110 +  function hook(type, innerID, msg) {
   1.111 +    if (callback && callback(type, msg, innerID) == false)
   1.112 +      return;
   1.113 +    console[type](msg);
   1.114 +  }
   1.115 +
   1.116 +  return CustomLoader(module, {
   1.117 +    console: new HookedPlainTextConsole(hook, null, null)
   1.118 +  }, override(require("@loader/options"), {
   1.119 +    modules: {
   1.120 +      'sdk/console/plain-text': {
   1.121 +        PlainTextConsole: HookedPlainTextConsole.bind(null, hook)
   1.122 +      }
   1.123 +    }
   1.124 +  }));
   1.125 +}

mercurial