diff --git a/src/vs/platform/remote/common/tunnel.ts b/src/vs/platform/remote/common/tunnel.ts index bd67538ee5f..4daacbb9112 100644 --- a/src/vs/platform/remote/common/tunnel.ts +++ b/src/vs/platform/remote/common/tunnel.ts @@ -87,6 +87,7 @@ export interface ITunnelService { readonly onTunnelClosed: Event<{ host: string, port: number; }>; readonly canElevate: boolean; readonly hasTunnelProvider: boolean; + readonly onAddedTunnelProvider: Event; canTunnel(uri: URI): boolean; openTunnel(addressProvider: IAddressProvider | undefined, remoteHost: string | undefined, remotePort: number, localPort?: number, elevateIfNeeded?: boolean, isPublic?: boolean): Promise | undefined; @@ -133,6 +134,8 @@ export abstract class AbstractTunnelService implements ITunnelService { public onTunnelOpened: Event = this._onTunnelOpened.event; private _onTunnelClosed: Emitter<{ host: string, port: number; }> = new Emitter(); public onTunnelClosed: Event<{ host: string, port: number; }> = this._onTunnelClosed.event; + private _onAddedTunnelProvider: Emitter = new Emitter(); + public onAddedTunnelProvider: Event = this._onAddedTunnelProvider.event; protected readonly _tunnels = new Map; }>>(); protected _tunnelProvider: ITunnelProvider | undefined; protected _canElevate: boolean = false; @@ -152,12 +155,14 @@ export abstract class AbstractTunnelService implements ITunnelService { // clear features this._canElevate = false; this._canMakePublic = false; + this._onAddedTunnelProvider.fire(); return { dispose: () => { } }; } this._canElevate = features.elevation; this._canMakePublic = features.public; + this._onAddedTunnelProvider.fire(); return { dispose: () => { this._tunnelProvider = undefined; diff --git a/src/vs/workbench/api/browser/mainThreadTunnelService.ts b/src/vs/workbench/api/browser/mainThreadTunnelService.ts index 6fc537aa2a9..165a71b5e36 100644 --- a/src/vs/workbench/api/browser/mainThreadTunnelService.ts +++ b/src/vs/workbench/api/browser/mainThreadTunnelService.ts @@ -57,6 +57,9 @@ export class MainThreadTunnelService extends Disposable implements MainThreadTun return this._proxy.$registerCandidateFinder(this.processFindingEnabled()); } })); + this._register(this.tunnelService.onAddedTunnelProvider(() => { + return this._proxy.$registerCandidateFinder(this.processFindingEnabled()); + })); } private _alreadyRegistered: boolean = false; diff --git a/src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts b/src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts index 4f84e7b6ea4..b0a3ecc756f 100644 --- a/src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts +++ b/src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts @@ -274,6 +274,7 @@ class SimpleTunnelService implements ITunnelService { canMakePublic = false; onTunnelOpened = Event.None; onTunnelClosed = Event.None; + onAddedTunnelProvider = Event.None; hasTunnelProvider = false; canTunnel(uri: URI): boolean { return false; }