Skip to content

Commit f7f9fb0

Browse files
authored
Fix memory leaks (microsoft#205589)
* Fix memory leaks The activities in `treeView.ts` and `reportExplorer.ts` are not disposed when the parent object is disposed. Also fix the `contextKeyListener` disposable while we're here. The activity in `webviewViewPane.ts` is never disposed, because the return value is ignored.
1 parent 8895f46 commit f7f9fb0

File tree

3 files changed

+12
-26
lines changed

3 files changed

+12
-26
lines changed

src/vs/workbench/browser/parts/views/treeView.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { isCancellationError } from 'vs/base/common/errors';
2222
import { Emitter, Event } from 'vs/base/common/event';
2323
import { createMatches, FuzzyScore } from 'vs/base/common/filters';
2424
import { IMarkdownString, isMarkdownString } from 'vs/base/common/htmlContent';
25-
import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
25+
import { Disposable, DisposableStore, IDisposable, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle';
2626
import { Mimes } from 'vs/base/common/mime';
2727
import { Schemas } from 'vs/base/common/network';
2828
import { basename, dirname } from 'vs/base/common/resources';
@@ -426,7 +426,8 @@ abstract class AbstractTreeView extends Disposable implements ITreeView {
426426
}
427427

428428
private _badge: IViewBadge | undefined;
429-
private _badgeActivity: IDisposable | undefined;
429+
private readonly _activity = this._register(new MutableDisposable<IDisposable>());
430+
430431
get badge(): IViewBadge | undefined {
431432
return this._badge;
432433
}
@@ -438,19 +439,13 @@ abstract class AbstractTreeView extends Disposable implements ITreeView {
438439
return;
439440
}
440441

441-
if (this._badgeActivity) {
442-
this._badgeActivity.dispose();
443-
this._badgeActivity = undefined;
444-
}
445-
446442
this._badge = badge;
447-
448443
if (badge) {
449444
const activity = {
450445
badge: new NumberBadge(badge.value, () => badge.tooltip),
451446
priority: 50
452447
};
453-
this._badgeActivity = this.activityService.showViewActivity(this.id, activity);
448+
this._activity.value = this.activityService.showViewActivity(this.id, activity);
454449
}
455450
}
456451

src/vs/workbench/contrib/remote/browser/remoteExplorer.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55
import * as nls from 'vs/nls';
6-
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
6+
import { Disposable, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle';
77
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
88
import { Extensions, IViewContainersRegistry, IViewsRegistry, ViewContainer, ViewContainerLocation } from 'vs/workbench/common/views';
99
import { IRemoteExplorerService, PORT_AUTO_FALLBACK_SETTING, PORT_AUTO_FORWARD_SETTING, PORT_AUTO_SOURCE_SETTING, PORT_AUTO_SOURCE_SETTING_HYBRID, PORT_AUTO_SOURCE_SETTING_OUTPUT, PORT_AUTO_SOURCE_SETTING_PROCESS, TUNNEL_VIEW_CONTAINER_ID, TUNNEL_VIEW_ID } from 'vs/workbench/services/remote/common/remoteExplorerService';
@@ -41,8 +41,8 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag
4141
export const VIEWLET_ID = 'workbench.view.remote';
4242

4343
export class ForwardedPortsView extends Disposable implements IWorkbenchContribution {
44-
private contextKeyListener?: IDisposable;
45-
private _activityBadge?: IDisposable;
44+
private readonly contextKeyListener = this._register(new MutableDisposable<IDisposable>());
45+
private readonly activityBadge = this._register(new MutableDisposable<IDisposable>());
4646
private entryAccessor: IStatusbarEntryAccessor | undefined;
4747

4848
constructor(
@@ -75,10 +75,7 @@ export class ForwardedPortsView extends Disposable implements IWorkbenchContribu
7575
}
7676

7777
private async enableForwardedPortsView() {
78-
if (this.contextKeyListener) {
79-
this.contextKeyListener.dispose();
80-
this.contextKeyListener = undefined;
81-
}
78+
this.contextKeyListener.clear();
8279

8380
const viewEnabled: boolean = !!forwardedPortsViewEnabled.getValue(this.contextKeyService);
8481

@@ -91,7 +88,7 @@ export class ForwardedPortsView extends Disposable implements IWorkbenchContribu
9188
viewsRegistry.registerViews([tunnelPanelDescriptor], viewContainer);
9289
}
9390
} else {
94-
this.contextKeyListener = this.contextKeyService.onDidChangeContext(e => {
91+
this.contextKeyListener.value = this.contextKeyService.onDidChangeContext(e => {
9592
if (e.affectsSome(new Set(forwardedPortsViewEnabled.keys()))) {
9693
this.enableForwardedPortsView();
9794
}
@@ -119,9 +116,8 @@ export class ForwardedPortsView extends Disposable implements IWorkbenchContribu
119116
}
120117

121118
private async updateActivityBadge() {
122-
this._activityBadge?.dispose();
123119
if (this.remoteExplorerService.tunnelModel.forwarded.size > 0) {
124-
this._activityBadge = this.activityService.showViewActivity(TUNNEL_VIEW_ID, {
120+
this.activityBadge.value = this.activityService.showViewActivity(TUNNEL_VIEW_ID, {
125121
badge: new NumberBadge(this.remoteExplorerService.tunnelModel.forwarded.size, n => n === 1 ? nls.localize('1forwardedPort', "1 forwarded port") : nls.localize('nForwardedPorts', "{0} forwarded ports", n))
126122
});
127123
}

src/vs/workbench/contrib/webviewView/browser/webviewViewPane.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export class WebviewViewPane extends ViewPane {
5757
private setTitle: string | undefined;
5858

5959
private badge: IViewBadge | undefined;
60-
private activity: IDisposable | undefined;
60+
private readonly activity = this._register(new MutableDisposable<IDisposable>());
6161

6262
private readonly memento: Memento;
6363
private readonly viewState: MementoObject;
@@ -256,18 +256,13 @@ export class WebviewViewPane extends ViewPane {
256256
return;
257257
}
258258

259-
if (this.activity) {
260-
this.activity.dispose();
261-
this.activity = undefined;
262-
}
263-
264259
this.badge = badge;
265260
if (badge) {
266261
const activity = {
267262
badge: new NumberBadge(badge.value, () => badge.tooltip),
268263
priority: 150
269264
};
270-
this.activityService.showViewActivity(this.id, activity);
265+
this.activity.value = this.activityService.showViewActivity(this.id, activity);
271266
}
272267
}
273268

0 commit comments

Comments
 (0)