| Index: lib/keySelector.js | 
| diff --git a/lib/keySelector.js b/lib/keySelector.js | 
| deleted file mode 100644 | 
| index 151f50d2a3d95dde38431eb9e1d68e96a6aa2cf4..0000000000000000000000000000000000000000 | 
| --- a/lib/keySelector.js | 
| +++ /dev/null | 
| @@ -1,227 +0,0 @@ | 
| -/* 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/. */ | 
| - | 
| -Cu.import("resource://gre/modules/Services.jsm"); | 
| - | 
| -let validModifiers = Object.create(null); | 
| -validModifiers.ACCEL = null; | 
| -validModifiers.CTRL = "control"; | 
| -validModifiers.CONTROL = "control"; | 
| -validModifiers.SHIFT = "shift"; | 
| -validModifiers.ALT = "alt"; | 
| -validModifiers.META = "meta"; | 
| - | 
| -let bindingsKeys = null; | 
| -(function() | 
| -{ | 
| - let request = new XMLHttpRequest(); | 
| - request.open("GET", "chrome://global/content/platformHTMLBindings.xml"); | 
| - request.addEventListener("load", () => | 
| - { | 
| - bindingsKeys = request.responseXML.getElementsByTagName("handler"); | 
| - }); | 
| - request.send(); | 
| -})(); | 
| - | 
| - | 
| -/** | 
| - * Sets the correct value of validModifiers.ACCEL. | 
| - */ | 
| -function initAccelKey() | 
| -{ | 
| - validModifiers.ACCEL = "control"; | 
| - try | 
| - { | 
| - let accelKey = Services.prefs.getIntPref("ui.key.accelKey"); | 
| - if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_CONTROL) | 
| - validModifiers.ACCEL = "control"; | 
| - else if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_ALT) | 
| - validModifiers.ACCEL = "alt"; | 
| - else if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_META) | 
| - validModifiers.ACCEL = "meta"; | 
| - } | 
| - catch(e) | 
| - { | 
| - Cu.reportError(e); | 
| - } | 
| -} | 
| - | 
| -exports.KeySelector = KeySelector; | 
| - | 
| -/** | 
| - * This class provides capabilities to find and use available keyboard shortcut | 
| - * keys. | 
| - * @param {ChromeWindow} window the window where to look up existing shortcut | 
| - * keys | 
| - * @constructor | 
| - */ | 
| -function KeySelector(window) | 
| -{ | 
| - this._initExistingShortcuts(window); | 
| -} | 
| -KeySelector.prototype = | 
| -{ | 
| - /** | 
| - * Map listing existing shortcut keys as its keys. | 
| - * @type Object | 
| - */ | 
| - _existingShortcuts: null, | 
| - | 
| - /** | 
| - * Sets up _existingShortcuts property for a window. | 
| - */ | 
| - _initExistingShortcuts: function(/**ChromeWindow*/ window) | 
| - { | 
| - if (!validModifiers.ACCEL) | 
| - initAccelKey(); | 
| - | 
| - this._existingShortcuts = Object.create(null); | 
| - | 
| - let keys = Array.prototype.slice.apply(window.document.getElementsByTagName("key")); | 
| - if (bindingsKeys) | 
| - keys.push.apply(keys, bindingsKeys); | 
| - for (let i = 0; i < keys.length; i++) | 
| - { | 
| - let key = keys[i]; | 
| - let keyData = | 
| - { | 
| - shift: false, | 
| - meta: false, | 
| - alt: false, | 
| - control: false, | 
| - char: null, | 
| - code: null | 
| - }; | 
| - | 
| - let keyChar = key.getAttribute("key"); | 
| - if (keyChar && keyChar.length == 1) | 
| - keyData.char = keyChar.toUpperCase(); | 
| - | 
| - let keyCode = key.getAttribute("keycode"); | 
| - if (keyCode && "DOM_" + keyCode.toUpperCase() in Ci.nsIDOMKeyEvent) | 
| - keyData.code = Ci.nsIDOMKeyEvent["DOM_" + keyCode.toUpperCase()]; | 
| - | 
| - if (!keyData.char && !keyData.code) | 
| - continue; | 
| - | 
| - let keyModifiers = key.getAttribute("modifiers"); | 
| - if (keyModifiers) | 
| - for (let modifier of keyModifiers.toUpperCase().match(/\w+/g)) | 
| - if (modifier in validModifiers) | 
| - keyData[validModifiers[modifier]] = true; | 
| - | 
| - let canonical = [keyData.shift, keyData.meta, keyData.alt, keyData.control, keyData.char || keyData.code].join(" "); | 
| - this._existingShortcuts[canonical] = true; | 
| - } | 
| - }, | 
| - | 
| - /** | 
| - * Selects a keyboard shortcut variant that isn't already taken, | 
| - * parses it into an object. | 
| - */ | 
| - selectKey: function(/**String*/ variants) /**Object*/ | 
| - { | 
| - for (let variant of variants.split(/\s*,\s*/)) | 
| - { | 
| - if (!variant) | 
| - continue; | 
| - | 
| - let keyData = | 
| - { | 
| - shift: false, | 
| - meta: false, | 
| - alt: false, | 
| - control: false, | 
| - char: null, | 
| - code: null, | 
| - codeName: null | 
| - }; | 
| - for (let part of variant.toUpperCase().split(/\s+/)) | 
| - { | 
| - if (part in validModifiers) | 
| - keyData[validModifiers[part]] = true; | 
| - else if (part.length == 1) | 
| - keyData.char = part; | 
| - else if ("DOM_VK_" + part in Ci.nsIDOMKeyEvent) | 
| - { | 
| - keyData.code = Ci.nsIDOMKeyEvent["DOM_VK_" + part]; | 
| - keyData.codeName = "VK_" + part; | 
| - } | 
| - } | 
| - | 
| - if (!keyData.char && !keyData.code) | 
| - continue; | 
| - | 
| - let canonical = [keyData.shift, keyData.meta, keyData.alt, keyData.control, keyData.char || keyData.code].join(" "); | 
| - if (canonical in this._existingShortcuts) | 
| - continue; | 
| - | 
| - return keyData; | 
| - } | 
| - | 
| - return null; | 
| - } | 
| -}; | 
| - | 
| -/** | 
| - * Creates the text representation for a key. | 
| - * @static | 
| - */ | 
| -KeySelector.getTextForKey = function (/**Object*/ key) /**String*/ | 
| -{ | 
| - if (!key) | 
| - return null; | 
| - | 
| - if (!("text" in key)) | 
| - { | 
| - key.text = null; | 
| - try | 
| - { | 
| - let stringBundle = Services.strings.createBundle("chrome://global-platform/locale/platformKeys.properties"); | 
| - let parts = []; | 
| - if (key.control) | 
| - parts.push(stringBundle.GetStringFromName("VK_CONTROL")); | 
| - if (key.alt) | 
| - parts.push(stringBundle.GetStringFromName("VK_ALT")); | 
| - if (key.meta) | 
| - parts.push(stringBundle.GetStringFromName("VK_META")); | 
| - if (key.shift) | 
| - parts.push(stringBundle.GetStringFromName("VK_SHIFT")); | 
| - if (key.char) | 
| - parts.push(key.char.toUpperCase()); | 
| - else | 
| - { | 
| - let stringBundle2 = Services.strings.createBundle("chrome://global/locale/keys.properties"); | 
| - parts.push(stringBundle2.GetStringFromName(key.codeName)); | 
| - } | 
| - key.text = parts.join(stringBundle.GetStringFromName("MODIFIER_SEPARATOR")); | 
| - } | 
| - catch (e) | 
| - { | 
| - Cu.reportError(e); | 
| - return null; | 
| - } | 
| - } | 
| - return key.text; | 
| -}; | 
| - | 
| -/** | 
| - * Tests whether a keypress event matches the given key. | 
| - * @static | 
| - */ | 
| -KeySelector.matchesKey = function(/**Event*/ event, /**Object*/ key) /**Boolean*/ | 
| -{ | 
| - if (event.defaultPrevented || !key) | 
| - return false; | 
| - if (key.shift != event.shiftKey || key.alt != event.altKey) | 
| - return false; | 
| - if (key.meta != event.metaKey || key.control != event.ctrlKey) | 
| - return false; | 
| - | 
| - if (key.char && event.charCode && String.fromCharCode(event.charCode).toUpperCase() == key.char) | 
| - return true; | 
| - if (key.code && event.keyCode && event.keyCode == key.code) | 
| - return true; | 
| - return false; | 
| -}; |