Skip to content

perf(desktop): 按可见页懒渲染 PDF 并限制画布像素开销 - #4057

Merged
DavidShenXD merged 4 commits into
mainfrom
cindy/vibrant-jepsen
Sep 8, 2026
Merged

perf(desktop): 按可见页懒渲染 PDF 并限制画布像素开销#4057
DavidShenXD merged 4 commits into
mainfrom
cindy/vibrant-jepsen

Conversation

@DavidShenXD

@DavidShenXD DavidShenXD commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator

这次改了什么

摘要

工作区 PDF 预览改为只为可见页及上下 400px 的邻近页面请求页面资源、创建和绘制 canvas,避免打开长 PDF 就逐页绘制整份文档。

  • 离屏时取消 RenderTask、清空并移除 canvas;更换文件或离开预览时销毁 PDF 文档及加载任务。
  • 保持原有 1.5 倍阅读尺寸,backing-store DPR 上限为 2,单页像素预算为 400 万;同时约束短边补到 1 像素后的极细长页,并避免面积计算溢出。
  • 使用零相交阈值,避免超大页可见比例低于 1% 时停留在空白占位。
  • 页面共享原有左边缘,避免宽窄混排时窄页占位被推到横向视口外;忽略已断开的旧 observer 回调。
  • 补充媒体安全单测:检查符号链接拒绝、读取后替换、句柄释放及零账本副作用。Rebase 后复用主干现有 Windows 文件链接夹具与目录 junction,移除重复探测和 skip,不改媒体生产代码。

变更类型

  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 测试补充

范围

  • 关联 Issue / 需求:PDF 预览性能优化需求,未关联 Issue。
  • 本 PR 包含:PdfPreview.tsx、对应单测,以及 blobStore.test.ts / ingest.test.ts 的额外安全检查。
  • 明确不包含:IPC、CSP、文件读取策略、依赖、移动端、临时文档、验收脚本及 PDF 二进制夹具。
  • 用户可见变化:长 PDF 先显示邻近页面,滚动到离屏页面时再绘制;超大页降采样,宽窄页面保持共同左对齐。
  • 是否存在 breaking change:无。

UI 变化

  • 引用的设计规范:docs/design-rules/DESIGN.md §1 最小化界面和 §10 Light / Dark 双模式交付门槛、语义 token。保留原阅读尺寸、白纸与页面间距,外围继续使用 --surface,不增加反色处理或单主题补丁;共同左对齐恢复原页面排列语义。
  • Windows 隔离 Desktop 已对 PDF 预览的 Light / Dark 截图目检;实际效果证据见下方 HTML,原始截图与临时 HTML 均未提交 Git 仓库。

改动后界面效果证据(真实截图)

  • 平台 / 日期:Windows / Electron 41.10.3 / 原生 DPR=1;2026-09-07 19:39(北京时间),Global 独立 worktree 沙盒。
  • 来源:正式黑盒验收的四张截图,采集代码为 2b2814a4e59a4edeb982825cfdce5c40b8f089b0;当前 HEAD 为 e8bce295d237ea4d275b0354247caa53db82fd33。已核对两者 PdfPreview.tsx Git blob 完全相同(8f6c2c25a8c5e70cff3c0141b9767d96d9e8c446),本轮复用已有验收证据,并未重新运行黑盒。
  • 内容:Light、Dark、120 页首屏、超大页顶部。仅无损裁出实际 PDF 面板,保留边缘、纸张、文字和色块;逐行比对 RGBA 像素与原截图一致,不重绘界面,也不改清晰度。超大页的降采样模糊如实保留。
  • 查看方式:GitHub 不直接渲染 HTML 代码块。展开下方,复制完整代码保存为 pdf-preview-evidence.html 后用浏览器打开;图片已内嵌,无脚本、无外部网络请求、无需安装依赖。这里只交证据,不代替设计师批准;截图不能单独证明运行时性能。
展开自包含 HTML 截图证据页(Light / Dark / 长 PDF / 超大页)
<!doctype html>
<html lang="zh-CN">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Security-Policy" content="default-src &#39;none&#39;; img-src data:; style-src &#39;unsafe-inline&#39;">
<title>PR #4057:真实 PDF 预览截图证据</title>
<h1>PR #4057:PDF 预览截图</h1>
<p>2026-09-07 19:39(北京时间);Windows / Electron 41.10.3;Global 独立沙盒;原生 DPR=1。</p>
<p>采集代码 2b2814a4e59a4edeb982825cfdce5c40b8f089b0;当前代码 e8bce295d237ea4d275b0354247caa53db82fd33;PdfPreview.tsx Git blob 均为 8f6c2c25a8c5e70cff3c0141b9767d96d9e8c446。</p>
<p>下图仅从真实 1280×800 截图无损裁出 PDF 面板(x=260、y=82、618×718),不缩放、不重绘、不修改像素;未展示无关侧栏与聊天内容。证据页外壳不是应用 UI。</p>
<figure>
<figcaption>Light:普通 PDF,白纸、文字和绿色标记</figcaption>
<img alt="Light:普通 PDF,白纸、文字和绿色标记" width="618" height="718" style="max-width:100%;height:auto" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAmoAAALOCAIAAACWPajQAAAfg0lEQVR42u3deXCU9eH48URDIBDlEAHlKoeVQyogpwoSIsVIACOIEkGZYjuOCB5UxJOvFRVRp7UeUxyxolANhyJGLkGuyn2NDAgoIIcYUJRTKAH217Iz+3smaEg2CeF4vf5iH5LdZZ9l3/t8ns/zPLF79+6KAQDy4zwvAQDIJwDIJwDIJwDIJwDIJwAgnwAgnwAgnwAgnwAgnwCAfAKAfAKAfAKAfAKAfAIA8gkA8gkA8gkA8gkA8gkA8gkA5Etc1L8ZCoW8fACcfWJjYws/n6FQqGTJhPj4hLzcOwCccfbt+7GQ8xkKheLjE0qWLO3FBeBclu99nyVLJnjVAJDPfDh27JgxWwDIRz7NFQKAaLY+FRQAHPcJAPIJAPIJAPIJAPIJAPIJAMgnAMgnAMgnAMgnAMgnACCfACCfACCfACCfACCfAIB8AoB8AoB8AoB8AoB8AgDyCQDyCQDyCQDyCQDyCQDyCQDIJwDIJwDIJwDIJwDIJwAgnwAgnwAgnwAgnwAgnwCAfAKAfAKAfAKAfAKAfAKAfAIA8gkA8gkA8gkA8gkA8gkAyCcAyCcAyCcAyCcAyCcAIJ8AIJ8AIJ8AIJ8AIJ8AgHwCgHwCgHwCgHwCgHwCwLkszktwGtqzZ8/cuXMnTJgwb968rVu3Zmdnh5eXKFGiSpUqTZs2TUlJ6dixY82aNWNjY/N4n999912rVq22bNmSY3nLli2nTZtWtmzZqJ/tsmXL2rZt+/PPPwcXXnfddZmZmYmJifm9txEjRtx9993BJa+88sq9994bxRPL8U+uUaPGwoULL7nkkoKvoKK753zZv39/amrqnDlz8vuLF1988QUXXNCsWbP27dvfeOON1atXL/iTKcQVl8d/+8KFC6dPnz537tyNGzd+//33kb8qU6ZMtWrVrrvuutTU1LZt20bx3v7444+7dOlSuE942LBhDz/88Cl4V+zatSslJWXJkiWn8kHlk2IWCoUWL158//33L1y48Bd/IDs7e+txH330UUxMTJ06dZ588slbbrklISEh6gddsWLFmjVrWrduHfU9zJgxI0c7o3bw4MEPP/wwx8LRo0f37t27IIEnh++P27hx49ixY2NiYurVq/faa68lJSXl/dtYca247OzsqVOnPv300+E8/KIDBw6sO+6NN96IiYlp06bNsGHDWrZsef75558LnyF/+9vfcnlxkM+z0LZt2wYMGHDiZ1AuNmzYcOedd/7lL38ZOXLkddddF93jHj58eNq0aVHnc//+/VOmTCmsF2HlypWzZs3KsXDx4sULFiy44YYbvEmKyNq1a5OTk2+99dYRI0ZEV7tTsOKOHj06duzY++67L7ihmRfz5s275pprmjdv/vbbbzdo0ODsbufYsWOfffZZb+lTw77P08LKlSuvvvrqfLUzGNH27du/+uqroVAoukefOnXqnj17ovvddevWFeJX3WnTph0+fPjED4VRo0YdOXLE+6RIZWRkdOvWLbp3QlGvuG3btnXs2DE9PT2/7YxYsmRJ48aN33nnnaj/m5wR7UxPTz927Jg3s63Pc8XmzZt79OixdevWHMsrVarUrl27evXqNWrUKLxk586dc+bMmT179s6dO4M/eezYsfvuu++SSy7p1q1bFE+gIOO3H3/8cWGN3O7YsSMjIyNys0OHDp9++mkk8GvXrr3iiiu8W3I3aNCg5s2b5/4zR44cWb58+fr16ydPnhzZrR42c+bMwYMHv/LKK3FxcafPilu5cmWXLl1O/A/yv6//553XsGHD1q1bt2jRIrzd/J///Gf+/Plz5sxZvXp1jh/Ozs6+8847s7KyHnrooXwNU7dp02bAgAEFXDUNGzYsuvV+9OjRV1999cEHH9RO+TyHZGdnP/TQQ1999VVwYVpa2vDhw+vUqXPif/J77rknJiZm06ZNAwcODG6tHjt27K677qpdu3aTJk3y+xyiHr/ds2fP1KlTC+ulWLRo0dq1a8N/rlChQq9evT7//PNwm3fv3j1+/Hj5PKlrr722c+fOJ/2x2267LbzD8uWXX37ssceCn7lvvfVWenp6mzZtTpMVt3jx4o4dO+7evTvH8latWr344ostWrQoUaJEjr+6/fbbw3tAx40bN2TIkBzT5R555JE6derk64tmrVq1unfvftqu9L179/bv3/+dd97x/j/FDN4Ws6VLl4bnAUW+Tb/yyisTJkyoW7duLl+Qa9WqNWHChPfff/+88/7/Gty9e/dzzz2XY3vi15QrV+7yyy+P3Ixu/HbNmjUrVqyI3GG+NllO3CR67733IjcbNGiQlJQU2ez+75f3cePG/fDDD94whSghIWHw4MFjx44NvosOHz78+uuv533EtUhX3ObNm3v16pWjnXXq1Jk5c+b8+fOvueaaE9sZUaZMmT59+qxdu/app57KMVTz+OOPb9u27SxYg6FQ6LPPPmvatKl2yuc5JxQKjRkzJrjTqH///v369cvLyFJsbGyPHj2ee+654MKPPvpo6dKleXnoCy+88KabborcDI/f5vf5B/d4de7c+dJLL436pfjqq6+mT58eudmkSZPq1asHZ518+eWXefynkS8333xz//79g0umT5+eYzikWFZcdnb2M888k+OZdO/efdmyZe3bt8/j6GtCQsITTzyR44vm2rVr33zzzTN9xW3btq1bt27JyckbNmzwNpbPc87u3bsXLVoU3CK866678r5XJjY29p577gnOuQ0Pw+bx15OSksqVKxfFL4YFR27j4+MLeJzczJkzf/zxx8jN66+/PiYmpmPHjvHx8ZGvGiYQFYXY2Ni77ror8k6IiYn58ccfv/zyy2JfcbNnzx45cmRwSXJy8ptvvpnfucHhL5pDhw4NLszIyNixY8cZusq+++67fv361axZ88TJhgUZAUI+zySHDh0KTgK64ooratasma97SExM/OMf/xhcsmTJkkOHDuXld+vWrduyZcvgp9X+/fvz/tDBkdsmTZoUZGbEnj17Ro8eHblZs2bNq666KiYmplGjRsE9suF5KN42ha5mzZo5dk/m8XUuuhV38ODBl156KbhT9rLLLhs5cmR0x9XExsb27ds3+BZdu3btiUfanBH279/fs2fP119//cRZQg888EBwdSCfZ7OdO3f+9NNPkZvnn39+FMetN23atEKFCsHPhTzuxSxdunRqamqwu+vWrcv742ZmZkZGbm+44Ybg5kt+BUsc3iwOjwMnJiYGp2yE56F42xS6Cy64oHbt2sEleXwnFN2KmzNnTnBMODY2dtiwYfn9chlUqVKlHCdFGj9+/FkzmBHeH/zSSy+VLl3a+1k+zwmVKlUqX7588DMrxxEpeXHxxRdXqVKlTJky1atXv/zyy7t06VKyZMk8/m67du0i2fv5559nzJiRx1/86aefIp9u8fHxHTt2jPpFOHEHcFpaWuRrRPAZnuljbmeZoltxoVAoIyMjeIDm73//+5SUlAI+4U6dOlWtWjVy8+uvvz5xQu8Zp0SJEs8///yqVavyvj+YwmKgvDglJibWqFEjMrE+KysrIyNj8ODB+fpvULFixRMPccv7l9bwOW/DN6dMmdKvX7+8nKh29erVK1euDP+5devWjRo12rdvX9Sb4DNnzozcrFevXnBIuV69esnJyRMmTIhsW8+aNSt83AXFPnZSRCvum2++iRw5GtanT5+CnJkyrHr16m3bts3Kyrr99ttTU1MrV658Zm/6nHdev379hgwZctFFF3k3yuc554ILLkhOTv73v/8dWfL444+XLl363nvvPTXn50xISEhNTY3kMzx+G959lbspU6ZEBr5SUlISExOjzud/P1WDO8Y6dOgQ/FyLi4vr3r175FM4Jibm7bff7tq1a8E/TIk4cODAt99+G1ySl5PbFd2KW7VqVfD5VK1aNRjm6D/s4uL+9a9/nQXrq3Llys8//3zfvn2Fs5i/wXgJitctt9xSsWLFyM1jx47df//9tWvXHjFixK5du07BE4hi/PaHH36YOHFi+M/lypXr1KlT1I9+6NChd999N3IzPj6+Z8+eOX6mTZs2wZ1eixYtMlO/cO3YsSPHAMZll11WjCsuOB09fIaEQrkmzNkhMTExIyNj0KBB2imf57qGDRsOHjw4x8ItW7bcfffdFStWrFev3mOPPbZ69eo8ngwhCnXr1r366quDm5UnnX+7cuXKyIENLVu2rFOnTtSP/vXXX8+fPz9ys0mTJidu91x66aXBKU4mEBW6cePGZWVlRW5WqVKlcePGxbXiDh06FNkvENa0aVPHYyCf/IIBAwYMHDjwF/9q3bp1zz777BVXXBEfH1+3bt377rtvxowZ+Tq85KRKlSoVPGQzL/NvJ02aFJnWkZqaWpBx1PHjxwenb/Tq1evEIxNiY2Nvu+224AeoCUSFaPHixcOGDcsxIFGjRo3iWnH79+//5ptvgkuC5zCC04fvdMUvPHeuRo0af/7zn3PZytywYcPfjwt/r+/Vq1efPn1++9vfFnwvadu2bStUqBA++D08fpvL7s8ffvghMmGkXLly7dq1i/pxc5wyN5d7a9So0VVXXRUZ0zOBqFCEQqEZM2akp6cHQxgfH3/PPffkvrVXpCsuOzs7+AUxISGhSpUqxftCvXNc1L9eunTpuXPn5mVKAfJJvp1//vkDBgy4+eabH3zwwXHjxp3057dv3z78uISEhP79+xdwR0itWrVatWo1efLk8M3c598uXbo0MnJ79dVX161bN+rHXbBgweLFiyM3k5OT69Wr94s/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">
<p>源文件 small-light.png;源 PNG SHA-256:55c6b3e7297f66d86d1dcc01d797e7d19dc3d689b2df0d99db586df1dad29632<br>裁剪 PNG SHA-256:a6bb4ee55770e63e3ea9fea4799f6b712761f04b5e22aa8ca981fba0cc4cde40</p>
</figure>
<figure>
<figcaption>Dark:外围深色,纸张和 PDF 内容保持原色</figcaption>
<img alt="Dark:外围深色,纸张和 PDF 内容保持原色" width="618" height="718" style="max-width:100%;height:auto" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAmoAAALOCAIAAACWPajQAAAfW0lEQVR42u3deXCU9eH48UQJEIhyiBDkSDmsHFIBOVWQEClGAhhBlAjKFNtxRECkIp58ragRdVrrMcURKwrVcChi5BLkqtzXyICAAnIIAUVBQSgB8mvZmf09EzQkm4Qgvl5/sQ/J7rLPsu99Ps/neZ7o+Pj4KACgIM7zEgCAfAKAfAKAfAKAfAKAfAIA8gkA8gkA8gkA8gkA8gkAyCcAyCcAyCcAyCcAyCcAIJ8AIJ8AIJ8AIJ8AIJ8AIJ8AgHwCQPEqFcHvDBkyZPDgwWXKlPHyAXDuqV69etHnc8iQIcOGDfPiAvBrVuDB28GDB3vVAJDPgjFmCwCmDgGAfAKAfAKAfAKAfAKAfAIA8gkA8gkA8gkA8gkA8gkAyCcAyCcAyCcAyCcAyCcAIJ8AIJ8AIJ8AIJ8AIJ8AIJ8AgHwCgHwCgHwCgHwCgHwCAPIJAPIJAPIJAPIJAPIJAMgnAMgnAMgnAMgnAMgnACCfACCfACCfACCfACCfACCfAIB8AoB8AoB8AoB8AoB8AgDyCQDyCQDyCQDyCQDyCQDIJwDIJwDIJwDIJwDIJwAgnwAgnwAgnwAgnwAgnwAgnwCAfAJAsSnlJTgLHThwYMGCBZMnT164cOGOHTuys7NDy2NiYuLj45s3b56cnNy5c+eEhITo6Oh83ufu3bvbtGmzffv2XMtbt249c+bMChUqRPxsV65c2b59+x9//DG48Nprr83MzIyLiyvovY0ePfquu+4KLnnxxRfvueeeCJ5Yrn9y7dq1lyxZUr169cKvoOK75wI5ePBgSkrK/PnzC/qLF1988QUXXNCiRYuOHTvecMMNtWrVKvyTKcIVl89/+5IlS2bNmrVgwYItW7Z8/fXX4b8qX758zZo1r7322pSUlPbt20fw3v7ggw+6detWtE84PT39gQceOAPvin379iUnJy9fvvxMPqh8UsJycnKWLVt27733Llmy5Cd/IDs7e8dJ77//flRUVL169R577LGbb745NjY24gddvXr1+vXr27ZtG/E9zJ49O1c7I3b48OH33nsv18Jx48b17du3MIEnl69P2rJly4QJE6Kioho0aPDyyy8nJibm/9tYSa247OzsGTNmPPHEE6E8/KRDhw5tPOnVV1+Niopq165denp669atzz///F/DZ8jf/va3PF4c5PMctHPnzkGDBp36GZSHzZs333HHHX/5y1/GjBlz7bXXRva4R48enTlzZsT5PHjw4PTp04vqRVizZs3cuXNzLVy2bNnixYuvv/56b5JismHDhqSkpFtuuWX06NGR1e4MrLjjx49PmDBh8ODBwQ3N/Fi4cOHVV1/dsmXLN954o1GjRud2OydMmPDUU095S58Z9n2eFdasWXPVVVcVqJ3BiHbs2PGll17KycmJ7NFnzJhx4MCByH5348aNRfhVd+bMmUePHj31Q2Hs2LHHjh3zPilWGRkZPXr0iOydUNwrbufOnZ07d05LSytoO8OWL1/etGnTN998M+L/Jr+IdqalpZ04ccKb2dbnr8W2bdt69eq1Y8eOXMurVq3aoUOHBg0aNGnSJLRk79698+fPnzdv3t69e4M/eeLEicGDB1evXr1Hjx4RPIHCjN9+8MEHRTVyu2fPnoyMjPDNTp06ffTRR+HAb9iw4fLLL/duyduwYcNatmyZ988cO3Zs1apVmzZtmjZtWni3esicOXOGDx/+4osvlipV6uxZcWvWrOnWrdup/0H+9/X/vPMaN27ctm3bVq1ahbab//Of/yxatGj+/Pnr1q3L9cPZ2dl33HFHVlbW/fffX6Bh6nbt2g0aNKiQq6Zx48bFt96PHz/+0ksv3Xfffdopn78i2dnZ999//+effx5cmJqaOmrUqHr16p36n/zuu++OioraunXr0KFDg1urJ06cuPPOO+vWrdusWbOCPoeIx28PHDgwY8aMonopli5dumHDhtCfK1eu3KdPn08++STU5v3790+aNEk+T+uaa67p2rXraX/s1ltvDe2wfOGFFx5++OHgZ+7rr7+elpbWrl27s2TFLVu2rHPnzvv378+1vE2bNs8991yrVq1iYmJy/dVtt90W2gM6ceLEESNG5Jou9+CDD9arV69AXzTr1KnTs2fPs3alf//99wMHDnzzzTe9/88wg7clbMWKFaF5QOFv0y+++OLkyZPr16+fxxfkOnXqTJ48+Z133jnvvP+/Bvfv3//000/n2p74ORUrVrzsssvCNyMbv12/fv3q1avDd1igTZZTN4nefvvt8M1GjRolJiaGN7v/++V94sSJ33zzjTdMEYqNjR0+fPiECROC76KjR4++8sor+R9xLdYVt23btj59+uRqZ7169ebMmbNo0aKrr7761HaGlS9fvl+/fhs2bHj88cdzDdU88sgjO3fuPAfWYE5Ozscff9y8eXPtlM9fnZycnPHjxwd3Gg0cOHDAgAH5GVmKjo7u1avX008/HVz4/vvvr1ixIj8PfeGFF954443hm6Hx24I+/+Aer65du15yySURvxSff/75rFmzwjebNWtWq1at4KyTzz77LJ//NArkpptuGjhwYHDJrFmzcg2HlMiKy87OfvLJJ3M9k549e65cubJjx475HH2NjY199NFHc33R3LBhw2uvvfZLX3E7d+7s0aNHUlLS5s2bvY3l81dn//79S5cuDW4R3nnnnfnfKxMdHX333XcH59yGhmHz+euJiYkVK1aM4BdDgiO3pUuXLuRxcnPmzPn222/DN6+77rqoqKjOnTuXLl06/FXDBKLiEB0dfeedd4bfCVFRUd9+++1nn31W4itu3rx5Y8aMCS5JSkp67bXXCjo3OPRFc+TIkcGFGRkZe/bs+YWust27dw8YMCAhIeHUyYaFGQFCPn9Jjhw5EpwEdPnllyckJBToHuLi4v74xz8GlyxfvvzIkSP5+d369eu3bt06+Gl18ODB/D90cOS2WbNmhZkZceDAgXHjxoVvJiQkXHnllVFRUU2aNAnukQ3NQ/G2KXIJCQm5dk/m83UuvhV3+PDh559/PrhT9tJLLx0zZkxkx9VER0f3798/+BbdsGHDqUfa/CIcPHiwd+/er7zyyqmzhIYMGRJcHcjnuWzv3r3fffdd+Ob5558fwXHrzZs3r1y5cvBzIZ97McuVK5eSkhLs7saNG/P/uJmZmeGR2+uvvz64+VJQwRKHNotD48BxcXHBKRuheSjeNkXuggsuqFu3bnBJPt8Jxbfi5s+fHxwTjo6OTk9PL+iXy6CqVavmOinSpEmTzpnBjND+4Oeff75cuXLez/L5q1C1atVKlSoFP7NyHZGSHxdffHF8fHz58uVr1ap12WWXdevWrUyZMvn83Q4dOoSz9+OPP86ePTufv/jdd9+FP91Kly7duXPniF+EU3cAp6amhr9GBJ/hL33M7RxTfCsuJycnIyMjeIDm73//++Tk5EI+4S5dutSoUSN884svvjh1Qu8vTkxMzDPPPLN27dr87w+mqBgoL0lxcXG1a9cOT6zPysrKyMgYPnx4gf4bVKlS5dRD3PL/pTV0ztvQzenTpw8YMCA/J6pdt27dmjVrQn9u27ZtkyZNfvjhh4g3wefMmRO+2aBBg+CQcoMGDZKSkiZPnhzetp47d27ouAtKfOykmFbcl19+GT5yNKRfv36FOTNlSK1atdq3b5+VlXXbbbelpKRUq1btl73pc955AwYMGDFixEUXXeTdKJ+/OhdccEFSUtK///3v8JJHHnmkXLly99xzz5k5P2dsbGxKSko4n6Hx29Duq7xNnz49PPCVnJwcFxcXcT7/+6ka3DHWqVOn4OdaqVKlevbsGf4UjoqKeuONN7p37174D1PCDh069NVXXwWX5OfkdsW34tauXRt8PjVq1AiGOfIPu1Kl/vWvf50D66tatWrPPPNM//79hbOEv8F4CUrWzTffXKVKlfDNEydO3HvvvXXr1h09evS+ffvOwBOIYPz2m2++mTJlSujPFStW7NKlS8SPfuTIkbfeeit8s3Tp0r179871M+3atQvu9Fq6dKmZ+kVrz549uQYwLr300hJcccHp6KEzJBTJNWHODXFxcRkZGcOGDdNO+fy1a9y48fDhw3Mt3L59+1133VWlSpUGDRo8/PDD69aty+fJECJQv379q666KrhZedr5t2vWrAkf2NC6det69epF/OhffPHFokWLwjebNWt26nbPJZdcEpziZAJRkZs4cWJWVlb4Znx8fNOmTUtqxR05ciS8XyCkefPmjsdAPvkJgwYNGjp06E/+1caNG5966qnLL7+8dOnS9evXHzx48OzZswt0eMlplS1bNnjIZn7m306dOjU8rSMlJaUw46iTJk0KTt/o06fPqUcmREdH33rrrcEPUBOIitCyZcvS09NzDUjUrl27pFbcwYMHv/zyy+CS4DmM4OzhO13JC82dq1279p///Oc8tjI3b97895NC3+v79OnTr1+/3/72t4XfS9q+ffvKlSuHDn4Pjd/msfvzm2++CU8YqVixYocOHSJ+3FynzM3j3po0aXLllVeGx/RMICoSOTk5s2fPTktLC4awdOnSd999d95be8W64rKzs4NfEGNjY+Pj40v2hXrzpIh/vVy5cgsWLMjPlALkkwI7//zzBw0adNNNN913330TJ0487c/v2rVr1EmxsbEDBw4s5I6QOnXqtGnTZtq0aaGbec+/XbFiRXjk9qqrrqpfv37Ej7t48eJly5aFbyYlJTVo0OAnf7JChQqpqanBXWImEEVs//79O3funDp16uuvv37qzsg//OEPp714QLGuuFwHQ0dHRwfPtwfyyU+oWbPmhAkTduzY8dZbb7388su7du067a8cPnx41KhRf/3rX0eOHDlw4MDIchIavw3nM4/5tzk5OZmZmeGR227dupUtWzbiTZ/gXYVOZ5rHRk+XLl3S09PD20lz585ds2ZNxFf5PlcV8tSJSUlJ6enpeW96FveKO3bs2PHjxyN48gcPHkxJSZk/f37+f+X2228fO3astw2R8bXurFOrVq2HHnroq6++ysrKeuutt3r06FG+fPm8fyU7O/uBBx7o2rVrcAJIgYTGb0N/zmP+bfBQv8qVK7dv3z7if+aXX34Znr4bOt9b3hfJyjXF6ejRo+PHjz9XL31cIlq0aPHGG2+c9qx4VhzY+jzbVatWrc9JUVFR+/btW7Ro0fjx4zMzMw8dOvSTPz9nzpyuXbu+9957NWvWLOhj5XP8dvXq1eGJRYmJiac9vCEPs2bNCh7bl5KSkvcFW8qWLdu3b9/wMwydNfDBBx8MnkeGyMTExOR/9KK4V1y1atUqVapUVNdgLxKFvFx2TExMnTp1vM3kk5Jx0UUXdT0pdJReZmbmSy+9lGt+f2jH5KOPPvrqq6/mcR3En/uMO+34ba5Ru9TU1IgPJzh8+HDwYhHR0dE33njjac+11Lp16xo1aoQ/u7dt27Zw4UITiArzsd6xY8f+/fvfcMMNpx3hOGMrLiYmJnjWyR9//HHXrl0lO+/mLL9cNvJJAbZK+5+0devWESNGBI9eD80STEtL69SpU0Hv9rTzb4Mjt/Hx8YXZ77hmzZrg9S5ycnIieMImEJ1q2LBhLVu2zPtnLrzwwkaNGsXFxUVwlv8zsOJCZ2/esmVLeEk+Lz5atmzZ//u//8v70tzLly8fNWqU9wny+WtXp06dsWPHdunSJS0tLXz1ohMnTrz++uuJiYkF3TTMNX47d+7cQYMGBT/gli5dGj5JW34ODcxD8DrbhWECUS7XXHNNaIiimJyBFRcXF1e/fv3gDKC1a9fm5OScdhu3VKlSpz2MqkyZMvJJUTF16JftJy8FvGzZsghO+Jfr/Am5TrGWk5MTHLXr3r17xCO3e/bsycjIKJJ/vnkoZ9IZW3GJiYmFfz+Drc9z1vTp00ePHr1q1apjx47t3r176tSpkW03REdH33777aNHj962bVtoyddff52VlRXBBSU6deoUHx8fmr67f//+efPmha+ivGvXrvCoXSFP4R2cf1R4U6ZMGTp0qKkZZ8AZW3GhS9iG9iNERUV99tlnK1asuP76660C5JP/+fTTT99///3wzbVr10Y87FaxYsX69euH83n8+PHIrgNcu3btq6++OnyVjMzMzP79+4fGb1euXBm+/3bt2kV8Cu9jx46NHTs2uNkxatSo0OzifPriiy+6desWPo7wq6+++vDDD++55x7vqGJ1Jldcrv0IOTk5Y8eOve6665z5lrOKwdsSk+uojwULFhw+fDiyuypTpkwE00B+4stUqVKpqanhm+Hx22PHjr399tvh5b179474g2z79u3z5s0Lhj85Obl6QbRt2zYpKSl4n+PGjTtw4IB3VLE6kysudKxLcMm77767ePFiawH55H8aNmwYPlNBaDLFihUrIrurH374IbxpGBUVValSpYgvBdy2bdvwKUZD47dRUVE7duxYuHBhaGFCQkJhjiKYNm1a8NwOEZz2L3QhyeCS1atXr1+/3juqWJ3hFZecnBzcQXD06NGhQ4faA4p88j+/+c1vgscYHD169IknnojsaipLly5duXJl+OYVV1wRvIZogYTGb8M3p0+ffuTIkaVLl4YP2ktMTMz7MPk8HDhwYNy4ccElaWlpEZz2LzExMXiSVROIituZX3EVKlR46KGHgme7Xb58+b333vtz5wwB+fwViY2N7devX3DJRx99dP/99xf00p779u177LHHgp9BycnJEZ+KNtf47ZIlSzZv3jxz5szQzejo6FtuueW0hxD8nPXr169evTp8s0aNGsHTueVftWrVch1uOGXKlFxXuaIIlciKS05O7t+/f3DJuHHjbr/99vCUooL69NNPhw0bZm0in+eClJSUXJ8m//jHP3r27Llz58583sPOnTtTU1OXL18eXtK4ceNevXoV5lkFx2+//fbbqVOnhufcXnbZZc2aNYvsbnNycsaPHx88arAwU5B69+5dunTp8M3QPBTvqOJQUisuJibm2WefzbW79N13361Tp87bb7+d/9PK5+Tk/Df/3bt3v+KKK8IHLkPhmclWkuLi4kaOHLl8+fLgBRenTp2amZnZp0+fBx54oGHDhj+3qbdnz57Ro0ePHDkyuLV63nnnPf7441WrVi3Ms8o1//bhhx8Ob9omJSVFfOfBkxaFP0kjnoLUpEmTtm3bBg+u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">
<p>源文件 small-dark.png;源 PNG SHA-256:380eb13a15aebacae9cd4c90a8e413067f14fb8ff7f5e5319af5f5aab742999f<br>裁剪 PNG SHA-256:1f600c02cc023e9ce50725f7a9679d6163546560e26475859728231100a2dccf</p>
</figure>
<figure>
<figcaption>120 页 PDF:首屏实际显示的第一页</figcaption>
<img alt="120 页 PDF:首屏实际显示的第一页" width="618" height="718" style="max-width:100%;height:auto" src="data:image/png;base64,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APkEAPkEAPkEAPkEAOQTAOQTAOQTAOQTAOQTAOQTAJBPAJBPAJBPAJBPAJBPAEA+AUA+AeDyiTcEXe/IirEGAcC7TwCQTwBAPgFAPgFAPgFAPgFAPgEA+QQA+QQA+QQA+QQA+QQA5BMA5BMA5BMA5BMA5BMA5BMAkE8AkE8AkE8AkE8AkE8AQD4BQD4BQD4BQD4BQD4BAPkEAPkEAPkEAPkEAPkEAOQTAOQTAOQTAOQTAOQTAOQTAJBPAJBPAJBPAJBPAJBPAEA+AUA+AUA+AUA+AUA+AQD5BAD5BAD5BAD5BAD5BAD5BADkEwDkEwDkEwDkEwDkEwCQTwCQTwCQTwCQTwCQTwBAPgFAPgFAPgFAPgFAPgEA+QQA+QQA+QQA+QQA+QQA+QQA5BMA5BMA5BMA5BMA5BMAkE8AkE8AkE8AkE8AkE8AQD4BQD4BQD4BQD4BQD4BAPkEAPkEAPkEAPkEAPkEAPkEAOQTAOQTAOQTAOQTAOQTAJBPAJBPAJBPAJBPAJBPAEA+AUA+AUA+AUA+AUA+AQD5BAD5BAD5BAD5BAD5BAD5BADkEwDkEwDkEwDkEwDkEwCQTwCQTwCQTwCQTwCQTwBAPgFAPgFAPgFAPgFAPgFAPgEA+QQA+QQA+QQA+QQA+QQA5BMA5BMA5BMA5BMA5BMAkE8AkE8AkE8AkE8AkE8AQD4BQD4BQD4BQD4BQD4BQD4BAPkEAPkEAPkEAPkEAPkEAOQTAOQTAOQTAOQTAOQTAJBPAJBPAJBPAJBPAJBPAEA+AUA+AUA+AUA+AUA+AUA+AQD5BAD5BAD5BAD5BAD5BADkEwDkEwDkEwDkEwDkEwCQTwCQTwCQTwCQTwCQTwBAPgFAPgFAPgFAPgFAPgFAPgEA+QQA+QQA+QQA+QQA+QQA5BMA5BMA5BMA5BMA5BMAkE8AkE8AkE8AkE8AkE8AkE9DAADyCQDyCQDyCQDyCQDyCQDIJwDIJwDIJwDIJwDIJwAgnwAgnwAgnwAgnwAgnwCAfAKAfAKAfAKAfAKAfAKAfAIA8gkA8gkA8gkA8gkA8gkAyCcAyCcAyCcAyCcAyCcAIJ8AIJ8AIJ8AIJ8AIJ8AgHwCgHwCgHwCgHwCgHwCgHwCAPIJAPIJAPIJAPIJAPIJAMgnAMgnAMgnAMgnAMgnACCfACCfACCfACCfACCfAIB8AoB8AoB8AoB8AoB8AoB8AgDyCQDyCQDyCQDyCQDyCQDIJwDIJwDIJwDIJwDIJwAgnwAgnwAgnwAgnwAgnwCAfAKAfAKAfAKAfAKAfAKAfAIA8gkA8gkA8gkA8gkA8gkAyCcAyCcAyCcAyCcAyCcAIJ8AIJ8AIJ8AIJ8AIJ8AIJ8AgHwCgHwCgHwCgHwCgHwCAPIJAPIJAPIJAPIJAPIJAMgnAMgnAMgnAMgnAMgnACCfACCfACCfACCfACCfACCfAIB8AoB8AoB8AoB8AoB8AgDyCQDyCQDyCQDyCQDyCQDIJwDIJwDIJwDIJwDIJwAgnwAgnwAgnwAgnwAgnwAgnwCAfAKAfAKAfAKAfAKAfAIA8gkA8gkA8gkA8gkA8gkAyCcAyCcAyCcAyCcAyCcAIJ8AIJ8AIJ8AIJ8AIJ8AIJ8AgHwCgHwCgHwCgHwCgHwCAPIJAPIJAPIJAPIJAPIJAMgnAMgnAMgnAMgnAMgnAMgnACCfACCfACCfACCfACCfAIB8AoB8AoB8AoB8AoB8AgDyCQDyCQDyCQDyCQDyCQDIJwDIJwDIJwDIJwDIJwDIJwAgnwAgnwAgnwAgnwAgnwCAfAKAfAKAfAKAfAKAfAIA8gkA8gkA8gkA8gkA8gkAyCcAyCcAyCcAyCcAyCcAyCcAIJ8AIJ8AIJ8AIJ8AIJ8AgHwCgHwCgHwCgHwCgHwCAPIJAPIJAPIJAPIJAPIJAMgnAMgnAMgnAMgnAMgnAMgnACCfACCfACCfACCfACCfAIB8AoB8AoB8AoB8AoB8AgDyCQDyCQDyCQBRLr7tXxoXFxcfH//BB8eMGgDefQIA8gkA8gkA8gkA8gkA8gkAyCcAyCcAyCcAyCcAyCcAIJ8AIJ8AIJ8A0E38L7o/Jep4ggVbAAAAAElFTkSuQmCC">
<p>源文件 long-initial.png;源 PNG SHA-256:5d9f1168bb168c8a3add5ac777b41007a21122f63811acb5ac196fae2a14f85e<br>裁剪 PNG SHA-256:96d84305580a0393a73008174b6ab310c3d937abfd975e4d62e163e8ecff9805</p>
</figure>
<figure>
<figcaption>超大页:顶部文字和色块可见,降采样模糊保留原样</figcaption>
<img alt="超大页:顶部文字和色块可见,降采样模糊保留原样" width="618" height="718" style="max-width:100%;height:auto" src="data:image/png;base64,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">
<p>源文件 hugepage-top.png;源 PNG SHA-256:2d780e87d39c11b27ee08b1008219bf04a9227897105e939e72cdf5c043d45e4<br>裁剪 PNG SHA-256:3e57fbee5edfae696cb29e02d002382c0310a461bfa1dbdb2c33a469eae51aee</p>
</figure>
<p>仅提供真实外观证据,不能单凭截图证明懒渲染时序、总内存有界或长期稳定性,也不代表设计批准。超大页的模糊是像素预算下的实际显示结果。</p>
</html>

怎么验证的

自动验证

2026-09-07:已 rebase 到 main 的 f6c037cc9,最新提交 e8bce295d

pnpm --filter desktop exec vitest run src/main/cindy-media/__tests__/blobStore.test.ts src/main/cindy-media/__tests__/ingest.test.ts src/renderer/features/cc-agent/workdir-browse/__tests__/PdfPreview.test.tsx src/main/__tests__/fileReadBytes.test.ts src/renderer/features/cc-agent/workdir-browse/hooks/__tests__/useFileTree.test.tsx
结果:5 个文件、92 项全部通过,0 跳过。包含 61 项媒体安全测试、15 项 PDF、15 项 IPC 和 1 项文件树调度检查。

pnpm test:unit:related
pnpm --filter desktop run --if-present typecheck
结果:通过。

pnpm test:runner
node scripts/test-workspaces.mjs --tier unit
结果:rebase 后推送前重跑通过,所有有测试的 workspace 均 PASS,退出码 0;根 runner 为 497 passed / 8 既有 skipped。未执行 pnpm test:unit。

pnpm check:dco
git diff --check f6c037cc9..HEAD
git range-diff 96e1202e7..3582d09fe f6c037cc9..HEAD
结果:通过,4 笔提交均带 DCO;前三笔 PDF 补丁完全等价,最后一笔只保留主干尚未包含的 5 项额外安全检查。

手工验证

本轮 rebase 未重新启动黑盒验收:PDF 源码和对应单测与重基前逐字一致,已补跑上述检查。以下保留重基前正式黑盒记录。

2026-09-07,当前独立 worktree 的 Global 隔离沙盒,Windows / Electron 41.10.3 / 原生 DPR=1。PDF 运行时代码对应 2b2814a4e(后续 3582d09fe 仅改媒体单测)。通过应用正常预览路径、原生滚动输入和主题设置验收,不覆盖 IntersectionObserver,不使用 DPR 模拟或强制 GC。最终 23 个检查点全部通过,本轮新增未处理异常为 0。

  • 120 页 PDF:首屏只渲染邻近页,三轮拖到中部再回首页以及第 120 页均正常,稳定时仅保留 1–2 个 canvas。
  • 混合页宽:2000、612、2000 点宽的三页,纯垂直滚动 1→2→3→1 均有真实文字和色块,scrollLeft 保持 0;独立审查也完成复现与修复复核。
  • 超大页:10000×10000 点夹具保持真实尺寸,顶部文字和色块实际可见,CSS 15000×15000,canvas 不超过 400 万像素;另测 2000×2000 点页。
  • 同页数文件反复切换、快速切换后恢复、小文件重开正常;Light / Dark 均验证。
  • 约 29MiB 的有效 PDF 正常预览;约 31MiB 的有效 PDF 被 Main 的 30MiB 硬限制拒绝,损坏文件正常回退且保留系统打开入口;未更改读取边界。
  • 超大页与小页反复切换,观察 OS 内存自然变化,不强制 GC;短期观测不是长期泄漏证明。
  • 自动化记录保留了早先窗口隐藏时的渲染等待超时、拖动时序失败和 CDP 重放历史异常;最终复测在原生前台帧正常后执行,并以异常原始时间戳区分历史事件与本轮新事件,不修改应用、observer 或 DPR。保留的历史异常发生于 19:28,早于 19:39 开始的最终验收,最终流程未复现。

未执行的验证

  • 未验证真实高 DPI 显示器和 macOS 实机;DPR 计算由单测覆盖,不将模拟结果当成硬件验收。
  • 未完成扫描图片型长 PDF 的长期资源稳定性验证。
  • 本机无原生文件 symlink 权限;重基后使用主干现有夹具,以真实硬链接配合 lstat 类型注入验证,本组用例不再跳过。原生文件 symlink 仍需在有权限的平台实测。

风险

风险分类

  • 跨平台差异:实机验收仅覆盖 Windows。
  • 其他:超大页降采样清晰度、PDF.js 文档内缓存。

影响与回滚

  • 影响范围:运行时仅 Desktop 工作区 PDF 预览;另外适配两份媒体单测,不修改生产安全边界。超大页因像素预算会降低清晰度;浏览器对极端单边尺寸仍可能拒绝渲染并进入已有错误回退。
  • 内存边界:本 PR 限制的是 canvas backing-store;PDF.js 的 decoded-image、页面和 operatorList 缓存仍可能保留至文档销毁,不声称整个 PDF 的总内存仅随视口有界。
  • 移动端冷更:不会触发。仅修改 Desktop renderer 及单测,没有触及移动端原生配置、依赖、共享 package 或 runtime fingerprint 输入。
  • SSH / 设备互联 / 手机版:未增加入口或 IPC,既有读取与远程降级路径不变;本次优化限本机 Desktop 的 PDF canvas。
  • 存量插件影响:无;未修改插件基座、权限或配置。无数据库、system prompt、协议和凭证变化。
  • 回滚 / 降级方式:回退本 PR 的 PDF 预览提交,可恢复原全量渲染;代价是恢复长 PDF 的旧 canvas 开销。渲染失败继续使用原占位卡和系统打开入口。

提交前检查

  • 已 review 完整 diff,独立 subagent 发现的问题已修复并复审
  • 每个 commit 都带 DCO 签名
  • UI 改动已在「UI 变化」注明引用的设计规范章节
  • 未提交凭证、令牌或授权文件
  • 已补充必要代码说明和回归测试,无需新增产品文档
  • 已确认测试结果或说明未执行原因

@DavidShenXD
DavidShenXD requested a review from a team as a code owner September 7, 2026 11:45
@greptile-apps

greptile-apps Bot commented Sep 7, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 将 Desktop 工作区 PDF 预览改为基于可见区域懒加载页面资源和 canvas,并限制 DPR 与单页 backing-store 像素数;同时增强页面离屏清理、文档切换销毁、混宽页面对齐及 Windows 链接相关媒体测试。

  • 可见页面通过 IntersectionObserver 进入渲染流程,离屏时取消任务并释放 canvas。
  • 单页 canvas 限制为约 400 万像素,CSS 阅读尺寸保持不变。
  • Windows 测试按文件 symlink 能力选择真实用例,并以注入测试维持安全语义覆盖。
  • 仍存在高页数 PDF 一次性挂载全部页面组件和占位 DOM 的性能缺口。

Confidence Score: 4/5

当前不建议直接合并,因为高页数但体积未超限的 PDF 仍可能通过一次性组件与 DOM 挂载阻塞预览渲染器。

canvas 光栅化已按视口有界,但页面组件、占位节点及观察目标仍与总页数线性增长;现有 30 MiB 文件限制不能约束这一规模,因此本次长 PDF 性能修复仍存在可达的不可用路径。

Files Needing Attention: apps/desktop/src/renderer/features/cc-agent/workdir-browse/PdfPreview.tsx

Important Files Changed

Filename Overview
apps/desktop/src/renderer/features/cc-agent/workdir-browse/PdfPreview.tsx 新增按可见区域懒渲染、canvas 像素预算及资源清理,但仍会按总页数一次性挂载全部页面组件和占位 DOM。
apps/desktop/src/renderer/features/cc-agent/workdir-browse/tests/PdfPreview.test.tsx 覆盖像素预算、混宽对齐、离屏取消、文档替换及错误清理,但未覆盖高页数文档的挂载开销。
apps/desktop/src/main/cindy-media/tests/blobStore.test.ts 增加 Windows 文件链接能力探测、目录 junction 适配及不依赖链接权限的注入安全测试。
apps/desktop/src/main/cindy-media/tests/ingest.test.ts 增加文件 symlink 能力探测,并验证注入 symlink 元数据后的字节与账本零副作用。

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[读取并解析 PDF] --> B[取得 pdf.numPages]
    B --> C[一次性挂载全部 PdfPage 占位节点]
    C --> D[IntersectionObserver 观察全部页面]
    D --> E{页面进入预取区域?}
    E -- 是 --> F[getPage 并创建 canvas]
    F --> G[按 DPR 与 400 万像素预算渲染]
    E -- 否 --> H[保留页面占位节点]
    G --> I{页面离开区域?}
    I -- 是 --> J[取消任务并释放 canvas]
    I -- 否 --> G
Loading
Prompt To Fix All With AI
### Issue 1
apps/desktop/src/renderer/features/cc-agent/workdir-browse/PdfPreview.tsx:426
**高页数仍全量挂载**

这里虽然只为可见页面绘制 canvas,但仍会按 `pdf.numPages` 一次性创建全部 `PdfPage` 组件、占位节点和观察目标。读取限制只约束 PDF 文件不超过 30 MiB,并不限制页数,因此包含数千乃至数万张简化页面的合法 PDF 仍可能在打开时建立同等规模的组件树和布局,导致渲染器长时间阻塞或内存耗尽。需要虚拟化页面占位,或明确限制可挂载的页数。

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Reviews (1): Last reviewed commit: "test(desktop): cover media symlink safet..." | Re-trigger Greptile

Signed-off-by: DavidShen <david@xd.com>
Observe any intersection so oversized PDF pages remain rendered after their placeholders expand. Cover low visible-area ratios, repeated viewport re-entry, canvas release and the per-page pixel budget.

Signed-off-by: DavidShen <david@xd.com>
Keep mixed-width pages on a shared left edge so visible placeholders remain observable. Bound integer canvas dimensions for thin pages and avoid ratio overflow on huge finite viewports. Add regression coverage for both cases.

Signed-off-by: DavidShen <david@xd.com>
Exercise permission-independent rejection, post-read replacement, handle cleanup and ledger side effects alongside the shared filesystem fixtures.

Signed-off-by: DavidShen <david@xd.com>
@DavidShenXD

Copy link
Copy Markdown
Collaborator Author

反馈已处理

已处理:

  • 已核验 “高页数仍全量挂载”(thread PRRT_kwDOTgdRUs6f5lgO)。结构问题属实,不是误报;本轮决定暂不引入完整 DOM 虚拟化,保留为已确认的性能风险。讨论结论是“评估后暂不修改”,不是“已修复”。
  • Array.from({ length: pageCount }) 确实全量挂载组件、占位节点和观察目标,可见集合变化也会触发父层全页遍历。30MB 限制只约束文件字节,不能限制页数或保证 DOM 开销有界。

变更:

  • 无生产代码、持久测试或依赖变更,无新增 commit/push;HEAD 仍为 e8bce295d。临时诊断测试已移除,未提交临时文档。
  • 本 PR 原始目标是可见页 canvas 懒绘制、页面占位、RenderTask 取消及 DPR/像素预算。DOM 虚拟化是另一层优化:需要新增文档级已测尺寸缓存,并处理变高页面的滚动位置保持、混宽页面水平宽度保持、重挂载和观察目标交接,需重新验收 hugepage、混宽页、往返/末页及双主题。本轮保留已验收布局,不把这套机制作为小补丁直接加入,也不以截断页数或降低 30MB 限制改变兼容性。

验证:

  • 本轮定向 Vitest:现有 PdfPreview 15 项、fileReadBytes 15 项、临时高页数诊断 3 项,共 33 项通过、0 跳过。未运行 pnpm test:unit 或全仓测试。
  • 使用实际 PdfPreview 组件、React 开发构建与 jsdom,mock pdf.js/IntersectionObserver:120 / 1,000 / 10,000 页分别挂载 242 / 2,002 / 20,002 个 DOM 元素,观察目标分别为 120 / 1,000 / 10,000。可见回调前均没有 getPage/render/canvas;只标记第一页可见时均只执行一次 getPage/render、保留一个 canvas;离屏后 canvas 数和被释放画布的像素面积均归零。
  • 这仅证明“DOM 线性增长、canvas 按可见页创建释放”同时成立,不是真实 10,000 页 PDF 的 Electron 性能黑盒验收,不能据此认定实机流畅。本轮未改 TypeScript,未重跑 typecheck 或 UI 黑盒;清理诊断文件后 git diff --check 通过,工作区干净。

备注:

  • 高页数仍可能因组件/DOM/观察目标开销造成首屏或滚动卡顿;不能把本 PR 描述为“PDF 总内存或所有开销与页数无关”。pdf.js 的页面、decoded-image、operatorList 缓存同样不受 canvas 预算约束。
  • 建议后续以动态尺寸 DOM 虚拟化为独立性能改动,复用仓库已有 @tanstack/react-virtual,增加真实高页数 PDF 实机验收。本轮没有创建后续 Issue,也没有声称风险已消除。现有 Light/Dark、30MB IPC 及阅读行为均未改变,不涉及移动端冷更。

@MagicLizi MagicLizi added status:ci-running CI 还在跑(review-pr 自动维护,仅展示) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) labels Sep 7, 2026
@DavidShenXD

Copy link
Copy Markdown
Collaborator Author

反馈已处理

已处理:

  • 已核验 check:pr-design-basis 的 CANCELLED 通知。旧运行 34119623097 在 Checkout 阶段被取消,设计依据校验步骤尚未执行,不是设计依据校验失败。
  • 同一 HEAD e8bce295d237ea4d275b0354247caa53db82fd33 的后续运行 34119634016 已 SUCCESS。工作流按 PR 编号设置 concurrency,并启用 cancel-in-progress: true;后续运行创建于 12:01:32 UTC,旧任务于该秒被取消,符合新运行替代旧运行的并发取消机制。

变更:

  • 无需修复代码、配置或环境;未修改工作流,未重跑已通过的检查,未新增 commit/push,未合并 PR。

验证:

  • 已确认本地为 cindy/vibrant-jepsen,工作区干净,本地 HEAD 与 PR head 一致。
  • 已查看旧任务步骤及取消日志,并核对后续成功任务日志,其中明确输出“设计依据校验通过(命中 UI 路径的变更文件 2 个)”。
  • 查询时 client-ci(含 Linux/Windows 单测、Desktop Git integration)、CodeQL 和 DCO 均已成功完成。本轮只核验现有结果,没有等待检查运行。
  • 未执行本地测试/typecheck:没有代码变更,派发的是已被后续成功结果替代的历史取消记录。

备注:

  • 旧 CANCELLED 记录仍可能出现在检查汇总里,但同名后续运行已通过。无需通过空提交或重新推送消除这条历史记录。

@MagicLizi MagicLizi removed the status:ci-running CI 还在跑(review-pr 自动维护,仅展示) label Sep 7, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

命中 UI 路径(apps/desktop/src/renderer/features/cc-agent/workdir-browse/PdfPreview.tsx)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范

@DavidShenXD

Copy link
Copy Markdown
Collaborator Author

反馈已处理

已处理:

  • 已采纳 界面效果证据缺失 的反馈,并将真实截图证据补入 PR description 的“UI 变化 → 改动后界面效果证据”。

变更:

  • 按反馈允许的格式加入自包含 HTML 代码块,内嵌 Light、Dark、120 页首屏、超大页顶部四张真实截图的 PDF 面板区域,标明平台、日期、采集 commit 与当前 commit。不是 SSR 样张或重绘 UI。
  • HTML 可复制保存后直接用浏览器打开;图片内嵌、无脚本和外部请求。保留纸张、外围主题与内容原像素,包括超大页真实的降采样模糊;不上传无关侧栏/聊天内容。
  • 只更新 PR 描述及本评论,未改代码、未新增 commit/push,截图和临时文档均未提交 Git。原有验证及风险段落保持原样。

验证:

  • 复核了 2026-09-07 19:39(北京时间)Windows / Electron 41.10.3 / 原生 DPR=1 的正式验收截图;与此前 23 项通过的记录相对应。本轮复用已有证据,没有声称重新运行黑盒。
  • 采集 commit 2b2814a 与当前 HEAD e8bce29 的 PdfPreview.tsx blob 一致:8f6c2c25a8c5e70cff3c0141b9767d96d9e8c446。
  • 四个裁剪区域均按验收时记录的面板坐标取得;PNG 解码后逐行核对 RGBA 像素与原图完全一致。HTML 解析确认四张内嵌 PNG 均可解码、尺寸正确,不含脚本/iframe/外部样式资源。已目检截图,并逐字校验 GitHub 返回的 UTF-8 正文。
  • 未执行单测/typecheck 或重跑 UI 黑盒:本轮仅补已有截图证据,没有修改产品代码。

备注:

  • GitHub 不会直接显示代码块内的图片,需展开并将 HTML 保存后打开;这是本条反馈明确接受的证据格式。截图只能支持外观核验,不单独证明性能,也不代替设计师批准。真实高 DPI、macOS 和长期资源稳定性仍保持原有未验证说明。未等待自动检查,未合并 PR。

@DavidShenXD
DavidShenXD merged commit 5e7c121 into main Sep 8, 2026
20 of 21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants