提交 285c61db 编写于 作者: R rebornix

add renderer extension folder to webview allowed resource list

上级 eed9a7b0
......@@ -10,7 +10,7 @@ import { notebookProviderExtensionPoint, notebookRendererExtensionPoint } from '
import { NotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookProvider';
import { NotebookExtensionDescription } from 'vs/workbench/api/common/extHost.protocol';
import { Emitter, Event } from 'vs/base/common/event';
import { INotebook, ICell, INotebookMimeTypeSelector } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { INotebook, ICell, INotebookMimeTypeSelector, INotebookRendererInfo } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
import { NotebookOutputRendererInfo } from 'vs/workbench/contrib/notebook/common/notebookOutputRenderer';
......@@ -38,7 +38,7 @@ export interface INotebookService {
unregisterNotebookProvider(viewType: string): void;
registerNotebookRenderer(handle: number, extensionData: NotebookExtensionDescription, type: string, selectors: INotebookMimeTypeSelector, preloads: URI[]): void;
unregisterNotebookRenderer(handle: number): void;
getRendererPreloads(handle: number): URI[];
getRendererPreloads(handle: number): INotebookRendererInfo | undefined;
resolveNotebook(viewType: string, uri: URI): Promise<INotebook | undefined>;
executeNotebook(viewType: string, uri: URI): Promise<void>;
executeNotebookActiveCell(viewType: string, uri: URI): Promise<void>;
......@@ -201,8 +201,17 @@ export class NotebookService extends Disposable implements INotebookService {
this._notebookRenderers.delete(handle);
}
getRendererPreloads(handle: number): URI[] {
return this._notebookRenderers.get(handle)?.preloads || [];
getRendererPreloads(handle: number): INotebookRendererInfo | undefined {
const renderer = this._notebookRenderers.get(handle);
if (renderer) {
return {
extensionLocation: URI.revive(renderer.extensionData.location),
preloads: renderer.preloads
};
}
return;
}
async resolveNotebook(viewType: string, uri: URI): Promise<INotebook | undefined> {
......
......@@ -75,6 +75,8 @@ export class BackLayerWebView extends Disposable {
insetMapping: Map<IOutput, { outputId: string, cell: CellViewModel, cacheOffset: number | undefined }> = new Map();
reversedInsetMapping: Map<string, IOutput> = new Map();
preloadsCache: Map<string, boolean> = new Map();
localResourceRootsCache: URI[] | undefined = undefined;
rendererRootsCache: URI[] = [];
constructor(public webviewService: IWebviewService, public notebookService: INotebookService, public notebookEditor: INotebookEditor, public environmentSerice: IEnvironmentService) {
super();
......@@ -289,11 +291,12 @@ export class BackLayerWebView extends Disposable {
}
private _createInset(webviewService: IWebviewService, content: string) {
this.localResourceRootsCache = [...this.notebookService.getNotebookProviderResourceRoots(), URI.file(this.environmentSerice.appRoot)];
const webview = webviewService.createWebview('' + UUID.generateUuid(), {
enableFindWidget: false,
}, {
allowScripts: true,
localResourceRoots: [...this.notebookService.getNotebookProviderResourceRoots(), URI.file(this.environmentSerice.appRoot)]
localResourceRoots: this.localResourceRootsCache
});
webview.html = content;
return webview;
......@@ -386,24 +389,37 @@ export class BackLayerWebView extends Disposable {
updateRendererPreloads(preloads: Set<number>) {
let resources: string[] = [];
let extensionLocations: URI[] = [];
preloads.forEach(preload => {
let preloadResources = this.notebookService.getRendererPreloads(preload).map(preloadResource => preloadResource.with({ scheme: WebviewResourceScheme }));
preloadResources.forEach(e => {
if (!this.preloadsCache.has(e.toString())) {
resources.push(e.toString());
this.preloadsCache.set(e.toString(), true);
}
});
let rendererInfo = this.notebookService.getRendererPreloads(preload);
if (rendererInfo) {
let preloadResources = rendererInfo.preloads.map(preloadResource => preloadResource.with({ scheme: WebviewResourceScheme }));
extensionLocations.push(rendererInfo.extensionLocation);
preloadResources.forEach(e => {
if (!this.preloadsCache.has(e.toString())) {
resources.push(e.toString());
this.preloadsCache.set(e.toString(), true);
}
});
}
});
this.rendererRootsCache = extensionLocations;
const mixedResourceRoots = [...(this.localResourceRootsCache || []), ...this.rendererRootsCache];
this.webview.contentOptions = {
allowScripts: true,
enableCommandUris: true,
localResourceRoots: mixedResourceRoots
};
let message: IUpdatePreloadResourceMessage = {
type: 'preload',
resources: resources
};
this.webview.sendMessage(message);
// @TODO, update allowed resources folder
}
clearPreloadsCache() {
......
......@@ -31,6 +31,11 @@ export interface INotebookMimeTypeSelector {
subTypes?: string[];
}
export interface INotebookRendererInfo {
extensionLocation: URI,
preloads: URI[]
}
/**
* @internal
*/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册