diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 8f1b3448554..d4802492f21 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -1475,7 +1475,7 @@ export class ModifierKeyEmitter extends Emitter { metaKey: false }; - this._subscriptions.add(domEvent(document.body, 'keydown', true)(e => { + this._subscriptions.add(domEvent(window, 'keydown', true)(e => { const event = new StandardKeyboardEvent(e); // If Alt-key keydown event is repeated, ignore it #112347 @@ -1509,7 +1509,7 @@ export class ModifierKeyEmitter extends Emitter { } })); - this._subscriptions.add(domEvent(document.body, 'keyup', true)(e => { + this._subscriptions.add(domEvent(window, 'keyup', true)(e => { if (!e.altKey && this._keyStatus.altKey) { this._keyStatus.lastKeyReleased = 'alt'; } else if (!e.ctrlKey && this._keyStatus.ctrlKey) { diff --git a/src/vs/workbench/contrib/webview/browser/baseWebviewElement.ts b/src/vs/workbench/contrib/webview/browser/baseWebviewElement.ts index 84a19799aab..c4ece0e2bff 100644 --- a/src/vs/workbench/contrib/webview/browser/baseWebviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/baseWebviewElement.ts @@ -158,7 +158,11 @@ export abstract class BaseWebview extends Disposable { // Electron: workaround for https://github.com/electron/electron/issues/14258 // We have to detect keyboard events in the and dispatch them to our // keybinding service because these events do not bubble to the parent window anymore. - this.handleKeyDown(data); + this.handleKeyEvent('keydown', data); + })); + + this._register(this.on('did-keyup', (data: KeyboardEvent) => { + this.handleKeyEvent('keyup', data); })); this.style(); @@ -330,9 +334,9 @@ export abstract class BaseWebview extends Disposable { } } - private handleKeyDown(event: IKeydownEvent) { + private handleKeyEvent(type: 'keydown' | 'keyup', event: IKeydownEvent) { // Create a fake KeyboardEvent from the data provided - const emulatedKeyboardEvent = new KeyboardEvent('keydown', event); + const emulatedKeyboardEvent = new KeyboardEvent(type, event); // Force override the target Object.defineProperty(emulatedKeyboardEvent, 'target', { get: () => this.element, diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 1288ef1abb5..052dce0ce3b 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -312,6 +312,21 @@ repeat: e.repeat }); }; + /** + * @param {KeyboardEvent} e + */ + const handleInnerUp = (e) => { + host.postMessage('did-keyup', { + key: e.key, + keyCode: e.keyCode, + code: e.code, + shiftKey: e.shiftKey, + altKey: e.altKey, + ctrlKey: e.ctrlKey, + metaKey: e.metaKey, + repeat: e.repeat + }); + }; /** * @param {KeyboardEvent} e @@ -633,6 +648,7 @@ newFrame.contentWindow.addEventListener('click', handleInnerClick); newFrame.contentWindow.addEventListener('auxclick', handleAuxClick); newFrame.contentWindow.addEventListener('keydown', handleInnerKeydown); + newFrame.contentWindow.addEventListener('keyup', handleInnerUp); newFrame.contentWindow.addEventListener('contextmenu', e => e.preventDefault()); if (host.onIframeLoaded) {