deerflow2/frontend/tests/unit/core
Eilen Shin 25fbd25b05
fix(frontend): cap deeply nested list indentation to prevent render crash (#3393) (#3570)
* fix(frontend): cap deeply nested list indentation to prevent render crash

Deeply nested lists make marked's recursive list tokenizer overflow the
call stack during Streamdown's lexing useMemo, throwing an uncaught
"RangeError: Maximum call stack size exceeded" that replaces the chat
route with an error page (issue #3393); on larger stacks the same input
exhausts the heap, which the render error boundary cannot catch.

Mirror the existing capBlockquoteNesting guard with capListNesting, which
clamps leading whitespace to 200 columns (~100 nesting levels) only when
pathologically deep indentation is present, leaving normal content and
fenced code untouched. Wire both through capMarkdownNesting.

* fix(frontend): satisfy prettier format check in preprocess test

* fix(frontend): exempt indented code from list-indent cap (PR #3570 review)

* fix(frontend): keep capping all deep indentation outside fenced code

Revert the indented-code exemption from the PR #3570 review nit. Taken
literally the suggested guard (insideFence || INDENTED_CODE_RE.test(line))
no-ops capListNesting, because INDENTED_CODE_RE matches every line with
4+ leading spaces — i.e. exactly the deep-indent lines the cap targets.
A context-aware exemption (only treat 4+-space lines as code after a
blank line) instead reopens the crash: blank-separated deeply nested list
items get exempted and still blow up marked (verified: OOM at depth ~1.5k).

Unlike blockquotes (markers take <=3 leading spaces, so deep-quote lines
never look like indented code), list vs. indented-code indentation is
ambiguous line-by-line, so any exemption is exploitable. Keep capping all
deep indentation outside fenced code; the only cost is mild corruption of
a >200-column indented-code line, which never occurs in real content and
is strictly preferable to a render crash. Add a regression test locking
the blank-line case.
2026-06-14 22:19:54 +08:00
..
agents fix(frontend): surface backend detail when agent name check fails (#3048) 2026-05-28 18:38:45 +08:00
api fix: ignore stale run reconnect conflicts (#3284) 2026-05-28 17:29:30 +08:00
artifacts Stabilize write artifact previews (#3172) 2026-05-23 16:56:14 +08:00
auth fix(frontend): keep workspace interactive when SSR auth probe cannot reach gateway (#3493) (#3495) 2026-06-11 21:14:49 +08:00
channels feat(im): Add user-owned IM channel connections (#3487) 2026-06-12 15:24:58 +08:00
mcp fix(mcp): surface admin-required state on settings tools page (#3527) (#3533) 2026-06-13 07:36:57 +08:00
messages fix(skills): harden slash skill activation across chat channels (#3466) 2026-06-09 23:07:17 +08:00
settings enable token usage by default (#2841) 2026-05-10 22:00:57 +08:00
streamdown fix(frontend): cap deeply nested list indentation to prevent render crash (#3393) (#3570) 2026-06-14 22:19:54 +08:00
tasks fix(subagent): structured subagent_status field over text parsing (#3146) (#3154) 2026-06-07 22:49:55 +08:00
threads feat(im): Add user-owned IM channel connections (#3487) 2026-06-12 15:24:58 +08:00
uploads feat(frontend): set up Vitest frontend testing infrastructure with CI workflow (#2147) 2026-04-12 18:00:43 +08:00
clipboard.test.ts fix(frontend): fallback Streamdown clipboard copy (#3397) 2026-06-09 22:09:13 +08:00
reasoning-trigger.test.ts Fix invalid HTML nesting in reasoning trigger during complex task rendering (#2382) 2026-04-21 09:41:28 +08:00