diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index 7d22de8bc10..00b9d20b32f 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -458,27 +458,12 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo }); }); }, - createNotebook: async (textModel: NotebookTextModel, backupId?: string) => { - // open notebook document - const data = await this._proxy.$resolveNotebookData(textModel.viewType, textModel.uri, backupId); - textModel.updateLanguages(data.languages); - textModel.metadata = data.metadata; - textModel.transientOptions = options; - - if (data.cells.length) { - textModel.initialize(data!.cells); - } else if (textModel.uri.scheme === Schemas.untitled) { - textModel.initialize([{ - cellKind: CellKind.Code, - language: textModel.resolvedLanguages.length ? textModel.resolvedLanguages[0] : '', - outputs: [], - metadata: undefined, - source: '' - }]); - } - - this._proxy.$acceptDocumentPropertiesChanged(textModel.uri, { metadata: textModel.metadata }); - return; + resolveNotebookDocument: async (viewType: string, uri: URI, backupId?: string) => { + const data = await this._proxy.$resolveNotebookData(viewType, uri, backupId); + return { + data, + transientOptions: options + }; }, resolveNotebookEditor: async (viewType: string, uri: URI, editorId: string) => { await this._proxy.$resolveNotebookEditor(viewType, uri, editorId); diff --git a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts index d05617cf39a..92da7336506 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts @@ -9,6 +9,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Iterable } from 'vs/base/common/iterator'; import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { ResourceMap } from 'vs/base/common/map'; +import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; import { RedoCommand, UndoCommand } from 'vs/editor/browser/editorExtensions'; import { CopyAction, CutAction, PasteAction } from 'vs/editor/contrib/clipboard/clipboard'; @@ -26,7 +27,7 @@ import { NotebookKernelProviderAssociationRegistry, NotebookViewTypesExtensionRe import { CellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; -import { ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, BUILTIN_RENDERER_ID, CellEditType, CellOutputKind, CellUri, DisplayOrderKey, ICellEditOperation, IDisplayOutput, INotebookKernelInfo2, INotebookKernelProvider, INotebookRendererInfo, INotebookTextModel, IOrderedMimeType, ITransformedDisplayOutputDto, mimeTypeSupportedByCore, NotebookCellOutputsSplice, notebookDocumentFilterMatch, NotebookEditorPriority, NOTEBOOK_DISPLAY_ORDER, sortMimeTypes } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, BUILTIN_RENDERER_ID, CellEditType, CellKind, CellOutputKind, CellUri, DisplayOrderKey, ICellEditOperation, IDisplayOutput, INotebookKernelInfo2, INotebookKernelProvider, INotebookRendererInfo, INotebookTextModel, IOrderedMimeType, ITransformedDisplayOutputDto, mimeTypeSupportedByCore, NotebookCellOutputsSplice, notebookDocumentFilterMatch, NotebookEditorPriority, NOTEBOOK_DISPLAY_ORDER, sortMimeTypes } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookOutputRendererInfo } from 'vs/workbench/contrib/notebook/common/notebookOutputRenderer'; import { NotebookEditorDescriptor, NotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookProvider'; import { IMainNotebookController, INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; @@ -622,8 +623,16 @@ export class NotebookService extends Disposable implements INotebookService, ICu return notebookModel; } else { - notebookModel = this._instantiationService.createInstance(NotebookTextModel, viewType, provider.controller.supportBackup, uri); - await provider.controller.createNotebook(notebookModel, backupId); + const dataDto = await provider.controller.resolveNotebookDocument(viewType, uri, backupId); + let cells = dataDto.data.cells.length ? dataDto.data.cells : (uri.scheme === Schemas.untitled ? [{ + cellKind: CellKind.Code, + language: dataDto.data.languages.length ? dataDto.data.languages[0] : '', + outputs: [], + metadata: undefined, + source: '' + }] : []); + + notebookModel = this._instantiationService.createInstance(NotebookTextModel, viewType, provider.controller.supportBackup, uri, cells, dataDto.data.languages, dataDto.data.metadata, dataDto.transientOptions); } // new notebook model created diff --git a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts index f8018095526..6d9d8078e6e 100644 --- a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts +++ b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts @@ -153,16 +153,31 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel private _operationManager: NotebookOperationManager; private _eventEmitter: DelayedEmitter; + get cells(): readonly NotebookCellTextModel[] { + return this._cells; + } + + get versionId() { + return this._versionId; + } + constructor( readonly viewType: string, readonly supportBackup: boolean, readonly uri: URI, + cells: ICellDto2[], + languages: string[], + metadata: NotebookDocumentMetadata, + options: TransientOptions, @IUndoRedoService private _undoService: IUndoRedoService, @ITextModelService private _modelService: ITextModelService, @IModeService private readonly _modeService: IModeService, ) { super(); - this._cells = []; + this.transientOptions = options; + this.metadata = metadata; + this.updateLanguages(languages); + this._initialize(cells); this._operationManager = new NotebookOperationManager(this._undoService, uri); this._eventEmitter = new DelayedEmitter( @@ -172,34 +187,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel ); } - dispose() { - this._onWillDispose.fire(); - dispose(this._cellListeners.values()); - dispose(this._cells); - super.dispose(); - } - - get cells(): readonly NotebookCellTextModel[] { - return this._cells; - } - - get versionId() { - return this._versionId; - } - - createCellTextModel( - source: string, - language: string, - cellKind: CellKind, - outputs: IProcessedOutput[], - metadata: NotebookCellMetadata | undefined - ) { - const cellHandle = this._cellhandlePool++; - const cellUri = CellUri.generate(this.uri, cellHandle); - return new NotebookCellTextModel(cellUri, cellHandle, source, language, cellKind, outputs || [], metadata || {}, this.transientOptions, this._modelService); - } - - initialize(cells: ICellDto2[]) { + private _initialize(cells: ICellDto2[]) { this._cells = []; this._versionId = 0; @@ -222,6 +210,25 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel this._increaseVersionId(); } + + dispose() { + this._onWillDispose.fire(); + dispose(this._cellListeners.values()); + dispose(this._cells); + super.dispose(); + } + createCellTextModel( + source: string, + language: string, + cellKind: CellKind, + outputs: IProcessedOutput[], + metadata: NotebookCellMetadata | undefined + ) { + const cellHandle = this._cellhandlePool++; + const cellUri = CellUri.generate(this.uri, cellHandle); + return new NotebookCellTextModel(cellUri, cellHandle, source, language, cellKind, outputs || [], metadata || {}, this.transientOptions, this._modelService); + } + pushStackElement(label: string) { this._operationManager.pushStackElement(label); } diff --git a/src/vs/workbench/contrib/notebook/common/notebookService.ts b/src/vs/workbench/contrib/notebook/common/notebookService.ts index 9b1704f0135..50de255b4e6 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookService.ts @@ -10,7 +10,7 @@ import { NotebookExtensionDescription } from 'vs/workbench/api/common/extHost.pr import { Event } from 'vs/base/common/event'; import { INotebookTextModel, INotebookRendererInfo, - IEditor, ICellEditOperation, NotebookCellOutputsSplice, INotebookKernelProvider, INotebookKernelInfo2, TransientMetadata + IEditor, ICellEditOperation, NotebookCellOutputsSplice, INotebookKernelProvider, INotebookKernelInfo2, TransientMetadata, NotebookDataDto, TransientOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -24,7 +24,7 @@ export const INotebookService = createDecorator('notebookServi export interface IMainNotebookController { supportBackup: boolean; options: { transientOutputs: boolean; transientMetadata: TransientMetadata; }; - createNotebook(textModel: NotebookTextModel, editorId?: string, backupId?: string): Promise; + resolveNotebookDocument(viewType: string, uri: URI, backupId?: string): Promise<{ data: NotebookDataDto, transientOptions: TransientOptions }>; reloadNotebook(mainthreadTextModel: NotebookTextModel): Promise; resolveNotebookEditor(viewType: string, uri: URI, editorId: string): Promise; onDidReceiveMessage(editorId: string, rendererType: string | undefined, message: any): void; diff --git a/src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts b/src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts index 31eab292f31..d2386aab84c 100644 --- a/src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts +++ b/src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts @@ -18,7 +18,7 @@ import { NotebookEventDispatcher } from 'vs/workbench/contrib/notebook/browser/v import { CellViewModel, IModelDecorationsChangeAccessor, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; -import { CellKind, CellUri, INotebookEditorModel, IProcessedOutput, NotebookCellMetadata, IInsetRenderOutput, ICellRange, INotebookKernelInfo2 } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellKind, CellUri, INotebookEditorModel, IProcessedOutput, NotebookCellMetadata, IInsetRenderOutput, ICellRange, INotebookKernelInfo2, notebookDocumentMetadataDefaults } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { Webview } from 'vs/workbench/contrib/webview/browser/webview'; import { ICompositeCodeEditor, IEditor } from 'vs/editor/common/editorCommon'; import { NotImplementedError } from 'vs/base/common/errors'; @@ -397,8 +397,7 @@ export function withTestNotebook(instantiationService: TestInstantiationService, const viewType = 'notebook'; const editor = new TestNotebookEditor(); - const notebook = new NotebookTextModel(viewType, false, URI.parse('test'), undoRedoService, textModelService, modeService); - notebook.initialize(cells.map(cell => { + const notebook = new NotebookTextModel(viewType, false, URI.parse('test'), cells.map(cell => { return { source: cell[0], language: cell[1], @@ -406,7 +405,7 @@ export function withTestNotebook(instantiationService: TestInstantiationService, outputs: cell[3], metadata: cell[4] }; - })); + }), [], notebookDocumentMetadataDefaults, { transientMetadata: {}, transientOutputs: false }, undoRedoService, textModelService, modeService); const model = new NotebookEditorTestModel(notebook); const eventDispatcher = new NotebookEventDispatcher(); const viewModel = new NotebookViewModel(viewType, model.notebook, eventDispatcher, null, instantiationService, blukEditService, undoRedoService);