From ff5386a24a6632a5a56cd0a0d227ff8119224c5d Mon Sep 17 00:00:00 2001 From: Nikhil Date: Fri, 3 Apr 2026 14:50:14 -0700 Subject: [PATCH] fix: agent storage issue on update (#643) * fix: agent storage erase issue fix * fix: remove the guard against remote --- .../extensions/browseros_extension_loader.cc | 49 +++++++++++++++++-- .../extensions/browseros_extension_loader.h | 9 +++- .../browseros_extension_maintainer.cc | 2 +- .../chrome_extension_registrar_delegate.cc | 23 ++++++++- 4 files changed, 75 insertions(+), 8 deletions(-) diff --git a/packages/browseros/chromium_patches/chrome/browser/browseros/extensions/browseros_extension_loader.cc b/packages/browseros/chromium_patches/chrome/browser/browseros/extensions/browseros_extension_loader.cc index b0cbbd6ef..fd8be70cc 100644 --- a/packages/browseros/chromium_patches/chrome/browser/browseros/extensions/browseros_extension_loader.cc +++ b/packages/browseros/chromium_patches/chrome/browser/browseros/extensions/browseros_extension_loader.cc @@ -1,9 +1,9 @@ diff --git a/chrome/browser/browseros/extensions/browseros_extension_loader.cc b/chrome/browser/browseros/extensions/browseros_extension_loader.cc new file mode 100644 -index 0000000000000..e61b45d08b7e2 +index 0000000000000..fdb6be443f25b --- /dev/null +++ b/chrome/browser/browseros/extensions/browseros_extension_loader.cc -@@ -0,0 +1,226 @@ +@@ -0,0 +1,269 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. @@ -89,10 +89,53 @@ index 0000000000000..e61b45d08b7e2 + extension_ids_.merge(result.extension_ids); + last_config_ = std::move(result.config); + -+ LoadFinished(std::move(result.prefs)); ++ base::DictValue prefs_to_load = std::move(result.prefs); ++ ++ if (prefs_to_load.empty()) { ++ LOG(WARNING) << "browseros: Install returned empty prefs, " ++ << "reconstructing from installed extensions"; ++ prefs_to_load = ReconstructPrefsFromInstalledExtensions(); ++ LOG(INFO) << "browseros: Reconstructed prefs for " ++ << prefs_to_load.size() << " installed extensions"; ++ } ++ ++ LoadFinished(std::move(prefs_to_load)); + OnStartupComplete(result.from_bundled); +} + ++base::DictValue ++BrowserOSExtensionLoader::ReconstructPrefsFromInstalledExtensions() { ++ base::DictValue prefs; ++ ++ extensions::ExtensionRegistry* registry = ++ extensions::ExtensionRegistry::Get(profile_); ++ if (!registry) { ++ return prefs; ++ } ++ ++ const std::string update_url = ++ base::FeatureList::IsEnabled(features::kBrowserOsAlphaFeatures) ++ ? kBrowserOSAlphaUpdateUrl ++ : kBrowserOSUpdateUrl; ++ ++ for (const std::string& id : GetBrowserOSExtensionIds()) { ++ const extensions::Extension* ext = registry->GetInstalledExtension(id); ++ if (!ext) { ++ continue; ++ } ++ ++ base::DictValue ext_pref; ++ ext_pref.Set(extensions::ExternalProviderImpl::kExternalUpdateUrl, ++ update_url); ++ prefs.Set(id, std::move(ext_pref)); ++ ++ LOG(INFO) << "browseros: Reconstructed pref for installed extension " ++ << id << " v" << ext->version().GetString(); ++ } ++ ++ return prefs; ++} ++ +const base::FilePath BrowserOSExtensionLoader::GetBaseCrxFilePath() { + return bundled_crx_base_path_; +} diff --git a/packages/browseros/chromium_patches/chrome/browser/browseros/extensions/browseros_extension_loader.h b/packages/browseros/chromium_patches/chrome/browser/browseros/extensions/browseros_extension_loader.h index d5edfe093..1875ddfa9 100644 --- a/packages/browseros/chromium_patches/chrome/browser/browseros/extensions/browseros_extension_loader.h +++ b/packages/browseros/chromium_patches/chrome/browser/browseros/extensions/browseros_extension_loader.h @@ -1,9 +1,9 @@ diff --git a/chrome/browser/browseros/extensions/browseros_extension_loader.h b/chrome/browser/browseros/extensions/browseros_extension_loader.h new file mode 100644 -index 0000000000000..2a14e9068156e +index 0000000000000..ea2c856556f5f --- /dev/null +++ b/chrome/browser/browseros/extensions/browseros_extension_loader.h -@@ -0,0 +1,81 @@ +@@ -0,0 +1,86 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. @@ -62,6 +62,11 @@ index 0000000000000..2a14e9068156e + // Convergence point for both startup paths. + void OnStartupComplete(bool from_bundled); + ++ // Reconstructs minimal prefs from already-installed BrowserOS extensions. ++ // Used as a fallback when both bundled CRX and remote config fail, ++ // preventing orphan detection from uninstalling existing extensions. ++ base::DictValue ReconstructPrefsFromInstalledExtensions(); ++ + // Installs remote extensions immediately via PendingExtensionManager + updater. + void InstallRemoteExtensionsNow(base::DictValue config); + diff --git a/packages/browseros/chromium_patches/chrome/browser/browseros/extensions/browseros_extension_maintainer.cc b/packages/browseros/chromium_patches/chrome/browser/browseros/extensions/browseros_extension_maintainer.cc index 6791277f3..28afaf492 100644 --- a/packages/browseros/chromium_patches/chrome/browser/browseros/extensions/browseros_extension_maintainer.cc +++ b/packages/browseros/chromium_patches/chrome/browser/browseros/extensions/browseros_extension_maintainer.cc @@ -1,6 +1,6 @@ diff --git a/chrome/browser/browseros/extensions/browseros_extension_maintainer.cc b/chrome/browser/browseros/extensions/browseros_extension_maintainer.cc new file mode 100644 -index 0000000000000..bb33ae5d3b156 +index 0000000000000..5804d54696e8f --- /dev/null +++ b/chrome/browser/browseros/extensions/browseros_extension_maintainer.cc @@ -0,0 +1,395 @@ diff --git a/packages/browseros/chromium_patches/chrome/browser/extensions/chrome_extension_registrar_delegate.cc b/packages/browseros/chromium_patches/chrome/browser/extensions/chrome_extension_registrar_delegate.cc index c5df6afc3..e3e4a5b0a 100644 --- a/packages/browseros/chromium_patches/chrome/browser/extensions/chrome_extension_registrar_delegate.cc +++ b/packages/browseros/chromium_patches/chrome/browser/extensions/chrome_extension_registrar_delegate.cc @@ -1,5 +1,5 @@ diff --git a/chrome/browser/extensions/chrome_extension_registrar_delegate.cc b/chrome/browser/extensions/chrome_extension_registrar_delegate.cc -index 6eec0585e8925..55c2a73647527 100644 +index adfb4e4d49fa4..409e26fa1cb1b 100644 --- a/chrome/browser/extensions/chrome_extension_registrar_delegate.cc +++ b/chrome/browser/extensions/chrome_extension_registrar_delegate.cc @@ -12,6 +12,7 @@ @@ -10,7 +10,26 @@ index 6eec0585e8925..55c2a73647527 100644 #include "chrome/browser/extensions/component_loader.h" #include "chrome/browser/extensions/corrupted_extension_reinstaller.h" #include "chrome/browser/extensions/data_deleter.h" -@@ -317,6 +318,13 @@ bool ChromeExtensionRegistrarDelegate::CanDisableExtension( +@@ -256,7 +257,17 @@ void ChromeExtensionRegistrarDelegate::PostUninstallExtension( + } + } + +- DataDeleter::StartDeleting(profile_, extension.get(), subtask_done_callback); ++ // Preserve chrome.storage.local data for BrowserOS extensions. These may be ++ // transiently uninstalled during update cycles (e.g., when both bundled CRX ++ // and remote config fail on startup). User configuration must survive. ++ if (browseros::IsBrowserOSExtension(extension->id())) { ++ LOG(INFO) << "browseros: Preserving storage for extension " ++ << extension->id(); ++ subtask_done_callback.Run(); ++ } else { ++ DataDeleter::StartDeleting(profile_, extension.get(), ++ subtask_done_callback); ++ } + } + + void ChromeExtensionRegistrarDelegate::DoLoadExtensionForReload( +@@ -322,6 +333,13 @@ bool ChromeExtensionRegistrarDelegate::CanDisableExtension( return true; }