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 +}