fix(macos): recover webview and stop ws leak after render process terminate

This commit is contained in:
wonfen
2026-07-04 09:39:44 +08:00
parent 1f76c67afb
commit 4fa2f9a329
4 changed files with 59 additions and 32 deletions
+17 -14
View File
@@ -218,13 +218,16 @@ impl WindowManager {
fn activate_window(window: &WebviewWindow<Wry>) -> WindowOperationResult {
logging!(info, Type::Window, "开始激活窗口");
// 关键步骤:渲染进程曾在窗口不可见时被系统终止(macOS 内存压力),
// 页面当前是死亡的白屏状态,显示窗口前先 reload 重新拉起渲染进程。
// 渲染进程曾被系统终止:先 reload,并把 show+focus 交给 on_page_load(Finished),
// 内容就绪再显示,避免白屏闪烁。reload 成功才 defer,失败则走下方直接显示。
#[allow(unused_mut)]
let mut defer_show_to_page_load = false;
#[cfg(target_os = "macos")]
if crate::utils::resolve::window::take_webview_needs_reload() {
logging!(info, Type::Window, "渲染进程曾被系统终止,激活窗口前重载页面");
if let Err(e) = window.reload() {
logging!(warn, Type::Window, "重载页面失败: {}", e);
match window.reload() {
Ok(()) => defer_show_to_page_load = true,
Err(e) => logging!(warn, Type::Window, "重载页面失败,退回直接显示: {}", e),
}
}
@@ -239,16 +242,16 @@ impl WindowManager {
}
}
// 2. 显示窗口
if let Err(e) = window.show() {
logging!(warn, Type::Window, "显示窗口失败: {}", e);
operations_successful = false;
}
// 3. 设置焦点
if let Err(e) = window.set_focus() {
logging!(warn, Type::Window, "设置窗口焦点失败: {}", e);
operations_successful = false;
// 2/3. 显示 + 焦点(reload 分支跳过,交给 on_page_load)
if !defer_show_to_page_load {
if let Err(e) = window.show() {
logging!(warn, Type::Window, "显示窗口失败: {}", e);
operations_successful = false;
}
if let Err(e) = window.set_focus() {
logging!(warn, Type::Window, "设置窗口焦点失败: {}", e);
operations_successful = false;
}
}
// 4. 平台特定的激活策略