diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 049b91e0e7ab85104a19cef4ac132d044a92724d..e831ce0f82573231491e66b4316c192355e7a401 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -23,6 +23,7 @@ const isSafari = navigator.vendor && navigator.vendor.indexOf('Apple') > -1 && const searchParams = new URL(location.toString()).searchParams; const ID = searchParams.get('id'); +const isUsingWebviewTag = searchParams.has('isUsingWebviewTag'); /** * Use polling to track focus of main webview and iframes within the webview @@ -188,34 +189,36 @@ function getVsCodeApiScript(allowMultipleAPIAcquire, useParentPostMessage, state delete window.top; delete window.frameElement; - // Try to block webviews from cancelling unloads. - // This blocking is not perfect but should block common patterns - (function() { - const createUnloadEventProxy = (e) => { - return new Proxy(e, { - set: (target, prop, receiver) => { - if (prop === 'returnValue') { - // Don't allow setting return value to block window unload - return; + if (!${isUsingWebviewTag}) { + // Try to block webviews from cancelling unloads. + // This blocking is not perfect but should block common patterns + (function() { + const createUnloadEventProxy = (e) => { + return new Proxy(e, { + set: (target, prop, receiver) => { + if (prop === 'returnValue') { + // Don't allow setting return value to block window unload + return; + } + target[prop] = value; } - target[prop] = value; + }); + }; + + Object.defineProperty(window, 'onbeforeunload', { value: null, writable: false }); + + const originalAddEventListener = window.addEventListener.bind(window); + window.addEventListener = (type, listener, ...args) => { + if (type === 'beforeunload') { + return originalAddEventListener(type, (e) => { + return createUnloadEventProxy(listener); + }, ...args); + } else { + return originalAddEventListener(type, listener, ...args); } - }); - }; - - Object.defineProperty(window, 'onbeforeunload', { value: null, writable: false }); - - const originalAddEventListener = window.addEventListener.bind(window); - window.addEventListener = (type, listener, ...args) => { - if (type === 'beforeunload') { - return originalAddEventListener(type, (e) => { - return createUnloadEventProxy(listener); - }, ...args); - } else { - return originalAddEventListener(type, listener, ...args); } - } - })(); + })(); + } `; } diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts index bb1ec9cf3583393bbf29a862ccd8f65d84155cf9..8a97965216ca03f63708ea7ef45cda3b7a00b193 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts @@ -156,7 +156,7 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme // and not the `vscode-file` URI because preload scripts are loaded // via node.js from the main side and only allow `file:` protocol this.element!.preload = FileAccess.asFileUri('./pre/electron-index.js', require).toString(true); - this.element!.src = `${Schemas.vscodeWebview}://${this.id}/electron-browser-index.html?platform=electron&id=${this.id}&vscode-resource-origin=${encodeURIComponent(this.webviewResourceEndpoint)}`; + this.element!.src = `${Schemas.vscodeWebview}://${this.id}/electron-browser-index.html?platform=electron&isUsingWebviewTag=true&id=${this.id}&vscode-resource-origin=${encodeURIComponent(this.webviewResourceEndpoint)}`; } protected createElement(options: WebviewOptions) {