aux window - limit reload window action to main window (#197145)

This commit is contained in:
Benjamin Pasero 2023-11-01 18:18:03 +01:00 committed by GitHub
parent 8fe00d1e00
commit c5bf435ff9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 37 additions and 25 deletions

View file

@ -1367,13 +1367,18 @@ export function finalHandler<T extends Event>(fn: (event: T) => any): (event: T)
};
}
export function domContentLoaded(): Promise<unknown> {
return new Promise<unknown>(resolve => {
const readyState = document.readyState;
if (readyState === 'complete' || (document && document.body !== null)) {
export function domContentLoaded(targetWindow: Window): Promise<void> {
return new Promise<void>(resolve => {
const readyState = targetWindow.document.readyState;
if (readyState === 'complete' || (targetWindow.document && targetWindow.document.body !== null)) {
resolve(undefined);
} else {
window.addEventListener('DOMContentLoaded', resolve, false);
const listener = () => {
targetWindow.window.removeEventListener('DOMContentLoaded', listener, false);
resolve();
};
targetWindow.window.addEventListener('DOMContentLoaded', listener, false);
}
});
}

View file

@ -8,7 +8,7 @@ import { IWindowOpenable } from 'vs/platform/window/common/window';
import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
import { MenuRegistry, MenuId, Action2, registerAction2, IAction2Options } from 'vs/platform/actions/common/actions';
import { KeyChord, KeyCode, KeyMod } from 'vs/base/common/keyCodes';
import { IsFullscreenContext } from 'vs/workbench/common/contextkeys';
import { IsAuxiliaryWindowFocusedContext, IsFullscreenContext } from 'vs/workbench/common/contextkeys';
import { IsMacNativeContext, IsDevelopmentContext, IsWebContext, IsIOSContext } from 'vs/platform/contextkey/common/contextkeys';
import { Categories } from 'vs/platform/action/common/actionCommonCategories';
import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
@ -34,7 +34,7 @@ import { CommandsRegistry } from 'vs/platform/commands/common/commands';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { isFolderBackupInfo, isWorkspaceBackupInfo } from 'vs/platform/backup/common/backup';
import { getActiveElement } from 'vs/base/browser/dom';
import { getActiveElement, getActiveWindow } from 'vs/base/browser/dom';
export const inRecentFilesPickerContextKey = 'inRecentFilesPicker';
@ -322,6 +322,7 @@ export class ReloadWindowAction extends Action2 {
id: ReloadWindowAction.ID,
title: { value: localize('reloadWindow', "Reload Window"), original: 'Reload Window' },
category: Categories.Developer,
precondition: IsAuxiliaryWindowFocusedContext.toNegated(),
f1: true,
keybinding: {
weight: KeybindingWeight.WorkbenchContrib + 50,
@ -331,10 +332,12 @@ export class ReloadWindowAction extends Action2 {
});
}
override run(accessor: ServicesAccessor): Promise<void> {
override async run(accessor: ServicesAccessor): Promise<void> {
const hostService = accessor.get(IHostService);
return hostService.reload();
if (getActiveWindow() === window) {
return hostService.reload(); // only supported for main window
}
}
}

View file

@ -7,7 +7,7 @@ import { Event } from 'vs/base/common/event';
import { Disposable } from 'vs/base/common/lifecycle';
import { IContextKeyService, IContextKey, setConstant as setConstantContextKey } from 'vs/platform/contextkey/common/contextkey';
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, EmbedderIdentifierContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, EditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, ActiveEditorCanToggleReadonlyContext, applyAvailableEditorIds, TitleBarVisibleContext, TitleBarStyleContext, MultipleEditorGroupsContext } from 'vs/workbench/common/contextkeys';
import { SplitEditorsVertically, InEditorZenModeContext, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, EmbedderIdentifierContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, EditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, ActiveEditorCanToggleReadonlyContext, applyAvailableEditorIds, TitleBarVisibleContext, TitleBarStyleContext, MultipleEditorGroupsContext, IsAuxiliaryWindowFocusedContext } 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, onDidRegisterWindow } from 'vs/base/browser/dom';
import { preferredSideBySideGroupDirection, GroupDirection, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
@ -66,6 +66,7 @@ export class WorkbenchContextKeysHandler extends Disposable {
private inZenModeContext: IContextKey<boolean>;
private isFullscreenContext: IContextKey<boolean>;
private isAuxiliaryWindowFocusedContext: IContextKey<boolean>;
private isCenteredLayoutContext: IContextKey<boolean>;
private sideBarVisibleContext: IContextKey<boolean>;
private editorAreaVisibleContext: IContextKey<boolean>;
@ -182,8 +183,9 @@ export class WorkbenchContextKeysHandler extends Disposable {
this.splitEditorsVerticallyContext = SplitEditorsVertically.bindTo(this.contextKeyService);
this.updateSplitEditorsVerticallyContext();
// Fullscreen
// Window
this.isFullscreenContext = IsFullscreenContext.bindTo(this.contextKeyService);
this.isAuxiliaryWindowFocusedContext = IsAuxiliaryWindowFocusedContext.bindTo(this.contextKeyService);
// Zen Mode
this.inZenModeContext = InEditorZenModeContext.bindTo(this.contextKeyService);
@ -253,6 +255,7 @@ export class WorkbenchContextKeysHandler extends Disposable {
}));
this._register(this.layoutService.onDidChangeZenMode(enabled => this.inZenModeContext.set(enabled)));
this._register(this.layoutService.onDidChangeActiveContainer(() => this.isAuxiliaryWindowFocusedContext.set(this.layoutService.activeContainer !== this.layoutService.container)));
this._register(this.layoutService.onDidChangeFullscreen(fullscreen => this.isFullscreenContext.set(fullscreen)));
this._register(this.layoutService.onDidChangeCenteredLayout(centered => this.isCenteredLayoutContext.set(centered)));
this._register(this.layoutService.onDidChangePanelPosition(position => this.panelPositionContext.set(position)));

View file

@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import { mark } from 'vs/base/common/performance';
import { domContentLoaded, detectFullscreen, getCookieValue } from 'vs/base/browser/dom';
import { domContentLoaded, detectFullscreen, getCookieValue, getWindow } from 'vs/base/browser/dom';
import { assertIsDefined } from 'vs/base/common/types';
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
import { ILogService, ConsoleLogger, getLogLevel, ILoggerService, ILogger } from 'vs/platform/log/common/log';
@ -119,7 +119,7 @@ export class BrowserMain extends Disposable {
async open(): Promise<IWorkbench> {
// Init services and wait for DOM to be ready in parallel
const [services] = await Promise.all([this.initServices(), domContentLoaded()]);
const [services] = await Promise.all([this.initServices(), domContentLoaded(getWindow(this.domElement))]);
// Create Workbench
const workbench = new Workbench(this.domElement, undefined, services.serviceCollection, services.logService);

View file

@ -34,6 +34,7 @@ export const VirtualWorkspaceContext = new RawContextKey<string>('virtualWorkspa
export const TemporaryWorkspaceContext = new RawContextKey<boolean>('temporaryWorkspace', false, localize('temporaryWorkspace', "The scheme of the current workspace is from a temporary file system."));
export const IsFullscreenContext = new RawContextKey<boolean>('isFullscreen', false, localize('isFullscreen', "Whether the window is in fullscreen mode"));
export const IsAuxiliaryWindowFocusedContext = new RawContextKey<boolean>('isAuxiliaryWindowFocusedContext', false, localize('isAuxiliaryWindowFocusedContext', "Whether an auxiliary window is focused"));
export const HasWebFileSystemAccess = new RawContextKey<boolean>('hasWebFileSystemAccess', false, true); // Support for FileSystemAccess web APIs (https://wicg.github.io/file-system-access)

View file

@ -109,7 +109,7 @@ export class DesktopMain extends Disposable {
async open(): Promise<void> {
// Init services and wait for DOM to be ready in parallel
const [services] = await Promise.all([this.initServices(), domContentLoaded()]);
const [services] = await Promise.all([this.initServices(), domContentLoaded(window)]);
// Apply zoom level early once we have a configuration service
// and before the workbench is created to prevent flickering.

View file

@ -201,8 +201,8 @@ export class BrowserHostService extends Disposable implements IHostService {
return true;
}
async focus(window: Window): Promise<void> {
window.focus();
async focus(targetWindow: Window): Promise<void> {
targetWindow.focus();
}
//#endregion
@ -505,7 +505,7 @@ export class BrowserHostService extends Disposable implements IHostService {
}
}
async moveTop(window: Window): Promise<void> {
async moveTop(targetWindow: Window): Promise<void> {
// There seems to be no API to bring a window to front in browsers
}

View file

@ -46,7 +46,7 @@ export interface IHostService {
* focused application which may not be VSCode. It may not be supported
* in all environments.
*/
focus(window: Window, options?: { force: boolean }): Promise<void>;
focus(targetWindow: Window, options?: { force: boolean }): Promise<void>;
//#endregion
@ -72,7 +72,7 @@ export interface IHostService {
/**
* Bring a window to the front and restore it if needed.
*/
moveTop(window: Window): Promise<void>;
moveTop(targetWindow: Window): Promise<void>;
//#endregion
@ -84,12 +84,12 @@ export interface IHostService {
restart(): Promise<void>;
/**
* Reload the currently active window.
* Reload the currently active main window.
*/
reload(options?: { disableExtensions?: boolean }): Promise<void>;
/**
* Attempt to close the active window.
* Attempt to close the active main window.
*/
close(): Promise<void>;

View file

@ -141,12 +141,12 @@ class WorkbenchHostService extends Disposable implements IHostService {
return this.nativeHostService.toggleFullScreen();
}
async moveTop(window: Window): Promise<void> {
async moveTop(targetWindow: Window): Promise<void> {
if (getWindowsCount() <= 1) {
return; // does not apply when only one window is opened
}
return this.nativeHostService.moveWindowTop(isAuxiliaryWindow(window) ? { targetWindowId: window.vscodeWindowId } : undefined);
return this.nativeHostService.moveWindowTop(isAuxiliaryWindow(targetWindow) ? { targetWindowId: targetWindow.vscodeWindowId } : undefined);
}
//#endregion
@ -154,10 +154,10 @@ class WorkbenchHostService extends Disposable implements IHostService {
//#region Lifecycle
focus(window: Window, options?: { force: boolean }): Promise<void> {
focus(targetWindow: Window, options?: { force: boolean }): Promise<void> {
return this.nativeHostService.focusWindow({
force: options?.force,
targetWindowId: isAuxiliaryWindow(window) ? window.vscodeWindowId : this.nativeHostService.windowId
targetWindowId: isAuxiliaryWindow(targetWindow) ? targetWindow.vscodeWindowId : this.nativeHostService.windowId
});
}