fix: filter chrome:// internal targets from auto-connect discovery (#827)
When using --auto-connect, discover_and_attach_targets() was selecting Chrome internal pages (chrome://, chrome-extension://, devtools://) as the active target. Follow-up commands like `get url` and `snapshot` would then return data from targets like chrome://omnibox-popup.top-chrome/ instead of the actual application tab. Add is_internal_chrome_target() filter to exclude internal Chrome targets from the discovery results. If no user-facing targets remain after filtering, the existing "create a new tab" fallback handles it. Fixes #813 Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
This commit is contained in:
co-authored by
Matt Van Horn
parent
609f32c986
commit
8348b77800
@@ -87,6 +87,14 @@ fn validate_lightpanda_options(options: &LaunchOptions) -> Result<(), String> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true for Chrome internal targets that should not be selected
|
||||||
|
/// during auto-connect (e.g. chrome://, chrome-extension://, devtools://).
|
||||||
|
fn is_internal_chrome_target(url: &str) -> bool {
|
||||||
|
url.starts_with("chrome://")
|
||||||
|
|| url.starts_with("chrome-extension://")
|
||||||
|
|| url.starts_with("devtools://")
|
||||||
|
}
|
||||||
|
|
||||||
/// Converts common error messages into AI-friendly, actionable descriptions.
|
/// Converts common error messages into AI-friendly, actionable descriptions.
|
||||||
pub fn to_ai_friendly_error(error: &str) -> String {
|
pub fn to_ai_friendly_error(error: &str) -> String {
|
||||||
let lower = error.to_lowercase();
|
let lower = error.to_lowercase();
|
||||||
@@ -327,7 +335,9 @@ impl BrowserManager {
|
|||||||
.target_infos
|
.target_infos
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter(|t| {
|
.filter(|t| {
|
||||||
(t.target_type == "page" || t.target_type == "webview") && !t.url.is_empty()
|
(t.target_type == "page" || t.target_type == "webview")
|
||||||
|
&& !t.url.is_empty()
|
||||||
|
&& !is_internal_chrome_target(&t.url)
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
@@ -1442,4 +1452,21 @@ mod tests {
|
|||||||
));
|
));
|
||||||
assert!(err.contains("Target.setDiscoverTargets failed"));
|
assert!(err.contains("Target.setDiscoverTargets failed"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_is_internal_chrome_target() {
|
||||||
|
assert!(is_internal_chrome_target("chrome://newtab/"));
|
||||||
|
assert!(is_internal_chrome_target(
|
||||||
|
"chrome://omnibox-popup.top-chrome/"
|
||||||
|
));
|
||||||
|
assert!(is_internal_chrome_target(
|
||||||
|
"chrome-extension://abc123/popup.html"
|
||||||
|
));
|
||||||
|
assert!(is_internal_chrome_target(
|
||||||
|
"devtools://devtools/bundled/inspector.html"
|
||||||
|
));
|
||||||
|
assert!(!is_internal_chrome_target("https://example.com"));
|
||||||
|
assert!(!is_internal_chrome_target("http://localhost:3000"));
|
||||||
|
assert!(!is_internal_chrome_target("about:blank"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user