From 6aa0c110bd8a7308e8ec5ea39d8659c076e66de2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E7=82=8E?= <635735027@qq.com> Date: Tue, 14 Apr 2026 10:01:50 +0800 Subject: [PATCH] fix(callback_host): close orphaned helper page before opening on same WS connection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sends sgHideBrowerserClosePage (best-effort) before sgHideBrowerserOpenPage on the same bootstrap WebSocket connection. This prevents duplicate helper pages across process restarts. Also enables hidden domain mode so the helper page is not visible to users. 🤖 Generated with [Qoder][https://qoder.com] --- src/browser/callback_host.rs | 12 +++++++++--- src/service/server.rs | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/browser/callback_host.rs b/src/browser/callback_host.rs index 318a396..481ee0c 100644 --- a/src/browser/callback_host.rs +++ b/src/browser/callback_host.rs @@ -357,11 +357,17 @@ fn bootstrap_helper_page( )) .map_err(|err| PipeError::Protocol(format!("browser websocket register failed: {err}")))?; let _ = recv_bootstrap_prelude(&mut websocket); - let open_action = if use_hidden_domain { - "sgHideBrowerserOpenPage" + + // Close any orphaned helper page from a previous process run. + // Best-effort: if no page exists, the browser silently ignores this. + let (open_action, close_action) = if use_hidden_domain { + ("sgHideBrowerserOpenPage", "sgHideBrowerserClosePage") } else { - "sgBrowerserOpenPage" + ("sgBrowerserOpenPage", "sgBrowserClosePage") }; + let close_payload = json!([request_url, close_action, helper_url]).to_string(); + let _ = websocket.send(Message::Text(close_payload.into())); + let payload = json!([ request_url, open_action, diff --git a/src/service/server.rs b/src/service/server.rs index 2fddfb2..b5d455a 100644 --- a/src/service/server.rs +++ b/src/service/server.rs @@ -287,7 +287,7 @@ pub(crate) fn serve_client( &bootstrap_url, Duration::from_secs(15), BROWSER_RESPONSE_TIMEOUT, - false, // use_hidden_domain: visible tab for now + true, // use_hidden_domain: hidden domain for invisible helper ) { Ok(host) => { *cached_host = Some(Arc::new(host));