diff --git a/src/vs/base/browser/window.ts b/src/vs/base/browser/window.ts index 46859b15efe..fe715d6f2c2 100644 --- a/src/vs/base/browser/window.ts +++ b/src/vs/base/browser/window.ts @@ -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'; +} diff --git a/src/vs/workbench/browser/window.ts b/src/vs/workbench/browser/window.ts index c32d69dd94d..2e76502326e 100644 --- a/src/vs/workbench/browser/window.ts +++ b/src/vs/workbench/browser/window.ts @@ -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(() => { diff --git a/src/vs/workbench/services/auxiliaryWindow/browser/auxiliaryWindowService.ts b/src/vs/workbench/services/auxiliaryWindow/browser/auxiliaryWindowService.ts index a5cb6cb6d25..ecaad1817d0 100644 --- a/src/vs/workbench/services/auxiliaryWindow/browser/auxiliaryWindowService.ts +++ b/src/vs/workbench/services/auxiliaryWindow/browser/auxiliaryWindowService.ts @@ -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 { + 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 { - 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(); @@ -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 diff --git a/src/vs/workbench/services/auxiliaryWindow/electron-sandbox/auxiliaryWindowService.ts b/src/vs/workbench/services/auxiliaryWindow/electron-sandbox/auxiliaryWindowService.ts index d4cb8a37553..66427a0fe8c 100644 --- a/src/vs/workbench/services/auxiliaryWindow/electron-sandbox/auxiliaryWindowService.ts +++ b/src/vs/workbench/services/auxiliaryWindow/electron-sandbox/auxiliaryWindowService.ts @@ -31,6 +31,14 @@ export class NativeAuxiliaryWindowService extends BrowserAuxiliaryWindowService super(layoutService, dialogService); } + protected override async resolveWindowId(auxiliaryWindow: NativeAuxiliaryWindow): Promise { + 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 { - 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); diff --git a/src/vs/workbench/services/host/browser/browserHostService.ts b/src/vs/workbench/services/host/browser/browserHostService.ts index d8734794dc5..0bd525f2529 100644 --- a/src/vs/workbench/services/host/browser/browserHostService.ts +++ b/src/vs/workbench/services/host/browser/browserHostService.ts @@ -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: diff --git a/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts b/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts index a012441c9f6..2b766c62887 100644 --- a/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts +++ b/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts @@ -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 {