browser_url/
browser_detection.rs1use crate::{BrowserInfoError, BrowserType};
2use active_win_pos_rs::ActiveWindow;
3
4pub fn classify_browser(window: &ActiveWindow) -> Result<BrowserType, BrowserInfoError> {
5 let app_name = window.app_name.to_lowercase();
6
7 let process_path = window.process_path.to_str().unwrap_or("").to_lowercase();
8
9 if app_name.contains("chrome") && !app_name.contains("edge") {
10 Ok(BrowserType::Chrome)
11 } else if app_name.contains("firefox") {
12 Ok(BrowserType::Firefox)
13 } else if app_name.contains("zen") {
14 Ok(BrowserType::Zen)
15 } else if app_name.contains("msedge") || app_name.contains("edge") {
16 Ok(BrowserType::Edge)
17 } else if app_name.contains("safari") {
18 Ok(BrowserType::Safari)
19 } else if app_name.contains("brave") {
20 Ok(BrowserType::Brave)
21 } else if app_name.contains("opera") {
22 Ok(BrowserType::Opera)
23 } else if app_name.contains("vivaldi") {
24 Ok(BrowserType::Vivaldi)
25 } else if is_browser_by_path(&process_path) {
26 detect_browser_from_path(&process_path)
27 } else {
28 Err(BrowserInfoError::NotABrowser)
29 }
30}
31
32fn is_browser_by_path(path: &str) -> bool {
33 let browser_indicators = [
34 "chrome", "firefox", "edge", "safari", "brave", "opera", "vivaldi",
35 ];
36 browser_indicators
37 .iter()
38 .any(|&indicator| path.contains(indicator))
39}
40
41fn detect_browser_from_path(path: &str) -> Result<BrowserType, BrowserInfoError> {
42 if path.contains("chrome") {
43 Ok(BrowserType::Chrome)
44 } else if path.contains("firefox") {
45 Ok(BrowserType::Firefox)
46 } else if path.contains("edge") {
47 Ok(BrowserType::Edge)
48 } else {
49 Ok(BrowserType::Unknown("detected_from_path".to_string()))
50 }
51}