| Index: chrome/installer/util/shell_util.cc
|
| diff --git a/chrome/installer/util/shell_util.cc b/chrome/installer/util/shell_util.cc
|
| index f0fa26894a597f690ff554d9fa398fd9b8cf2618..335b3d35e45286c9a086bb72de3e0128731205c5 100644
|
| --- a/chrome/installer/util/shell_util.cc
|
| +++ b/chrome/installer/util/shell_util.cc
|
| @@ -13,9 +13,12 @@
|
| #include <shlobj.h>
|
| #include <shobjidl.h>
|
|
|
| +#include <algorithm>
|
| +#include <iterator>
|
| #include <limits>
|
| #include <memory>
|
| #include <string>
|
| +#include <utility>
|
|
|
| #include "base/bind.h"
|
| #include "base/command_line.h"
|
| @@ -26,7 +29,7 @@
|
| #include "base/logging.h"
|
| #include "base/macros.h"
|
| #include "base/md5.h"
|
| -#include "base/memory/scoped_vector.h"
|
| +#include "base/memory/ptr_util.h"
|
| #include "base/metrics/histogram_macros.h"
|
| #include "base/path_service.h"
|
| #include "base/strings/string16.h"
|
| @@ -224,10 +227,10 @@ base::string16 GetCapabilitiesKey(const base::string16& suffix) {
|
|
|
| // DelegateExecute ProgId. Needed for Chrome Metro in Windows 8. This is only
|
| // needed for registring a web browser, not for general associations.
|
| -ScopedVector<RegistryEntry> GetChromeDelegateExecuteEntries(
|
| +std::vector<std::unique_ptr<RegistryEntry>> GetChromeDelegateExecuteEntries(
|
| const base::FilePath& chrome_exe,
|
| const ApplicationInfo& app_info) {
|
| - ScopedVector<RegistryEntry> entries;
|
| + std::vector<std::unique_ptr<RegistryEntry>> entries;
|
|
|
| base::string16 app_id_shell_key(ShellUtil::kRegClasses);
|
| app_id_shell_key.push_back(base::FilePath::kSeparators[0]);
|
| @@ -236,8 +239,8 @@ ScopedVector<RegistryEntry> GetChromeDelegateExecuteEntries(
|
| app_id_shell_key.append(ShellUtil::kRegShellPath);
|
|
|
| // <root hkey>\Software\Classes\<app_id>\.exe\shell @=open
|
| - entries.push_back(
|
| - new RegistryEntry(app_id_shell_key, ShellUtil::kRegVerbOpen));
|
| + entries.push_back(base::MakeUnique<RegistryEntry>(app_id_shell_key,
|
| + ShellUtil::kRegVerbOpen));
|
|
|
| // The command to execute when opening this application via the Metro UI.
|
| const base::string16 delegate_command(
|
| @@ -267,17 +270,19 @@ ScopedVector<RegistryEntry> GetChromeDelegateExecuteEntries(
|
| // resource.
|
| const base::string16 verb_name(
|
| installer::GetLocalizedString(verb_and_id.name_id));
|
| - entries.push_back(new RegistryEntry(sub_path, verb_name.c_str()));
|
| + entries.push_back(
|
| + base::MakeUnique<RegistryEntry>(sub_path, verb_name.c_str()));
|
| }
|
| - entries.push_back(
|
| - new RegistryEntry(sub_path, L"CommandId", L"Browser.Launch"));
|
| + entries.push_back(base::MakeUnique<RegistryEntry>(sub_path, L"CommandId",
|
| + L"Browser.Launch"));
|
|
|
| sub_path.push_back(base::FilePath::kSeparators[0]);
|
| sub_path.append(ShellUtil::kRegCommand);
|
|
|
| // <root hkey>\Software\Classes\<app_id>\.exe\shell\<verb>\command
|
| - entries.push_back(new RegistryEntry(sub_path, delegate_command));
|
| - entries.push_back(new RegistryEntry(
|
| + entries.push_back(
|
| + base::MakeUnique<RegistryEntry>(sub_path, delegate_command));
|
| + entries.push_back(base::MakeUnique<RegistryEntry>(
|
| sub_path, ShellUtil::kRegDelegateExecute, app_info.delegate_clsid));
|
| }
|
|
|
| @@ -287,7 +292,7 @@ ScopedVector<RegistryEntry> GetChromeDelegateExecuteEntries(
|
| // Gets the registry entries to register an application in the Windows registry.
|
| // |app_info| provides all of the information needed.
|
| void GetProgIdEntries(const ApplicationInfo& app_info,
|
| - ScopedVector<RegistryEntry>* entries) {
|
| + std::vector<std::unique_ptr<RegistryEntry>>* entries) {
|
| // Basic sanity checks.
|
| DCHECK(!app_info.prog_id.empty());
|
| DCHECK_NE(L'.', app_info.prog_id[0]);
|
| @@ -296,15 +301,16 @@ void GetProgIdEntries(const ApplicationInfo& app_info,
|
| base::string16 prog_id_path(ShellUtil::kRegClasses);
|
| prog_id_path.push_back(base::FilePath::kSeparators[0]);
|
| prog_id_path.append(app_info.prog_id);
|
| - entries->push_back(new RegistryEntry(prog_id_path, app_info.file_type_name));
|
| - entries->push_back(new RegistryEntry(
|
| + entries->push_back(
|
| + base::MakeUnique<RegistryEntry>(prog_id_path, app_info.file_type_name));
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| prog_id_path + ShellUtil::kRegDefaultIcon,
|
| ShellUtil::FormatIconLocation(app_info.file_type_icon_path,
|
| app_info.file_type_icon_index)));
|
| - entries->push_back(new RegistryEntry(prog_id_path + ShellUtil::kRegShellOpen,
|
| - app_info.command_line));
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| + prog_id_path + ShellUtil::kRegShellOpen, app_info.command_line));
|
| if (!app_info.delegate_clsid.empty()) {
|
| - entries->push_back(new RegistryEntry(
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| prog_id_path + ShellUtil::kRegShellOpen, ShellUtil::kRegDelegateExecute,
|
| app_info.delegate_clsid));
|
| // TODO(scottmg): Simplify after Metro removal. https://crbug.com/558054.
|
| @@ -315,36 +321,36 @@ void GetProgIdEntries(const ApplicationInfo& app_info,
|
| // depend on the DelegateExecute verb handler being set.
|
| if (base::win::GetVersion() >= base::win::VERSION_WIN8) {
|
| if (!app_info.app_id.empty()) {
|
| - entries->push_back(new RegistryEntry(
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| prog_id_path, ShellUtil::kRegAppUserModelId, app_info.app_id));
|
| }
|
|
|
| // Add \Software\Classes\<prog_id>\Application entries
|
| base::string16 application_path(prog_id_path + ShellUtil::kRegApplication);
|
| if (!app_info.app_id.empty()) {
|
| - entries->push_back(new RegistryEntry(
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| application_path, ShellUtil::kRegAppUserModelId, app_info.app_id));
|
| }
|
| if (!app_info.application_icon_path.empty()) {
|
| - entries->push_back(new RegistryEntry(
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| application_path, ShellUtil::kRegApplicationIcon,
|
| ShellUtil::FormatIconLocation(app_info.application_icon_path,
|
| app_info.application_icon_index)));
|
| }
|
| if (!app_info.application_name.empty()) {
|
| - entries->push_back(new RegistryEntry(application_path,
|
| - ShellUtil::kRegApplicationName,
|
| - app_info.application_name));
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| + application_path, ShellUtil::kRegApplicationName,
|
| + app_info.application_name));
|
| }
|
| if (!app_info.application_description.empty()) {
|
| - entries->push_back(new RegistryEntry(
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| application_path, ShellUtil::kRegApplicationDescription,
|
| app_info.application_description));
|
| }
|
| if (!app_info.publisher_name.empty()) {
|
| - entries->push_back(new RegistryEntry(application_path,
|
| - ShellUtil::kRegApplicationCompany,
|
| - app_info.publisher_name));
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| + application_path, ShellUtil::kRegApplicationCompany,
|
| + app_info.publisher_name));
|
| }
|
| }
|
| }
|
| @@ -352,10 +358,11 @@ void GetProgIdEntries(const ApplicationInfo& app_info,
|
| // This method returns a list of all the registry entries that are needed to
|
| // register this installation's ProgId and AppId. These entries need to be
|
| // registered in HKLM prior to Win8.
|
| -void GetChromeProgIdEntries(BrowserDistribution* dist,
|
| - const base::FilePath& chrome_exe,
|
| - const base::string16& suffix,
|
| - ScopedVector<RegistryEntry>* entries) {
|
| +void GetChromeProgIdEntries(
|
| + BrowserDistribution* dist,
|
| + const base::FilePath& chrome_exe,
|
| + const base::string16& suffix,
|
| + std::vector<std::unique_ptr<RegistryEntry>>* entries) {
|
| int chrome_icon_index = install_static::GetIconResourceIndex();
|
|
|
| ApplicationInfo app_info;
|
| @@ -382,28 +389,28 @@ void GetChromeProgIdEntries(BrowserDistribution* dist,
|
| GetProgIdEntries(app_info, entries);
|
|
|
| if (!app_info.delegate_clsid.empty()) {
|
| - ScopedVector<RegistryEntry> delegate_execute_entries =
|
| + auto delegate_execute_entries =
|
| GetChromeDelegateExecuteEntries(chrome_exe, app_info);
|
| // Remove the keys (not only their values) so that Windows will continue
|
| // to launch Chrome without a pesky association error.
|
| // TODO(scottmg): Simplify after Metro removal. https://crbug.com/558054.
|
| - for (RegistryEntry* entry : delegate_execute_entries)
|
| + for (const auto& entry : delegate_execute_entries)
|
| entry->set_removal_flag(RegistryEntry::RemovalFlag::KEY);
|
| // Move |delegate_execute_entries| to |entries|.
|
| - entries->insert(entries->end(), delegate_execute_entries.begin(),
|
| - delegate_execute_entries.end());
|
| - delegate_execute_entries.weak_clear();
|
| + std::move(delegate_execute_entries.begin(), delegate_execute_entries.end(),
|
| + std::back_inserter(*entries));
|
| }
|
| }
|
|
|
| // This method returns a list of the registry entries needed to declare a
|
| // capability of handling a protocol on Windows.
|
| -void GetProtocolCapabilityEntries(const base::string16& suffix,
|
| - const base::string16& protocol,
|
| - ScopedVector<RegistryEntry>* entries) {
|
| - entries->push_back(
|
| - new RegistryEntry(GetCapabilitiesKey(suffix).append(L"\\URLAssociations"),
|
| - protocol, GetBrowserProgId(suffix)));
|
| +void GetProtocolCapabilityEntries(
|
| + const base::string16& suffix,
|
| + const base::string16& protocol,
|
| + std::vector<std::unique_ptr<RegistryEntry>>* entries) {
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| + GetCapabilitiesKey(suffix).append(L"\\URLAssociations"), protocol,
|
| + GetBrowserProgId(suffix)));
|
| }
|
|
|
| // This method returns a list of the registry entries required to register this
|
| @@ -411,10 +418,11 @@ void GetProtocolCapabilityEntries(const base::string16& suffix,
|
| // 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.
|
| -void GetShellIntegrationEntries(BrowserDistribution* dist,
|
| - const base::FilePath& chrome_exe,
|
| - const base::string16& suffix,
|
| - ScopedVector<RegistryEntry>* entries) {
|
| +void GetShellIntegrationEntries(
|
| + BrowserDistribution* dist,
|
| + const base::FilePath& chrome_exe,
|
| + const base::string16& suffix,
|
| + std::vector<std::unique_ptr<RegistryEntry>>* entries) {
|
| const base::string16 icon_path(ShellUtil::FormatIconLocation(
|
| chrome_exe, install_static::GetIconResourceIndex()));
|
| const base::string16 quoted_exe_path(L"\"" + chrome_exe.value() + L"\"");
|
| @@ -424,60 +432,61 @@ void GetShellIntegrationEntries(BrowserDistribution* dist,
|
| // 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_back(
|
| - new RegistryEntry(start_menu_entry, dist->GetDisplayName()));
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(start_menu_entry,
|
| + dist->GetDisplayName()));
|
| // Register the "open" verb for launching Chrome via the "Internet" link.
|
| - entries->push_back(new RegistryEntry(
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| start_menu_entry + ShellUtil::kRegShellOpen, quoted_exe_path));
|
| // Register Chrome's icon for the Start Menu "Internet" link.
|
| - entries->push_back(new RegistryEntry(
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| start_menu_entry + ShellUtil::kRegDefaultIcon, icon_path));
|
|
|
| // Register installation information.
|
| base::string16 install_info(start_menu_entry + L"\\InstallInfo");
|
| // Note: not using CommandLine since it has ambiguous rules for quoting
|
| // strings.
|
| - entries->push_back(
|
| - new RegistryEntry(install_info, kReinstallCommand,
|
| - quoted_exe_path + L" --" +
|
| - base::ASCIIToUTF16(switches::kMakeDefaultBrowser)));
|
| - entries->push_back(new RegistryEntry(
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| + install_info, kReinstallCommand,
|
| + quoted_exe_path + L" --" +
|
| + base::ASCIIToUTF16(switches::kMakeDefaultBrowser)));
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| install_info, L"HideIconsCommand",
|
| quoted_exe_path + L" --" + base::ASCIIToUTF16(switches::kHideIcons)));
|
| - entries->push_back(new RegistryEntry(
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| install_info, L"ShowIconsCommand",
|
| quoted_exe_path + L" --" + base::ASCIIToUTF16(switches::kShowIcons)));
|
| - entries->push_back(new RegistryEntry(install_info, L"IconsVisible", 1));
|
| + entries->push_back(
|
| + base::MakeUnique<RegistryEntry>(install_info, L"IconsVisible", 1));
|
|
|
| // Register with Default Programs.
|
| const base::string16 reg_app_name(
|
| install_static::GetBaseAppName().append(suffix));
|
| // Tell Windows where to find Chrome's Default Programs info.
|
| const base::string16 capabilities(GetCapabilitiesKey(suffix));
|
| - entries->push_back(new RegistryEntry(ShellUtil::kRegRegisteredApplications,
|
| - reg_app_name, capabilities));
|
| + entries->push_back(base::MakeUnique<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_back(new RegistryEntry(capabilities,
|
| - ShellUtil::kRegApplicationDescription,
|
| - dist->GetLongAppDescription()));
|
| - entries->push_back(new RegistryEntry(
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| + capabilities, ShellUtil::kRegApplicationDescription,
|
| + dist->GetLongAppDescription()));
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| capabilities, ShellUtil::kRegApplicationIcon, icon_path));
|
| - entries->push_back(new RegistryEntry(
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| capabilities, ShellUtil::kRegApplicationName, dist->GetDisplayName()));
|
|
|
| - entries->push_back(new RegistryEntry(capabilities + L"\\Startmenu",
|
| - L"StartMenuInternet", reg_app_name));
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| + capabilities + L"\\Startmenu", L"StartMenuInternet", reg_app_name));
|
|
|
| const base::string16 html_prog_id(GetBrowserProgId(suffix));
|
| for (int i = 0; ShellUtil::kPotentialFileAssociations[i] != NULL; i++) {
|
| - entries->push_back(new RegistryEntry(
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| capabilities + L"\\FileAssociations",
|
| ShellUtil::kPotentialFileAssociations[i], html_prog_id));
|
| }
|
| for (int i = 0; ShellUtil::kPotentialProtocolAssociations[i] != NULL; i++) {
|
| - entries->push_back(new RegistryEntry(
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| capabilities + L"\\URLAssociations",
|
| ShellUtil::kPotentialProtocolAssociations[i], html_prog_id));
|
| }
|
| @@ -486,9 +495,10 @@ void GetShellIntegrationEntries(BrowserDistribution* dist,
|
| // Gets the registry entries to register an application as a handler for a
|
| // particular file extension. |prog_id| is the ProgId used by Windows for the
|
| // application. |ext| is the file extension, which must begin with a '.'.
|
| -void GetAppExtRegistrationEntries(const base::string16& prog_id,
|
| - const base::string16& ext,
|
| - ScopedVector<RegistryEntry>* entries) {
|
| +void GetAppExtRegistrationEntries(
|
| + const base::string16& prog_id,
|
| + const base::string16& ext,
|
| + std::vector<std::unique_ptr<RegistryEntry>>* entries) {
|
| // In HKEY_CURRENT_USER\Software\Classes\EXT\OpenWithProgids, create an
|
| // empty value with this class's ProgId.
|
| base::string16 key_name(ShellUtil::kRegClasses);
|
| @@ -496,7 +506,8 @@ void GetAppExtRegistrationEntries(const base::string16& prog_id,
|
| key_name.append(ext);
|
| key_name.push_back(base::FilePath::kSeparators[0]);
|
| key_name.append(ShellUtil::kRegOpenWithProgids);
|
| - entries->push_back(new RegistryEntry(key_name, prog_id, base::string16()));
|
| + entries->push_back(
|
| + base::MakeUnique<RegistryEntry>(key_name, prog_id, base::string16()));
|
| }
|
|
|
| // This method returns a list of the registry entries required for this
|
| @@ -507,16 +518,18 @@ void GetAppExtRegistrationEntries(const base::string16& prog_id,
|
| // - File Associations
|
| // http://msdn.microsoft.com/en-us/library/bb166549
|
| // These entries need to be registered in HKLM prior to Win8.
|
| -void GetChromeAppRegistrationEntries(const base::FilePath& chrome_exe,
|
| - const base::string16& suffix,
|
| - ScopedVector<RegistryEntry>* entries) {
|
| +void GetChromeAppRegistrationEntries(
|
| + const base::FilePath& chrome_exe,
|
| + const base::string16& suffix,
|
| + std::vector<std::unique_ptr<RegistryEntry>>* entries) {
|
| base::string16 app_path_key(ShellUtil::kAppPathsRegistryKey);
|
| app_path_key.push_back(base::FilePath::kSeparators[0]);
|
| app_path_key.append(chrome_exe.BaseName().value());
|
| - entries->push_back(new RegistryEntry(app_path_key, chrome_exe.value()));
|
| - entries->push_back(new RegistryEntry(app_path_key,
|
| - ShellUtil::kAppPathsRegistryPathName,
|
| - chrome_exe.DirName().value()));
|
| + entries->push_back(
|
| + base::MakeUnique<RegistryEntry>(app_path_key, chrome_exe.value()));
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| + app_path_key, ShellUtil::kAppPathsRegistryPathName,
|
| + chrome_exe.DirName().value()));
|
|
|
| const base::string16 html_prog_id(GetBrowserProgId(suffix));
|
| for (int i = 0; ShellUtil::kPotentialFileAssociations[i] != NULL; i++) {
|
| @@ -536,29 +549,30 @@ void GetChromeAppRegistrationEntries(const base::FilePath& chrome_exe,
|
| // become the default. Otherwise, the first time the user opens a file, they are
|
| // presented with the dialog to set the default handler. (This is roughly
|
| // equivalent to being called with |overwrite_existing| false.)
|
| -void GetAppDefaultRegistrationEntries(const base::string16& prog_id,
|
| - const base::string16& ext,
|
| - bool overwrite_existing,
|
| - ScopedVector<RegistryEntry>* entries) {
|
| +void GetAppDefaultRegistrationEntries(
|
| + const base::string16& prog_id,
|
| + const base::string16& ext,
|
| + bool overwrite_existing,
|
| + std::vector<std::unique_ptr<RegistryEntry>>* entries) {
|
| // Set the default value of HKEY_CURRENT_USER\Software\Classes\EXT to this
|
| // class's name.
|
| base::string16 key_name(ShellUtil::kRegClasses);
|
| key_name.push_back(base::FilePath::kSeparators[0]);
|
| key_name.append(ext);
|
| - std::unique_ptr<RegistryEntry> default_association(
|
| - new RegistryEntry(key_name, prog_id));
|
| + auto default_association = base::MakeUnique<RegistryEntry>(key_name, prog_id);
|
| if (overwrite_existing ||
|
| !default_association->KeyExistsInRegistry(RegistryEntry::LOOK_IN_HKCU)) {
|
| - entries->push_back(default_association.release());
|
| + entries->push_back(std::move(default_association));
|
| }
|
| }
|
|
|
| // This method returns a list of all the user level registry entries that are
|
| // needed to make Chromium the default handler for a protocol on XP.
|
| -void GetXPStyleUserProtocolEntries(const base::string16& protocol,
|
| - const base::string16& chrome_icon,
|
| - const base::string16& chrome_open,
|
| - ScopedVector<RegistryEntry>* entries) {
|
| +void GetXPStyleUserProtocolEntries(
|
| + const base::string16& protocol,
|
| + const base::string16& chrome_icon,
|
| + const base::string16& chrome_open,
|
| + std::vector<std::unique_ptr<RegistryEntry>>* entries) {
|
| // Protocols associations.
|
| base::string16 url_key(ShellUtil::kRegClasses);
|
| url_key.push_back(base::FilePath::kSeparators[0]);
|
| @@ -567,33 +581,36 @@ void GetXPStyleUserProtocolEntries(const base::string16& protocol,
|
| // 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_back(
|
| - new RegistryEntry(url_key, ShellUtil::kRegUrlProtocol, base::string16()));
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(
|
| + url_key, ShellUtil::kRegUrlProtocol, base::string16()));
|
|
|
| // <root hkey>\Software\Classes\<protocol>\DefaultIcon
|
| base::string16 icon_key = url_key + ShellUtil::kRegDefaultIcon;
|
| - entries->push_back(new RegistryEntry(icon_key, chrome_icon));
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(icon_key, chrome_icon));
|
|
|
| // <root hkey>\Software\Classes\<protocol>\shell\open\command
|
| base::string16 shell_key = url_key + ShellUtil::kRegShellOpen;
|
| - entries->push_back(new RegistryEntry(shell_key, chrome_open));
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(shell_key, chrome_open));
|
|
|
| // <root hkey>\Software\Classes\<protocol>\shell\open\ddeexec
|
| base::string16 dde_key = url_key + L"\\shell\\open\\ddeexec";
|
| - entries->push_back(new RegistryEntry(dde_key, base::string16()));
|
| + entries->push_back(
|
| + base::MakeUnique<RegistryEntry>(dde_key, base::string16()));
|
|
|
| // <root hkey>\Software\Classes\<protocol>\shell\@
|
| base::string16 protocol_shell_key = url_key + ShellUtil::kRegShellPath;
|
| - entries->push_back(new RegistryEntry(protocol_shell_key, L"open"));
|
| + entries->push_back(
|
| + base::MakeUnique<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 on XP. 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.
|
| -void GetXPStyleDefaultBrowserUserEntries(const base::FilePath& chrome_exe,
|
| - const base::string16& suffix,
|
| - ScopedVector<RegistryEntry>* entries) {
|
| +void GetXPStyleDefaultBrowserUserEntries(
|
| + const base::FilePath& chrome_exe,
|
| + const base::string16& suffix,
|
| + std::vector<std::unique_ptr<RegistryEntry>>* entries) {
|
| // File extension associations.
|
| base::string16 html_prog_id(GetBrowserProgId(suffix));
|
| for (int i = 0; ShellUtil::kDefaultFileAssociations[i] != NULL; i++) {
|
| @@ -613,15 +630,16 @@ void GetXPStyleDefaultBrowserUserEntries(const base::FilePath& chrome_exe,
|
| // start->Internet shortcut.
|
| base::string16 start_menu(ShellUtil::kRegStartMenuInternet);
|
| base::string16 app_name = install_static::GetBaseAppName().append(suffix);
|
| - entries->push_back(new RegistryEntry(start_menu, app_name));
|
| + entries->push_back(base::MakeUnique<RegistryEntry>(start_menu, app_name));
|
| }
|
|
|
| // Checks that all |entries| are present on this computer (or absent if their
|
| // |removal_flag_| is set). |look_for_in| is passed to
|
| // RegistryEntry::ExistsInRegistry(). Documentation for it can be found there.
|
| -bool AreEntriesAsDesired(const ScopedVector<RegistryEntry>& entries,
|
| - uint32_t look_for_in) {
|
| - for (const auto* entry : entries) {
|
| +bool AreEntriesAsDesired(
|
| + const std::vector<std::unique_ptr<RegistryEntry>>& entries,
|
| + uint32_t look_for_in) {
|
| + for (const auto& entry : entries) {
|
| if (entry->ExistsInRegistry(look_for_in) != !entry->IsFlaggedForRemoval())
|
| return false;
|
| }
|
| @@ -642,7 +660,7 @@ bool IsChromeRegistered(BrowserDistribution* dist,
|
| const base::FilePath& chrome_exe,
|
| const base::string16& suffix,
|
| uint32_t look_for_in) {
|
| - ScopedVector<RegistryEntry> entries;
|
| + std::vector<std::unique_ptr<RegistryEntry>> entries;
|
| GetChromeProgIdEntries(dist, chrome_exe, suffix, &entries);
|
| GetShellIntegrationEntries(dist, chrome_exe, suffix, &entries);
|
| GetChromeAppRegistrationEntries(chrome_exe, suffix, &entries);
|
| @@ -655,7 +673,7 @@ bool IsChromeRegistered(BrowserDistribution* dist,
|
| bool IsChromeRegisteredForProtocol(const base::string16& suffix,
|
| const base::string16& protocol,
|
| uint32_t look_for_in) {
|
| - ScopedVector<RegistryEntry> entries;
|
| + std::vector<std::unique_ptr<RegistryEntry>> entries;
|
| GetProtocolCapabilityEntries(suffix, protocol, &entries);
|
| return AreEntriesAsDesired(entries, look_for_in);
|
| }
|
| @@ -888,7 +906,7 @@ HKEY DetermineRegistrationRoot(bool is_per_user) {
|
| bool RegisterChromeAsDefaultXPStyle(int shell_change,
|
| const base::FilePath& chrome_exe) {
|
| bool ret = true;
|
| - ScopedVector<RegistryEntry> entries;
|
| + std::vector<std::unique_ptr<RegistryEntry>> entries;
|
| GetXPStyleDefaultBrowserUserEntries(
|
| chrome_exe, ShellUtil::GetCurrentInstallationSuffix(chrome_exe),
|
| &entries);
|
| @@ -917,7 +935,7 @@ bool RegisterChromeAsDefaultXPStyle(int shell_change,
|
| bool RegisterChromeAsDefaultProtocolClientXPStyle(
|
| const base::FilePath& chrome_exe,
|
| const base::string16& protocol) {
|
| - ScopedVector<RegistryEntry> entries;
|
| + std::vector<std::unique_ptr<RegistryEntry>> entries;
|
| const base::string16 chrome_open(
|
| ShellUtil::GetChromeShellOpenCmd(chrome_exe));
|
| const base::string16 chrome_icon(ShellUtil::FormatIconLocation(
|
| @@ -2074,8 +2092,8 @@ bool ShellUtil::RegisterChromeBrowser(BrowserDistribution* dist,
|
| 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.
|
| - ScopedVector<RegistryEntry> progid_and_appreg_entries;
|
| - ScopedVector<RegistryEntry> shell_entries;
|
| + std::vector<std::unique_ptr<RegistryEntry>> progid_and_appreg_entries;
|
| + std::vector<std::unique_ptr<RegistryEntry>> shell_entries;
|
| GetChromeProgIdEntries(dist, chrome_exe, suffix,
|
| &progid_and_appreg_entries);
|
| GetChromeAppRegistrationEntries(chrome_exe, suffix,
|
| @@ -2094,7 +2112,7 @@ bool ShellUtil::RegisterChromeBrowser(BrowserDistribution* dist,
|
| } else {
|
| // If we got to this point then all we can do is create ProgId and basic app
|
| // registrations under HKCU.
|
| - ScopedVector<RegistryEntry> entries;
|
| + 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
|
| @@ -2157,7 +2175,7 @@ bool ShellUtil::RegisterChromeForProtocol(BrowserDistribution* dist,
|
| return false;
|
|
|
| // Write in the capabillity for the protocol.
|
| - ScopedVector<RegistryEntry> entries;
|
| + std::vector<std::unique_ptr<RegistryEntry>> entries;
|
| GetProtocolCapabilityEntries(suffix, protocol, &entries);
|
| return AddRegistryEntries(root, entries);
|
| } else if (elevate_if_not_admin &&
|
| @@ -2269,7 +2287,7 @@ bool ShellUtil::AddFileAssociations(
|
| const base::string16& file_type_name,
|
| const base::FilePath& icon_path,
|
| const std::set<base::string16>& file_extensions) {
|
| - ScopedVector<RegistryEntry> entries;
|
| + std::vector<std::unique_ptr<RegistryEntry>> entries;
|
|
|
| // Create a class for this app.
|
| ApplicationInfo app_info;
|
| @@ -2317,13 +2335,13 @@ bool ShellUtil::DeleteFileAssociations(const base::string16& prog_id) {
|
| }
|
|
|
| // static
|
| -bool ShellUtil::AddRegistryEntries(HKEY root,
|
| - const ScopedVector<RegistryEntry>& entries) {
|
| +bool ShellUtil::AddRegistryEntries(
|
| + HKEY root,
|
| + const std::vector<std::unique_ptr<RegistryEntry>>& entries) {
|
| std::unique_ptr<WorkItemList> items(WorkItem::CreateWorkItemList());
|
|
|
| - for (ScopedVector<RegistryEntry>::const_iterator itr = entries.begin();
|
| - itr != entries.end(); ++itr)
|
| - (*itr)->AddToWorkItemList(root, items.get());
|
| + for (const auto& entry : entries)
|
| + entry->AddToWorkItemList(root, items.get());
|
|
|
| // Apply all the registry changes and if there is a problem, rollback
|
| if (!items->Do()) {
|
|
|