| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/prerender/prerender_util.h" | 5 #include "chrome/browser/prerender/prerender_util.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | |
| 8 #include "base/metrics/histogram_macros.h" | 7 #include "base/metrics/histogram_macros.h" |
| 9 #include "base/metrics/sparse_histogram.h" | 8 #include "components/google/core/browser/google_util.h" |
| 10 #include "base/strings/string_util.h" | 9 #include "url/gurl.h" |
| 11 #include "content/public/browser/resource_request_info.h" | |
| 12 #include "content/public/common/resource_type.h" | |
| 13 #include "net/http/http_response_headers.h" | |
| 14 #include "net/url_request/url_request.h" | |
| 15 #include "url/third_party/mozilla/url_parse.h" | |
| 16 #include "url/url_canon.h" | |
| 17 #include "url/url_util.h" | |
| 18 | 10 |
| 19 namespace prerender { | 11 namespace prerender { |
| 20 | 12 |
| 21 namespace { | 13 namespace { |
| 22 | 14 |
| 23 enum PrerenderSchemeCancelReason { | 15 enum PrerenderSchemeCancelReason { |
| 24 PRERENDER_SCHEME_CANCEL_REASON_EXTERNAL_PROTOCOL, | 16 PRERENDER_SCHEME_CANCEL_REASON_EXTERNAL_PROTOCOL, |
| 25 PRERENDER_SCHEME_CANCEL_REASON_DATA, | 17 PRERENDER_SCHEME_CANCEL_REASON_DATA, |
| 26 PRERENDER_SCHEME_CANCEL_REASON_BLOB, | 18 PRERENDER_SCHEME_CANCEL_REASON_BLOB, |
| 27 PRERENDER_SCHEME_CANCEL_REASON_FILE, | 19 PRERENDER_SCHEME_CANCEL_REASON_FILE, |
| 28 PRERENDER_SCHEME_CANCEL_REASON_FILESYSTEM, | 20 PRERENDER_SCHEME_CANCEL_REASON_FILESYSTEM, |
| 29 PRERENDER_SCHEME_CANCEL_REASON_WEBSOCKET, | 21 PRERENDER_SCHEME_CANCEL_REASON_WEBSOCKET, |
| 30 PRERENDER_SCHEME_CANCEL_REASON_FTP, | 22 PRERENDER_SCHEME_CANCEL_REASON_FTP, |
| 31 PRERENDER_SCHEME_CANCEL_REASON_CHROME, | 23 PRERENDER_SCHEME_CANCEL_REASON_CHROME, |
| 32 PRERENDER_SCHEME_CANCEL_REASON_CHROME_EXTENSION, | 24 PRERENDER_SCHEME_CANCEL_REASON_CHROME_EXTENSION, |
| 33 PRERENDER_SCHEME_CANCEL_REASON_ABOUT, | 25 PRERENDER_SCHEME_CANCEL_REASON_ABOUT, |
| 34 PRERENDER_SCHEME_CANCEL_REASON_UNKNOWN, | 26 PRERENDER_SCHEME_CANCEL_REASON_UNKNOWN, |
| 35 PRERENDER_SCHEME_CANCEL_REASON_MAX, | 27 PRERENDER_SCHEME_CANCEL_REASON_MAX, |
| 36 }; | 28 }; |
| 37 | 29 |
| 38 void ReportPrerenderSchemeCancelReason(PrerenderSchemeCancelReason reason) { | 30 void ReportPrerenderSchemeCancelReason(PrerenderSchemeCancelReason reason) { |
| 39 UMA_HISTOGRAM_ENUMERATION( | 31 UMA_HISTOGRAM_ENUMERATION( |
| 40 "Prerender.SchemeCancelReason", reason, | 32 "Prerender.SchemeCancelReason", reason, |
| 41 PRERENDER_SCHEME_CANCEL_REASON_MAX); | 33 PRERENDER_SCHEME_CANCEL_REASON_MAX); |
| 42 } | 34 } |
| 43 | 35 |
| 44 } // namespace | 36 } // namespace |
| 45 | 37 |
| 46 bool MaybeGetQueryStringBasedAliasURL( | 38 bool IsGoogleOriginURL(const GURL& origin_url) { |
| 47 const GURL& url, GURL* alias_url) { | 39 // ALLOW_NON_STANDARD_PORTS for integration tests with the embedded server. |
| 48 DCHECK(alias_url); | 40 if (!google_util::IsGoogleDomainUrl(origin_url, |
| 49 url::Parsed parsed; | 41 google_util::DISALLOW_SUBDOMAIN, |
| 50 url::ParseStandardURL(url.spec().c_str(), url.spec().length(), &parsed); | 42 google_util::ALLOW_NON_STANDARD_PORTS)) { |
| 51 url::Component query = parsed.query; | |
| 52 url::Component key, value; | |
| 53 while (url::ExtractQueryKeyValue(url.spec().c_str(), &query, &key, &value)) { | |
| 54 if (key.len != 3 || strncmp(url.spec().c_str() + key.begin, "url", key.len)) | |
| 55 continue; | |
| 56 // We found a url= query string component. | |
| 57 if (value.len < 1) | |
| 58 continue; | |
| 59 url::RawCanonOutputW<1024> decoded_url; | |
| 60 url::DecodeURLEscapeSequences(url.spec().c_str() + value.begin, value.len, | |
| 61 &decoded_url); | |
| 62 GURL new_url(base::string16(decoded_url.data(), decoded_url.length())); | |
| 63 if (!new_url.is_empty() && new_url.is_valid()) { | |
| 64 *alias_url = new_url; | |
| 65 return true; | |
| 66 } | |
| 67 return false; | 43 return false; |
| 68 } | 44 } |
| 69 return false; | |
| 70 } | |
| 71 | 45 |
| 72 bool IsGoogleDomain(const GURL& url) { | 46 return (origin_url.path_piece() == "/") || |
| 73 return base::StartsWith(url.host_piece(), "www.google.", | 47 google_util::IsGoogleSearchUrl(origin_url); |
| 74 base::CompareCase::SENSITIVE); | |
| 75 } | |
| 76 | |
| 77 bool IsGoogleSearchResultURL(const GURL& url) { | |
| 78 if (!IsGoogleDomain(url)) | |
| 79 return false; | |
| 80 return (url.path_piece().empty() || | |
| 81 base::StartsWith(url.path_piece(), "/search", | |
| 82 base::CompareCase::SENSITIVE) || | |
| 83 (url.path_piece() == "/") || | |
| 84 base::StartsWith(url.path_piece(), "/webhp", | |
| 85 base::CompareCase::SENSITIVE)); | |
| 86 } | 48 } |
| 87 | 49 |
| 88 void ReportPrerenderExternalURL() { | 50 void ReportPrerenderExternalURL() { |
| 89 ReportPrerenderSchemeCancelReason( | 51 ReportPrerenderSchemeCancelReason( |
| 90 PRERENDER_SCHEME_CANCEL_REASON_EXTERNAL_PROTOCOL); | 52 PRERENDER_SCHEME_CANCEL_REASON_EXTERNAL_PROTOCOL); |
| 91 } | 53 } |
| 92 | 54 |
| 93 void ReportUnsupportedPrerenderScheme(const GURL& url) { | 55 void ReportUnsupportedPrerenderScheme(const GURL& url) { |
| 94 if (url.SchemeIs("data")) { | 56 if (url.SchemeIs("data")) { |
| 95 ReportPrerenderSchemeCancelReason(PRERENDER_SCHEME_CANCEL_REASON_DATA); | 57 ReportPrerenderSchemeCancelReason(PRERENDER_SCHEME_CANCEL_REASON_DATA); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 110 ReportPrerenderSchemeCancelReason( | 72 ReportPrerenderSchemeCancelReason( |
| 111 PRERENDER_SCHEME_CANCEL_REASON_CHROME_EXTENSION); | 73 PRERENDER_SCHEME_CANCEL_REASON_CHROME_EXTENSION); |
| 112 } else if (url.SchemeIs("about")) { | 74 } else if (url.SchemeIs("about")) { |
| 113 ReportPrerenderSchemeCancelReason(PRERENDER_SCHEME_CANCEL_REASON_ABOUT); | 75 ReportPrerenderSchemeCancelReason(PRERENDER_SCHEME_CANCEL_REASON_ABOUT); |
| 114 } else { | 76 } else { |
| 115 ReportPrerenderSchemeCancelReason(PRERENDER_SCHEME_CANCEL_REASON_UNKNOWN); | 77 ReportPrerenderSchemeCancelReason(PRERENDER_SCHEME_CANCEL_REASON_UNKNOWN); |
| 116 } | 78 } |
| 117 } | 79 } |
| 118 | 80 |
| 119 } // namespace prerender | 81 } // namespace prerender |
| OLD | NEW |