Skip to content

Commit 8c4e220

Browse files
committed
Fixing some possible leaks in electron webviews
For microsoft#50556
1 parent 9016354 commit 8c4e220

2 files changed

Lines changed: 9 additions & 11 deletions

File tree

src/vs/workbench/contrib/webview/browser/webviewEditor.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ export class WebviewEditor extends BaseEditor {
132132
public clearInput() {
133133
if (this.input && this.input instanceof WebviewInput) {
134134
this.input.webview.release(this);
135+
this._webviewFocusTrackerDisposables.clear();
135136
}
136137

137138
super.clearInput();

src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { FindInPageOptions, OnBeforeRequestDetails, OnHeadersReceivedDetails, Re
77
import { addClass, addDisposableListener } from 'vs/base/browser/dom';
88
import { Emitter, Event } from 'vs/base/common/event';
99
import { once } from 'vs/base/common/functional';
10-
import { Disposable } from 'vs/base/common/lifecycle';
10+
import { Disposable, toDisposable } from 'vs/base/common/lifecycle';
1111
import { isMacintosh } from 'vs/base/common/platform';
1212
import { URI } from 'vs/base/common/uri';
1313
import * as modes from 'vs/editor/common/modes';
@@ -53,6 +53,9 @@ class WebviewTagHandle extends Disposable {
5353
const contents = this.webContents;
5454
if (contents) {
5555
this._onFirstLoad.fire(contents);
56+
this._register(toDisposable(() => {
57+
contents.removeAllListeners();
58+
}));
5659
}
5760
})));
5861
}
@@ -70,7 +73,6 @@ class WebviewTagHandle extends Disposable {
7073
this._webContents = this.webview.getWebContents();
7174
return this._webContents;
7275
}
73-
7476
}
7577

7678
type OnBeforeRequestDelegate = (details: OnBeforeRequestDetails) => Promise<Response | undefined>;
@@ -143,19 +145,17 @@ class WebviewProtocolProvider extends Disposable {
143145

144146
class WebviewPortMappingProvider extends Disposable {
145147

146-
private readonly _manager: WebviewPortMappingManager;
147-
148148
constructor(
149149
session: WebviewSession,
150150
getExtensionLocation: () => URI | undefined,
151151
mappings: () => ReadonlyArray<modes.IWebviewPortMapping>,
152152
tunnelService: ITunnelService,
153153
) {
154154
super();
155-
this._manager = this._register(new WebviewPortMappingManager(getExtensionLocation, mappings, tunnelService));
155+
const manager = this._register(new WebviewPortMappingManager(getExtensionLocation, mappings, tunnelService));
156156

157157
session.onBeforeRequest(async details => {
158-
const redirect = await this._manager.getRedirect(details.url);
158+
const redirect = await manager.getRedirect(details.url);
159159
return redirect ? { redirectURL: redirect } : undefined;
160160
});
161161
}
@@ -290,8 +290,7 @@ export class ElectronWebviewBasedWebview extends Disposable implements Webview,
290290
}));
291291
});
292292

293-
const webviewAndContents = new WebviewTagHandle(this._webview);
294-
293+
const webviewAndContents = this._register(new WebviewTagHandle(this._webview));
295294
const session = this._register(new WebviewSession(webviewAndContents));
296295

297296
this._register(new WebviewProtocolProvider(
@@ -421,9 +420,7 @@ export class ElectronWebviewBasedWebview extends Disposable implements Webview,
421420

422421
dispose(): void {
423422
if (this._webview) {
424-
if (this._webview.parentElement) {
425-
this._webview.parentElement.removeChild(this._webview);
426-
}
423+
this._webview.remove();
427424
this._webview = undefined;
428425
}
429426

0 commit comments

Comments
 (0)