From 856666d5bdc003c467384c5e4f25efab5ae2469a Mon Sep 17 00:00:00 2001 From: Szymon Kaliski Date: Fri, 5 Jan 2024 09:43:33 +0100 Subject: [PATCH 1/2] fix url parsing for urls with percentage sign in them --- addons/addon-web-links/src/WebLinkProvider.ts | 15 +++++++++++++-- addons/addon-web-links/test/WebLinksAddon.api.ts | 7 +++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/addons/addon-web-links/src/WebLinkProvider.ts b/addons/addon-web-links/src/WebLinkProvider.ts index 25dd983c..1000b788 100644 --- a/addons/addon-web-links/src/WebLinkProvider.ts +++ b/addons/addon-web-links/src/WebLinkProvider.ts @@ -41,6 +41,18 @@ export class WebLinkProvider implements ILinkProvider { } } +function baseUrlString(url: URL): string { + if (url.password && url.username) { + return `${url.protocol}//${url.username}:${url.password}@${url.host}`; + } + + if (url.username) { + return `${url.protocol}//${url.username}@${url.host}`; + } + + return `${url.protocol}//${url.host}`; +} + export class LinkComputer { public static computeLink(y: number, regex: RegExp, terminal: Terminal, activate: (event: MouseEvent, uri: string) => void): ILink[] { const rex = new RegExp(regex.source, (regex.flags || '') + 'g'); @@ -64,8 +76,7 @@ export class LinkComputer { // - append / also match domain urls w'o any path notion try { const url = new URL(text); - const urlText = decodeURI(url.toString()); - if (text !== urlText && text + '/' !== urlText) { + if (!text.startsWith(baseUrlString(url))) { continue; } } catch (e) { diff --git a/addons/addon-web-links/test/WebLinksAddon.api.ts b/addons/addon-web-links/test/WebLinksAddon.api.ts index fb5be20b..5b05ce2e 100644 --- a/addons/addon-web-links/test/WebLinksAddon.api.ts +++ b/addons/addon-web-links/test/WebLinksAddon.api.ts @@ -115,6 +115,13 @@ describe('WebLinksAddon', () => { await resetAndHover(5, 1); await evalLinkStateData('http://test:password@example.com/some_path', { start: { x: 12, y: 1 }, end: { x: 13, y: 2 } }); }); + it('url encoded params work properly', async () => { + await writeSync(page, '¥¥¥cafe\u0301 http://test:password@example.com/some_path?param=1%202%3'); + await resetAndHover(12, 0); + await evalLinkStateData('http://test:password@example.com/some_path?param=1%202%3', { start: { x: 12, y: 1 }, end: { x: 27, y: 2 } }); + await resetAndHover(5, 1); + await evalLinkStateData('http://test:password@example.com/some_path?param=1%202%3', { start: { x: 12, y: 1 }, end: { x: 27, y: 2 } }); + }); }); }); From f03d870bcdcdce18a2871757460e3229458dba63 Mon Sep 17 00:00:00 2001 From: Szymon Kaliski Date: Thu, 11 Jan 2024 11:23:24 -0800 Subject: [PATCH 2/2] adjust a comment --- addons/addon-web-links/src/WebLinkProvider.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/addons/addon-web-links/src/WebLinkProvider.ts b/addons/addon-web-links/src/WebLinkProvider.ts index 1000b788..713f9c23 100644 --- a/addons/addon-web-links/src/WebLinkProvider.ts +++ b/addons/addon-web-links/src/WebLinkProvider.ts @@ -68,12 +68,8 @@ export class LinkComputer { // check via URL if the matched text would form a proper url // NOTE: This outsources the ugly url parsing to the browser. - // To avoid surprising auto expansion from URL we additionally - // check afterwards if the provided string resembles the parsed - // one close enough: - // - decodeURI decode path segement back to byte repr - // to detect unicode auto conversion correctly - // - append / also match domain urls w'o any path notion + // we check if the provided string resembles the URL-parsed one + // up to the end of the domain name (ignoring path and params) try { const url = new URL(text); if (!text.startsWith(baseUrlString(url))) {