From ac9e97aaa5e3c7fee02b6364174bc0ab88c80284 Mon Sep 17 00:00:00 2001 From: rebornix Date: Fri, 19 Jun 2020 13:52:59 -0700 Subject: [PATCH] delay cells change from revert. --- .../src/notebook.test.ts | 2 +- .../api/browser/mainThreadNotebook.ts | 20 ++++++++++++++----- .../notebook/browser/view/notebookCellList.ts | 4 ++-- .../common/model/notebookTextModel.ts | 4 ++-- .../notebook/test/notebookTextModel.test.ts | 10 +++++----- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/extensions/vscode-notebook-tests/src/notebook.test.ts b/extensions/vscode-notebook-tests/src/notebook.test.ts index d0f4cfc2d50..47de754f27e 100644 --- a/extensions/vscode-notebook-tests/src/notebook.test.ts +++ b/extensions/vscode-notebook-tests/src/notebook.test.ts @@ -56,7 +56,7 @@ async function splitEditor() { await once; } -suite('API tests', () => { +suite('Notebook API tests', () => { test('document open/close event', async function () { const resource = vscode.Uri.file(join(vscode.workspace.rootPath || '', './first.vsctestnb')); const firstDocumentOpen = getEventOncePromise(vscode.notebook.onDidOpenNotebookDocument); diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index a100bcf462a..ac04045c4cb 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; +import * as DOM from 'vs/base/browser/dom'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { MainContext, MainThreadNotebookShape, NotebookExtensionDescription, IExtHostContext, ExtHostNotebookShape, ExtHostContext, INotebookDocumentsAndEditorsDelta, INotebookModelAddedData } from '../common/extHost.protocol'; import { Disposable, IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; @@ -51,9 +52,18 @@ export class MainThreadNotebookDocument extends Disposable { })); } - async applyEdit(modelVersionId: number, edits: ICellEditOperation[], emitToExtHost: boolean): Promise { + async applyEdit(modelVersionId: number, edits: ICellEditOperation[], emitToExtHost: boolean, synchronous: boolean): Promise { await this.notebookService.transformEditsOutputs(this.textModel, edits); - return this._textModel.$applyEdit(modelVersionId, edits); + if (synchronous) { + return this._textModel.$applyEdit(modelVersionId, edits, emitToExtHost, synchronous); + } else { + return new Promise(resolve => { + this._register(DOM.scheduleAtNextAnimationFrame(() => { + const ret = this._textModel.$applyEdit(modelVersionId, edits, emitToExtHost, true); + resolve(ret); + })); + }); + } } async spliceNotebookCellOutputs(cellHandle: number, splices: NotebookCellOutputsSplice[]) { @@ -533,7 +543,7 @@ export class MainThreadNotebookController implements IMainNotebookController { await mainthreadNotebook.applyEdit(mainthreadNotebook.textModel.versionId, [ { editType: CellEditType.Delete, count: mainthreadNotebook.textModel.cells.length, index: 0 }, { editType: CellEditType.Insert, index: 0, cells: data.cells } - ], true); + ], true, false); } return mainthreadNotebook.textModel; } @@ -553,7 +563,7 @@ export class MainThreadNotebookController implements IMainNotebookController { index: 0, cells: backup.cells || [] } - ], false); + ], false, true); // create document in ext host with cells data await this._mainThreadNotebook.addNotebookDocument({ @@ -630,7 +640,7 @@ export class MainThreadNotebookController implements IMainNotebookController { let mainthreadNotebook = this._mapping.get(URI.from(resource).toString()); if (mainthreadNotebook) { - return await mainthreadNotebook.applyEdit(modelVersionId, edits, true); + return await mainthreadNotebook.applyEdit(modelVersionId, edits, true, true); } return false; diff --git a/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts b/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts index 832dd971d2e..0b6fcb09e7e 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts @@ -207,7 +207,7 @@ export class NotebookCellList extends WorkbenchList implements ID deletedOutputs.forEach(output => this._onDidRemoveOutput.fire(output)); }); } else { - DOM.scheduleAtNextAnimationFrame(() => { + this._viewModelStore.add(DOM.scheduleAtNextAnimationFrame(() => { if (this._isDisposed) { return; } @@ -230,7 +230,7 @@ export class NotebookCellList extends WorkbenchList implements ID hideOutputs.forEach(output => this._onDidHideOutput.fire(output)); deletedOutputs.forEach(output => this._onDidRemoveOutput.fire(output)); }); - }); + })); } })); diff --git a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts index a8b7dee1243..f8716f2ee14 100644 --- a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts +++ b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts @@ -170,7 +170,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel this._increaseVersionId(); } - $applyEdit(modelVersionId: number, rawEdits: ICellEditOperation[], emitToExtHost: boolean): boolean { + $applyEdit(modelVersionId: number, rawEdits: ICellEditOperation[], emitToExtHost: boolean, synchronous: boolean): boolean { if (modelVersionId !== this._versionId) { return false; } @@ -259,7 +259,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel emitSelections: this._emitSelectionsDelegate.bind(this) }, undefined, undefined)); - this._onDidChangeCells.fire({ synchronous: true, splices: diffs }); + this._onDidChangeCells.fire({ synchronous: synchronous, splices: diffs }); return true; } diff --git a/src/vs/workbench/contrib/notebook/test/notebookTextModel.test.ts b/src/vs/workbench/contrib/notebook/test/notebookTextModel.test.ts index c4e5345e528..84f55c86331 100644 --- a/src/vs/workbench/contrib/notebook/test/notebookTextModel.test.ts +++ b/src/vs/workbench/contrib/notebook/test/notebookTextModel.test.ts @@ -31,7 +31,7 @@ suite('NotebookTextModel', () => { textModel.$applyEdit(textModel.versionId, [ { editType: CellEditType.Insert, index: 1, cells: [new TestCell(viewModel.viewType, 5, ['var e = 5;'], 'javascript', CellKind.Code, [])] }, { editType: CellEditType.Insert, index: 3, cells: [new TestCell(viewModel.viewType, 6, ['var f = 6;'], 'javascript', CellKind.Code, [])] }, - ], true); + ], true, true); assert.equal(textModel.cells.length, 6); @@ -56,7 +56,7 @@ suite('NotebookTextModel', () => { textModel.$applyEdit(textModel.versionId, [ { editType: CellEditType.Insert, index: 1, cells: [new TestCell(viewModel.viewType, 5, ['var e = 5;'], 'javascript', CellKind.Code, [])] }, { editType: CellEditType.Insert, index: 1, cells: [new TestCell(viewModel.viewType, 6, ['var f = 6;'], 'javascript', CellKind.Code, [])] }, - ], true); + ], true, true); assert.equal(textModel.cells.length, 6); @@ -81,7 +81,7 @@ suite('NotebookTextModel', () => { textModel.$applyEdit(textModel.versionId, [ { editType: CellEditType.Delete, index: 1, count: 1 }, { editType: CellEditType.Delete, index: 3, count: 1 }, - ], true); + ], true, true); assert.equal(textModel.cells[0].getValue(), 'var a = 1;'); assert.equal(textModel.cells[1].getValue(), 'var c = 3;'); @@ -104,7 +104,7 @@ suite('NotebookTextModel', () => { textModel.$applyEdit(textModel.versionId, [ { editType: CellEditType.Delete, index: 1, count: 1 }, { editType: CellEditType.Insert, index: 3, cells: [new TestCell(viewModel.viewType, 5, ['var e = 5;'], 'javascript', CellKind.Code, [])] }, - ], true); + ], true, true); assert.equal(textModel.cells.length, 4); @@ -129,7 +129,7 @@ suite('NotebookTextModel', () => { textModel.$applyEdit(textModel.versionId, [ { editType: CellEditType.Delete, index: 1, count: 1 }, { editType: CellEditType.Insert, index: 1, cells: [new TestCell(viewModel.viewType, 5, ['var e = 5;'], 'javascript', CellKind.Code, [])] }, - ], true); + ], true, true); assert.equal(textModel.cells.length, 4); assert.equal(textModel.cells[0].getValue(), 'var a = 1;');