diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index aafcbfb00d8..2aa798bfdeb 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -274,6 +274,7 @@ export class MainThreadNotebookController implements IMainNotebookController { } async resolveNotebook(viewType: string, uri: URI): Promise { + // TODO: resolve notebook should wait for all notebook document destory operations to finish. let mainthreadNotebook = this._mapping.get(URI.from(uri).toString()); if (mainthreadNotebook) { @@ -367,12 +368,15 @@ export class MainThreadNotebookController implements IMainNotebookController { } } - destoryNotebookDocument(notebook: INotebook): void { + async destoryNotebookDocument(notebook: INotebook): Promise { let mainthreadNotebook = this._mapping.get(URI.from(notebook.uri).toString()); if (mainthreadNotebook) { - mainthreadNotebook.dispose(); - this._mapping.delete(URI.from(notebook.uri).toString()); + let removeFromExtHost = await this._proxy.$destoryNotebookDocument(this._viewType, notebook.uri); + if (removeFromExtHost) { + mainthreadNotebook.dispose(); + this._mapping.delete(URI.from(notebook.uri).toString()); + } } } } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 05d2c1ed894..58eb3cb6ad3 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1414,6 +1414,7 @@ export interface ExtHostNotebookShape { $deleteCell(viewType: string, uri: URI, index: number): Promise; $saveNotebook(viewType: string, uri: URI): Promise; $updateActiveEditor(viewType: string, uri: URI): Promise; + $destoryNotebookDocument(viewType: string, uri: URI): Promise; } export interface ExtHostStorageShape { diff --git a/src/vs/workbench/api/common/extHostNotebook.ts b/src/vs/workbench/api/common/extHostNotebook.ts index 3b8f8a62562..b40e8dad848 100644 --- a/src/vs/workbench/api/common/extHostNotebook.ts +++ b/src/vs/workbench/api/common/extHostNotebook.ts @@ -413,4 +413,26 @@ export class ExtHostNotebookController implements ExtHostNotebookShape { } } + async $destoryNotebookDocument(viewType: string, uri: URI): Promise { + let provider = this._notebookProviders.get(viewType); + + if (provider) { + let document = this._documents.get(URI.revive(uri).toString()); + + if (document) { + this._documents.delete(URI.revive(uri).toString()); + } + + let editor = this._editors.get(URI.revive(uri).toString()); + + if (editor) { + this._editors.delete(URI.revive(uri).toString()); + } + + return true; + } + + return false; + } + } diff --git a/src/vs/workbench/contrib/notebook/browser/notebookService.ts b/src/vs/workbench/contrib/notebook/browser/notebookService.ts index b5d0c07122d..76465035b13 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookService.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookService.ts @@ -26,7 +26,7 @@ export interface IMainNotebookController { createRawCell(uri: URI, index: number, language: string, type: 'markdown' | 'code'): Promise; deleteCell(uri: URI, index: number): Promise executeNotebookActiveCell(uri: URI): void; - destoryNotebookDocument(notebook: INotebook): void; + destoryNotebookDocument(notebook: INotebook): Promise; } export interface INotebookService {