fix(island): 修好"收起后再次点击灵动岛没反应"(假失焦缩回 + 命中状态互相覆盖)
根因一(假失焦):展开时 setFocusable(true)+focus() 会引发一次与用户无关的失焦 (实测 70~520ms 后到达)。原来的失焦处理器在 500ms 宽限期之后就把任何 blur 当成 "用户点了别处",于是刚展开的岛立刻缩回胶囊 —— 看起来就是"点了没反应"。 现在只在**指针确实离开岛体**时才认为用户点了别处(新增 isCursorOnIsland)。 根因二(命中抖动):渲染进程与主进程各自下发 setInteractive(true/false),而两边几何 逐帧不一致(弹簧形变 + 岛体矩形上报限流),窗口就在"接收鼠标 / 穿透"之间几毫秒翻转一次, 点击撞上穿透态即"点不动"(日志实测 true/false 成对翻转)。现在命中判定单一权威: 渲染进程只负责"立刻打开命中",关闭一律由主进程按真实光标轮询(120ms→60ms)决定; 同时去掉"窗口一可见就整块 476×282 包围盒接收鼠标"(会在屏幕上方留一块看不见却点不动的 区域)、淡出期间不接收鼠标、岛体矩形上报限流 100→50ms。 验证(真机真实点击,非合成事件):SetCursorPos + mouse_event 连续 4 轮 "点开 → 点卡片收起 → 再点胶囊"全部正常,展开后保持展开不再被假失焦缩回 (修复前 0.5~2s 内必缩回);pnpm verify:desktop 78/78(新增回归用例 「假失焦(指针仍在岛上)不回缩:展开后必须保持展开」)。 顺带修掉既有测试缺陷:通知菜单项带未读徽标时整项 textContent 变成 "2通知", 用 startsWith 匹配会误报"菜单项缺失",改为按文案层 span 精确匹配。
This commit is contained in:
1 parent
70250151d0
commit
a7b0e9c2b3
6 files changed
+173
-55
No files matched your search
+6
-1
@@ -85,9 +85,14 @@ const EXPECTED_MENU: Array<{ label: string; path: string }> = [
|
||||
export async function layoutNavigationSelfTest(): Promise<SmokeCheckResult> {
|
||||
const { router } = await import('../router/index.js');
|
||||
|
||||
// 按**文案那一层 span 的完整文本**匹配,而不是整项 textContent:
|
||||
// "通知"项里还有一个未读红点徽标(sup),整项 textContent 会变成 "2通知",
|
||||
// 用 startsWith 匹配就会误报"菜单项缺失"(历史失败原因)。
|
||||
const findMenuItem = (label: string): HTMLElement | undefined =>
|
||||
(Array.from(document.querySelectorAll('.el-menu-item')) as HTMLElement[]).find((element) =>
|
||||
(element.textContent ?? '').trim().startsWith(label),
|
||||
Array.from(element.querySelectorAll('span')).some(
|
||||
(span) => (span.textContent ?? '').trim() === label,
|
||||
),
|
||||
);
|
||||
|
||||
if (!findMenuItem('课表')) {
|
||||
|
||||
Reference in new issue
Block a user