Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3702)

Unified Diff: chrome/installer/util/shell_util.cc

Issue 10213010: Don't register or use the DelegateExecute verb handler if it isn't present. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: logging tweak Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/installer/util/shell_util.cc
diff --git a/chrome/installer/util/shell_util.cc b/chrome/installer/util/shell_util.cc
index 3115aeb0db9b4d983281cb41b9cdaba84114ae0c..45eaf52c7d87fe8081e37e4a5f4755e9f79133db 100644
--- a/chrome/installer/util/shell_util.cc
+++ b/chrome/installer/util/shell_util.cc
@@ -89,9 +89,11 @@ class RegistryEntry {
// handler will be in HKCU; thus we do not need a suffix on those entries.
string16 app_id(dist->GetBrowserAppId());
string16 delegate_guid;
+ // TODO(grt): remove HasDelegateExecuteHandler when the exe is ever-present;
+ // see also install_worker.cc's AddDelegateExecuteWorkItems.
bool set_delegate_execute =
- base::win::GetVersion() >= base::win::VERSION_WIN8 &&
- dist->GetDelegateExecuteHandlerData(&delegate_guid, NULL, NULL, NULL);
+ dist->GetDelegateExecuteHandlerData(&delegate_guid, NULL, NULL, NULL) &&
+ InstallUtil::HasDelegateExecuteHandler(dist, chrome_exe);
// DelegateExecute ProgId. Needed for Chrome Metro in Windows 8.
if (set_delegate_execute) {
@@ -604,6 +606,46 @@ uint32 ConvertShellUtilShortcutOptionsToFileUtil(uint32 options) {
return converted_options;
}
+// As of r133333, the DelegateExecute verb handler was being registered for
+// Google Chrome installs on Windows 8 even though the binary itself wasn't
+// present. This affected Chrome 20.0.1115.1 on the dev channel (and anyone who
+// pulled a Canary >= 20.0.1112.0 and installed it manually as Google Chrome).
+// This egregious hack is here to remove the bad values for those installs, and
+// should be removed after a reasonable time, say 2012-08-01. Anyone on Win8
+// dev channel who hasn't been autoupdated or manually updated by then will have
+// to uninstall and reinstall Chrome to repair. See http://crbug.com/124666 and
+// http://crbug.com/123994 for gory details.
+void RemoveBadWindows8RegistrationIfNeeded(
+ BrowserDistribution* dist,
+ const string16& chrome_exe,
+ const string16& suffix) {
+ string16 handler_guid;
+
+ if (dist->GetDelegateExecuteHandlerData(&handler_guid, NULL, NULL, NULL) &&
+ !InstallUtil::HasDelegateExecuteHandler(dist, chrome_exe)) {
+ // There's no need to rollback, so forgo the usual work item lists and just
+ // remove the values from the registry.
+ const HKEY root_key = InstallUtil::IsPerUserInstall(chrome_exe.c_str()) ?
+ HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE;
+ const string16 app_id(dist->GetBrowserAppId());
+
+ // <root hkey>\Software\Classes\<app_id>
+ string16 key(ShellUtil::kRegClasses);
+ key.push_back(FilePath::kSeparators[0]);
+ key.append(app_id);
+ InstallUtil::DeleteRegistryKey(root_key, key);
+
+ // <root hkey>\Software\Classes\ChromiumHTML[.user]\shell\open\command
+ key = ShellUtil::kRegClasses;
+ key.push_back(FilePath::kSeparators[0]);
+ key.append(ShellUtil::kChromeHTMLProgId);
+ key.append(suffix);
+ key.append(ShellUtil::kRegShellOpen);
+ InstallUtil::DeleteRegistryValue(root_key, key,
+ ShellUtil::kRegDelegateExecute);
+ }
+}
+
} // namespace
const wchar_t* ShellUtil::kRegDefaultIcon = L"\\DefaultIcon";
@@ -1027,6 +1069,9 @@ bool ShellUtil::RegisterChromeBrowser(BrowserDistribution* dist,
suffix = L"";
}
+ // TODO(grt): remove this on or after 2012-08-01; see impl for details.
+ RemoveBadWindows8RegistrationIfNeeded(dist, chrome_exe, suffix);
+
// Check if Chromium is already registered with this suffix.
if (IsChromeRegistered(dist, chrome_exe, suffix))
return true;
« chrome/installer/setup/install_worker.cc ('K') | « chrome/installer/util/install_util.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698