summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Tanskanen <aleta@aleta.lkpg.cendio.se>2019-11-07 16:19:08 +0100
committerAlex Tanskanen <aleta@aleta.lkpg.cendio.se>2019-11-07 16:44:26 +0100
commita6304f91d0d4873bcca013cf35c369ffdfd4f66b (patch)
tree872047eb48f02e8a53748f0f63239e2a3df57895
parentc15502525e12f18d613aaaa972ffa75b77bc9362 (diff)
downloadnovnc-a6304f91d0d4873bcca013cf35c369ffdfd4f66b.tar.gz
Fix missing caps lock events on iOS
Caps Lock on iOS only trigged key release or key press events. When it's clicked it would only send keydown, and next time it would only send keyup and so on. It should send both a key press and a key release. Also added the unit tests for macOS since those were missing. Co-Authored-By: Alex Tanskanen <aleta@cendio.se>
-rw-r--r--core/input/keyboard.js4
-rw-r--r--tests/test.keyboard.js74
2 files changed, 76 insertions, 2 deletions
diff --git a/core/input/keyboard.js b/core/input/keyboard.js
index 6e41365..9e6af2a 100644
--- a/core/input/keyboard.js
+++ b/core/input/keyboard.js
@@ -162,7 +162,7 @@ export default class Keyboard {
// state change events. That gets extra confusing for CapsLock
// which toggles on each press, but not on release. So pretend
// it was a quick press and release of the button.
- if (browser.isMac() && (code === 'CapsLock')) {
+ if ((browser.isMac() || browser.isIOS()) && (code === 'CapsLock')) {
this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', true);
this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', false);
stopEvent(e);
@@ -274,7 +274,7 @@ export default class Keyboard {
}
// See comment in _handleKeyDown()
- if (browser.isMac() && (code === 'CapsLock')) {
+ if ((browser.isMac() || browser.isIOS()) && (code === 'CapsLock')) {
this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', true);
this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', false);
return;
diff --git a/tests/test.keyboard.js b/tests/test.keyboard.js
index f5807e9..b49312d 100644
--- a/tests/test.keyboard.js
+++ b/tests/test.keyboard.js
@@ -314,6 +314,80 @@ describe('Key Event Handling', function () {
});
});
+ describe('Caps Lock on iOS and macOS', function () {
+ let origNavigator;
+ beforeEach(function () {
+ // window.navigator is a protected read-only property in many
+ // environments, so we need to redefine it whilst running these
+ // tests.
+ origNavigator = Object.getOwnPropertyDescriptor(window, "navigator");
+ if (origNavigator === undefined) {
+ // Object.getOwnPropertyDescriptor() doesn't work
+ // properly in any version of IE
+ this.skip();
+ }
+
+ Object.defineProperty(window, "navigator", {value: {}});
+ if (window.navigator.platform !== undefined) {
+ // Object.defineProperty() doesn't work properly in old
+ // versions of Chrome
+ this.skip();
+ }
+ });
+
+ afterEach(function () {
+ Object.defineProperty(window, "navigator", origNavigator);
+ });
+
+ it('should toggle caps lock on key press on iOS', function (done) {
+ window.navigator.platform = "iPad";
+ const kbd = new Keyboard(document);
+ kbd.onkeyevent = sinon.spy();
+ kbd._handleKeyDown(keyevent('keydown', {code: 'CapsLock', key: 'CapsLock'}));
+
+ expect(kbd.onkeyevent).to.have.been.calledTwice;
+ expect(kbd.onkeyevent.firstCall).to.have.been.calledWith(0xFFE5, "CapsLock", true);
+ expect(kbd.onkeyevent.secondCall).to.have.been.calledWith(0xFFE5, "CapsLock", false);
+ done();
+ });
+
+ it('should toggle caps lock on key press on mac', function (done) {
+ window.navigator.platform = "Mac";
+ const kbd = new Keyboard(document);
+ kbd.onkeyevent = sinon.spy();
+ kbd._handleKeyDown(keyevent('keydown', {code: 'CapsLock', key: 'CapsLock'}));
+
+ expect(kbd.onkeyevent).to.have.been.calledTwice;
+ expect(kbd.onkeyevent.firstCall).to.have.been.calledWith(0xFFE5, "CapsLock", true);
+ expect(kbd.onkeyevent.secondCall).to.have.been.calledWith(0xFFE5, "CapsLock", false);
+ done();
+ });
+
+ it('should toggle caps lock on key release on iOS', function (done) {
+ window.navigator.platform = "iPad";
+ const kbd = new Keyboard(document);
+ kbd.onkeyevent = sinon.spy();
+ kbd._handleKeyUp(keyevent('keyup', {code: 'CapsLock', key: 'CapsLock'}));
+
+ expect(kbd.onkeyevent).to.have.been.calledTwice;
+ expect(kbd.onkeyevent.firstCall).to.have.been.calledWith(0xFFE5, "CapsLock", true);
+ expect(kbd.onkeyevent.secondCall).to.have.been.calledWith(0xFFE5, "CapsLock", false);
+ done();
+ });
+
+ it('should toggle caps lock on key release on mac', function (done) {
+ window.navigator.platform = "Mac";
+ const kbd = new Keyboard(document);
+ kbd.onkeyevent = sinon.spy();
+ kbd._handleKeyUp(keyevent('keyup', {code: 'CapsLock', key: 'CapsLock'}));
+
+ expect(kbd.onkeyevent).to.have.been.calledTwice;
+ expect(kbd.onkeyevent.firstCall).to.have.been.calledWith(0xFFE5, "CapsLock", true);
+ expect(kbd.onkeyevent.secondCall).to.have.been.calledWith(0xFFE5, "CapsLock", false);
+ done();
+ });
+ });
+
describe('Escape AltGraph on Windows', function () {
let origNavigator;
beforeEach(function () {