diff --git a/tests/features/chat/ui/message-stream/stream-markdown-renderer.test.ts b/tests/features/chat/ui/message-stream/stream-markdown-renderer.test.ts index 5538c409..ea99e3d9 100644 --- a/tests/features/chat/ui/message-stream/stream-markdown-renderer.test.ts +++ b/tests/features/chat/ui/message-stream/stream-markdown-renderer.test.ts @@ -25,6 +25,33 @@ describe("renderStreamMarkdown", () => { expect(parent.textContent).toBe("Title\nbold text"); }); + it("escapes raw HTML while streaming", () => { + const context = streamMarkdownContext(); + const parent = document.createElement("div"); + + renderStreamMarkdown(parent, '\n\n', context); + + expect(parent.querySelector("img")).toBeNull(); + expect(parent.querySelector("script")).toBeNull(); + expect(parent.textContent).toContain(''); + expect(parent.textContent).toContain(""); + }); + + it("neutralizes unsafe link protocols while streaming", () => { + const openLinkText = vi.fn(); + const context = streamMarkdownContext({ openLinkText }); + const parent = document.createElement("div"); + + renderStreamMarkdown(parent, "[Run](javascript:alert(1))", context); + const link = parent.querySelector("a"); + link?.click(); + + expect(link?.textContent).toBe("Run"); + expect(link?.getAttribute("href")).toBe(""); + expect(openLinkText).not.toHaveBeenCalled(); + expect(notices).toEqual([]); + }); + it("leaves wikilinks as plain text while streaming", () => { const context = streamMarkdownContext(); const parent = document.createElement("div");