Files
ElyOffice/tasks/reviews/C07.2-r1.md
T

3.8 KiB
Raw Blame History

FAIL

crates/ely-lok/src/lib.rs:10 — [P1] C07.2 要求的 GPUI LokView 及视图渲染链缺失。当前仅导出 Worker、Doc、Tile、Invalidations;源码没有图块缓存、旧代际响应丢弃、页面裁剪或统一的缩放/滚动/DPI 坐标转换。临时消费程序 use ely_lok::LokView; 实测编译报 E0432;同一 960×960 twips 区域在 worker.rs:269 始终按 64×64 像素渲染,接口无法请求 200% DPI 所需的 128×128 像素。docs/engineering-risks.md:29 所称“客户端按页矩形裁剪”“旧代际图块不覆盖新画面”也缺少实现与验收依据。修复方向:完成可消费的 GPUI 视图、目标像素尺寸与共享坐标转换、按代际接收/丢弃图块,并以延迟旧响应及缩放、滚动、DPI 场景验证后更新证据。

crates/ely-lok/src/events.rs:122 — [P1] 每次按键或点击均通过 worker.rs:308、321 无条件递增代际并设置 all=true,覆盖精确失效矩形的作用,违反 LOK-03“只更新必要图块”。实测打开含两段文字的 FODT,读取 512×512 图块与失效批次,再点击 (150,150):点击前后像素完全相同,事件却从 (generation=0, all=false, rects=[]) 变为 (1, true, [])。局部编辑同样只能触发整区重绘;即使后端产生矩形回调,这个无条件全量标志仍然存在。修复方向:恢复可靠的内容区域失效来源,以实际脏区驱动重绘;将纯光标/选择事件与内容变更分开,补充局部编辑仅更新相交图块的测试。

crates/ely-lok/src/worker.rs:66 — [P1] WAIT_EVENTS 同步阻塞唯一的 IPC 读取线程,等待期间后续编辑、关闭和退出请求均无法被读取;非 macOS 的 serve 在第 214 行存在同一路径。客户端 poll_events 同时占用 &mut Worker 并同步等待回复。实测文档空闲、已知代际为 0 时发送文档允许的 WAIT_EVENTS(id, 0, 0),随后发送 POST_KEY 和 SHUTDOWN,1.5 秒后三个请求均无回复且进程仍存活;当前后端没有自发图块回调,只有被堵住的编辑请求才能推进代际,因而形成永久等待。修复方向:让事件订阅/等待期间继续处理控制请求,提供可完成的取消与关闭路径,并验证空闲订阅后编辑和退出均可完成。

crates/ely-lok/src/worker.rs:269 — [P1] 图块尺寸直接做有符号除法、usize 强转与未检查乘法,错误参数进入分配和 FFI。通过与公开 Doc::paint_tile 相同的请求格式实测:(w=0,h=960) 和 (w=14,h=960) 都返回 OK、零像素;(w=-15,h=960) 在第 270 行触发 attempt to multiply with overflow,worker 中止,客户端收到 EOF,进程内全部会话随之丢失。修复方向:在分配及调用 LOK 前校验文档区域和目标像素尺寸,以 checked arithmetic 核对缓冲区及 IPC 上限,非法请求返回明确错误并保持 worker 可用;覆盖零值、负值、极小值及超大值。

crates/ely-lok/src/client/tests.rs:210 — [P2] 像素测试把全零缓冲区计为有效深色像素;第 221 行的编辑失效测试只核对代际与标志,未验证更新后的画面。本轮在临时副本中仅将 Document::paint_rect 的函数体改为空操作,保留独立的启动绘制自检,重新构建 worker 后,a_tile_paints_real_pixels 与 an_edit_bumps_the_generation_and_invalidates 仍全部通过;此时实际图块始终为全零。这使当前测试无法守住 C07.2 的基本绘制与更新行为。修复方向:针对包含已知正文的区域验证有效页面/文字像素以及编辑造成的预期画面变化,并要求该空绘制变异触发失败。基线已亲自完成 cargo build -p ely-lok --bins --locked、cargo check -p ely-lok --all-targets --locked、固定补丁引擎下的全部 10 项测试与注释检查,均通过。