Skip to content

v1.8.0 · 截图历史 · 滚动捕获 · 测试名英文化

Choose a tag to compare

@YJLZSL YJLZSL released this 26 Sep 03:09
· 12 commits to main since this release

新增

  • 截图历史。截图一直在往 shots/ 里存(单帧与长图都存),但在这一版之前
    没人能看见它们 —— 存了个寂寞。现在命令面板里有「截图历史」:网格缩略图、
    按时间倒序、可删。图片通过 deskbase://localhost/shot/<文件名> 提供。

    那个图片入口做了路径穿越拦截:只认纯文件名,带 /、\、.. 一律 404。
    URL 是能被构造的,不拦的话 shot/../../main.dkb 就能读到任意文件。

  • 滚动捕获:能截外部应用的长图(浏览器、资源管理器、任何窗口)。

    与站内「长截图」的分工:站内那套由界面驱动滚动,只能截 DeskBase 自己;
    这一套你自己滚,所以能截任何窗口。

    为什么不让程序帮你滚:capture.rs 的设计底线是「不合成输入」——
    模拟滚轮(SendInput)会把事件注入到用户的其它应用里,而那时焦点在哪、
    用户正在做什么,程序都不知道。截外部应用不需要跨那条线:你滚,我们抓。

    抓帧由 Rust 后台线程定时做(约 5.5 帧/秒),不是 WebView 的定时器 ——
    用户点走外部窗口后,WebView 的定时器会被节流甚至暂停。

    去重是这一套的关键:站内是"滚一屏抓一帧",每帧必有位移;
    而录屏式抓帧大部分时候用户是停手的,抓到的帧完全一样。
    把重复帧拼进去,长图里就会出现大段重复内容 —— 所以拼接前逐对估位移,
    位移为 0 的帧直接丢掉,并且和上一张保留的帧比(而不是相邻帧比)。

重构

  • 259 个中文测试函数名全部改成英文(app/src 下递归扫描,剩余 0 个)。

    为什么要改:cargo test <filter> 想筛某个测试时,中文名在这台机器上根本打不出来
    (命令行中文编码是坑,findstr 搜中文直接无输出);而且这是公开仓库,英文名更通用。

    命名沿用原语义,保持"读名字就知道测什么",比如:

    原名 新名
    备份_创建后可独立读回且表数一致 backup_read_back_standalone_with_matching_table_count
    位移为零时不重复追加 zero_shift_does_not_append_twice
    前导零的工号必须判成文本 leading_zero_employee_id_is_text

    注释、文档、界面文案仍然是中文 —— 改的只是标识符。

修复(改名踩到的两个坑,都值得记)

  1. 测试名被字符串引用时,改名不是零风险。
    import_pipeline.rs 里有个常量 CRASH_TEST 存着测试名,子进程靠它筛测试 ——
    改名后子进程匹配不到任何测试,于是"正常退出",断言报"子进程本该被强杀,却正常退出了"。
    我事先说"零风险"是说漏了这种情况。改完必须真跑测试,不能只靠推理。

  2. 说"全部改完"之前,扫描范围要真的覆盖全部。
    前四批我只扫了 app/src/*.rs,漏了 model/ 与 store/ 两个子目录(33 个)。
    一层 glob 不等于全部。

验证

项 结果
单元测试 265 通过 / 0 失败(改名前后一致)
界面烟测 112 / 112
门禁 五道全过
中文标识符 递归扫描:剩余 0