diff --git a/src/vs/workbench/api/common/extHostNotebook.ts b/src/vs/workbench/api/common/extHostNotebook.ts index 510a24cf4a3..e7956730308 100644 --- a/src/vs/workbench/api/common/extHostNotebook.ts +++ b/src/vs/workbench/api/common/extHostNotebook.ts @@ -358,11 +358,19 @@ export class ExtHostNotebookController implements ExtHostNotebookShape { if (!serializer) { throw new Error('NO serializer found'); } + const data = await serializer.deserializeNotebook(bytes.buffer, token); - return { + const res: NotebookDataDto = { metadata: typeConverters.NotebookDocumentMetadata.from(data.metadata), - cells: data.cells.map(typeConverters.NotebookCellData.from), + cells: [], }; + + for (let cell of data.cells) { + extHostTypes.NotebookCellData.validate(cell); + res.cells.push(typeConverters.NotebookCellData.from(cell)); + } + + return res; } async $notebookToData(handle: number, data: NotebookDataDto, token: CancellationToken): Promise { diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index e2105622baa..d6464b14833 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -3023,6 +3023,18 @@ export class NotebookDocumentMetadata { export class NotebookCellData { + static validate(data: NotebookCellData): void { + if (typeof data.kind !== 'number') { + throw new Error('NotebookCellData MUST have \'kind\' property'); + } + if (typeof data.value !== 'string') { + throw new Error('NotebookCellData MUST have \'value\' property'); + } + if (typeof data.languageId !== 'string') { + throw new Error('NotebookCellData MUST have \'languageId\' property'); + } + } + static isNotebookCellDataArray(value: unknown): value is vscode.NotebookCellData[] { return Array.isArray(value) && (value).every(elem => NotebookCellData.isNotebookCellData(elem)); } @@ -3046,6 +3058,8 @@ export class NotebookCellData { this.outputs = outputs ?? []; this.metadata = metadata; this.latestExecutionSummary = latestExecutionSummary; + + NotebookCellData.validate(this); } }