JianFeeeee
f4d5a75976
跨端: 补 MailSummary 的解析边界兜底(列表这条主流的 omitempty 一直是敞的)
判决书来自 `harmony-arkts` 那条判据,它在我加了授权栏历史之后报出两处调用点:
MainPage.ets: parts.push(e.reason.length > 0 ? …) ← 假阳性
MainPage.ets: if (m.mail_type === 'permission_request' && m.permission_result.length > 0) ← 真 bug
## 真 bug:`MailSummary` 没有解析边界兜底
本仓早就为这个形状付过代价,**而且修法只修了一半**:
· `MailDetail` 有 `normalize()`,并在 `MailApi.mailDetail()` 接了(当时那次是**整页白屏**);
· 而列表用的 `MailSummary` **没有** —— 于是 `mail_type` / `permission_result` /
`session_alias` 这些带 `omitempty` 的字段在缺失时是 `undefined`,
而三处调用点直接读 `.length`。
服务端 `omitempty` 的语义是**整个 key 不出现**(不是给空串),
ArkTS 裸 cast(`JSON.parse(raw) as T`)缺键给 `undefined`、**不会**应用类里那个 `= ''`。
⇒ 这是同一形状的**第四次**(前三次:`MailDetail` 白屏、`participantAddress` 的 trim、
`AddressSuggestion.title`)。前三次都是"读的人临时守一下",
**而列表这条主流一直敞着**。
修法(与 `MailDetail` 同一处、同一纪律):给 `MailSummary` 加 `normalize()`,
在 `MailApi.inbox()` / `sent()` / `sessionMails()` **三处**解析边界接上。
★ 为什么不在调用点加 `??`:`MailSummary` 上还有 `mail_type`/`session_alias`
同样带 omitempty —— 逐个调用点加就是"每加一处就得记得做一次",
本仓反复在消的形状。归一化做一次、覆盖全部字段。
## 假阳性:同名词撞车
`e.reason` 的 `e` 是 **`AccountError`** —— 鸿蒙**本地类**(`MailStore.ets:73`),
只经 `AccountError.of(account, reason)` 构造 ⇒ `reason` 恒为 string。
而判据收集的那个 `json:"reason,omitempty"` 属于 `RenameProposal`
(`rename_proposal.go:39`,**完全不同的**接口)。已按既有
「已逐个核实过的豁免」格式加 ⑤,附取证。
## 期间修了判据自己的一个洞(变异实测)
我给 ⑥ 加豁免时第一版写的是**无条件**正则 —— 变异实测
(把 `MailSummary.normalize` 里那行 `m.permission_result = str(...)` 删掉)
**判据照样全绿**:豁免把那一行永久致盲了。
这正是本仓反复消的形状:**豁免口自己没人管**。
⇒ 改成"**有前提**的豁免":先断言 `MailSummary.normalize` 里确实有那两行,
命中才豁免。变异复验:
删掉 normalize 里 permission_result → 判据红 ✓
删掉 normalize 里 mail_type → 判据红 ✓
两者都在 → 全绿 ✓
⇒ 豁免表达的是"**因为上游归一了**,所以这里可以不写 ?? ",
而不是"这一行不用管"。
2026-09-21 17:06:19 +08:00
..
2026-09-14 15:41:52 +08:00
2026-09-15 12:09:37 +08:00
2026-09-19 23:38:35 +08:00
2026-09-15 07:46:54 +08:00
2026-09-21 14:32:38 +08:00
2026-09-14 16:21:27 +08:00
2026-09-15 11:17:23 +08:00
2026-09-21 15:50:00 +08:00
2026-09-19 15:03:40 +08:00
2026-09-17 22:32:25 +08:00
2026-09-14 17:33:05 +08:00
2026-09-15 12:55:25 +08:00
2026-09-20 05:22:42 +08:00
2026-09-20 05:45:42 +08:00
2026-09-20 10:51:28 +08:00
2026-09-21 16:45:23 +08:00
2026-09-21 13:29:24 +08:00
2026-09-19 19:29:49 +08:00
2026-09-21 13:29:24 +08:00
2026-09-21 02:19:30 +08:00
2026-09-17 18:43:00 +08:00
2026-09-20 08:16:10 +08:00
2026-09-21 17:06:19 +08:00
2026-09-20 22:35:35 +08:00
2026-09-20 07:37:16 +08:00
2026-09-18 08:39:21 +08:00
2026-09-19 16:18:10 +08:00
2026-09-20 21:14:20 +08:00
2026-09-21 13:29:24 +08:00
2026-09-15 12:06:15 +08:00
2026-09-16 08:29:24 +08:00
2026-09-17 19:38:15 +08:00
2026-09-17 18:43:00 +08:00
2026-09-14 16:21:27 +08:00
2026-09-21 13:29:24 +08:00
2026-09-18 10:34:00 +08:00
2026-09-14 15:11:47 +08:00
2026-09-15 08:45:54 +08:00
2026-09-15 07:46:54 +08:00
2026-09-14 17:33:05 +08:00
2026-09-21 15:50:00 +08:00
2026-09-18 01:08:04 +08:00