提交 e9253558 编写于 作者: J Joao Moreno

fix dirtydiff listener leak

fixes #64238
上级 3f90774b
...@@ -940,6 +940,7 @@ export class DirtyDiffModel { ...@@ -940,6 +940,7 @@ export class DirtyDiffModel {
private diffDelayer: ThrottledDelayer<IChange[]>; private diffDelayer: ThrottledDelayer<IChange[]>;
private _originalURIPromise: TPromise<URI>; private _originalURIPromise: TPromise<URI>;
private repositoryDisposables = new Set<IDisposable[]>(); private repositoryDisposables = new Set<IDisposable[]>();
private originalModelDisposables: IDisposable[] = [];
private disposables: IDisposable[] = []; private disposables: IDisposable[] = [];
private _onDidChange = new Emitter<ISplice<IChange>[]>(); private _onDidChange = new Emitter<ISplice<IChange>[]>();
...@@ -1024,31 +1025,37 @@ export class DirtyDiffModel { ...@@ -1024,31 +1025,37 @@ export class DirtyDiffModel {
return this._originalURIPromise; return this._originalURIPromise;
} }
this._originalURIPromise = this.getOriginalResource() this._originalURIPromise = this.getOriginalResource().then(originalUri => {
.then(originalUri => { if (!this._editorModel) { // disposed
if (!this._editorModel) { // disposed return null;
return null; }
}
if (!originalUri) {
this._originalModel = null;
return null;
}
if (this._originalModel && this._originalModel.uri.toString() === originalUri.toString()) {
return originalUri;
}
if (!originalUri) { return this.textModelResolverService.createModelReference(originalUri).then(ref => {
this._originalModel = null; if (!this._editorModel) { // disposed
return null; return null;
} }
return this.textModelResolverService.createModelReference(originalUri) this._originalModel = ref.object.textEditorModel;
.then(ref => {
if (!this._editorModel) { // disposed
return null;
}
this._originalModel = ref.object.textEditorModel; const originalModelDisposables: IDisposable[] = [];
originalModelDisposables.push(ref);
originalModelDisposables.push(ref.object.textEditorModel.onDidChangeContent(() => this.triggerDiff()));
this.disposables.push(ref); dispose(this.originalModelDisposables);
this.disposables.push(ref.object.textEditorModel.onDidChangeContent(() => this.triggerDiff())); this.originalModelDisposables = originalModelDisposables;
return originalUri; return originalUri;
});
}); });
});
return always(this._originalURIPromise, () => { return always(this._originalURIPromise, () => {
this._originalURIPromise = null; this._originalURIPromise = null;
...@@ -1101,6 +1108,7 @@ export class DirtyDiffModel { ...@@ -1101,6 +1108,7 @@ export class DirtyDiffModel {
} }
dispose(): void { dispose(): void {
this.originalModelDisposables = dispose(this.originalModelDisposables);
this.disposables = dispose(this.disposables); this.disposables = dispose(this.disposables);
this._editorModel = null; this._editorModel = null;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册