From f1dc8d3d03274e230f0683f4e052d8a4afc98c71 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 18 Mar 2025 09:05:31 +0100 Subject: [PATCH] LEAKED DISPOSABLE in mainThreadUrl (fix #243837) (#243838) * LEAKED DISPOSABLE in mainThreadUrl (fix #243837) * style --- .../workbench/api/browser/mainThreadUrls.ts | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadUrls.ts b/src/vs/workbench/api/browser/mainThreadUrls.ts index d0bf2f4e746..b79155fb8d6 100644 --- a/src/vs/workbench/api/browser/mainThreadUrls.ts +++ b/src/vs/workbench/api/browser/mainThreadUrls.ts @@ -7,7 +7,7 @@ import { ExtHostContext, MainContext, MainThreadUrlsShape, ExtHostUrlsShape } fr import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers.js'; import { IURLService, IOpenURLOptions } from '../../../platform/url/common/url.js'; import { URI, UriComponents } from '../../../base/common/uri.js'; -import { IDisposable } from '../../../base/common/lifecycle.js'; +import { Disposable, IDisposable } from '../../../base/common/lifecycle.js'; import { IExtensionContributedURLHandler, IExtensionUrlHandler } from '../../services/extensions/browser/extensionUrlHandler.js'; import { ExtensionIdentifier } from '../../../platform/extensions/common/extensions.js'; import { ITrustedDomainService } from '../../contrib/url/browser/trustedDomainService.js'; @@ -24,20 +24,21 @@ class ExtensionUrlHandler implements IExtensionContributedURLHandler { readonly extensionDisplayName: string ) { } - handleURL(uri: URI, options?: IOpenURLOptions): Promise { + async handleURL(uri: URI, options?: IOpenURLOptions): Promise { if (!ExtensionIdentifier.equals(this.extensionId, uri.authority)) { - return Promise.resolve(false); + return false; } - return Promise.resolve(this.proxy.$handleExternalUri(this.handle, uri)).then(() => true); + await this.proxy.$handleExternalUri(this.handle, uri); + return true; } } @extHostNamedCustomer(MainContext.MainThreadUrls) -export class MainThreadUrls implements MainThreadUrlsShape { +export class MainThreadUrls extends Disposable implements MainThreadUrlsShape { private readonly proxy: ExtHostUrlsShape; - private handlers = new Map(); + private readonly handlers = new Map(); constructor( context: IExtHostContext, @@ -47,26 +48,28 @@ export class MainThreadUrls implements MainThreadUrlsShape { @IWebContentExtractorService private readonly webContentExtractorService: IWebContentExtractorService, @IExtensionUrlHandler private readonly extensionUrlHandler: IExtensionUrlHandler ) { + super(); + this.proxy = context.getProxy(ExtHostContext.ExtHostUrls); - trustedDomainService.onDidChangeTrustedDomains(() => this.handleTrustedDomainsChange()); + this._register(trustedDomainService.onDidChangeTrustedDomains(() => this.handleTrustedDomainsChange())); void this.handleTrustedDomainsChange(); } - $registerUriHandler(handle: number, extensionId: ExtensionIdentifier, extensionDisplayName: string): Promise { + async $registerUriHandler(handle: number, extensionId: ExtensionIdentifier, extensionDisplayName: string): Promise { const handler = new ExtensionUrlHandler(this.proxy, handle, extensionId, extensionDisplayName); const disposable = this.urlService.registerHandler(handler); this.handlers.set(handle, { extensionId, disposable }); this.extensionUrlHandler.registerExtensionHandler(extensionId, handler); - return Promise.resolve(undefined); + return undefined; } - $unregisterUriHandler(handle: number): Promise { + async $unregisterUriHandler(handle: number): Promise { const tuple = this.handlers.get(handle); if (!tuple) { - return Promise.resolve(undefined); + return undefined; } const { extensionId, disposable } = tuple; @@ -75,7 +78,7 @@ export class MainThreadUrls implements MainThreadUrlsShape { this.handlers.delete(handle); disposable.dispose(); - return Promise.resolve(undefined); + return undefined; } async $createAppUri(uri: UriComponents): Promise { @@ -92,7 +95,9 @@ export class MainThreadUrls implements MainThreadUrlsShape { return extractedUris; } - dispose(): void { + override dispose(): void { + super.dispose(); + this.handlers.forEach(({ disposable }) => disposable.dispose()); this.handlers.clear(); }