16d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/google/core/browser/google_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/google/core/browser/google_switches.h"
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/google/core/browser/google_url_tracker.h"
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/url_fixer/url_fixer.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/url_util.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Only use Link Doctor on official builds.  It uses an API key, too, but
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// seems best to just disable it, for more responsive error pages and to reduce
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// server load.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define LINKDOCTOR_SERVER_REQUEST_URL "https://www.googleapis.com/rpc"
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#else
29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define LINKDOCTOR_SERVER_REQUEST_URL ""
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Helpers --------------------------------------------------------------------
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool gUseMockLinkDoctorBaseURLForTesting = false;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool IsPathHomePageBase(const std::string& path) {
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return (path == "/") || (path == "/webhp");
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// True if |host| is "[www.]<domain_in_lower_case>.<TLD>" with a valid TLD. If
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// |subdomain_permission| is ALLOW_SUBDOMAIN, we check against host
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// "*.<domain_in_lower_case>.<TLD>" instead.
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool IsValidHostName(const std::string& host,
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     const std::string& domain_in_lower_case,
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     google_util::SubdomainPermission subdomain_permission) {
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  size_t tld_length = net::registry_controlled_domains::GetRegistryLength(
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      host,
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      net::registry_controlled_domains::EXCLUDE_UNKNOWN_REGISTRIES,
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES);
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if ((tld_length == 0) || (tld_length == std::string::npos))
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return false;
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Removes the tld and the preceding dot.
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string host_minus_tld(host, 0, host.length() - tld_length - 1);
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (LowerCaseEqualsASCII(host_minus_tld, domain_in_lower_case.c_str()))
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return true;
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (subdomain_permission == google_util::ALLOW_SUBDOMAIN)
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return EndsWith(host_minus_tld, "." + domain_in_lower_case, false);
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return LowerCaseEqualsASCII(host_minus_tld,
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              ("www." + domain_in_lower_case).c_str());
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// True if |url| is a valid URL with HTTP or HTTPS scheme. If |port_permission|
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// is DISALLOW_NON_STANDARD_PORTS, this also requires |url| to use the standard
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// port for its scheme (80 for HTTP, 443 for HTTPS).
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool IsValidURL(const GURL& url, google_util::PortPermission port_permission) {
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return url.is_valid() && url.SchemeIsHTTPOrHTTPS() &&
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      (url.port().empty() ||
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       (port_permission == google_util::ALLOW_NON_STANDARD_PORTS));
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google_util {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Global functions -----------------------------------------------------------
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HasGoogleSearchQueryParam(const std::string& str) {
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  url::Component query(0, str.length()), key, value;
835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  while (url::ExtractQueryKeyValue(str.c_str(), &query, &key, &value)) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if ((key.len == 1) && (str[key.begin] == 'q') && value.is_nonempty())
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL LinkDoctorBaseURL() {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (gUseMockLinkDoctorBaseURLForTesting)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GURL("http://mock.linkdoctor.url/for?testing");
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GURL(LINKDOCTOR_SERVER_REQUEST_URL);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetMockLinkDoctorBaseURLForTesting() {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gUseMockLinkDoctorBaseURLForTesting = true;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)std::string GetGoogleLocale(const std::string& application_locale) {
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Google does not recognize "nb" for Norwegian Bokmal; it uses "no".
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return (application_locale == "nb") ? "no" : application_locale;
103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)GURL AppendGoogleLocaleParam(const GURL& url,
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             const std::string& application_locale) {
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return net::AppendQueryParameter(
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      url, "hl", GetGoogleLocale(application_locale));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)std::string GetGoogleCountryCode(GURL google_homepage_url) {
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const std::string google_hostname = google_homepage_url.host();
113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const size_t last_dot = google_hostname.find_last_of('.');
114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (last_dot == std::string::npos) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string country_code = google_hostname.substr(last_dot + 1);
118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Assume the com TLD implies the US.
119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (country_code == "com")
120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return "us";
121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Google uses the Unicode Common Locale Data Repository (CLDR), and the CLDR
122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // code for the UK is "gb".
123a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (country_code == "uk")
124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return "gb";
125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Catalonia does not have a CLDR country code, since it's a region in Spain,
126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // so use Spain instead.
127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (country_code == "cat")
128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return "es";
129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return country_code;
130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)GURL GetGoogleSearchURL(GURL google_homepage_url) {
13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // To transform the homepage URL into the corresponding search URL, add the
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // "search" and the "q=" query string.
135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string search_path = "search";
136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string query_string = "q=";
137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  GURL::Replacements replacements;
138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  replacements.SetPathStr(search_path);
139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  replacements.SetQueryStr(query_string);
14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return google_homepage_url.ReplaceComponents(replacements);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
143effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochGURL CommandLineGoogleBaseURL() {
144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Unit tests may add command-line flags after the first call to this
145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // function, so we don't simply initialize a static |base_url| directly and
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // then unconditionally return it.
147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  CR_DEFINE_STATIC_LOCAL(std::string, switch_value, ());
148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  CR_DEFINE_STATIC_LOCAL(GURL, base_url, ());
149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string current_switch_value(
150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          switches::kGoogleBaseURL));
152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (current_switch_value != switch_value) {
153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    switch_value = current_switch_value;
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base_url = url_fixer::FixupURL(switch_value, std::string());
155effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (!base_url.is_valid() || base_url.has_query() || base_url.has_ref())
156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base_url = GURL();
157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return base_url;
159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool StartsWithCommandLineGoogleBaseURL(const GURL& url) {
162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  GURL base_url(CommandLineGoogleBaseURL());
163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return base_url.is_valid() &&
164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      StartsWithASCII(url.possibly_invalid_spec(), base_url.spec(), true);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsGoogleHostname(const std::string& host,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      SubdomainPermission subdomain_permission) {
169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  GURL base_url(CommandLineGoogleBaseURL());
170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (base_url.is_valid() && (host == base_url.host()))
171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return true;
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return IsValidHostName(host, "google", subdomain_permission);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool IsGoogleDomainUrl(const GURL& url,
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       SubdomainPermission subdomain_permission,
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       PortPermission port_permission) {
179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return IsValidURL(url, port_permission) &&
180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      IsGoogleHostname(url.host(), subdomain_permission);
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool IsGoogleHomePageUrl(const GURL& url) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First check to see if this has a Google domain.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsGoogleDomainUrl(url, DISALLOW_SUBDOMAIN, DISALLOW_NON_STANDARD_PORTS))
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the path is a known home page path.
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string path(url.path());
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return IsPathHomePageBase(path) || StartsWithASCII(path, "/ig", false);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool IsGoogleSearchUrl(const GURL& url) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First check to see if this has a Google domain.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsGoogleDomainUrl(url, DISALLOW_SUBDOMAIN, DISALLOW_NON_STANDARD_PORTS))
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the path is a known search path.
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string path(url.path());
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool is_home_page_base = IsPathHomePageBase(path);
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!is_home_page_base && (path != "/search"))
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check for query parameter in URL parameter and hash fragment, depending on
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the path type.
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return HasGoogleSearchQueryParam(url.ref()) ||
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      (!is_home_page_base && HasGoogleSearchQueryParam(url.query()));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool IsYoutubeDomainUrl(const GURL& url,
211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        SubdomainPermission subdomain_permission,
212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        PortPermission port_permission) {
213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return IsValidURL(url, port_permission) &&
214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      IsValidHostName(url.host(), "youtube", subdomain_permission);
215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace google_util
218