Skip to content

Commit 03811f9

Browse files
committed
always keep a reference to dirty notebook models, #105283
1 parent 8ff399e commit 03811f9

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverService.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ import { createDecorator, IInstantiationService } from 'vs/platform/instantiatio
77
import { URI } from 'vs/base/common/uri';
88
import { INotebookEditorModel } from 'vs/workbench/contrib/notebook/common/notebookCommon';
99
import { NotebookEditorModel } from 'vs/workbench/contrib/notebook/common/notebookEditorModel';
10-
import { IReference, ReferenceCollection } from 'vs/base/common/lifecycle';
10+
import { DisposableStore, IDisposable, IReference, ReferenceCollection } from 'vs/base/common/lifecycle';
1111
import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService';
1212
import { ILogService } from 'vs/platform/log/common/log';
13+
import { Event } from 'vs/base/common/event';
1314

1415
export const INotebookEditorModelResolverService = createDecorator<INotebookEditorModelResolverService>('INotebookModelResolverService');
1516

@@ -70,15 +71,27 @@ export class NotebookModelResolverService implements INotebookEditorModelResolve
7071
async resolve(resource: URI, viewType?: string, editorId?: string | undefined): Promise<IReference<INotebookEditorModel>> {
7172
const reference = this._data.acquire(resource.toString(), viewType, editorId);
7273
const model = await reference.object;
74+
NotebookModelResolverService._autoReferenceDirtyModel(model, () => this._data.acquire(resource.toString(), viewType, editorId));
7375
return {
7476
object: model,
7577
dispose() { reference.dispose(); }
7678
};
7779
}
78-
}
7980

80-
// notebookService.onDidAddDocument
81+
private static _autoReferenceDirtyModel(model: INotebookEditorModel, ref: () => IDisposable) {
8182

82-
// resolve()
83+
const references = new DisposableStore();
84+
const listener = model.notebook.onDidChangeDirty(() => {
85+
if (model.notebook.isDirty) {
86+
references.add(ref());
87+
} else {
88+
references.clear();
89+
}
90+
});
8391

84-
// notebookService.onDidRemoveDocument ...
92+
Event.once(model.notebook.onWillDispose)(() => {
93+
listener.dispose();
94+
references.dispose();
95+
});
96+
}
97+
}

0 commit comments

Comments
 (0)