diff --git a/browser/devtools/framework/test/browser_toolbox_minimize.js b/browser/devtools/framework/test/browser_toolbox_minimize.js index e213fcfa2978..ae75861cd5ea 100644 --- a/browser/devtools/framework/test/browser_toolbox_minimize.js +++ b/browser/devtools/framework/test/browser_toolbox_minimize.js @@ -30,6 +30,16 @@ add_task(function*() { ok(parseInt(toolbox._host.frame.style.marginBottom, 10) == 0, "The toolbox host is shown again"); + info("Try to minimize again using the keyboard shortcut"); + yield minimizeWithShortcut(toolbox); + ok(parseInt(toolbox._host.frame.style.marginBottom, 10) < 0, + "The toolbox host has been hidden away with a negative-margin"); + + info("Try to maximize again using the keyboard shortcut"); + yield maximizeWithShortcut(toolbox); + ok(parseInt(toolbox._host.frame.style.marginBottom, 10) == 0, + "The toolbox host is shown again"); + info("Minimize again and switch to another tool"); yield minimize(toolbox); let onMaximized = toolbox._host.once("maximized"); @@ -67,9 +77,27 @@ function* minimize(toolbox) { yield onMinimized; } +function* minimizeWithShortcut(toolbox) { + let key = toolbox.doc.getElementById("toolbox-minimize-key") + .getAttribute("key"); + let onMinimized = toolbox._host.once("minimized"); + EventUtils.synthesizeKey(key, {accelKey: true, shiftKey: true}, + toolbox.doc.defaultView); + yield onMinimized; +} + function* maximize(toolbox) { let button = toolbox.doc.querySelector("#toolbox-dock-bottom-minimize"); let onMaximized = toolbox._host.once("maximized"); EventUtils.synthesizeMouseAtCenter(button, {}, toolbox.doc.defaultView); yield onMaximized; } + +function* maximizeWithShortcut(toolbox) { + let key = toolbox.doc.getElementById("toolbox-minimize-key") + .getAttribute("key"); + let onMaximized = toolbox._host.once("maximized"); + EventUtils.synthesizeKey(key, {accelKey: true, shiftKey: true}, + toolbox.doc.defaultView); + yield onMaximized; +} diff --git a/browser/devtools/framework/toolbox.js b/browser/devtools/framework/toolbox.js index 2f8403573f83..cd51057c7804 100644 --- a/browser/devtools/framework/toolbox.js +++ b/browser/devtools/framework/toolbox.js @@ -2,8 +2,8 @@ * 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/. */ /* globals gDevTools, DOMHelpers, toolboxStrings, InspectorFront, Selection, - getPerformanceActorsConnection, CommandUtils, DevToolsUtils, screenManager, - oscpu, Hosts, is64Bit */ + CommandUtils, DevToolsUtils, screenManager, oscpu, Hosts, is64Bit, + osString, showDoorhanger, getHighlighterUtils, getPerformanceFront */ "use strict"; @@ -21,24 +21,20 @@ let {Cc, Ci, Cu} = require("chrome"); let {Promise: promise} = require("resource://gre/modules/Promise.jsm"); let EventEmitter = require("devtools/toolkit/event-emitter"); let Telemetry = require("devtools/shared/telemetry"); -let {getHighlighterUtils} = require("devtools/framework/toolbox-highlighter-utils"); let HUDService = require("devtools/webconsole/hudservice"); -let {showDoorhanger} = require("devtools/shared/doorhanger"); let sourceUtils = require("devtools/shared/source-utils"); -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource:///modules/devtools/gDevTools.jsm"); Cu.import("resource:///modules/devtools/scratchpad-manager.jsm"); Cu.import("resource:///modules/devtools/DOMHelpers.jsm"); Cu.import("resource://gre/modules/Task.jsm"); -loader.lazyGetter(this, "Hosts", () => require("devtools/framework/toolbox-hosts").Hosts); - -loader.lazyImporter(this, "CommandUtils", "resource:///modules/devtools/DeveloperToolbar.jsm"); - +loader.lazyImporter(this, "CommandUtils", + "resource:///modules/devtools/DeveloperToolbar.jsm"); loader.lazyGetter(this, "toolboxStrings", () => { - let bundle = Services.strings.createBundle("chrome://browser/locale/devtools/toolbox.properties"); + const properties = "chrome://browser/locale/devtools/toolbox.properties"; + const bundle = Services.strings.createBundle(properties); return (name, ...args) => { try { if (!args.length) { @@ -51,22 +47,31 @@ loader.lazyGetter(this, "toolboxStrings", () => { } }; }); - -loader.lazyGetter(this, "Selection", () => require("devtools/framework/selection").Selection); -loader.lazyGetter(this, "InspectorFront", () => require("devtools/server/actors/inspector").InspectorFront); -loader.lazyRequireGetter(this, "DevToolsUtils", "devtools/toolkit/DevToolsUtils"); -loader.lazyRequireGetter(this, "getPerformanceFront", "devtools/performance/front", true); - -XPCOMUtils.defineLazyGetter(this, "screenManager", () => { +loader.lazyRequireGetter(this, "getHighlighterUtils", + "devtools/framework/toolbox-highlighter-utils", true); +loader.lazyRequireGetter(this, "Hosts", + "devtools/framework/toolbox-hosts", true); +loader.lazyRequireGetter(this, "Selection", + "devtools/framework/selection", true); +loader.lazyRequireGetter(this, "InspectorFront", + "devtools/server/actors/inspector", true); +loader.lazyRequireGetter(this, "DevToolsUtils", + "devtools/toolkit/DevToolsUtils"); +loader.lazyRequireGetter(this, "showDoorhanger", + "devtools/shared/doorhanger", true); +loader.lazyRequireGetter(this, "getPerformanceFront", + "devtools/performance/front", true); +loader.lazyGetter(this, "osString", () => { + return Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).OS; +}); +loader.lazyGetter(this, "screenManager", () => { return Cc["@mozilla.org/gfx/screenmanager;1"].getService(Ci.nsIScreenManager); }); - -XPCOMUtils.defineLazyGetter(this, "oscpu", () => { +loader.lazyGetter(this, "oscpu", () => { return Cc["@mozilla.org/network/protocol;1?name=http"] .getService(Ci.nsIHttpProtocolHandler).oscpu; }); - -XPCOMUtils.defineLazyGetter(this, "is64Bit", () => { +loader.lazyGetter(this, "is64Bit", () => { return Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).is64Bit; }); @@ -79,8 +84,9 @@ const ToolboxButtons = exports.ToolboxButtons = [ target.getTrait("highlightable") }, { id: "command-button-frames", - isTargetSupported: target => - ( target.activeTab && target.activeTab.traits.frames ) + isTargetSupported: target => { + return target.activeTab && target.activeTab.traits.frames; + } }, { id: "command-button-splitconsole", isTargetSupported: target => !target.isAddon }, @@ -135,6 +141,7 @@ function Toolbox(target, selectedTool, hostType, hostOptions) { this._onBottomHostMaximized = this._onBottomHostMaximized.bind(this); this._onToolSelectWhileMinimized = this._onToolSelectWhileMinimized.bind(this); this._onBottomHostWillChange = this._onBottomHostWillChange.bind(this); + this._toggleMinimizeMode = this._toggleMinimizeMode.bind(this); this._target.on("close", this.destroy); @@ -481,7 +488,7 @@ Toolbox.prototype = { ["toolbox-force-reload-key", true], ["toolbox-force-reload-key2", true] ].forEach(([id, force]) => { - this.doc.getElementById(id).addEventListener("command", (event) => { + this.doc.getElementById(id).addEventListener("command", () => { this.reloadTarget(force); }, true); }); @@ -493,6 +500,9 @@ Toolbox.prototype = { let prevKey = this.doc.getElementById("toolbox-previous-tool-key"); prevKey.addEventListener("command", this.selectPreviousTool.bind(this), true); + let minimizeKey = this.doc.getElementById("toolbox-minimize-key"); + minimizeKey.addEventListener("command", this._toggleMinimizeMode, true); + // Split console uses keypress instead of command so the event can be // cancelled with stopPropagation on the keypress, and not preventDefault. this.doc.addEventListener("keypress", this._splitConsoleOnKeypress, false); @@ -703,18 +713,11 @@ Toolbox.prototype = { if (this.hostType == Toolbox.HostType.BOTTOM) { let minimizeBtn = this.doc.createElement("toolbarbutton"); minimizeBtn.id = "toolbox-dock-bottom-minimize"; - minimizeBtn.className = "maximized"; - minimizeBtn.setAttribute("tooltiptext", - toolboxStrings("toolboxDockButtons.bottom.minimize")); - // Calculate the height to which the host should be minimized so the - // tabbar is still visible. - let toolbarHeight = this.doc.querySelector(".devtools-tabbar") - .getBoxQuads({box: "content"})[0] - .bounds.height; - minimizeBtn.addEventListener("command", () => { - this._host.toggleMinimizeMode(toolbarHeight); - }); + + minimizeBtn.addEventListener("command", this._toggleMinimizeMode); dockBox.appendChild(minimizeBtn); + // Show the button in its maximized state. + this._onBottomHostMaximized(); // Update the label and icon when the state changes. this._host.on("minimized", this._onBottomHostMinimized); @@ -754,18 +757,29 @@ Toolbox.prototype = { } }, + _getMinimizeButtonShortcutTooltip: function() { + let key = this.doc.getElementById("toolbox-minimize-key") + .getAttribute("key"); + return "(" + (osString == "Darwin" ? "Cmd+Shift+" : "Ctrl+Shift+") + + key.toUpperCase() + ")"; + }, + _onBottomHostMinimized: function() { let btn = this.doc.querySelector("#toolbox-dock-bottom-minimize"); btn.className = "minimized"; + btn.setAttribute("tooltiptext", - toolboxStrings("toolboxDockButtons.bottom.maximize")); + toolboxStrings("toolboxDockButtons.bottom.maximize") + " " + + this._getMinimizeButtonShortcutTooltip()); }, _onBottomHostMaximized: function() { let btn = this.doc.querySelector("#toolbox-dock-bottom-minimize"); btn.className = "maximized"; + btn.setAttribute("tooltiptext", - toolboxStrings("toolboxDockButtons.bottom.minimize")); + toolboxStrings("toolboxDockButtons.bottom.minimize") + " " + + this._getMinimizeButtonShortcutTooltip()); }, _onToolSelectWhileMinimized: function() { @@ -780,6 +794,19 @@ Toolbox.prototype = { this.off("before-select", this._onToolSelectWhileMinimized); }, + _toggleMinimizeMode: function() { + if (this.hostType !== Toolbox.HostType.BOTTOM) { + return; + } + + // Calculate the height to which the host should be minimized so the + // tabbar is still visible. + let toolbarHeight = this.doc.querySelector(".devtools-tabbar") + .getBoxQuads({box: "content"})[0] + .bounds.height; + this._host.toggleMinimizeMode(toolbarHeight); + }, + /** * Add tabs to the toolbox UI for registered tools */ diff --git a/browser/devtools/framework/toolbox.xul b/browser/devtools/framework/toolbox.xul index 77e99108f17e..26c85c2e3e8b 100644 --- a/browser/devtools/framework/toolbox.xul +++ b/browser/devtools/framework/toolbox.xul @@ -70,6 +70,10 @@ keycode="VK_F5" oncommand="void(0);" modifiers="accel"/> + diff --git a/browser/locales/en-US/chrome/browser/devtools/toolbox.dtd b/browser/locales/en-US/chrome/browser/devtools/toolbox.dtd index e122f0cc3603..07db9a348282 100644 --- a/browser/locales/en-US/chrome/browser/devtools/toolbox.dtd +++ b/browser/locales/en-US/chrome/browser/devtools/toolbox.dtd @@ -21,6 +21,9 @@ + + +