diff --git a/client/electron/test/harmony-2in1.test.mjs b/client/electron/test/harmony-2in1.test.mjs index 3c37dc9..52fc1ee 100644 --- a/client/electron/test/harmony-2in1.test.mjs +++ b/client/electron/test/harmony-2in1.test.mjs @@ -368,3 +368,130 @@ test('2in1 快捷键|选 keyboardShortcut 的理由写在源码里(否则后 assert.match(mainProse, /未获焦|获焦窗口/, '要写明"不依赖焦点"这条理由'); assert.match(PROSE_INTENT, /两半|当初|坑/, 'ComposeIntent 要留下"为什么需要中间层"的由来'); }); + +/* ──────────────────────────────────────────────────────────────── + * ⑤ 键盘可达的**其余三个页面**(2026-09-24 用户逐条点名) + * + * 用户原话:「还有快捷键,比如主页回车打开写信。邮件详情页回车打开回复。 + * esc返回上一级」+「你在登陆页是不是没有做 enter 等键的监听」。 + * ──────────────────────────────────────────────────────────────── */ + +test('2in1 快捷键|三个页面都用同一套键判定(不许各写一遍 KeyCode 比较)', () => { + /* + * 钉的是**单一出处**这条纪律。 + * + * 三处(主页 / 详情 / 登录)都要判"是不是回车、是不是按下"。 + * 各写一遍 `e.keyCode === KeyCode.KEYCODE_ENTER` 的后果早就见过: + * 本仓 `SentRow` 与 `MailRow` 那对就是"同一件事两处各写一遍、然后慢慢分叉"。 + * 所以规则集中在 `model/KeyboardShortcuts.ts`,三个页面只 import。 + * + * 改坏会红:任一页面改成自己比较 KeyCode(而不是走 isEnterKey)。 + */ + const LOGIN = code(join(ETS, 'pages/LoginPage.ets')); + const DETAIL = code(join(ETS, 'pages/MailDetailPage.ets')); + const SHORTCUTS = code(join(ETS, 'model/KeyboardShortcuts.ts')); + + assert.match(SHORTCUTS, /export function isEnterKey/, '键判定要有一个集中出处'); + assert.match(SHORTCUTS, /export function isKeyDown/, '按下/抬起的判定同样要集中'); + + for (const [name, src] of [['主页', MAIN], ['详情页', DETAIL], ['登录页', LOGIN]]) { + assert.match(src, /from '\.\.\/model\/KeyboardShortcuts'/, + `${name} 要从 KeyboardShortcuts 引键判定(不是自己写 KeyCode 比较)`); + } + /* + * 页面级的键处理不许自己比较 ENTER —— 那是分叉的起点。 + * + * ★ 只查**页面级 onKeyEvent 那一处**,不查全文件: + * 详情页里还有**输入框内的候选导航**(`onFwdKey`/`onToKey`, + * 与 ComposePage 同款),那里的 `KEYCODE_ENTER` 是"选中候选", + * 与"页面级回车=打开回复"是**两件事**,必须分开判。 + * (第一版我查了全文件、判红了自己 —— 判据比事实严格也是错的。) + */ + for (const [name, src] of [['主页', MAIN], ['详情页', DETAIL], ['登录页', LOGIN]]) { + const at = src.indexOf('.onKeyEvent((e: KeyEvent)'); + assert.ok(at > 0, `${name} 要有页面级 onKeyEvent`); + /* 取到该回调结束(下一个 `})` 收口)—— 页面级处理的范围 */ + const body = src.slice(at, src.indexOf('})', at) + 2); + assert.ok(!/KEYCODE_ENTER/.test(body), + `${name} 的页面级键处理不许自己比较 KEYCODE_ENTER(要经 isEnterKey)`); + } +}); + +test('2in1 快捷键|登录页要有回车提交(WebUI 靠