diff options
-rw-r--r-- | chrome/browser/shell_integration_win.cc | 20 | ||||
-rw-r--r-- | chrome/installer/setup/uninstall.cc | 54 | ||||
-rw-r--r-- | chrome/installer/util/shell_util.cc | 45 | ||||
-rw-r--r-- | chrome/installer/util/shell_util.h | 6 |
4 files changed, 66 insertions, 59 deletions
diff --git a/chrome/browser/shell_integration_win.cc b/chrome/browser/shell_integration_win.cc index 6f1957a..040b03c 100644 --- a/chrome/browser/shell_integration_win.cc +++ b/chrome/browser/shell_integration_win.cc @@ -73,20 +73,20 @@ bool ShellIntegration::IsDefaultBrowser() { BrowserDistribution* dist = BrowserDistribution::GetDistribution(); std::wstring app_name = dist->GetApplicationName(); - std::wstring app_name_with_suffix; - ShellUtil::GetUserSpecificDefaultBrowserSuffix(&app_name_with_suffix); - app_name_with_suffix = app_name + app_name_with_suffix; + // If a user specific default browser entry exists, we check for that + // app name being default. If not, then default browser is just called + // Google Chrome or Chromium so we do not append suffix to app name. + std::wstring suffix; + if (ShellUtil::GetUserSpecificDefaultBrowserSuffix(&suffix)) + app_name += suffix; + for (int i = 0; i < _countof(kChromeProtocols); i++) { BOOL result = TRUE; hr = pAAR->QueryAppIsDefault(kChromeProtocols[i].c_str(), AT_URLPROTOCOL, - AL_EFFECTIVE, app_name_with_suffix.c_str(), &result); + AL_EFFECTIVE, app_name.c_str(), &result); if (!SUCCEEDED(hr) || (result == FALSE)) { - hr = pAAR->QueryAppIsDefault(kChromeProtocols[i].c_str(), - AT_URLPROTOCOL, AL_EFFECTIVE, app_name.c_str(), &result); - if (!SUCCEEDED(hr) || (result == FALSE)) { - pAAR->Release(); - return false; - } + pAAR->Release(); + return false; } } pAAR->Release(); diff --git a/chrome/installer/setup/uninstall.cc b/chrome/installer/setup/uninstall.cc index 7152f04..460c4a2 100644 --- a/chrome/installer/setup/uninstall.cc +++ b/chrome/installer/setup/uninstall.cc @@ -58,6 +58,29 @@ void CloseAllChromeProcesses() { ResultCodes::HUNG, NULL); } +// This method tries to figure out if current user has registered Chrome. +// It returns true iff: +// - Software\Clients\StartMenuInternet\Chromium\"" key has a valid value. +// - The value is same as chrome.exe path for the current installation. +bool CurrentUserHasDefaultBrowser(bool system_uninstall) { + std::wstring reg_key(ShellUtil::kRegStartMenuInternet); + BrowserDistribution* dist = BrowserDistribution::GetDistribution(); + reg_key.append(L"\\" + dist->GetApplicationName() + ShellUtil::kRegShellOpen); + RegKey key(HKEY_LOCAL_MACHINE, reg_key.c_str()); + std::wstring reg_exe; + if (key.ReadValue(L"", ®_exe) && reg_exe.length() > 2) { + std::wstring chrome_exe = installer::GetChromeInstallPath(system_uninstall); + file_util::AppendToPath(&chrome_exe, installer_util::kChromeExe); + reg_exe = reg_exe.substr(1, reg_exe.length() - 2); + if ((reg_exe.size() == chrome_exe.size()) && + (std::equal(chrome_exe.begin(), chrome_exe.end(), + reg_exe.begin(), CaseInsensitiveCompare<wchar_t>()))) + return true; + } + + return false; +} + // This method deletes Chrome shortcut folder from Windows Start menu. It // checks system_uninstall to see if the shortcut is in all users start menu // or current user start menu. @@ -250,11 +273,13 @@ bool installer_setup::DeleteChromeRegistrationKeys(HKEY root, // Delete Software\Classes\ChromeHTML, std::wstring html_prog_id(ShellUtil::kRegClasses); file_util::AppendToPath(&html_prog_id, ShellUtil::kChromeHTMLProgId); + html_prog_id.append(browser_entry_suffix); DeleteRegistryKey(key, html_prog_id); // Delete Software\Classes\ChromeExt, std::wstring ext_prog_id(ShellUtil::kRegClasses); file_util::AppendToPath(&ext_prog_id, ShellUtil::kChromeExtProgId); + ext_prog_id.append(browser_entry_suffix); DeleteRegistryKey(key, ext_prog_id); // Delete Software\Classes\.crx, @@ -267,6 +292,7 @@ bool installer_setup::DeleteChromeRegistrationKeys(HKEY root, BrowserDistribution* dist = BrowserDistribution::GetDistribution(); std::wstring set_access_key(ShellUtil::kRegStartMenuInternet); file_util::AppendToPath(&set_access_key, dist->GetApplicationName()); + set_access_key.append(browser_entry_suffix); DeleteRegistryKey(key, set_access_key); // We have renamed the StartMenuInternet\chrome.exe to @@ -278,22 +304,7 @@ bool installer_setup::DeleteChromeRegistrationKeys(HKEY root, // Delete Software\RegisteredApplications\Chromium DeleteRegistryValue(root, ShellUtil::kRegRegisteredApplications, - dist->GetApplicationName()); - - // Delete Software\Classes\ChromeHTML.<user> - // Delete Software\Classes\ChromeExt.<user> - // Delete Software\Clients\StartMenuInternet\Chromium.<user> - // Delete Software\RegisteredApplications\Chromium.<user> - if (!browser_entry_suffix.empty()) { - html_prog_id.append(browser_entry_suffix); - DeleteRegistryKey(key, html_prog_id); - ext_prog_id.append(browser_entry_suffix); - DeleteRegistryKey(key, ext_prog_id); - set_access_key.append(browser_entry_suffix); - DeleteRegistryKey(key, set_access_key); - DeleteRegistryValue(root, ShellUtil::kRegRegisteredApplications, - dist->GetApplicationName() + browser_entry_suffix); - } + dist->GetApplicationName() + browser_entry_suffix); // Delete Software\Classes\Applications\chrome.exe std::wstring app_key(ShellUtil::kRegClasses); @@ -324,9 +335,11 @@ installer_util::InstallStatus installer_setup::UninstallChrome( const std::wstring& exe_path, bool system_uninstall, bool remove_all, bool force_uninstall, const CommandLine& cmd_line, const wchar_t* cmd_params) { - std::wstring suffix; - ShellUtil::GetUserSpecificDefaultBrowserSuffix(&suffix); installer_util::InstallStatus status = installer_util::UNINSTALL_CONFIRMED; + std::wstring suffix; + if (!ShellUtil::GetUserSpecificDefaultBrowserSuffix(&suffix)) + suffix = L""; + if (force_uninstall) { // Since --force-uninstall command line option is used, we are going to // do silent uninstall. Try to close all running Chrome instances. @@ -341,7 +354,7 @@ installer_util::InstallStatus installer_setup::UninstallChrome( // another uninstaller (silent) in elevated mode to do HKLM cleanup. // And continue uninstalling in the current process also to do HKCU cleanup. if (remove_all && - ShellUtil::AdminNeededForRegistryCleanup() && + (!suffix.empty() || CurrentUserHasDefaultBrowser(system_uninstall)) && !::IsUserAnAdmin() && (win_util::GetWinVersion() >= win_util::WINVERSION_VISTA) && !cmd_line.HasSwitch(installer_util::switches::kRunAsAdmin)) { @@ -394,7 +407,8 @@ installer_util::InstallStatus installer_setup::UninstallChrome( // For user level install also we end up creating some keys in HKLM if user // sets Chrome as default browser. So delete those as well (needs admin). - if (remove_all && !system_uninstall) + if (remove_all && !system_uninstall && + (!suffix.empty() || CurrentUserHasDefaultBrowser(system_uninstall))) DeleteChromeRegistrationKeys(HKEY_LOCAL_MACHINE, suffix, ret); // Delete shared registry keys as well (these require admin rights) if diff --git a/chrome/installer/util/shell_util.cc b/chrome/installer/util/shell_util.cc index 10355b6..88674dc 100644 --- a/chrome/installer/util/shell_util.cc +++ b/chrome/installer/util/shell_util.cc @@ -347,20 +347,6 @@ bool ElevateAndRegisterChrome(const std::wstring& chrome_exe, return false; } -// This method checks if user specific default browser registry entry exists. -// (i.e. Software\Clients\StartMenuInternet\Chromium.<user>) -bool UserSpecificDefaultBrowserEntryExists() { - std::wstring suffix; - if (!ShellUtil::GetUserSpecificDefaultBrowserSuffix(&suffix)) - return false; - - std::wstring start_menu_entry(ShellUtil::kRegStartMenuInternet); - BrowserDistribution* dist = BrowserDistribution::GetDistribution(); - start_menu_entry.append(L"\\" + dist->GetApplicationName() + suffix); - RegKey key(HKEY_LOCAL_MACHINE, start_menu_entry.c_str()); - return key.Valid(); -} - // This method tries to figure out if another user has already registered her // own copy of Chrome so that we can avoid overwriting it and append current // user's login name to default browser registry entries. This function is @@ -451,15 +437,10 @@ const wchar_t* ShellUtil::kRegUrlProtocol = L"URL Protocol"; const wchar_t* ShellUtil::kChromeExtProgIdDesc = L"Chrome Extension Installer"; -bool ShellUtil::AdminNeededForRegistryCleanup() { +bool ShellUtil::AdminNeededForRegistryCleanup(const std::wstring& suffix) { bool cleanup_needed = false; std::list<RegistryEntry*> entries; STLElementDeleter<std::list<RegistryEntry*>> entries_deleter(&entries); - RegistryEntry::GetProgIdEntries(L"chrome.exe", L"", &entries); - RegistryEntry::GetSystemEntries(L"chrome.exe", L"", &entries); - - std::wstring suffix; - GetUserSpecificDefaultBrowserSuffix(&suffix); RegistryEntry::GetProgIdEntries(L"chrome.exe", suffix, &entries); RegistryEntry::GetSystemEntries(L"chrome.exe", suffix, &entries); for (std::list<RegistryEntry*>::const_iterator itr = entries.begin(); @@ -609,7 +590,12 @@ bool ShellUtil::GetUserSpecificDefaultBrowserSuffix(std::wstring* entry) { return false; entry->assign(L"."); entry->append(user_name); - return true; + + std::wstring start_menu_entry(ShellUtil::kRegStartMenuInternet); + BrowserDistribution* dist = BrowserDistribution::GetDistribution(); + start_menu_entry.append(L"\\" + dist->GetApplicationName() + *entry); + RegKey key(HKEY_LOCAL_MACHINE, start_menu_entry.c_str()); + return key.Valid(); } bool ShellUtil::MakeChromeDefault(int shell_change, @@ -628,7 +614,12 @@ bool ShellUtil::MakeChromeDefault(int shell_change, (void**)&pAAR); if (SUCCEEDED(hr)) { BrowserDistribution* dist = BrowserDistribution::GetDistribution(); - hr = pAAR->SetAppAsDefaultAll(dist->GetApplicationName().c_str()); + std::wstring app_name = dist->GetApplicationName(); + std::wstring suffix; + if (ShellUtil::GetUserSpecificDefaultBrowserSuffix(&suffix)) + app_name += suffix; + + hr = pAAR->SetAppAsDefaultAll(app_name.c_str()); pAAR->Release(); } if (!SUCCEEDED(hr)) { @@ -645,8 +636,8 @@ bool ShellUtil::MakeChromeDefault(int shell_change, std::list<RegistryEntry*> entries; STLElementDeleter<std::list<RegistryEntry*>> entries_deleter(&entries); std::wstring suffix; - if (UserSpecificDefaultBrowserEntryExists()) - GetUserSpecificDefaultBrowserSuffix(&suffix); + if (!GetUserSpecificDefaultBrowserSuffix(&suffix)) + suffix = L""; RegistryEntry::GetUserEntries(chrome_exe, suffix, &entries); // Change the default browser for current user. if ((shell_change & ShellUtil::CURRENT_USER) && @@ -673,9 +664,9 @@ bool ShellUtil::RegisterChromeBrowser(const std::wstring& chrome_exe, if (!unique_suffix.empty()) { suffix = unique_suffix; } else if (InstallUtil::IsPerUserInstall(chrome_exe.c_str()) && - (UserSpecificDefaultBrowserEntryExists() || - AnotherUserHasDefaultBrowser(chrome_exe))) { - GetUserSpecificDefaultBrowserSuffix(&suffix); + !GetUserSpecificDefaultBrowserSuffix(&suffix) && + !AnotherUserHasDefaultBrowser(chrome_exe)) { + suffix = L""; } // Check if Chromium is already registered with this suffix. diff --git a/chrome/installer/util/shell_util.h b/chrome/installer/util/shell_util.h index 6eb7390..ca6eac7 100644 --- a/chrome/installer/util/shell_util.h +++ b/chrome/installer/util/shell_util.h @@ -78,7 +78,7 @@ class ShellUtil { // Checks if we need Admin rights for registry cleanup by checking if any // entry exists in HKLM. - static bool AdminNeededForRegistryCleanup(); + static bool AdminNeededForRegistryCleanup(const std::wstring& suffix); // Create Chrome shortcut on Desktop // If shell_change is CURRENT_USER, the shortcut is created in the @@ -143,7 +143,9 @@ class ShellUtil { // to Chromium default browser entry in the registry to create a unique name // if there are multiple users on the machine, each with their own copy of // Chromium that they want to set as default browser. - // This suffix value is assigned to |entry|. + // This suffix value is assigned to |entry|. The function also checks for + // existence of Default Browser registry key with this suffix and + // returns true if it exists. In all other cases it returns false. static bool GetUserSpecificDefaultBrowserSuffix(std::wstring* entry); // Make Chrome default browser. |