aux window - skip hidden windows in timeout scheduling (#198123)

This commit is contained in:
Benjamin Pasero
2023-11-13 16:52:27 +01:00
committed by GitHub
parent e447d54e1e
commit e889f690ee
6 changed files with 35 additions and 31 deletions
+10
View File
@@ -26,3 +26,13 @@ export const mainWindow = window as CodeWindow;
* or `DOM.getActiveWindow()` to obtain the correct window for the context you are in.
*/
export const $window = mainWindow;
export function isAuxiliaryWindow(obj: Window): obj is CodeWindow {
if (obj === mainWindow) {
return false;
}
const candidate = obj as CodeWindow | undefined;
return typeof candidate?.vscodeWindowId === 'number';
}
+5 -1
View File
@@ -27,7 +27,7 @@ import { BrowserLifecycleService } from 'vs/workbench/services/lifecycle/browser
import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycle';
import { IHostService } from 'vs/workbench/services/host/browser/host';
import { registerWindowDriver } from 'vs/workbench/services/driver/browser/driver';
import { CodeWindow, mainWindow } from 'vs/base/browser/window';
import { CodeWindow, isAuxiliaryWindow, mainWindow } from 'vs/base/browser/window';
import { createSingleCallFunction } from 'vs/base/common/functional';
export abstract class BaseWindow extends Disposable {
@@ -71,6 +71,10 @@ export abstract class BaseWindow extends Disposable {
});
for (const { window, disposables } of dom.getWindows()) {
if (isAuxiliaryWindow(window) && window.document.visibilityState === 'hidden') {
continue; // skip over hidden windows (but never over main window)
}
const handle = (window as any).vscodeOriginalSetTimeout.apply(this, [handlerFn, timeout, ...args]);
const timeoutDisposable = toDisposable(() => {
@@ -110,16 +110,6 @@ class AuxiliaryWindow extends BaseWindow implements IAuxiliaryWindow {
}
}
export function isAuxiliaryWindow(obj: Window): obj is CodeWindow {
if (obj === mainWindow) {
return false;
}
const candidate = obj as CodeWindow | undefined;
return typeof candidate?.vscodeWindowId === 'number';
}
export class BrowserAuxiliaryWindowService extends Disposable implements IAuxiliaryWindowService {
declare readonly _serviceBrand: undefined;
@@ -208,7 +198,11 @@ export class BrowserAuxiliaryWindowService extends Disposable implements IAuxili
return auxiliaryWindow?.window;
}
protected createContainer(auxiliaryWindow: Window, disposables: DisposableStore): HTMLElement {
protected async resolveWindowId(auxiliaryWindow: Window): Promise<number> {
return BrowserAuxiliaryWindowService.WINDOW_IDS++;
}
protected createContainer(auxiliaryWindow: CodeWindow, disposables: DisposableStore): HTMLElement {
this.patchMethods(auxiliaryWindow);
this.applyMeta(auxiliaryWindow);
@@ -217,7 +211,7 @@ export class BrowserAuxiliaryWindowService extends Disposable implements IAuxili
return this.applyHTML(auxiliaryWindow, disposables);
}
protected patchMethods(auxiliaryWindow: Window): void {
protected patchMethods(auxiliaryWindow: CodeWindow): void {
// Disallow `createElement` because it would create
// HTML Elements in the "wrong" context and break
@@ -227,11 +221,7 @@ export class BrowserAuxiliaryWindowService extends Disposable implements IAuxili
};
}
protected async resolveWindowId(auxiliaryWindow: Window): Promise<number> {
return BrowserAuxiliaryWindowService.WINDOW_IDS++;
}
private applyMeta(auxiliaryWindow: Window): void {
private applyMeta(auxiliaryWindow: CodeWindow): void {
const metaCharset = createMetaElement(auxiliaryWindow.document.head);
metaCharset.setAttribute('charset', 'utf-8');
@@ -247,7 +237,7 @@ export class BrowserAuxiliaryWindowService extends Disposable implements IAuxili
}
}
protected applyCSS(auxiliaryWindow: Window, disposables: DisposableStore): void {
protected applyCSS(auxiliaryWindow: CodeWindow, disposables: DisposableStore): void {
mark('code/auxiliaryWindow/willApplyCSS');
const mapOriginalToClone = new Map<Node /* original */, Node /* clone */>();
@@ -313,7 +303,7 @@ export class BrowserAuxiliaryWindowService extends Disposable implements IAuxili
mark('code/auxiliaryWindow/didApplyCSS');
}
private applyHTML(auxiliaryWindow: Window, disposables: DisposableStore): HTMLElement {
private applyHTML(auxiliaryWindow: CodeWindow, disposables: DisposableStore): HTMLElement {
mark('code/auxiliaryWindow/willApplyHTML');
// Create workbench container and apply classes
@@ -31,6 +31,14 @@ export class NativeAuxiliaryWindowService extends BrowserAuxiliaryWindowService
super(layoutService, dialogService);
}
protected override async resolveWindowId(auxiliaryWindow: NativeAuxiliaryWindow): Promise<number> {
mark('code/auxiliaryWindow/willResolveWindowId');
const windowId = await auxiliaryWindow.vscode.ipcRenderer.invoke('vscode:registerAuxiliaryWindow', this.nativeHostService.windowId);
mark('code/auxiliaryWindow/didResolveWindowId');
return windowId;
}
protected override createContainer(auxiliaryWindow: NativeAuxiliaryWindow, disposables: DisposableStore): HTMLElement {
// Zoom level
@@ -41,14 +49,6 @@ export class NativeAuxiliaryWindowService extends BrowserAuxiliaryWindowService
return super.createContainer(auxiliaryWindow, disposables);
}
protected override async resolveWindowId(auxiliaryWindow: NativeAuxiliaryWindow): Promise<number> {
mark('code/auxiliaryWindow/willResolveWindowId');
const windowId = await auxiliaryWindow.vscode.ipcRenderer.invoke('vscode:registerAuxiliaryWindow', this.nativeHostService.windowId);
mark('code/auxiliaryWindow/didResolveWindowId');
return windowId;
}
protected override patchMethods(auxiliaryWindow: NativeAuxiliaryWindow): void {
super.patchMethods(auxiliaryWindow);
@@ -37,8 +37,7 @@ import { Schemas } from 'vs/base/common/network';
import { ITextEditorOptions } from 'vs/platform/editor/common/editor';
import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile';
import { coalesce } from 'vs/base/common/arrays';
import { isAuxiliaryWindow } from 'vs/workbench/services/auxiliaryWindow/browser/auxiliaryWindowService';
import { mainWindow } from 'vs/base/browser/window';
import { mainWindow, isAuxiliaryWindow } from 'vs/base/browser/window';
/**
* A workspace to open in the workbench can either be:
@@ -14,9 +14,10 @@ import { Disposable } from 'vs/base/common/lifecycle';
import { NativeHostService } from 'vs/platform/native/common/nativeHostService';
import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService';
import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService';
import { IAuxiliaryWindowService, isAuxiliaryWindow } from 'vs/workbench/services/auxiliaryWindow/browser/auxiliaryWindowService';
import { IAuxiliaryWindowService } from 'vs/workbench/services/auxiliaryWindow/browser/auxiliaryWindowService';
import { disposableWindowInterval, getActiveDocument, getWindowsCount, onDidRegisterWindow } from 'vs/base/browser/dom';
import { memoize } from 'vs/base/common/decorators';
import { isAuxiliaryWindow } from 'vs/base/browser/window';
class WorkbenchNativeHostService extends NativeHostService {