summaryrefslogtreecommitdiffstats
path: root/addon-sdk/source/lib/dev/toolbox.js
diff options
context:
space:
mode:
Diffstat (limited to 'addon-sdk/source/lib/dev/toolbox.js')
-rw-r--r--addon-sdk/source/lib/dev/toolbox.js107
1 files changed, 107 insertions, 0 deletions
diff --git a/addon-sdk/source/lib/dev/toolbox.js b/addon-sdk/source/lib/dev/toolbox.js
new file mode 100644
index 000000000..43f37759f
--- /dev/null
+++ b/addon-sdk/source/lib/dev/toolbox.js
@@ -0,0 +1,107 @@
+/* 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";
+
+module.metadata = {
+ "stability": "experimental"
+};
+
+const { Cu, Cc, Ci } = require("chrome");
+const { Class } = require("../sdk/core/heritage");
+const { Disposable, setup } = require("../sdk/core/disposable");
+const { contract, validate } = require("../sdk/util/contract");
+const { each, pairs, values } = require("../sdk/util/sequence");
+const { onEnable, onDisable } = require("../dev/theme/hooks");
+
+const { gDevTools } = Cu.import("resource://devtools/client/framework/gDevTools.jsm", {});
+
+// This is temporary workaround to allow loading of the developer tools client - volcan
+// into a toolbox panel, this hack won't be necessary as soon as devtools patch will be
+// shipped in nightly, after which it can be removed. Bug 1038517
+const registerSDKURI = () => {
+ const ioService = Cc['@mozilla.org/network/io-service;1']
+ .getService(Ci.nsIIOService);
+ const resourceHandler = ioService.getProtocolHandler("resource")
+ .QueryInterface(Ci.nsIResProtocolHandler);
+
+ const uri = module.uri.replace("dev/toolbox.js", "");
+ resourceHandler.setSubstitution("sdk", ioService.newURI(uri, null, null));
+};
+
+registerSDKURI();
+
+const Tool = Class({
+ extends: Disposable,
+ setup: function(params={}) {
+ const { panels } = validate(this, params);
+ const { themes } = validate(this, params);
+
+ this.panels = panels;
+ this.themes = themes;
+
+ each(([key, Panel]) => {
+ const { url, label, tooltip, icon, invertIconForLightTheme,
+ invertIconForDarkTheme } = validate(Panel.prototype);
+ const { id } = Panel.prototype;
+
+ gDevTools.registerTool({
+ id: id,
+ url: "about:blank",
+ label: label,
+ tooltip: tooltip,
+ icon: icon,
+ invertIconForLightTheme: invertIconForLightTheme,
+ invertIconForDarkTheme: invertIconForDarkTheme,
+ isTargetSupported: target => target.isLocalTab,
+ build: (window, toolbox) => {
+ const panel = new Panel();
+ setup(panel, { window: window,
+ toolbox: toolbox,
+ url: url });
+
+ return panel.ready();
+ }
+ });
+ }, pairs(panels));
+
+ each(([key, theme]) => {
+ validate(theme);
+ setup(theme);
+
+ gDevTools.registerTheme({
+ id: theme.id,
+ label: theme.label,
+ stylesheets: theme.getStyles(),
+ classList: theme.getClassList(),
+ onApply: (window, oldTheme) => {
+ onEnable(theme, { window: window,
+ oldTheme: oldTheme });
+ },
+ onUnapply: (window, newTheme) => {
+ onDisable(theme, { window: window,
+ newTheme: newTheme });
+ }
+ });
+ }, pairs(themes));
+ },
+ dispose: function() {
+ each(Panel => gDevTools.unregisterTool(Panel.prototype.id),
+ values(this.panels));
+
+ each(Theme => gDevTools.unregisterTheme(Theme.prototype.id),
+ values(this.themes));
+ }
+});
+
+validate.define(Tool, contract({
+ panels: {
+ is: ["object", "undefined"]
+ },
+ themes: {
+ is: ["object", "undefined"]
+ }
+}));
+
+exports.Tool = Tool;