Bug 1350646: Part 7 - Remove SDK hotkey modules. r?Mossop draft
authorKris Maglione <maglione.k@gmail.com>
Wed, 02 Aug 2017 14:15:36 -0700
changeset 641187 af9341bbfd7c6c882dced65b1c02ade99a8159d1
parent 641186 2c80406822f134a806f93b39d7a8458ef7942159
child 641188 311c10a72593c99a64dfe750bc40496a5889e0b7
push id72469
push usermaglione.k@gmail.com
push dateSun, 06 Aug 2017 07:23:41 +0000
reviewersMossop
bugs1350646
milestone57.0a1
Bug 1350646: Part 7 - Remove SDK hotkey modules. r?Mossop MozReview-Commit-ID: JJunKMZwspb
addon-sdk/moz.build
addon-sdk/source/lib/sdk/dom/events/keys.js
addon-sdk/source/lib/sdk/hotkeys.js
addon-sdk/source/lib/sdk/keyboard/hotkeys.js
addon-sdk/source/lib/sdk/keyboard/observer.js
addon-sdk/source/lib/sdk/keyboard/utils.js
--- a/addon-sdk/moz.build
+++ b/addon-sdk/moz.build
@@ -63,35 +63,30 @@ modules = [
     'sdk/deprecated/api-utils.js',
     'sdk/deprecated/events/assembler.js',
     'sdk/deprecated/sync-worker.js',
     'sdk/deprecated/unit-test-finder.js',
     'sdk/deprecated/unit-test.js',
     'sdk/deprecated/window-utils.js',
     'sdk/dom/events-shimmed.js',
     'sdk/dom/events.js',
-    'sdk/dom/events/keys.js',
     'sdk/event/chrome.js',
     'sdk/event/core.js',
     'sdk/event/dom.js',
     'sdk/event/target.js',
     'sdk/event/utils.js',
     'sdk/frame/utils.js',
     'sdk/fs/path.js',
-    'sdk/hotkeys.js',
     'sdk/indexed-db.js',
     'sdk/io/buffer.js',
     'sdk/io/byte-streams.js',
     'sdk/io/file.js',
     'sdk/io/fs.js',
     'sdk/io/stream.js',
     'sdk/io/text-streams.js',
-    'sdk/keyboard/hotkeys.js',
-    'sdk/keyboard/observer.js',
-    'sdk/keyboard/utils.js',
     'sdk/l10n.js',
     'sdk/l10n/core.js',
     'sdk/l10n/html.js',
     'sdk/l10n/json/core.js',
     'sdk/l10n/loader.js',
     'sdk/l10n/locale.js',
     'sdk/l10n/plural-rules.js',
     'sdk/l10n/prefs.js',
deleted file mode 100644
--- a/addon-sdk/source/lib/sdk/dom/events/keys.js
+++ /dev/null
@@ -1,63 +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/. */
-
-"use strict";
-
-module.metadata = {
-  "stability": "unstable"
-};
-
-const { emit } = require("../events");
-const { getCodeForKey, toJSON } = require("../../keyboard/utils");
-const { has } = require("../../util/array");
-const { isString } = require("../../lang/type");
-
-const INITIALIZER = "initKeyEvent";
-const CATEGORY = "KeyboardEvent";
-
-function Options(options) {
-  if (!isString(options))
-    return options;
-
-  var { key, modifiers } = toJSON(options);
-  return {
-    key: key,
-    control: has(modifiers, "control"),
-    alt: has(modifiers, "alt"),
-    shift: has(modifiers, "shift"),
-    meta: has(modifiers, "meta")
-  };
-}
-
-var keyEvent = exports.keyEvent = function keyEvent(element, type, options) {
-
-  emit(element, type, {
-    initializer: INITIALIZER,
-    category: CATEGORY,
-    settings: [
-      !("bubbles" in options) || options.bubbles !== false,
-      !("cancelable" in options) || options.cancelable !== false,
-      "window" in options && options.window ? options.window : null,
-      "control" in options && !!options.control,
-      "alt" in options && !!options.alt,
-      "shift" in options && !!options.shift,
-      "meta" in options && !!options.meta,
-      getCodeForKey(options.key) || 0,
-      options.key.length === 1 ? options.key.charCodeAt(0) : 0
-    ]
-  });
-}
-
-exports.keyDown = function keyDown(element, options) {
-  keyEvent(element, "keydown", Options(options));
-};
-
-exports.keyUp = function keyUp(element, options) {
-  keyEvent(element, "keyup", Options(options));
-};
-
-exports.keyPress = function keyPress(element, options) {
-  keyEvent(element, "keypress", Options(options));
-};
-
deleted file mode 100644
--- a/addon-sdk/source/lib/sdk/hotkeys.js
+++ /dev/null
@@ -1,40 +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/. */
-
-"use strict";
-
-module.metadata = {
-  "stability": "stable"
-};
-
-const INVALID_HOTKEY = "Hotkey must have at least one modifier.";
-
-const { toJSON: jsonify, toString: stringify,
-        isFunctionKey } = require("./keyboard/utils");
-const { register, unregister } = require("./keyboard/hotkeys");
-
-const Hotkey = exports.Hotkey = function Hotkey(options) {
-  if (!(this instanceof Hotkey))
-    return new Hotkey(options);
-
-  // Parsing key combination string.
-  let hotkey = jsonify(options.combo);
-  if (!isFunctionKey(hotkey.key) && !hotkey.modifiers.length) {
-    throw new TypeError(INVALID_HOTKEY);
-  }
-
-  this.onPress = options.onPress && options.onPress.bind(this);
-  this.toString = stringify.bind(null, hotkey);
-  // Registering listener on keyboard combination enclosed by this hotkey.
-  // Please note that `this.toString()` is a normalized version of
-  // `options.combination` where order of modifiers is sorted and `accel` is
-  // replaced with platform specific key.
-  register(this.toString(), this.onPress);
-  // We freeze instance before returning it in order to make it's properties
-  // read-only.
-  return Object.freeze(this);
-};
-Hotkey.prototype.destroy = function destroy() {
-  unregister(this.toString(), this.onPress);
-};
deleted file mode 100644
--- a/addon-sdk/source/lib/sdk/keyboard/hotkeys.js
+++ /dev/null
@@ -1,110 +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/. */
-
-"use strict";
-
-module.metadata = {
-  "stability": "unstable"
-};
-
-const { observer: keyboardObserver } = require("./observer");
-const { getKeyForCode, normalize, isFunctionKey,
-        MODIFIERS } = require("./utils");
-
-/**
- * Register a global `hotkey` that executes `listener` when the key combination
- * in `hotkey` is pressed. If more then one `listener` is registered on the same
- * key combination only last one will be executed.
- *
- * @param {string} hotkey
- *    Key combination in the format of 'modifier key'.
- *
- * Examples:
- *
- *     "accel s"
- *     "meta shift i"
- *     "control alt d"
- *
- * Modifier keynames:
- *
- *  - **shift**: The Shift key.
- *  - **alt**: The Alt key. On the Macintosh, this is the Option key. On
- *    Macintosh this can only be used in conjunction with another modifier,
- *    since `Alt+Letter` combinations are reserved for entering special
- *    characters in text.
- *  - **meta**: The Meta key. On the Macintosh, this is the Command key.
- *  - **control**: The Control key.
- *  - **accel**: The key used for keyboard shortcuts on the user's platform,
- *    which is Control on Windows and Linux, and Command on Mac. Usually, this
- *    would be the value you would use.
- *
- * @param {function} listener
- *    Function to execute when the `hotkey` is executed.
- */
-exports.register = function register(hotkey, listener) {
-  hotkey = normalize(hotkey);
-  hotkeys[hotkey] = listener;
-};
-
-/**
- * Unregister a global `hotkey`. If passed `listener` is not the one registered
- * for the given `hotkey`, the call to this function will be ignored.
- *
- * @param {string} hotkey
- *    Key combination in the format of 'modifier key'.
- * @param {function} listener
- *    Function that will be invoked when the `hotkey` is pressed.
- */
-exports.unregister = function unregister(hotkey, listener) {
-  hotkey = normalize(hotkey);
-  if (hotkeys[hotkey] === listener)
-    delete hotkeys[hotkey];
-};
-
-/**
- * Map of hotkeys and associated functions.
- */
-const hotkeys = exports.hotkeys = {};
-
-keyboardObserver.on("keydown", function onKeypress(event, window) {
-  let key, modifiers = [];
-  let isChar = "isChar" in event && event.isChar;
-  let which = "which" in event ? event.which : null;
-  let keyCode = "keyCode" in event ? event.keyCode : null;
-
-  if ("shiftKey" in event && event.shiftKey)
-    modifiers.push("shift");
-  if ("altKey" in event && event.altKey)
-    modifiers.push("alt");
-  if ("ctrlKey" in event && event.ctrlKey)
-    modifiers.push("control");
-  if ("metaKey" in event && event.metaKey)
-    modifiers.push("meta");
-
-  // If it's not a printable character then we fall back to a human readable
-  // equivalent of one of the following constants.
-  // http://dxr.mozilla.org/mozilla-central/source/dom/interfaces/events/nsIDOMKeyEvent.idl
-  key = getKeyForCode(keyCode);
-
-  // If only non-function (f1 - f24) key or only modifiers are pressed we don't
-  // have a valid combination so we return immediately (Also, sometimes
-  // `keyCode` may be one for the modifier which means we do not have a
-  // modifier).
-  if (!key || (!isFunctionKey(key) && !modifiers.length) || key in MODIFIERS)
-    return;
-
-  let combination = normalize({ key: key, modifiers: modifiers });
-  let hotkey = hotkeys[combination];
-
-  if (hotkey) {
-    try {
-      hotkey();
-    } catch (exception) {
-      console.exception(exception);
-    } finally {
-      // Work around bug 582052 by preventing the (nonexistent) default action.
-      event.preventDefault();
-    }
-  }
-});
deleted file mode 100644
--- a/addon-sdk/source/lib/sdk/keyboard/observer.js
+++ /dev/null
@@ -1,57 +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/. */
-
-"use strict";
-
-module.metadata = {
-  "stability": "unstable"
-};
-
-const { Class } = require("../core/heritage");
-const { EventTarget } = require("../event/target");
-const { emit } = require("../event/core");
-const { DOMEventAssembler } = require("../deprecated/events/assembler");
-const { browserWindowIterator } = require('../deprecated/window-utils');
-const { isBrowser } = require('../window/utils');
-const { observer: windowObserver } = require("../windows/observer");
-
-// Event emitter objects used to register listeners and emit events on them
-// when they occur.
-const Observer = Class({
-  implements: [DOMEventAssembler, EventTarget],
-  initialize() {
-    // Adding each opened window to a list of observed windows.
-    windowObserver.on("open", window => {
-      if (isBrowser(window))
-        this.observe(window);
-    });
-
-    // Removing each closed window form the list of observed windows.
-    windowObserver.on("close", window => {
-      if (isBrowser(window))
-        this.ignore(window);
-    });
-
-    // Making observer aware of already opened windows.
-    for (let window of browserWindowIterator()) {
-      this.observe(window);
-    }
-  },
-  /**
-   * Events that are supported and emitted by the module.
-   */
-  supportedEventsTypes: [ "keydown", "keyup", "keypress" ],
-  /**
-   * Function handles all the supported events on all the windows that are
-   * observed. Method is used to proxy events to the listeners registered on
-   * this event emitter.
-   * @param {Event} event
-   *    Keyboard event being emitted.
-   */
-  handleEvent(event) {
-    emit(this, event.type, event, event.target.ownerGlobal || undefined);
-  }
-});
-
-exports.observer = new Observer();
deleted file mode 100644
--- a/addon-sdk/source/lib/sdk/keyboard/utils.js
+++ /dev/null
@@ -1,189 +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/. */
-
-"use strict";
-
-module.metadata = {
-  "stability": "unstable"
-};
-
-const { Cc, Ci } = require("chrome");
-const runtime = require("../system/runtime");
-const { isString } = require("../lang/type");
-const array = require("../util/array");
-
-
-const SWP = "{{SEPARATOR}}";
-const SEPARATOR = "-"
-const INVALID_COMBINATION = "Hotkey key combination must contain one or more " +
-                            "modifiers and only one key";
-
-// Map of modifier key mappings.
-const MODIFIERS = exports.MODIFIERS = {
-  'accel': runtime.OS === "Darwin" ? 'meta' : 'control',
-  'meta': 'meta',
-  'control': 'control',
-  'ctrl': 'control',
-  'option': 'alt',
-  'command': 'meta',
-  'alt': 'alt',
-  'shift': 'shift'
-};
-
-// Hash of key:code pairs for all the chars supported by `nsIDOMKeyEvent`.
-// This is just a copy of the `nsIDOMKeyEvent` hash with normalized names.
-// @See: http://dxr.mozilla.org/mozilla-central/source/dom/interfaces/events/nsIDOMKeyEvent.idl
-const CODES = exports.CODES = new function Codes() {
-  let nsIDOMKeyEvent = Ci.nsIDOMKeyEvent;
-  // Names that will be substituted with a shorter analogs.
-  let aliases = {
-    'subtract':     '-',
-    'add':          '+',
-    'equals':       '=',
-    'slash':        '/',
-    'backslash':    '\\',
-    'openbracket':  '[',
-    'closebracket': ']',
-    'quote':        '\'',
-    'backquote':    '`',
-    'period':       '.',
-    'semicolon':    ';',
-    'comma':        ','
-  };
-
-  // Normalizing keys and copying values to `this` object.
-  Object.keys(nsIDOMKeyEvent).filter(function(key) {
-    // Filter out only key codes.
-    return key.indexOf('DOM_VK') === 0;
-  }).map(function(key) {
-    // Map to key:values
-    return [ key, nsIDOMKeyEvent[key] ];
-  }).map(function([key, value]) {
-    return [ key.replace('DOM_VK_', '').replace('_', '').toLowerCase(), value ];
-  }).forEach(function ([ key, value ]) {
-    this[aliases[key] || key] = value;
-  }, this);
-};
-
-// Inverted `CODES` hash of `code:key`.
-const KEYS = exports.KEYS = new function Keys() {
-  Object.keys(CODES).forEach(function(key) {
-    this[CODES[key]] = key;
-  }, this)
-}
-
-exports.getKeyForCode = function getKeyForCode(code) {
-  return (code in KEYS) && KEYS[code];
-};
-exports.getCodeForKey = function getCodeForKey(key) {
-  return (key in CODES) && CODES[key];
-};
-
-/**
- * Utility function that takes string or JSON that defines a `hotkey` and
- * returns normalized string version of it.
- * @param {JSON|String} hotkey
- * @param {String} [separator=" "]
- *    Optional string that represents separator used to concatenate keys in the
- *    given `hotkey`.
- * @returns {String}
- * @examples
- *
- *    require("keyboard/hotkeys").normalize("b Shift accel");
- *    // 'control shift b' -> on windows & linux
- *    // 'meta shift b'    -> on mac
- *    require("keyboard/hotkeys").normalize("alt-d-shift", "-");
- *    // 'alt shift d'
- */
-var normalize = exports.normalize = function normalize(hotkey, separator) {
-  if (!isString(hotkey))
-    hotkey = toString(hotkey, separator);
-  return toString(toJSON(hotkey, separator), separator);
-};
-
-/*
- * Utility function that splits a string of characters that defines a `hotkey`
- * into modifier keys and the defining key.
- * @param {String} hotkey
- * @param {String} [separator=" "]
- *    Optional string that represents separator used to concatenate keys in the
- *    given `hotkey`.
- * @returns {JSON}
- * @examples
- *
- *    require("keyboard/hotkeys").toJSON("accel shift b");
- *    // { key: 'b', modifiers: [ 'control', 'shift' ] } -> on windows & linux
- *    // { key: 'b', modifiers: [ 'meta', 'shift' ] }    -> on mac
- *
- *    require("keyboard/hotkeys").normalize("alt-d-shift", "-");
- *    // { key: 'd', modifiers: [ 'alt', 'shift' ] }
- */
-var toJSON = exports.toJSON = function toJSON(hotkey, separator) {
-  separator = separator || SEPARATOR;
-  // Since default separator is `-`, combination may take form of `alt--`. To
-  // avoid misbehavior we replace `--` with `-{{SEPARATOR}}` where
-  // `{{SEPARATOR}}` can be swapped later.
-  hotkey = hotkey.toLowerCase().replace(separator + separator, separator + SWP);
-
-  let value = {};
-  let modifiers = [];
-  let keys = hotkey.split(separator);
-  keys.forEach(function(name) {
-    // If name is `SEPARATOR` than we swap it back.
-    if (name === SWP)
-      name = separator;
-    if (name in MODIFIERS) {
-      array.add(modifiers, MODIFIERS[name]);
-    } else {
-      if (!value.key)
-        value.key = name;
-      else
-        throw new TypeError(INVALID_COMBINATION);
-    }
-  });
-
-  if (!value.key)
-      throw new TypeError(INVALID_COMBINATION);
-
-  value.modifiers = modifiers.sort();
-  return value;
-};
-
-/**
- * Utility function that takes object that defines a `hotkey` and returns
- * string representation of it.
- *
- * _Please note that this function does not validates data neither it normalizes
- * it, if you are unsure that data is well formed use `normalize` function
- * instead.
- *
- * @param {JSON} hotkey
- * @param {String} [separator=" "]
- *    Optional string that represents separator used to concatenate keys in the
- *    given `hotkey`.
- * @returns {String}
- * @examples
- *
- *    require("keyboard/hotkeys").toString({
- *      key: 'b',
- *      modifiers: [ 'control', 'shift' ]
- *    }, '+');
- *    // 'control+shift+b
- *
- */
-var toString = exports.toString = function toString(hotkey, separator) {
-  let keys = hotkey.modifiers.slice();
-  keys.push(hotkey.key);
-  return keys.join(separator || SEPARATOR);
-};
-
-/**
- * Utility function takes `key` name and returns `true` if it's function key
- * (F1, ..., F24) and `false` if it's not.
- */
-var isFunctionKey = exports.isFunctionKey = function isFunctionKey(key) {
-  var $
-  return key[0].toLowerCase() === 'f' &&
-         ($ = parseInt(key.substr(1)), 0 < $ && $ < 25);
-};