Index: chrome/installer/setup/install_worker.cc |
diff --git a/chrome/installer/setup/install_worker.cc b/chrome/installer/setup/install_worker.cc |
index 64af4dad2d70914344cc963602cb0ccd6f3b8aac..1166dc7d3fe7126613dc8d6aca1da71528e7443b 100644 |
--- a/chrome/installer/setup/install_worker.cc |
+++ b/chrome/installer/setup/install_worker.cc |
@@ -1092,6 +1092,50 @@ void AddUsageStatsWorkItems(const InstallationState& original_state, |
} |
} |
+// Migrates the usagestats value from the binaries to Chrome when migrating |
+// multi-install Chrome to single-install. |
robertshield
2015/01/23 22:45:30
any reason not to do this separately first, or doe
grt (UTC plus 2)
2015/01/24 02:25:16
In the current world, usagestats is read from/writ
|
+void AddMigrateUsageStatesWorkItems(const InstallationState& original_state, |
+ const InstallerState& installer_state, |
+ WorkItemList* install_list) { |
+ // This operation only applies to single-installs. |
robertshield
2015/01/23 22:45:30
nit: less ambiguous: This operation only applies w
grt (UTC plus 2)
2015/01/24 02:25:15
Reworded all comments here in the hopes that they
|
+ if (installer_state.is_multi_install()) |
+ return; |
+ |
+ // This operation only applies to Chrome. |
+ const Product* chrome_product = |
+ installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER); |
+ if (!chrome_product) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ |
+ const ProductState* chrome_state = original_state.GetProductState( |
+ installer_state.system_install(), |
+ BrowserDistribution::CHROME_BROWSER); |
+ // This operation only applies when updating multi-install Chrome to |
+ // single-install. |
+ if (!chrome_state || !chrome_state->is_multi_install()) |
+ return; |
+ |
+ const ProductState* binaries_state = original_state.GetProductState( |
+ installer_state.system_install(), |
+ BrowserDistribution::CHROME_BINARIES); |
+ |
+ // There is nothing to be done if the binaries do not have stats. |
+ DWORD usagestats = 0; |
+ if (!binaries_state || !binaries_state->GetUsageStats(&usagestats)) |
+ return; |
+ |
+ // Write the value that was read to Chrome's ClientState key. |
+ install_list->AddSetRegValueWorkItem( |
+ installer_state.root_key(), |
+ chrome_product->distribution()->GetStateKey(), |
+ KEY_WOW64_32KEY, |
+ google_update::kRegUsageStatsField, |
+ usagestats, |
+ true); |
+} |
+ |
bool AppendPostInstallTasks(const InstallerState& installer_state, |
const base::FilePath& setup_path, |
const Version* current_version, |
@@ -1310,6 +1354,16 @@ void AddInstallWorkItems(const InstallationState& original_state, |
install_list); |
} |
+ // Ensure that the Clients key for the binaries is gone for single installs. |
robertshield
2015/01/23 22:45:30
Do we need to double check to make sure this doesn
grt (UTC plus 2)
2015/01/24 02:25:15
Line 1343 adds the Clients key for Chrome itself,
|
+ if (!installer_state.is_multi_install()) { |
+ BrowserDistribution* binaries_dist = |
+ BrowserDistribution::GetSpecificDistribution( |
+ BrowserDistribution::CHROME_BINARIES); |
+ install_list->AddDeleteRegKeyWorkItem(root, |
+ binaries_dist->GetVersionKey(), |
+ KEY_WOW64_32KEY); |
+ } |
+ |
// TODO(huangs): Implement actual migration code and remove the hack below. |
// If installing Chrome without the legacy stand-alone App Launcher (to be |
// handled later), add "shadow" App Launcher registry keys so Google Update |
@@ -1341,6 +1395,9 @@ void AddInstallWorkItems(const InstallationState& original_state, |
// Copy over brand, usagestats, and other values. |
AddGoogleUpdateWorkItems(original_state, installer_state, install_list); |
+ // Migrate usagestats back to Chrome. |
+ AddMigrateUsageStatesWorkItems(original_state, installer_state, install_list); |
+ |
// Append the tasks that run after the installation. |
AppendPostInstallTasks(installer_state, |
setup_path, |