From 1eb40eabd590f8d0190d1b08b8d2fecd19567892 Mon Sep 17 00:00:00 2001 From: leeguooooo Date: Fri, 19 Jun 2026 14:06:42 +0900 Subject: [PATCH] fix(tabs): close the leftover initial about:blank when a real tab opens A fresh session's daemon creates an about:blank scratch tab on connect; a subsequent `tab new ` then opened the work tab beside it, so every session's tab group showed a stray 'about:blank' next to the real page (e.g. about:blank + ChatGPT). tab_new now closes any OWNED, still-blank tab once a real (non-blank) tab exists, and re-pins the new tab. Verified live: `tab new ` on a fresh session leaves only the work tab. 870 tests pass. --- cli/Cargo.lock | 2 +- cli/Cargo.toml | 2 +- cli/src/native/browser.rs | 38 ++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/cli/Cargo.lock b/cli/Cargo.lock index de4f6ea..135f852 100644 --- a/cli/Cargo.lock +++ b/cli/Cargo.lock @@ -290,7 +290,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrome-use" -version = "1.5.26" +version = "1.5.27" dependencies = [ "aes", "aes-gcm", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index e391236..fb735e8 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chrome-use" -version = "1.5.26" +version = "1.5.27" edition = "2021" description = "Fast browser automation CLI for AI agents" license = "Apache-2.0" diff --git a/cli/src/native/browser.rs b/cli/src/native/browser.rs index 17ad945..e77e997 100644 --- a/cli/src/native/browser.rs +++ b/cli/src/native/browser.rs @@ -2070,6 +2070,44 @@ impl BrowserManager { self.active_page_index = index; self.pin_active_target(); + // Close the daemon's leftover initial `about:blank` scratch tab once this + // real tab exists, so the session's tab group isn't left showing a stray + // blank page beside the work tab (every group otherwise carried one). Only + // when opening a real url, and only OWNED, still-blank tabs. + if target_url != "about:blank" { + if let Some(new_tid) = self.pages.get(index).map(|p| p.target_id.clone()) { + let blanks: Vec = self + .pages + .iter() + .filter(|p| { + p.target_id != new_tid + && self.created_targets.contains(&p.target_id) + && (p.url == "about:blank" || p.url.is_empty()) + }) + .map(|p| p.target_id.clone()) + .collect(); + for tid in blanks { + let _ = self + .client + .send_command_typed::<_, Value>( + "Target.closeTarget", + &CloseTargetParams { + target_id: tid.clone(), + }, + None, + ) + .await; + self.created_targets.remove(&tid); + self.remove_page_by_target_id(&tid); + } + // Removing earlier pages shifts indices — re-pin the new tab. + if let Some(i) = self.pages.iter().position(|p| p.target_id == new_tid) { + self.active_page_index = i; + self.pin_active_target(); + } + } + } + Ok(json!({ "tabId": format_tab_id(tab_id), "label": label, diff --git a/package.json b/package.json index aab0ee0..a60db2f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chrome-use", - "version": "1.5.26", + "version": "1.5.27", "description": "chrome-use — drive your real, logged-in Chrome from any AI agent, stealth by default", "type": "module", "packageManager": "pnpm@11.1.3",