return;
}
+ // Windows doesn't send proper key releases for a bunch of
+ // Japanese IM keys so we have to fake the release right away
+ const jpBadKeys = [ KeyTable.XK_Zenkaku_Hankaku,
+ KeyTable.XK_Eisu_toggle,
+ KeyTable.XK_Katakana,
+ KeyTable.XK_Hiragana,
+ KeyTable.XK_Romaji ];
+ if (browser.isWindows() && jpBadKeys.includes(keysym)) {
+ this._sendKeyEvent(keysym, code, true);
+ this._sendKeyEvent(keysym, code, false);
+ stopEvent(e);
+ return;
+ }
+
stopEvent(e);
// Possible start of AltGr sequence? (see above)
});
});
+ describe('Japanese IM keys on Windows', 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");
+
+ Object.defineProperty(window, "navigator", {value: {}});
+ if (window.navigator.platform !== undefined) {
+ // Object.defineProperty() doesn't work properly in old
+ // versions of Chrome
+ this.skip();
+ }
+
+ window.navigator.platform = "Windows";
+ });
+
+ afterEach(function () {
+ if (origNavigator !== undefined) {
+ Object.defineProperty(window, "navigator", origNavigator);
+ }
+ });
+
+ const keys = { 'Zenkaku': 0xff2a, 'Hankaku': 0xff2a,
+ 'Alphanumeric': 0xff30, 'Katakana': 0xff26,
+ 'Hiragana': 0xff25, 'Romaji': 0xff24,
+ 'KanaMode': 0xff24 };
+ for (let [key, keysym] of Object.entries(keys)) {
+ it(`should fake key release for ${key} on Windows`, function () {
+ let kbd = new Keyboard(document);
+ kbd.onkeyevent = sinon.spy();
+ kbd._handleKeyDown(keyevent('keydown', {code: 'FakeIM', key: key}));
+
+ expect(kbd.onkeyevent).to.have.been.calledTwice;
+ expect(kbd.onkeyevent.firstCall).to.have.been.calledWith(keysym, "FakeIM", true);
+ expect(kbd.onkeyevent.secondCall).to.have.been.calledWith(keysym, "FakeIM", false);
+ });
+ }
+ });
+
describe('Escape AltGraph on Windows', function () {
let origNavigator;
beforeEach(function () {