jianf
d94717aa95
test(ele): ★★ preload 加载闸门 —— 一句类型标注能静默废掉整条桥
## 为什么要这条(一个当场踩到、且 tsc 抓不到的坑)
上一个提交给 `preload.cjs` 加窗口动作时,第一版写了 TS 类型标注:
onMaximizedChanged: (cb: (maximized: boolean) => void) => { // ← .cjs 里不能有
`preload.cjs` 是纯 JS,整个文件**静默**加载失败。症状链:
hasBridge: false hasWin: false base: "/api/v1" tok: <null> store.n: 0
text: "用户名 | 密码 | 登录"
· 账号读不到 ⇒ 回退到**网页版**登录分支(用户名+密码,桌面壳里注定失败)
· 标题栏不渲染 ⇒ 自绘窗口那条顶栏整个消失
★ 而 `npm run typecheck`(`tsc --noEmit`)**不检查 .cjs**,一路全绿。
我当时就是靠它判断「没问题」的 —— 它证明不了这件事。
## 为什么这条判据要「真的加载」而不是读文件看字符串
失效形状是「**静默少给一整条桥**」:不抛错、不警告,症状出现在**别处**
(看起来像「功能没做」而不是「代码坏了」)。
与 `93697c4`(stripComments 两趟正则吃掉 137 行真代码)同一族,但更狠 ——
那条至少还会让某条判据红;这条让**所有**判据都无从察觉
(大家都不读 preload,自然没人会发现它没加载)。
⇒ 所以闸门是 `new Module(...)._compile(code(PRELOAD), PRELOAD)`,
真的解析并执行到底(stub 掉 `electron` 模块)。
不是 `node -c`、不是正则、不是 `require`。
**变异验证**:把类型标注加回去 ⇒
失败 ★ preload.cjs 能真的加载 — 实际错误:Unexpected token ':'
主进程安全防线:18 通过,1 失败
★ 且验证了它在 `code()` 剥掉注释后**仍然有效**(剥注释会改行号,
但这条判的是「能不能解析执行」,不依赖行号)。
## 另 4 条(都属自绘窗口这一批)
* preload 不得暴露任意 IPC 透传(只有具名动作)
* 窗口三个动作都过了窄接口(`frame:false` 之后没有系统标题栏兵底)
* 最大化状态是订阅来的(`pushMaxState`:`maximize`/`unmaximize`/进退全屏)
* `frame: false` 与 `titleBarStyle: 'hidden'` 同时在
## 自报条数 14 → 19
`run-all.mjs` 的显式编辑(§6.6)。**这条是套件自己抓到的**,
不是我改的 —— 判据报「自报 19 条 > 登记的 14 条,新加的那几条不在
"被删会红"的保护内」。
## 顺带修一条自己的判据缺陷
新写的闸门一开始用了裸 `readFileSync` 读 preload,被
`criteria-hygiene` 抓(「判据目录里不得出现裸 readFileSync」)。
改成 `code()` —— 判「有没有这个符号」时要的是代码,裸读原文会被
解释性注释骗(同坑本仓踩过两次,其中一次就是这条判据自己)。
## 两份 GUI 复查报告一并存档
`docs/reviews/gui-review-2026-10-03.md`(基线 `5e312c6`,848 行)
`docs/reviews/gui-fixes-review-2026-10-03.md`(基线 `b4610f1`,575 行)
★ 第二份里**否证了上游报告两条**,避免下一任白做工:
① 鸿蒙日历「格/行时间基准不一致」是**误报** —— 5 个时区实测
`hhmmAtOffset(ts, deviceOffsetMinutes)` 恒等于 `getHours()`;
② `MailStore.bump()` 不发布 AppStorage 是**设计**(混用会死循环),
`harmony-state-review.md` #3 是误读。
★ 另外查出一条比那批修复更要紧的事:HarmonyOS 客户端**当前编译不过**
(`Theme.hairline` 从未定义,48 个提交前就坏了),而修复提交的信息写着
「BUILD SUCCESSFUL」—— 路径在本机不存在。已用 `git worktree` 对照旧基线
证明**不是这批提交引入的**。已在报告 §2/§5.2 记明并给了修法选项,
**未动业务代码**(等决策)。
## 本机实测读数(装依赖 + 补齐 4 个环境变量后)
RESULT files=39 ran=39 checks=635 pass=623 fail=2 skip=10 red=5
broken=0 unreported=0
变异通道 mutants=52 ran=52 on_new_criteria=37
npx vitest run → Test Files 16 passed / Tests 271 passed
npm run typecheck → 通过
剩 5 个红**全是环境**,不是缺陷:
· `build-stamp` —— 本机没 `npm run build` 时的产物
· `harmony-push` —— `agconnect-services.json` 不存在(该欠账的 `due` 就是"拿到真机")
· `--exitcode-selftest` + 因果对照 + `summary.py baseline-residue`
—— 三者**同一个根因**:本会话 uid=1000 非 root,`runuser`/`setpriv`
都无法降权(实测 `runuser -u nobody` 报"非 root 用户不能使用")
⇒ `run-all.mjs:1043` 的 `dropTo` 探测返回 null ⇒ 那 6 个需要降权的
变异案例被跳过并计红,连带 baseline 残留检测一起失效。
★ 那条报错文案写着「优先按变异残留查」会**把人引向查工作区**,
而底本在 `mkdtempSync` 造的 /tmp 迷你仓库里、与工作区无关
—— 已在报告 §4.3 记下,建议文案补一句先看 selftest 是否先红了。
2026-10-04 11:08:57 +08:00
..
2026-09-28 11:14:17 +08:00
2026-09-28 08:46:02 +08:00
2026-09-28 10:22:45 +08:00
2026-09-28 08:46:02 +08:00
2026-10-04 11:08:57 +08:00
2026-10-04 11:08:57 +08:00
2026-09-28 08:46:02 +08:00
2026-09-28 08:46:02 +08:00
2026-09-28 08:46:02 +08:00
2026-09-28 09:53:12 +08:00