| Index: chrome/installer/setup/setup_main.cc
|
| diff --git a/chrome/installer/setup/setup_main.cc b/chrome/installer/setup/setup_main.cc
|
| index 3c416d19a31408f29c5125416b61850f77f1d63f..47d33133185b4ed3d71f0ba11d2751c5ce84d63a 100644
|
| --- a/chrome/installer/setup/setup_main.cc
|
| +++ b/chrome/installer/setup/setup_main.cc
|
| @@ -39,6 +39,7 @@
|
| #include "chrome/installer/util/delete_tree_work_item.h"
|
| #include "chrome/installer/util/google_update_constants.h"
|
| #include "chrome/installer/util/google_update_settings.h"
|
| +#include "chrome/installer/util/google_update_util.h"
|
| #include "chrome/installer/util/helper.h"
|
| #include "chrome/installer/util/html_dialog.h"
|
| #include "chrome/installer/util/install_util.h"
|
| @@ -67,7 +68,6 @@ using installer::MasterPreferences;
|
| const wchar_t kChromePipeName[] = L"\\\\.\\pipe\\ChromeCrashServices";
|
| const wchar_t kGoogleUpdatePipeName[] = L"\\\\.\\pipe\\GoogleCrashServices\\";
|
| const wchar_t kSystemPrincipalSid[] = L"S-1-5-18";
|
| -const int kGoogleUpdateTimeoutMs = 20 * 1000;
|
|
|
| const MINIDUMP_TYPE kLargerDumpType = static_cast<MINIDUMP_TYPE>(
|
| MiniDumpWithProcessThreadData | // Get PEB and TEB.
|
| @@ -599,6 +599,18 @@ bool CheckPreInstallConditions(const InstallationState& original_state,
|
| return false;
|
| }
|
| }
|
| +
|
| + } else { // System-level install.
|
| + // --ensure-google-update-present is supported for user-level only.
|
| + // The flag is generic, but its primary use case involves App Host.
|
| + if (installer_state->ensure_google_update_present()) {
|
| + LOG(DFATAL) << "--" << installer::switches::kEnsureGoogleUpdatePresent
|
| + << " is supported for user-level only.";
|
| + *status = installer::APP_HOST_REQUIRES_USER_LEVEL;
|
| + // No message string since there is nothing a user can do.
|
| + installer_state->WriteInstallerResult(*status, 0, NULL);
|
| + return false;
|
| + }
|
| }
|
|
|
| return true;
|
| @@ -748,6 +760,21 @@ installer::InstallStatus InstallProductsHelper(
|
| *installer_version, &install_status);
|
|
|
| if (proceed_with_installation) {
|
| + // If Google Update is absent at user-level, install it using the
|
| + // Google Update installer from an existing system-level installation.
|
| + // This is for quick-enable App Host install from a system-level
|
| + // Chrome Binaries installation.
|
| + if (!system_install && installer_state.ensure_google_update_present()) {
|
| + if (!google_update::EnsureUserLevelGoogleUpdatePresent()) {
|
| + LOG(ERROR) << "Failed to install Google Update";
|
| + proceed_with_installation = false;
|
| + install_status = installer::INSTALL_OF_GOOGLE_UPDATE_FAILED;
|
| + installer_state.WriteInstallerResult(install_status, 0, NULL);
|
| + }
|
| + }
|
| + }
|
| +
|
| + if (proceed_with_installation) {
|
| FilePath prefs_source_path(cmd_line.GetSwitchValueNative(
|
| installer::switches::kInstallerData));
|
| install_status = installer::InstallOrUpdateProduct(
|
| @@ -933,42 +960,6 @@ installer::InstallStatus UninstallProduct(
|
| remove_all, force_uninstall, cmd_line);
|
| }
|
|
|
| -// Tell Google Update that an uninstall has taken place. This gives it a chance
|
| -// to uninstall itself straight away if no more products are installed on the
|
| -// system rather than waiting for the next time the scheduled task runs.
|
| -// Success or failure of Google Update has no bearing on the success or failure
|
| -// of Chrome's uninstallation.
|
| -void UninstallGoogleUpdate(bool system_install) {
|
| - string16 uninstall_cmd(
|
| - GoogleUpdateSettings::GetUninstallCommandLine(system_install));
|
| - if (!uninstall_cmd.empty()) {
|
| - base::win::ScopedHandle process;
|
| - LOG(INFO) << "Launching Google Update's uninstaller: " << uninstall_cmd;
|
| - if (base::LaunchProcess(uninstall_cmd, base::LaunchOptions(),
|
| - process.Receive())) {
|
| - int exit_code = 0;
|
| - if (base::WaitForExitCodeWithTimeout(
|
| - process, &exit_code,
|
| - base::TimeDelta::FromMilliseconds(kGoogleUpdateTimeoutMs))) {
|
| - if (exit_code == 0) {
|
| - LOG(INFO) << " normal exit.";
|
| - } else {
|
| - LOG(ERROR) << "Google Update uninstaller (" << uninstall_cmd
|
| - << ") exited with code " << exit_code << ".";
|
| - }
|
| - } else {
|
| - // The process didn't finish in time, or GetExitCodeProcess failed.
|
| - LOG(ERROR) << "Google Update uninstaller (" << uninstall_cmd
|
| - << ") is taking more than " << kGoogleUpdateTimeoutMs
|
| - << " milliseconds to complete.";
|
| - }
|
| - } else {
|
| - PLOG(ERROR) << "Failed to launch Google Update uninstaller ("
|
| - << uninstall_cmd << ")";
|
| - }
|
| - }
|
| -}
|
| -
|
| installer::InstallStatus UninstallProducts(
|
| const InstallationState& original_state,
|
| const InstallerState& installer_state,
|
| @@ -1003,7 +994,10 @@ installer::InstallStatus UninstallProducts(
|
| install_status = prod_status;
|
| }
|
|
|
| - UninstallGoogleUpdate(installer_state.system_install());
|
| + // Tell Google Update that an uninstall has taken place.
|
| + // Ignore the return value: success or failure of Google Update
|
| + // has no bearing on the success or failure of Chrome's uninstallation.
|
| + google_update::UninstallGoogleUpdate(installer_state.system_install());
|
|
|
| return install_status;
|
| }
|
| @@ -1094,16 +1088,14 @@ bool HandleNonInstallCmdLineOptions(const InstallationState& original_state,
|
| GoogleUpdateSettings::SetEULAConsent(
|
| original_state, BrowserDistribution::GetDistribution(), true);
|
| }
|
| - } else if (cmd_line.HasSwitch(
|
| - installer::switches::kConfigureUserSettings)) {
|
| + } else if (cmd_line.HasSwitch(installer::switches::kConfigureUserSettings)) {
|
| DCHECK(installer_state->system_install());
|
| const Product* chrome_install =
|
| installer_state->FindProduct(BrowserDistribution::CHROME_BROWSER);
|
| DCHECK(chrome_install);
|
| // TODO(gab): Implement the new shortcut functionality here.
|
| LOG(ERROR) << "--configure-user-settings is not implemented.";
|
| - } else if (cmd_line.HasSwitch(
|
| - installer::switches::kRegisterChromeBrowser)) {
|
| + } else if (cmd_line.HasSwitch(installer::switches::kRegisterChromeBrowser)) {
|
| installer::InstallStatus status = installer::UNKNOWN_STATUS;
|
| const Product* chrome_install =
|
| installer_state->FindProduct(BrowserDistribution::CHROME_BROWSER);
|
| @@ -1132,8 +1124,7 @@ bool HandleNonInstallCmdLineOptions(const InstallationState& original_state,
|
| suffix = cmd_line.GetSwitchValueNative(
|
| installer::switches::kRegisterChromeBrowserSuffix);
|
| }
|
| - if (cmd_line.HasSwitch(
|
| - installer::switches::kRegisterURLProtocol)) {
|
| + if (cmd_line.HasSwitch(installer::switches::kRegisterURLProtocol)) {
|
| string16 protocol = cmd_line.GetSwitchValueNative(
|
| installer::switches::kRegisterURLProtocol);
|
| // ShellUtil::RegisterChromeForProtocol performs all registration
|
|
|