Skip to content

Commit 2514759

Browse files
authored
Remove notebook content provider save and backup functionality (microsoft#160581)
For microsoft#147248 When stepping through the liveshare code, we figured out they do not appear to be using `save`, `saveAs`, or `backup` (they return empty results for these) This PR removes this part of the proposal so we can track just the parts of the api that they are using
1 parent 8717b43 commit 2514759

File tree

16 files changed

+14
-242
lines changed

16 files changed

+14
-242
lines changed

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

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -115,18 +115,6 @@ const apiTestContentProvider: vscode.NotebookContentProvider = {
115115
};
116116
return dto;
117117
},
118-
saveNotebook: async (_document: vscode.NotebookDocument, _cancellation: vscode.CancellationToken) => {
119-
return;
120-
},
121-
saveNotebookAs: async (_targetResource: vscode.Uri, _document: vscode.NotebookDocument, _cancellation: vscode.CancellationToken) => {
122-
return;
123-
},
124-
backupNotebook: async (_document: vscode.NotebookDocument, _context: vscode.NotebookDocumentBackupContext, _cancellation: vscode.CancellationToken) => {
125-
return {
126-
id: '1',
127-
delete: () => { }
128-
};
129-
}
130118
};
131119

132120
(vscode.env.uiKind === vscode.UIKind.Web ? suite.skip : suite)('Notebook API tests', function () {
@@ -244,7 +232,8 @@ const apiTestContentProvider: vscode.NotebookContentProvider = {
244232
await closeAllEditors();
245233
});
246234

247-
test('#115855 onDidSaveNotebookDocument', async function () {
235+
// TODO: Skipped due to notebook content provider removal
236+
test.skip('#115855 onDidSaveNotebookDocument', async function () {
248237
const resource = await createRandomNotebookFile();
249238
const notebook = await vscode.workspace.openNotebookDocument(resource);
250239

extensions/vscode-api-tests/src/singlefolder-tests/notebook.document.test.ts

Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,6 @@ suite('Notebook Document', function () {
2626
[new vscode.NotebookCellData(vscode.NotebookCellKind.Code, uri.toString(), 'javascript')],
2727
);
2828
}
29-
async saveNotebook(_document: vscode.NotebookDocument, _cancellation: vscode.CancellationToken) {
30-
//
31-
}
32-
async saveNotebookAs(_targetResource: vscode.Uri, _document: vscode.NotebookDocument, _cancellation: vscode.CancellationToken) {
33-
//
34-
}
35-
async backupNotebook(_document: vscode.NotebookDocument, _context: vscode.NotebookDocumentBackupContext, _cancellation: vscode.CancellationToken) {
36-
return { id: '', delete() { } };
37-
}
3829
};
3930

4031
const disposables: vscode.Disposable[] = [];
@@ -329,40 +320,6 @@ suite('Notebook Document', function () {
329320
assert.ok(document.metadata.custom.extraNotebookMetadata, `Test metadata not found`);
330321
});
331322

332-
test('document save API', async function () {
333-
const uri = await utils.createRandomFile(undefined, undefined, '.nbdtest');
334-
const notebook = await vscode.workspace.openNotebookDocument(uri);
335-
336-
assert.strictEqual(notebook.uri.toString(), uri.toString());
337-
assert.strictEqual(notebook.isDirty, false);
338-
assert.strictEqual(notebook.isUntitled, false);
339-
assert.strictEqual(notebook.cellCount, 1);
340-
assert.strictEqual(notebook.notebookType, 'notebook.nbdtest');
341-
342-
const edit = new vscode.WorkspaceEdit();
343-
edit.set(notebook.uri, [vscode.NotebookEdit.replaceCells(new vscode.NotebookRange(0, 0), [{
344-
kind: vscode.NotebookCellKind.Markup,
345-
languageId: 'markdown',
346-
metadata: undefined,
347-
outputs: [],
348-
value: 'new_markdown'
349-
}, {
350-
kind: vscode.NotebookCellKind.Code,
351-
languageId: 'fooLang',
352-
metadata: undefined,
353-
outputs: [],
354-
value: 'new_code'
355-
}])]);
356-
357-
const success = await vscode.workspace.applyEdit(edit);
358-
assert.strictEqual(success, true);
359-
assert.strictEqual(notebook.isDirty, true);
360-
361-
await notebook.save();
362-
assert.strictEqual(notebook.isDirty, false);
363-
});
364-
365-
366323
test('setTextDocumentLanguage for notebook cells', async function () {
367324

368325
const uri = await utils.createRandomFile(undefined, undefined, '.nbdtest');
@@ -395,21 +352,6 @@ suite('Notebook Document', function () {
395352
assert.strictEqual(cellDoc.languageId, 'css');
396353
});
397354

398-
test('dirty state - complex', async function () {
399-
const resource = await utils.createRandomFile(undefined, undefined, '.nbdtest');
400-
const document = await vscode.workspace.openNotebookDocument(resource);
401-
assert.strictEqual(document.isDirty, false);
402-
403-
const edit = new vscode.WorkspaceEdit();
404-
edit.set(document.uri, [vscode.NotebookEdit.replaceCells(new vscode.NotebookRange(0, document.cellCount), [])]);
405-
assert.ok(await vscode.workspace.applyEdit(edit));
406-
407-
assert.strictEqual(document.isDirty, true);
408-
409-
await document.save();
410-
assert.strictEqual(document.isDirty, false);
411-
});
412-
413355
test('dirty state - serializer', async function () {
414356
const resource = await utils.createRandomFile(undefined, undefined, '.nbdserializer');
415357
const document = await vscode.workspace.openNotebookDocument(resource);

extensions/vscode-api-tests/src/singlefolder-tests/notebook.kernel.test.ts

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -124,18 +124,6 @@ const apiTestContentProvider: vscode.NotebookContentProvider = {
124124
]
125125
};
126126
return dto;
127-
},
128-
saveNotebook: async (_document: vscode.NotebookDocument, _cancellation: vscode.CancellationToken) => {
129-
return;
130-
},
131-
saveNotebookAs: async (_targetResource: vscode.Uri, _document: vscode.NotebookDocument, _cancellation: vscode.CancellationToken) => {
132-
return;
133-
},
134-
backupNotebook: async (_document: vscode.NotebookDocument, _context: vscode.NotebookDocumentBackupContext, _cancellation: vscode.CancellationToken) => {
135-
return {
136-
id: '1',
137-
delete: () => { }
138-
};
139127
}
140128
};
141129

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

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,6 @@ export function activate(context: vscode.ExtensionContext): any {
4343
};
4444

4545
return dto;
46-
},
47-
saveNotebook: async (_document: vscode.NotebookDocument, _cancellation: vscode.CancellationToken) => {
48-
return;
49-
},
50-
saveNotebookAs: async (_targetResource: vscode.Uri, _document: vscode.NotebookDocument, _cancellation: vscode.CancellationToken) => {
51-
return;
52-
},
53-
backupNotebook: async (_document: vscode.NotebookDocument, _context: vscode.NotebookDocumentBackupContext, _cancellation: vscode.CancellationToken) => {
54-
return {
55-
id: '1',
56-
delete: () => { }
57-
};
5846
}
5947
}));
6048

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

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { URI } from 'vs/base/common/uri';
1111
import { NotebookDto } from 'vs/workbench/api/browser/mainThreadNotebookDto';
1212
import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers';
1313
import { INotebookCellStatusBarService } from 'vs/workbench/contrib/notebook/common/notebookCellStatusBarService';
14-
import { INotebookCellStatusBarItemProvider, INotebookContributionData, NotebookData as NotebookData, NotebookExtensionDescription, TransientCellMetadata, TransientDocumentMetadata, TransientOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon';
14+
import { INotebookCellStatusBarItemProvider, INotebookContributionData, NotebookData as NotebookData, NotebookExtensionDescription, TransientOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon';
1515
import { INotebookContentProvider, INotebookService, SimpleNotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookService';
1616
import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier';
1717
import { ExtHostContext, ExtHostNotebookShape, MainContext, MainThreadNotebookShape } from '../common/extHost.protocol';
@@ -67,15 +67,7 @@ export class MainThreadNotebooks implements MainThreadNotebookShape {
6767
transientOptions: contentOptions
6868
};
6969
},
70-
save: async (uri: URI, token: CancellationToken) => {
71-
return this._proxy.$saveNotebook(viewType, uri, token);
72-
},
73-
saveAs: async (uri: URI, target: URI, token: CancellationToken) => {
74-
return this._proxy.$saveNotebookAs(viewType, uri, target, token);
75-
},
76-
backup: async (uri: URI, token: CancellationToken) => {
77-
return this._proxy.$backupNotebook(viewType, uri, token);
78-
}
70+
backup: async (uri: URI, token: CancellationToken) => ''
7971
};
8072

8173
const disposable = new DisposableStore();
@@ -86,19 +78,6 @@ export class MainThreadNotebooks implements MainThreadNotebookShape {
8678
this._notebookProviders.set(viewType, { controller, disposable });
8779
}
8880

89-
async $updateNotebookProviderOptions(viewType: string, options?: { transientOutputs: boolean; transientCellMetadata: TransientCellMetadata; transientDocumentMetadata: TransientDocumentMetadata }): Promise<void> {
90-
const provider = this._notebookProviders.get(viewType);
91-
92-
if (provider && options) {
93-
provider.controller.options = options;
94-
this._notebookService.listNotebookDocuments().forEach(document => {
95-
if (document.viewType === viewType) {
96-
document.transientOptions = provider.controller.options;
97-
}
98-
});
99-
}
100-
}
101-
10281
async $unregisterNotebookProvider(viewType: string): Promise<void> {
10382
const entry = this._notebookProviders.get(viewType);
10483
if (entry) {
@@ -107,7 +86,6 @@ export class MainThreadNotebooks implements MainThreadNotebookShape {
10786
}
10887
}
10988

110-
11189
$registerNotebookSerializer(handle: number, extension: NotebookExtensionDescription, viewType: string, options: TransientOptions, data: INotebookContributionData | undefined): void {
11290
const registration = this._notebookService.registerNotebookSerializer(viewType, extension, {
11391
options,

src/vs/workbench/api/common/extHost.api.impl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
157157
const extHostDocuments = rpcProtocol.set(ExtHostContext.ExtHostDocuments, new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors));
158158
const extHostDocumentContentProviders = rpcProtocol.set(ExtHostContext.ExtHostDocumentContentProviders, new ExtHostDocumentContentProvider(rpcProtocol, extHostDocumentsAndEditors, extHostLogService));
159159
const extHostDocumentSaveParticipant = rpcProtocol.set(ExtHostContext.ExtHostDocumentSaveParticipant, new ExtHostDocumentSaveParticipant(extHostLogService, extHostDocuments, rpcProtocol.getProxy(MainContext.MainThreadBulkEdits)));
160-
const extHostNotebook = rpcProtocol.set(ExtHostContext.ExtHostNotebook, new ExtHostNotebookController(rpcProtocol, extHostCommands, extHostDocumentsAndEditors, extHostDocuments, extensionStoragePaths));
160+
const extHostNotebook = rpcProtocol.set(ExtHostContext.ExtHostNotebook, new ExtHostNotebookController(rpcProtocol, extHostCommands, extHostDocumentsAndEditors, extHostDocuments));
161161
const extHostNotebookDocuments = rpcProtocol.set(ExtHostContext.ExtHostNotebookDocuments, new ExtHostNotebookDocuments(extHostNotebook));
162162
const extHostNotebookEditors = rpcProtocol.set(ExtHostContext.ExtHostNotebookEditors, new ExtHostNotebookEditors(extHostLogService, extHostNotebook));
163163
const extHostNotebookKernels = rpcProtocol.set(ExtHostContext.ExtHostNotebookKernels, new ExtHostNotebookKernels(rpcProtocol, initData, extHostNotebook, extHostCommands, extHostLogService));

src/vs/workbench/api/common/extHost.protocol.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -962,7 +962,6 @@ export interface INotebookCellStatusBarListDto {
962962

963963
export interface MainThreadNotebookShape extends IDisposable {
964964
$registerNotebookProvider(extension: notebookCommon.NotebookExtensionDescription, viewType: string, options: notebookCommon.TransientOptions, registration: notebookCommon.INotebookContributionData | undefined): Promise<void>;
965-
$updateNotebookProviderOptions(viewType: string, options?: { transientOutputs: boolean; transientCellMetadata: notebookCommon.TransientCellMetadata; transientDocumentMetadata: notebookCommon.TransientDocumentMetadata }): Promise<void>;
966965
$unregisterNotebookProvider(viewType: string): Promise<void>;
967966

968967
$registerNotebookSerializer(handle: number, extension: notebookCommon.NotebookExtensionDescription, viewType: string, options: notebookCommon.TransientOptions, registration: notebookCommon.INotebookContributionData | undefined): void;
@@ -2056,9 +2055,6 @@ export interface ExtHostNotebookShape extends ExtHostNotebookDocumentsAndEditors
20562055
$releaseNotebookCellStatusBarItems(id: number): void;
20572056

20582057
$openNotebook(viewType: string, uri: UriComponents, backupId: string | undefined, untitledDocumentData: VSBuffer | undefined, token: CancellationToken): Promise<SerializableObjectWithBuffers<NotebookDataDto>>;
2059-
$saveNotebook(viewType: string, uri: UriComponents, token: CancellationToken): Promise<boolean>;
2060-
$saveNotebookAs(viewType: string, uri: UriComponents, target: UriComponents, token: CancellationToken): Promise<boolean>;
2061-
$backupNotebook(viewType: string, uri: UriComponents, cancellation: CancellationToken): Promise<string>;
20622058

20632059
$dataToNotebook(handle: number, data: VSBuffer, token: CancellationToken): Promise<SerializableObjectWithBuffers<NotebookDataDto>>;
20642060
$notebookToData(handle: number, data: SerializableObjectWithBuffers<NotebookDataDto>, token: CancellationToken): Promise<VSBuffer>;

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

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { VSBuffer } from 'vs/base/common/buffer';
77
import { CancellationToken } from 'vs/base/common/cancellation';
88
import { Emitter, Event } from 'vs/base/common/event';
99
import { IRelativePattern } from 'vs/base/common/glob';
10-
import { hash } from 'vs/base/common/hash';
1110
import { DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
1211
import { ResourceMap } from 'vs/base/common/map';
1312
import { MarshalledId } from 'vs/base/common/marshallingIds';
@@ -20,7 +19,6 @@ import { ExtHostNotebookShape, IMainContext, IModelAddedData, INotebookCellStatu
2019
import { ApiCommand, ApiCommandArgument, ApiCommandResult, CommandsConverter, ExtHostCommands } from 'vs/workbench/api/common/extHostCommands';
2120
import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments';
2221
import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors';
23-
import { IExtensionStoragePaths } from 'vs/workbench/api/common/extHostStoragePaths';
2422
import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters';
2523
import * as extHostTypes from 'vs/workbench/api/common/extHostTypes';
2624
import { INotebookExclusiveDocumentFilter, INotebookContributionData } from 'vs/workbench/contrib/notebook/common/notebookCommon';
@@ -75,7 +73,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
7573
commands: ExtHostCommands,
7674
private _textDocumentsAndEditors: ExtHostDocumentsAndEditors,
7775
private _textDocuments: ExtHostDocuments,
78-
private readonly _extensionStoragePaths: IExtensionStoragePaths,
7976
) {
8077
this._notebookProxy = mainContext.getProxy(MainContext.MainThreadNotebook);
8178
this._notebookDocumentsProxy = mainContext.getProxy(MainContext.MainThreadNotebookDocuments);
@@ -157,14 +154,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
157154

158155
this._notebookContentProviders.set(viewType, { extension, provider });
159156

160-
let listener: IDisposable | undefined;
161-
if (provider.onDidChangeNotebookContentOptions) {
162-
listener = provider.onDidChangeNotebookContentOptions(() => {
163-
const internalOptions = typeConverters.NotebookDocumentContentOptions.from(provider.options);
164-
this._notebookProxy.$updateNotebookProviderOptions(viewType, internalOptions);
165-
});
166-
}
167-
168157
this._notebookProxy.$registerNotebookProvider(
169158
{ id: extension.identifier, location: extension.extensionLocation },
170159
viewType,
@@ -173,7 +162,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
173162
);
174163

175164
return new extHostTypes.Disposable(() => {
176-
listener?.dispose();
177165
this._notebookContentProviders.delete(viewType);
178166
this._notebookProxy.$unregisterNotebookProvider(viewType);
179167
});
@@ -356,36 +344,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
356344
});
357345
}
358346

359-
async $saveNotebook(viewType: string, uri: UriComponents, token: CancellationToken): Promise<boolean> {
360-
const document = this.getNotebookDocument(URI.revive(uri));
361-
const { provider } = this._getProviderData(viewType);
362-
await provider.saveNotebook(document.apiNotebook, token);
363-
return true;
364-
}
365-
366-
async $saveNotebookAs(viewType: string, uri: UriComponents, target: UriComponents, token: CancellationToken): Promise<boolean> {
367-
const document = this.getNotebookDocument(URI.revive(uri));
368-
const { provider } = this._getProviderData(viewType);
369-
await provider.saveNotebookAs(URI.revive(target), document.apiNotebook, token);
370-
return true;
371-
}
372-
373-
private _backupIdPool: number = 0;
374-
375-
async $backupNotebook(viewType: string, uri: UriComponents, cancellation: CancellationToken): Promise<string> {
376-
const document = this.getNotebookDocument(URI.revive(uri));
377-
const provider = this._getProviderData(viewType);
378-
379-
const storagePath = this._extensionStoragePaths.workspaceValue(provider.extension) ?? this._extensionStoragePaths.globalValue(provider.extension);
380-
const fileName = String(hash([document.uri.toString(), this._backupIdPool++]));
381-
const backupUri = URI.joinPath(storagePath, fileName);
382-
383-
const backup = await provider.provider.backupNotebook(document.apiNotebook, { destination: backupUri }, cancellation);
384-
document.updateBackup(backup);
385-
return backup.id;
386-
}
387-
388-
389347
private _createExtHostEditor(document: ExtHostNotebookDocument, editorId: string, data: INotebookEditorAddData) {
390348

391349
if (this._editors.has(editorId)) {

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,6 @@ export class ExtHostNotebookDocument {
141141
private _metadata: Record<string, any>;
142142
private _versionId: number = 0;
143143
private _isDirty: boolean = false;
144-
private _backup?: vscode.NotebookDocumentBackup;
145144
private _disposed: boolean = false;
146145

147146
constructor(
@@ -190,16 +189,6 @@ export class ExtHostNotebookDocument {
190189
return this._notebook;
191190
}
192191

193-
updateBackup(backup: vscode.NotebookDocumentBackup): void {
194-
this._backup?.delete();
195-
this._backup = backup;
196-
}
197-
198-
disposeBackup(): void {
199-
this._backup?.delete();
200-
this._backup = undefined;
201-
}
202-
203192
acceptDocumentPropertiesChanged(data: extHostProtocol.INotebookDocumentPropertiesChangeData) {
204193
if (data.metadata) {
205194
this._metadata = Object.freeze({ ...this._metadata, ...data.metadata });

src/vs/workbench/api/test/browser/extHostNotebook.test.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments';
1919
import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands';
2020
import { nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions';
2121
import { isEqual } from 'vs/base/common/resources';
22-
import { IExtensionStoragePaths } from 'vs/workbench/api/common/extHostStoragePaths';
23-
import { generateUuid } from 'vs/base/common/uuid';
2422
import { Event } from 'vs/base/common/event';
2523
import { ExtHostNotebookDocuments } from 'vs/workbench/api/common/extHostNotebookDocuments';
2624
import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier';
@@ -54,12 +52,7 @@ suite('NotebookCell#Document', function () {
5452
});
5553
extHostDocumentsAndEditors = new ExtHostDocumentsAndEditors(rpcProtocol, new NullLogService());
5654
extHostDocuments = new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors);
57-
const extHostStoragePaths = new class extends mock<IExtensionStoragePaths>() {
58-
override workspaceValue() {
59-
return URI.from({ scheme: 'test', path: generateUuid() });
60-
}
61-
};
62-
extHostNotebooks = new ExtHostNotebookController(rpcProtocol, new ExtHostCommands(rpcProtocol, new NullLogService()), extHostDocumentsAndEditors, extHostDocuments, extHostStoragePaths);
55+
extHostNotebooks = new ExtHostNotebookController(rpcProtocol, new ExtHostCommands(rpcProtocol, new NullLogService()), extHostDocumentsAndEditors, extHostDocuments);
6356
extHostNotebookDocuments = new ExtHostNotebookDocuments(extHostNotebooks);
6457

6558
const reg = extHostNotebooks.registerNotebookContentProvider(nullExtensionDescription, 'test', new class extends mock<vscode.NotebookContentProvider>() {

0 commit comments

Comments
 (0)