fix: possible memory leak in SettingTreeRenderers (#216768)

This commit is contained in:
Simon Siefke 2024-06-26 17:25:15 +02:00 committed by GitHub
parent 14b094becc
commit ed2036106c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 20 additions and 5 deletions

View file

@ -794,10 +794,10 @@ export class SettingsEditor2 extends EditorPane {
this.createTOC(this.tocTreeContainer);
this.createSettingsTree(this.settingsTreeContainer);
this.splitView = new SplitView(this.bodyContainer, {
this.splitView = this._register(new SplitView(this.bodyContainer, {
orientation: Orientation.HORIZONTAL,
proportionalLayout: true
});
}));
const startingWidth = this.storageService.getNumber('settingsEditor2.splitViewWidth', StorageScope.PROFILE, SettingsEditor2.TOC_RESET_WIDTH);
this.splitView.addView({
onDidChange: Event.None,
@ -914,7 +914,7 @@ export class SettingsEditor2 extends EditorPane {
}
private createSettingsTree(container: HTMLElement): void {
this.settingRenderers = this.instantiationService.createInstance(SettingTreeRenderers);
this.settingRenderers = this._register(this.instantiationService.createInstance(SettingTreeRenderers));
this._register(this.settingRenderers.onDidChangeSetting(e => this.onDidChangeSetting(e.key, e.value, e.type, e.manualReset, e.scope)));
this._register(this.settingRenderers.onDidOpenSettings(settingKey => {
this.openSettingsFile({ revealSetting: { key: settingKey, edit: true } });

View file

@ -1985,10 +1985,10 @@ export class SettingsExtensionToggleRenderer extends AbstractSettingRenderer imp
}
}
export class SettingTreeRenderers {
export class SettingTreeRenderers extends Disposable {
readonly onDidClickOverrideElement: Event<ISettingOverrideClickEvent>;
private readonly _onDidChangeSetting = new Emitter<ISettingChangeEvent>();
private readonly _onDidChangeSetting = this._register(new Emitter<ISettingChangeEvent>());
readonly onDidChangeSetting: Event<ISettingChangeEvent>;
readonly onDidOpenSettings: Event<string>;
@ -2012,6 +2012,7 @@ export class SettingTreeRenderers {
@IUserDataProfilesService private readonly _userDataProfilesService: IUserDataProfilesService,
@IUserDataSyncEnablementService private readonly _userDataSyncEnablementService: IUserDataSyncEnablementService,
) {
super();
this.settingActions = [
new Action('settings.resetSetting', localize('resetSettingLabel', "Reset Setting"), undefined, undefined, async context => {
if (context instanceof SettingsTreeSettingElement) {
@ -2117,6 +2118,20 @@ export class SettingTreeRenderers {
const settingElement = this.getSettingDOMElementForDOMElement(element);
return settingElement && settingElement.getAttribute(AbstractSettingRenderer.SETTING_ID_ATTR);
}
override dispose(): void {
super.dispose();
this.settingActions.forEach(action => {
if (isDisposable(action)) {
action.dispose();
}
});
this.allRenderers.forEach(renderer => {
if (isDisposable(renderer)) {
renderer.dispose();
}
});
}
}
/**