Chromium Code Reviews| Index: components/google/core/browser/google_util.cc |
| diff --git a/components/google/core/browser/google_util.cc b/components/google/core/browser/google_util.cc |
| index f3e8fd432b8e35afac9835c7e8727b6ff0ac2f27..138d493814f5a2d6136210d2de4a59b4bcfe0263 100644 |
| --- a/components/google/core/browser/google_util.cc |
| +++ b/components/google/core/browser/google_util.cc |
| @@ -17,6 +17,7 @@ |
| #include "base/strings/string_util.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "components/google/core/browser/google_switches.h" |
| +#include "components/google/core/browser/google_tld_list.h" |
| #include "components/google/core/browser/google_url_tracker.h" |
| #include "components/url_formatter/url_fixer.h" |
| #include "net/base/registry_controlled_domains/registry_controlled_domain.h" |
| @@ -46,13 +47,16 @@ bool IsPathHomePageBase(base::StringPiece path) { |
| // True if the given canonical |host| is "[www.]<domain_in_lower_case>.<TLD>" |
| // with a valid TLD. If |subdomain_permission| is ALLOW_SUBDOMAIN, we check |
| -// against host "*.<domain_in_lower_case>.<TLD>" instead. |
| +// against host "*.<domain_in_lower_case>.<TLD>" instead. Will return the TLD |
| +// string in |tld|, if specified and the |host| can be parsed. |
| bool IsValidHostName(base::StringPiece host, |
| base::StringPiece domain_in_lower_case, |
| - SubdomainPermission subdomain_permission) { |
| + SubdomainPermission subdomain_permission, |
| + base::StringPiece* tld) { |
| // Fast path to avoid searching the registry set. |
| if (host.find(domain_in_lower_case) == base::StringPiece::npos) |
| return false; |
| + |
| size_t tld_length = |
| net::registry_controlled_domains::GetCanonicalHostRegistryLength( |
| host, net::registry_controlled_domains::EXCLUDE_UNKNOWN_REGISTRIES, |
| @@ -63,6 +67,10 @@ bool IsValidHostName(base::StringPiece host, |
| // Removes the tld and the preceding dot. |
| base::StringPiece host_minus_tld = |
| host.substr(0, host.length() - tld_length - 1); |
| + |
| + if (tld) |
| + *tld = host.substr(host.length() - tld_length); |
| + |
| if (base::LowerCaseEqualsASCII(host_minus_tld, domain_in_lower_case)) |
| return true; |
| @@ -92,7 +100,14 @@ bool IsCanonicalHostGoogleHostname(base::StringPiece canonical_host, |
| if (base_url.is_valid() && (canonical_host == base_url.host_piece())) |
| return true; |
| - return IsValidHostName(canonical_host, "google", subdomain_permission); |
| + base::StringPiece tld; |
| + if (!IsValidHostName(canonical_host, "google", subdomain_permission, &tld)) |
| + return false; |
| + |
| + CR_DEFINE_STATIC_LOCAL(std::set<std::string>, google_tlds, |
| + ({GOOGLE_TLD_LIST})); |
| + |
|
Peter Kasting
2016/12/16 01:35:58
Nit: Blank line here now probably unnecessary? I
Maria
2017/01/04 17:58:52
Done.
|
| + return base::ContainsKey(google_tlds, tld.as_string()); |
| } |
| } // namespace |
| @@ -233,7 +248,8 @@ bool IsYoutubeDomainUrl(const GURL& url, |
| SubdomainPermission subdomain_permission, |
| PortPermission port_permission) { |
| return IsValidURL(url, port_permission) && |
| - IsValidHostName(url.host_piece(), "youtube", subdomain_permission); |
| + IsValidHostName(url.host_piece(), "youtube", subdomain_permission, |
| + nullptr); |
| } |
| } // namespace google_util |