mirror of
https://github.com/microsoft/vscode.git
synced 2026-07-07 07:16:41 +01:00
aux window - skip hidden windows in timeout scheduling (#198123)
This commit is contained in:
@@ -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';
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
+8
-8
@@ -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 {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user