Skip to content

Commit adae0e5

Browse files
committed
Fix microsoft#98841. Open file should only emit document open event, no cells change event.
1 parent 8e45a2f commit adae0e5

5 files changed

Lines changed: 58 additions & 26 deletions

File tree

extensions/vscode-notebook-tests/src/notebook.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,23 @@ suite('API tests', () => {
278278
await vscode.commands.executeCommand('workbench.action.files.save');
279279
await vscode.commands.executeCommand('workbench.action.closeActiveEditor');
280280
});
281+
282+
test('initialzation should not emit cell change events.', async function () {
283+
const resource = vscode.Uri.file(join(vscode.workspace.rootPath || '', './first.vsctestnb'));
284+
285+
let count = 0;
286+
const disposables: vscode.Disposable[] = [];
287+
disposables.push(vscode.notebook.onDidChangeNotebookCells(() => {
288+
count++;
289+
}));
290+
291+
await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest');
292+
assert.equal(count, 0);
293+
294+
disposables.forEach(d => d.dispose());
295+
await vscode.commands.executeCommand('workbench.action.files.save');
296+
await vscode.commands.executeCommand('workbench.action.closeActiveEditor');
297+
});
281298
});
282299

283300
suite('notebook workflow', () => {

src/vs/workbench/api/browser/mainThreadNotebook.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,14 +476,16 @@ export class MainThreadNotebookController implements IMainNotebookController {
476476
document.textModel.metadata = backup.metadata;
477477
document.textModel.languages = backup.languages;
478478

479+
// restored from backup, update the text model without emitting any event to exthost
479480
document.textModel.$applyEdit(document.textModel.versionId, [
480481
{
481482
editType: CellEditType.Insert,
482483
index: 0,
483484
cells: backup.cells || []
484485
}
485-
]);
486+
], false);
486487

488+
// create document in ext host with cells data
487489
await this._mainThreadNotebook.addNotebookDocument({
488490
viewType: document.viewType,
489491
handle: document.handle,

src/vs/workbench/api/common/extHostNotebook.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -263,8 +263,10 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo
263263

264264
accpetModelChanged(event: NotebookCellsChangedEvent): void {
265265
this._versionId = event.versionId;
266-
if (event.kind === NotebookCellsChangeType.ModelChange) {
267-
this.$spliceNotebookCells(event.changes);
266+
if (event.kind === NotebookCellsChangeType.Initialize) {
267+
this.$spliceNotebookCells(event.changes, true);
268+
} if (event.kind === NotebookCellsChangeType.ModelChange) {
269+
this.$spliceNotebookCells(event.changes, false);
268270
} else if (event.kind === NotebookCellsChangeType.Move) {
269271
this.$moveCell(event.index, event.newIdx);
270272
} else if (event.kind === NotebookCellsChangeType.CellClearOutput) {
@@ -276,7 +278,7 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo
276278
}
277279
}
278280

279-
private $spliceNotebookCells(splices: NotebookCellsSplice2[]): void {
281+
private $spliceNotebookCells(splices: NotebookCellsSplice2[], initialization: boolean): void {
280282
if (this._disposed) {
281283
return;
282284
}
@@ -323,10 +325,12 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo
323325
contentChangeEvents.push(event);
324326
});
325327

326-
this._emitter.emitModelChange({
327-
document: this,
328-
changes: contentChangeEvents
329-
});
328+
if (!initialization) {
329+
this._emitter.emitModelChange({
330+
document: this,
331+
changes: contentChangeEvents
332+
});
333+
}
330334
}
331335

332336
private $moveCell(index: number, newIdx: number): void {
@@ -1105,7 +1109,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
11051109
}
11061110

11071111
document.accpetModelChanged({
1108-
kind: NotebookCellsChangeType.ModelChange,
1112+
kind: NotebookCellsChangeType.Initialize,
11091113
versionId: modelData.versionId,
11101114
changes: [[
11111115
0,

src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,10 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
134134
const cellUri = CellUri.generate(this.uri, cellHandle);
135135
return new NotebookCellTextModel(cellUri, cellHandle, cell.source, cell.language, cell.cellKind, cell.outputs || [], cell.metadata);
136136
});
137-
this.insertNewCell(0, mainCells);
137+
this.insertNewCell(0, mainCells, false);
138138
}
139139

140-
$applyEdit(modelVersionId: number, rawEdits: ICellEditOperation[]): boolean {
140+
$applyEdit(modelVersionId: number, rawEdits: ICellEditOperation[], emitToExtHost: boolean = true): boolean {
141141
if (modelVersionId !== this._versionId) {
142142
return false;
143143
}
@@ -198,19 +198,21 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
198198
return [diff.start, diff.deleteCount, diff.toInsert] as [number, number, NotebookCellTextModel[]];
199199
});
200200

201-
this._onDidModelChangeProxy.fire({
202-
kind: NotebookCellsChangeType.ModelChange,
203-
versionId: this._versionId,
204-
changes: diffs.map(diff => [diff[0], diff[1], diff[2].map(cell => ({
205-
handle: cell.handle,
206-
uri: cell.uri,
207-
source: cell.textBuffer.getLinesContent(),
208-
language: cell.language,
209-
cellKind: cell.cellKind,
210-
outputs: cell.outputs,
211-
metadata: cell.metadata
212-
}))] as [number, number, IMainCellDto[]])
213-
});
201+
if (emitToExtHost) {
202+
this._onDidModelChangeProxy.fire({
203+
kind: NotebookCellsChangeType.ModelChange,
204+
versionId: this._versionId,
205+
changes: diffs.map(diff => [diff[0], diff[1], diff[2].map(cell => ({
206+
handle: cell.handle,
207+
uri: cell.uri,
208+
source: cell.textBuffer.getLinesContent(),
209+
language: cell.language,
210+
cellKind: cell.cellKind,
211+
outputs: cell.outputs,
212+
metadata: cell.metadata
213+
}))] as [number, number, IMainCellDto[]])
214+
});
215+
}
214216

215217
this._onDidChangeCells.fire(diffs);
216218
return true;

src/vs/workbench/contrib/notebook/common/notebookCommon.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,14 @@ export enum NotebookCellsChangeType {
300300
Move = 2,
301301
CellClearOutput = 3,
302302
CellsClearOutput = 4,
303-
ChangeLanguage = 5
303+
ChangeLanguage = 5,
304+
Initialize = 6
305+
}
306+
307+
export interface NotebookCellsInitializeEvent {
308+
readonly kind: NotebookCellsChangeType.Initialize;
309+
readonly changes: NotebookCellsSplice2[];
310+
readonly versionId: number;
304311
}
305312

306313
export interface NotebookCellsModelChangedEvent {
@@ -334,7 +341,7 @@ export interface NotebookCellsChangeLanguageEvent {
334341
readonly language: string;
335342
}
336343

337-
export type NotebookCellsChangedEvent = NotebookCellsModelChangedEvent | NotebookCellsModelMoveEvent | NotebookCellClearOutputEvent | NotebookCellsClearOutputEvent | NotebookCellsChangeLanguageEvent;
344+
export type NotebookCellsChangedEvent = NotebookCellsInitializeEvent | NotebookCellsModelChangedEvent | NotebookCellsModelMoveEvent | NotebookCellClearOutputEvent | NotebookCellsClearOutputEvent | NotebookCellsChangeLanguageEvent;
338345
export enum CellEditType {
339346
Insert = 1,
340347
Delete = 2

0 commit comments

Comments
 (0)