Skip to content

Commit 7233e19

Browse files
authored
Remove notebook content provider api (microsoft#165195)
Fixes microsoft#160580 Fixes microsoft#147248
1 parent bb4e4c4 commit 7233e19

File tree

10 files changed

+27
-167
lines changed

10 files changed

+27
-167
lines changed

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

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,11 @@ async function assertKernel(kernel: Kernel, notebook: vscode.NotebookDocument):
8585
assert.ok(kernel.associatedNotebooks.has(notebook.uri.toString()));
8686
}
8787

88-
const apiTestContentProvider: vscode.NotebookContentProvider = {
89-
openNotebook: async (resource: vscode.Uri): Promise<vscode.NotebookData> => {
90-
if (/.*empty\-.*\.vsctestnb$/.test(resource.path)) {
91-
return {
92-
metadata: {},
93-
cells: []
94-
};
95-
}
96-
88+
const apiTestSerializer: vscode.NotebookSerializer = {
89+
serializeNotebook(_data, _token) {
90+
return new Uint8Array();
91+
},
92+
deserializeNotebook(_content, _token) {
9793
const dto: vscode.NotebookData = {
9894
metadata: { custom: { testMetadata: false } },
9995
cells: [
@@ -143,8 +139,8 @@ const apiTestContentProvider: vscode.NotebookContentProvider = {
143139
suiteDisposables.length = 0;
144140
});
145141

146-
suiteSetup(function () {
147-
suiteDisposables.push(vscode.workspace.registerNotebookContentProvider('notebookCoreTest', apiTestContentProvider));
142+
suiteSetup(() => {
143+
suiteDisposables.push(vscode.workspace.registerNotebookSerializer('notebookCoreTest', apiTestSerializer));
148144
});
149145

150146
let defaultKernel: Kernel;

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

Lines changed: 7 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,25 @@ import { VSBuffer } from 'vs/base/common/buffer';
77
import { CancellationToken } from 'vs/base/common/cancellation';
88
import { Emitter } from 'vs/base/common/event';
99
import { DisposableStore, dispose, IDisposable } from 'vs/base/common/lifecycle';
10+
import { StopWatch } from 'vs/base/common/stopwatch';
11+
import { assertType } from 'vs/base/common/types';
1012
import { URI } from 'vs/base/common/uri';
13+
import { CommandsRegistry } from 'vs/platform/commands/common/commands';
14+
import { ILogService } from 'vs/platform/log/common/log';
1115
import { NotebookDto } from 'vs/workbench/api/browser/mainThreadNotebookDto';
12-
import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers';
1316
import { INotebookCellStatusBarService } from 'vs/workbench/contrib/notebook/common/notebookCellStatusBarService';
14-
import { INotebookCellStatusBarItemProvider, INotebookContributionData, NotebookData as NotebookData, NotebookExtensionDescription, TransientOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon';
15-
import { INotebookContentProvider, INotebookService, SimpleNotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookService';
17+
import { INotebookCellStatusBarItemProvider, INotebookContributionData, NotebookData, NotebookExtensionDescription, TransientOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon';
18+
import { INotebookService, SimpleNotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookService';
19+
import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers';
1620
import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier';
1721
import { ExtHostContext, ExtHostNotebookShape, MainContext, MainThreadNotebookShape } from '../common/extHost.protocol';
18-
import { ILogService } from 'vs/platform/log/common/log';
19-
import { StopWatch } from 'vs/base/common/stopwatch';
20-
import { CommandsRegistry } from 'vs/platform/commands/common/commands';
21-
import { assertType } from 'vs/base/common/types';
2222

2323
@extHostNamedCustomer(MainContext.MainThreadNotebook)
2424
export class MainThreadNotebooks implements MainThreadNotebookShape {
2525

2626
private readonly _disposables = new DisposableStore();
2727

2828
private readonly _proxy: ExtHostNotebookShape;
29-
private readonly _notebookProviders = new Map<string, { controller: INotebookContentProvider; disposable: IDisposable }>();
3029
private readonly _notebookSerializer = new Map<number, IDisposable>();
3130
private readonly _notebookCellStatusBarRegistrations = new Map<number, IDisposable>();
3231

@@ -41,51 +40,9 @@ export class MainThreadNotebooks implements MainThreadNotebookShape {
4140

4241
dispose(): void {
4342
this._disposables.dispose();
44-
// remove all notebook providers
45-
for (const item of this._notebookProviders.values()) {
46-
item.disposable.dispose();
47-
}
4843
dispose(this._notebookSerializer.values());
4944
}
5045

51-
async $registerNotebookProvider(extension: NotebookExtensionDescription, viewType: string, options: TransientOptions, data: INotebookContributionData | undefined): Promise<void> {
52-
const contentOptions = { ...options };
53-
54-
const controller: INotebookContentProvider = {
55-
get options() {
56-
return contentOptions;
57-
},
58-
set options(newOptions) {
59-
contentOptions.transientCellMetadata = newOptions.transientCellMetadata;
60-
contentOptions.transientDocumentMetadata = newOptions.transientDocumentMetadata;
61-
contentOptions.transientOutputs = newOptions.transientOutputs;
62-
},
63-
open: async (uri: URI, backupId: string | undefined, untitledDocumentData: VSBuffer | undefined, token: CancellationToken) => {
64-
const data = await this._proxy.$openNotebook(viewType, uri, backupId, untitledDocumentData, token);
65-
return {
66-
data: NotebookDto.fromNotebookDataDto(data.value),
67-
transientOptions: contentOptions
68-
};
69-
},
70-
backup: async (uri: URI, token: CancellationToken) => ''
71-
};
72-
73-
const disposable = new DisposableStore();
74-
disposable.add(this._notebookService.registerNotebookController(viewType, extension, controller));
75-
if (data) {
76-
disposable.add(this._notebookService.registerContributedNotebookType(viewType, data));
77-
}
78-
this._notebookProviders.set(viewType, { controller, disposable });
79-
}
80-
81-
async $unregisterNotebookProvider(viewType: string): Promise<void> {
82-
const entry = this._notebookProviders.get(viewType);
83-
if (entry) {
84-
entry.disposable.dispose();
85-
this._notebookProviders.delete(viewType);
86-
}
87-
}
88-
8946
$registerNotebookSerializer(handle: number, extension: NotebookExtensionDescription, viewType: string, options: TransientOptions, data: INotebookContributionData | undefined): void {
9047
const registration = this._notebookService.registerNotebookSerializer(viewType, extension, {
9148
options,

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

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -937,14 +937,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
937937
registerNotebookSerializer(viewType: string, serializer: vscode.NotebookSerializer, options?: vscode.NotebookDocumentContentOptions, registration?: vscode.NotebookRegistrationData) {
938938
return extHostNotebook.registerNotebookSerializer(extension, viewType, serializer, options, isProposedApiEnabled(extension, 'notebookLiveShare') ? registration : undefined);
939939
},
940-
registerNotebookContentProvider: (viewType: string, provider: vscode.NotebookContentProvider, options?: vscode.NotebookDocumentContentOptions, registration?: vscode.NotebookRegistrationData) => {
941-
checkProposedApiEnabled(extension, 'notebookContentProvider');
942-
943-
extHostApiDeprecation.report('workspace.registerNotebookContentProvider', extension,
944-
`The notebookContentProvider API is not on track for finalization and will be removed.`);
945-
946-
return extHostNotebook.registerNotebookContentProvider(extension, viewType, provider, options);
947-
},
948940
onDidChangeConfiguration: (listener: (_: any) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) => {
949941
return configProvider.onDidChangeConfiguration(listener, thisArgs, disposables);
950942
},

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -964,9 +964,6 @@ export interface INotebookCellStatusBarListDto {
964964
}
965965

966966
export interface MainThreadNotebookShape extends IDisposable {
967-
$registerNotebookProvider(extension: notebookCommon.NotebookExtensionDescription, viewType: string, options: notebookCommon.TransientOptions, registration: notebookCommon.INotebookContributionData | undefined): Promise<void>;
968-
$unregisterNotebookProvider(viewType: string): Promise<void>;
969-
970967
$registerNotebookSerializer(handle: number, extension: notebookCommon.NotebookExtensionDescription, viewType: string, options: notebookCommon.TransientOptions, registration: notebookCommon.INotebookContributionData | undefined): void;
971968
$unregisterNotebookSerializer(handle: number): void;
972969

@@ -2063,8 +2060,6 @@ export interface ExtHostNotebookShape extends ExtHostNotebookDocumentsAndEditors
20632060
$provideNotebookCellStatusBarItems(handle: number, uri: UriComponents, index: number, token: CancellationToken): Promise<INotebookCellStatusBarListDto | undefined>;
20642061
$releaseNotebookCellStatusBarItems(id: number): void;
20652062

2066-
$openNotebook(viewType: string, uri: UriComponents, backupId: string | undefined, untitledDocumentData: VSBuffer | undefined, token: CancellationToken): Promise<SerializableObjectWithBuffers<NotebookDataDto>>;
2067-
20682063
$dataToNotebook(handle: number, data: VSBuffer, token: CancellationToken): Promise<SerializableObjectWithBuffers<NotebookDataDto>>;
20692064
$notebookToData(handle: number, data: SerializableObjectWithBuffers<NotebookDataDto>, token: CancellationToken): Promise<VSBuffer>;
20702065
}

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

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,6 @@ import { ExtHostCell, ExtHostNotebookDocument } from './extHostNotebookDocument'
2828
import { ExtHostNotebookEditor } from './extHostNotebookEditor';
2929

3030

31-
type NotebookContentProviderData = {
32-
readonly provider: vscode.NotebookContentProvider;
33-
readonly extension: IExtensionDescription;
34-
};
3531

3632
export class ExtHostNotebookController implements ExtHostNotebookShape {
3733
private static _notebookStatusBarItemProviderHandlePool: number = 0;
@@ -40,7 +36,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
4036
private readonly _notebookDocumentsProxy: MainThreadNotebookDocumentsShape;
4137
private readonly _notebookEditorsProxy: MainThreadNotebookEditorsShape;
4238

43-
private readonly _notebookContentProviders = new Map<string, NotebookContentProviderData>();
4439
private readonly _notebookStatusBarItemProviders = new Map<number, vscode.NotebookCellStatusBarItemProvider>();
4540
private readonly _documents = new ResourceMap<ExtHostNotebookDocument>();
4641
private readonly _editors = new Map<string, ExtHostNotebookEditor>();
@@ -137,41 +132,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
137132
return result;
138133
}
139134

140-
private _getProviderData(viewType: string): NotebookContentProviderData {
141-
const result = this._notebookContentProviders.get(viewType);
142-
if (!result) {
143-
throw new Error(`NO provider for '${viewType}'`);
144-
}
145-
return result;
146-
}
147-
148-
registerNotebookContentProvider(
149-
extension: IExtensionDescription,
150-
viewType: string,
151-
provider: vscode.NotebookContentProvider,
152-
options?: vscode.NotebookDocumentContentOptions
153-
): vscode.Disposable {
154-
if (isFalsyOrWhitespace(viewType)) {
155-
throw new Error(`viewType cannot be empty or just whitespace`);
156-
}
157-
if (this._notebookContentProviders.has(viewType)) {
158-
throw new Error(`Notebook provider for '${viewType}' already registered`);
159-
}
160-
161-
this._notebookContentProviders.set(viewType, { extension, provider });
162135

163-
this._notebookProxy.$registerNotebookProvider(
164-
{ id: extension.identifier, location: extension.extensionLocation },
165-
viewType,
166-
typeConverters.NotebookDocumentContentOptions.from(options),
167-
undefined,
168-
);
169-
170-
return new extHostTypes.Disposable(() => {
171-
this._notebookContentProviders.delete(viewType);
172-
this._notebookProxy.$unregisterNotebookProvider(viewType);
173-
});
174-
}
175136

176137
private static _convertNotebookRegistrationData(extension: IExtensionDescription, registration: vscode.NotebookRegistrationData | undefined): INotebookContributionData | undefined {
177138
if (!registration) {
@@ -341,14 +302,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
341302

342303
// --- open, save, saveAs, backup
343304

344-
async $openNotebook(viewType: string, uri: UriComponents, backupId: string | undefined, untitledDocumentData: VSBuffer | undefined, token: CancellationToken): Promise<SerializableObjectWithBuffers<NotebookDataDto>> {
345-
const { provider } = this._getProviderData(viewType);
346-
const data = await provider.openNotebook(URI.revive(uri), { backupId, untitledDocumentData: untitledDocumentData?.buffer }, token);
347-
return new SerializableObjectWithBuffers({
348-
metadata: data.metadata ?? Object.create(null),
349-
cells: data.cells.map(typeConverters.NotebookCellData.from),
350-
});
351-
}
352305

353306
private _createExtHostEditor(document: ExtHostNotebookDocument, editorId: string, data: INotebookEditorAddData) {
354307

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,15 @@ suite('NotebookCell#Document', function () {
4747
override $registerCommand() { }
4848
});
4949
rpcProtocol.set(MainContext.MainThreadNotebook, new class extends mock<MainThreadNotebookShape>() {
50-
override async $registerNotebookProvider() { }
51-
override async $unregisterNotebookProvider() { }
50+
override async $registerNotebookSerializer() { }
51+
override async $unregisterNotebookSerializer() { }
5252
});
5353
extHostDocumentsAndEditors = new ExtHostDocumentsAndEditors(rpcProtocol, new NullLogService());
5454
extHostDocuments = new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors);
5555
extHostNotebooks = new ExtHostNotebookController(rpcProtocol, new ExtHostCommands(rpcProtocol, new NullLogService()), extHostDocumentsAndEditors, extHostDocuments);
5656
extHostNotebookDocuments = new ExtHostNotebookDocuments(extHostNotebooks);
5757

58-
const reg = extHostNotebooks.registerNotebookContentProvider(nullExtensionDescription, 'test', new class extends mock<vscode.NotebookContentProvider>() {
59-
// async openNotebook() { }
60-
});
58+
const reg = extHostNotebooks.registerNotebookSerializer(nullExtensionDescription, 'test', new class extends mock<vscode.NotebookSerializer>() { });
6159
extHostNotebooks.$acceptDocumentAndEditorsDelta(new SerializableObjectWithBuffers({
6260
addedDocuments: [{
6361
uri: notebookUri,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ suite('NotebookKernel', function () {
8383

8484
});
8585
rpcProtocol.set(MainContext.MainThreadNotebook, new class extends mock<MainThreadNotebookShape>() {
86-
override async $registerNotebookProvider() { }
87-
override async $unregisterNotebookProvider() { }
86+
override async $registerNotebookSerializer() { }
87+
override async $unregisterNotebookSerializer() { }
8888
});
8989
extHostDocumentsAndEditors = new ExtHostDocumentsAndEditors(rpcProtocol, new NullLogService());
9090
extHostDocuments = new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors);

src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,7 +1246,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD
12461246
}
12471247

12481248
if (!this._webview) {
1249-
this._createWebview(this.getId(), this.textModel.viewType, this.textModel.uri);
1249+
this._ensureWebview(this.getId(), this.textModel.viewType, this.textModel.uri);
12501250
}
12511251

12521252
this._webviewResolvePromise = (async () => {
@@ -1283,7 +1283,11 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD
12831283
return this._webviewResolvePromise;
12841284
}
12851285

1286-
private async _createWebview(id: string, viewType: string, resource: URI): Promise<void> {
1286+
private _ensureWebview(id: string, viewType: string, resource: URI) {
1287+
if (this._webview) {
1288+
return;
1289+
}
1290+
12871291
const that = this;
12881292

12891293
this._webview = this.instantiationService.createInstance(BackLayerWebView, {
@@ -1316,7 +1320,8 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD
13161320
}
13171321

13181322
private async _attachModel(textModel: NotebookTextModel, viewState: INotebookEditorViewState | undefined, perf?: NotebookPerfMarks) {
1319-
await this._createWebview(this.getId(), textModel.viewType, textModel.uri);
1323+
this._ensureWebview(this.getId(), textModel.viewType, textModel.uri);
1324+
13201325
this.viewModel = this.instantiationService.createInstance(NotebookViewModel, textModel.viewType, textModel, this._viewContext, this.getLayoutInfo(), { isReadOnly: this._readOnly });
13211326
this._viewContext.eventDispatcher.emit([new NotebookLayoutChangedEvent({ width: true, fontInfo: true }, this.getLayoutInfo())]);
13221327

src/vs/workbench/services/extensions/common/extensionsApiProposals.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ export const allApiProposals = Object.freeze({
4040
interactiveWindow: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.interactiveWindow.d.ts',
4141
ipc: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.ipc.d.ts',
4242
notebookCellExecutionState: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookCellExecutionState.d.ts',
43-
notebookContentProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookContentProvider.d.ts',
4443
notebookControllerAffinityHidden: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookControllerAffinityHidden.d.ts',
4544
notebookControllerKind: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookControllerKind.d.ts',
4645
notebookDeprecated: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookDeprecated.d.ts',

src/vscode-dts/vscode.proposed.notebookContentProvider.d.ts

Lines changed: 0 additions & 35 deletions
This file was deleted.

0 commit comments

Comments
 (0)