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