Index: chrome/installer/util/shell_util.cc |
diff --git a/chrome/installer/util/shell_util.cc b/chrome/installer/util/shell_util.cc |
index f1ca375fae38baa06716b83c74c38b002e879492..6af4a0c4a6ba4a34f47ada6ae9f9a3393fff2c0a 100644 |
--- a/chrome/installer/util/shell_util.cc |
+++ b/chrome/installer/util/shell_util.cc |
@@ -21,6 +21,7 @@ |
#include <utility> |
#include "base/bind.h" |
+#include "base/callback_helpers.h" |
#include "base/command_line.h" |
#include "base/files/file_enumerator.h" |
#include "base/files/file_path.h" |
@@ -682,10 +683,10 @@ bool IsChromeRegisteredForProtocol(const base::string16& suffix, |
// show the user the standard elevation prompt. If the user accepts it the new |
// process will make the necessary changes and return SUCCESS that we capture |
// and return. If protocol is non-empty we will also register Chrome as being |
-// capable of handling the protocol. This is most commonly used on per-user |
-// installs on Windows 7 where setup.exe did not have permission to register |
-// Chrome during install. It may also be used on all OSs for system-level |
-// installs in case Chrome's registration is somehow broken or missing. |
+// capable of handling the protocol. This is used for general browser |
+// registration on Windows 7 for per-user installs where setup.exe did not have |
+// permission to register Chrome during install. It may also be used on Windows |
+// 7 for system-level installs to register Chrome for a specific protocol. |
bool ElevateAndRegisterChrome(BrowserDistribution* dist, |
const base::FilePath& chrome_exe, |
const base::string16& suffix, |
@@ -2089,10 +2090,14 @@ bool ShellUtil::RegisterChromeBrowser(BrowserDistribution* dist, |
if (IsChromeRegistered(dist, chrome_exe, suffix, look_for_in)) |
return true; |
- bool result = true; |
+ // Ensure that the shell is notified of the mutations below. Specific exit |
+ // points may disable this if no mutations are made. |
+ base::ScopedClosureRunner notify_on_exit(base::Bind([] { |
+ SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nullptr, nullptr); |
+ })); |
+ |
+ // Do the full registration at user-level or if the user is an admin. |
if (root == HKEY_CURRENT_USER || IsUserAnAdmin()) { |
- // Do the full registration if we can do it at user-level or if the user is |
- // an admin. |
std::vector<std::unique_ptr<RegistryEntry>> progid_and_appreg_entries; |
std::vector<std::unique_ptr<RegistryEntry>> shell_entries; |
GetChromeProgIdEntries(dist, chrome_exe, suffix, |
@@ -2100,44 +2105,46 @@ bool ShellUtil::RegisterChromeBrowser(BrowserDistribution* dist, |
GetChromeAppRegistrationEntries(chrome_exe, suffix, |
&progid_and_appreg_entries); |
GetShellIntegrationEntries(dist, chrome_exe, suffix, &shell_entries); |
- result = (AddRegistryEntries(root, progid_and_appreg_entries) && |
- AddRegistryEntries(root, shell_entries)); |
- } else if (elevate_if_not_admin && |
- base::win::GetVersion() >= base::win::VERSION_VISTA && |
+ return AddRegistryEntries(root, progid_and_appreg_entries) && |
+ AddRegistryEntries(root, shell_entries); |
+ } |
+ // The installer is responsible for registration for system-level installs, so |
+ // never try to do it here. Getting to this point for a system-level install |
+ // likely means that IsChromeRegistered thinks registration is broken due to |
+ // localization issues (see https://crbug.com/717913#c18). It likely is not, |
+ // so return success to allow Chrome to be made default. |
+ if (!user_level) { |
+ notify_on_exit.Release().Reset(); |
+ return true; |
+ } |
+ // Try to elevate and register if requested for per-user installs if the user |
+ // is not an admin. |
+ if (elevate_if_not_admin && |
ElevateAndRegisterChrome(dist, chrome_exe, suffix, base::string16())) { |
- // If the user is not an admin and OS is between Vista and Windows 7 |
- // inclusively, try to elevate and register. This is only intended for |
- // user-level installs as system-level installs should always be run with |
- // admin rights. |
- result = true; |
- } else { |
- // If we got to this point then all we can do is create ProgId and basic app |
- // registrations under HKCU. |
- std::vector<std::unique_ptr<RegistryEntry>> entries; |
- GetChromeProgIdEntries(dist, chrome_exe, base::string16(), &entries); |
- // Prefer to use |suffix|; unless Chrome's ProgIds are already registered |
- // with no suffix (as per the old registration style): in which case some |
- // other registry entries could refer to them and since we were not able to |
- // set our HKLM entries above, we are better off not altering these here. |
- if (!AreEntriesAsDesired(entries, RegistryEntry::LOOK_IN_HKCU)) { |
- if (!suffix.empty()) { |
- entries.clear(); |
- GetChromeProgIdEntries(dist, chrome_exe, suffix, &entries); |
- GetChromeAppRegistrationEntries(chrome_exe, suffix, &entries); |
- } |
- result = AddRegistryEntries(HKEY_CURRENT_USER, entries); |
- } else { |
- // The ProgId is registered unsuffixed in HKCU, also register the app with |
- // Windows in HKCU (this was not done in the old registration style and |
- // thus needs to be done after the above check for the unsuffixed |
- // registration). |
+ return true; |
+ } |
+ // If we got to this point then all we can do is create ProgId and basic app |
+ // registrations under HKCU. |
+ std::vector<std::unique_ptr<RegistryEntry>> entries; |
+ GetChromeProgIdEntries(dist, chrome_exe, base::string16(), &entries); |
+ // Prefer to use |suffix|; unless Chrome's ProgIds are already registered with |
+ // no suffix (as per the old registration style): in which case some other |
+ // registry entries could refer to them and since we were not able to set our |
+ // HKLM entries above, we are better off not altering these here. |
+ if (!AreEntriesAsDesired(entries, RegistryEntry::LOOK_IN_HKCU)) { |
+ if (!suffix.empty()) { |
entries.clear(); |
- GetChromeAppRegistrationEntries(chrome_exe, base::string16(), &entries); |
- result = AddRegistryEntries(HKEY_CURRENT_USER, entries); |
+ GetChromeProgIdEntries(dist, chrome_exe, suffix, &entries); |
+ GetChromeAppRegistrationEntries(chrome_exe, suffix, &entries); |
} |
+ return AddRegistryEntries(HKEY_CURRENT_USER, entries); |
} |
- SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL); |
- return result; |
+ // The ProgId is registered unsuffixed in HKCU, also register the app with |
+ // Windows in HKCU (this was not done in the old registration style and thus |
+ // needs to be done after the above check for the unsuffixed registration). |
+ entries.clear(); |
+ GetChromeAppRegistrationEntries(chrome_exe, base::string16(), &entries); |
+ return AddRegistryEntries(HKEY_CURRENT_USER, entries); |
} |
bool ShellUtil::RegisterChromeForProtocol(BrowserDistribution* dist, |