From 7cf3622294885276a1bfc80fa95eed1c0e62cb45 Mon Sep 17 00:00:00 2001 From: Julian Freeman Date: Fri, 17 Apr 2026 17:49:43 -0400 Subject: [PATCH] support macos --- src-tauri/src/browsers.rs | 58 +++++++++++++++++++++++++++++++++++ src-tauri/src/config_store.rs | 8 ++--- src-tauri/src/utils.rs | 9 +++++- 3 files changed, 70 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/browsers.rs b/src-tauri/src/browsers.rs index 35be00d..fac1118 100644 --- a/src-tauri/src/browsers.rs +++ b/src-tauri/src/browsers.rs @@ -3,6 +3,60 @@ use std::{env, path::PathBuf}; use crate::models::BrowserDefinition; pub fn browser_definitions() -> Vec { + #[cfg(target_os = "macos")] + { + return vec![ + BrowserDefinition { + id: "chrome", + name: "Google Chrome", + local_app_data_segments: &["Google", "Chrome"], + executable_candidates: &[ExecutableCandidate::Absolute( + "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", + )], + }, + BrowserDefinition { + id: "edge", + name: "Microsoft Edge", + local_app_data_segments: &["Microsoft Edge"], + executable_candidates: &[ExecutableCandidate::Absolute( + "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge", + )], + }, + BrowserDefinition { + id: "brave", + name: "Brave", + local_app_data_segments: &["BraveSoftware", "Brave-Browser"], + executable_candidates: &[ExecutableCandidate::Absolute( + "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser", + )], + }, + BrowserDefinition { + id: "vivaldi", + name: "Vivaldi", + local_app_data_segments: &["Vivaldi"], + executable_candidates: &[ExecutableCandidate::Absolute( + "/Applications/Vivaldi.app/Contents/MacOS/Vivaldi", + )], + }, + BrowserDefinition { + id: "yandex", + name: "Yandex Browser", + local_app_data_segments: &["Yandex", "YandexBrowser"], + executable_candidates: &[ExecutableCandidate::Absolute( + "/Applications/Yandex.app/Contents/MacOS/Yandex", + )], + }, + BrowserDefinition { + id: "chromium", + name: "Chromium", + local_app_data_segments: &["Chromium"], + executable_candidates: &[ExecutableCandidate::Absolute( + "/Applications/Chromium.app/Contents/MacOS/Chromium", + )], + }, + ]; + } + vec![ BrowserDefinition { id: "chrome", @@ -131,6 +185,8 @@ fn resolve_executable_candidate(candidate: &ExecutableCandidate) -> Option env::var_os("LOCALAPPDATA") .map(PathBuf::from) .map(|root| join_segments(root, segments)), + #[cfg(target_os = "macos")] + ExecutableCandidate::Absolute(path) => Some(PathBuf::from(path)), } } @@ -145,4 +201,6 @@ pub enum ExecutableCandidate { ProgramFiles(&'static [&'static str]), ProgramFilesX86(&'static [&'static str]), LocalAppData(&'static [&'static str]), + #[cfg(target_os = "macos")] + Absolute(&'static str), } diff --git a/src-tauri/src/config_store.rs b/src-tauri/src/config_store.rs index 997dfd1..f447881 100644 --- a/src-tauri/src/config_store.rs +++ b/src-tauri/src/config_store.rs @@ -12,7 +12,7 @@ use crate::{ BrowserConfigEntry, BrowserConfigListResponse, BrowserConfigSource, CreateCustomBrowserConfigInput, CustomBrowserConfigRecord, StoredBrowserConfigs, }, - utils::local_app_data_dir, + utils::platform_user_data_root_dir, }; const CONFIG_FILE_NAME: &str = "browser-configs.json"; @@ -113,8 +113,8 @@ pub fn find_browser_config(app: &AppHandle, config_id: &str) -> Result Result, String> { - let local_app_data = local_app_data_dir().ok_or_else(|| { - "Unable to resolve the LOCALAPPDATA directory for the current user.".to_string() + let user_data_root = platform_user_data_root_dir().ok_or_else(|| { + "Unable to resolve the default browser data directory for the current user.".to_string() })?; Ok(browser_definitions() @@ -123,7 +123,7 @@ fn default_browser_configs() -> Result, String> { let user_data_path = definition .local_app_data_segments .iter() - .fold(local_app_data.clone(), |path, segment| path.join(segment)); + .fold(user_data_root.clone(), |path, segment| path.join(segment)); BrowserConfigEntry { id: definition.id.to_string(), diff --git a/src-tauri/src/utils.rs b/src-tauri/src/utils.rs index c538438..436ca11 100644 --- a/src-tauri/src/utils.rs +++ b/src-tauri/src/utils.rs @@ -8,7 +8,14 @@ use std::{ use base64::{engine::general_purpose::STANDARD, Engine as _}; use serde_json::Value; -pub fn local_app_data_dir() -> Option { +pub fn platform_user_data_root_dir() -> Option { + #[cfg(target_os = "macos")] + { + return env::var_os("HOME") + .map(PathBuf::from) + .map(|path| path.join("Library").join("Application Support")); + } + env::var_os("LOCALAPPDATA").map(PathBuf::from).or_else(|| { env::var_os("USERPROFILE") .map(PathBuf::from)