From a5ba1b0489379c77527702cf0f2cb483038507a1 Mon Sep 17 00:00:00 2001 From: SiriusXT <1160925501@qq.com> Date: Tue, 3 Jun 2025 14:27:32 +0800 Subject: [PATCH 1/3] fix(link): Allow external links containing # to navigate --- apps/client/src/services/link.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/client/src/services/link.ts b/apps/client/src/services/link.ts index 0425652f6..96e97109f 100644 --- a/apps/client/src/services/link.ts +++ b/apps/client/src/services/link.ts @@ -204,11 +204,17 @@ export function parseNavigationStateFromUrl(url: string | undefined) { return {}; } + url = url.trim(); const hashIdx = url.indexOf("#"); if (hashIdx === -1) { return {}; } + // Exclude external links that contain # + if (hashIdx !== 0 && !url.includes("/#root")) { + return {}; + } + const hash = url.substr(hashIdx + 1); // strip also the initial '#' let [notePath, paramString] = hash.split("?"); From 69d1c1519f54d08d9e8f0434a1748759ccf0ab9b Mon Sep 17 00:00:00 2001 From: SiriusXT <1160925501@qq.com> Date: Wed, 4 Jun 2025 14:57:13 +0800 Subject: [PATCH 2/3] fix(link): Allow external links containing # to open --- apps/client/src/services/link.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/services/link.ts b/apps/client/src/services/link.ts index 96e97109f..5fda4fe7c 100644 --- a/apps/client/src/services/link.ts +++ b/apps/client/src/services/link.ts @@ -211,7 +211,7 @@ export function parseNavigationStateFromUrl(url: string | undefined) { } // Exclude external links that contain # - if (hashIdx !== 0 && !url.includes("/#root")) { + if (hashIdx !== 0 && !url.includes("/#root") && !url.includes("/#?searchString")) { return {}; } From 6a80bda335e2ec96b02cedf04c8148e7d7817494 Mon Sep 17 00:00:00 2001 From: SiriusXT <1160925501@qq.com> Date: Wed, 4 Jun 2025 14:58:11 +0800 Subject: [PATCH 3/3] vitest(link): add Vitest test cases for parseNavigationStateFromUrl --- apps/client/src/services/link.spec.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/apps/client/src/services/link.spec.ts b/apps/client/src/services/link.spec.ts index 60812ccf9..09eaf09e7 100644 --- a/apps/client/src/services/link.spec.ts +++ b/apps/client/src/services/link.spec.ts @@ -16,4 +16,24 @@ describe("Link", () => { const output = parseNavigationStateFromUrl(`#root/WWaBNf3SSA1b/mQ2tIzLVFKHL`); expect(output).toMatchObject({ notePath: "root/WWaBNf3SSA1b/mQ2tIzLVFKHL", noteId: "mQ2tIzLVFKHL" }); }); + + it("parses notePath with spaces", () => { + const output = parseNavigationStateFromUrl(` #root/WWaBNf3SSA1b/mQ2tIzLVFKHL`); + expect(output).toMatchObject({ notePath: "root/WWaBNf3SSA1b/mQ2tIzLVFKHL", noteId: "mQ2tIzLVFKHL" }); + }); + + it("ignores external URL with internal hash anchor", () => { + const output = parseNavigationStateFromUrl(`https://en.wikipedia.org/wiki/Bearded_Collie#Health`); + expect(output).toMatchObject({}); + }); + + it("ignores malformed but hash-containing external URL", () => { + const output = parseNavigationStateFromUrl("https://abc.com/#drop?searchString=firefox"); + expect(output).toStrictEqual({}); + }); + + it("ignores non-hash internal path", () => { + const output = parseNavigationStateFromUrl("/root/abc123"); + expect(output).toStrictEqual({}); + }); });