support macos

This commit is contained in:
Julian Freeman
2026-04-17 17:49:43 -04:00
parent 6062a38b99
commit 7cf3622294
3 changed files with 70 additions and 5 deletions

View File

@@ -3,6 +3,60 @@ use std::{env, path::PathBuf};
use crate::models::BrowserDefinition; use crate::models::BrowserDefinition;
pub fn browser_definitions() -> Vec<BrowserDefinition> { pub fn browser_definitions() -> Vec<BrowserDefinition> {
#[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![ vec![
BrowserDefinition { BrowserDefinition {
id: "chrome", id: "chrome",
@@ -131,6 +185,8 @@ fn resolve_executable_candidate(candidate: &ExecutableCandidate) -> Option<PathB
ExecutableCandidate::LocalAppData(segments) => env::var_os("LOCALAPPDATA") ExecutableCandidate::LocalAppData(segments) => env::var_os("LOCALAPPDATA")
.map(PathBuf::from) .map(PathBuf::from)
.map(|root| join_segments(root, segments)), .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]), ProgramFiles(&'static [&'static str]),
ProgramFilesX86(&'static [&'static str]), ProgramFilesX86(&'static [&'static str]),
LocalAppData(&'static [&'static str]), LocalAppData(&'static [&'static str]),
#[cfg(target_os = "macos")]
Absolute(&'static str),
} }

View File

@@ -12,7 +12,7 @@ use crate::{
BrowserConfigEntry, BrowserConfigListResponse, BrowserConfigSource, BrowserConfigEntry, BrowserConfigListResponse, BrowserConfigSource,
CreateCustomBrowserConfigInput, CustomBrowserConfigRecord, StoredBrowserConfigs, CreateCustomBrowserConfigInput, CustomBrowserConfigRecord, StoredBrowserConfigs,
}, },
utils::local_app_data_dir, utils::platform_user_data_root_dir,
}; };
const CONFIG_FILE_NAME: &str = "browser-configs.json"; const CONFIG_FILE_NAME: &str = "browser-configs.json";
@@ -113,8 +113,8 @@ pub fn find_browser_config(app: &AppHandle, config_id: &str) -> Result<BrowserCo
} }
fn default_browser_configs() -> Result<Vec<BrowserConfigEntry>, String> { fn default_browser_configs() -> Result<Vec<BrowserConfigEntry>, String> {
let local_app_data = local_app_data_dir().ok_or_else(|| { let user_data_root = platform_user_data_root_dir().ok_or_else(|| {
"Unable to resolve the LOCALAPPDATA directory for the current user.".to_string() "Unable to resolve the default browser data directory for the current user.".to_string()
})?; })?;
Ok(browser_definitions() Ok(browser_definitions()
@@ -123,7 +123,7 @@ fn default_browser_configs() -> Result<Vec<BrowserConfigEntry>, String> {
let user_data_path = definition let user_data_path = definition
.local_app_data_segments .local_app_data_segments
.iter() .iter()
.fold(local_app_data.clone(), |path, segment| path.join(segment)); .fold(user_data_root.clone(), |path, segment| path.join(segment));
BrowserConfigEntry { BrowserConfigEntry {
id: definition.id.to_string(), id: definition.id.to_string(),

View File

@@ -8,7 +8,14 @@ use std::{
use base64::{engine::general_purpose::STANDARD, Engine as _}; use base64::{engine::general_purpose::STANDARD, Engine as _};
use serde_json::Value; use serde_json::Value;
pub fn local_app_data_dir() -> Option<PathBuf> { pub fn platform_user_data_root_dir() -> Option<PathBuf> {
#[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("LOCALAPPDATA").map(PathBuf::from).or_else(|| {
env::var_os("USERPROFILE") env::var_os("USERPROFILE")
.map(PathBuf::from) .map(PathBuf::from)