diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/devtools/front_end/ui/KeyboardShortcut.js')
-rw-r--r-- | chromium/third_party/WebKit/Source/devtools/front_end/ui/KeyboardShortcut.js | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/ui/KeyboardShortcut.js b/chromium/third_party/WebKit/Source/devtools/front_end/ui/KeyboardShortcut.js new file mode 100644 index 00000000000..0d12ed03c7c --- /dev/null +++ b/chromium/third_party/WebKit/Source/devtools/front_end/ui/KeyboardShortcut.js @@ -0,0 +1,291 @@ +/* + * Copyright (C) 2009 Apple Inc. All rights reserved. + * Copyright (C) 2009 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @constructor + */ +WebInspector.KeyboardShortcut = function() +{ +} + +/** + * Constants for encoding modifier key set as a bit mask. + * @see #_makeKeyFromCodeAndModifiers + */ +WebInspector.KeyboardShortcut.Modifiers = { + None: 0, // Constant for empty modifiers set. + Shift: 1, + Ctrl: 2, + Alt: 4, + Meta: 8, // Command key on Mac, Win key on other platforms. + get CtrlOrMeta() + { + // "default" command/ctrl key for platform, Command on Mac, Ctrl on other platforms + return WebInspector.isMac() ? this.Meta : this.Ctrl; + }, + get ShiftOrOption() + { + // Shift on Mac, Alt on other platforms + return WebInspector.isMac() ? this.Shift : this.Alt; + } +}; + +/** @typedef {!{code: number, name: (string|!Object.<string, string>)}} */ +WebInspector.KeyboardShortcut.Key; + +/** @type {!Object.<string, !WebInspector.KeyboardShortcut.Key>} */ +WebInspector.KeyboardShortcut.Keys = { + Backspace: { code: 8, name: "\u21a4" }, + Tab: { code: 9, name: { mac: "\u21e5", other: "Tab" } }, + Enter: { code: 13, name: { mac: "\u21a9", other: "Enter" } }, + Ctrl: { code: 17, name: "Ctrl" }, + Esc: { code: 27, name: { mac: "\u238b", other: "Esc" } }, + Space: { code: 32, name: "Space" }, + PageUp: { code: 33, name: { mac: "\u21de", other: "PageUp" } }, // also NUM_NORTH_EAST + PageDown: { code: 34, name: { mac: "\u21df", other: "PageDown" } }, // also NUM_SOUTH_EAST + End: { code: 35, name: { mac: "\u2197", other: "End" } }, // also NUM_SOUTH_WEST + Home: { code: 36, name: { mac: "\u2196", other: "Home" } }, // also NUM_NORTH_WEST + Left: { code: 37, name: "\u2190" }, // also NUM_WEST + Up: { code: 38, name: "\u2191" }, // also NUM_NORTH + Right: { code: 39, name: "\u2192" }, // also NUM_EAST + Down: { code: 40, name: "\u2193" }, // also NUM_SOUTH + Delete: { code: 46, name: "Del" }, + Zero: { code: 48, name: "0" }, + H: { code: 72, name: "H" }, + Meta: { code: 91, name: "Meta" }, + F1: { code: 112, name: "F1" }, + F2: { code: 113, name: "F2" }, + F3: { code: 114, name: "F3" }, + F4: { code: 115, name: "F4" }, + F5: { code: 116, name: "F5" }, + F6: { code: 117, name: "F6" }, + F7: { code: 118, name: "F7" }, + F8: { code: 119, name: "F8" }, + F9: { code: 120, name: "F9" }, + F10: { code: 121, name: "F10" }, + F11: { code: 122, name: "F11" }, + F12: { code: 123, name: "F12" }, + Semicolon: { code: 186, name: ";" }, + NumpadPlus: { code: 107, name: "Numpad +" }, + NumpadMinus: { code: 109, name: "Numpad -" }, + Numpad0: { code: 96, name: "Numpad 0" }, + Plus: { code: 187, name: "+" }, + Comma: { code: 188, name: "," }, + Minus: { code: 189, name: "-" }, + Period: { code: 190, name: "." }, + Slash: { code: 191, name: "/" }, + QuestionMark: { code: 191, name: "?" }, + Apostrophe: { code: 192, name: "`" }, + Tilde: { code: 192, name: "Tilde" }, + Backslash: { code: 220, name: "\\" }, + SingleQuote: { code: 222, name: "\'" }, + get CtrlOrMeta() + { + // "default" command/ctrl key for platform, Command on Mac, Ctrl on other platforms + return WebInspector.isMac() ? this.Meta : this.Ctrl; + }, +}; + +WebInspector.KeyboardShortcut.KeyBindings = {}; + +(function() { + for (var key in WebInspector.KeyboardShortcut.Keys) { + var descriptor = WebInspector.KeyboardShortcut.Keys[key]; + if (typeof descriptor === "object" && descriptor["code"]) { + var name = typeof descriptor["name"] === "string" ? descriptor["name"] : key; + WebInspector.KeyboardShortcut.KeyBindings[name] = { code: descriptor["code"] }; + } + } +})(); + +/** + * Creates a number encoding keyCode in the lower 8 bits and modifiers mask in the higher 8 bits. + * It is useful for matching pressed keys. + * + * @param {number|string} keyCode The code of the key, or a character "a-z" which is converted to a keyCode value. + * @param {number=} modifiers Optional list of modifiers passed as additional parameters. + * @return {number} + */ +WebInspector.KeyboardShortcut.makeKey = function(keyCode, modifiers) +{ + if (typeof keyCode === "string") + keyCode = keyCode.charCodeAt(0) - (/^[a-z]/.test(keyCode) ? 32 : 0); + modifiers = modifiers || WebInspector.KeyboardShortcut.Modifiers.None; + return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCode, modifiers); +} + +/** + * @param {?KeyboardEvent} keyboardEvent + * @return {number} + */ +WebInspector.KeyboardShortcut.makeKeyFromEvent = function(keyboardEvent) +{ + var modifiers = WebInspector.KeyboardShortcut.Modifiers.None; + if (keyboardEvent.shiftKey) + modifiers |= WebInspector.KeyboardShortcut.Modifiers.Shift; + if (keyboardEvent.ctrlKey) + modifiers |= WebInspector.KeyboardShortcut.Modifiers.Ctrl; + if (keyboardEvent.altKey) + modifiers |= WebInspector.KeyboardShortcut.Modifiers.Alt; + if (keyboardEvent.metaKey) + modifiers |= WebInspector.KeyboardShortcut.Modifiers.Meta; + + function keyCodeForEvent(keyboardEvent) + { + // Use either a real or a synthetic keyCode (for events originating from extensions). + return keyboardEvent.keyCode || keyboardEvent["__keyCode"]; + } + return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCodeForEvent(keyboardEvent), modifiers); +} + +/** + * @param {?KeyboardEvent} event + * @return {boolean} + */ +WebInspector.KeyboardShortcut.eventHasCtrlOrMeta = function(event) +{ + return WebInspector.isMac() ? event.metaKey && !event.ctrlKey : event.ctrlKey && !event.metaKey; +} + +/** + * @param {?Event} event + * @return {boolean} + */ +WebInspector.KeyboardShortcut.hasNoModifiers = function(event) +{ + return !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey; +} + +/** @typedef {!{key: number, name: string}} */ +WebInspector.KeyboardShortcut.Descriptor; + +/** + * @param {string|!WebInspector.KeyboardShortcut.Key} key + * @param {number=} modifiers + * @return {!WebInspector.KeyboardShortcut.Descriptor} + */ +WebInspector.KeyboardShortcut.makeDescriptor = function(key, modifiers) +{ + return { + key: WebInspector.KeyboardShortcut.makeKey(typeof key === "string" ? key : key.code, modifiers), + name: WebInspector.KeyboardShortcut.shortcutToString(key, modifiers) + }; +} + +/** + * @param {string} shortcut + * @return {number} + */ +WebInspector.KeyboardShortcut.makeKeyFromBindingShortcut = function(shortcut) +{ + var parts = shortcut.split(/\+(?!$)/); + var modifiers = 0; + for (var i = 0; i < parts.length; ++i) { + if (typeof WebInspector.KeyboardShortcut.Modifiers[parts[i]] !== "undefined") { + modifiers |= WebInspector.KeyboardShortcut.Modifiers[parts[i]]; + continue; + } + console.assert(i === parts.length - 1, "Modifiers-only shortcuts are not allowed (encountered <" + shortcut + ">)"); + var key = WebInspector.KeyboardShortcut.Keys[parts[i]] || WebInspector.KeyboardShortcut.KeyBindings[parts[i]]; + if (key && key.shiftKey) + modifiers |= WebInspector.KeyboardShortcut.Modifiers.Shift; + return WebInspector.KeyboardShortcut.makeKey(key ? key.code : parts[i].toLowerCase(), modifiers) + } + console.assert(false); + return 0; +} + +/** + * @param {string|!WebInspector.KeyboardShortcut.Key} key + * @param {number=} modifiers + * @return {string} + */ +WebInspector.KeyboardShortcut.shortcutToString = function(key, modifiers) +{ + return WebInspector.KeyboardShortcut._modifiersToString(modifiers) + WebInspector.KeyboardShortcut._keyName(key); +} + +/** + * @param {string|!WebInspector.KeyboardShortcut.Key} key + * @return {string} + */ +WebInspector.KeyboardShortcut._keyName = function(key) +{ + if (typeof key === "string") + return key.toUpperCase(); + if (typeof key.name === "string") + return key.name; + return key.name[WebInspector.platform()] || key.name.other || ''; +} + +/** + * @param {number} keyCode + * @param {?number} modifiers + * @return {number} + */ +WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers = function(keyCode, modifiers) +{ + return (keyCode & 255) | (modifiers << 8); +}; + +/** + * @param {number} key + * @return {!{keyCode: number, modifiers: number}} + */ +WebInspector.KeyboardShortcut.keyCodeAndModifiersFromKey = function(key) +{ + return { keyCode: key & 255, modifiers: key >> 8 }; +} + +/** + * @param {number|undefined} modifiers + * @return {string} + */ +WebInspector.KeyboardShortcut._modifiersToString = function(modifiers) +{ + const cmdKey = "\u2318"; + const optKey = "\u2325"; + const shiftKey = "\u21e7"; + const ctrlKey = "\u2303"; + + var isMac = WebInspector.isMac(); + var res = ""; + if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Ctrl) + res += isMac ? ctrlKey : "Ctrl + "; + if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Alt) + res += isMac ? optKey : "Alt + "; + if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Shift) + res += isMac ? shiftKey : "Shift + "; + if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Meta) + res += isMac ? cmdKey : "Win + "; + + return res; +}; + +WebInspector.KeyboardShortcut.SelectAll = WebInspector.KeyboardShortcut.makeKey("a", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta); |