Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3366)

Unified Diff: chrome/installer/setup/install_worker.cc

Issue 14031025: Implementing unified Chrome / App Launcher flow, and migrating old stand-alone App Launcher. (Closed) Base URL: http://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/installer/setup/install_worker.cc
diff --git a/chrome/installer/setup/install_worker.cc b/chrome/installer/setup/install_worker.cc
index 5450e32947b91e6495cd6d54f93d1a996e69c3ea..c6bfa6361581400db4aaecd395cb46aae73b07b5 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/04/29 20:25:41 Why is this being removed?
huangs 2013/04/30 14:01:49 This existed so an orphaned app_host.exe (i.e., it
AppCommand cmd(cmd_line.GetCommandLineString());
cmd.set_sends_pings(true);
cmd.set_is_web_accessible(true);
@@ -661,6 +655,38 @@ void CleanupBadCanaryDelegateExecuteRegistration(
}
}
+// As of M28, 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 with app_host.exe.";
+ HKEY reg_root = HKEY_CURRENT_USER;
+ BrowserDistribution* dist = BrowserDistribution::GetSpecificDistribution(
+ BrowserDistribution::CHROME_APP_HOST);
+
+ // Delete Add/Remove entry.
+ string16 legacy_app_host_uninstall_reg_path(
+ L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"
+ L"Google Chrome App Launcher");
gab 2013/04/29 20:25:41 Where was this set from before? Does it have to be
huangs 2013/04/30 14:01:49 This obsolete key was living in chrome_app_host_di
+ install_list->AddDeleteRegKeyWorkItem(reg_root,
+ legacy_app_host_uninstall_reg_path);
+
+ if (installer_state.system_install()) {
+ // Delete user-level registry entries for App Launcher.
+ install_list->AddDeleteRegKeyWorkItem(reg_root, dist->GetVersionKey());
+ install_list->AddDeleteRegKeyWorkItem(reg_root, dist->GetStateKey());
+ // Not updating AP values
+ }
+
+ // Delete app_host.exe.
+ base::FilePath app_host_exe(chrome_launcher_support::GetAnyAppHostPath());
gab 2013/04/29 20:25:41 This will always prefer deleting the system-level
huangs 2013/04/30 14:01:49 Yes, but app_host.exe have always been in user-lev
+ if (!app_host_exe.empty())
+ install_list->AddDeleteTreeWorkItem(app_host_exe, temp_path);
+
+ // Not migrating shortcuts here.
+}
+
} // namespace
// This method adds work items to create (or update) Chrome uninstall entry in
@@ -1173,6 +1199,18 @@ 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) &&
+ !installer_state.system_install()) {
+ const ProductState* orig_product = original_state.GetProductState(
+ false, BrowserDistribution::CHROME_APP_HOST);
+ if (orig_product &&
+ chrome_launcher_support::HasLegacyAppHostExe(orig_product->version())) {
+ 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 +1225,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);

Powered by Google App Engine
This is Rietveld 408576698