Index: chrome/installer/setup/installer_state.cc |
diff --git a/chrome/installer/setup/installer_state.cc b/chrome/installer/setup/installer_state.cc |
index 17ad861605e25984979ea73caf1f70eb05999456..b6a9ffb37682cb83b4053b88a4891672e8476157 100644 |
--- a/chrome/installer/setup/installer_state.cc |
+++ b/chrome/installer/setup/installer_state.cc |
@@ -73,7 +73,8 @@ InstallerState::InstallerState() |
root_key_(NULL), |
msi_(false), |
background_mode_(false), |
- verbose_logging_(false) {} |
+ verbose_logging_(false), |
+ is_migrating_to_single_(false) {} |
InstallerState::InstallerState(Level level) |
: operation_(UNINITIALIZED), |
@@ -84,7 +85,8 @@ InstallerState::InstallerState(Level level) |
root_key_(NULL), |
msi_(false), |
background_mode_(false), |
- verbose_logging_(false) { |
+ verbose_logging_(false), |
+ is_migrating_to_single_(false) { |
// Use set_level() so that root_key_ is updated properly. |
set_level(level); |
} |
@@ -138,6 +140,10 @@ void InstallerState::Initialize(const base::CommandLine& command_line, |
// For a single-install, the current browser dist is the operand. |
operand = BrowserDistribution::GetDistribution(); |
operation_ = SINGLE_INSTALL_OR_UPDATE; |
+ // Is this a migration from multi-install to single-install? |
+ const ProductState* state = |
+ machine_state.GetProductState(system_install(), operand->GetType()); |
+ is_migrating_to_single_ = state && state->is_multi_install(); |
} else if (IsMultiInstallUpdate(prefs, machine_state)) { |
// Updates driven by Google Update take place under the multi-installer's |
// app guid. |
@@ -473,6 +479,7 @@ void InstallerState::Clear() { |
root_key_ = NULL; |
msi_ = false; |
verbose_logging_ = false; |
+ is_migrating_to_single_ = false; |
} |
bool InstallerState::AnyExistsAndIsInUse(const InstallationState& machine_state, |
@@ -625,6 +632,24 @@ void InstallerState::WriteInstallerResult( |
InstallUtil::AddInstallerResultItems( |
system_install, multi_package_binaries_distribution()->GetStateKey(), |
status, string_resource_id, launch_cmd, install_list.get()); |
+ } else if (is_migrating_to_single() && |
+ InstallUtil::GetInstallReturnCode(status)) { |
+#if defined(GOOGLE_CHROME_BUILD) |
+ // Also write to the binaries on error if this is a migration back to |
+ // single-install for Google Chrome builds. Skip this for Chromium builds |
+ // because they lump the "ClientState" and "Clients" keys into a single |
+ // key. As a consequence, writing this value causes Software\Chromium to be |
+ // re-created after it was deleted during the migration to single-install. |
+ // Google Chrome builds don't suffer this since the two keys are distinct |
+ // and have different lifetimes. The result is only written on failure since |
+ // for success, the binaries have been uninstalled and therefore the result |
+ // will not be read by Google Update. |
+ InstallUtil::AddInstallerResultItems( |
+ system_install, BrowserDistribution::GetSpecificDistribution( |
+ BrowserDistribution::CHROME_BINARIES) |
+ ->GetStateKey(), |
+ status, string_resource_id, launch_cmd, install_list.get()); |
+#endif |
} |
install_list->Do(); |
} |