forked from mirrors/gecko-dev
107 lines
3.3 KiB
JavaScript
107 lines
3.3 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";
|
|
|
|
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;
|