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

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

Issue 10823178: Register Chrome in Open With for File Associations at install on Windows. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address roberts comments Created 8 years, 4 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
« no previous file with comments | « chrome/installer/util/shell_util.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/installer/util/shell_util.cc
diff --git a/chrome/installer/util/shell_util.cc b/chrome/installer/util/shell_util.cc
index ad8ace3261ac290daa3197b91e34a8e213a3af77..51f651b22fd8e5612836ae2328b265f130c2617f 100644
--- a/chrome/installer/util/shell_util.cc
+++ b/chrome/installer/util/shell_util.cc
@@ -13,7 +13,6 @@
#include <windows.h>
#include <limits>
-#include <list>
#include <string>
#include "base/command_line.h"
@@ -23,8 +22,9 @@
#include "base/logging.h"
#include "base/md5.h"
#include "base/memory/scoped_ptr.h"
+#include "base/memory/scoped_vector.h"
#include "base/path_service.h"
-#include "base/stl_util.h"
+#include "base/string16.h"
#include "base/string_number_conversions.h"
#include "base/string_split.h"
#include "base/string_util.h"
@@ -204,13 +204,13 @@ class RegistryEntry {
}
// This method returns a list of all the registry entries that
- // are needed to register Chromium ProgIds.
+ // are needed to register this installation's ProgId and AppId.
// These entries should be registered in HKCU for user-level installs and in
// HKLM for system-level installs.
- static bool GetProgIdEntries(BrowserDistribution* dist,
+ static void GetProgIdEntries(BrowserDistribution* dist,
const string16& chrome_exe,
const string16& suffix,
- std::list<RegistryEntry*>* entries) {
+ ScopedVector<RegistryEntry>* entries) {
string16 icon_path(ShellUtil::GetChromeIcon(dist, chrome_exe));
string16 open_cmd(ShellUtil::GetChromeShellOpenCmd(chrome_exe));
string16 delegate_command(ShellUtil::GetChromeDelegateCommand(chrome_exe));
@@ -234,8 +234,8 @@ class RegistryEntry {
model_id_shell.append(ShellUtil::kRegShellPath);
// <root hkey>\Software\Classes\<app_id>\.exe\shell @=open
- entries->push_front(new RegistryEntry(model_id_shell,
- ShellUtil::kRegVerbOpen));
+ entries->push_back(new RegistryEntry(model_id_shell,
+ ShellUtil::kRegVerbOpen));
const wchar_t* const verbs[] = { ShellUtil::kRegVerbOpen,
ShellUtil::kRegVerbOpenNewWindow,
@@ -246,15 +246,15 @@ class RegistryEntry {
sub_path.append(verbs[i]);
// <root hkey>\Software\Classes\<app_id>\.exe\shell\<verb>
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
sub_path, L"CommandId", L"Browser.Launch"));
sub_path.push_back(FilePath::kSeparators[0]);
sub_path.append(ShellUtil::kRegCommand);
// <root hkey>\Software\Classes\<app_id>\.exe\shell\<verb>\command
- entries->push_front(new RegistryEntry(sub_path, delegate_command));
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(sub_path, delegate_command));
+ entries->push_back(new RegistryEntry(
sub_path, ShellUtil::kRegDelegateExecute, delegate_guid));
}
}
@@ -263,16 +263,16 @@ class RegistryEntry {
string16 chrome_html_prog_id(ShellUtil::kRegClasses);
chrome_html_prog_id.push_back(FilePath::kSeparators[0]);
chrome_html_prog_id.append(GetBrowserProgId(suffix));
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
chrome_html_prog_id, ShellUtil::kChromeHTMLProgIdDesc));
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
chrome_html_prog_id, ShellUtil::kRegUrlProtocol, L""));
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
chrome_html_prog_id + ShellUtil::kRegDefaultIcon, icon_path));
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
chrome_html_prog_id + ShellUtil::kRegShellOpen, open_cmd));
if (set_delegate_execute) {
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
chrome_html_prog_id + ShellUtil::kRegShellOpen,
ShellUtil::kRegDelegateExecute, delegate_guid));
}
@@ -280,133 +280,153 @@ class RegistryEntry {
// The following entries are required as of Windows 8, but do not
// depend on the DelegateExecute verb handler being set.
if (base::win::GetVersion() >= base::win::VERSION_WIN8) {
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
chrome_html_prog_id, ShellUtil::kRegAppUserModelId, app_id));
// Add \Software\Classes\ChromeHTML\Application entries
string16 chrome_application(chrome_html_prog_id +
ShellUtil::kRegApplication);
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
chrome_application, ShellUtil::kRegAppUserModelId, app_id));
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
chrome_application, ShellUtil::kRegApplicationIcon, icon_path));
// TODO(grt): http://crbug.com/75152 Write a reference to a localized
// resource for name, description, and company.
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
chrome_application, ShellUtil::kRegApplicationName,
dist->GetAppShortCutName()));
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
chrome_application, ShellUtil::kRegApplicationDescription,
dist->GetAppDescription()));
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
chrome_application, ShellUtil::kRegApplicationCompany,
dist->GetPublisherName()));
}
-
- return true;
}
// This method returns a list of the registry entries needed to declare a
// capability of handling a protocol on Windows.
- static bool GetProtocolCapabilityEntries(BrowserDistribution* dist,
- const string16& suffix,
- const string16& protocol,
- std::list<RegistryEntry*>* entries) {
- entries->push_front(new RegistryEntry(
+ static void GetProtocolCapabilityEntries(
+ BrowserDistribution* dist,
+ const string16& suffix,
+ const string16& protocol,
+ ScopedVector<RegistryEntry>* entries) {
+ entries->push_back(new RegistryEntry(
GetCapabilitiesKey(dist, suffix).append(L"\\URLAssociations"),
protocol, GetBrowserProgId(suffix)));
- return true;
}
- // This method returns a list of all the registry entries required to fully
- // integrate Chrome with Windows (i.e. StartMenuInternet, Default Programs,
- // AppPaths, etc.). This entries need to be registered in HKLM prior to Win8.
- static bool GetShellIntegrationEntries(BrowserDistribution* dist,
+ // This method returns a list of the registry entries required to register
+ // this installation in "RegisteredApplications" on Windows (to appear in
+ // Default Programs, StartMenuInternet, etc.).
+ // These entries need to be registered in HKLM prior to Win8.
+ // If |suffix| is not empty, these entries are guaranteed to be unique on this
+ // machine.
+ static void GetShellIntegrationEntries(BrowserDistribution* dist,
const string16& chrome_exe,
const string16& suffix,
- std::list<RegistryEntry*>* entries) {
- string16 icon_path = ShellUtil::GetChromeIcon(dist, chrome_exe);
- string16 quoted_exe_path = L"\"" + chrome_exe + L"\"";
+ ScopedVector<RegistryEntry>* entries) {
+ const string16 icon_path(ShellUtil::GetChromeIcon(dist, chrome_exe));
+ const string16 quoted_exe_path(L"\"" + chrome_exe + L"\"");
// Register for the Start Menu "Internet" link (pre-Win7).
const string16 start_menu_entry(GetBrowserClientKey(dist, suffix));
// Register Chrome's display name.
// TODO(grt): http://crbug.com/75152 Also set LocalizedString; see
// http://msdn.microsoft.com/en-us/library/windows/desktop/cc144109(v=VS.85).aspx#registering_the_display_name
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
start_menu_entry, dist->GetAppShortCutName()));
// Register the "open" verb for launching Chrome via the "Internet" link.
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
start_menu_entry + ShellUtil::kRegShellOpen, quoted_exe_path));
// Register Chrome's icon for the Start Menu "Internet" link.
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
start_menu_entry + ShellUtil::kRegDefaultIcon, icon_path));
// Register installation information.
string16 install_info(start_menu_entry + L"\\InstallInfo");
// Note: not using CommandLine since it has ambiguous rules for quoting
// strings.
- entries->push_front(new RegistryEntry(install_info, kReinstallCommand,
+ entries->push_back(new RegistryEntry(install_info, kReinstallCommand,
quoted_exe_path + L" --" + ASCIIToWide(switches::kMakeDefaultBrowser)));
- entries->push_front(new RegistryEntry(install_info, L"HideIconsCommand",
+ entries->push_back(new RegistryEntry(install_info, L"HideIconsCommand",
quoted_exe_path + L" --" + ASCIIToWide(switches::kHideIcons)));
- entries->push_front(new RegistryEntry(install_info, L"ShowIconsCommand",
+ entries->push_back(new RegistryEntry(install_info, L"ShowIconsCommand",
quoted_exe_path + L" --" + ASCIIToWide(switches::kShowIcons)));
- entries->push_front(new RegistryEntry(install_info, L"IconsVisible", 1));
+ entries->push_back(new RegistryEntry(install_info, L"IconsVisible", 1));
// Register with Default Programs.
- string16 reg_app_name(dist->GetBaseAppName().append(suffix));
+ const string16 reg_app_name(dist->GetBaseAppName().append(suffix));
// Tell Windows where to find Chrome's Default Programs info.
- string16 capabilities(GetCapabilitiesKey(dist, suffix));
- entries->push_front(new RegistryEntry(ShellUtil::kRegRegisteredApplications,
+ const string16 capabilities(GetCapabilitiesKey(dist, suffix));
+ entries->push_back(new RegistryEntry(ShellUtil::kRegRegisteredApplications,
reg_app_name, capabilities));
// Write out Chrome's Default Programs info.
// TODO(grt): http://crbug.com/75152 Write a reference to a localized
// resource rather than this.
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
capabilities, ShellUtil::kRegApplicationDescription,
dist->GetLongAppDescription()));
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
capabilities, ShellUtil::kRegApplicationIcon, icon_path));
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
capabilities, ShellUtil::kRegApplicationName,
dist->GetAppShortCutName()));
- entries->push_front(new RegistryEntry(capabilities + L"\\Startmenu",
+ entries->push_back(new RegistryEntry(capabilities + L"\\Startmenu",
L"StartMenuInternet", reg_app_name));
- string16 html_prog_id(GetBrowserProgId(suffix));
+ const string16 html_prog_id(GetBrowserProgId(suffix));
for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) {
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
capabilities + L"\\FileAssociations",
ShellUtil::kFileAssociations[i], html_prog_id));
}
for (int i = 0; ShellUtil::kPotentialProtocolAssociations[i] != NULL;
i++) {
- entries->push_front(new RegistryEntry(
+ entries->push_back(new RegistryEntry(
capabilities + L"\\URLAssociations",
ShellUtil::kPotentialProtocolAssociations[i], html_prog_id));
}
+ }
- // Application Registration.
- FilePath chrome_path(chrome_exe);
+ // This method returns a list of the registry entries required for this
+ // installation to be registered in the Windows shell.
+ // In particular:
+ // - App Paths
+ // http://msdn.microsoft.com/en-us/library/windows/desktop/ee872121
+ // - File Associations
+ // http://msdn.microsoft.com/en-us/library/bb166549
+ // These entries should be registered in HKCU for user-level installs and in
+ // HKLM for system-level installs.
+ static void GetAppRegistrationEntries(const string16& chrome_exe,
+ const string16& suffix,
+ ScopedVector<RegistryEntry>* entries) {
+ const FilePath chrome_path(chrome_exe);
string16 app_path_key(ShellUtil::kAppPathsRegistryKey);
app_path_key.push_back(FilePath::kSeparators[0]);
app_path_key.append(chrome_path.BaseName().value());
- entries->push_front(new RegistryEntry(app_path_key, chrome_exe));
- entries->push_front(new RegistryEntry(app_path_key,
+ entries->push_back(new RegistryEntry(app_path_key, chrome_exe));
+ entries->push_back(new RegistryEntry(app_path_key,
ShellUtil::kAppPathsRegistryPathName, chrome_path.DirName().value()));
- // TODO: add chrome to open with list (Bug 16726).
- return true;
+ const string16 html_prog_id(GetBrowserProgId(suffix));
+ for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) {
+ string16 key(ShellUtil::kRegClasses);
+ key.push_back(FilePath::kSeparators[0]);
+ key.append(ShellUtil::kFileAssociations[i]);
+ key.push_back(FilePath::kSeparators[0]);
+ key.append(ShellUtil::kRegOpenWithProgids);
+ entries->push_back(new RegistryEntry(key, html_prog_id, string16()));
+ }
}
// This method returns a list of all the user level registry entries that
// are needed to make Chromium the default handler for a protocol.
- static bool GetUserProtocolEntries(const string16& protocol,
+ static void GetUserProtocolEntries(const string16& protocol,
const string16& chrome_icon,
const string16& chrome_open,
- std::list<RegistryEntry*>* entries) {
+ ScopedVector<RegistryEntry>* entries) {
// Protocols associations.
string16 url_key(ShellUtil::kRegClasses);
url_key.push_back(FilePath::kSeparators[0]);
@@ -415,41 +435,43 @@ class RegistryEntry {
// This registry value tells Windows that this 'class' is a URL scheme
// so IE, explorer and other apps will route it to our handler.
// <root hkey>\Software\Classes\<protocol>\URL Protocol
- entries->push_front(new RegistryEntry(url_key,
+ entries->push_back(new RegistryEntry(url_key,
ShellUtil::kRegUrlProtocol, L""));
// <root hkey>\Software\Classes\<protocol>\DefaultIcon
string16 icon_key = url_key + ShellUtil::kRegDefaultIcon;
- entries->push_front(new RegistryEntry(icon_key, chrome_icon));
+ entries->push_back(new RegistryEntry(icon_key, chrome_icon));
// <root hkey>\Software\Classes\<protocol>\shell\open\command
string16 shell_key = url_key + ShellUtil::kRegShellOpen;
- entries->push_front(new RegistryEntry(shell_key, chrome_open));
+ entries->push_back(new RegistryEntry(shell_key, chrome_open));
// <root hkey>\Software\Classes\<protocol>\shell\open\ddeexec
string16 dde_key = url_key + L"\\shell\\open\\ddeexec";
- entries->push_front(new RegistryEntry(dde_key, L""));
+ entries->push_back(new RegistryEntry(dde_key, L""));
// <root hkey>\Software\Classes\<protocol>\shell\@
string16 protocol_shell_key = url_key + ShellUtil::kRegShellPath;
- entries->push_front(new RegistryEntry(protocol_shell_key, L"open"));
-
- return true;
+ entries->push_back(new RegistryEntry(protocol_shell_key, L"open"));
}
// This method returns a list of all the user level registry entries that
// are needed to make Chromium default browser.
- static bool GetUserEntries(BrowserDistribution* dist,
- const string16& chrome_exe,
- const string16& suffix,
- std::list<RegistryEntry*>* entries) {
+ // Some of these entries are irrelevant in recent versions of Windows, but
+ // we register them anyways as some legacy apps are hardcoded to lookup those
+ // values.
+ static void GetDefaultBrowserUserEntries(
+ BrowserDistribution* dist,
+ const string16& chrome_exe,
+ const string16& suffix,
+ ScopedVector<RegistryEntry>* entries) {
// File extension associations.
string16 html_prog_id(GetBrowserProgId(suffix));
for (int i = 0; ShellUtil::kFileAssociations[i] != NULL; i++) {
string16 ext_key(ShellUtil::kRegClasses);
ext_key.push_back(FilePath::kSeparators[0]);
ext_key.append(ShellUtil::kFileAssociations[i]);
- entries->push_front(new RegistryEntry(ext_key, html_prog_id));
+ entries->push_back(new RegistryEntry(ext_key, html_prog_id));
}
// Protocols associations.
@@ -463,8 +485,7 @@ class RegistryEntry {
// start->Internet shortcut.
string16 start_menu(ShellUtil::kRegStartMenuInternet);
string16 app_name = dist->GetBaseAppName() + suffix;
- entries->push_front(new RegistryEntry(start_menu, app_name));
- return true;
+ entries->push_back(new RegistryEntry(start_menu, app_name));
}
// Generate work_item tasks required to create current registry entry and
@@ -566,10 +587,10 @@ class RegistryEntry {
// This method converts all the RegistryEntries from the given list to
// Set/CreateRegWorkItems and runs them using WorkItemList.
-bool AddRegistryEntries(HKEY root, const std::list<RegistryEntry*>& entries) {
+bool AddRegistryEntries(HKEY root, const ScopedVector<RegistryEntry>& entries) {
scoped_ptr<WorkItemList> items(WorkItem::CreateWorkItemList());
- for (std::list<RegistryEntry*>::const_iterator itr = entries.begin();
+ for (ScopedVector<RegistryEntry>::const_iterator itr = entries.begin();
itr != entries.end(); ++itr)
(*itr)->AddToWorkItemList(root, items.get());
@@ -584,10 +605,10 @@ bool AddRegistryEntries(HKEY root, const std::list<RegistryEntry*>& entries) {
// Checks that all |entries| are present on this computer.
// |look_for_in| is passed to RegistryEntry::ExistsInRegistry(). Documentation
// for it can be found there.
-bool AreEntriesRegistered(const std::list<RegistryEntry*>& entries,
+bool AreEntriesRegistered(const ScopedVector<RegistryEntry>& entries,
uint32 look_for_in) {
bool registered = true;
- for (std::list<RegistryEntry*>::const_iterator itr = entries.begin();
+ for (ScopedVector<RegistryEntry>::const_iterator itr = entries.begin();
registered && itr != entries.end(); ++itr) {
// We do not need registered = registered && ... since the loop condition
// is set to exit early.
@@ -601,11 +622,10 @@ bool AreEntriesRegistered(const std::list<RegistryEntry*>& entries,
bool IsChromeRegistered(BrowserDistribution* dist,
const string16& chrome_exe,
const string16& suffix) {
- std::list<RegistryEntry*> entries;
- STLElementDeleter<std::list<RegistryEntry*> > entries_deleter(&entries);
+ ScopedVector<RegistryEntry> entries;
RegistryEntry::GetProgIdEntries(dist, chrome_exe, suffix, &entries);
- RegistryEntry::GetShellIntegrationEntries(
- dist, chrome_exe, suffix, &entries);
+ RegistryEntry::GetShellIntegrationEntries(dist, chrome_exe, suffix, &entries);
+ RegistryEntry::GetAppRegistrationEntries(chrome_exe, suffix, &entries);
return AreEntriesRegistered(entries, RegistryEntry::LOOK_IN_HKCU_THEN_HKLM);
}
@@ -614,8 +634,7 @@ bool IsChromeRegistered(BrowserDistribution* dist,
bool IsChromeRegisteredForProtocol(BrowserDistribution* dist,
const string16& suffix,
const string16& protocol) {
- std::list<RegistryEntry*> entries;
- STLElementDeleter<std::list<RegistryEntry*> > entries_deleter(&entries);
+ ScopedVector<RegistryEntry> entries;
RegistryEntry::GetProtocolCapabilityEntries(dist, suffix, protocol, &entries);
return AreEntriesRegistered(entries, RegistryEntry::LOOK_IN_HKCU_THEN_HKLM);
}
@@ -868,6 +887,35 @@ HKEY DetermineShellIntegrationRoot(bool is_per_user) {
HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE;
}
+// Associates Chrome with supported protocols and file associations. This should
+// not be required on Vista+ but since some applications still read
+// Software\Classes\http key directly, we have to do this on Vista+ as well.
+bool RegisterChromeAsDefaultForXP(BrowserDistribution* dist,
+ int shell_change,
+ const string16& chrome_exe) {
+ bool ret = true;
+ ScopedVector<RegistryEntry> entries;
+ RegistryEntry::GetDefaultBrowserUserEntries(
+ dist, chrome_exe,
+ ShellUtil::GetCurrentInstallationSuffix(dist, chrome_exe), &entries);
+
+ // Change the default browser for current user.
+ if ((shell_change & ShellUtil::CURRENT_USER) &&
+ !AddRegistryEntries(HKEY_CURRENT_USER, entries)) {
+ ret = false;
+ LOG(ERROR) << "Could not make Chrome default browser (XP/current user).";
+ }
+
+ // Chrome as default browser at system level.
+ if ((shell_change & ShellUtil::SYSTEM_LEVEL) &&
+ !AddRegistryEntries(HKEY_LOCAL_MACHINE, entries)) {
+ ret = false;
+ LOG(ERROR) << "Could not make Chrome default browser (XP/system level).";
+ }
+
+ return ret;
+}
+
} // namespace
const wchar_t* ShellUtil::kRegDefaultIcon = L"\\DefaultIcon";
@@ -914,6 +962,7 @@ const wchar_t* ShellUtil::kRegVerbOpenNewWindow = L"opennewwindow";
const wchar_t* ShellUtil::kRegVerbRun = L"run";
const wchar_t* ShellUtil::kRegCommand = L"command";
const wchar_t* ShellUtil::kRegDelegateExecute = L"DelegateExecute";
+const wchar_t* ShellUtil::kRegOpenWithProgids = L"OpenWithProgids";
bool ShellUtil::QuickIsChromeRegisteredInHKLM(BrowserDistribution* dist,
const string16& chrome_exe,
@@ -1288,29 +1337,8 @@ bool ShellUtil::MakeChromeDefault(BrowserDistribution* dist,
}
}
- // Now use the old way to associate Chrome with supported protocols and file
- // associations. This should not be required on Vista but since some
- // applications still read Software\Classes\http key directly, we have to do
- // this on Vista also.
-
- std::list<RegistryEntry*> entries;
- STLElementDeleter<std::list<RegistryEntry*> > entries_deleter(&entries);
- RegistryEntry::GetUserEntries(
- dist, chrome_exe, GetCurrentInstallationSuffix(dist, chrome_exe),
- &entries);
- // Change the default browser for current user.
- if ((shell_change & ShellUtil::CURRENT_USER) &&
- !AddRegistryEntries(HKEY_CURRENT_USER, entries)) {
+ if (!RegisterChromeAsDefaultForXP(dist, shell_change, chrome_exe))
ret = false;
- LOG(ERROR) << "Could not make Chrome default browser (XP/current user).";
- }
-
- // Chrome as default browser at system level.
- if ((shell_change & ShellUtil::SYSTEM_LEVEL) &&
- !AddRegistryEntries(HKEY_LOCAL_MACHINE, entries)) {
- ret = false;
- LOG(ERROR) << "Could not make Chrome default browser (XP/system level).";
- }
// Send Windows notification event so that it can update icons for
// file associations.
@@ -1334,7 +1362,16 @@ bool ShellUtil::ShowMakeChromeDefaultSystemUI(BrowserDistribution* dist,
// control panel, which is a mess, or pop the concise "How you want to open
// webpages?" dialog. We choose the latter.
// Return true only when the user took an action and there was no error.
- return LaunchSelectDefaultProtocolHandlerDialog(L"http");
+ const bool ret = LaunchSelectDefaultProtocolHandlerDialog(L"http");
+
+ if (ret) {
+ const int shell_change =
+ InstallUtil::IsPerUserInstall(chrome_exe.c_str()) ? CURRENT_USER :
+ SYSTEM_LEVEL;
+ RegisterChromeAsDefaultForXP(dist, shell_change, chrome_exe);
+ }
+
+ return ret;
}
bool ShellUtil::MakeChromeDefaultProtocolClient(BrowserDistribution* dist,
@@ -1370,8 +1407,7 @@ bool ShellUtil::MakeChromeDefaultProtocolClient(BrowserDistribution* dist,
// should not be required on Vista but since some applications still read
// Software\Classes\http key directly, we have to do this on Vista also.
- std::list<RegistryEntry*> entries;
- STLElementDeleter<std::list<RegistryEntry*> > entries_deleter(&entries);
+ ScopedVector<RegistryEntry> entries;
const string16 suffix(GetCurrentInstallationSuffix(dist, chrome_exe));
const string16 chrome_open(ShellUtil::GetChromeShellOpenCmd(chrome_exe));
const string16 chrome_icon(ShellUtil::GetChromeIcon(dist, chrome_exe));
@@ -1413,16 +1449,17 @@ bool ShellUtil::RegisterChromeBrowser(BrowserDistribution* dist,
// Do the full registration if we can do it at user-level or if the user is an
// admin.
if (root == HKEY_CURRENT_USER || IsUserAnAdmin()) {
- std::list<RegistryEntry*> progids;
- STLElementDeleter<std::list<RegistryEntry*> > progids_deleter(&progids);
- std::list<RegistryEntry*> shell_entries;
- STLElementDeleter<std::list<RegistryEntry*> > shell_deleter(&shell_entries);
- RegistryEntry::GetProgIdEntries(dist, chrome_exe, suffix, &progids);
+ ScopedVector<RegistryEntry> progid_and_appreg_entries;
+ ScopedVector<RegistryEntry> shell_entries;
+ RegistryEntry::GetProgIdEntries(dist, chrome_exe, suffix,
+ &progid_and_appreg_entries);
+ RegistryEntry::GetAppRegistrationEntries(chrome_exe, suffix,
+ &progid_and_appreg_entries);
RegistryEntry::GetShellIntegrationEntries(
dist, chrome_exe, suffix, &shell_entries);
return AddRegistryEntries(user_level ? HKEY_CURRENT_USER :
HKEY_LOCAL_MACHINE,
- progids) &&
+ progid_and_appreg_entries) &&
AddRegistryEntries(root, shell_entries);
}
@@ -1435,20 +1472,29 @@ bool ShellUtil::RegisterChromeBrowser(BrowserDistribution* dist,
ElevateAndRegisterChrome(dist, chrome_exe, suffix, L""))
return true;
- // If we got to this point then all we can do is create ProgIds under HKCU.
- std::list<RegistryEntry*> entries;
- STLElementDeleter<std::list<RegistryEntry*> > entries_deleter(&entries);
- RegistryEntry::GetProgIdEntries(dist, chrome_exe, L"", &entries);
+ // If we got to this point then all we can do is create ProgId and basic app
+ // registrations under HKCU.
+ ScopedVector<RegistryEntry> entries;
+ RegistryEntry::GetProgIdEntries(dist, chrome_exe, 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 (!AreEntriesRegistered(entries, RegistryEntry::LOOK_IN_HKCU)) {
if (!suffix.empty()) {
- STLDeleteElements(&entries);
+ entries.clear();
RegistryEntry::GetProgIdEntries(dist, chrome_exe, suffix, &entries);
+ RegistryEntry::GetAppRegistrationEntries(chrome_exe, suffix, &entries);
}
return 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).
+ entries.clear();
+ RegistryEntry::GetAppRegistrationEntries(chrome_exe, string16(), &entries);
+ return AddRegistryEntries(HKEY_CURRENT_USER, entries);
}
return true;
}
@@ -1482,10 +1528,9 @@ bool ShellUtil::RegisterChromeForProtocol(BrowserDistribution* dist,
return false;
// Write in the capabillity for the protocol.
- std::list<RegistryEntry*> entries;
- STLElementDeleter<std::list<RegistryEntry*> > entries_deleter(&entries);
+ ScopedVector<RegistryEntry> entries;
RegistryEntry::GetProtocolCapabilityEntries(dist, suffix, protocol,
- &entries);
+ &entries);
return AddRegistryEntries(root, entries);
} else if (elevate_if_not_admin &&
base::win::GetVersion() >= base::win::VERSION_VISTA) {
« no previous file with comments | « chrome/installer/util/shell_util.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698