docs(test): 补充 Canvas Tainted 缺陷排查与修复验证记录
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
committed by
weichen
co-authored by
Cursor
parent
c5d53c28fa
commit
580a77d80a
@@ -92,24 +92,38 @@
|
||||
✔ DOCX 渲染器行内文本与公式解析测试 (parseInlineContent) (3.533ms)
|
||||
✔ DOCX 渲染器 LaTeX 原生 OMML 转换引擎测试 (latexToOmml) (1.455ms)
|
||||
✔ DOCX 渲染器 Mermaid 语法净化与容错测试 (sanitizeMermaidCode) (0.160ms)
|
||||
✔ DOCX 渲染器全量编译测试 (buildDocxModel & exportDocumentToDocx) (38.151ms)
|
||||
✔ XLSX 渲染器多表提取与工作簿编译测试 (buildXlsxWorkbook & exportDocumentToXlsx) (4.742ms)
|
||||
✔ src/types/types.test.ts (72.521ms)
|
||||
ℹ tests 35 | pass 35 | fail 0 (耗时: 754ms)
|
||||
✔ DOCX 渲染器 SVG 净化防 Canvas 污染测试 (cleanSvgForCanvas) (0.233ms)
|
||||
✔ DOCX 渲染器全量编译测试 (buildDocxModel & exportDocumentToDocx) (40.049ms)
|
||||
✔ XLSX 渲染器多表提取与工作簿编译测试 (buildXlsxWorkbook & exportDocumentToXlsx) (4.402ms)
|
||||
✔ src/types/types.test.ts (56.519ms)
|
||||
ℹ tests 36 | pass 36 | fail 0 (耗时: 743ms)
|
||||
|
||||
Test Files 1 passed (1)
|
||||
Tests 20 passed (20)
|
||||
Duration 204ms
|
||||
Duration 188ms
|
||||
```
|
||||
|
||||
### 2. 前端构建校验 (`web/npm run build`):
|
||||
- `tsc`: 0 errors.
|
||||
- `vite build`: 3,984 模块编译打包成功,耗时 4.53s。
|
||||
- `vite build`: 3,984 模块编译打包成功,耗时 4.18s。
|
||||
|
||||
### 3. 后端 Go 回归测试 (`go test ./...`):
|
||||
- 17 个模块全部 PASS,0 失败。
|
||||
|
||||
---
|
||||
|
||||
## 七、 测试结论与后续建议 (Conclusion & Next Steps)
|
||||
- **测试结论**:本次针对用户反馈的“Mermaid 图未正确显示”、“公式未正确显示”、“排版不美观”三大问题进行了彻底的工程重构。引入 KaTeX + mml2omml 打造了真正的微软 Word 原生数学公式生成体系;通过浏览器 Canvas 超采样实现了 Mermaid 矢量图的高清图像光栅化导出;重构了卷首公文签署、医疗标准三线表与字体行距防孤行系统,使导出的 DOCX 达到出版级专业公文标准,达到上线交付标准。
|
||||
## 七、 突发缺陷排除记录 (Tainted Canvas SecurityError Fix)
|
||||
- **缺陷现象**:浏览器控制台报错 `Uncaught SecurityError: Failed to execute 'toBlob' on 'HTMLCanvasElement': Tainted canvases may not be exported. at img.onload (docxRenderer.ts:148:16)`。
|
||||
- **根因分析**:
|
||||
1. Mermaid 默认在浏览器中启用了 HTML 标签(`htmlLabels: true`),在生成的 SVG 中插入了 `<foreignObject><div>...</div></foreignObject>`;
|
||||
2. 现代浏览器(Chrome/Safari/Firefox)安全规范规定:绘制包含 `<foreignObject>` 或 `@import` 外部样式的 SVG 图像至 `<canvas>` 时,出于防信息泄露安全机制,会将该 Canvas 永久标记为 **Tainted(被污染)**;
|
||||
3. 随后调用 `canvas.toBlob()` 或 `canvas.toDataURL()` 会立即抛出 `SecurityError`;而原代码中 `img.onload` 未对同步抛出的安全异常进行沙箱捕获。
|
||||
- **修复方案与实测验证**:
|
||||
1. **配置 Mermaid 关闭 HTML 标签**:显式设置 `flowchart: { htmlLabels: false }`,使 Mermaid 全面生成纯净 SVG `<text>` 元素;
|
||||
2. **实现 cleanSvgForCanvas 过滤管线**:剥离 `@import` 外部网络字体,并使用 DOMParser 自动将任何残存的 `<foreignObject>` 转换为标准 `<text>` 矢量元素;
|
||||
3. **增强 Canvas 导出沙箱与同步数据转换**:在 `img.onload` 增加完整的 `try/catch` 保护,并使用同步 `canvas.toDataURL('image/png')` + `atob` 替代不稳定的异步 `FileReader`,彻底消除未捕获异常。
|
||||
|
||||
---
|
||||
|
||||
## 八、 测试结论与后续建议 (Conclusion & Next Steps)
|
||||
- **测试结论**:本次针对用户反馈的“Mermaid 图未正确显示”、“公式未正确显示”、“排版不美观”三大问题及实测中的“Canvas Tainted 安全异常”进行了彻底的工程重构与加固。引入 KaTeX + mml2omml 打造了真正的微软 Word 原生数学公式生成体系;通过浏览器 Canvas 防污染超采样实现了 Mermaid 矢量图的高清图像光栅化导出;重构了卷首公文签署、医疗标准三线表与字体行距防孤行系统,使导出的 DOCX 达到出版级专业公文标准,达到上线交付标准。
|
||||
|
||||
Reference in New Issue
Block a user