Chromium Code Reviews| Index: chrome/installer/setup/install_worker.cc |
| diff --git a/chrome/installer/setup/install_worker.cc b/chrome/installer/setup/install_worker.cc |
| index c92219032b35bd77ca230dade2043cdb6d4d4476..a54db69709501b2a02a247d27f129e337b12b446 100644 |
| --- a/chrome/installer/setup/install_worker.cc |
| +++ b/chrome/installer/setup/install_worker.cc |
| @@ -29,6 +29,7 @@ |
| #include "base/win/windows_version.h" |
| #include "chrome/common/chrome_constants.h" |
| #include "chrome/common/chrome_switches.h" |
| +#include "chrome/installer/launcher_support/chrome_launcher_support.h" |
| #include "chrome/installer/setup/install.h" |
| #include "chrome/installer/setup/setup_constants.h" |
| #include "chrome/installer/setup/setup_util.h" |
| @@ -179,34 +180,28 @@ void AddInstallerCopyTasks(const InstallerState& installer_state, |
| WorkItem::ALWAYS); |
| } |
| - // If only the App Host (not even the Chrome Binaries) is being installed, |
| - // this must be a user-level App Host piggybacking on system-level Chrome |
| - // Binaries. Only setup.exe is required, and only for uninstall. |
| - if (installer_state.products().size() != 1 || |
| - !installer_state.FindProduct(BrowserDistribution::CHROME_APP_HOST)) { |
| - base::FilePath archive_dst(installer_dir.Append(archive_path.BaseName())); |
| - if (archive_path != archive_dst) { |
| - // In the past, we copied rather than moved for system level installs so |
| - // that the permissions of %ProgramFiles% would be picked up. Now that |
| - // |temp_path| is in %ProgramFiles% for system level installs (and in |
| - // %LOCALAPPDATA% otherwise), there is no need to do this for the archive. |
| - // Setup.exe, on the other hand, is created elsewhere so it must always be |
| - // copied. |
| - if (temp_path.IsParent(archive_path)) { |
| - install_list->AddMoveTreeWorkItem(archive_path.value(), |
| - archive_dst.value(), |
| - temp_path.value(), |
| - WorkItem::ALWAYS_MOVE); |
| - } else { |
| - // This may occur when setup is run out of an existing installation |
| - // directory. For example, when quick-enabling user-level App Launcher |
| - // from system-level Binaries. We can't (and don't want to) remove the |
| - // system-level archive. |
| - install_list->AddCopyTreeWorkItem(archive_path.value(), |
| - archive_dst.value(), |
| - temp_path.value(), |
| - WorkItem::ALWAYS); |
| - } |
| + base::FilePath archive_dst(installer_dir.Append(archive_path.BaseName())); |
| + if (archive_path != archive_dst) { |
| + // In the past, we copied rather than moved for system level installs so |
| + // that the permissions of %ProgramFiles% would be picked up. Now that |
| + // |temp_path| is in %ProgramFiles% for system level installs (and in |
| + // %LOCALAPPDATA% otherwise), there is no need to do this for the archive. |
| + // Setup.exe, on the other hand, is created elsewhere so it must always be |
| + // copied. |
| + if (temp_path.IsParent(archive_path)) { |
| + install_list->AddMoveTreeWorkItem(archive_path.value(), |
| + archive_dst.value(), |
| + temp_path.value(), |
| + WorkItem::ALWAYS_MOVE); |
| + } else { |
| + // This may occur when setup is run out of an existing installation |
| + // directory. For example, when quick-enabling user-level App Launcher |
| + // from system-level Binaries. We can't (and don't want to) remove the |
| + // system-level archive. |
| + install_list->AddCopyTreeWorkItem(archive_path.value(), |
| + archive_dst.value(), |
| + temp_path.value(), |
| + WorkItem::ALWAYS); |
| } |
| } |
| } |
| @@ -266,7 +261,7 @@ void AddInstallAppCommandWorkItems(const InstallerState& installer_state, |
| DCHECK(product.is_chrome_app_host()); |
| AddCommandWithParameterWorkItems(installer_state, machine_state, new_version, |
| product, kCmdInstallApp, |
| - installer::kChromeAppHostExe, |
| + installer::kChromeExe, |
| ::switches::kInstallFromWebstore, |
| work_item_list); |
| } |
| @@ -362,7 +357,6 @@ void AddQuickEnableApplicationLauncherWorkItems( |
| new_version)); |
| // kMultiInstall and kVerboseLogging were processed above. |
| cmd_line.AppendSwitch(switches::kChromeAppLauncher); |
| - cmd_line.AppendSwitch(switches::kEnsureGoogleUpdatePresent); |
|
gab
2013/05/15 22:42:20
what did this do?
huangs
2013/05/17 20:59:24
Installs Google Update at user-level (even if Chro
|
| AppCommand cmd(cmd_line.GetCommandLineString()); |
| cmd.set_sends_pings(true); |
| cmd.set_is_web_accessible(true); |
| @@ -661,6 +655,34 @@ void CleanupBadCanaryDelegateExecuteRegistration( |
| } |
| } |
| +// As of M29, App Launcher is unified with Chrome. Here we delete a number of |
| +// legacy install artifacts for the product, before new artifacts are installed. |
| +void MigrateLegacyAppLauncher(const InstallerState& installer_state, |
| + const base::FilePath& temp_path, |
| + WorkItemList* install_list) { |
| + VLOG(1) << "Migrating legacy App Launcher that used app_host.exe."; |
| + HKEY reg_root = HKEY_CURRENT_USER; |
|
gab
2013/05/15 22:42:20
inline below
huangs
2013/05/17 20:59:24
Done.
|
| + |
| + if (!installer_state.system_install()) { |
| + // Delete Add/Remove entry. Skip this for system-level install, since in |
| + // this case it's up to the self-destruct flow to call uninstall. |
|
gab
2013/05/15 22:42:20
App launcher was never installed at system-level,
huangs
2013/05/17 20:59:24
This is |installer_state|. The new App Launcher ma
|
| + string16 legacy_app_host_uninstall_reg_path( |
| + L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" |
| + L"Google Chrome App Launcher"); |
| + install_list->AddDeleteRegKeyWorkItem(reg_root, |
| + legacy_app_host_uninstall_reg_path); |
| + } |
| + |
| + // Delete app_host.exe at the install level. |
| + base::FilePath app_host_exe( |
|
gab
2013/05/15 22:42:20
Did app_host.exe live beside chrome.exe or in the
huangs
2013/05/17 20:59:24
app_host.exe lives besides chrome.exe (or by itsel
|
| + chrome_launcher_support::GetAppHostPathForInstallationLevel( |
| + installer_state.system_install() ? |
| + chrome_launcher_support::SYSTEM_LEVEL_INSTALLATION : |
| + chrome_launcher_support::USER_LEVEL_INSTALLATION)); |
| + if (!app_host_exe.empty()) |
| + install_list->AddDeleteTreeWorkItem(app_host_exe, temp_path); |
| +} |
| + |
| } // namespace |
| // This method adds work items to create (or update) Chrome uninstall entry in |
| @@ -1173,6 +1195,14 @@ void AddInstallWorkItems(const InstallationState& original_state, |
| install_list->AddCreateDirWorkItem(temp_path); |
| install_list->AddCreateDirWorkItem(target_path); |
| + // User-level App Launcher may be an old version that uses app_host.exe, |
| + // which needs to be migrated. |
| + if (installer_state.FindProduct(BrowserDistribution::CHROME_BINARIES)) { |
| + if (installer_state.need_to_migrate_legacy_app_launcher()) { |
|
gab
2013/05/15 22:42:20
Use && rather than 2 ifs
huangs
2013/05/17 20:59:24
Done.
|
| + MigrateLegacyAppLauncher(installer_state, temp_path, install_list); |
| + } |
| + } |
| + |
| if (installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER) || |
| installer_state.FindProduct(BrowserDistribution::CHROME_FRAME) || |
| installer_state.FindProduct(BrowserDistribution::CHROME_BINARIES)) { |
| @@ -1187,15 +1217,6 @@ void AddInstallWorkItems(const InstallationState& original_state, |
| install_list); |
| } |
| - if (installer_state.FindProduct(BrowserDistribution::CHROME_APP_HOST)) { |
| - install_list->AddCopyTreeWorkItem( |
| - src_path.Append(installer::kChromeAppHostExe).value(), |
| - target_path.Append(installer::kChromeAppHostExe).value(), |
| - temp_path.value(), |
| - WorkItem::ALWAYS, |
| - L""); |
| - } |
| - |
| // Copy installer in install directory |
| AddInstallerCopyTasks(installer_state, setup_path, archive_path, temp_path, |
| new_version, install_list); |
| @@ -1223,21 +1244,6 @@ void AddInstallWorkItems(const InstallationState& original_state, |
| install_list); |
| } |
| - // 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 |
| - // would recognize the "dr" value in the App Launcher ClientState key. |
| - // Checking .is_multi_install() excludes Chrome Canary and stand-alone Chrome. |
| - if (installer_state.is_multi_install() && |
| - installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER) && |
| - !installer_state.FindProduct(BrowserDistribution::CHROME_APP_HOST)) { |
| - BrowserDistribution* shadow_app_launcher_dist = |
| - BrowserDistribution::GetSpecificDistribution( |
| - BrowserDistribution::CHROME_APP_HOST); |
| - AddVersionKeyWorkItems(root, shadow_app_launcher_dist, new_version, |
| - add_language_identifier, install_list); |
| - } |
| - |
| // Add any remaining work items that involve special settings for |
| // each product. |
| AddProductSpecificWorkItems(original_state, installer_state, setup_path, |