Adding tests and changing how toWebviewResource works

- Allow placeholders in the webviewEndpoint. This is required to support serving each webview from its own origin
- Add tests for toWebviewResource
This commit is contained in:
Matt Bierner
2019-07-09 11:27:43 -07:00
parent 9a76b14f27
commit f963c9a2a8
6 changed files with 75 additions and 30 deletions

View File

@@ -11,6 +11,7 @@ import { ExtHostEditors } from 'vs/workbench/api/common/extHostTextEditors';
import * as vscode from 'vscode';
import { ExtHostEditorInsetsShape, MainThreadEditorInsetsShape } from './extHost.protocol';
import { toWebviewResource, WebviewInitData } from 'vs/workbench/api/common/shared/webview';
import { generateUuid } from 'vs/base/common/uuid';
export class ExtHostEditorInsets implements ExtHostEditorInsetsShape {
@@ -60,11 +61,12 @@ export class ExtHostEditorInsets implements ExtHostEditorInsetsShape {
const webview = new class implements vscode.Webview {
private readonly _uuid = generateUuid();
private _html: string = '';
private _options: vscode.WebviewOptions;
toWebviewResource(resource: vscode.Uri): vscode.Uri {
return toWebviewResource(that._initData, resource);
return toWebviewResource(that._initData, this._uuid, resource);
}
get cspRule(): string {

View File

@@ -13,40 +13,36 @@ import { Disposable } from './extHostTypes';
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions';
import * as modes from 'vs/editor/common/modes';
import { WebviewInitData, toWebviewResource } from 'vs/workbench/api/common/shared/webview';
import { generateUuid } from 'vs/base/common/uuid';
type IconPath = URI | { light: URI, dark: URI };
export class ExtHostWebview implements vscode.Webview {
private readonly _handle: WebviewPanelHandle;
private readonly _proxy: MainThreadWebviewsShape;
private readonly _uuid: string = generateUuid();
private _html: string;
private _options: vscode.WebviewOptions;
private _isDisposed: boolean = false;
public readonly _onMessageEmitter = new Emitter<any>();
public readonly onDidReceiveMessage: Event<any> = this._onMessageEmitter.event;
constructor(
handle: WebviewPanelHandle,
proxy: MainThreadWebviewsShape,
options: vscode.WebviewOptions,
private readonly initData: WebviewInitData
) {
this._handle = handle;
this._proxy = proxy;
this._options = options;
}
private readonly _handle: WebviewPanelHandle,
private readonly _proxy: MainThreadWebviewsShape,
private _options: vscode.WebviewOptions,
private readonly _initData: WebviewInitData
) { }
public dispose() {
this._onMessageEmitter.dispose();
}
public toWebviewResource(resource: vscode.Uri): vscode.Uri {
return toWebviewResource(this.initData, resource);
return toWebviewResource(this._initData, this._uuid, resource);
}
public get cspRule(): string {
return this.initData.webviewCspRule;
return this._initData.webviewCspRule;
}
public get html(): string {

View File

@@ -13,12 +13,12 @@ export interface WebviewInitData {
export function toWebviewResource(
initData: WebviewInitData,
uuid: string,
resource: vscode.Uri
): vscode.Uri {
const rootUri = URI.parse(initData.webviewResourceRoot);
return rootUri.with({
path: rootUri.path + resource.path,
query: resource.query,
fragment: resource.fragment,
});
const uri = initData.webviewResourceRoot
.replace('{{resource}}', resource.toString().replace(/^\S+?:/, ''))
.replace('{{uuid}}', uuid);
return URI.parse(uri);
}