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

add renderer extension folder to webview allowed resource list

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