avoid content override when updating local resource roots.
This commit is contained in:
parent
7e407b5472
commit
8687508aa6
5 changed files with 60 additions and 16 deletions
|
@ -24,6 +24,11 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/
|
|||
import { dirname } from 'vs/base/common/resources';
|
||||
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
|
||||
|
||||
export interface WebviewIntialized {
|
||||
__vscode_notebook_message: boolean;
|
||||
type: 'initialized'
|
||||
}
|
||||
|
||||
export interface IDimensionMessage {
|
||||
__vscode_notebook_message: boolean;
|
||||
type: 'dimension';
|
||||
|
@ -107,6 +112,7 @@ export interface IScrollRequestMessage {
|
|||
export interface IUpdatePreloadResourceMessage {
|
||||
type: 'preload';
|
||||
resources: string[];
|
||||
source: string;
|
||||
}
|
||||
|
||||
interface ICachedInset {
|
||||
|
@ -124,7 +130,7 @@ function html(strings: TemplateStringsArray, ...values: any[]): string {
|
|||
return str;
|
||||
}
|
||||
|
||||
type IMessage = IDimensionMessage | IScrollAckMessage | IWheelMessage | IMouseEnterMessage | IMouseLeaveMessage | IBlurOutputMessage;
|
||||
type IMessage = IDimensionMessage | IScrollAckMessage | IWheelMessage | IMouseEnterMessage | IMouseLeaveMessage | IBlurOutputMessage | WebviewIntialized;
|
||||
|
||||
let version = 0;
|
||||
export class BackLayerWebView extends Disposable {
|
||||
|
@ -134,12 +140,12 @@ export class BackLayerWebView extends Disposable {
|
|||
hiddenInsetMapping: Set<IOutput> = new Set();
|
||||
reversedInsetMapping: Map<string, IOutput> = new Map();
|
||||
preloadsCache: Map<string, boolean> = new Map();
|
||||
kernelPreloadsCache: Map<string, boolean> = new Map();
|
||||
localResourceRootsCache: URI[] | undefined = undefined;
|
||||
rendererRootsCache: URI[] = [];
|
||||
kernelRootsCache: URI[] = [];
|
||||
private readonly _onMessage = this._register(new Emitter<any>());
|
||||
public readonly onMessage: Event<any> = this._onMessage.event;
|
||||
private _loaded!: Promise<void>;
|
||||
private _initalized: Promise<void>;
|
||||
private _disposed = false;
|
||||
|
||||
|
@ -473,6 +479,11 @@ ${loaderJs}
|
|||
}
|
||||
}
|
||||
});
|
||||
|
||||
vscode.postMessage({
|
||||
__vscode_notebook_message: true,
|
||||
type: 'initialized'
|
||||
});
|
||||
}());
|
||||
|
||||
</script>
|
||||
|
@ -584,6 +595,19 @@ ${loaderJs}
|
|||
allowScripts: true,
|
||||
localResourceRoots: this.localResourceRootsCache
|
||||
}, 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;
|
||||
return webview;
|
||||
}
|
||||
|
@ -744,11 +768,13 @@ ${loaderJs}
|
|||
}, 50);
|
||||
}
|
||||
|
||||
updateKernelPreloads(extensionLocations: URI[], preloads: URI[]) {
|
||||
async updateKernelPreloads(extensionLocations: URI[], preloads: URI[]) {
|
||||
if (this._disposed) {
|
||||
return;
|
||||
}
|
||||
|
||||
await this._loaded;
|
||||
|
||||
let resources: string[] = [];
|
||||
preloads = preloads.map(preload => {
|
||||
if (this.environmentService.isExtensionDevelopment && (preload.scheme === 'http' || preload.scheme === 'https')) {
|
||||
|
@ -758,9 +784,9 @@ ${loaderJs}
|
|||
});
|
||||
|
||||
preloads.forEach(e => {
|
||||
if (!this.kernelPreloadsCache.has(e.toString())) {
|
||||
if (!this.preloadsCache.has(e.toString())) {
|
||||
resources.push(e.toString());
|
||||
this.kernelPreloadsCache.set(e.toString(), true);
|
||||
this.preloadsCache.set(e.toString(), true);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -769,14 +795,16 @@ ${loaderJs}
|
|||
}
|
||||
|
||||
this.kernelRootsCache = [...extensionLocations, ...this.kernelRootsCache];
|
||||
this._updatePreloads(resources);
|
||||
this._updatePreloads(resources, 'kernel');
|
||||
}
|
||||
|
||||
updateRendererPreloads(preloads: ReadonlySet<number>) {
|
||||
async updateRendererPreloads(preloads: ReadonlySet<number>) {
|
||||
if (this._disposed) {
|
||||
return;
|
||||
}
|
||||
|
||||
await this._loaded;
|
||||
|
||||
let resources: string[] = [];
|
||||
let extensionLocations: URI[] = [];
|
||||
preloads.forEach(preload => {
|
||||
|
@ -799,23 +827,23 @@ ${loaderJs}
|
|||
}
|
||||
});
|
||||
|
||||
this.rendererRootsCache = extensionLocations;
|
||||
this._updatePreloads(resources);
|
||||
if (!resources.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
private _updatePreloads(resources: string[]) {
|
||||
this.rendererRootsCache = extensionLocations;
|
||||
this._updatePreloads(resources, 'renderer');
|
||||
}
|
||||
|
||||
private _updatePreloads(resources: string[], source: string) {
|
||||
const mixedResourceRoots = [...(this.localResourceRootsCache || []), ...this.rendererRootsCache, ...this.kernelRootsCache];
|
||||
|
||||
this.webview.contentOptions = {
|
||||
allowMultipleAPIAcquire: true,
|
||||
allowScripts: true,
|
||||
enableCommandUris: true,
|
||||
localResourceRoots: mixedResourceRoots
|
||||
};
|
||||
this.webview.localResourcesRoot = mixedResourceRoots;
|
||||
|
||||
let message: IUpdatePreloadResourceMessage = {
|
||||
type: 'preload',
|
||||
resources: resources
|
||||
resources: resources,
|
||||
source: source
|
||||
};
|
||||
|
||||
this.webview.sendMessage(message);
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
import { addClass } from 'vs/base/browser/dom';
|
||||
import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent';
|
||||
import { Emitter } from 'vs/base/common/event';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
|
||||
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
|
||||
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
|
||||
|
@ -248,6 +249,10 @@ export abstract class BaseWebview<T extends HTMLElement> extends Disposable {
|
|||
this.doUpdateContent();
|
||||
}
|
||||
|
||||
public set localResourcesRoot(resources: URI[]) {
|
||||
/** no op */
|
||||
}
|
||||
|
||||
public set state(state: string | undefined) {
|
||||
this.content = {
|
||||
html: this.content.html,
|
||||
|
|
|
@ -7,6 +7,7 @@ import { Dimension } from 'vs/base/browser/dom';
|
|||
import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent';
|
||||
import { memoize } from 'vs/base/common/decorators';
|
||||
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 { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
|
||||
|
@ -174,6 +175,10 @@ export class DynamicWebviewEditorOverlay extends Disposable implements WebviewOv
|
|||
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>());
|
||||
public readonly onDidFocus: Event<void> = this._onDidFocus.event;
|
||||
|
||||
|
|
|
@ -76,6 +76,7 @@ export interface WebviewExtensionDescription {
|
|||
export interface Webview extends IDisposable {
|
||||
html: string;
|
||||
contentOptions: WebviewContentOptions;
|
||||
localResourcesRoot: URI[];
|
||||
extension: WebviewExtensionDescription | undefined;
|
||||
initialScrollProgress: number;
|
||||
state: string | undefined;
|
||||
|
|
|
@ -380,6 +380,11 @@ export class ElectronWebviewBasedWebview extends BaseWebview<WebviewTag> impleme
|
|||
super.contentOptions = options;
|
||||
}
|
||||
|
||||
public set localResourcesRoot(resources: URI[]) {
|
||||
this._protocolProvider.update(resources || []);
|
||||
super.localResourcesRoot = resources;
|
||||
}
|
||||
|
||||
protected readonly extraContentOptions = {};
|
||||
|
||||
public set html(value: string) {
|
||||
|
|
Loading…
Reference in a new issue