gecko-dev/devtools/client/framework/gDevTools.jsm
Alexandre Poirot 8178c87f2b Bug 1188405 - Convert gDevTools/gDevToolsBrowser into modules. r=jryans
gDevTools.jsm isn't properly reloadable as JSM as meant to be long-lived singletons.
Also, it contains browser related code (gDevToolsBrowser) mixed with more generic one (gDevTools).
This move is going to help hot reloading devtools codebase while improve readability of
one of our core piece of code (devtools startup and browser hooks).

--HG--
rename : devtools/client/framework/gDevTools.jsm => devtools/client/framework/devtools-browser.js
2016-02-04 02:20:56 -08:00

164 lines
4.0 KiB
JavaScript

/* 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";
/**
* This JSM is here to keep some compatibility with existing add-ons.
* Please now use the modules:
* - devtools/client/framework/devtools for gDevTools
* - devtools/client/framework/devtools-browser for gDevToolsBrowser
*
* We still do use gDevTools.jsm in our codebase,
* bug 1245462 is going to ensure we no longer do that.
*/
this.EXPORTED_SYMBOLS = [ "gDevTools", "gDevToolsBrowser" ];
const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
const { loader } = Cu.import("resource://devtools/shared/Loader.jsm", {});
/**
* Do not directly map to the commonjs modules so that callsites of
* gDevTools.jsm do not have to do anything to access to the very last version
* of the module. The `devtools` and `browser` getter are always going to
* retrieve the very last version of the modules.
*/
Object.defineProperty(this, "require", {
get() {
let { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
return require;
}
});
Object.defineProperty(this, "devtools", {
get() {
return require("devtools/client/framework/devtools").gDevTools;
}
});
Object.defineProperty(this, "browser", {
get() {
return require("devtools/client/framework/devtools-browser").gDevToolsBrowser;
}
});
/**
* gDevTools is a singleton that controls the Firefox Developer Tools.
*
* It is an instance of a DevTools class that holds a set of tools. It has the
* same lifetime as the browser.
*/
let gDevToolsMethods = [
// Used by the reload addon.
// Force reloading dependencies if the loader happens to have reloaded.
"reload",
// Used by: - b2g desktop.js
// - nsContextMenu
// - /devtools code
"showToolbox",
// Used by Addon SDK and /devtools
"closeToolbox",
"getToolbox",
// Used by Addon SDK, main.js and tests:
"registerTool",
"registerTheme",
"unregisterTool",
"unregisterTheme",
// Used by main.js and test
"getToolDefinitionArray",
"getThemeDefinitionArray",
// Used by theme-switching.js
"getThemeDefinition",
"emit",
// Used by /devtools
"on",
"off",
"once",
// Used by tests
"getToolDefinitionMap",
"getThemeDefinitionMap",
"getDefaultTools",
"getAdditionalTools",
"getToolDefinition",
];
this.gDevTools = {
// Used by tests
get _toolboxes() {
return devtools._toolboxes;
},
get _tools() {
return devtools._tools;
},
*[Symbol.iterator]() {
for (let toolbox of this._toolboxes) {
yield toolbox;
}
}
};
gDevToolsMethods.forEach(name => {
this.gDevTools[name] = (...args) => {
return devtools[name].apply(devtools, args);
};
});
/**
* gDevToolsBrowser exposes functions to connect the gDevTools instance with a
* Firefox instance.
*/
let gDevToolsBrowserMethods = [
// used by browser-sets.inc, command
"toggleToolboxCommand",
// Used by browser.js itself, by setting a oncommand string...
"selectToolCommand",
// Used by browser-sets.inc, command
"openConnectScreen",
// Used by browser-sets.inc, command
// itself, webide widget
"openWebIDE",
// Used by browser-sets.inc, command
"openContentProcessToolbox",
// Used by webide.js
"moveWebIDEWidgetInNavbar",
// Used by browser.js
"registerBrowserWindow",
// Used by reload addon
"hasToolboxOpened",
// Used by browser.js
"forgetBrowserWindow"
];
this.gDevToolsBrowser = {
// Used by webide.js
get isWebIDEInitialized() {
return browser.isWebIDEInitialized;
},
// Used by a test (should be removed)
get _trackedBrowserWindows() {
return browser._trackedBrowserWindows;
}
};
gDevToolsBrowserMethods.forEach(name => {
this.gDevToolsBrowser[name] = (...args) => {
return browser[name].apply(browser, args);
};
});