diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index a2aac4fd668..ea6205a7970 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -9,7 +9,7 @@ import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { INotebookService, IMainNotebookController } from 'vs/workbench/contrib/notebook/browser/notebookService'; import { Emitter, Event } from 'vs/base/common/event'; -import { ICell, IOutput, INotebook, INotebookMimeTypeSelector, NOTEBOOK_DISPLAY_ORDER, NotebookCellsSplice, NotebookCellOutputsSplice } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { ICell, IOutput, INotebook, INotebookMimeTypeSelector, NOTEBOOK_DISPLAY_ORDER, NotebookCellsSplice, NotebookCellOutputsSplice, generateCellPath } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; export class MainThreadCell implements ICell { @@ -50,7 +50,7 @@ export class MainThreadCell implements ICell { this.uri = URI.from({ scheme: 'vscode-notebook', authority: parent.viewType, - path: `/cell_${handle}.${cell_type === 'markdown' ? 'md' : 'py'}`, + path: generateCellPath(cell_type, handle), query: parent.uri.toString() }); } diff --git a/src/vs/workbench/api/common/extHostNotebook.ts b/src/vs/workbench/api/common/extHostNotebook.ts index f8a363d5683..aef4c723839 100644 --- a/src/vs/workbench/api/common/extHostNotebook.ts +++ b/src/vs/workbench/api/common/extHostNotebook.ts @@ -151,7 +151,7 @@ export class ExtHostCell implements vscode.NotebookCell { } -export class ExtHostNotebookDocument implements vscode.NotebookDocument { +export class ExtHostNotebookDocument implements vscode.NotebookDocument, vscode.Disposable { private static _handlePool: number = 0; readonly handle = ExtHostNotebookDocument._handlePool++; @@ -221,6 +221,9 @@ export class ExtHostNotebookDocument implements vscode.NotebookDocument { ) { } + dispose() { + this._cellDisposableMapping.forEach(cell => cell.dispose()); + } get fileName() { return this.uri.fsPath; } @@ -425,8 +428,9 @@ export class ExtHostNotebookDocument implements vscode.NotebookDocument { } } -export class ExtHostNotebookEditor implements vscode.NotebookEditor { +export class ExtHostNotebookEditor implements vscode.NotebookEditor, vscode.Disposable { private _viewColumn: vscode.ViewColumn | undefined; + private _disposableStore = new DisposableStore(); constructor( viewType: string, @@ -435,7 +439,7 @@ export class ExtHostNotebookEditor implements vscode.NotebookEditor { public document: ExtHostNotebookDocument, private _documentsAndEditors: ExtHostDocumentsAndEditors ) { - this._documentsAndEditors.onDidAddDocuments(documents => { + this._disposableStore.add(this._documentsAndEditors.onDidAddDocuments(documents => { for (const data of documents) { let textDocument = data.document; let parsedCellUri = parseCellUri(textDocument.uri); @@ -455,9 +459,9 @@ export class ExtHostNotebookEditor implements vscode.NotebookEditor { } } } - }); + })); - this._documentsAndEditors.onDidRemoveDocuments(documents => { + this._disposableStore.add(this._documentsAndEditors.onDidRemoveDocuments(documents => { for (const data of documents) { let textDocument = data.document; let parsedCellUri = parseCellUri(textDocument.uri); @@ -477,7 +481,11 @@ export class ExtHostNotebookEditor implements vscode.NotebookEditor { } } } - }); + })); + } + + dispose() { + this._disposableStore.dispose(); } createCell(content: string, language: string, type: 'markdown' | 'code', outputs: vscode.CellOutput[]): vscode.NotebookCell { @@ -739,12 +747,14 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN let document = this._documents.get(URI.revive(uri).toString()); if (document) { + document.dispose(); this._documents.delete(URI.revive(uri).toString()); } let editor = this._editors.get(URI.revive(uri).toString()); if (editor) { + editor.dispose(); this._editors.delete(URI.revive(uri).toString()); } diff --git a/src/vs/workbench/contrib/notebook/browser/renderers/cellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/renderers/cellViewModel.ts index b8f708b97da..2e56f77d475 100644 --- a/src/vs/workbench/contrib/notebook/browser/renderers/cellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/renderers/cellViewModel.ts @@ -126,7 +126,7 @@ export class CellViewModel extends Disposable { this._html = null; } save() { - if (this._textModel && (this.cell.isDirty || this.isEditing)) { + if (this._textModel && !this._textModel.isDisposed() && (this.cell.isDirty || this.isEditing)) { let cnt = this._textModel.getLineCount(); this.cell.source = this._textModel.getLinesContent().map((str, index) => str + (index !== cnt - 1 ? '\n' : '')); }