declare cancellation support for openNotebook and wire it up, exempt notebook content provider from provider naming rules

This commit is contained in:
Johannes Rieken 2021-03-09 12:40:37 +01:00
parent 0e04c15de4
commit 98a22a957a
No known key found for this signature in database
GPG key ID: 96634B5AF12F8798
8 changed files with 26 additions and 24 deletions

View file

@ -985,7 +985,8 @@
"CustomEditorProvider", "CustomEditorProvider",
"CustomReadonlyEditorProvider", "CustomReadonlyEditorProvider",
"TerminalLinkProvider", "TerminalLinkProvider",
"AuthenticationProvider" "AuthenticationProvider",
"NotebookContentProvider"
] ]
} }
], ],

View file

@ -1555,27 +1555,27 @@ declare module 'vscode' {
readonly backupId?: string; readonly backupId?: string;
} }
// todo@API use openNotebookDOCUMENT to align with openCustomDocument etc?
export interface NotebookContentProvider { export interface NotebookContentProvider {
readonly options?: NotebookDocumentContentOptions; readonly options?: NotebookDocumentContentOptions;
readonly onDidChangeNotebookContentOptions?: Event<NotebookDocumentContentOptions>; readonly onDidChangeNotebookContentOptions?: Event<NotebookDocumentContentOptions>;
// todo@API remove! against separation of data provider and renderer
// eslint-disable-next-line vscode-dts-cancellation
resolveNotebook(document: NotebookDocument, webview: NotebookCommunication): Thenable<void>;
/** /**
* Content providers should always use [file system providers](#FileSystemProvider) to * Content providers should always use [file system providers](#FileSystemProvider) to
* resolve the raw content for `uri` as the resouce is not necessarily a file on disk. * resolve the raw content for `uri` as the resouce is not necessarily a file on disk.
*/ */
// eslint-disable-next-line vscode-dts-provider-naming openNotebook(uri: Uri, openContext: NotebookDocumentOpenContext, token: CancellationToken): NotebookData | Thenable<NotebookData>;
openNotebook(uri: Uri, openContext: NotebookDocumentOpenContext): NotebookData | Thenable<NotebookData>;
// eslint-disable-next-line vscode-dts-provider-naming
// eslint-disable-next-line vscode-dts-cancellation
resolveNotebook(document: NotebookDocument, webview: NotebookCommunication): Thenable<void>;
// eslint-disable-next-line vscode-dts-provider-naming
saveNotebook(document: NotebookDocument, cancellation: CancellationToken): Thenable<void>;
// eslint-disable-next-line vscode-dts-provider-naming
saveNotebookAs(targetResource: Uri, document: NotebookDocument, cancellation: CancellationToken): Thenable<void>;
// eslint-disable-next-line vscode-dts-provider-naming
backupNotebook(document: NotebookDocument, context: NotebookDocumentBackupContext, cancellation: CancellationToken): Thenable<NotebookDocumentBackup>;
// ??? saveNotebook(document: NotebookDocument, token: CancellationToken): Thenable<void>;
// provideKernels(document: NotebookDocument, token: CancellationToken): ProviderResult<T[]>;
saveNotebookAs(targetResource: Uri, document: NotebookDocument, token: CancellationToken): Thenable<void>;
backupNotebook(document: NotebookDocument, context: NotebookDocumentBackupContext, token: CancellationToken): Thenable<NotebookDocumentBackup>;
} }
export namespace notebook { export namespace notebook {

View file

@ -403,8 +403,8 @@ export class MainThreadNotebooks implements MainThreadNotebookShape {
contentOptions.transientOutputs = newOptions.transientOutputs; contentOptions.transientOutputs = newOptions.transientOutputs;
}, },
viewOptions: options.viewOptions, viewOptions: options.viewOptions,
openNotebook: async (viewType: string, uri: URI, backupId?: string) => { openNotebook: async (viewType: string, uri: URI, backupId: string | undefined, token: CancellationToken) => {
const data = await this._proxy.$openNotebook(viewType, uri, backupId); const data = await this._proxy.$openNotebook(viewType, uri, backupId, token);
return { return {
data, data,
transientOptions: contentOptions transientOptions: contentOptions

View file

@ -1863,7 +1863,7 @@ export interface ExtHostNotebookShape {
$executeNotebookKernelFromProvider(handle: number, uri: UriComponents, kernelId: string, cellHandle: number | undefined): Promise<void>; $executeNotebookKernelFromProvider(handle: number, uri: UriComponents, kernelId: string, cellHandle: number | undefined): Promise<void>;
$cancelNotebookKernelFromProvider(handle: number, uri: UriComponents, kernelId: string, cellHandle: number | undefined): Promise<void>; $cancelNotebookKernelFromProvider(handle: number, uri: UriComponents, kernelId: string, cellHandle: number | undefined): Promise<void>;
$onDidReceiveMessage(editorId: string, rendererId: string | undefined, message: unknown): void; $onDidReceiveMessage(editorId: string, rendererId: string | undefined, message: unknown): void;
$openNotebook(viewType: string, uri: UriComponents, backupId?: string): Promise<NotebookDataDto>; $openNotebook(viewType: string, uri: UriComponents, backupId: string | undefined, token: CancellationToken): Promise<NotebookDataDto>;
$saveNotebook(viewType: string, uri: UriComponents, token: CancellationToken): Promise<boolean>; $saveNotebook(viewType: string, uri: UriComponents, token: CancellationToken): Promise<boolean>;
$saveNotebookAs(viewType: string, uri: UriComponents, target: UriComponents, token: CancellationToken): Promise<boolean>; $saveNotebookAs(viewType: string, uri: UriComponents, target: UriComponents, token: CancellationToken): Promise<boolean>;
$backupNotebook(viewType: string, uri: UriComponents, cancellation: CancellationToken): Promise<string>; $backupNotebook(viewType: string, uri: UriComponents, cancellation: CancellationToken): Promise<string>;

View file

@ -497,9 +497,9 @@ export class ExtHostNotebookController implements ExtHostNotebookShape {
// --- open, save, saveAs, backup // --- open, save, saveAs, backup
async $openNotebook(viewType: string, uri: UriComponents, backupId?: string): Promise<NotebookDataDto> { async $openNotebook(viewType: string, uri: UriComponents, backupId: string | undefined, token: CancellationToken): Promise<NotebookDataDto> {
const { provider } = this._getProviderData(viewType); const { provider } = this._getProviderData(viewType);
const data = await provider.openNotebook(URI.revive(uri), { backupId }); const data = await provider.openNotebook(URI.revive(uri), { backupId }, token);
return { return {
metadata: { metadata: {
...notebookDocumentMetadataDefaults, ...notebookDocumentMetadataDefaults,

View file

@ -512,12 +512,12 @@ export class NotebookService extends Disposable implements INotebookService, IEd
return result; return result;
} }
async fetchNotebookRawData(viewType: string, uri: URI, backupId?: string): Promise<{ data: NotebookDataDto, transientOptions: TransientOptions }> { async fetchNotebookRawData(viewType: string, uri: URI, backupId: string | undefined, token: CancellationToken): Promise<{ data: NotebookDataDto, transientOptions: TransientOptions }> {
if (!await this.canResolve(viewType)) { if (!await this.canResolve(viewType)) {
throw new Error(`CANNOT fetch notebook data, there is NO provider for '${viewType}'`); throw new Error(`CANNOT fetch notebook data, there is NO provider for '${viewType}'`);
} }
const provider = this._withProvider(viewType)!; const provider = this._withProvider(viewType)!;
return await provider.controller.openNotebook(viewType, uri, backupId); return await provider.controller.openNotebook(viewType, uri, backupId, token);
} }
async save(viewType: string, resource: URI, token: CancellationToken): Promise<boolean> { async save(viewType: string, resource: URI, token: CancellationToken): Promise<boolean> {

View file

@ -170,7 +170,7 @@ export class NotebookEditorModel extends EditorModel implements INotebookEditorM
private async _loadFromProvider(backupId: string | undefined): Promise<void> { private async _loadFromProvider(backupId: string | undefined): Promise<void> {
const data = await this._notebookService.fetchNotebookRawData(this.viewType, this.resource, backupId); const data = await this._notebookService.fetchNotebookRawData(this.viewType, this.resource, backupId, CancellationToken.None);
this._lastResolvedFileStat = await this._resolveStats(this.resource); this._lastResolvedFileStat = await this._resolveStats(this.resource);
if (this.isDisposed()) { if (this.isDisposed()) {

View file

@ -22,9 +22,10 @@ export const INotebookService = createDecorator<INotebookService>('notebookServi
export interface IMainNotebookController { export interface IMainNotebookController {
viewOptions?: { displayName: string; filenamePattern: (string | IRelativePattern | INotebookExclusiveDocumentFilter)[]; exclusive: boolean; }; viewOptions?: { displayName: string; filenamePattern: (string | IRelativePattern | INotebookExclusiveDocumentFilter)[]; exclusive: boolean; };
options: { transientOutputs: boolean; transientMetadata: TransientMetadata; }; options: { transientOutputs: boolean; transientMetadata: TransientMetadata; };
openNotebook(viewType: string, uri: URI, backupId?: string): Promise<{ data: NotebookDataDto, transientOptions: TransientOptions; }>;
resolveNotebookEditor(viewType: string, uri: URI, editorId: string): Promise<void>; resolveNotebookEditor(viewType: string, uri: URI, editorId: string): Promise<void>;
onDidReceiveMessage(editorId: string, rendererType: string | undefined, message: any): void; onDidReceiveMessage(editorId: string, rendererType: string | undefined, message: any): void;
openNotebook(viewType: string, uri: URI, backupId: string | undefined, token: CancellationToken): Promise<{ data: NotebookDataDto, transientOptions: TransientOptions; }>;
save(uri: URI, token: CancellationToken): Promise<boolean>; save(uri: URI, token: CancellationToken): Promise<boolean>;
saveAs(uri: URI, target: URI, token: CancellationToken): Promise<boolean>; saveAs(uri: URI, target: URI, token: CancellationToken): Promise<boolean>;
backup(uri: URI, token: CancellationToken): Promise<string>; backup(uri: URI, token: CancellationToken): Promise<string>;
@ -66,7 +67,7 @@ export interface INotebookService {
getNotebookProviderResourceRoots(): URI[]; getNotebookProviderResourceRoots(): URI[];
destoryNotebookDocument(viewType: string, notebook: INotebookTextModel): void; destoryNotebookDocument(viewType: string, notebook: INotebookTextModel): void;
fetchNotebookRawData(viewType: string, uri: URI, backupId?: string): Promise<INotebookRawData>; fetchNotebookRawData(viewType: string, uri: URI, backupId: string | undefined, token: CancellationToken): Promise<INotebookRawData>;
save(viewType: string, resource: URI, token: CancellationToken): Promise<boolean>; save(viewType: string, resource: URI, token: CancellationToken): Promise<boolean>;
saveAs(viewType: string, resource: URI, target: URI, token: CancellationToken): Promise<boolean>; saveAs(viewType: string, resource: URI, target: URI, token: CancellationToken): Promise<boolean>;
backup(viewType: string, uri: URI, token: CancellationToken): Promise<string | undefined>; backup(viewType: string, uri: URI, token: CancellationToken): Promise<string | undefined>;