fix: use readonly preview for code resource tabs

This commit is contained in:
lix-2026
2026-06-04 23:00:53 +08:00
parent eccf399142
commit a1dcfc9f76
3 changed files with 142 additions and 2 deletions
@@ -0,0 +1,47 @@
# 5-43 大 JSON 资源 tab 打开后卡死且无法关闭
## 状态
- 状态:done
- owner05-editor-mainline
- 发现时间:2026-06-04
- 修复时间:2026-06-04
## 现象
在 local-folder 文件树中打开 OCR sidecar 的 source-map JSON,例如:
- `/mnt/Data1T/research/DHA_cosmetics/literature/SCCS_1612_19_DHA.ocr/SCCS_1612_19_DHA.pdf.source-map.json`
页面会把 JSON 当作可编辑 code 资源加载进 Tiptap resource tab。大 JSON 打开后主线程明显卡顿,标签页关闭按钮无响应或被资源编辑 session 的关闭保护阻止;其它普通资源 tab 仍可关闭。
## 根因
`document-resource-tab-runtime.js``.json` 归类为 `code`,并且 `markdown/text/code` 统一走 `openTiptapResourceTab`。这会为 JSON 创建完整 Tiptap 编辑 session、序列化大文档、挂本地文件事件 channel,并把 code 资源纳入 dirty close guard。
OCR source-map JSON 是机器生成的只读索引文件,不适合作为页面编辑器文档打开;大文件走 Tiptap 会放大渲染和关闭保护成本。
## 修复
- `code` 资源不再声明为 editable。
- `.json` 等 code 资源改走轻量只读 `<pre><code>` 预览,不创建 Tiptap editor session。
- 只读预览显示文件大小,超过预览上限时截断提示。
- Markdown 和普通 text resource tab 仍保留原可编辑 Tiptap 路径。
## 验证
- `node --check rust/crates/mnote-web/browser/document-resource-tab-runtime.js`
- `cargo build -p mnote-web --manifest-path rust/Cargo.toml`
- 临时启动 `127.0.0.1:3023` 后用 Playwright 打开真实页面:
- `rootUri=file:///mnt/Data1T/research/DHA_cosmetics`
- 页面:`literature/dha_computational_modeling_literature.md`
- 资源:`literature/SCCS_1612_19_DHA.ocr/SCCS_1612_19_DHA.pdf.source-map.json`
- 浏览器验证结果:
- resource tab 成功打开只读 code preview。
- 当前 panel 不存在 `mnote-leptos-tiptap-island-editor-root`,证明没有挂 Tiptap 编辑器。
- 预览加载 `970708` 字符,meta 显示 `只读预览 · 971,098 bytes`
- 点击 tab close 后 `openResourcePanels=0`,主页面 tab 恢复选中。
## 备注
`task505-resource-tab-watch-contract-smoke.js` 在本次临时 standalone 服务上未通过,失败点是 Markdown resource 外部文件变更 watcher 未把写盘更新同步回 resource editor;该路径与本次 JSON 只读预览不同,未作为本 bug 验收条件。