fix(startup): autostart catch 块缺 return 导致复活主窗口 (#468)#488
Conversation
PR #474 引入的"前端兜底"useEffect 在 webview ready 后读 prefs.startMinimized,true 则跳过 currentWindow.show()。但 catch 块只 console.warn 没有 return,控制流继续走到 show()——等于"prefs 读失败 = 强 show"。 autostart 早期 IPC 抖动时 getSettings() 偶发失败,旧逻辑让用户明明开了 静默启动仍把主窗口弹出来。 修复: catch 块加 return,安全侧默认 = 当作 startMinimized=true 保持隐藏。 宁可让用户从 tray 手动唤起,也不要在 autostart 抖动时强 show 一个白色 / 透明主窗口。 LSUIElement 不在本 PR 范围: 那是全局 macOS UX 决策,会影响 Finder 双击 / Spotlight / Launchpad 启动场景,应单独 PR + 单独评审。 正确做法是 Rust 端动态切 activationPolicy 而非 plist 静态写死。 Refs #468
PR Reviewer Guide 🔍(Review updated until commit 3a5e0e3)Here are some key observations to aid the review process:
|
Both local review and PR-Agent bot flagged the "fallback when settings read fails" semantic reversal. Re-analysis confirms the change is correct, but the rationale needs to be explicit in the code: - Rust `get_settings` signature is `pub fn -> UserPreferences` (not Result), so this catch is unreachable from a normal first-launch scenario (returns defaults). Only Tauri IPC infrastructure failures (e.g. __TAURI_INTERNALS__ not ready during autostart early-mount) reach this branch. - Tray is registered by Rust setup() before webview ready, so it remains the universal fallback entry point — no "user locked out" risk. - Improved console.warn to include err.message for diagnostics, since raw err objects serialize as [object Object] in Tauri devtools. No behavior change; comment + log improvement only. Refs review of #488
关于 pr_agent_job 的 "preserve fallback" 合规疑虑bot 提到本 PR 未 "Preserve a fallback when settings read fails",这是 PR #474 设计契约的反转——这次是有意的,且本地代码审查已验证。在此把判断依据写明: 1. Rust 端
|
|
@claude 请审核此 PR。如有问题请逐条列出(CRITICAL / HIGH / MEDIUM);如全部通过请明确说 LGTM。 |
|
Claude finished @appergb's task in 1m 14s —— View job PR Review: fix(startup): autostart catch 块缺 return 导致复活主窗口 (#468)
审核结论:✅ LGTM无 CRITICAL / HIGH / MEDIUM 问题。 代码逻辑验证修复本身正确( // Before: catch 无 return → fall-through 到 show()
} catch (err) {
console.warn('...', err);
// ← 控制流继续,等效"IPC 失败 = 强 show"
}
// After: catch 有 return → async IIFE 退出
} catch (err) {
const detail = err instanceof Error ? err.message : String(err);
console.warn('[startup] read startMinimized failed; staying hidden to avoid #468:', detail, err);
return; // ← 安全侧默认:不弹窗
}逐点检查:
注意事项(不阻塞合并,非本 PR 引入)
总结:修复精准、最小化、有充分文档支撑,行为变更(IPC 失败保持隐藏)经过充分论证且有 tray 兜底。Rust 端签名已核实。 ✅ LGTM — 可以合并。 |
|
Persistent review updated to latest commit 3a5e0e3 |
…v 安装
v1.3.4-4 / -5 的 Linux 构建在 "Build fcitx5 plugin" 步骤连挂两次,
错误一致:"E: Unable to locate package fcitx5-dev"。同一 job 前面的
"Install Linux bundle deps" 步骤明明已经 apt-get update + 装好了一堆
universe 包,到 fcitx5 这步突然找不到 —— 表象与 GitHub Actions
ubuntu-22.04 runner 镜像弃用过渡期里 apt 元数据漂移的现象一致。
release-tauri.yml "Build fcitx5 plugin" 步骤增加三层防御:
1) sudo add-apt-repository -y universe(已启用则 no-op)
2) 本步骤内重新 sudo apt-get update,独立于上游 step 缓存
3) 安装失败时打印 apt-cache policy / search / os-release / sources.list.d
便于以后排查
同 commit 同时 bump 五处版本到 1.3.4-6 重发,让 PR #487/#488/#489
三个 Windows P0 修复带上 Linux 包一起进 Beta 通道。
User description
问题
PR #474 引入的"前端兜底" useEffect (`src/App.tsx:48-60`) 在 webview ready 后读 `prefs.startMinimized`,true 则跳过 `currentWindow.show()`。但 catch 块只 `console.warn` 没有 `return`,控制流继续走到 `show()` —— 等于"prefs 读取失败 = 强 show"。
autostart 早期 IPC 还没完全 ready 时,`getSettings()` 偶发失败,用户明明开了静默启动仍把主窗口弹出来。这是 issue #468 在 PR #474 修复后剩下的最后一条复现路径。
修复
catch 块加 `return`,把语义从"读不到 prefs = 强 show"反转为"读不到 prefs = 当作 startMinimized=true 保持隐藏"。
```ts
// Before
try {
const prefs = await getSettings();
if (prefs.startMinimized) return;
} catch (err) {
console.warn('...', err);
// ← 缺 return,fall through 到下面的 show()
}
const { getCurrentWindow } = await import('@tauri-apps/api/window');
// ...show()
// After
try {
const prefs = await getSettings();
if (prefs.startMinimized) return;
} catch (err) {
console.warn('[startup] read startMinimized failed; staying hidden to avoid #468', err);
return; // ← 安全侧默认 = 不弹窗
}
// ...
```
宁可让用户从 tray 手动唤起,也不要在 autostart 抖动时强 show 一个白色 / 透明主窗口。
不在本 PR 范围
`Info.plist` 的 `LSUIElement` 是另一个 macOS UX 决策:
`tauri-plugin-autostart` 的 `--silent` 参数注入也是同理 — 独立 PR。
Test plan
Refs #468
🤖 Generated with Claude Code
PR Type
Bug fix, Documentation
Description
Guard
show()behindstartMinimizedKeep hidden on settings read failure
Improve startup warning diagnostics
Diagram Walkthrough
File Walkthrough
App.tsx
Guard startup reveal with silent-launch fallbackopenless-all/app/src/App.tsx
startMinimizedbefore revealing the window.startup.