提交 8687508a 编写于 作者: R rebornix

avoid content override when updating local resource roots.

上级 7e407b54
...@@ -24,6 +24,11 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ ...@@ -24,6 +24,11 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/
import { dirname } from 'vs/base/common/resources'; import { dirname } from 'vs/base/common/resources';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
export interface WebviewIntialized {
__vscode_notebook_message: boolean;
type: 'initialized'
}
export interface IDimensionMessage { export interface IDimensionMessage {
__vscode_notebook_message: boolean; __vscode_notebook_message: boolean;
type: 'dimension'; type: 'dimension';
...@@ -107,6 +112,7 @@ export interface IScrollRequestMessage { ...@@ -107,6 +112,7 @@ export interface IScrollRequestMessage {
export interface IUpdatePreloadResourceMessage { export interface IUpdatePreloadResourceMessage {
type: 'preload'; type: 'preload';
resources: string[]; resources: string[];
source: string;
} }
interface ICachedInset { interface ICachedInset {
...@@ -124,7 +130,7 @@ function html(strings: TemplateStringsArray, ...values: any[]): string { ...@@ -124,7 +130,7 @@ function html(strings: TemplateStringsArray, ...values: any[]): string {
return str; return str;
} }
type IMessage = IDimensionMessage | IScrollAckMessage | IWheelMessage | IMouseEnterMessage | IMouseLeaveMessage | IBlurOutputMessage; type IMessage = IDimensionMessage | IScrollAckMessage | IWheelMessage | IMouseEnterMessage | IMouseLeaveMessage | IBlurOutputMessage | WebviewIntialized;
let version = 0; let version = 0;
export class BackLayerWebView extends Disposable { export class BackLayerWebView extends Disposable {
...@@ -134,12 +140,12 @@ export class BackLayerWebView extends Disposable { ...@@ -134,12 +140,12 @@ export class BackLayerWebView extends Disposable {
hiddenInsetMapping: Set<IOutput> = new Set(); hiddenInsetMapping: Set<IOutput> = new Set();
reversedInsetMapping: Map<string, IOutput> = new Map(); reversedInsetMapping: Map<string, IOutput> = new Map();
preloadsCache: Map<string, boolean> = new Map(); preloadsCache: Map<string, boolean> = new Map();
kernelPreloadsCache: Map<string, boolean> = new Map();
localResourceRootsCache: URI[] | undefined = undefined; localResourceRootsCache: URI[] | undefined = undefined;
rendererRootsCache: URI[] = []; rendererRootsCache: URI[] = [];
kernelRootsCache: URI[] = []; kernelRootsCache: URI[] = [];
private readonly _onMessage = this._register(new Emitter<any>()); private readonly _onMessage = this._register(new Emitter<any>());
public readonly onMessage: Event<any> = this._onMessage.event; public readonly onMessage: Event<any> = this._onMessage.event;
private _loaded!: Promise<void>;
private _initalized: Promise<void>; private _initalized: Promise<void>;
private _disposed = false; private _disposed = false;
...@@ -473,6 +479,11 @@ ${loaderJs} ...@@ -473,6 +479,11 @@ ${loaderJs}
} }
} }
}); });
vscode.postMessage({
__vscode_notebook_message: true,
type: 'initialized'
});
}()); }());
</script> </script>
...@@ -584,6 +595,19 @@ ${loaderJs} ...@@ -584,6 +595,19 @@ ${loaderJs}
allowScripts: true, allowScripts: true,
localResourceRoots: this.localResourceRootsCache localResourceRoots: this.localResourceRootsCache
}, undefined); }, undefined);
let resolveFunc: () => void;
this._loaded = new Promise<void>((resolve, reject) => {
resolveFunc = resolve;
});
let dispose = webview.onMessage((data: IMessage) => {
if (data.__vscode_notebook_message && data.type === 'initialized') {
resolveFunc();
dispose.dispose();
}
});
webview.html = content; webview.html = content;
return webview; return webview;
} }
...@@ -744,11 +768,13 @@ ${loaderJs} ...@@ -744,11 +768,13 @@ ${loaderJs}
}, 50); }, 50);
} }
updateKernelPreloads(extensionLocations: URI[], preloads: URI[]) { async updateKernelPreloads(extensionLocations: URI[], preloads: URI[]) {
if (this._disposed) { if (this._disposed) {
return; return;
} }
await this._loaded;
let resources: string[] = []; let resources: string[] = [];
preloads = preloads.map(preload => { preloads = preloads.map(preload => {
if (this.environmentService.isExtensionDevelopment && (preload.scheme === 'http' || preload.scheme === 'https')) { if (this.environmentService.isExtensionDevelopment && (preload.scheme === 'http' || preload.scheme === 'https')) {
...@@ -758,9 +784,9 @@ ${loaderJs} ...@@ -758,9 +784,9 @@ ${loaderJs}
}); });
preloads.forEach(e => { preloads.forEach(e => {
if (!this.kernelPreloadsCache.has(e.toString())) { if (!this.preloadsCache.has(e.toString())) {
resources.push(e.toString()); resources.push(e.toString());
this.kernelPreloadsCache.set(e.toString(), true); this.preloadsCache.set(e.toString(), true);
} }
}); });
...@@ -769,14 +795,16 @@ ${loaderJs} ...@@ -769,14 +795,16 @@ ${loaderJs}
} }
this.kernelRootsCache = [...extensionLocations, ...this.kernelRootsCache]; this.kernelRootsCache = [...extensionLocations, ...this.kernelRootsCache];
this._updatePreloads(resources); this._updatePreloads(resources, 'kernel');
} }
updateRendererPreloads(preloads: ReadonlySet<number>) { async updateRendererPreloads(preloads: ReadonlySet<number>) {
if (this._disposed) { if (this._disposed) {
return; return;
} }
await this._loaded;
let resources: string[] = []; let resources: string[] = [];
let extensionLocations: URI[] = []; let extensionLocations: URI[] = [];
preloads.forEach(preload => { preloads.forEach(preload => {
...@@ -799,23 +827,23 @@ ${loaderJs} ...@@ -799,23 +827,23 @@ ${loaderJs}
} }
}); });
if (!resources.length) {
return;
}
this.rendererRootsCache = extensionLocations; this.rendererRootsCache = extensionLocations;
this._updatePreloads(resources); this._updatePreloads(resources, 'renderer');
} }
private _updatePreloads(resources: string[]) { private _updatePreloads(resources: string[], source: string) {
const mixedResourceRoots = [...(this.localResourceRootsCache || []), ...this.rendererRootsCache, ...this.kernelRootsCache]; const mixedResourceRoots = [...(this.localResourceRootsCache || []), ...this.rendererRootsCache, ...this.kernelRootsCache];
this.webview.contentOptions = { this.webview.localResourcesRoot = mixedResourceRoots;
allowMultipleAPIAcquire: true,
allowScripts: true,
enableCommandUris: true,
localResourceRoots: mixedResourceRoots
};
let message: IUpdatePreloadResourceMessage = { let message: IUpdatePreloadResourceMessage = {
type: 'preload', type: 'preload',
resources: resources resources: resources,
source: source
}; };
this.webview.sendMessage(message); this.webview.sendMessage(message);
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
import { addClass } from 'vs/base/browser/dom'; import { addClass } from 'vs/base/browser/dom';
import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent';
import { Emitter } from 'vs/base/common/event'; import { Emitter } from 'vs/base/common/event';
import { URI } from 'vs/base/common/uri';
import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
...@@ -248,6 +249,10 @@ export abstract class BaseWebview<T extends HTMLElement> extends Disposable { ...@@ -248,6 +249,10 @@ export abstract class BaseWebview<T extends HTMLElement> extends Disposable {
this.doUpdateContent(); this.doUpdateContent();
} }
public set localResourcesRoot(resources: URI[]) {
/** no op */
}
public set state(state: string | undefined) { public set state(state: string | undefined) {
this.content = { this.content = {
html: this.content.html, html: this.content.html,
......
...@@ -7,6 +7,7 @@ import { Dimension } from 'vs/base/browser/dom'; ...@@ -7,6 +7,7 @@ import { Dimension } from 'vs/base/browser/dom';
import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent';
import { memoize } from 'vs/base/common/decorators'; import { memoize } from 'vs/base/common/decorators';
import { Emitter, Event } from 'vs/base/common/event'; import { Emitter, Event } from 'vs/base/common/event';
import { URI } from 'vs/base/common/uri';
import { Disposable, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; import { Disposable, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle';
import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
...@@ -174,6 +175,10 @@ export class DynamicWebviewEditorOverlay extends Disposable implements WebviewOv ...@@ -174,6 +175,10 @@ export class DynamicWebviewEditorOverlay extends Disposable implements WebviewOv
this.withWebview(webview => webview.contentOptions = value); this.withWebview(webview => webview.contentOptions = value);
} }
public set localResourcesRoot(resources: URI[]) {
this.withWebview(webview => webview.localResourcesRoot = resources);
}
private readonly _onDidFocus = this._register(new Emitter<void>()); private readonly _onDidFocus = this._register(new Emitter<void>());
public readonly onDidFocus: Event<void> = this._onDidFocus.event; public readonly onDidFocus: Event<void> = this._onDidFocus.event;
......
...@@ -76,6 +76,7 @@ export interface WebviewExtensionDescription { ...@@ -76,6 +76,7 @@ export interface WebviewExtensionDescription {
export interface Webview extends IDisposable { export interface Webview extends IDisposable {
html: string; html: string;
contentOptions: WebviewContentOptions; contentOptions: WebviewContentOptions;
localResourcesRoot: URI[];
extension: WebviewExtensionDescription | undefined; extension: WebviewExtensionDescription | undefined;
initialScrollProgress: number; initialScrollProgress: number;
state: string | undefined; state: string | undefined;
......
...@@ -380,6 +380,11 @@ export class ElectronWebviewBasedWebview extends BaseWebview<WebviewTag> impleme ...@@ -380,6 +380,11 @@ export class ElectronWebviewBasedWebview extends BaseWebview<WebviewTag> impleme
super.contentOptions = options; super.contentOptions = options;
} }
public set localResourcesRoot(resources: URI[]) {
this._protocolProvider.update(resources || []);
super.localResourcesRoot = resources;
}
protected readonly extraContentOptions = {}; protected readonly extraContentOptions = {};
public set html(value: string) { public set html(value: string) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册