diff --git a/addon-sdk/source/lib/sdk/loader/cuddlefish.js b/addon-sdk/source/lib/sdk/loader/cuddlefish.js index aec0cea470d..f6b8b45cb15 100644 --- a/addon-sdk/source/lib/sdk/loader/cuddlefish.js +++ b/addon-sdk/source/lib/sdk/loader/cuddlefish.js @@ -14,25 +14,74 @@ module.metadata = { require('chrome') // Otherwise CFX will complain about Components require('toolkit/loader') // Otherwise CFX will stip out loader.js require('sdk/addon/runner') // Otherwise CFX will stip out addon/runner.js +require('sdk/system/xul-app') // Otherwise CFX will stip out sdk/system/xul-app */ const { classes: Cc, Constructor: CC, interfaces: Ci, utils: Cu } = Components; -const { - incompatibility -} = Cu.import("resource://gre/modules/sdk/system/XulApp.js", {}).XulApp; - // `loadSandbox` is exposed by bootstrap.js const loaderURI = module.uri.replace("sdk/loader/cuddlefish.js", "toolkit/loader.js"); +const xulappURI = module.uri.replace("loader/cuddlefish.js", + "system/xul-app.js"); // We need to keep a reference to the sandbox in order to unload it in // bootstrap.js const loaderSandbox = loadSandbox(loaderURI); const loaderModule = loaderSandbox.exports; +const xulappSandbox = loadSandbox(xulappURI); +const xulappModule = xulappSandbox.exports; + const { override, load } = loaderModule; +/** + * Ensure the current application satisfied the requirements specified in the + * module given. If not, an exception related to the incompatibility is + * returned; `null` otherwise. + * + * @param {Object} module + * The module to check + * @returns {Error} + */ +function incompatibility(module) { + let { metadata, id } = module; + + // if metadata or engines are not specified we assume compatibility is not + // an issue. + if (!metadata || !("engines" in metadata)) + return null; + + let { engines } = metadata; + + if (engines === null || typeof(engines) !== "object") + return new Error("Malformed engines' property in metadata"); + + let applications = Object.keys(engines); + + let versionRange; + applications.forEach(function(name) { + if (xulappModule.is(name)) { + versionRange = engines[name]; + // Continue iteration. We want to ensure the module doesn't + // contain a typo in the applications' name or some unknown + // application - `is` function throws an exception in that case. + } + }); + + if (typeof(versionRange) === "string") { + if (xulappModule.satisfiesVersion(versionRange)) + return null; + + return new Error("Unsupported Application version: The module " + id + + " currently supports only version " + versionRange + " of " + + xulappModule.name + "."); + } + + return new Error("Unsupported Application: The module " + id + + " currently supports only " + applications.join(", ") + ".") +} + function CuddlefishLoader(options) { let { manifest } = options; @@ -41,7 +90,8 @@ function CuddlefishLoader(options) { // cache to avoid subsequent loads via `require`. modules: override({ 'toolkit/loader': loaderModule, - 'sdk/loader/cuddlefish': exports + 'sdk/loader/cuddlefish': exports, + 'sdk/system/xul-app': xulappModule }, options.modules), resolve: function resolve(id, requirer) { let entry = requirer && requirer in manifest && manifest[requirer]; diff --git a/addon-sdk/source/lib/toolkit/loader.js b/addon-sdk/source/lib/toolkit/loader.js index e3add6ab79c..d2b17a1ab03 100644 --- a/addon-sdk/source/lib/toolkit/loader.js +++ b/addon-sdk/source/lib/toolkit/loader.js @@ -42,9 +42,6 @@ const { NetUtil } = Cu.import("resource://gre/modules/NetUtil.jsm", {}); const { Reflect } = Cu.import("resource://gre/modules/reflect.jsm", {}); const { ConsoleAPI } = Cu.import("resource://gre/modules/devtools/Console.jsm"); const { join: pathJoin, normalize, dirname } = Cu.import("resource://gre/modules/osfile/ospath_unix.jsm"); -const { - incompatibility -} = Cu.import("resource://gre/modules/sdk/system/XulApp.js", {}).XulApp; // Define some shortcuts. const bind = Function.call.bind(Function.bind); @@ -352,12 +349,6 @@ const load = iced(function load(loader, module) { }); } - let (error = incompatibility(module)) { - if (error) { - throw error; - } - } - if (module.exports && typeof(module.exports) === 'object') freeze(module.exports); diff --git a/addon-sdk/source/modules/system/XulApp.js b/addon-sdk/source/modules/system/XulApp.js index db3b0f7e7df..68148be3a80 100644 --- a/addon-sdk/source/modules/system/XulApp.js +++ b/addon-sdk/source/modules/system/XulApp.js @@ -183,51 +183,3 @@ function satisfiesVersion(version, versionRange) { }); } exports.satisfiesVersion = satisfiesVersion; - -/** - * Ensure the current application satisfied the requirements specified in the - * module given. If not, an exception related to the incompatibility is - * returned; `null` otherwise. - * - * @param {Object} module - * The module to check - * @returns {Error} - */ -function incompatibility(module) { - let { metadata, id } = module; - - // if metadata or engines are not specified we assume compatibility is not - // an issue. - if (!metadata || !("engines" in metadata)) - return null; - - let { engines } = metadata; - - if (engines === null || typeof(engines) !== "object") - return new Error("Malformed engines' property in metadata"); - - let applications = Object.keys(engines); - - let versionRange; - applications.forEach(function(name) { - if (is(name)) { - versionRange = engines[name]; - // Continue iteration. We want to ensure the module doesn't - // contain a typo in the applications' name or some unknown - // application - `is` function throws an exception in that case. - } - }); - - if (typeof(versionRange) === "string") { - if (satisfiesVersion(versionRange)) - return null; - - return new Error("Unsupported Application version: The module " + id + - " currently supports only version " + versionRange + " of " + - name + "."); - } - - return new Error("Unsupported Application: The module " + id + - " currently supports only " + applications.join(", ") + ".") -} -exports.incompatibility = incompatibility; diff --git a/addon-sdk/source/test/test-cuddlefish.js b/addon-sdk/source/test/test-cuddlefish.js index f28abc0a189..2d8bb6102a3 100644 --- a/addon-sdk/source/test/test-cuddlefish.js +++ b/addon-sdk/source/test/test-cuddlefish.js @@ -1,10 +1,10 @@ /* 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/. */ + 'use strict'; const { Loader, Require, unload, override } = require('sdk/loader/cuddlefish'); -const app = require('sdk/system/xul-app'); const packaging = require('@loader/options'); exports['test loader'] = function(assert) { @@ -44,19 +44,4 @@ exports['test loader'] = function(assert) { 'loader.unload() must call listeners in LIFO order.'); }; -exports['test loader on unsupported modules'] = function(assert) { - let loader = Loader({}); - let err = ""; - assert.throws(() => { - if (!app.is('Firefox')) { - require('./fixtures/loader/unsupported/firefox'); - } - else { - require('./fixtures/loader/unsupported/fennec'); - } - }, /^Unsupported Application/, "throws Unsupported Application"); - - unload(loader); -}; - -require('sdk/test').run(exports); +require('test').run(exports); diff --git a/addon-sdk/source/test/test-loader.js b/addon-sdk/source/test/test-loader.js index d948c3596fb..03ea1b3e0a1 100644 --- a/addon-sdk/source/test/test-loader.js +++ b/addon-sdk/source/test/test-loader.js @@ -1,6 +1,7 @@ /* 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/. */ + 'use strict'; let { @@ -10,10 +11,9 @@ let { readURI } = require('sdk/net/url'); let root = module.uri.substr(0, module.uri.lastIndexOf('/')) + // The following adds Debugger constructor to the global namespace. const { Cu } = require('chrome'); -const app = require('sdk/system/xul-app'); - const { addDebuggerToGlobal } = Cu.import('resource://gre/modules/jsdebugger.jsm', {}); addDebuggerToGlobal(this); @@ -331,7 +331,7 @@ exports['test console global by default'] = function (assert) { let uri = root + '/fixtures/loader/globals/'; let loader = Loader({ paths: { '': uri }}); let program = main(loader, 'main'); - + assert.ok(typeof program.console === 'object', 'global `console` exists'); assert.ok(typeof program.console.log === 'function', 'global `console.log` exists'); @@ -366,19 +366,4 @@ exports['test shared globals'] = function(assert) { unload(loader); } -exports['test loader on unsupported modules'] = function(assert) { - let loader = Loader({}); - let err = ""; - assert.throws(() => { - if (!app.is('Firefox')) { - require('./fixtures/loader/unsupported/firefox'); - } - else { - require('./fixtures/loader/unsupported/fennec'); - } - }, /^Unsupported Application/, "throws Unsupported Application"); - - unload(loader); -}; - -require('sdk/test').run(exports); +require('test').run(exports);