From 03acd2250a78508913f877fd05b24bd0336e03b4 Mon Sep 17 00:00:00 2001 From: rebornix Date: Wed, 13 May 2020 12:47:39 -0700 Subject: [PATCH] Fix #96433 --- .../vscode-notebook-tests/src/notebook.test.ts | 13 +++++++++++++ .../vscode-notebook-tests/src/notebookTestMain.ts | 12 +++++++++--- src/vs/vscode.proposed.d.ts | 10 ++++++++++ src/vs/workbench/api/browser/mainThreadNotebook.ts | 7 +++++-- src/vs/workbench/api/common/extHost.protocol.ts | 2 ++ src/vs/workbench/api/common/extHostNotebook.ts | 14 ++++++++++++++ .../contrib/notebook/common/notebookCommon.ts | 6 ++++-- 7 files changed, 57 insertions(+), 7 deletions(-) diff --git a/extensions/vscode-notebook-tests/src/notebook.test.ts b/extensions/vscode-notebook-tests/src/notebook.test.ts index 25c2ea72daa..658500995f7 100644 --- a/extensions/vscode-notebook-tests/src/notebook.test.ts +++ b/extensions/vscode-notebook-tests/src/notebook.test.ts @@ -321,6 +321,19 @@ suite('notebook working copy', () => { }); }); +suite('metadata', () => { + test('custom metadata should be supported', async function () { + const resource = vscode.Uri.parse(join(vscode.workspace.rootPath || '', './first.vsctestnb')); + await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); + + await waitFor(500); + assert.equal(vscode.notebook.activeNotebookEditor !== undefined, true, 'notebook first'); + assert.equal(vscode.notebook.activeNotebookEditor!.document.metadata.custom['testMetadata'] as boolean, false); + assert.equal(vscode.notebook.activeNotebookEditor!.selection?.metadata.custom['testCellMetadata'] as boolean, true); + assert.equal(vscode.notebook.activeNotebookEditor!.selection?.language, 'typescript'); + }); +}); + suite('regression', () => { test('microsoft/vscode-github-issue-notebooks#26. Insert template cell in the new empty document', async function () { const resource = vscode.Uri.parse(join(vscode.workspace.rootPath || '', './empty.vsctestnb')); diff --git a/extensions/vscode-notebook-tests/src/notebookTestMain.ts b/extensions/vscode-notebook-tests/src/notebookTestMain.ts index 92abe38dfb7..e7320ffa8bf 100644 --- a/extensions/vscode-notebook-tests/src/notebookTestMain.ts +++ b/extensions/vscode-notebook-tests/src/notebookTestMain.ts @@ -17,19 +17,25 @@ export function activate(context: vscode.ExtensionContext): any { }; } - return { + const dto: vscode.NotebookData = { languages: ['typescript'], - metadata: {}, + metadata: { + custom: { testMetadata: false } + }, cells: [ { source: 'test', language: 'typescript', cellKind: vscode.CellKind.Code, outputs: [], - metadata: {} + metadata: { + custom: { testCellMetadata: true } + } } ] }; + + return dto; }, executeCell: async (_document: vscode.NotebookDocument, _cell: vscode.NotebookCell | undefined, _token: vscode.CancellationToken) => { if (!_cell) { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index e11b7113e44..cbd20cb0a48 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1590,6 +1590,11 @@ declare module 'vscode' { * The total duration of the cell's last run */ lastRunDuration?: number; + + /** + * Additional attributes of a cell metadata. + */ + [key: string]: any; } export interface NotebookCell { @@ -1635,6 +1640,11 @@ declare module 'vscode' { hasExecutionOrder?: boolean; displayOrder?: GlobPattern[]; + + /** + * Additional attributes of a cell metadata. + */ + [key: string]: any; } export interface NotebookDocument { diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index d4bdc4310f0..9313542a885 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -38,7 +38,7 @@ export class MainThreadNotebookDocument extends Disposable { })); this._register(this._textModel.onDidSelectionChange(e => { const selectionsChange = e ? { selections: e } : null; - this._proxy.$acceptEditorPropertiesChanged(uri, { selections: selectionsChange }); + this._proxy.$acceptEditorPropertiesChanged(uri, { selections: selectionsChange, metadata: null }); })); } @@ -250,6 +250,8 @@ export class MainThreadNotebookController implements IMainNotebookController { document.textModel.insertTemplateCell(mainCell); } + this._proxy.$acceptEditorPropertiesChanged(uri, { selections: null, metadata: document.textModel.metadata }); + return document.textModel; } @@ -285,7 +287,8 @@ export class MainThreadNotebookController implements IMainNotebookController { addedDocuments: [{ viewType: document.viewType, handle: document.handle, - uri: document.uri + uri: document.uri, + metadata: document.textModel.metadata }] }); } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 066b3cb24e5..99fec99d368 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1539,6 +1539,7 @@ export interface INotebookSelectionChangeEvent { export interface INotebookEditorPropertiesChangeData { selections: INotebookSelectionChangeEvent | null; + metadata: NotebookDocumentMetadata | null; } export interface INotebookModelAddedData { @@ -1546,6 +1547,7 @@ export interface INotebookModelAddedData { handle: number; // versionId: number; viewType: string; + metadata?: NotebookDocumentMetadata; } export interface INotebookDocumentsAndEditorsDelta { diff --git a/src/vs/workbench/api/common/extHostNotebook.ts b/src/vs/workbench/api/common/extHostNotebook.ts index f8b29fd0fa7..bd56fb03304 100644 --- a/src/vs/workbench/api/common/extHostNotebook.ts +++ b/src/vs/workbench/api/common/extHostNotebook.ts @@ -949,6 +949,13 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN editor.editor.selection = undefined; } } + + if (data.metadata) { + editor.editor.document.metadata = { + ...notebookDocumentMetadataDefaults, + ...data.metadata + }; + } } async $acceptDocumentAndEditorsDelta(delta: INotebookDocumentsAndEditorsDelta) { @@ -978,6 +985,13 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN const viewType = modelData.viewType; if (!this._documents.has(revivedUri.toString())) { let document = new ExtHostNotebookDocument(this._proxy, this._documentsAndEditors, viewType, revivedUri, this); + if (modelData.metadata) { + document.metadata = { + ...notebookDocumentMetadataDefaults, + ...modelData.metadata + }; + } + this._documents.set(revivedUri.toString(), document); } diff --git a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts index 178e0d8bb8e..b34622ebc48 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts @@ -55,7 +55,8 @@ export const notebookDocumentMetadataDefaults: Required