diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalProtocolLinkProvider.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalProtocolLinkProvider.ts index 720ebcd3b617e3d6946748d58c527e325ea31a85..f54cd67b153783ff848cfc2c8c0fc886d9181cfc 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalProtocolLinkProvider.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalProtocolLinkProvider.ts @@ -15,6 +15,7 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; +import { Schemas } from 'vs/base/common/network'; export class TerminalProtocolLinkProvider extends TerminalBaseLinkProvider { private _linkComputerTarget: ILinkComputerTarget | undefined; @@ -68,8 +69,26 @@ export class TerminalProtocolLinkProvider extends TerminalBaseLinkProvider { continue; } + const linkText = link.url?.toString() || ''; + + // Handle http links + if (uri.scheme !== Schemas.file) { + result.push(this._instantiationService.createInstance(TerminalLink, + this._xterm, + bufferRange, + linkText, + this._xterm.buffer.active.viewportY, + this._activateCallback, + this._tooltipCallback, + true, + undefined + )); + continue; + } + + // Handle files and folders const validatedLink = await new Promise(r => { - this._validationCallback(uri.fsPath, (result) => { + this._validationCallback(linkText, (result) => { if (result) { const label = result.isDirectory ? (this._isDirectoryInsideWorkspace(result.uri) ? FOLDER_IN_WORKSPACE_LABEL : FOLDER_NOT_IN_WORKSPACE_LABEL) @@ -78,14 +97,14 @@ export class TerminalProtocolLinkProvider extends TerminalBaseLinkProvider { if (result.isDirectory) { this._handleLocalFolderLink(result.uri); } else { - this._activateCallback(event, result.uri.path); + this._activateCallback(event, linkText); } }); r(this._instantiationService.createInstance( TerminalLink, this._xterm, bufferRange, - uri.fsPath, + linkText, this._xterm.buffer.active.viewportY, activateCallback, this._tooltipCallback, diff --git a/src/vs/workbench/contrib/terminal/test/browser/links/terminalProtocolLinkProvider.test.ts b/src/vs/workbench/contrib/terminal/test/browser/links/terminalProtocolLinkProvider.test.ts index a4baaee003c2eac7019dc82026eef98e17431056..2f80b63cd796270899aa7ae33492f02cb64dd54a 100644 --- a/src/vs/workbench/contrib/terminal/test/browser/links/terminalProtocolLinkProvider.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/links/terminalProtocolLinkProvider.test.ts @@ -9,8 +9,9 @@ import { Terminal, ILink } from 'xterm'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { URI } from 'vs/base/common/uri'; -suite('Workbench - TerminalWebLinkProvider', () => { +suite('Workbench - TerminalProtocolLinkProvider', () => { let instantiationService: TestInstantiationService; setup(() => { @@ -20,7 +21,9 @@ suite('Workbench - TerminalWebLinkProvider', () => { async function assertLink(text: string, expected: { text: string, range: [number, number][] }[]) { const xterm = new Terminal(); - const provider = instantiationService.createInstance(TerminalProtocolLinkProvider, xterm, () => { }, () => { }); + const provider = instantiationService.createInstance(TerminalProtocolLinkProvider, xterm, () => { }, () => { }, () => { }, (text: string, cb: (result: { uri: URI, isDirectory: boolean } | undefined) => void) => { + cb({ uri: URI.parse(text), isDirectory: false }); + }); // Write the text and wait for the parser to finish await new Promise(r => xterm.write(text, r));