Files
ElyOffice/tasks/reviews/C11.1-r1.md
T

7.5 KiB
Raw Blame History

FAIL

apps/ely-pdf/src/pages.rs:192 — 测量视口的绝对定位 canvas 缺少位置约束,其静态位置落在页面栈之后,room.origin 因此指向文档底部;page_at 用这个原点换算鼠标位置,文字选择失效,违反 PDF-01。复现:真窗口打开三页 Letter PDF,在第一页拖选文字;实测鼠标窗口坐标为 (356,179),测量原点为 (240,3349.5),拖选始终没有高亮,复制保留测试剪贴板标记。独立构建和原有 17 项测试均通过;跨页复制测试直接设置 Selection,遗漏真实命中路径。修复方向:从实际滚动视口测量固定原点与尺寸,使测量层位置明确绑定视口,并以真实鼠标拖选验证。

apps/ely-pdf/src/select.rs:98 — 文字尚未缓存时,首次按下只发起后台读取并将 selection 清空;读取完成只缓存字符,拖选起点永久丢失。复现:校正上述视口坐标后,首次按下文字、等字符读取完成、继续拖动并松开,selection 仍为空;第二次拖动才出现高亮。隔离探针 review_first_drag_keeps_its_anchor_after_text_arrives 失败,原有复制测试绕过这条输入路径。修复方向:保留发起标签、页、按下位置和拖动状态,在字符到达后完成仍有效的选择操作,并覆盖首次拖选与跨页迟到读取。

apps/ely-pdf/src/search.rs:151 — 跳转将目标页顶部向下留出两倍 GAP,露出上一页底部;pages.rs:107 随后把第一张可见页设为 current,导致当前页回退,违反 PDF-01 和 agents.md 中视图变化保持当前页的声明。复现:三页 PDF 连续模式下从第一页按 PageDown,真窗口显示第二页正文,状态栏仍为 Page 1 of 3,再次 PageDown 继续计算同一个目标。隔离探针在 show(1,0) 后实际执行 page_view,current 为 0,预期为 1。修复方向:协调跳转位置与当前页判定,使目标页在绘制后仍为当前页;通过真实翻页、缩放和旋转后的帧验证。

apps/ely-pdf/src/search.rs:98 — 搜索回调只核对局部 round;新 Find 从零计数,旧查询的批次可以进入另一个查找实例,污染命中和已搜索页数。复现:A 有三页和三处 alpha 命中,启动 alpha 搜索后立即切到只有一处 zzz 的单页 B 并查找 zzz,两次查询 round 均为 1;隔离探针实际得到四处命中,页号为 [0,2,2,0],预期只有 B 的 [0]。修复方向:结果绑定发起标签和独立查找实例,再核对查询代次;关闭、重开与换标签均使旧实例结果失效,增加延迟批次回归。

apps/ely-pdf/src/search.rs:134 — 查找状态属于 find.tab,命中跳转却经 show 修改当前活动标签;后台自动选择首个命中会改变用户已经切换到的文档。复现:在三页 A 搜索只出现于第三页的 two,批次返回前切到单页 B,保留 A 的查找状态;隔离探针由真实搜索回调自动跳转,B 的 current 从 0 变成 2。修复方向:跳转核对并作用于查找所属标签,活动标签改变时延后该实例的自动跳转;覆盖后台搜索期间切换标签。

apps/ely-pdf/src/pages.rs:222 — 渲染失败只发提示,随后无条件 notify;图块仍缺失,下一帧继续请求相同图块,形成持续失败与重绘循环,违反空闲无重绘规则。复现:真窗口打开 PDF,终止它的 worker,再点 Zoom In;原始应用在之后两秒空闲期间记录 240 次 drawing a page 失败,并不断生成错误提示。修复方向:记录图块或 worker 的失败状态,停止自动调度失败请求,在明确重试或重新打开时恢复,并验证故障后的空闲行为。

crates/ely-pdf-engine/src/bin/ely-pdf-worker/ffi.rs:196 — 页内搜索固定使用 512 个 quad 的容量,结果饱和时直接返回成功,遗漏后续命中,违反 PDF-01 全文搜索。复现:一张 612×792 pt 页面放置 50 行、每行 12 个独立 alpha,共 600 处;真实 worker 搜索仅返回 512 处,应用据此报告完整结果。修复方向:使用能够取得全部命中的搜索接口或完整遍历策略,并覆盖单页超过 512 处命中。

crates/ely-pdf-engine/shim/ely_mupdf.c:218 — 搜索丢弃 MuPDF 的命中分组信息,应用将每个 quad 计为一处命中;跨行短语的一处匹配因此被拆成多处。复现:单页只有两行 hello 和 world,查询 hello world;真实 worker 返回两个 quad,真窗口显示 1 of 2,下一处在同一短语的两行之间跳转。修复方向:保留一个逻辑命中与其全部四边形的关系,计数、跳转与高亮按逻辑命中处理,并增加跨行短语回归。

apps/ely-pdf/src/viewer.rs:217 — 第二个加密文件直接覆盖第一个密码对话框,前一个已经打开的 worker 文档失去界面入口和关闭路径。复现:依次打开两个 AES-256 PDF,在输入密码前让第二个密码框出现,再取消第二个;隔离探针仍能用正确密码解锁第一个 Doc,证明该文档遗留在 worker。启动参数和多选打开均可进入此路径。修复方向:串行处理待授权打开,或在替换密码请求时显式关闭被替换文档;保证每个待授权 Doc 都有可达的完成或取消路径。

apps/ely-pdf/src/pages.rs:138 — 图块淘汰仅核对页号、缩放、旋转和主题;同一张页内已经滚出屏幕的图块持续保留,违背 agents.md 的 C11.1“屏外与旧缩放的块即丢”声明。复现:612×14400 pt 长页在固定缩放下向下滚动 1500 px,隔离探针确认屏外 ty=0 图块仍在缓存;沿长页继续滚动会累积整页像素。修复方向:按实际可见图块集合淘汰缓存,并在后台结果到达时核对该图块是否仍可见;覆盖长页内滚动。

apps/ely-pdf/src/viewer.rs:387 — 有文档时始终分配左侧书签栏,即使书签列表为空,也只显示 No bookmarks 并常驻占用 240 px,违反 PRD §5.2“无内容的侧栏不占位”。复现:真窗口打开没有书签的普通 PDF,左栏占位且中央适合宽度的页面随之缩小。修复方向:按当前标签实际书签内容决定是否提供左栏,覆盖空书签文件与有书签文件之间切换。

apps/ely-pdf/src/viewer.rs:82 — 空白窗口也立即启动 worker,worker 初始化 MuPDF,违反 PERF-01“无文件冷启动……不预加载未使用内核”。复现:以零文件参数启动 ElyPDF,实测空白窗口已有一个 ely-pdf-worker 子进程,日志显示 worker up。修复方向:首个打开请求时再启动 worker,在后台完成初始化并显示打开状态,验证无文件启动时的子进程。

crates/ely-ipc/src/lib.rs:23 — 长度头已经读入部分字节时的 UnexpectedEof 被当作正常流结束,截断帧错误被吞掉。复现:输入只有 1、2 或 3 个长度字节后关闭,read_frame 返回 Ok(None);真实 PDF worker 收到一个长度字节后以 0 退出,输出和错误均为空。原有测试只覆盖空流 EOF;新增隔离截断头探针失败。修复方向:区分尚未开始新帧的干净 EOF 和部分长度头的截断,后者返回错误,覆盖三个截断长度。

crates/ely-pdf-engine/shim/ely_mupdf.c:100 — 三处注释超过十词:第 100 行 11 词、第 108 行 12 词、第 244 行 11 词,违反 agents.md 的注释长度规则。复现:逐条按空白分词即可得到上述计数;现有 comments.py 检查通过,因为其 C 文件范围只包含 tests/engines,遗漏该垫片。修复方向:缩短三处注释,并让现有注释检查覆盖该项目 C 源文件。