Skip to content

Commit ed20361

Browse files
authored
fix: possible memory leak in SettingTreeRenderers (microsoft#216768)
1 parent 14b094b commit ed20361

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -794,10 +794,10 @@ export class SettingsEditor2 extends EditorPane {
794794
this.createTOC(this.tocTreeContainer);
795795
this.createSettingsTree(this.settingsTreeContainer);
796796

797-
this.splitView = new SplitView(this.bodyContainer, {
797+
this.splitView = this._register(new SplitView(this.bodyContainer, {
798798
orientation: Orientation.HORIZONTAL,
799799
proportionalLayout: true
800-
});
800+
}));
801801
const startingWidth = this.storageService.getNumber('settingsEditor2.splitViewWidth', StorageScope.PROFILE, SettingsEditor2.TOC_RESET_WIDTH);
802802
this.splitView.addView({
803803
onDidChange: Event.None,
@@ -914,7 +914,7 @@ export class SettingsEditor2 extends EditorPane {
914914
}
915915

916916
private createSettingsTree(container: HTMLElement): void {
917-
this.settingRenderers = this.instantiationService.createInstance(SettingTreeRenderers);
917+
this.settingRenderers = this._register(this.instantiationService.createInstance(SettingTreeRenderers));
918918
this._register(this.settingRenderers.onDidChangeSetting(e => this.onDidChangeSetting(e.key, e.value, e.type, e.manualReset, e.scope)));
919919
this._register(this.settingRenderers.onDidOpenSettings(settingKey => {
920920
this.openSettingsFile({ revealSetting: { key: settingKey, edit: true } });

src/vs/workbench/contrib/preferences/browser/settingsTree.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1985,10 +1985,10 @@ export class SettingsExtensionToggleRenderer extends AbstractSettingRenderer imp
19851985
}
19861986
}
19871987

1988-
export class SettingTreeRenderers {
1988+
export class SettingTreeRenderers extends Disposable {
19891989
readonly onDidClickOverrideElement: Event<ISettingOverrideClickEvent>;
19901990

1991-
private readonly _onDidChangeSetting = new Emitter<ISettingChangeEvent>();
1991+
private readonly _onDidChangeSetting = this._register(new Emitter<ISettingChangeEvent>());
19921992
readonly onDidChangeSetting: Event<ISettingChangeEvent>;
19931993

19941994
readonly onDidOpenSettings: Event<string>;
@@ -2012,6 +2012,7 @@ export class SettingTreeRenderers {
20122012
@IUserDataProfilesService private readonly _userDataProfilesService: IUserDataProfilesService,
20132013
@IUserDataSyncEnablementService private readonly _userDataSyncEnablementService: IUserDataSyncEnablementService,
20142014
) {
2015+
super();
20152016
this.settingActions = [
20162017
new Action('settings.resetSetting', localize('resetSettingLabel', "Reset Setting"), undefined, undefined, async context => {
20172018
if (context instanceof SettingsTreeSettingElement) {
@@ -2117,6 +2118,20 @@ export class SettingTreeRenderers {
21172118
const settingElement = this.getSettingDOMElementForDOMElement(element);
21182119
return settingElement && settingElement.getAttribute(AbstractSettingRenderer.SETTING_ID_ATTR);
21192120
}
2121+
2122+
override dispose(): void {
2123+
super.dispose();
2124+
this.settingActions.forEach(action => {
2125+
if (isDisposable(action)) {
2126+
action.dispose();
2127+
}
2128+
});
2129+
this.allRenderers.forEach(renderer => {
2130+
if (isDisposable(renderer)) {
2131+
renderer.dispose();
2132+
}
2133+
});
2134+
}
21202135
}
21212136

21222137
/**

0 commit comments

Comments
 (0)