Index: chrome/browser/first_run/upgrade_util_win.cc |
=================================================================== |
--- chrome/browser/first_run/upgrade_util_win.cc (revision 91508) |
+++ chrome/browser/first_run/upgrade_util_win.cc (working copy) |
@@ -15,10 +15,12 @@ |
#include "base/logging.h" |
#include "base/path_service.h" |
#include "base/process_util.h" |
+#include "base/string_util.h" |
#include "base/win/registry.h" |
#include "base/win/scoped_comptr.h" |
#include "chrome/browser/first_run/upgrade_util_win.h" |
#include "chrome/common/chrome_constants.h" |
+#include "chrome/common/chrome_switches.h" |
#include "chrome/installer/util/browser_distribution.h" |
#include "chrome/installer/util/google_update_constants.h" |
#include "chrome/installer/util/install_util.h" |
@@ -85,25 +87,52 @@ |
if (!PathService::Get(base::FILE_EXE, &cur_chrome_exe)) |
return false; |
- // First try to rename exe by launching rename command ourselves. |
+ // Open up the registry key containing current version and rename information. |
bool user_install = |
InstallUtil::IsPerUserInstall(cur_chrome_exe.value().c_str()); |
HKEY reg_root = user_install ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE; |
BrowserDistribution *dist = BrowserDistribution::GetDistribution(); |
base::win::RegKey key; |
- std::wstring rename_cmd; |
- if ((key.Open(reg_root, dist->GetVersionKey().c_str(), |
- KEY_READ) == ERROR_SUCCESS) && |
- (key.ReadValue(google_update::kRegRenameCmdField, |
- &rename_cmd) == ERROR_SUCCESS)) { |
- base::ProcessHandle handle; |
- if (base::LaunchApp(rename_cmd, true, true, &handle)) { |
- DWORD exit_code; |
- ::GetExitCodeProcess(handle, &exit_code); |
- ::CloseHandle(handle); |
- if (exit_code == installer::RENAME_SUCCESSFUL) |
- return true; |
+ if (key.Open(reg_root, dist->GetVersionKey().c_str(), |
+ KEY_QUERY_VALUE) == ERROR_SUCCESS) { |
+ |
+ // Having just ascertained that we can swap, now check that we should: if |
+ // we are given an explicit --chrome-version flag, don't rename unless the |
+ // specified version matches the "pv" value. In practice, this is used to |
+ // defer Chrome Frame updates until the current version of the Chrome Frame |
+ // DLL component is loaded. |
+ const CommandLine& cmd_line = *CommandLine::ForCurrentProcess(); |
+ if (cmd_line.HasSwitch(switches::kChromeVersion)) { |
+ std::string version_string = |
+ cmd_line.GetSwitchValueASCII(switches::kChromeVersion); |
+ scoped_ptr<Version> cmd_version( |
+ Version::GetVersionFromString(version_string)); |
+ |
+ std::wstring pv_value; |
+ if (key.ReadValue(google_update::kRegVersionField, |
+ &pv_value) == ERROR_SUCCESS) { |
+ scoped_ptr<Version> pv_version( |
+ Version::GetVersionFromString(WideToASCII(pv_value))); |
+ if (cmd_version.get() && pv_version.get() && |
+ !cmd_version->Equals(*pv_version.get())) { |
+ return false; |
+ } |
+ } |
} |
+ |
+ // First try to rename exe by launching rename command ourselves. |
+ std::wstring rename_cmd; |
+ if (key.ReadValue(google_update::kRegRenameCmdField, |
+ &rename_cmd) == ERROR_SUCCESS) { |
+ base::ProcessHandle handle; |
+ if (base::LaunchApp(rename_cmd, true, true, &handle)) { |
+ DWORD exit_code; |
+ ::GetExitCodeProcess(handle, &exit_code); |
+ ::CloseHandle(handle); |
+ if (exit_code == installer::RENAME_SUCCESSFUL) |
+ return true; |
+ } |
+ } |
} |
// Rename didn't work so try to rename by calling Google Update |