Skip to content

Commit b2b60ac

Browse files
authored
fix: memory leak in code editor widget (microsoft#205488)
1 parent d83cc26 commit b2b60ac

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

src/vs/editor/browser/widget/codeEditorContributions.ts

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

66
import { getWindow, runWhenWindowIdle } from 'vs/base/browser/dom';
77
import { onUnexpectedError } from 'vs/base/common/errors';
8-
import { Disposable, DisposableMap } from 'vs/base/common/lifecycle';
8+
import { Disposable, DisposableMap, IDisposable } from 'vs/base/common/lifecycle';
99
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
1010
import { EditorContributionInstantiation, IEditorContributionDescription } from 'vs/editor/browser/editorExtensions';
1111
import { IEditorContribution } from 'vs/editor/common/editorCommon';
@@ -111,10 +111,10 @@ export class CodeEditorContributions extends Disposable {
111111
this._instantiateSome(EditorContributionInstantiation.BeforeFirstInteraction);
112112
}
113113

114-
public onAfterModelAttached(): void {
115-
this._register(runWhenWindowIdle(getWindow(this._editor?.getDomNode()), () => {
114+
public onAfterModelAttached(): IDisposable {
115+
return runWhenWindowIdle(getWindow(this._editor?.getDomNode()), () => {
116116
this._instantiateSome(EditorContributionInstantiation.AfterFirstRender);
117-
}, 50));
117+
}, 50);
118118
}
119119

120120
private _instantiateSome(instantiation: EditorContributionInstantiation): void {

src/vs/editor/browser/widget/codeEditorWidget.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE
242242
private readonly _overflowWidgetsDomNode: HTMLElement | undefined;
243243
private readonly _id: number;
244244
private readonly _configuration: IEditorConfiguration;
245+
private _contributionsDisposable: IDisposable | undefined;
245246

246247
protected readonly _actions = new Map<string, editorCommon.IEditorAction>();
247248

@@ -523,7 +524,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE
523524
this._onDidChangeModel.fire(e);
524525
this._postDetachModelCleanup(detachedModel);
525526

526-
this._contributions.onAfterModelAttached();
527+
this._contributionsDisposable = this._contributions.onAfterModelAttached();
527528
}
528529

529530
private _removeDecorationTypes(): void {
@@ -1871,6 +1872,8 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE
18711872
}
18721873

18731874
private _detachModel(): ITextModel | null {
1875+
this._contributionsDisposable?.dispose();
1876+
this._contributionsDisposable = undefined;
18741877
if (!this._modelData) {
18751878
return null;
18761879
}
@@ -1887,7 +1890,6 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE
18871890
if (this._bannerDomNode && this._domElement.contains(this._bannerDomNode)) {
18881891
this._domElement.removeChild(this._bannerDomNode);
18891892
}
1890-
18911893
return model;
18921894
}
18931895

0 commit comments

Comments
 (0)