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({}); + }); }); diff --git a/apps/client/src/services/link.ts b/apps/client/src/services/link.ts index 0425652f6..5fda4fe7c 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") && !url.includes("/#?searchString")) { + return {}; + } + const hash = url.substr(hashIdx + 1); // strip also the initial '#' let [notePath, paramString] = hash.split("?");