1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/devtools/main.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,377 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +"use strict"; 1.9 + 1.10 +const {Cc, Ci, Cu} = require("chrome"); 1.11 + 1.12 +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); 1.13 +Cu.import("resource://gre/modules/Services.jsm"); 1.14 +Cu.import("resource:///modules/devtools/gDevTools.jsm"); 1.15 + 1.16 +Object.defineProperty(exports, "Toolbox", { 1.17 + get: () => require("devtools/framework/toolbox").Toolbox 1.18 +}); 1.19 +Object.defineProperty(exports, "TargetFactory", { 1.20 + get: () => require("devtools/framework/target").TargetFactory 1.21 +}); 1.22 + 1.23 +loader.lazyGetter(this, "osString", () => Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).OS); 1.24 + 1.25 +let events = require("sdk/system/events"); 1.26 + 1.27 +// Panels 1.28 +loader.lazyGetter(this, "OptionsPanel", () => require("devtools/framework/toolbox-options").OptionsPanel); 1.29 +loader.lazyGetter(this, "InspectorPanel", () => require("devtools/inspector/inspector-panel").InspectorPanel); 1.30 +loader.lazyGetter(this, "WebConsolePanel", () => require("devtools/webconsole/panel").WebConsolePanel); 1.31 +loader.lazyGetter(this, "DebuggerPanel", () => require("devtools/debugger/panel").DebuggerPanel); 1.32 +loader.lazyGetter(this, "StyleEditorPanel", () => require("devtools/styleeditor/styleeditor-panel").StyleEditorPanel); 1.33 +loader.lazyGetter(this, "ShaderEditorPanel", () => require("devtools/shadereditor/panel").ShaderEditorPanel); 1.34 +loader.lazyGetter(this, "CanvasDebuggerPanel", () => require("devtools/canvasdebugger/panel").CanvasDebuggerPanel); 1.35 +loader.lazyGetter(this, "WebAudioEditorPanel", () => require("devtools/webaudioeditor/panel").WebAudioEditorPanel); 1.36 +loader.lazyGetter(this, "ProfilerPanel", () => require("devtools/profiler/panel")); 1.37 +loader.lazyGetter(this, "NetMonitorPanel", () => require("devtools/netmonitor/panel").NetMonitorPanel); 1.38 +loader.lazyGetter(this, "ScratchpadPanel", () => require("devtools/scratchpad/scratchpad-panel").ScratchpadPanel); 1.39 + 1.40 +// Strings 1.41 +const toolboxProps = "chrome://browser/locale/devtools/toolbox.properties"; 1.42 +const inspectorProps = "chrome://browser/locale/devtools/inspector.properties"; 1.43 +const debuggerProps = "chrome://browser/locale/devtools/debugger.properties"; 1.44 +const styleEditorProps = "chrome://browser/locale/devtools/styleeditor.properties"; 1.45 +const shaderEditorProps = "chrome://browser/locale/devtools/shadereditor.properties"; 1.46 +const canvasDebuggerProps = "chrome://browser/locale/devtools/canvasdebugger.properties"; 1.47 +const webAudioEditorProps = "chrome://browser/locale/devtools/webaudioeditor.properties"; 1.48 + 1.49 +const webConsoleProps = "chrome://browser/locale/devtools/webconsole.properties"; 1.50 +const profilerProps = "chrome://browser/locale/devtools/profiler.properties"; 1.51 +const netMonitorProps = "chrome://browser/locale/devtools/netmonitor.properties"; 1.52 +const scratchpadProps = "chrome://browser/locale/devtools/scratchpad.properties"; 1.53 +loader.lazyGetter(this, "toolboxStrings", () => Services.strings.createBundle(toolboxProps)); 1.54 +loader.lazyGetter(this, "webConsoleStrings", () => Services.strings.createBundle(webConsoleProps)); 1.55 +loader.lazyGetter(this, "debuggerStrings", () => Services.strings.createBundle(debuggerProps)); 1.56 +loader.lazyGetter(this, "styleEditorStrings", () => Services.strings.createBundle(styleEditorProps)); 1.57 +loader.lazyGetter(this, "shaderEditorStrings", () => Services.strings.createBundle(shaderEditorProps)); 1.58 +loader.lazyGetter(this, "canvasDebuggerStrings", () => Services.strings.createBundle(canvasDebuggerProps)); 1.59 +loader.lazyGetter(this, "webAudioEditorStrings", () => Services.strings.createBundle(webAudioEditorProps)); 1.60 +loader.lazyGetter(this, "inspectorStrings", () => Services.strings.createBundle(inspectorProps)); 1.61 +loader.lazyGetter(this, "profilerStrings",() => Services.strings.createBundle(profilerProps)); 1.62 +loader.lazyGetter(this, "netMonitorStrings", () => Services.strings.createBundle(netMonitorProps)); 1.63 +loader.lazyGetter(this, "scratchpadStrings", () => Services.strings.createBundle(scratchpadProps)); 1.64 + 1.65 +let Tools = {}; 1.66 +exports.Tools = Tools; 1.67 + 1.68 +// Definitions 1.69 +Tools.options = { 1.70 + id: "options", 1.71 + ordinal: 0, 1.72 + url: "chrome://browser/content/devtools/framework/toolbox-options.xul", 1.73 + icon: "chrome://browser/skin/devtools/tool-options.svg", 1.74 + invertIconForLightTheme: true, 1.75 + bgTheme: "theme-body", 1.76 + tooltip: l10n("optionsButton.tooltip", toolboxStrings), 1.77 + inMenu: false, 1.78 + isTargetSupported: function(target) { 1.79 + return true; 1.80 + }, 1.81 + build: function(iframeWindow, toolbox) { 1.82 + let panel = new OptionsPanel(iframeWindow, toolbox); 1.83 + return panel.open(); 1.84 + } 1.85 +} 1.86 + 1.87 +Tools.webConsole = { 1.88 + id: "webconsole", 1.89 + key: l10n("cmd.commandkey", webConsoleStrings), 1.90 + accesskey: l10n("webConsoleCmd.accesskey", webConsoleStrings), 1.91 + modifiers: Services.appinfo.OS == "Darwin" ? "accel,alt" : "accel,shift", 1.92 + ordinal: 1, 1.93 + icon: "chrome://browser/skin/devtools/tool-webconsole.svg", 1.94 + invertIconForLightTheme: true, 1.95 + url: "chrome://browser/content/devtools/webconsole.xul", 1.96 + label: l10n("ToolboxTabWebconsole.label", webConsoleStrings), 1.97 + menuLabel: l10n("MenuWebconsole.label", webConsoleStrings), 1.98 + tooltip: l10n("ToolboxWebconsole.tooltip", webConsoleStrings), 1.99 + inMenu: true, 1.100 + commands: "devtools/webconsole/console-commands", 1.101 + 1.102 + preventClosingOnKey: true, 1.103 + onkey: function(panel, toolbox) { 1.104 + if (toolbox.splitConsole) 1.105 + return toolbox.focusConsoleInput(); 1.106 + 1.107 + panel.focusInput(); 1.108 + }, 1.109 + 1.110 + isTargetSupported: function(target) { 1.111 + return !target.isAddon; 1.112 + }, 1.113 + build: function(iframeWindow, toolbox) { 1.114 + let panel = new WebConsolePanel(iframeWindow, toolbox); 1.115 + return panel.open(); 1.116 + } 1.117 +}; 1.118 + 1.119 +Tools.inspector = { 1.120 + id: "inspector", 1.121 + accesskey: l10n("inspector.accesskey", inspectorStrings), 1.122 + key: l10n("inspector.commandkey", inspectorStrings), 1.123 + ordinal: 2, 1.124 + modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift", 1.125 + icon: "chrome://browser/skin/devtools/tool-inspector.svg", 1.126 + invertIconForLightTheme: true, 1.127 + url: "chrome://browser/content/devtools/inspector/inspector.xul", 1.128 + label: l10n("inspector.label", inspectorStrings), 1.129 + tooltip: l10n("inspector.tooltip", inspectorStrings), 1.130 + inMenu: true, 1.131 + commands: [ 1.132 + "devtools/resize-commands", 1.133 + "devtools/inspector/inspector-commands", 1.134 + "devtools/eyedropper/commands.js" 1.135 + ], 1.136 + 1.137 + preventClosingOnKey: true, 1.138 + onkey: function(panel) { 1.139 + panel.toolbox.highlighterUtils.togglePicker(); 1.140 + }, 1.141 + 1.142 + isTargetSupported: function(target) { 1.143 + return !target.isAddon; 1.144 + }, 1.145 + 1.146 + build: function(iframeWindow, toolbox) { 1.147 + let panel = new InspectorPanel(iframeWindow, toolbox); 1.148 + return panel.open(); 1.149 + } 1.150 +}; 1.151 + 1.152 +Tools.jsdebugger = { 1.153 + id: "jsdebugger", 1.154 + key: l10n("debuggerMenu.commandkey", debuggerStrings), 1.155 + accesskey: l10n("debuggerMenu.accesskey", debuggerStrings), 1.156 + modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift", 1.157 + ordinal: 3, 1.158 + icon: "chrome://browser/skin/devtools/tool-debugger.svg", 1.159 + invertIconForLightTheme: true, 1.160 + highlightedicon: "chrome://browser/skin/devtools/tool-debugger-paused.svg", 1.161 + url: "chrome://browser/content/devtools/debugger.xul", 1.162 + label: l10n("ToolboxDebugger.label", debuggerStrings), 1.163 + tooltip: l10n("ToolboxDebugger.tooltip", debuggerStrings), 1.164 + inMenu: true, 1.165 + commands: "devtools/debugger/debugger-commands", 1.166 + 1.167 + isTargetSupported: function(target) { 1.168 + return true; 1.169 + }, 1.170 + 1.171 + build: function(iframeWindow, toolbox) { 1.172 + let panel = new DebuggerPanel(iframeWindow, toolbox); 1.173 + return panel.open(); 1.174 + } 1.175 +}; 1.176 + 1.177 +Tools.styleEditor = { 1.178 + id: "styleeditor", 1.179 + key: l10n("open.commandkey", styleEditorStrings), 1.180 + ordinal: 4, 1.181 + accesskey: l10n("open.accesskey", styleEditorStrings), 1.182 + modifiers: "shift", 1.183 + icon: "chrome://browser/skin/devtools/tool-styleeditor.svg", 1.184 + invertIconForLightTheme: true, 1.185 + url: "chrome://browser/content/devtools/styleeditor.xul", 1.186 + label: l10n("ToolboxStyleEditor.label", styleEditorStrings), 1.187 + tooltip: l10n("ToolboxStyleEditor.tooltip2", styleEditorStrings), 1.188 + inMenu: true, 1.189 + commands: "devtools/styleeditor/styleeditor-commands", 1.190 + 1.191 + isTargetSupported: function(target) { 1.192 + return !target.isAddon; 1.193 + }, 1.194 + 1.195 + build: function(iframeWindow, toolbox) { 1.196 + let panel = new StyleEditorPanel(iframeWindow, toolbox); 1.197 + return panel.open(); 1.198 + } 1.199 +}; 1.200 + 1.201 +Tools.shaderEditor = { 1.202 + id: "shadereditor", 1.203 + ordinal: 5, 1.204 + visibilityswitch: "devtools.shadereditor.enabled", 1.205 + icon: "chrome://browser/skin/devtools/tool-styleeditor.svg", 1.206 + invertIconForLightTheme: true, 1.207 + url: "chrome://browser/content/devtools/shadereditor.xul", 1.208 + label: l10n("ToolboxShaderEditor.label", shaderEditorStrings), 1.209 + tooltip: l10n("ToolboxShaderEditor.tooltip", shaderEditorStrings), 1.210 + 1.211 + isTargetSupported: function(target) { 1.212 + return !target.isAddon; 1.213 + }, 1.214 + 1.215 + build: function(iframeWindow, toolbox) { 1.216 + let panel = new ShaderEditorPanel(iframeWindow, toolbox); 1.217 + return panel.open(); 1.218 + } 1.219 +}; 1.220 + 1.221 +Tools.canvasDebugger = { 1.222 + id: "canvasdebugger", 1.223 + ordinal: 6, 1.224 + visibilityswitch: "devtools.canvasdebugger.enabled", 1.225 + icon: "chrome://browser/skin/devtools/tool-styleeditor.svg", 1.226 + invertIconForLightTheme: true, 1.227 + url: "chrome://browser/content/devtools/canvasdebugger.xul", 1.228 + label: l10n("ToolboxCanvasDebugger.label", canvasDebuggerStrings), 1.229 + tooltip: l10n("ToolboxCanvasDebugger.tooltip", canvasDebuggerStrings), 1.230 + isTargetSupported: function(target) { 1.231 + return !target.isAddon; 1.232 + }, 1.233 + build: function (iframeWindow, toolbox) { 1.234 + let panel = new CanvasDebuggerPanel(iframeWindow, toolbox); 1.235 + return panel.open(); 1.236 + } 1.237 +}; 1.238 + 1.239 +Tools.webAudioEditor = { 1.240 + id: "webaudioeditor", 1.241 + ordinal: 10, 1.242 + visibilityswitch: "devtools.webaudioeditor.enabled", 1.243 + icon: "chrome://browser/skin/devtools/tool-styleeditor.svg", 1.244 + invertIconForLightTheme: true, 1.245 + url: "chrome://browser/content/devtools/webaudioeditor.xul", 1.246 + label: l10n("ToolboxWebAudioEditor.label", webAudioEditorStrings), 1.247 + tooltip: l10n("ToolboxWebAudioEditor.tooltip", webAudioEditorStrings), 1.248 + isTargetSupported: function(target) { 1.249 + return !target.isAddon; 1.250 + }, 1.251 + build: function(iframeWindow, toolbox) { 1.252 + let panel = new WebAudioEditorPanel(iframeWindow, toolbox); 1.253 + return panel.open(); 1.254 + } 1.255 +}; 1.256 + 1.257 +Tools.jsprofiler = { 1.258 + id: "jsprofiler", 1.259 + accesskey: l10n("profiler.accesskey", profilerStrings), 1.260 + key: l10n("profiler2.commandkey", profilerStrings), 1.261 + ordinal: 7, 1.262 + modifiers: "shift", 1.263 + visibilityswitch: "devtools.profiler.enabled", 1.264 + icon: "chrome://browser/skin/devtools/tool-profiler.svg", 1.265 + invertIconForLightTheme: true, 1.266 + url: "chrome://browser/content/devtools/profiler.xul", 1.267 + label: l10n("profiler.label", profilerStrings), 1.268 + tooltip: l10n("profiler.tooltip2", profilerStrings), 1.269 + inMenu: true, 1.270 + commands: "devtools/profiler/commands", 1.271 + 1.272 + isTargetSupported: function (target) { 1.273 + return !target.isAddon; 1.274 + }, 1.275 + 1.276 + build: function (frame, target) { 1.277 + let panel = new ProfilerPanel(frame, target); 1.278 + return panel.open(); 1.279 + } 1.280 +}; 1.281 + 1.282 +Tools.netMonitor = { 1.283 + id: "netmonitor", 1.284 + accesskey: l10n("netmonitor.accesskey", netMonitorStrings), 1.285 + key: l10n("netmonitor.commandkey", netMonitorStrings), 1.286 + ordinal: 8, 1.287 + modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift", 1.288 + visibilityswitch: "devtools.netmonitor.enabled", 1.289 + icon: "chrome://browser/skin/devtools/tool-network.svg", 1.290 + invertIconForLightTheme: true, 1.291 + url: "chrome://browser/content/devtools/netmonitor.xul", 1.292 + label: l10n("netmonitor.label", netMonitorStrings), 1.293 + tooltip: l10n("netmonitor.tooltip", netMonitorStrings), 1.294 + inMenu: true, 1.295 + 1.296 + isTargetSupported: function(target) { 1.297 + let root = target.client.mainRoot; 1.298 + return !target.isAddon && (root.traits.networkMonitor || !target.isApp); 1.299 + }, 1.300 + 1.301 + build: function(iframeWindow, toolbox) { 1.302 + let panel = new NetMonitorPanel(iframeWindow, toolbox); 1.303 + return panel.open(); 1.304 + } 1.305 +}; 1.306 + 1.307 +Tools.scratchpad = { 1.308 + id: "scratchpad", 1.309 + ordinal: 9, 1.310 + visibilityswitch: "devtools.scratchpad.enabled", 1.311 + icon: "chrome://browser/skin/devtools/tool-scratchpad.svg", 1.312 + invertIconForLightTheme: true, 1.313 + url: "chrome://browser/content/devtools/scratchpad.xul", 1.314 + label: l10n("scratchpad.label", scratchpadStrings), 1.315 + tooltip: l10n("scratchpad.tooltip", scratchpadStrings), 1.316 + inMenu: false, 1.317 + commands: "devtools/scratchpad/scratchpad-commands", 1.318 + 1.319 + isTargetSupported: function(target) { 1.320 + return !target.isAddon && target.isRemote; 1.321 + }, 1.322 + 1.323 + build: function(iframeWindow, toolbox) { 1.324 + let panel = new ScratchpadPanel(iframeWindow, toolbox); 1.325 + return panel.open(); 1.326 + } 1.327 +}; 1.328 + 1.329 +let defaultTools = [ 1.330 + Tools.options, 1.331 + Tools.webConsole, 1.332 + Tools.inspector, 1.333 + Tools.jsdebugger, 1.334 + Tools.styleEditor, 1.335 + Tools.shaderEditor, 1.336 + Tools.canvasDebugger, 1.337 + Tools.webAudioEditor, 1.338 + Tools.jsprofiler, 1.339 + Tools.netMonitor, 1.340 + Tools.scratchpad 1.341 +]; 1.342 + 1.343 +exports.defaultTools = defaultTools; 1.344 + 1.345 +for (let definition of defaultTools) { 1.346 + gDevTools.registerTool(definition); 1.347 +} 1.348 + 1.349 +var unloadObserver = { 1.350 + observe: function(subject, topic, data) { 1.351 + if (subject.wrappedJSObject === require("@loader/unload")) { 1.352 + Services.obs.removeObserver(unloadObserver, "sdk:loader:destroy"); 1.353 + for (let definition of gDevTools.getToolDefinitionArray()) { 1.354 + gDevTools.unregisterTool(definition.id); 1.355 + } 1.356 + } 1.357 + } 1.358 +}; 1.359 +Services.obs.addObserver(unloadObserver, "sdk:loader:destroy", false); 1.360 + 1.361 +events.emit("devtools-loaded", {}); 1.362 + 1.363 +/** 1.364 + * Lookup l10n string from a string bundle. 1.365 + * 1.366 + * @param {string} name 1.367 + * The key to lookup. 1.368 + * @param {StringBundle} bundle 1.369 + * The key to lookup. 1.370 + * @returns A localized version of the given key. 1.371 + */ 1.372 +function l10n(name, bundle) 1.373 +{ 1.374 + try { 1.375 + return bundle.GetStringFromName(name); 1.376 + } catch (ex) { 1.377 + Services.console.logStringMessage("Error reading '" + name + "'"); 1.378 + throw new Error("l10n error with " + name); 1.379 + } 1.380 +}