Update preload scripts for notebook renderer

This commit is contained in:
rebornix
2020-02-13 16:00:13 -08:00
parent 298a5d074e
commit 20f4cbf4b6
16 changed files with 749 additions and 448 deletions

View File

@@ -68,6 +68,7 @@ export class MainThreadNotebookDocument extends Disposable implements INotebook
public cells: MainThreadCell[];
public activeCell: MainThreadCell | undefined;
public languages: string[] = [];
public renderers = new Set<number>();
private _isDirty: boolean = false;
@@ -94,6 +95,12 @@ export class MainThreadNotebookDocument extends Disposable implements INotebook
this.languages = languages;
}
updateRenderers(renderers: number[]) {
renderers.forEach(render => {
this.renderers.add(render);
});
}
updateCell(cell: ICell) {
let mcell = this._mapping.get(cell.handle);
@@ -183,7 +190,6 @@ export class MainThreadNotebookDocument extends Disposable implements INotebook
@extHostNamedCustomer(MainContext.MainThreadNotebook)
export class MainThreadNotebooks extends Disposable implements MainThreadNotebookShape {
private readonly _notebookProviders = new Map<string, MainThreadNotebookController>();
private readonly _renderers = new Map<number, MainThreadNotebookController>();
private readonly _proxy: ExtHostNotebookShape;
constructor(
@@ -197,12 +203,12 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo
}));
}
$registerNotebookRenderer(extension: NotebookExtensionDescription, selectors: INotebookMimeTypeSelector, handle: number): Promise<void> {
throw new Error('Method not implemented.');
async $registerNotebookRenderer(extension: NotebookExtensionDescription, selectors: INotebookMimeTypeSelector, handle: number, preloads: UriComponents[]): Promise<void> {
this._notebookService.registerNotebookRenderer(handle, extension, selectors, preloads.map(uri => URI.revive(uri)));
}
$unregisterNotebookRenderer(handle: number): Promise<void> {
throw new Error('Method not implemented.');
async $unregisterNotebookRenderer(handle: number): Promise<void> {
this._notebookService.unregisterNotebookRenderer(handle);
}
async $registerNotebookProvider(extension: NotebookExtensionDescription, viewType: string): Promise<void> {
@@ -230,19 +236,19 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo
return;
}
async $updateNotebookCells(viewType: string, resource: UriComponents, cells: ICell[]): Promise<void> {
async $updateNotebookCells(viewType: string, resource: UriComponents, cells: ICell[], renderers: number[]): Promise<void> {
let controller = this._notebookProviders.get(viewType);
if (controller) {
controller.updateNotebookCells(resource, cells);
controller.updateNotebookCells(resource, cells, renderers);
}
}
async $updateNotebookCell(viewType: string, resource: UriComponents, cell: ICell): Promise<void> {
async $updateNotebookCell(viewType: string, resource: UriComponents, cell: ICell, renderers: number[]): Promise<void> {
let controller = this._notebookProviders.get(viewType);
if (controller) {
controller.updateNotebookCell(resource, cell);
controller.updateNotebookCell(resource, cell, renderers);
}
}
@@ -326,22 +332,32 @@ export class MainThreadNotebookController implements IMainNotebookController {
}
}
updateNotebookCells(resource: UriComponents, cells: ICell[]): void {
updateNotebookCells(resource: UriComponents, cells: ICell[], renderers: number[]): void {
let document = this._mapping.get(URI.from(resource).toString());
if (document) {
document.updateRenderers(renderers);
document.updateCells(cells);
}
}
updateNotebookCell(resource: UriComponents, cell: ICell): void {
updateNotebookCell(resource: UriComponents, cell: ICell, renderers: number[]): void {
let document = this._mapping.get(URI.from(resource).toString());
if (document) {
document.updateRenderers(renderers);
document.updateCell(cell);
}
}
updateNotebookRenderers(resource: UriComponents, renderers: number[]): void {
let document = this._mapping.get(URI.from(resource).toString());
if (document) {
document.updateRenderers(renderers);
}
}
updateNotebookActiveCell(uri: URI, cellHandle: number): void {
let mainthreadNotebook = this._mapping.get(URI.from(uri).toString());

View File

@@ -628,12 +628,12 @@ export interface ExtHostWebviewsShape {
export interface MainThreadNotebookShape extends IDisposable {
$registerNotebookProvider(extension: NotebookExtensionDescription, viewType: string): Promise<void>;
$unregisterNotebookProvider(viewType: string): Promise<void>;
$registerNotebookRenderer(extension: NotebookExtensionDescription, selectors: INotebookMimeTypeSelector, handle: number): Promise<void>;
$registerNotebookRenderer(extension: NotebookExtensionDescription, selectors: INotebookMimeTypeSelector, handle: number, preloads: UriComponents[]): Promise<void>;
$unregisterNotebookRenderer(handle: number): Promise<void>;
$createNotebookDocument(handle: number, viewType: string, resource: UriComponents): Promise<void>;
$updateNotebook(viewType: string, resource: UriComponents, notebook: INotebook): Promise<void>;
$updateNotebookCells(viewType: string, resource: UriComponents, cells: ICell[]): Promise<void>;
$updateNotebookCell(viewType: string, resource: UriComponents, cell: ICell): Promise<void>;
$updateNotebookCells(viewType: string, resource: UriComponents, cells: ICell[], renderers: number[]): Promise<void>;
$updateNotebookCell(viewType: string, resource: UriComponents, cell: ICell, renderers: number[]): Promise<void>;
$updateNotebookLanguages(viewType: string, resource: UriComponents, languages: string[]): Promise<void>;
}

View File

@@ -90,12 +90,14 @@ export class ExtHostNotebookDocument implements vscode.NotebookDocument {
let store = this._cellDisposableMapping.get(cell.handle)!;
store.add(cell.onDidChangeOutputs(() => {
let renderers = new Set<number>();
let outputs = cell.outputs;
if (outputs && outputs.length) {
outputs = outputs.map(output => {
let handler = this.renderingHandler.findBestMatchedRenderer(output);
if (handler) {
renderers.add(handler.handle);
return handler.render(this, cell, output);
} else {
return output;
@@ -110,7 +112,7 @@ export class ExtHostNotebookDocument implements vscode.NotebookDocument {
cell_type: cell.cell_type,
outputs: outputs,
isDirty: false
});
}, Array.from(renderers));
}));
});
}
@@ -140,13 +142,15 @@ export class ExtHostNotebookDocument implements vscode.NotebookDocument {
get isDirty() { return false; }
async $updateCells(): Promise<void> {
return await this._proxy.$updateNotebookCells(this.viewType, this.uri, this.cells.map(cell => {
let renderers = new Set<number>();
let cells = this.cells.map(cell => {
let outputs = cell.outputs;
if (outputs && outputs.length) {
outputs = outputs.map(output => {
let handler = this.renderingHandler.findBestMatchedRenderer(output);
if (handler) {
renderers.add(handler.handle);
return handler.render(this, cell, output);
} else {
return output;
@@ -163,7 +167,9 @@ export class ExtHostNotebookDocument implements vscode.NotebookDocument {
isDirty: false
};
}
));
);
return await this._proxy.$updateNotebookCells(this.viewType, this.uri, cells, Array.from(renderers));
}
insertRawCell(index: number, cell: ExtHostCell) {
@@ -177,11 +183,13 @@ export class ExtHostNotebookDocument implements vscode.NotebookDocument {
store.add(cell.onDidChangeOutputs(() => {
let outputs = cell.outputs;
let renderers = new Set<number>();
if (outputs && outputs.length) {
outputs = outputs.map(output => {
let handler = this.renderingHandler.findBestMatchedRenderer(output);
if (handler) {
renderers.add(handler.handle);
return handler.render(this, cell, output);
} else {
return output;
@@ -196,7 +204,7 @@ export class ExtHostNotebookDocument implements vscode.NotebookDocument {
cell_type: cell.cell_type,
outputs: outputs,
isDirty: false
});
}, Array.from(renderers));
}));
}
@@ -381,7 +389,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
): vscode.Disposable {
let extHostRenderer = new ExtHostNotebookOutputRenderer(filter, renderer);
this._notebookOutputRenderers.set(extHostRenderer.handle, extHostRenderer);
this._proxy.$registerNotebookRenderer({ id: extension.identifier, location: extension.extensionLocation }, filter, extHostRenderer.handle);
this._proxy.$registerNotebookRenderer({ id: extension.identifier, location: extension.extensionLocation }, filter, extHostRenderer.handle, renderer.preloads || []);
return new VSCodeDisposable(() => {
this._notebookOutputRenderers.delete(extHostRenderer.handle);
this._proxy.$unregisterNotebookRenderer(extHostRenderer.handle);