aux window - reduce global access to window object

This commit is contained in:
Benjamin Pasero
2023-10-17 08:58:08 +02:00
committed by Benjamin Pasero
parent d1986ba985
commit f355387613
22 changed files with 65 additions and 43 deletions
+12 -7
View File
@@ -959,6 +959,7 @@ class FocusTracker extends Disposable implements IFocusTracker {
const activeElement = (shadowRoot ? shadowRoot.activeElement : element.ownerDocument.activeElement);
return isAncestor(activeElement, element);
} else {
const window = element;
return isAncestor(window.document.activeElement, window.document);
}
}
@@ -1209,7 +1210,7 @@ export function domContentLoaded(): Promise<unknown> {
* of 1.25, the cursor will be 2.5 screen pixels wide. Depending on how the dom node aligns/"snaps"
* with the screen pixels, it will sometimes be rendered with 2 screen pixels, and sometimes with 3 screen pixels.
*/
export function computeScreenAwareSize(cssPx: number): number {
export function computeScreenAwareSize(window: Window, cssPx: number): number {
const screenPx = window.devicePixelRatio * cssPx;
return Math.max(1, Math.floor(screenPx)) / window.devicePixelRatio;
}
@@ -1633,7 +1634,11 @@ export class ModifierKeyEmitter extends event.Emitter<IModifierKeyStatus> {
metaKey: false
};
this._subscriptions.add(addDisposableListener(window, 'keydown', e => {
this._subscriptions.add(event.Event.runAndSubscribe(onDidRegisterWindow, ({ window, disposableStore }) => this.registerListeners(window, disposableStore), { window, disposableStore: this._subscriptions }));
}
private registerListeners(window: Window, disposables: DisposableStore): void {
disposables.add(addDisposableListener(window, 'keydown', e => {
if (e.defaultPrevented) {
return;
}
@@ -1670,7 +1675,7 @@ export class ModifierKeyEmitter extends event.Emitter<IModifierKeyStatus> {
}
}, true));
this._subscriptions.add(addDisposableListener(window, 'keyup', e => {
disposables.add(addDisposableListener(window, 'keyup', e => {
if (e.defaultPrevented) {
return;
}
@@ -1702,21 +1707,21 @@ export class ModifierKeyEmitter extends event.Emitter<IModifierKeyStatus> {
}
}, true));
this._subscriptions.add(addDisposableListener(document.body, 'mousedown', () => {
disposables.add(addDisposableListener(window.document.body, 'mousedown', () => {
this._keyStatus.lastKeyPressed = undefined;
}, true));
this._subscriptions.add(addDisposableListener(document.body, 'mouseup', () => {
disposables.add(addDisposableListener(window.document.body, 'mouseup', () => {
this._keyStatus.lastKeyPressed = undefined;
}, true));
this._subscriptions.add(addDisposableListener(document.body, 'mousemove', e => {
disposables.add(addDisposableListener(window.document.body, 'mousemove', e => {
if (e.buttons) {
this._keyStatus.lastKeyPressed = undefined;
}
}, true));
this._subscriptions.add(addDisposableListener(window, 'blur', () => {
disposables.add(addDisposableListener(window, 'blur', () => {
this.resetKeyStatus();
}));
}
@@ -85,7 +85,7 @@ export class GlobalPointerMoveMonitor implements IDisposable {
// DOMException: Failed to execute 'setPointerCapture' on 'Element':
// No active pointer with the given id is found.
// In case of failure, we bind the listeners on the window
eventSource = window;
eventSource = dom.getWindow(initialElement);
}
this._hooks.add(dom.addDisposableListener(
+4 -3
View File
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { $, addDisposableListener, clearNode, EventHelper, EventType, hide, isAncestor, show } from 'vs/base/browser/dom';
import { $, addDisposableListener, clearNode, EventHelper, EventType, getWindow, hide, isAncestor, show } from 'vs/base/browser/dom';
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
import { ButtonBar, ButtonWithDescription, IButtonStyles } from 'vs/base/browser/ui/button/button';
@@ -198,7 +198,8 @@ export class Dialog extends Disposable {
}
async show(): Promise<IDialogResult> {
this.focusToReturn = document.activeElement as HTMLElement;
const window = getWindow(this.container);
this.focusToReturn = window.document.activeElement as HTMLElement;
return new Promise<IDialogResult>((resolve) => {
clearNode(this.buttonsContainer);
@@ -472,7 +473,7 @@ export class Dialog extends Disposable {
this.modalElement = undefined;
}
if (this.focusToReturn && isAncestor(this.focusToReturn, document.body)) {
if (this.focusToReturn && isAncestor(this.focusToReturn, getWindow(this.container).document.body)) {
this.focusToReturn.focus();
this.focusToReturn = undefined;
}
+3 -1
View File
@@ -5,7 +5,7 @@
import { isFirefox } from 'vs/base/browser/browser';
import { EventType as TouchEventType, Gesture } from 'vs/base/browser/touch';
import { $, addDisposableListener, append, clearNode, createStyleSheet, Dimension, EventHelper, EventLike, EventType, getActiveElement, IDomNodePagePosition, isAncestor, isInShadowDOM } from 'vs/base/browser/dom';
import { $, addDisposableListener, append, clearNode, createStyleSheet, Dimension, EventHelper, EventLike, EventType, getActiveElement, getWindow, IDomNodePagePosition, isAncestor, isInShadowDOM } from 'vs/base/browser/dom';
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
import { StandardMouseEvent } from 'vs/base/browser/mouseEvent';
import { ActionBar, ActionsOrientation, IActionViewItemProvider } from 'vs/base/browser/ui/actionbar/actionbar';
@@ -259,6 +259,7 @@ export class Menu extends ActionBar {
e.preventDefault();
}));
const window = getWindow(container);
menuElement.style.maxHeight = `${Math.max(10, window.innerHeight - container.getBoundingClientRect().top - 35)}px`;
actions = actions.filter(a => {
@@ -899,6 +900,7 @@ class SubmenuMenuActionViewItem extends BaseMenuActionViewItem {
const viewBox = this.submenuContainer.getBoundingClientRect();
const window = getWindow(this.element);
const { top, left } = this.calculateSubmenuMenuLayout(new Dimension(window.innerWidth, window.innerHeight), Dimension.lift(viewBox), entryBoxUpdated, this.expandDirection);
// subtract offsets caused by transform parent
this.submenuContainer.style.left = `${left - viewBox.left}px`;
+1
View File
@@ -145,6 +145,7 @@ export class MenuBar extends Disposable {
}
}));
const window = DOM.getWindow(this.container);
this._register(DOM.addDisposableListener(window, DOM.EventType.MOUSE_DOWN, () => {
// This mouse event is outside the menubar so it counts as a focus out
if (this.isFocused) {
+6 -4
View File
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { $, append, createStyleSheet, EventHelper, EventLike } from 'vs/base/browser/dom';
import { $, append, createStyleSheet, EventHelper, EventLike, getWindow } from 'vs/base/browser/dom';
import { DomEmitter } from 'vs/base/browser/event';
import { EventType, Gesture } from 'vs/base/browser/touch';
import { Delayer } from 'vs/base/common/async';
@@ -175,14 +175,16 @@ class MouseEventFactory implements IPointerEventFactory {
private readonly disposables = new DisposableStore();
constructor(private el: HTMLElement) { }
@memoize
get onPointerMove(): Event<PointerEvent> {
return this.disposables.add(new DomEmitter(window, 'mousemove')).event;
return this.disposables.add(new DomEmitter(getWindow(this.el), 'mousemove')).event;
}
@memoize
get onPointerUp(): Event<PointerEvent> {
return this.disposables.add(new DomEmitter(window, 'mouseup')).event;
return this.disposables.add(new DomEmitter(getWindow(this.el), 'mouseup')).event;
}
dispose(): void {
@@ -425,7 +427,7 @@ export class Sash extends Disposable {
}
const onMouseDown = this._register(new DomEmitter(this.el, 'mousedown')).event;
this._register(onMouseDown(e => this.onPointerStart(e, new MouseEventFactory()), this));
this._register(onMouseDown(e => this.onPointerStart(e, new MouseEventFactory(container)), this));
const onMouseDoubleClick = this._register(new DomEmitter(this.el, 'dblclick')).event;
this._register(onMouseDoubleClick(this.onPointerDoublePress, this));
const onMouseEnter = this._register(new DomEmitter(this.el, 'mouseenter')).event;
@@ -87,7 +87,7 @@ export class MouseWheelClassifier {
}
public acceptStandardWheelEvent(e: StandardWheelEvent): void {
const osZoomFactor = window.devicePixelRatio / getZoomFactor();
const osZoomFactor = dom.getWindow(e.browserEvent).devicePixelRatio / getZoomFactor();
if (platform.isWindows || platform.isLinux) {
// On Windows and Linux, the incoming delta events are multiplied with the OS zoom factor.
// The OS zoom factor can be reverse engineered by using the device pixel ratio and the configured zoom factor into account.
@@ -545,6 +545,7 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi
// Make visible to enable measurements
this.selectDropDownContainer.classList.add('visible');
const window = dom.getWindow(this.selectElement);
const selectPosition = dom.getDomNodePagePosition(this.selectElement);
const styles = getComputedStyle(this.selectElement);
const verticalPadding = parseFloat(styles.getPropertyValue('--dropdown-padding-top')) + parseFloat(styles.getPropertyValue('--dropdown-padding-bottom'));
+3 -3
View File
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import { IDragAndDropData } from 'vs/base/browser/dnd';
import { $, append, clearNode, createStyleSheet, h, hasParentWithClass } from 'vs/base/browser/dom';
import { $, append, clearNode, createStyleSheet, getWindow, h, hasParentWithClass } from 'vs/base/browser/dom';
import { DomEmitter } from 'vs/base/browser/event';
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
@@ -861,8 +861,8 @@ class FindWidget<T, TFilterData> extends Disposable {
this._register(onGrabMouseDown.event(e => {
const disposables = new DisposableStore();
const onWindowMouseMove = disposables.add(new DomEmitter(window, 'mousemove'));
const onWindowMouseUp = disposables.add(new DomEmitter(window, 'mouseup'));
const onWindowMouseMove = disposables.add(new DomEmitter(getWindow(e), 'mousemove'));
const onWindowMouseUp = disposables.add(new DomEmitter(getWindow(e), 'mouseup'));
const startRight = this.right;
const startX = e.pageX;
+4 -2
View File
@@ -615,8 +615,10 @@ export namespace Event {
* runAndSubscribe(dataChangeEvent, () => this._updateUI());
* ```
*/
export function runAndSubscribe<T>(event: Event<T>, handler: (e: T | undefined) => any): IDisposable {
handler(undefined);
export function runAndSubscribe<T>(event: Event<T>, handler: (e: T) => any, initial: T): IDisposable;
export function runAndSubscribe<T>(event: Event<T>, handler: (e: T | undefined) => any): IDisposable;
export function runAndSubscribe<T>(event: Event<T>, handler: (e: T | undefined) => any, initial?: T): IDisposable {
handler(initial);
return event(e => handler(e));
}
@@ -146,15 +146,16 @@ export class ViewCursor {
return null;
}
const window = dom.getWindow(this._domNode);
let width: number;
if (this._cursorStyle === TextEditorCursorStyle.Line) {
width = dom.computeScreenAwareSize(this._lineCursorWidth > 0 ? this._lineCursorWidth : 2);
width = dom.computeScreenAwareSize(window, this._lineCursorWidth > 0 ? this._lineCursorWidth : 2);
if (width > 2) {
textContent = nextGrapheme;
textContentClassName = this._getTokenClassName(position);
}
} else {
width = dom.computeScreenAwareSize(1);
width = dom.computeScreenAwareSize(window, 1);
}
let left = visibleRange.left;
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { $, addDisposableListener, h, reset } from 'vs/base/browser/dom';
import { $, addDisposableListener, getWindow, h, reset } from 'vs/base/browser/dom';
import { renderIcon, renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels';
import { compareBy, numberComparator, reverseOrder } from 'vs/base/common/arrays';
import { Codicon } from 'vs/base/common/codicons';
@@ -306,6 +306,7 @@ class CollapsedCodeOverlayWidget extends ViewZoneOverlayWidget {
const cur = this._unchangedRegion.visibleLineCountTop.get();
this._unchangedRegion.isDragged.set(true, undefined);
const window = getWindow(this._nodes.top);
const mouseMoveListener = addDisposableListener(window, 'mousemove', e => {
const currentTop = e.clientY;
@@ -340,6 +341,8 @@ class CollapsedCodeOverlayWidget extends ViewZoneOverlayWidget {
const cur = this._unchangedRegion.visibleLineCountBottom.get();
this._unchangedRegion.isDragged.set(true, undefined);
const window = getWindow(this._nodes.bottom);
const mouseMoveListener = addDisposableListener(window, 'mousemove', e => {
const currentTop = e.clientY;
const delta = currentTop - startTop;
@@ -101,6 +101,7 @@ export class TestCodeEditor extends CodeEditorWidget implements ICodeEditor {
class TestEditorDomElement {
parentElement: IContextKeyServiceTarget | null = null;
ownerDocument = document;
document = document;
setAttribute(attr: string, value: string): void { }
removeAttribute(attr: string): void { }
hasAttribute(attr: string): boolean { return false; }
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import { IContextMenuDelegate } from 'vs/base/browser/contextmenu';
import { $, addDisposableListener, EventType, getActiveElement, isAncestor } from 'vs/base/browser/dom';
import { $, addDisposableListener, EventType, getActiveElement, getWindow, isAncestor } from 'vs/base/browser/dom';
import { StandardMouseEvent } from 'vs/base/browser/mouseEvent';
import { Menu } from 'vs/base/browser/ui/menu/menu';
import { ActionRunner, IRunEvent, WorkbenchActionExecutedClassification, WorkbenchActionExecutedEvent } from 'vs/base/common/actions';
@@ -95,6 +95,7 @@ export class ContextMenuHandler {
menu.onDidCancel(() => this.contextViewService.hideContextView(true), null, menuDisposables);
menu.onDidBlur(() => this.contextViewService.hideContextView(true), null, menuDisposables);
const window = getWindow(container);
menuDisposables.add(addDisposableListener(window, EventType.BLUR, () => this.contextViewService.hideContextView(true)));
menuDisposables.add(addDisposableListener(window, EventType.MOUSE_DOWN, (e: MouseEvent) => {
if (e.defaultPrevented) {
@@ -12,7 +12,7 @@ import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar';
import { CancellationToken } from 'vs/base/common/cancellation';
import { Emitter, Event } from 'vs/base/common/event';
import { KeyCode } from 'vs/base/common/keyCodes';
import { Disposable, dispose } from 'vs/base/common/lifecycle';
import { Disposable, DisposableStore, dispose } from 'vs/base/common/lifecycle';
import Severity from 'vs/base/common/severity';
import { isString } from 'vs/base/common/types';
import { localize } from 'vs/nls';
@@ -58,17 +58,18 @@ export class QuickInputController extends Disposable {
this.idPrefix = options.idPrefix;
this.parentElement = options.container;
this.styles = options.styles;
this.registerKeyModsListeners();
this._register(Event.runAndSubscribe(dom.onDidRegisterWindow, ({ window, disposableStore }) => this.registerKeyModsListeners(window, disposableStore), { window, disposableStore: this._store }));
}
private registerKeyModsListeners() {
private registerKeyModsListeners(window: Window, disposables: DisposableStore): void {
const listener = (e: KeyboardEvent | MouseEvent) => {
this.keyMods.ctrlCmd = e.ctrlKey || e.metaKey;
this.keyMods.alt = e.altKey;
};
this._register(dom.addDisposableListener(window, dom.EventType.KEY_DOWN, listener, true));
this._register(dom.addDisposableListener(window, dom.EventType.KEY_UP, listener, true));
this._register(dom.addDisposableListener(window, dom.EventType.MOUSE_DOWN, listener, true));
for (const event of [dom.EventType.KEY_DOWN, dom.EventType.KEY_UP, dom.EventType.MOUSE_DOWN]) {
disposables.add(dom.addDisposableListener(window, event, listener, true));
}
}
private getUI() {
@@ -84,7 +84,7 @@ export class WorkspacesManagementMainService extends Disposable implements IWork
// Resolve untitled workspaces
try {
const untitledWorkspacePaths = (await Promises.readdir(this.untitledWorkspacesHome.with({ scheme: Schemas.file }).fsPath)).map(folder => joinPath(this.untitledWorkspacesHome, folder, UNTITLED_WORKSPACE_NAME));//
const untitledWorkspacePaths = (await Promises.readdir(this.untitledWorkspacesHome.with({ scheme: Schemas.file }).fsPath)).map(folder => joinPath(this.untitledWorkspacesHome, folder, UNTITLED_WORKSPACE_NAME));
for (const untitledWorkspacePath of untitledWorkspacePaths) {
const workspace = getWorkspaceIdentifier(untitledWorkspacePath);
const resolvedWorkspace = await this.resolveLocalWorkspace(untitledWorkspacePath);
+2 -2
View File
@@ -9,7 +9,7 @@ import { IContextKeyService, IContextKey, setConstant as setConstantContextKey }
import { InputFocusedContext, IsMacContext, IsLinuxContext, IsWindowsContext, IsWebContext, IsMacNativeContext, IsDevelopmentContext, IsIOSContext, ProductQualityContext, IsMobileContext } from 'vs/platform/contextkey/common/contextkeys';
import { SplitEditorsVertically, InEditorZenModeContext, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, EmbedderIdentifierContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, EditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, ActiveEditorCanToggleReadonlyContext, applyAvailableEditorIds, TitleBarVisibleContext } from 'vs/workbench/common/contextkeys';
import { TEXT_DIFF_EDITOR_ID, EditorInputCapabilities, SIDE_BY_SIDE_EDITOR_ID, EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor';
import { trackFocus, addDisposableListener, EventType } from 'vs/base/browser/dom';
import { trackFocus, addDisposableListener, EventType, onDidRegisterWindow } from 'vs/base/browser/dom';
import { preferredSideBySideGroupDirection, GroupDirection, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
@@ -235,7 +235,7 @@ export class WorkbenchContextKeysHandler extends Disposable {
this._register(this.editorGroupService.onDidChangeEditorPartOptions(() => this.updateEditorAreaContextKeys()));
this._register(addDisposableListener(window, EventType.FOCUS_IN, () => this.updateInputContextKeys(), true));
this._register(Event.runAndSubscribe(onDidRegisterWindow, ({ window, disposableStore }) => disposableStore.add(addDisposableListener(window, EventType.FOCUS_IN, () => this.updateInputContextKeys(), true)), { window, disposableStore: this._store }));
this._register(this.contextService.onDidChangeWorkbenchState(() => this.updateWorkbenchStateContextKey()));
this._register(this.contextService.onDidChangeWorkspaceFolders(() => {
+2 -2
View File
@@ -1460,8 +1460,8 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
}
resizePart(part: Parts, sizeChangeWidth: number, sizeChangeHeight: number): void {
const sizeChangePxWidth = Math.sign(sizeChangeWidth) * computeScreenAwareSize(Math.abs(sizeChangeWidth));
const sizeChangePxHeight = Math.sign(sizeChangeHeight) * computeScreenAwareSize(Math.abs(sizeChangeHeight));
const sizeChangePxWidth = Math.sign(sizeChangeWidth) * computeScreenAwareSize(window, Math.abs(sizeChangeWidth));
const sizeChangePxHeight = Math.sign(sizeChangeHeight) * computeScreenAwareSize(window, Math.abs(sizeChangeHeight));
let viewSize: IViewSize;
@@ -442,6 +442,7 @@ export class BreadcrumbsControl {
},
getAnchor: () => {
if (!pickerAnchor) {
const window = dom.getWindow(this.domNode);
const maxInnerWidth = window.innerWidth - 8 /*a little less the full widget*/;
let maxHeight = Math.min(window.innerHeight * 0.7, 300);
@@ -5,7 +5,7 @@
import 'vs/css!./media/editordroptarget';
import { DataTransfers } from 'vs/base/browser/dnd';
import { addDisposableListener, DragAndDropObserver, EventHelper, EventType, isAncestor } from 'vs/base/browser/dom';
import { addDisposableListener, DragAndDropObserver, EventHelper, EventType, getWindow, isAncestor } from 'vs/base/browser/dom';
import { renderFormattedText } from 'vs/base/browser/formattedTextRenderer';
import { RunOnceScheduler } from 'vs/base/common/async';
import { toDisposable } from 'vs/base/common/lifecycle';
@@ -601,7 +601,9 @@ export class EditorDropTarget extends Themable {
private registerListeners(): void {
this._register(addDisposableListener(this.container, EventType.DRAG_ENTER, e => this.onDragEnter(e)));
this._register(addDisposableListener(this.container, EventType.DRAG_LEAVE, () => this.onDragLeave()));
[this.container, window].forEach(node => this._register(addDisposableListener(node as HTMLElement, EventType.DRAG_END, () => this.onDragEnd())));
for (const target of [this.container, getWindow(this.container)]) {
this._register(addDisposableListener(target, EventType.DRAG_END, () => this.onDragEnd()));
}
}
private onDragEnter(event: DragEvent): void {
@@ -129,6 +129,7 @@ class NativeContextMenuService extends Disposable implements IContextMenuService
}
if (!isMacintosh) {
const window = dom.getWindow(anchor);
const availableHeightForMenu = window.screen.height - y;
if (availableHeightForMenu < actions.length * (isWindows ? 45 : 32) /* guess of 1 menu item height */) {
// this is a guess to detect whether the context menu would
@@ -238,10 +238,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService {
this.updateKeybindingsJsonSchema();
this._register(extensionService.onDidRegisterExtensions(() => this.updateKeybindingsJsonSchema()));
this._register(this._registerKeyListeners(window));
this._register(dom.onDidRegisterWindow(({ window, disposableStore }) => {
disposableStore.add(this._registerKeyListeners(window));
}));
this._register(Event.runAndSubscribe(dom.onDidRegisterWindow, ({ window, disposableStore }) => disposableStore.add(this._registerKeyListeners(window)), { window, disposableStore: this._store }));
this._register(browser.onDidChangeFullscreen(() => {
const keyboard: IKeyboard | null = (<INavigatorWithKeyboard>navigator).keyboard;