Skip to content

Commit 50bb1f1

Browse files
authored
fix: memory leak in context key (microsoft#258206)
1 parent 6209372 commit 50bb1f1

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

src/vs/workbench/browser/contextkeys.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { Event } from '../../base/common/event.js';
7-
import { Disposable, DisposableStore } from '../../base/common/lifecycle.js';
7+
import { Disposable, DisposableStore, MutableDisposable } from '../../base/common/lifecycle.js';
88
import { IContextKeyService, IContextKey, setConstant as setConstantContextKey } from '../../platform/contextkey/common/contextkey.js';
99
import { InputFocusedContext, IsMacContext, IsLinuxContext, IsWindowsContext, IsWebContext, IsMacNativeContext, IsDevelopmentContext, IsIOSContext, ProductQualityContext, IsMobileContext } from '../../platform/contextkey/common/contextkeys.js';
1010
import { SplitEditorsVertically, InEditorZenModeContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, EmbedderIdentifierContext, EditorTabsVisibleContext, IsMainEditorCenteredLayoutContext, MainEditorAreaVisibleContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsMainWindowFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, TitleBarVisibleContext, TitleBarStyleContext, IsAuxiliaryWindowFocusedContext, ActiveEditorGroupEmptyContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorGroupLockedContext, MultipleEditorGroupsContext, EditorsVisibleContext, AuxiliaryBarMaximizedContext } from '../common/contextkeys.js';
@@ -219,7 +219,11 @@ export class WorkbenchContextKeysHandler extends Disposable {
219219

220220
this._register(this.editorGroupService.onDidChangeEditorPartOptions(() => this.updateEditorAreaContextKeys()));
221221

222-
this._register(Event.runAndSubscribe(onDidRegisterWindow, ({ window, disposables }) => disposables.add(addDisposableListener(window, EventType.FOCUS_IN, () => this.updateInputContextKeys(window.document, disposables), true)), { window: mainWindow, disposables: this._store }));
222+
223+
this._register(Event.runAndSubscribe(onDidRegisterWindow, ({ window, disposables }) => {
224+
const mutableDisposable = disposables.add(new MutableDisposable());
225+
disposables.add(addDisposableListener(window, EventType.FOCUS_IN, () => this.updateInputContextKeys(window.document, mutableDisposable), true));
226+
}, { window: mainWindow, disposables: this._store }));
223227

224228
this._register(this.contextService.onDidChangeWorkbenchState(() => this.updateWorkbenchStateContextKey()));
225229
this._register(this.contextService.onDidChangeWorkspaceFolders(() => {
@@ -305,7 +309,7 @@ export class WorkbenchContextKeysHandler extends Disposable {
305309
this.editorTabsVisibleContext.set(this.editorGroupService.partOptions.showTabs === 'multiple');
306310
}
307311

308-
private updateInputContextKeys(ownerDocument: Document, disposables: DisposableStore): void {
312+
private updateInputContextKeys(ownerDocument: Document, mutableDisposable: MutableDisposable<any>): void {
309313

310314
function activeElementIsInput(): boolean {
311315
return !!ownerDocument.activeElement && isEditableElement(ownerDocument.activeElement);
@@ -314,8 +318,14 @@ export class WorkbenchContextKeysHandler extends Disposable {
314318
const isInputFocused = activeElementIsInput();
315319
this.inputFocusedContext.set(isInputFocused);
316320

321+
322+
const store = new DisposableStore();
323+
mutableDisposable.value = store;
324+
325+
317326
if (isInputFocused) {
318-
const tracker = disposables.add(trackFocus(ownerDocument.activeElement as HTMLElement));
327+
328+
const tracker = store.add(trackFocus(ownerDocument.activeElement as HTMLElement));
319329
Event.once(tracker.onDidBlur)(() => {
320330

321331
// Ensure we are only updating the context key if we are
@@ -331,7 +341,7 @@ export class WorkbenchContextKeysHandler extends Disposable {
331341
}
332342

333343
tracker.dispose();
334-
}, undefined, disposables);
344+
}, undefined, store);
335345
}
336346
}
337347

0 commit comments

Comments
 (0)