diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts index c7394ab1ca58e045d38e319dd94f1e00a42c0872..7e99796e6b911042257d773ef6ee452b91a65b5d 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts @@ -322,7 +322,6 @@ export class BackLayerWebView extends Disposable { self.require = {}; ${coreDependencies} -
diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts index e10d6700a059d55666ed51cab303e4aa6688e1bf..4036c51282d1a8fecd530c106c7e4ed62a14d52d 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts @@ -12,7 +12,13 @@ import { RenderOutputType } from 'vs/workbench/contrib/notebook/common/notebookC // function. Imports are not allowed. This is stringifies and injected into // the webview. -declare const acquireVsCodeApi: () => ({ getState(): { [key: string]: unknown; }, setState(data: { [key: string]: unknown; }): void, postMessage: (msg: unknown) => void; }); +declare module globalThis { + const acquireVsCodeApi: () => ({ + getState(): { [key: string]: unknown; }; + setState(data: { [key: string]: unknown; }): void; + postMessage: (msg: unknown) => void; + }); +} declare class ResizeObserver { constructor(onChange: (entries: { target: HTMLElement, contentRect?: ClientRect; }[]) => void); @@ -30,7 +36,9 @@ interface EmitterLike { } function webviewPreloads() { + const acquireVsCodeApi = globalThis.acquireVsCodeApi; const vscode = acquireVsCodeApi(); + delete (globalThis as any).acquireVsCodeApi; const handleInnerClick = (event: MouseEvent) => { if (!event || !event.view || !event.view.document) { @@ -93,6 +101,18 @@ function webviewPreloads() { } }; + const runScript = async (url: string, originalUri: string, globals: { [name: string]: unknown } = {}): Promise => { + const res = await fetch(url); + const text = await res.text(); + if (!res.ok) { + throw new Error(`Unexpected ${res.status} requesting ${originalUri}: ${text || res.statusText}`); + } + + const args = Object.entries(globals); + new Function(...args.map(([k]) => k), text)(...args.map(([, v]) => v)); + return undefined; + }; + const outputObservers = new Map(); const resizeObserve = (container: Element, id: string) => { @@ -477,17 +497,11 @@ function webviewPreloads() { break; case 'preload': const resources = event.data.resources; - const preloadsContainer = document.getElementById('__vscode_preloads')!; - for (let i = 0; i < resources.length; i++) { - const { uri, originalUri } = resources[i]; - const scriptTag = document.createElement('script'); - scriptTag.setAttribute('src', uri); - preloadsContainer.appendChild(scriptTag); - preloadPromises.set(uri, new Promise(resolve => { - scriptTag.addEventListener('load', () => resolve(undefined)); - scriptTag.addEventListener('error', () => - resolve(`Network error loading ${originalUri}, does the path exist?`) - ); + const globals = event.data.type === 'preload' ? { acquireVsCodeApi } : {}; + for (const { uri, originalUri } of resources) { + preloadPromises.set(uri, runScript(uri, originalUri, globals).catch(err => { + console.error(err); + return err.message || String(err); })); } break; diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 690c6855605b75031e06bc98b7aa170842d98aba..0f0773fce5ae5137cfd8efa71a489cde0c456301 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -143,7 +143,7 @@ function getVsCodeApiScript(allowMultipleAPIAcquire, state) { const encodedState = state ? encodeURIComponent(state) : undefined; return ` - const acquireVsCodeApi = (function() { + globalThis.acquireVsCodeApi = (function() { const originalPostMessage = window.parent.postMessage.bind(window.parent); const targetOrigin = '*'; let acquired = false;