Fix wrong use of disposables (#211328)

fix #211096
This commit is contained in:
Benjamin Christopher Simmonds 2024-04-25 12:22:25 +02:00 committed by GitHub
parent 9c7f30b0a8
commit d4a41934a6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 25 additions and 18 deletions

View file

@ -55,7 +55,7 @@ import { ConsoleLogger, ILogService } from 'vs/platform/log/common/log';
import { IWorkspaceTrustManagementService, IWorkspaceTrustTransitionParticipant, IWorkspaceTrustUriInfo } from 'vs/platform/workspace/common/workspaceTrust';
import { EditorOption } from 'vs/editor/common/config/editorOptions';
import { ICodeEditor, IDiffEditor } from 'vs/editor/browser/editorBrowser';
import { IContextMenuService, IContextViewDelegate, IContextViewService } from 'vs/platform/contextview/browser/contextView';
import { IContextMenuService, IContextViewDelegate, IContextViewService, IOpenContextView } from 'vs/platform/contextview/browser/contextView';
import { ContextViewService } from 'vs/platform/contextview/browser/contextViewService';
import { LanguageService } from 'vs/editor/common/services/languageService';
import { ContextMenuService } from 'vs/platform/contextview/browser/contextMenuService';
@ -989,7 +989,7 @@ class StandaloneContextViewService extends ContextViewService {
super(layoutService);
}
override showContextView(delegate: IContextViewDelegate, container?: HTMLElement, shadowRoot?: boolean): IDisposable {
override showContextView(delegate: IContextViewDelegate, container?: HTMLElement, shadowRoot?: boolean): IOpenContextView {
if (!container) {
const codeEditor = this._codeEditorService.getFocusedCodeEditor() || this._codeEditorService.getActiveCodeEditor();
if (codeEditor) {

View file

@ -19,7 +19,7 @@ export interface IContextViewService extends IContextViewProvider {
readonly _serviceBrand: undefined;
showContextView(delegate: IContextViewDelegate, container?: HTMLElement, shadowRoot?: boolean): IDisposable;
showContextView(delegate: IContextViewDelegate, container?: HTMLElement, shadowRoot?: boolean): IOpenContextView;
hideContextView(data?: any): void;
getContextViewElement(): HTMLElement;
layout(): void;
@ -48,6 +48,10 @@ export interface IContextViewDelegate {
layer?: number; // Default: 0
}
export interface IOpenContextView {
close: () => void;
}
export const IContextMenuService = createDecorator<IContextMenuService>('contextMenuService');
export interface IContextMenuService {

View file

@ -4,15 +4,14 @@
*--------------------------------------------------------------------------------------------*/
import { ContextView, ContextViewDOMPosition, IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview';
import { Disposable, IDisposable, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle';
import { Disposable } from 'vs/base/common/lifecycle';
import { ILayoutService } from 'vs/platform/layout/browser/layoutService';
import { IContextViewDelegate, IContextViewService } from './contextView';
import { IContextViewDelegate, IContextViewService, IOpenContextView } from './contextView';
import { getWindow } from 'vs/base/browser/dom';
export class ContextViewHandler extends Disposable implements IContextViewProvider {
private readonly currentViewDisposable = this._register(new MutableDisposable<IDisposable>());
private openContextView: IOpenContextView | undefined;
protected readonly contextView = this._register(new ContextView(this.layoutService.mainContainer, ContextViewDOMPosition.ABSOLUTE));
constructor(
@ -26,7 +25,7 @@ export class ContextViewHandler extends Disposable implements IContextViewProvid
// ContextView
showContextView(delegate: IContextViewDelegate, container?: HTMLElement, shadowRoot?: boolean): IDisposable {
showContextView(delegate: IContextViewDelegate, container?: HTMLElement, shadowRoot?: boolean): IOpenContextView {
let domPosition: ContextViewDOMPosition;
if (container) {
if (container === this.layoutService.getContainer(getWindow(container))) {
@ -44,14 +43,16 @@ export class ContextViewHandler extends Disposable implements IContextViewProvid
this.contextView.show(delegate);
const disposable = toDisposable(() => {
if (this.currentViewDisposable === disposable) {
this.hideContextView();
const openContextView: IOpenContextView = {
close: () => {
if (this.openContextView === openContextView) {
this.hideContextView();
}
}
});
};
this.currentViewDisposable.value = disposable;
return disposable;
this.openContextView = openContextView;
return openContextView;
}
layout(): void {
@ -60,6 +61,7 @@ export class ContextViewHandler extends Disposable implements IContextViewProvid
hideContextView(data?: any): void {
this.contextView.hide(data);
this.openContextView = undefined;
}
}

View file

@ -16,7 +16,7 @@ import { ResourceLabels, IResourceLabel, IFileLabelOptions } from 'vs/workbench/
import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView';
import { IContextViewService, IContextMenuService, IOpenContextView } from 'vs/platform/contextview/browser/contextView';
import { IContextKeyService, IContextKey, ContextKeyExpr, RawContextKey } from 'vs/platform/contextkey/common/contextkey';
import { ICommandService } from 'vs/platform/commands/common/commands';
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
@ -2286,7 +2286,7 @@ class SCMInputWidget {
private readonly repositoryDisposables = new DisposableStore();
private validation: IInputValidation | undefined;
private validationDisposable: IDisposable = Disposable.None;
private validationContextView: IOpenContextView | undefined;
private validationHasFocus: boolean = false;
private _validationTimer: any;
@ -2652,7 +2652,7 @@ class SCMInputWidget {
const disposables = new DisposableStore();
this.validationDisposable = this.contextViewService.showContextView({
this.validationContextView = this.contextViewService.showContextView({
getAnchor: () => this.element,
render: container => {
this.element.style.borderBottomLeftRadius = '0';
@ -2733,7 +2733,8 @@ class SCMInputWidget {
}
clearValidation(): void {
this.validationDisposable.dispose();
this.validationContextView?.close();
this.validationContextView = undefined;
this.validationHasFocus = false;
}