From 56000a9cb0ba795c69df4db852ccbb07dd634bce Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Fri, 7 Apr 2017 18:11:32 -0700 Subject: [PATCH] Bug 1314861: Lazily load most SDK module imports. r=rpl MozReview-Commit-ID: 3mneEkzljiU --HG-- extra : rebase_source : 72e988994ec70c643d869949967bdec3202d92c9 --- addon-sdk/source/lib/sdk/addon/bootstrap.js | 3 +- addon-sdk/source/lib/sdk/addon/runner.js | 4 - addon-sdk/source/lib/sdk/console/traceback.js | 2 +- addon-sdk/source/lib/sdk/content/events.js | 2 +- addon-sdk/source/lib/sdk/content/page-mod.js | 36 +++--- .../source/lib/sdk/content/page-worker.js | 18 +-- addon-sdk/source/lib/sdk/content/sandbox.js | 27 +++-- addon-sdk/source/lib/sdk/content/utils.js | 6 +- .../source/lib/sdk/content/worker-child.js | 12 +- addon-sdk/source/lib/sdk/content/worker.js | 14 +-- addon-sdk/source/lib/sdk/context-menu.js | 15 ++- .../source/lib/sdk/context-menu/context.js | 3 +- addon-sdk/source/lib/sdk/core/disposable.js | 5 +- addon-sdk/source/lib/sdk/core/observer.js | 2 +- .../source/lib/sdk/deprecated/unit-test.js | 8 +- addon-sdk/source/lib/sdk/event/dom.js | 2 +- addon-sdk/source/lib/sdk/event/utils.js | 2 +- .../source/lib/sdk/frame/hidden-frame.js | 12 +- addon-sdk/source/lib/sdk/io/buffer.js | 4 +- addon-sdk/source/lib/sdk/io/file.js | 5 +- addon-sdk/source/lib/sdk/io/fs.js | 9 +- addon-sdk/source/lib/sdk/io/stream.js | 7 +- .../lib/sdk/lang/functional/concurrent.js | 3 +- addon-sdk/source/lib/sdk/net/url.js | 3 +- addon-sdk/source/lib/sdk/page-mod.js | 10 +- addon-sdk/source/lib/sdk/page-worker.js | 14 +-- addon-sdk/source/lib/sdk/panel.js | 21 ++-- addon-sdk/source/lib/sdk/panel/events.js | 2 +- addon-sdk/source/lib/sdk/panel/utils.js | 18 +-- addon-sdk/source/lib/sdk/platform/xpcom.js | 4 +- .../lib/sdk/preferences/native-options.js | 109 ++++++++---------- .../source/lib/sdk/private-browsing/utils.js | 5 +- addon-sdk/source/lib/sdk/remote/parent.js | 3 +- addon-sdk/source/lib/sdk/remote/utils.js | 4 +- addon-sdk/source/lib/sdk/selection.js | 23 ++-- addon-sdk/source/lib/sdk/self.js | 2 +- addon-sdk/source/lib/sdk/simple-storage.js | 8 +- addon-sdk/source/lib/sdk/stylesheet/style.js | 10 +- addon-sdk/source/lib/sdk/system.js | 17 +-- addon-sdk/source/lib/sdk/system/globals.js | 59 +++++----- addon-sdk/source/lib/sdk/tabs/helpers.js | 2 +- addon-sdk/source/lib/sdk/tabs/tab.js | 4 +- addon-sdk/source/lib/sdk/tabs/tabs-firefox.js | 16 +-- addon-sdk/source/lib/sdk/tabs/utils.js | 6 +- addon-sdk/source/lib/sdk/test/harness.js | 2 +- addon-sdk/source/lib/sdk/test/utils.js | 14 +-- addon-sdk/source/lib/sdk/util/deprecate.js | 4 +- .../source/lib/sdk/util/match-pattern.js | 2 +- addon-sdk/source/lib/sdk/util/object.js | 2 +- addon-sdk/source/lib/sdk/util/rules.js | 4 +- addon-sdk/source/lib/sdk/util/sequence.js | 4 +- addon-sdk/source/lib/sdk/window/utils.js | 2 +- addon-sdk/source/test/leak/leak-utils.js | 3 +- 53 files changed, 282 insertions(+), 296 deletions(-) diff --git a/addon-sdk/source/lib/sdk/addon/bootstrap.js b/addon-sdk/source/lib/sdk/addon/bootstrap.js index 0397d91e51c9..8592e2f41caf 100644 --- a/addon-sdk/source/lib/sdk/addon/bootstrap.js +++ b/addon-sdk/source/lib/sdk/addon/bootstrap.js @@ -135,7 +135,8 @@ Bootstrap.prototype = { const prefsURI = `${baseURI}defaults/preferences/prefs.js`; // Init the 'sdk/webextension' module from the bootstrap addon parameter. - require("sdk/webextension").initFromBootstrapAddonParam(addon); + if (addon.webExtension) + require("sdk/webextension").initFromBootstrapAddonParam(addon); const { startup } = require("sdk/addon/runner"); startup(reason, {loader, main, prefsURI}); diff --git a/addon-sdk/source/lib/sdk/addon/runner.js b/addon-sdk/source/lib/sdk/addon/runner.js index 3977a04e4ae2..f2995c2ae078 100644 --- a/addon-sdk/source/lib/sdk/addon/runner.js +++ b/addon-sdk/source/lib/sdk/addon/runner.js @@ -10,14 +10,10 @@ const { Cc, Ci, Cu } = require('chrome'); const { rootURI, metadata, isNative } = require('@loader/options'); const { id, loadReason } = require('../self'); const { descriptor, Sandbox, evaluate, main, resolveURI } = require('toolkit/loader'); -const { once } = require('../system/events'); const { exit, env, staticArgs } = require('../system'); const { when: unload } = require('../system/unload'); const globals = require('../system/globals'); -const xulApp = require('../system/xul-app'); const { get } = require('../preferences/service'); -const appShellService = Cc['@mozilla.org/appshell/appShellService;1']. - getService(Ci.nsIAppShellService); const { preferences } = metadata; const Startup = Cu.import("resource://gre/modules/sdk/system/Startup.js", {}).exports; diff --git a/addon-sdk/source/lib/sdk/console/traceback.js b/addon-sdk/source/lib/sdk/console/traceback.js index be0fb7b94ff6..7bf0639fd160 100644 --- a/addon-sdk/source/lib/sdk/console/traceback.js +++ b/addon-sdk/source/lib/sdk/console/traceback.js @@ -9,7 +9,7 @@ module.metadata = { const { Ci, components } = require("chrome"); const { parseStack, sourceURI } = require("toolkit/loader"); -const { readURISync } = require("../net/url"); +lazyRequire(this, "../net/url", "readURISync"); function safeGetFileLine(path, line) { try { diff --git a/addon-sdk/source/lib/sdk/content/events.js b/addon-sdk/source/lib/sdk/content/events.js index c085b617999c..0d939f702c83 100644 --- a/addon-sdk/source/lib/sdk/content/events.js +++ b/addon-sdk/source/lib/sdk/content/events.js @@ -9,7 +9,7 @@ module.metadata = { }; const { Ci } = require("chrome"); -const { open } = require("../event/dom"); +lazyRequire(this, "../event/dom", "open"); const { observe } = require("../event/chrome"); const { filter, merge, map, expand } = require("../event/utils"); const { windows } = require("../window/utils"); diff --git a/addon-sdk/source/lib/sdk/content/page-mod.js b/addon-sdk/source/lib/sdk/content/page-mod.js index 2c12781dfa14..81dd67788274 100644 --- a/addon-sdk/source/lib/sdk/content/page-mod.js +++ b/addon-sdk/source/lib/sdk/content/page-mod.js @@ -7,26 +7,20 @@ module.metadata = { "stability": "stable" }; -const { getAttachEventType } = require('../content/utils'); +lazyRequire(this, '../content/utils', 'getAttachEventType'); const { Class } = require('../core/heritage'); const { Disposable } = require('../core/disposable'); -const { WeakReference } = require('../core/reference'); -const { WorkerChild } = require('./worker-child'); +lazyRequire(this, './worker-child', 'WorkerChild'); const { EventTarget } = require('../event/target'); const { on, emit, once, setListeners } = require('../event/core'); -const { on: domOn, removeListener: domOff } = require('../dom/events'); -const { isRegExp, isUndefined } = require('../lang/type'); -const { merge } = require('../util/object'); -const { isBrowser, getFrames } = require('../window/utils'); -const { getTabs, getURI: getTabURI } = require('../tabs/utils'); -const { ignoreWindow } = require('../private-browsing/utils'); -const { Style } = require("../stylesheet/style"); -const { attach, detach } = require("../content/mod"); -const { has, hasAny } = require("../util/array"); -const { Rules } = require("../util/rules"); -const { List, addListItem, removeListItem } = require('../util/list'); -const { when } = require("../system/unload"); -const { uuid } = require('../util/uuid'); +lazyRequire(this, '../dom/events',{'on': 'domOn', 'removeListener': 'domOff'}); +lazyRequire(this, '../util/object', "merge"); +lazyRequire(this, '../window/utils', "getFrames"); +lazyRequire(this, '../private-browsing/utils', "ignoreWindow"); +lazyRequire(this, '../stylesheet/style', 'Style'); +lazyRequire(this, '../content/mod', 'attach', 'detach'); +lazyRequire(this, '../util/rules', 'Rules'); +lazyRequire(this, '../util/uuid', 'uuid'); const { frames, process } = require('../remote/child'); const pagemods = new Map(); @@ -79,7 +73,7 @@ const ChildPageMod = Class({ // `applyOnExistingDocuments` has to be called after `pagemods.add()` // otherwise its calls to `onContent` method won't do anything. - if (has(this.attachTo, 'existing')) + if (this.attachTo.includes('existing')) applyOnExistingDocuments(this); }, @@ -132,9 +126,9 @@ function applyOnExistingDocuments (mod) { if (!window || !window.frames) return; let uri = window.location.href; - if (has(mod.attachTo, "top") && modMatchesURI(mod, uri)) + if (mod.attachTo.includes("top") && modMatchesURI(mod, uri)) onContent(mod, window); - if (has(mod.attachTo, "frame")) + if (mod.attachTo.includes("frame")) getFrames(window). filter(iframe => modMatchesURI(mod, iframe.location.href)). forEach(frame => onContent(mod, frame)); @@ -167,10 +161,10 @@ function createWorker(mod, window) { function onContent (mod, window) { let isTopDocument = window.top === window; // Is a top level document and `top` is not set, ignore - if (isTopDocument && !has(mod.attachTo, "top")) + if (isTopDocument && !mod.attachTo.includes("top")) return; // Is a frame document and `frame` is not set, ignore - if (!isTopDocument && !has(mod.attachTo, "frame")) + if (!isTopDocument && !mod.attachTo.includes("frame")) return; // ensure we attach only once per document diff --git a/addon-sdk/source/lib/sdk/content/page-worker.js b/addon-sdk/source/lib/sdk/content/page-worker.js index 87fba0c216e7..dfb32874040a 100644 --- a/addon-sdk/source/lib/sdk/content/page-worker.js +++ b/addon-sdk/source/lib/sdk/content/page-worker.js @@ -6,19 +6,21 @@ const { frames } = require("../remote/child"); const { Class } = require("../core/heritage"); const { Disposable } = require('../core/disposable'); -const { data } = require("../self"); -const { once } = require("../dom/events"); -const { getAttachEventType } = require("./utils"); -const { Rules } = require('../util/rules'); -const { uuid } = require('../util/uuid'); -const { WorkerChild } = require("./worker-child"); +lazyRequire(this, "../self", "data"); +lazyRequire(this, "../dom/events", "once"); +lazyRequire(this, "./utils", "getAttachEventType"); +lazyRequire(this, '../util/rules', "Rules"); +lazyRequire(this, '../util/uuid', "uuid"); +lazyRequire(this, "./worker-child", "WorkerChild"); const { Cc, Ci, Cu } = require("chrome"); const { on: onSystemEvent } = require("../system/events"); -const appShell = Cc["@mozilla.org/appshell/appShellService;1"].getService(Ci.nsIAppShellService); - const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm"); +XPCOMUtils.defineLazyServiceGetter(this, 'appShell', + "@mozilla.org/appshell/appShellService;1", + "nsIAppShellService"); + const pages = new Map(); const DOC_INSERTED = "document-element-inserted"; diff --git a/addon-sdk/source/lib/sdk/content/sandbox.js b/addon-sdk/source/lib/sdk/content/sandbox.js index 096ba5c870bf..a984e827dd1a 100644 --- a/addon-sdk/source/lib/sdk/content/sandbox.js +++ b/addon-sdk/source/lib/sdk/content/sandbox.js @@ -9,19 +9,22 @@ module.metadata = { const { Class } = require('../core/heritage'); const { EventTarget } = require('../event/target'); -const { on, off, emit } = require('../event/core'); -const { events } = require('./sandbox/events'); -const { requiresAddonGlobal } = require('./utils'); -const { delay: async } = require('../lang/functional'); +lazyRequire(this, '../event/core', "on", "off", "emit"); +lazyRequire(this, './sandbox/events', "events"); +lazyRequire(this, './utils', "requiresAddonGlobal"); +lazyRequire(this, '../lang/functional', {"delay": "async"}); const { Ci, Cu, Cc } = require('chrome'); -const timer = require('../timers'); -const { URL } = require('../url'); -const { sandbox, evaluate, load } = require('../loader/sandbox'); -const { merge } = require('../util/object'); -const { getTabForContentWindowNoShim } = require('../tabs/utils'); -const { getInnerId } = require('../window/utils'); -const { PlainTextConsole } = require('../console/plain-text'); -const { data } = require('../self');const { isChildLoader } = require('../remote/core'); +lazyRequireModule(this, "../timers", "timer"); +lazyRequire(this, '../url', "URL"); +lazyRequire(this, '../loader/sandbox', "sandbox", "evaluate", "load"); +lazyRequire(this, '../util/object', "merge"); +lazyRequire(this, '../tabs/utils', "getTabForContentWindowNoShim"); +lazyRequire(this, '../window/utils', "getInnerId"); +lazyRequire(this, '../console/plain-text', "PlainTextConsole"); + +lazyRequire(this, '../self', "data"); +lazyRequire(this, '../remote/core', "isChildLoader"); + // WeakMap of sandboxes so we can access private values const sandboxes = new WeakMap(); diff --git a/addon-sdk/source/lib/sdk/content/utils.js b/addon-sdk/source/lib/sdk/content/utils.js index 90995a6144e6..fd18088b0baf 100644 --- a/addon-sdk/source/lib/sdk/content/utils.js +++ b/addon-sdk/source/lib/sdk/content/utils.js @@ -7,12 +7,12 @@ module.metadata = { 'stability': 'unstable' }; -var { merge } = require('../util/object'); -var { data } = require('../self'); +lazyRequire(this, '../util/object', "merge"); +lazyRequire(this, '../self', "data"); var assetsURI = data.url(); var isArray = Array.isArray; var method = require('../../method/core'); -var { uuid } = require('../util/uuid'); +lazyRequire(this, '../util/uuid', "uuid"); const isAddonContent = ({ contentURL }) => contentURL && data.url(contentURL).startsWith(assetsURI); diff --git a/addon-sdk/source/lib/sdk/content/worker-child.js b/addon-sdk/source/lib/sdk/content/worker-child.js index dbf65a933c88..3f9a54b45be3 100644 --- a/addon-sdk/source/lib/sdk/content/worker-child.js +++ b/addon-sdk/source/lib/sdk/content/worker-child.js @@ -3,15 +3,15 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 'use strict'; -const { merge } = require('../util/object'); +lazyRequire(this, '../util/object', 'merge'); const { Class } = require('../core/heritage'); -const { emit } = require('../event/core'); +lazyRequire(this, '../event/core', 'emit'); const { EventTarget } = require('../event/target'); -const { getInnerId, getByInnerId } = require('../window/utils'); -const { instanceOf, isObject } = require('../lang/type'); -const system = require('../system/events'); +lazyRequire(this, '../window/utils', 'getInnerId'); +lazyRequire(this, '../lang/type', 'instanceOf', 'isObject'); +lazyRequireModule(this, '../system/events', 'system'); const { when } = require('../system/unload'); -const { WorkerSandbox } = require('./sandbox'); +lazyRequire(this, './sandbox', 'WorkerSandbox'); const { Ci } = require('chrome'); const { process, frames } = require('../remote/child'); diff --git a/addon-sdk/source/lib/sdk/content/worker.js b/addon-sdk/source/lib/sdk/content/worker.js index 39b940a8808e..f17ddfd81ac9 100644 --- a/addon-sdk/source/lib/sdk/content/worker.js +++ b/addon-sdk/source/lib/sdk/content/worker.js @@ -7,19 +7,19 @@ module.metadata = { "stability": "unstable" }; -const { emit } = require('../event/core'); +lazyRequire(this, '../event/core', "emit"); const { omit, merge } = require('../util/object'); const { Class } = require('../core/heritage'); const { method } = require('../lang/functional'); -const { getInnerId } = require('../window/utils'); +lazyRequire(this, '../window/utils', "getInnerId"); const { EventTarget } = require('../event/target'); -const { isPrivate } = require('../private-browsing/utils'); -const { getTabForBrowser, getTabForContentWindowNoShim, getBrowserForTab } = require('../tabs/utils'); -const { attach, connect, detach, destroy, makeChildOptions } = require('./utils'); +lazyRequire(this, '../private-browsing/utils', "isPrivate"); +lazyRequire(this, '../tabs/utils', "getTabForBrowser", "getTabForContentWindowNoShim", "getBrowserForTab"); +lazyRequire(this, './utils', "attach", "connect", "detach", "destroy", "makeChildOptions"); const { ensure } = require('../system/unload'); -const { on: observe } = require('../system/events'); +lazyRequire(this, '../system/events', {"on": "observe"}); const { Ci, Cu } = require('chrome'); -const { modelFor: tabFor } = require('sdk/model/core'); +lazyRequire(this, 'sdk/model/core', {"modelFor": "tabFor"}); const { remoteRequire, processes, frames } = require('../remote/parent'); remoteRequire('sdk/content/worker-child'); diff --git a/addon-sdk/source/lib/sdk/context-menu.js b/addon-sdk/source/lib/sdk/context-menu.js index 7d361b592b23..1cb9e735cd33 100644 --- a/addon-sdk/source/lib/sdk/context-menu.js +++ b/addon-sdk/source/lib/sdk/context-menu.js @@ -13,19 +13,18 @@ module.metadata = { }; const { Class, mix } = require("./core/heritage"); -const { addCollectionProperty } = require("./util/collection"); const { ns } = require("./core/namespace"); -const { validateOptions, getTypeOf } = require("./deprecated/api-utils"); -const { URL, isValidURI } = require("./url"); -const { WindowTracker, browserWindowIterator } = require("./deprecated/window-utils"); -const { isBrowser, getInnerId } = require("./window/utils"); -const { MatchPattern } = require("./util/match-pattern"); +lazyRequire(this, "./deprecated/api-utils", "validateOptions", "getTypeOf"); +lazyRequire(this, "./url", "URL", "isValidURI"); +lazyRequire(this, "./deprecated/window-utils", "WindowTracker", "browserWindowIterator"); +lazyRequire(this, "./window/utils", "isBrowser", "getInnerId"); +lazyRequire(this, "./util/match-pattern", "MatchPattern"); const { EventTarget } = require("./event/target"); -const { emit } = require('./event/core'); +lazyRequire(this, './event/core', "emit"); const { when } = require('./system/unload'); const { contract: loaderContract } = require('./content/loader'); const { omit } = require('./util/object'); -const self = require('./self') +lazyRequireModule(this, './self', "self"); const { remoteRequire, processes } = require('./remote/parent'); remoteRequire('sdk/content/context-menu'); diff --git a/addon-sdk/source/lib/sdk/context-menu/context.js b/addon-sdk/source/lib/sdk/context-menu/context.js index fc5aea500256..32674dfc75ee 100644 --- a/addon-sdk/source/lib/sdk/context-menu/context.js +++ b/addon-sdk/source/lib/sdk/context-menu/context.js @@ -3,8 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ const { Class } = require("../core/heritage"); -const { extend } = require("../util/object"); -const { MatchPattern } = require("../util/match-pattern"); +lazyRequire(this, "../util/match-pattern", "MatchPattern"); const readers = require("./readers"); // Context class is required to implement a single `isCurrent(target)` method diff --git a/addon-sdk/source/lib/sdk/core/disposable.js b/addon-sdk/source/lib/sdk/core/disposable.js index 19f7eaa9fa80..860e7cc1da49 100644 --- a/addon-sdk/source/lib/sdk/core/disposable.js +++ b/addon-sdk/source/lib/sdk/core/disposable.js @@ -10,8 +10,9 @@ module.metadata = { const { Class } = require("./heritage"); const { Observer, subscribe, unsubscribe, observe } = require("./observer"); -const { isWeak } = require("./reference"); -const SDKWeakSet = require("../lang/weak-set"); + +lazyRequire(this, "./reference", "isWeak"); +lazyRequireModule(this, "../lang/weak-set", "SDKWeakSet"); const method = require("../../method/core"); diff --git a/addon-sdk/source/lib/sdk/core/observer.js b/addon-sdk/source/lib/sdk/core/observer.js index 7e11bf8f936a..062fdb1585f8 100644 --- a/addon-sdk/source/lib/sdk/core/observer.js +++ b/addon-sdk/source/lib/sdk/core/observer.js @@ -11,7 +11,7 @@ module.metadata = { const { Cc, Ci, Cr, Cu } = require("chrome"); const { Class } = require("./heritage"); -const { isWeak } = require("./reference"); +lazyRequire(this, "./reference", "isWeak"); const method = require("../../method/core"); const observerService = Cc['@mozilla.org/observer-service;1']. diff --git a/addon-sdk/source/lib/sdk/deprecated/unit-test.js b/addon-sdk/source/lib/sdk/deprecated/unit-test.js index 39c7759da923..c54075e28c07 100644 --- a/addon-sdk/source/lib/sdk/deprecated/unit-test.js +++ b/addon-sdk/source/lib/sdk/deprecated/unit-test.js @@ -7,12 +7,12 @@ module.metadata = { "stability": "deprecated" }; -const timer = require("../timers"); +lazyRequireModule(this, "../timers", "timer"); const cfxArgs = require("../test/options"); -const { getTabs, closeTab, getURI, getTabId, getSelectedTab } = require("../tabs/utils"); -const { windows, isBrowser, getMostRecentBrowserWindow } = require("../window/utils"); +lazyRequire(this, "../tabs/utils", "getTabs", "closeTab", "getURI", "getTabId", "getSelectedTab"); +lazyRequire(this, "../window/utils", "windows", "isBrowser", "getMostRecentBrowserWindow"); const { defer, all, Debugging: PromiseDebugging, resolve } = require("../core/promise"); -const { getInnerId } = require("../window/utils"); +lazyRequire(this, "../window/utils", "getInnerId"); const { cleanUI } = require("../test/utils"); const findAndRunTests = function findAndRunTests(options) { diff --git a/addon-sdk/source/lib/sdk/event/dom.js b/addon-sdk/source/lib/sdk/event/dom.js index 93297f7e4e3c..2d4d4b421705 100644 --- a/addon-sdk/source/lib/sdk/event/dom.js +++ b/addon-sdk/source/lib/sdk/event/dom.js @@ -10,7 +10,7 @@ module.metadata = { const { Ci } = require("chrome"); -var { emit } = require("./core"); +lazyRequire(this, "./core", "emit"); var { when: unload } = require("../system/unload"); var listeners = new WeakMap(); diff --git a/addon-sdk/source/lib/sdk/event/utils.js b/addon-sdk/source/lib/sdk/event/utils.js index f193b67853b4..a317b64daaf8 100644 --- a/addon-sdk/source/lib/sdk/event/utils.js +++ b/addon-sdk/source/lib/sdk/event/utils.js @@ -7,7 +7,7 @@ module.metadata = { "stability": "unstable" }; -var { emit, on, once, off, EVENT_TYPE_PATTERN } = require("./core"); +lazyRequire(this, "./core", "emit", "on", "once", "off", "EVENT_TYPE_PATTERN"); const { Cu } = require("chrome"); // This module provides set of high order function for working with event diff --git a/addon-sdk/source/lib/sdk/frame/hidden-frame.js b/addon-sdk/source/lib/sdk/frame/hidden-frame.js index 09e7829509ca..4eacbdc32963 100644 --- a/addon-sdk/source/lib/sdk/frame/hidden-frame.js +++ b/addon-sdk/source/lib/sdk/frame/hidden-frame.js @@ -12,13 +12,13 @@ const { Cc, Ci } = require("chrome"); const { Class } = require("../core/heritage"); const { List, addListItem, removeListItem } = require("../util/list"); const { EventTarget } = require("../event/target"); -const { emit } = require("../event/core"); -const { create: makeFrame } = require("./utils"); -const { defer } = require("../core/promise"); +lazyRequire(this, "../event/core", "emit"); +lazyRequire(this, "./utils", { "create": "makeFrame" }); +lazyRequire(this, "../core/promise", "defer"); const { when: unload } = require("../system/unload"); -const { validateOptions, getTypeOf } = require("../deprecated/api-utils"); -const { window } = require("../addon/window"); -const { fromIterator } = require("../util/array"); +lazyRequire(this, "../deprecated/api-utils", "validateOptions", "getTypeOf"); +lazyRequire(this, "../addon/window", "window"); +lazyRequire(this, "../util/array", "fromIterator"); // This cache is used to access friend properties between functions // without exposing them on the public API. diff --git a/addon-sdk/source/lib/sdk/io/buffer.js b/addon-sdk/source/lib/sdk/io/buffer.js index 5ea169402fcf..31a5854cd090 100644 --- a/addon-sdk/source/lib/sdk/io/buffer.js +++ b/addon-sdk/source/lib/sdk/io/buffer.js @@ -18,8 +18,8 @@ module.metadata = { */ const { Cu } = require('chrome'); -const { isNumber } = require('sdk/lang/type'); -const { TextEncoder, TextDecoder } = Cu.import('resource://gre/modules/commonjs/toolkit/loader.js', {}); +lazyRequire(this, 'sdk/lang/type', "isNumber"); +Cu.importGlobalProperties(["TextEncoder", "TextDecoder"]); exports.TextEncoder = TextEncoder; exports.TextDecoder = TextDecoder; diff --git a/addon-sdk/source/lib/sdk/io/file.js b/addon-sdk/source/lib/sdk/io/file.js index 47467df87388..17055b45d8a9 100644 --- a/addon-sdk/source/lib/sdk/io/file.js +++ b/addon-sdk/source/lib/sdk/io/file.js @@ -9,8 +9,9 @@ module.metadata = { }; const {Cc,Ci,Cr} = require("chrome"); -const byteStreams = require("./byte-streams"); -const textStreams = require("./text-streams"); + +lazyRequireModule(this, "./byte-streams", "byteStreams"); +lazyRequireModule(this, "./text-streams", "textStreams"); // Flags passed when opening a file. See nsprpub/pr/include/prio.h. const OPEN_FLAGS = { diff --git a/addon-sdk/source/lib/sdk/io/fs.js b/addon-sdk/source/lib/sdk/io/fs.js index 860a884a5c39..c8199c4b4e96 100644 --- a/addon-sdk/source/lib/sdk/io/fs.js +++ b/addon-sdk/source/lib/sdk/io/fs.js @@ -9,10 +9,11 @@ module.metadata = { const { Cc, Ci, CC } = require("chrome"); -const { setTimeout } = require("../timers"); -const { Stream, InputStream, OutputStream } = require("./stream"); -const { emit, on } = require("../event/core"); -const { Buffer } = require("./buffer"); +lazyRequire(this, "../timers", "setTimeout"); +lazyRequire(this, "./stream", "Stream", "InputStream", "OutputStream"); +lazyRequire(this, "../event/core", "emit", "on"); +lazyRequire(this, "./buffer", "Buffer"); + const { ns } = require("../core/namespace"); const { Class } = require("../core/heritage"); diff --git a/addon-sdk/source/lib/sdk/io/stream.js b/addon-sdk/source/lib/sdk/io/stream.js index 0698b8e324a5..7aa8583d6b25 100644 --- a/addon-sdk/source/lib/sdk/io/stream.js +++ b/addon-sdk/source/lib/sdk/io/stream.js @@ -9,10 +9,11 @@ module.metadata = { const { CC, Cc, Ci, Cu, Cr, components } = require("chrome"); const { EventTarget } = require("../event/target"); -const { emit } = require("../event/core"); -const { Buffer } = require("./buffer"); const { Class } = require("../core/heritage"); -const { setTimeout } = require("../timers"); + +lazyRequire(this, "../event/core", "emit"); +lazyRequire(this, "./buffer", "Buffer"); +lazyRequire(this, "../timers", "setTimeout"); const MultiplexInputStream = CC("@mozilla.org/io/multiplex-input-stream;1", diff --git a/addon-sdk/source/lib/sdk/lang/functional/concurrent.js b/addon-sdk/source/lib/sdk/lang/functional/concurrent.js index 85e8cff46fb3..b21ca30b16d2 100644 --- a/addon-sdk/source/lib/sdk/lang/functional/concurrent.js +++ b/addon-sdk/source/lib/sdk/lang/functional/concurrent.js @@ -13,7 +13,8 @@ module.metadata = { }; const { arity, name, derive, invoke } = require("./helpers"); -const { setTimeout, clearTimeout, setImmediate } = require("../../timers"); + +lazyRequire(this, "sdk/timers", "setTimeout", "clearTimeout", "setImmediate"); /** * Takes a function and returns a wrapped one instead, calling which will call diff --git a/addon-sdk/source/lib/sdk/net/url.js b/addon-sdk/source/lib/sdk/net/url.js index 5502171eedaf..539cada1c2fd 100644 --- a/addon-sdk/source/lib/sdk/net/url.js +++ b/addon-sdk/source/lib/sdk/net/url.js @@ -10,8 +10,7 @@ module.metadata = { const { Ci, Cu, components } = require("chrome"); -const { defer } = require("../core/promise"); -const { merge } = require("../util/object"); +lazyRequire(this, "../core/promise", "defer"); const { NetUtil } = Cu.import("resource://gre/modules/NetUtil.jsm", {}); const { Services } = Cu.import("resource://gre/modules/Services.jsm", {}); diff --git a/addon-sdk/source/lib/sdk/page-mod.js b/addon-sdk/source/lib/sdk/page-mod.js index cd1090478f28..b867f10c69c3 100644 --- a/addon-sdk/source/lib/sdk/page-mod.js +++ b/addon-sdk/source/lib/sdk/page-mod.js @@ -12,13 +12,13 @@ const { contract } = require('./util/contract'); const { WorkerHost, connect } = require('./content/utils'); const { Class } = require('./core/heritage'); const { Disposable } = require('./core/disposable'); -const { Worker } = require('./content/worker'); +lazyRequire(this, './content/worker', "Worker"); const { EventTarget } = require('./event/target'); -const { on, emit, once, setListeners } = require('./event/core'); -const { isRegExp, isUndefined } = require('./lang/type'); +lazyRequire(this, './event/core', "on", "emit", "once", "setListeners"); +lazyRequire(this, './lang/type', "isRegExp", "isUndefined"); const { merge, omit } = require('./util/object'); -const { remove, has, hasAny } = require("./util/array"); -const { Rules } = require("./util/rules"); +lazyRequire(this, "./util/array", "remove", "has", "hasAny"); +lazyRequire(this, "./util/rules", "Rules"); const { processes, frames, remoteRequire } = require('./remote/parent'); remoteRequire('sdk/content/page-mod'); diff --git a/addon-sdk/source/lib/sdk/page-worker.js b/addon-sdk/source/lib/sdk/page-worker.js index 837cf774bed0..c554de21d18c 100644 --- a/addon-sdk/source/lib/sdk/page-worker.js +++ b/addon-sdk/source/lib/sdk/page-worker.js @@ -9,19 +9,19 @@ module.metadata = { const { Class } = require('./core/heritage'); const { ns } = require('./core/namespace'); -const { pipe, stripListeners } = require('./event/utils'); +lazyRequire(this, './event/utils', "pipe", "stripListeners"); const { connect, destroy, WorkerHost } = require('./content/utils'); -const { Worker } = require('./content/worker'); +lazyRequire(this, './content/worker', "Worker"); const { Disposable } = require('./core/disposable'); const { EventTarget } = require('./event/target'); -const { setListeners } = require('./event/core'); -const { window } = require('./addon/window'); -const { create: makeFrame, getDocShell } = require('./frame/utils'); +lazyRequire(this, './event/core', "setListeners"); +lazyRequire(this, './addon/window', "window"); +lazyRequire(this, './frame/utils', { "create": "makeFrame" }, "getDocShell"); const { contract } = require('./util/contract'); const { contract: loaderContract } = require('./content/loader'); -const { Rules } = require('./util/rules'); +lazyRequire(this, './util/rules', "Rules"); const { merge } = require('./util/object'); -const { uuid } = require('./util/uuid'); +lazyRequire(this, './util/uuid', "uuid"); const { useRemoteProcesses, remoteRequire, frames } = require("./remote/parent"); remoteRequire("sdk/content/page-worker"); diff --git a/addon-sdk/source/lib/sdk/panel.js b/addon-sdk/source/lib/sdk/panel.js index a198920050a9..7c3f1d2f0333 100644 --- a/addon-sdk/source/lib/sdk/panel.js +++ b/addon-sdk/source/lib/sdk/panel.js @@ -14,28 +14,27 @@ module.metadata = { }; const { Cu, Ci } = require("chrome"); -const { setTimeout } = require('./timers'); +lazyRequire(this, './timers', "setTimeout"); const { Class } = require("./core/heritage"); const { DefaultWeakMap, merge } = require("./util/object"); const { WorkerHost } = require("./content/utils"); -const { Worker } = require("./deprecated/sync-worker"); +lazyRequire(this, "./deprecated/sync-worker", "Worker"); const { Disposable } = require("./core/disposable"); const { WeakReference } = require('./core/reference'); const { contract: loaderContract } = require("./content/loader"); const { contract } = require("./util/contract"); -const { on, off, emit, setListeners } = require("./event/core"); +lazyRequire(this, "./event/core", "on", "off", "emit", "setListeners"); const { EventTarget } = require("./event/target"); -const domPanel = require("./panel/utils"); -const { getDocShell } = require('./frame/utils'); +lazyRequireModule(this, "./panel/utils", "domPanel"); +lazyRequire(this, './frame/utils', "getDocShell"); const { events } = require("./panel/events"); -const systemEvents = require("./system/events"); const { filter, pipe, stripListeners } = require("./event/utils"); -const { getNodeView, getActiveView } = require("./view/core"); -const { isNil, isObject, isNumber } = require("./lang/type"); -const { getAttachEventType } = require("./content/utils"); +lazyRequire(this, "./view/core", "getNodeView", "getActiveView"); +lazyRequire(this, "./lang/type", "isNil", "isObject", "isNumber"); +lazyRequire(this, "./content/utils", "getAttachEventType"); const { number, boolean, object } = require('./deprecated/api-utils'); -const { Style } = require("./stylesheet/style"); -const { attach, detach } = require("./content/mod"); +lazyRequire(this, "./stylesheet/style", "Style"); +lazyRequire(this, "./content/mod", "attach", "detach"); var isRect = ({top, right, bottom, left}) => [top, right, bottom, left]. some(value => isNumber(value) && !isNaN(value)); diff --git a/addon-sdk/source/lib/sdk/panel/events.js b/addon-sdk/source/lib/sdk/panel/events.js index f3040a11ddd2..2f14ba22f73b 100644 --- a/addon-sdk/source/lib/sdk/panel/events.js +++ b/addon-sdk/source/lib/sdk/panel/events.js @@ -12,7 +12,7 @@ module.metadata = { }; const events = require("../system/events"); -const { emit } = require("../event/core"); +lazyRequire(this, "../event/core", "emit"); var channel = {}; diff --git a/addon-sdk/source/lib/sdk/panel/utils.js b/addon-sdk/source/lib/sdk/panel/utils.js index 5a39ff68f362..41daeef74710 100644 --- a/addon-sdk/source/lib/sdk/panel/utils.js +++ b/addon-sdk/source/lib/sdk/panel/utils.js @@ -10,17 +10,17 @@ module.metadata = { const { Cc, Ci } = require("chrome"); const { Services } = require("resource://gre/modules/Services.jsm"); -const { setTimeout } = require("../timers"); -const { platform } = require("../system"); -const { getMostRecentBrowserWindow, getOwnerBrowserWindow, - getScreenPixelsPerCSSPixel } = require("../window/utils"); +lazyRequire(this, "../timers", "setTimeout"); +lazyRequire(this, "../system", "platform"); +lazyRequire(this, "../window/utils", "getMostRecentBrowserWindow", "getOwnerBrowserWindow", + "getScreenPixelsPerCSSPixel"); -const { create: createFrame, swapFrameLoaders, getDocShell } = require("../frame/utils"); -const { window: addonWindow } = require("../addon/window"); -const { isNil } = require("../lang/type"); -const { data } = require('../self'); +lazyRequire(this, "../frame/utils", { "create": "createFrame" }, "swapFrameLoaders", "getDocShell"); +lazyRequire(this, "../addon/window", { "window": "addonWindow" }); +lazyRequire(this, "../lang/type", "isNil"); +lazyRequire(this, '../self', "data"); -const events = require("../system/events"); +lazyRequireModule(this, "../system/events", "events"); const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; diff --git a/addon-sdk/source/lib/sdk/platform/xpcom.js b/addon-sdk/source/lib/sdk/platform/xpcom.js index 383baf67a81d..42907ce33bde 100644 --- a/addon-sdk/source/lib/sdk/platform/xpcom.js +++ b/addon-sdk/source/lib/sdk/platform/xpcom.js @@ -12,9 +12,9 @@ const { Cc, Ci, Cr, Cm, components: { classesByID } } = require('chrome'); const { registerFactory, unregisterFactory, isCIDRegistered } = Cm.QueryInterface(Ci.nsIComponentRegistrar); -const { merge } = require('../util/object'); const { Class, extend, mix } = require('../core/heritage'); -const { uuid } = require('../util/uuid'); +lazyRequire(this, '../util/object', 'merge'); +lazyRequire(this, '../util/uuid', 'uuid'); // This is a base prototype, that provides bare bones of XPCOM. JS based // components can be easily implement by extending it. diff --git a/addon-sdk/source/lib/sdk/preferences/native-options.js b/addon-sdk/source/lib/sdk/preferences/native-options.js index 840997df9af0..eee34cbf3bfc 100644 --- a/addon-sdk/source/lib/sdk/preferences/native-options.js +++ b/addon-sdk/source/lib/sdk/preferences/native-options.js @@ -8,12 +8,13 @@ module.metadata = { }; const { Cc, Ci, Cu } = require('chrome'); -const { on } = require('../system/events'); -const { id, preferencesBranch } = require('../self'); -const { localizeInlineOptions } = require('../l10n/prefs'); -const { Services } = require("resource://gre/modules/Services.jsm"); -const { AddonManager } = Cu.import("resource://gre/modules/AddonManager.jsm"); -const { defer } = require("sdk/core/promise"); +lazyRequire(this, '../system/events', "on"); +lazyRequire(this, '../self', "preferencesBranch"); +lazyRequire(this, '../l10n/prefs', "localizeInlineOptions"); + +lazyRequire(this, "resource://gre/modules/Services.jsm", "Services"); +lazyRequire(this, "resource://gre/modules/AddonManager.jsm", "AddonManager"); +lazyRequire(this, "resource://gre/modules/Preferences.jsm", "Preferences"); const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";; const DEFAULT_OPTIONS_URL = 'data:text/xml,'; @@ -24,48 +25,46 @@ const VALID_PREF_TYPES = ['bool', 'boolint', 'integer', 'string', 'color', const isFennec = require("sdk/system/xul-app").is("Fennec"); function enable({ preferences, id }) { - let enabled = defer(); + return new Promise(resolve => { + validate(preferences); - validate(preferences); + setDefaults(preferences, preferencesBranch); - setDefaults(preferences, preferencesBranch); + // allow the use of custom options.xul + AddonManager.getAddonByID(id, (addon) => { + on('addon-options-displayed', onAddonOptionsDisplayed, true); + resolve({ id }); + }); - // allow the use of custom options.xul - AddonManager.getAddonByID(id, (addon) => { - on('addon-options-displayed', onAddonOptionsDisplayed, true); - enabled.resolve({ id: id }); - }); + function onAddonOptionsDisplayed({ subject: doc, data }) { + if (data === id) { + let parent; - function onAddonOptionsDisplayed({ subject: doc, data }) { - if (data === id) { - let parent; + if (isFennec) { + parent = doc.querySelector('.options-box'); - if (isFennec) { - parent = doc.querySelector('.options-box'); + // NOTE: This disable the CSS rule that makes the options invisible + let item = doc.querySelector('#addons-details .addon-item'); + item.removeAttribute("optionsURL"); + } else { + parent = doc.getElementById('detail-downloads').parentNode; + } - // NOTE: This disable the CSS rule that makes the options invisible - let item = doc.querySelector('#addons-details .addon-item'); - item.removeAttribute("optionsURL"); - } else { - parent = doc.getElementById('detail-downloads').parentNode; - } - - if (parent) { - injectOptions({ - preferences: preferences, - preferencesBranch: preferencesBranch, - document: doc, - parent: parent, - id: id - }); - localizeInlineOptions(doc); - } else { - throw Error("Preferences parent node not found in Addon Details. The configured custom preferences will not be visible."); + if (parent) { + injectOptions({ + preferences: preferences, + preferencesBranch: preferencesBranch, + document: doc, + parent: parent, + id: id + }); + localizeInlineOptions(doc); + } else { + throw Error("Preferences parent node not found in Addon Details. The configured custom preferences will not be visible."); + } } } - } - - return enabled.promise; + }); } exports.enable = enable; @@ -103,28 +102,14 @@ exports.validate = validate; // initializes default preferences, emulates defaults/prefs.js function setDefaults(preferences, preferencesBranch) { - const branch = Cc['@mozilla.org/preferences-service;1']. - getService(Ci.nsIPrefService). - getDefaultBranch('extensions.' + preferencesBranch + '.'); - for (let { name, value } of preferences) { - switch (typeof value) { - case 'boolean': - branch.setBoolPref(name, value); - break; - case 'number': - // must be integer, ignore otherwise - if (value % 1 === 0) { - branch.setIntPref(name, value); - } - break; - case 'string': - let str = Cc["@mozilla.org/supports-string;1"]. - createInstance(Ci.nsISupportsString); - str.data = value; - branch.setComplexValue(name, Ci.nsISupportsString, str); - break; - } - } + let prefs = new Preferences({ + branch: `extensions.${preferencesBranch}.`, + defaultBranch: true, + }); + + for (let { name, value } of preferences) + if (value !== undefined) + prefs.set(name, value); } exports.setDefaults = setDefaults; diff --git a/addon-sdk/source/lib/sdk/private-browsing/utils.js b/addon-sdk/source/lib/sdk/private-browsing/utils.js index 8b012f0ced3f..7f6cf67e0c2a 100644 --- a/addon-sdk/source/lib/sdk/private-browsing/utils.js +++ b/addon-sdk/source/lib/sdk/private-browsing/utils.js @@ -9,10 +9,11 @@ module.metadata = { const { Cc, Ci, Cu } = require('chrome'); const { is } = require('../system/xul-app'); -const { isWindowPrivate } = require('../window/utils'); -const { isPrivateBrowsingSupported } = require('../self'); const { dispatcher } = require("../util/dispatcher"); +lazyRequire(this, '../window/utils', "isWindowPrivate"); +lazyRequire(this, '../self', "isPrivateBrowsingSupported"); + var PrivateBrowsingUtils; // Private browsing is only supported in Fx diff --git a/addon-sdk/source/lib/sdk/remote/parent.js b/addon-sdk/source/lib/sdk/remote/parent.js index eb2e4a0b2c6a..fcf0a800844e 100644 --- a/addon-sdk/source/lib/sdk/remote/parent.js +++ b/addon-sdk/source/lib/sdk/remote/parent.js @@ -27,7 +27,8 @@ const system = require('../system/events'); const { EventParent } = require('./utils'); const options = require('@loader/options'); const loaderModule = require('toolkit/loader'); -const { getTabForBrowser } = require('../tabs/utils'); + +lazyRequire(this, '../tabs/utils', "getTabForBrowser"); const appInfo = Cc["@mozilla.org/xre/app-info;1"]. getService(Ci.nsIXULRuntime); diff --git a/addon-sdk/source/lib/sdk/remote/utils.js b/addon-sdk/source/lib/sdk/remote/utils.js index 5a5e39198a8d..22f0da48a885 100644 --- a/addon-sdk/source/lib/sdk/remote/utils.js +++ b/addon-sdk/source/lib/sdk/remote/utils.js @@ -5,8 +5,8 @@ const { Class } = require('../core/heritage'); const { List, addListItem, removeListItem } = require('../util/list'); -const { emit } = require('../event/core'); -const { pipe } = require('../event/utils'); +lazyRequire(this, '../event/core', 'emit'); +lazyRequire(this, '../event/utils', 'pipe'); // A helper class that maintains a list of EventTargets. Any events emitted // to an EventTarget are also emitted by the EventParent. Likewise for an diff --git a/addon-sdk/source/lib/sdk/selection.js b/addon-sdk/source/lib/sdk/selection.js index 1cab2ad82d7f..b1c992ac5c29 100644 --- a/addon-sdk/source/lib/sdk/selection.js +++ b/addon-sdk/source/lib/sdk/selection.js @@ -12,18 +12,17 @@ module.metadata = { } }; -const { Ci, Cc } = require("chrome"), - { setTimeout } = require("./timers"), - { emit, off } = require("./event/core"), - { Class, obscure } = require("./core/heritage"), - { EventTarget } = require("./event/target"), - { ns } = require("./core/namespace"), - { when: unload } = require("./system/unload"), - { ignoreWindow } = require('./private-browsing/utils'), - { getTabs, getTabForContentWindow, - getAllTabContentWindows } = require('./tabs/utils'), - winUtils = require("./window/utils"), - events = require("./system/events"); +const { Ci, Cc } = require("chrome"); +lazyRequire(this, "./timers", "setTimeout"); +lazyRequire(this, "./event/core", "emit", "off"); +const { Class, obscure } = require("./core/heritage"); +const { EventTarget } = require("./event/target"); +const { ns } = require("./core/namespace"); +const { when: unload } = require("./system/unload"); +lazyRequire(this, './private-browsing/utils', "ignoreWindow"); +lazyRequire(this, './tabs/utils', "getTabs", "getTabForContentWindow", "getAllTabContentWindows"); +lazyRequireModule(this, "./window/utils", "winUtils"); +const events = require("./system/events"); // The selection types const HTML = 0x01, diff --git a/addon-sdk/source/lib/sdk/self.js b/addon-sdk/source/lib/sdk/self.js index c2114a92692f..d78e91398801 100644 --- a/addon-sdk/source/lib/sdk/self.js +++ b/addon-sdk/source/lib/sdk/self.js @@ -11,7 +11,7 @@ const { CC } = require('chrome'); const options = require('@loader/options'); const { get } = require("./preferences/service"); -const { readURISync } = require('./net/url'); +lazyRequire(this, './net/url', "readURISync"); const id = options.id; diff --git a/addon-sdk/source/lib/sdk/simple-storage.js b/addon-sdk/source/lib/sdk/simple-storage.js index bcf9b1cb9d9c..b7042e29a1b2 100644 --- a/addon-sdk/source/lib/sdk/simple-storage.js +++ b/addon-sdk/source/lib/sdk/simple-storage.js @@ -9,12 +9,12 @@ module.metadata = { }; const { Cc, Ci } = require("chrome"); -const file = require("./io/file"); -const prefs = require("./preferences/service"); const jpSelf = require("./self"); -const timer = require("./timers"); +lazyRequireModule(this, "./timers", "timer"); +lazyRequireModule(this, "./io/file", "file"); +lazyRequireModule(this, "./preferences/service", "prefs"); const unload = require("./system/unload"); -const { emit, on, off } = require("./event/core"); +lazyRequire(this, "./event/core", "emit", "on", "off"); const WRITE_PERIOD_PREF = "extensions.addon-sdk.simple-storage.writePeriod"; const WRITE_PERIOD_DEFAULT = 300000; // 5 minutes diff --git a/addon-sdk/source/lib/sdk/stylesheet/style.js b/addon-sdk/source/lib/sdk/stylesheet/style.js index 7ec0787e1137..3ef9b80947ba 100644 --- a/addon-sdk/source/lib/sdk/stylesheet/style.js +++ b/addon-sdk/source/lib/sdk/stylesheet/style.js @@ -7,14 +7,12 @@ module.metadata = { "stability": "experimental" }; -const { Cc, Ci } = require("chrome"); const { Class } = require("../core/heritage"); -const { URL, isLocalURL } = require('../url'); -const events = require("../system/events"); -const { loadSheet, removeSheet, isTypeValid } = require("./utils"); -const { isString } = require("../lang/type"); +lazyRequire(this, "../url", "isLocalURL"); +lazyRequire(this, "./utils", "loadSheet", "removeSheet", "isTypeValid"); +lazyRequire(this, "../lang/type", "isString"); const { attachTo, detachFrom } = require("../content/mod"); -const { data } = require('../self'); +lazyRequire(this, '../self', "data"); const { freeze, create } = Object; diff --git a/addon-sdk/source/lib/sdk/system.js b/addon-sdk/source/lib/sdk/system.js index 1acfe8c8c44d..5e0ec3e33241 100644 --- a/addon-sdk/source/lib/sdk/system.js +++ b/addon-sdk/source/lib/sdk/system.js @@ -12,12 +12,17 @@ const options = require('@loader/options'); const runtime = require("./system/runtime"); const { when: unload } = require("./system/unload"); -const appStartup = Cc['@mozilla.org/toolkit/app-startup;1']. - getService(Ci.nsIAppStartup); +const { XPCOMUtils } = require('resource://gre/modules/XPCOMUtils.jsm'); + +XPCOMUtils.defineLazyServiceGetter(this, 'appStartup', + '@mozilla.org/toolkit/app-startup;1', + 'nsIAppStartup'); +XPCOMUtils.defineLazyServiceGetter(this, 'directoryService', + '@mozilla.org/file/directory_service;1', + 'nsIProperties'); + const appInfo = Cc["@mozilla.org/xre/app-info;1"]. getService(Ci.nsIXULAppInfo); -const directoryService = Cc['@mozilla.org/file/directory_service;1']. - getService(Ci.nsIProperties); const PR_WRONLY = parseInt("0x02"); const PR_CREATE_FILE = parseInt("0x08"); @@ -34,8 +39,6 @@ function openFile(path, mode) { return stream } -const { eAttemptQuit: E_ATTEMPT, eForceQuit: E_FORCE } = appStartup; - /** * Parsed JSON object that was passed via `cfx --static-args "{ foo: 'bar' }"` */ @@ -86,7 +89,7 @@ exports.exit = function exit(code) { } unloader(); - appStartup.quit(code ? E_ATTEMPT : E_FORCE); + appStartup.quit(code ? appStartup.eAttemptQuit : appStartup.eForceQuit); }; // Adapter for nodejs's stdout & stderr: diff --git a/addon-sdk/source/lib/sdk/system/globals.js b/addon-sdk/source/lib/sdk/system/globals.js index 8785140bf043..7ebc5de501d7 100644 --- a/addon-sdk/source/lib/sdk/system/globals.js +++ b/addon-sdk/source/lib/sdk/system/globals.js @@ -8,41 +8,42 @@ module.metadata = { "stability": "unstable" }; -var { Cc, Ci, CC } = require('chrome'); -var { PlainTextConsole } = require('../console/plain-text'); -var { stdout } = require('../system'); -var ScriptError = CC('@mozilla.org/scripterror;1', 'nsIScriptError'); -var consoleService = Cc['@mozilla.org/consoleservice;1'].getService(Ci.nsIConsoleService); +defineLazyGetter(this, "console", () => new (require('../console/plain-text').PlainTextConsole)()); exports = module.exports = {}; -// On windows dump does not writes into stdout so cfx can't read thous dumps. -// To workaround this issue we write to a special file from which cfx will -// read and print to the console. -// For more details see: bug-673383 -exports.dump = stdout.write; - -exports.console = new PlainTextConsole(); +defineLazyGetter(exports, "console", () => console); // Provide CommonJS `define` to allow authoring modules in a format that can be // loaded both into jetpack and into browser via AMD loaders. -Object.defineProperty(exports, 'define', { - // `define` is provided as a lazy getter that binds below defined `define` - // function to the module scope, so that require, exports and module - // variables remain accessible. - configurable: true, - get: function() { - let sandbox = this; - return function define(factory) { - factory = Array.slice(arguments).pop(); - factory.call(sandbox, sandbox.require, sandbox.exports, sandbox.module); - } - }, - set: function(value) { - Object.defineProperty(this, 'define', { + +// `define` is provided as a lazy getter that binds below defined `define` +// function to the module scope, so that require, exports and module +// variables remain accessible. +defineLazyGetter(exports, 'define', function() { + return (...args) => { + let factory = args.pop(); + factory.call(this, this.require, this.exports, this.module); + }; +}); + +function defineLazyGetter(object, prop, getter) { + let redefine = (obj, value) => { + Object.defineProperty(obj, prop, { configurable: true, - enumerable: true, + writable: true, value, }); - }, -}); + return value; + }; + + Object.defineProperty(object, prop, { + configurable: true, + get() { + return redefine(this, getter.call(this)); + }, + set(value) { + redefine(this, value); + } + }); +} diff --git a/addon-sdk/source/lib/sdk/tabs/helpers.js b/addon-sdk/source/lib/sdk/tabs/helpers.js index b2c8aa013746..0e12aefc7bd0 100644 --- a/addon-sdk/source/lib/sdk/tabs/helpers.js +++ b/addon-sdk/source/lib/sdk/tabs/helpers.js @@ -11,7 +11,7 @@ module.metadata = { // NOTE: This file should only export Tab instances -const { getTabForBrowser: getRawTabForBrowser } = require('./utils'); +lazyRequire(this, './utils', { "getTabForBrowser": "getRawTabForBrowser" }); const { modelFor } = require('../model/core'); exports.getTabForRawTab = modelFor; diff --git a/addon-sdk/source/lib/sdk/tabs/tab.js b/addon-sdk/source/lib/sdk/tabs/tab.js index fa22724948a5..d4eeba539feb 100644 --- a/addon-sdk/source/lib/sdk/tabs/tab.js +++ b/addon-sdk/source/lib/sdk/tabs/tab.js @@ -8,8 +8,8 @@ module.metadata = { }; const { getTargetWindow } = require("../content/mod"); -const { getTabContentWindow, isTab } = require("./utils"); -const { viewFor } = require("../view/core"); +lazyRequire(this, "./utils", "getTabContentWindow", "isTab"); +lazyRequire(this, "../view/core", "viewFor"); if (require('../system/xul-app').name == 'Fennec') { module.exports = require('./tab-fennec'); diff --git a/addon-sdk/source/lib/sdk/tabs/tabs-firefox.js b/addon-sdk/source/lib/sdk/tabs/tabs-firefox.js index b116c214e478..d1964d27d216 100644 --- a/addon-sdk/source/lib/sdk/tabs/tabs-firefox.js +++ b/addon-sdk/source/lib/sdk/tabs/tabs-firefox.js @@ -6,17 +6,17 @@ const { Class } = require('../core/heritage'); const { Tab, tabEvents } = require('./tab'); const { EventTarget } = require('../event/target'); -const { emit, setListeners } = require('../event/core'); +lazyRequire(this, '../event/core', "emit", "setListeners"); const { pipe } = require('../event/utils'); const { observer: windowObserver } = require('../windows/observer'); const { List, addListItem, removeListItem } = require('../util/list'); -const { modelFor } = require('../model/core'); -const { viewFor } = require('../view/core'); -const { getTabs, getSelectedTab } = require('./utils'); -const { getMostRecentBrowserWindow, isBrowser } = require('../window/utils'); -const { Options } = require('./common'); -const { isPrivate } = require('../private-browsing'); -const { ignoreWindow, isWindowPBSupported } = require('../private-browsing/utils') +lazyRequire(this, '../model/core', "modelFor"); +lazyRequire(this, '../view/core', "viewFor"); +lazyRequire(this, './utils', "getTabs", "getSelectedTab"); +lazyRequire(this, '../window/utils', "getMostRecentBrowserWindow", "isBrowser"); +lazyRequire(this, './common', "Options"); +lazyRequire(this, '../private-browsing', "isPrivate"); +lazyRequire(this, '../private-browsing/utils', "ignoreWindow", "isWindowPBSupported") const { isPrivateBrowsingSupported } = require('sdk/self'); const supportPrivateTabs = isPrivateBrowsingSupported && isWindowPBSupported; diff --git a/addon-sdk/source/lib/sdk/tabs/utils.js b/addon-sdk/source/lib/sdk/tabs/utils.js index 4b8f7c969b93..310b9622f7a0 100644 --- a/addon-sdk/source/lib/sdk/tabs/utils.js +++ b/addon-sdk/source/lib/sdk/tabs/utils.js @@ -12,9 +12,9 @@ module.metadata = { const { Ci, Cu } = require('chrome'); -const { defer } = require("../lang/functional"); -const { windows, isBrowser } = require('../window/utils'); -const { isPrivateBrowsingSupported } = require('../self'); +lazyRequire(this, "../lang/functional", "defer"); +lazyRequire(this, '../window/utils', "windows", "isBrowser"); +lazyRequire(this, '../self', "isPrivateBrowsingSupported"); const { ShimWaiver } = Cu.import("resource://gre/modules/ShimWaiver.jsm"); // Bug 834961: ignore private windows when they are not supported diff --git a/addon-sdk/source/lib/sdk/test/harness.js b/addon-sdk/source/lib/sdk/test/harness.js index fc227e28b25d..fb16598dc8f8 100644 --- a/addon-sdk/source/lib/sdk/test/harness.js +++ b/addon-sdk/source/lib/sdk/test/harness.js @@ -13,7 +13,7 @@ const { serializeStack, parseStack } = require("toolkit/loader"); const { setTimeout } = require('../timers'); const { PlainTextConsole } = require("../console/plain-text"); const { when: unload } = require("../system/unload"); -const { format, fromException } = require("../console/traceback"); +lazyRequire(this, "../console/traceback", "format", "fromException"); const system = require("../system"); const { gc: gcPromise } = require('./memory'); const { defer } = require('../core/promise'); diff --git a/addon-sdk/source/lib/sdk/test/utils.js b/addon-sdk/source/lib/sdk/test/utils.js index b01df67d4208..27e0b7e4a58c 100644 --- a/addon-sdk/source/lib/sdk/test/utils.js +++ b/addon-sdk/source/lib/sdk/test/utils.js @@ -7,13 +7,13 @@ module.metadata = { 'stability': 'unstable' }; -const { defer } = require('../core/promise'); -const { setInterval, clearInterval } = require('../timers'); -const { getTabs, closeTab } = require("../tabs/utils"); -const { windows: getWindows } = require("../window/utils"); -const { close: closeWindow } = require("../window/helpers"); -const { isGenerator } = require("../lang/type"); -const { env } = require("../system/environment"); +lazyRequire(this, '../core/promise', "defer"); +lazyRequire(this, '../timers', "setInterval", "clearInterval"); +lazyRequire(this, "../tabs/utils", "getTabs", "closeTab"); +lazyRequire(this, "../window/utils", {"windows": "getWindows"}); +lazyRequire(this, "../window/helpers", {"close": "closeWindow"}); +lazyRequire(this, "../lang/type", "isGenerator"); +lazyRequire(this, "../system/environment", "env"); const { Task } = require("resource://gre/modules/Task.jsm"); const getTestNames = (exports) => diff --git a/addon-sdk/source/lib/sdk/util/deprecate.js b/addon-sdk/source/lib/sdk/util/deprecate.js index 40f236de524f..464281b5d582 100644 --- a/addon-sdk/source/lib/sdk/util/deprecate.js +++ b/addon-sdk/source/lib/sdk/util/deprecate.js @@ -8,8 +8,8 @@ module.metadata = { "stability": "experimental" }; -const { get, format } = require("../console/traceback"); -const { get: getPref } = require("../preferences/service"); +lazyRequire(this, "../console/traceback", "get", "format"); +lazyRequire(this, "../preferences/service", {"get": "getPref"}); const PREFERENCE = "devtools.errorconsole.deprecation_warnings"; function deprecateUsage(msg) { diff --git a/addon-sdk/source/lib/sdk/util/match-pattern.js b/addon-sdk/source/lib/sdk/util/match-pattern.js index a0eb88b49956..a3ee1605c8eb 100644 --- a/addon-sdk/source/lib/sdk/util/match-pattern.js +++ b/addon-sdk/source/lib/sdk/util/match-pattern.js @@ -7,7 +7,7 @@ module.metadata = { "stability": "unstable" }; -const { URL } = require('../url'); +lazyRequire(this, '../url', "URL"); const cache = {}; function MatchPattern(pattern) { diff --git a/addon-sdk/source/lib/sdk/util/object.js b/addon-sdk/source/lib/sdk/util/object.js index 86fb5e78abac..8a27e920f5d1 100644 --- a/addon-sdk/source/lib/sdk/util/object.js +++ b/addon-sdk/source/lib/sdk/util/object.js @@ -7,7 +7,7 @@ module.metadata = { "stability": "unstable" }; -const { flatten } = require('./array'); +lazyRequire(this, './array', "flatten"); // Create a shortcut for Array.prototype.slice.call(). const unbind = Function.call.bind(Function.bind, Function.call); diff --git a/addon-sdk/source/lib/sdk/util/rules.js b/addon-sdk/source/lib/sdk/util/rules.js index 98e3109b0050..a315dce24a1c 100644 --- a/addon-sdk/source/lib/sdk/util/rules.js +++ b/addon-sdk/source/lib/sdk/util/rules.js @@ -8,8 +8,8 @@ module.metadata = { }; const { Class } = require('../core/heritage'); -const { MatchPattern } = require('./match-pattern'); -const { emit } = require('../event/core'); +lazyRequire(this, './match-pattern', "MatchPattern"); +lazyRequire(this, '../event/core', "emit"); const { EventTarget } = require('../event/target'); const { List, addListItem, removeListItem } = require('./list'); diff --git a/addon-sdk/source/lib/sdk/util/sequence.js b/addon-sdk/source/lib/sdk/util/sequence.js index 28e3de25588d..fea304c4b920 100644 --- a/addon-sdk/source/lib/sdk/util/sequence.js +++ b/addon-sdk/source/lib/sdk/util/sequence.js @@ -21,8 +21,8 @@ module.metadata = { // - `_` used for argument(s) or variable(s) who's values are ignored. const { complement, flip, identity } = require("../lang/functional"); -const { isArray, isArguments, isMap, isSet, isGenerator, - isString, isBoolean, isNumber } = require("../lang/type"); +lazyRequire(this, "../lang/type", "isArray", "isArguments", "isMap", "isSet", + "isGenerator", "isString", "isBoolean", "isNumber"); const Sequence = function Sequence(iterator) { if (!isGenerator(iterator)) { diff --git a/addon-sdk/source/lib/sdk/window/utils.js b/addon-sdk/source/lib/sdk/window/utils.js index 352a3b93f159..3060969a00d8 100644 --- a/addon-sdk/source/lib/sdk/window/utils.js +++ b/addon-sdk/source/lib/sdk/window/utils.js @@ -8,7 +8,7 @@ module.metadata = { }; const { Cc, Ci } = require('chrome'); -const array = require('../util/array'); +lazyRequireModule(this, "../util/array", "array"); const { defer } = require('sdk/core/promise'); const { dispatcher } = require("../util/dispatcher"); diff --git a/addon-sdk/source/test/leak/leak-utils.js b/addon-sdk/source/test/leak/leak-utils.js index 2c05c1fa4c38..7d95f9d88754 100644 --- a/addon-sdk/source/test/leak/leak-utils.js +++ b/addon-sdk/source/test/leak/leak-utils.js @@ -40,7 +40,8 @@ exports.asyncWindowLeakTest = function*(assert, asyncTestFunc) { // SelfSupportBackend periodically tries to open windows. This can // mess up our window leak detection below, so turn it off. - SelfSupportBackend.uninit(); + if (SelfSupportBackend._log) + SelfSupportBackend.uninit(); // Wait for the browser to finish loading. yield Startup.onceInitialized;