diff options
Diffstat (limited to 'addon-sdk/source/test/test-hotkeys.js')
-rw-r--r-- | addon-sdk/source/test/test-hotkeys.js | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/addon-sdk/source/test/test-hotkeys.js b/addon-sdk/source/test/test-hotkeys.js new file mode 100644 index 000000000..ba460ee45 --- /dev/null +++ b/addon-sdk/source/test/test-hotkeys.js @@ -0,0 +1,183 @@ +/* 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"; + +const { Hotkey } = require("sdk/hotkeys"); +const { keyDown } = require("sdk/dom/events/keys"); +const { Loader } = require('sdk/test/loader'); +const { getMostRecentBrowserWindow } = require("sdk/window/utils"); + +const element = getMostRecentBrowserWindow().document.documentElement; + +exports["test hotkey: function key"] = function(assert, done) { + var showHotKey = Hotkey({ + combo: "f1", + onPress: function() { + assert.pass("first callback is called"); + assert.equal(this, showHotKey, + 'Context `this` in `onPress` should be the hotkey object'); + keyDown(element, "f2"); + showHotKey.destroy(); + } + }); + + var hideHotKey = Hotkey({ + combo: "f2", + onPress: function() { + assert.pass("second callback is called"); + hideHotKey.destroy(); + done(); + } + }); + + keyDown(element, "f1"); +}; + +exports["test hotkey: accel alt shift"] = function(assert, done) { + var showHotKey = Hotkey({ + combo: "accel-shift-6", + onPress: function() { + assert.pass("first callback is called"); + keyDown(element, "accel-alt-shift-6"); + showHotKey.destroy(); + } + }); + + var hideHotKey = Hotkey({ + combo: "accel-alt-shift-6", + onPress: function() { + assert.pass("second callback is called"); + hideHotKey.destroy(); + done(); + } + }); + + keyDown(element, "accel-shift-6"); +}; + +exports["test hotkey meta & control"] = function(assert, done) { + var showHotKey = Hotkey({ + combo: "meta-3", + onPress: function() { + assert.pass("first callback is called"); + keyDown(element, "alt-control-shift-b"); + showHotKey.destroy(); + } + }); + + var hideHotKey = Hotkey({ + combo: "Ctrl-Alt-Shift-B", + onPress: function() { + assert.pass("second callback is called"); + hideHotKey.destroy(); + done(); + } + }); + + keyDown(element, "meta-3"); +}; + +exports["test hotkey: control-1 / meta--"] = function(assert, done) { + var showHotKey = Hotkey({ + combo: "control-1", + onPress: function() { + assert.pass("first callback is called"); + keyDown(element, "meta--"); + showHotKey.destroy(); + } + }); + + var hideHotKey = Hotkey({ + combo: "meta--", + onPress: function() { + assert.pass("second callback is called"); + hideHotKey.destroy(); + done(); + } + }); + + keyDown(element, "control-1"); +}; + +exports["test invalid combos"] = function(assert) { + assert.throws(function() { + Hotkey({ + combo: "d", + onPress: function() {} + }); + }, "throws if no modifier is present"); + assert.throws(function() { + Hotkey({ + combo: "alt", + onPress: function() {} + }); + }, "throws if no key is present"); + assert.throws(function() { + Hotkey({ + combo: "alt p b", + onPress: function() {} + }); + }, "throws if more then one key is present"); +}; + +exports["test no exception on unmodified keypress"] = function(assert) { + var someHotkey = Hotkey({ + combo: "control-alt-1", + onPress: () => {} + }); + keyDown(element, "a"); + assert.pass("No exception throw, unmodified keypress passed"); + someHotkey.destroy(); +}; + +exports["test hotkey: automatic destroy"] = function*(assert) { + // Hacky way to be able to create unloadable modules via makeSandboxedLoader. + let loader = Loader(module); + + var called = false; + var hotkey = loader.require("sdk/hotkeys").Hotkey({ + combo: "accel-shift-x", + onPress: () => called = true + }); + + // Unload the module so that previous hotkey is automatically destroyed + loader.unload(); + + // Ensure that the hotkey is really destroyed + keyDown(element, "accel-shift-x"); + + assert.ok(!called, "Hotkey is destroyed and not called."); + + // create a new hotkey for a different set + yield new Promise(resolve => { + let key = Hotkey({ + combo: "accel-shift-y", + onPress: () => { + key.destroy(); + assert.pass("accel-shift-y was pressed."); + resolve(); + } + }); + keyDown(element, "accel-shift-y"); + }); + + assert.ok(!called, "Hotkey is still not called, in time it would take."); + + // create a new hotkey for the same set + yield new Promise(resolve => { + let key = Hotkey({ + combo: "accel-shift-x", + onPress: () => { + key.destroy(); + assert.pass("accel-shift-x was pressed."); + resolve(); + } + }); + keyDown(element, "accel-shift-x"); + }); + + assert.ok(!called, "Hotkey is still not called, and reusing is ok."); +}; + +require("sdk/test").run(exports); |