| Index: chrome/installer/util/install_util.cc
|
| diff --git a/chrome/installer/util/install_util.cc b/chrome/installer/util/install_util.cc
|
| index c5568048da4978a6a33234dc036ac5228fa95b7e..4a106c3a806ba9e804beba2c2afcef837d7d1512 100644
|
| --- a/chrome/installer/util/install_util.cc
|
| +++ b/chrome/installer/util/install_util.cc
|
| @@ -44,6 +44,7 @@ using installer::ProductState;
|
|
|
| namespace {
|
|
|
| +const wchar_t kRegDowngradeVersion[] = L"DowngradeVersion";
|
| const wchar_t kStageBinaryPatching[] = L"binary_patching";
|
| const wchar_t kStageBuilding[] = L"building";
|
| const wchar_t kStageConfiguringAutoLaunch[] = L"configuring_auto_launch";
|
| @@ -630,6 +631,47 @@ bool InstallUtil::ProgramCompare::GetInfo(const base::File& file,
|
| return GetFileInformationByHandle(file.GetPlatformFile(), info) != 0;
|
| }
|
|
|
| +// static
|
| +base::Version InstallUtil::GetDowngradeVersion(
|
| + bool system_install,
|
| + const BrowserDistribution* dist) {
|
| + DCHECK(dist);
|
| + base::win::RegKey key;
|
| + base::string16 downgrade_version;
|
| + if (key.Open(system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
|
| + dist->GetStateKey().c_str(),
|
| + KEY_QUERY_VALUE | KEY_WOW64_32KEY) != ERROR_SUCCESS ||
|
| + key.ReadValue(kRegDowngradeVersion, &downgrade_version) !=
|
| + ERROR_SUCCESS) {
|
| + return base::Version();
|
| + }
|
| + return base::Version(base::UTF16ToASCII(downgrade_version));
|
| +}
|
| +
|
| +// static
|
| +void InstallUtil::AddUpdateDowngradeVersionItem(
|
| + bool system_install,
|
| + const base::Version* current_version,
|
| + const base::Version& new_version,
|
| + const BrowserDistribution* dist,
|
| + WorkItemList* list) {
|
| + DCHECK(list);
|
| + DCHECK(dist);
|
| + DCHECK_EQ(BrowserDistribution::CHROME_BROWSER, dist->GetType());
|
| + base::Version downgrade_version = GetDowngradeVersion(system_install, dist);
|
| + HKEY root = system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
|
| + if (!current_version ||
|
| + (*current_version <= new_version &&
|
| + ((!downgrade_version.IsValid() || downgrade_version <= new_version)))) {
|
| + list->AddDeleteRegValueWorkItem(root, dist->GetStateKey(), KEY_WOW64_32KEY,
|
| + kRegDowngradeVersion);
|
| + } else if (*current_version > new_version && !downgrade_version.IsValid()) {
|
| + list->AddSetRegValueWorkItem(
|
| + root, dist->GetStateKey(), KEY_WOW64_32KEY, kRegDowngradeVersion,
|
| + base::ASCIIToUTF16(current_version->GetString()), true);
|
| + }
|
| +}
|
| +
|
| InstallUtil::ProgramCompare::ProgramCompare(const base::FilePath& path_to_match)
|
| : ProgramCompare(path_to_match, ComparisonType::FILE) {}
|
|
|
|
|