Skip to main content

browser_url/
browser_detection.rs

1use 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}