| Index: chrome/common/extensions/extension_permission_set.cc
|
| diff --git a/chrome/common/extensions/extension_permission_set.cc b/chrome/common/extensions/extension_permission_set.cc
|
| index d87e9e36c63db61c27bdc0d4a67bd46f029ac3aa..dbe321e2665934257b5779dd1c5c14ec24f83018 100644
|
| --- a/chrome/common/extensions/extension_permission_set.cc
|
| +++ b/chrome/common/extensions/extension_permission_set.cc
|
| @@ -81,9 +81,8 @@ const char kWindowsPermission[] = "windows";
|
|
|
| void AddPatternsAndRemovePaths(const URLPatternSet& set, URLPatternSet* out) {
|
| CHECK(out);
|
| - const URLPatternList& patterns = set.patterns();
|
| - for (size_t i = 0; i < patterns.size(); ++i) {
|
| - URLPattern p = patterns.at(i);
|
| + for (URLPatternSet::const_iterator i = set.begin(); i != set.end(); ++i) {
|
| + URLPattern p = *i;
|
| p.SetPath("/*");
|
| out->AddPattern(p);
|
| }
|
| @@ -97,35 +96,37 @@ void AddPatternsAndRemovePaths(const URLPatternSet& set, URLPatternSet* out) {
|
|
|
| // static
|
| ExtensionPermissionMessage ExtensionPermissionMessage::CreateFromHostList(
|
| - const std::vector<std::string>& hosts) {
|
| - CHECK(hosts.size() > 0);
|
| + const std::set<std::string>& hosts) {
|
| + std::vector<std::string> host_list(hosts.begin(), hosts.end());
|
| + CHECK(host_list.size() > 0);
|
| ID message_id;
|
| string16 message;
|
| - switch (hosts.size()) {
|
| +
|
| + switch (host_list.size()) {
|
| case 1:
|
| message_id = kHosts1;
|
| message = l10n_util::GetStringFUTF16(IDS_EXTENSION_PROMPT_WARNING_1_HOST,
|
| - UTF8ToUTF16(hosts[0]));
|
| + UTF8ToUTF16(host_list[0]));
|
| break;
|
| case 2:
|
| message_id = kHosts2;
|
| message = l10n_util::GetStringFUTF16(IDS_EXTENSION_PROMPT_WARNING_2_HOSTS,
|
| - UTF8ToUTF16(hosts[0]),
|
| - UTF8ToUTF16(hosts[1]));
|
| + UTF8ToUTF16(host_list[0]),
|
| + UTF8ToUTF16(host_list[1]));
|
| break;
|
| case 3:
|
| message_id = kHosts3;
|
| message = l10n_util::GetStringFUTF16(IDS_EXTENSION_PROMPT_WARNING_3_HOSTS,
|
| - UTF8ToUTF16(hosts[0]),
|
| - UTF8ToUTF16(hosts[1]),
|
| - UTF8ToUTF16(hosts[2]));
|
| + UTF8ToUTF16(host_list[0]),
|
| + UTF8ToUTF16(host_list[1]),
|
| + UTF8ToUTF16(host_list[2]));
|
| break;
|
| default:
|
| message_id = kHosts4OrMore;
|
| message = l10n_util::GetStringFUTF16(
|
| IDS_EXTENSION_PROMPT_WARNING_4_OR_MORE_HOSTS,
|
| - UTF8ToUTF16(hosts[0]),
|
| - UTF8ToUTF16(hosts[1]),
|
| + UTF8ToUTF16(host_list[0]),
|
| + UTF8ToUTF16(host_list[1]),
|
| base::IntToString16(hosts.size() - 2));
|
| break;
|
| }
|
| @@ -454,9 +455,9 @@ std::set<std::string> ExtensionPermissionSet::GetAPIsAsStrings() const {
|
| return apis_str;
|
| }
|
|
|
| -std::vector<std::string>
|
| +std::set<std::string>
|
| ExtensionPermissionSet::GetDistinctHostsForDisplay() const {
|
| - return GetDistinctHosts(effective_hosts_.patterns(), true);
|
| + return GetDistinctHosts(effective_hosts_, true);
|
| }
|
|
|
| ExtensionPermissionMessages
|
| @@ -475,7 +476,7 @@ ExtensionPermissionMessages
|
| ExtensionPermissionMessage::kHostsAll,
|
| l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS)));
|
| } else {
|
| - std::vector<std::string> hosts = GetDistinctHostsForDisplay();
|
| + std::set<std::string> hosts = GetDistinctHostsForDisplay();
|
| if (!hosts.empty())
|
| messages.push_back(ExtensionPermissionMessage::CreateFromHostList(hosts));
|
| }
|
| @@ -561,9 +562,8 @@ bool ExtensionPermissionSet::HasEffectiveAccessToAllHosts() const {
|
| // There are two ways this set can have effective access to all hosts:
|
| // 1) it has an <all_urls> URL pattern.
|
| // 2) it has a named permission with implied full URL access.
|
| - const URLPatternList patterns = effective_hosts().patterns();
|
| - for (URLPatternList::const_iterator host = patterns.begin();
|
| - host != patterns.end(); ++host) {
|
| + for (URLPatternSet::const_iterator host = effective_hosts().begin();
|
| + host != effective_hosts().end(); ++host) {
|
| if (host->match_all_urls() ||
|
| (host->match_subdomains() && host->host().empty()))
|
| return true;
|
| @@ -626,18 +626,19 @@ bool ExtensionPermissionSet::HasLessPrivilegesThan(
|
| }
|
|
|
| // static
|
| -std::vector<std::string> ExtensionPermissionSet::GetDistinctHosts(
|
| - const URLPatternList& host_patterns, bool include_rcd) {
|
| +std::set<std::string> ExtensionPermissionSet::GetDistinctHosts(
|
| + const URLPatternSet& host_patterns, bool include_rcd) {
|
| // Use a vector to preserve order (also faster than a map on small sets).
|
| // Each item is a host split into two parts: host without RCDs and
|
| // current best RCD.
|
| typedef std::vector<std::pair<std::string, std::string> > HostVector;
|
| HostVector hosts_best_rcd;
|
| - for (size_t i = 0; i < host_patterns.size(); ++i) {
|
| - std::string host = host_patterns[i].host();
|
| + for (URLPatternSet::const_iterator i = host_patterns.begin();
|
| + i != host_patterns.end(); ++i) {
|
| + std::string host = i->host();
|
|
|
| // Add the subdomain wildcard back to the host, if necessary.
|
| - if (host_patterns[i].match_subdomains())
|
| + if (i->match_subdomains())
|
| host = "*." + host;
|
|
|
| // If the host has an RCD, split it off so we can detect duplicates.
|
| @@ -666,10 +667,10 @@ std::vector<std::string> ExtensionPermissionSet::GetDistinctHosts(
|
| }
|
|
|
| // Build up the final vector by concatenating hosts and RCDs.
|
| - std::vector<std::string> distinct_hosts;
|
| + std::set<std::string> distinct_hosts;
|
| for (HostVector::iterator it = hosts_best_rcd.begin();
|
| it != hosts_best_rcd.end(); ++it)
|
| - distinct_hosts.push_back(it->first + it->second);
|
| + distinct_hosts.insert(it->first + it->second);
|
| return distinct_hosts;
|
| }
|
|
|
| @@ -678,7 +679,7 @@ void ExtensionPermissionSet::InitEffectiveHosts() {
|
|
|
| if (HasEffectiveAccessToAllHosts()) {
|
| URLPattern all_urls(URLPattern::SCHEME_ALL);
|
| - all_urls.set_match_all_urls(true);
|
| + all_urls.SetMatchAllURLs(true);
|
| effective_hosts_.AddPattern(all_urls);
|
| return;
|
| }
|
| @@ -700,7 +701,7 @@ void ExtensionPermissionSet::InitImplicitExtensionPermissions(
|
| for (UserScriptList::const_iterator content_script =
|
| extension->content_scripts().begin();
|
| content_script != extension->content_scripts().end(); ++content_script) {
|
| - URLPatternList::const_iterator pattern =
|
| + URLPatternSet::const_iterator pattern =
|
| content_script->url_patterns().begin();
|
| for (; pattern != content_script->url_patterns().end(); ++pattern)
|
| scriptable_hosts_.AddPattern(*pattern);
|
| @@ -757,17 +758,14 @@ bool ExtensionPermissionSet::HasLessHostPrivilegesThan(
|
| if (permissions->HasEffectiveAccessToAllHosts())
|
| return true;
|
|
|
| - const URLPatternList old_list = effective_hosts().patterns();
|
| - const URLPatternList new_list = permissions->effective_hosts().patterns();
|
| + const URLPatternSet& old_list = effective_hosts();
|
| + const URLPatternSet& new_list = permissions->effective_hosts();
|
|
|
| // TODO(jstritar): This is overly conservative with respect to subdomains.
|
| // For example, going from *.google.com to www.google.com will be
|
| // considered an elevation, even though it is not (http://crbug.com/65337).
|
| - std::vector<std::string> new_hosts = GetDistinctHosts(new_list, false);
|
| - std::vector<std::string> old_hosts = GetDistinctHosts(old_list, false);
|
| -
|
| - std::set<std::string> old_hosts_set(old_hosts.begin(), old_hosts.end());
|
| - std::set<std::string> new_hosts_set(new_hosts.begin(), new_hosts.end());
|
| + std::set<std::string> new_hosts_set = GetDistinctHosts(new_list, false);
|
| + std::set<std::string> old_hosts_set = GetDistinctHosts(old_list, false);
|
| std::set<std::string> new_hosts_only;
|
|
|
| std::set_difference(new_hosts_set.begin(), new_hosts_set.end(),
|
|
|