提交 02c20ee2 编写于 作者: A Alex Dima

Redirect vscode-resource requests

上级 2ff2c61c
......@@ -191,7 +191,8 @@ export class WebviewEditor extends BaseWebviewEditor {
allowSvgs: true,
enableWrappedPostMessage: true,
useSameOriginForRoot: false,
localResourceRoots: input.options.localResourceRoots || this.getDefaultLocalResourceRoots()
localResourceRoots: input.options.localResourceRoots || this.getDefaultLocalResourceRoots(),
extensionLocation: input.extensionLocation
}, input.options.retainContextWhenHidden);
if (this._webviewContent) {
......@@ -233,7 +234,8 @@ export class WebviewEditor extends BaseWebviewEditor {
this._partService.getContainer(Parts.EDITOR_PART),
{
enableWrappedPostMessage: true,
useSameOriginForRoot: false
useSameOriginForRoot: false,
extensionLocation: input.extensionLocation
});
this._webview.mountTo(this._webviewContent);
input.webview = this._webview;
......
......@@ -23,6 +23,7 @@ export interface WebviewOptions {
readonly enableWrappedPostMessage?: boolean;
readonly useSameOriginForRoot?: boolean;
readonly localResourceRoots?: ReadonlyArray<URI>;
readonly extensionLocation?: URI;
}
export class WebviewElement extends Disposable {
......@@ -356,11 +357,11 @@ export class WebviewElement extends Disposable {
const appRootUri = URI.file(this._environmentService.appRoot);
registerFileProtocol(contents, WebviewProtocol.CoreResource, this._fileService, () => [
registerFileProtocol(contents, WebviewProtocol.CoreResource, this._fileService, null, () => [
appRootUri
]);
registerFileProtocol(contents, WebviewProtocol.VsCodeResource, this._fileService, () =>
registerFileProtocol(contents, WebviewProtocol.VsCodeResource, this._fileService, this._options.extensionLocation, () =>
(this._options.localResourceRoots || [])
);
}
......
......@@ -8,32 +8,52 @@ import { nativeSep } from 'vs/base/common/paths';
import { startsWith } from 'vs/base/common/strings';
import { URI } from 'vs/base/common/uri';
import { IFileService } from 'vs/platform/files/common/files';
import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts';
export const enum WebviewProtocol {
CoreResource = 'vscode-core-resource',
VsCodeResource = 'vscode-resource'
}
function resolveContent(fileService: IFileService, resource: URI, mime: string, callback: any): void {
fileService.resolveContent(resource, { encoding: 'binary' }).then(contents => {
callback({
data: Buffer.from(contents.value, contents.encoding),
mimeType: mime
});
}, (err) => {
console.log(err);
callback({ error: -2 /* FAILED: https://cs.chromium.org/chromium/src/net/base/net_error_list.h */ });
});
}
export function registerFileProtocol(
contents: Electron.WebContents,
protocol: WebviewProtocol,
fileService: IFileService,
extensionLocation: URI | null | undefined,
getRoots: () => ReadonlyArray<URI>
) {
contents.session.protocol.registerBufferProtocol(protocol, (request, callback: any) => {
if (extensionLocation && extensionLocation.scheme === REMOTE_HOST_SCHEME) {
const requestUri = URI.parse(request.url);
const redirectedUri = URI.from({
scheme: REMOTE_HOST_SCHEME,
authority: extensionLocation.authority,
path: '/vscode-resource',
query: JSON.stringify({
requestResourcePath: requestUri.path
})
});
resolveContent(fileService, redirectedUri, getMimeType(requestUri), callback);
return;
}
const requestPath = URI.parse(request.url).path;
const normalizedPath = URI.file(requestPath);
for (const root of getRoots()) {
if (startsWith(normalizedPath.fsPath, root.fsPath + nativeSep)) {
fileService.resolveContent(normalizedPath, { encoding: 'binary' }).then(contents => {
const mime = getMimeType(normalizedPath);
callback({
data: Buffer.from(contents.value, contents.encoding),
mimeType: mime
});
}, () => {
callback({ error: -2 /* FAILED: https://cs.chromium.org/chromium/src/net/base/net_error_list.h */ });
});
resolveContent(fileService, normalizedPath, getMimeType(normalizedPath), callback);
return;
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册