refactor: browser update

This commit is contained in:
zhom committed 2026-05-15 20:42:25 +04:00
1 parent c84d547a8c
commit f6daa642d0
2 files changed
+60 -11

No files matched your search

+30 -9
View File
@@ -290,24 +290,45 @@ impl DownloadedBrowsersRegistry {
} }
} }
// Filter out versions that would leave a browser with zero versions in the registry // For each browser where every registered version would be removed (no
// profile uses any), keep the newest one by semver. Without this, the
// version preserved depends on HashMap iteration order, so a freshly
// downloaded version can be deleted in favor of an older orphan — leaving
// the UI stuck on "needs to be downloaded".
{ {
let data = self.data.lock().unwrap(); let data = self.data.lock().unwrap();
let mut removal_counts: std::collections::HashMap<String, usize> = let mut removal_versions_by_browser: std::collections::HashMap<String, Vec<String>> =
std::collections::HashMap::new(); std::collections::HashMap::new();
for (browser, _) in &to_remove { for (browser, version) in &to_remove {
*removal_counts.entry(browser.clone()).or_insert(0) += 1; removal_versions_by_browser
.entry(browser.clone())
.or_default()
.push(version.clone());
} }
to_remove.retain(|(browser, version)| { let mut keep_per_browser: std::collections::HashMap<String, String> =
std::collections::HashMap::new();
for (browser, versions) in &removal_versions_by_browser {
let total = data let total = data
.browsers .browsers
.get(browser.as_str()) .get(browser.as_str())
.map(|v| v.len()) .map(|v| v.len())
.unwrap_or(0); .unwrap_or(0);
let removing = *removal_counts.get(browser.as_str()).unwrap_or(&0); if versions.len() >= total {
if removing >= total { if let Some(latest) = versions
log::info!("Keeping last available version: {browser} {version}"); .iter()
*removal_counts.get_mut(browser.as_str()).unwrap() -= 1; .max_by(|a, b| crate::api_client::compare_versions(a, b))
{
keep_per_browser.insert(browser.clone(), latest.clone());
}
}
}
drop(data);
to_remove.retain(|(browser, version)| {
if keep_per_browser
.get(browser)
.is_some_and(|keep| keep == version)
{
log::info!("Keeping latest available version: {browser} {version}");
return false; return false;
} }
true true
+30 -2
View File
@@ -1509,6 +1509,7 @@ impl ProfileManager {
}; };
let mut merged = latest_profile.clone(); let mut merged = latest_profile.clone();
let mut detected_stop = false;
if let Some(pid) = found_pid { if let Some(pid) = found_pid {
if merged.process_id != Some(pid) { if merged.process_id != Some(pid) {
@@ -1523,6 +1524,15 @@ impl ProfileManager {
if let Err(e) = self.save_profile(&merged) { if let Err(e) = self.save_profile(&merged) {
log::warn!("Warning: Failed to clear profile PID: {e}"); log::warn!("Warning: Failed to clear profile PID: {e}");
} }
detected_stop = true;
}
if detected_stop {
if let Some(updated) = crate::auto_updater::AutoUpdater::instance()
.update_profile_to_latest_installed(&app_handle, &merged)
{
merged = updated;
}
} }
// Emit profile update event to frontend // Emit profile update event to frontend
@@ -1537,7 +1547,7 @@ impl ProfileManager {
// Check Camoufox status using CamoufoxManager // Check Camoufox status using CamoufoxManager
async fn check_camoufox_status( async fn check_camoufox_status(
&self, &self,
_app_handle: &tauri::AppHandle, app_handle: &tauri::AppHandle,
profile: &BrowserProfile, profile: &BrowserProfile,
) -> Result<bool, Box<dyn std::error::Error + Send + Sync>> { ) -> Result<bool, Box<dyn std::error::Error + Send + Sync>> {
let launcher = self.camoufox_manager; let launcher = self.camoufox_manager;
@@ -1611,6 +1621,12 @@ impl ProfileManager {
log::warn!("Warning: Failed to clear Camoufox profile process info: {e}"); log::warn!("Warning: Failed to clear Camoufox profile process info: {e}");
} }
if let Some(updated) = crate::auto_updater::AutoUpdater::instance()
.update_profile_to_latest_installed(app_handle, &latest)
{
latest = updated;
}
if let Err(e) = events::emit("profile-updated", &latest) { if let Err(e) = events::emit("profile-updated", &latest) {
log::warn!("Warning: Failed to emit profile update event: {e}"); log::warn!("Warning: Failed to emit profile update event: {e}");
} }
@@ -1647,6 +1663,12 @@ impl ProfileManager {
); );
} }
if let Some(updated) = crate::auto_updater::AutoUpdater::instance()
.update_profile_to_latest_installed(app_handle, &latest)
{
latest = updated;
}
// Emit profile update event to frontend // Emit profile update event to frontend
if let Err(e3) = events::emit("profile-updated", &latest) { if let Err(e3) = events::emit("profile-updated", &latest) {
log::warn!("Warning: Failed to emit profile update event: {e3}"); log::warn!("Warning: Failed to emit profile update event: {e3}");
@@ -1661,7 +1683,7 @@ impl ProfileManager {
// Check Wayfern status using WayfernManager // Check Wayfern status using WayfernManager
async fn check_wayfern_status( async fn check_wayfern_status(
&self, &self,
_app_handle: &tauri::AppHandle, app_handle: &tauri::AppHandle,
profile: &BrowserProfile, profile: &BrowserProfile,
) -> Result<bool, Box<dyn std::error::Error + Send + Sync>> { ) -> Result<bool, Box<dyn std::error::Error + Send + Sync>> {
let manager = self.wayfern_manager; let manager = self.wayfern_manager;
@@ -1735,6 +1757,12 @@ impl ProfileManager {
log::warn!("Warning: Failed to clear Wayfern profile process info: {e}"); log::warn!("Warning: Failed to clear Wayfern profile process info: {e}");
} }
if let Some(updated) = crate::auto_updater::AutoUpdater::instance()
.update_profile_to_latest_installed(app_handle, &latest)
{
latest = updated;
}
if let Err(e) = events::emit("profile-updated", &latest) { if let Err(e) = events::emit("profile-updated", &latest) {
log::warn!("Warning: Failed to emit profile update event: {e}"); log::warn!("Warning: Failed to emit profile update event: {e}");
} }