Skip to content

v2.1.19 — 把「加载时缩一下」钉成回归用例

Choose a tag to compare

@Glittering Glittering released this 25 Oct 15:40
· 83 commits to main since this release

v2.1.19 — 把"加载时缩一下"钉成回归用例

上一版(2.1.18)抓到了真因:白屏自检用 clip.scale=0.25 截图,Chromium 会按该比例
临时重建 surface,自检又恰好跑在 did-finish-load+450ms,于是那张 1/4 的图被贴上
1–3 帧。但抓它用的是一次性手工取证(60fps 录屏 + 手算裁切),下次再有人把缩放交给
合成器,没人会重跑那一套。

这一版把取证固化成套件,并清掉最后一条同类路径。

新增:npm run flicker(帧级回归)

e2e/flicker_ws.cjs + e2e/_win_capture.py:起 App → 加载铺满视口、上下带
每次换色通栏色带的 fixture → 触发 reload → avfoundation 固定 60fps 录内容区 →
逐帧判定。

两条断言:

  • 采集有效:帧间差异峰值 > 1.0。整段画面一帧没变 = 根本没拍到目标窗口,
    此时的"通过"是假的。
  • 零缩小帧:任意一帧内容宽度 ≥ 60%(正常 97–100%,故障 24–25%)。

负向验证:把 clip.scale 加回去,3 轮全部 FAIL、tiny=24.3%、连续 3–4 帧;
恢复后 3/3 全绿,每轮恰好 1 帧可见变化。没通过这一步的回归不算回归。

修复:ui.screenshot 的 clip.scale < 1 不再交给合成器

按 scale=1 抓、本地 nativeImage.resize() 缩,输出尺寸与语义不变。
这是最后一条会把缩放交给合成器的自动路径。
(clip.scale > 1 仍交给 Chromium —— 本地放大得不到像素,且只在调用方显式要放大值时发生。)

修正:view 套件的两条断言写反了

R-01 / R-04 一直在要求"导航事件必须触发重绘",而那正是 v2.1.16 为了消灭
"先缩成左上角一小块、闪一下"而撤掉的行为。断言现在反过来钉住新不变量:
导航/输入这类"动作"路径上不许重绘。e2e:all 从 v2.1.16 起就是红的,只是没人跑。

补漏:e2e:all 收进 dialog / wrapper / paint / layout

这四个套件此前只在自己文件里,全量验收从没跑过 —— 加了套件但没进全量等于没加。
现在 npm run e2e:all 是 19 个套件 / 636 断言。

文档

docs/SPEC.md 新增「帧级回归」一节,含五个制造过假阴性的坑(变帧率录屏、
写死裁切坐标、CGDisplayPixelsWide 当 backing scale、固定时长等待、量非白像素 bbox);
README 的测试清单按实际断言数校准。