Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(809)

Side by Side Diff: chrome/browser/prerender/prerender_resource_throttle.cc

Issue 2302433002: [NoStatePrefetch] Track redirects in UMA (Closed)
Patch Set: review comments Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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_resource_throttle.h" 5 #include "chrome/browser/prerender/prerender_resource_throttle.h"
6 6
7 #include "base/logging.h"
8 #include "base/numerics/safe_conversions.h"
7 #include "build/build_config.h" 9 #include "build/build_config.h"
8 #include "chrome/browser/prerender/prerender_final_status.h" 10 #include "chrome/browser/prerender/prerender_final_status.h"
9 #include "chrome/browser/prerender/prerender_manager.h" 11 #include "chrome/browser/prerender/prerender_manager.h"
10 #include "chrome/browser/prerender/prerender_util.h" 12 #include "chrome/browser/prerender/prerender_util.h"
11 #include "content/public/browser/browser_thread.h" 13 #include "content/public/browser/browser_thread.h"
12 #include "content/public/browser/render_frame_host.h" 14 #include "content/public/browser/render_frame_host.h"
13 #include "content/public/browser/resource_controller.h" 15 #include "content/public/browser/resource_controller.h"
14 #include "content/public/browser/resource_request_info.h" 16 #include "content/public/browser/resource_request_info.h"
15 #include "content/public/browser/web_contents.h" 17 #include "content/public/browser/web_contents.h"
16 #include "net/http/http_response_headers.h" 18 #include "net/http/http_response_headers.h"
17 #include "net/url_request/redirect_info.h" 19 #include "net/url_request/redirect_info.h"
18 #include "net/url_request/url_request.h" 20 #include "net/url_request/url_request.h"
19 21
20 using content::ResourceType; 22 using content::ResourceType;
21 23
22 namespace prerender { 24 namespace prerender {
23 25
24 namespace { 26 namespace {
25 static const char kFollowOnlyWhenPrerenderShown[] = 27 static const char kFollowOnlyWhenPrerenderShown[] =
26 "follow-only-when-prerender-shown"; 28 "follow-only-when-prerender-shown";
27 29
28 PrerenderContents* g_prerender_contents_for_testing; 30 PrerenderContents* g_prerender_contents_for_testing;
31
32 // Returns true if the response has a "no-store" cache control header.
33 bool IsNoStoreResponse(const net::URLRequest& request) {
34 const net::HttpResponseInfo& response_info = request.response_info();
35 return response_info.headers.get() &&
36 response_info.headers->HasHeaderValue("cache-control", "no-store");
37 }
38
29 } // namespace 39 } // namespace
30 40
31 void PrerenderResourceThrottle::OverridePrerenderContentsForTesting( 41 void PrerenderResourceThrottle::OverridePrerenderContentsForTesting(
32 PrerenderContents* contents) { 42 PrerenderContents* contents) {
33 g_prerender_contents_for_testing = contents; 43 g_prerender_contents_for_testing = contents;
34 } 44 }
35 45
36 PrerenderResourceThrottle::PrerenderResourceThrottle(net::URLRequest* request) 46 PrerenderResourceThrottle::PrerenderResourceThrottle(net::URLRequest* request)
37 : request_(request) { 47 : request_(request) {
38 } 48 }
(...skipping 14 matching lines...) Expand all
53 void PrerenderResourceThrottle::WillRedirectRequest( 63 void PrerenderResourceThrottle::WillRedirectRequest(
54 const net::RedirectInfo& redirect_info, 64 const net::RedirectInfo& redirect_info,
55 bool* defer) { 65 bool* defer) {
56 const content::ResourceRequestInfo* info = 66 const content::ResourceRequestInfo* info =
57 content::ResourceRequestInfo::ForRequest(request_); 67 content::ResourceRequestInfo::ForRequest(request_);
58 *defer = true; 68 *defer = true;
59 std::string header; 69 std::string header;
60 request_->GetResponseHeaderByName(kFollowOnlyWhenPrerenderShown, &header); 70 request_->GetResponseHeaderByName(kFollowOnlyWhenPrerenderShown, &header);
61 71
62 content::BrowserThread::PostTask( 72 content::BrowserThread::PostTask(
63 content::BrowserThread::UI, 73 content::BrowserThread::UI, FROM_HERE,
64 FROM_HERE,
65 base::Bind(&PrerenderResourceThrottle::WillRedirectRequestOnUI, 74 base::Bind(&PrerenderResourceThrottle::WillRedirectRequestOnUI,
66 AsWeakPtr(), header, info->GetResourceType(), info->IsAsync(), 75 AsWeakPtr(), header, info->GetResourceType(), info->IsAsync(),
67 info->GetChildID(), info->GetRenderFrameID(), 76 IsNoStoreResponse(*request_), info->GetChildID(),
68 redirect_info.new_url)); 77 info->GetRenderFrameID(), redirect_info.new_url));
69 } 78 }
70 79
71 void PrerenderResourceThrottle::WillProcessResponse(bool* defer) { 80 void PrerenderResourceThrottle::WillProcessResponse(bool* defer) {
72 const content::ResourceRequestInfo* info = 81 const content::ResourceRequestInfo* info =
73 content::ResourceRequestInfo::ForRequest(request_); 82 content::ResourceRequestInfo::ForRequest(request_);
74 if (!info) 83 if (!info)
75 return; 84 return;
76 85
77 bool is_no_store = false; 86 DCHECK_GT(request_->url_chain().size(), 0u);
78 const net::HttpResponseInfo& response_info = request_->response_info(); 87 int redirect_count =
79 if (response_info.headers.get()) { 88 base::saturated_cast<int>(request_->url_chain().size() - 1);
pasko 2016/09/05 14:39:48 size() returns an unsigned int. Suppose it returns
droger 2016/09/05 15:03:44 Good catch. Of course. That's what I wanted to do,
80 is_no_store =
81 response_info.headers->HasHeaderValue("cache-control", "no-store");
82 }
83 89
84 content::BrowserThread::PostTask( 90 content::BrowserThread::PostTask(
85 content::BrowserThread::UI, FROM_HERE, 91 content::BrowserThread::UI, FROM_HERE,
86 base::Bind(&PrerenderResourceThrottle::WillProcessResponseOnUI, 92 base::Bind(&PrerenderResourceThrottle::WillProcessResponseOnUI,
87 content::IsResourceTypeFrame(info->GetResourceType()), 93 content::IsResourceTypeFrame(info->GetResourceType()),
88 is_no_store, info->GetChildID(), info->GetRenderFrameID())); 94 IsNoStoreResponse(*request_), redirect_count,
95 info->GetChildID(), info->GetRenderFrameID()));
89 } 96 }
90 97
91 const char* PrerenderResourceThrottle::GetNameForLogging() const { 98 const char* PrerenderResourceThrottle::GetNameForLogging() const {
92 return "PrerenderResourceThrottle"; 99 return "PrerenderResourceThrottle";
93 } 100 }
94 101
95 void PrerenderResourceThrottle::Resume() { 102 void PrerenderResourceThrottle::Resume() {
96 controller()->Resume(); 103 controller()->Resume();
97 } 104 }
98 105
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 base::Bind(cancel ? &PrerenderResourceThrottle::Cancel : 144 base::Bind(cancel ? &PrerenderResourceThrottle::Cancel :
138 &PrerenderResourceThrottle::Resume, throttle)); 145 &PrerenderResourceThrottle::Resume, throttle));
139 } 146 }
140 147
141 // static 148 // static
142 void PrerenderResourceThrottle::WillRedirectRequestOnUI( 149 void PrerenderResourceThrottle::WillRedirectRequestOnUI(
143 const base::WeakPtr<PrerenderResourceThrottle>& throttle, 150 const base::WeakPtr<PrerenderResourceThrottle>& throttle,
144 const std::string& follow_only_when_prerender_shown_header, 151 const std::string& follow_only_when_prerender_shown_header,
145 ResourceType resource_type, 152 ResourceType resource_type,
146 bool async, 153 bool async,
154 bool is_no_store,
147 int render_process_id, 155 int render_process_id,
148 int render_frame_id, 156 int render_frame_id,
149 const GURL& new_url) { 157 const GURL& new_url) {
150 bool cancel = false; 158 bool cancel = false;
151 PrerenderContents* prerender_contents = 159 PrerenderContents* prerender_contents =
152 PrerenderContentsFromRenderFrame(render_process_id, render_frame_id); 160 PrerenderContentsFromRenderFrame(render_process_id, render_frame_id);
153 if (prerender_contents) { 161 if (prerender_contents) {
162 prerender_contents->prerender_manager()->RecordPrefetchResponseReceived(
163 prerender_contents->origin(),
164 content::IsResourceTypeFrame(resource_type), true /* is_redirect */,
165 is_no_store);
154 // Abort any prerenders with requests which redirect to invalid schemes. 166 // Abort any prerenders with requests which redirect to invalid schemes.
155 if (!PrerenderManager::DoesURLHaveValidScheme(new_url)) { 167 if (!PrerenderManager::DoesURLHaveValidScheme(new_url)) {
156 prerender_contents->Destroy(FINAL_STATUS_UNSUPPORTED_SCHEME); 168 prerender_contents->Destroy(FINAL_STATUS_UNSUPPORTED_SCHEME);
157 ReportUnsupportedPrerenderScheme(new_url); 169 ReportUnsupportedPrerenderScheme(new_url);
158 cancel = true; 170 cancel = true;
159 } else if (follow_only_when_prerender_shown_header == "1" && 171 } else if (follow_only_when_prerender_shown_header == "1" &&
160 resource_type != content::RESOURCE_TYPE_MAIN_FRAME) { 172 resource_type != content::RESOURCE_TYPE_MAIN_FRAME) {
161 // Only defer redirects with the Follow-Only-When-Prerender-Shown 173 // Only defer redirects with the Follow-Only-When-Prerender-Shown
162 // header. Do not defer redirects on main frame loads. 174 // header. Do not defer redirects on main frame loads.
163 if (!async) { 175 if (!async) {
(...skipping 12 matching lines...) Expand all
176 content::BrowserThread::PostTask( 188 content::BrowserThread::PostTask(
177 content::BrowserThread::IO, 189 content::BrowserThread::IO,
178 FROM_HERE, 190 FROM_HERE,
179 base::Bind(cancel ? &PrerenderResourceThrottle::Cancel : 191 base::Bind(cancel ? &PrerenderResourceThrottle::Cancel :
180 &PrerenderResourceThrottle::Resume, throttle)); 192 &PrerenderResourceThrottle::Resume, throttle));
181 } 193 }
182 194
183 // static 195 // static
184 void PrerenderResourceThrottle::WillProcessResponseOnUI(bool is_main_resource, 196 void PrerenderResourceThrottle::WillProcessResponseOnUI(bool is_main_resource,
185 bool is_no_store, 197 bool is_no_store,
198 int redirect_count,
186 int render_process_id, 199 int render_process_id,
187 int render_frame_id) { 200 int render_frame_id) {
188 PrerenderContents* prerender_contents = 201 PrerenderContents* prerender_contents =
189 PrerenderContentsFromRenderFrame(render_process_id, render_frame_id); 202 PrerenderContentsFromRenderFrame(render_process_id, render_frame_id);
190 if (!prerender_contents) 203 if (!prerender_contents)
191 return; 204 return;
192 205
193 if (prerender_contents->prerender_mode() != PREFETCH_ONLY) 206 if (prerender_contents->prerender_mode() != PREFETCH_ONLY)
194 return; 207 return;
195 208
196 prerender_contents->prerender_manager()->RecordResourcePrefetch( 209 prerender_contents->prerender_manager()->RecordPrefetchResponseReceived(
197 prerender_contents->origin(), is_main_resource, is_no_store); 210 prerender_contents->origin(), is_main_resource, false /* is_redirect */,
211 is_no_store);
212 prerender_contents->prerender_manager()->RecordPrefetchRedirectCount(
213 prerender_contents->origin(), is_main_resource, redirect_count);
198 } 214 }
199 215
200 // static 216 // static
201 PrerenderContents* PrerenderResourceThrottle::PrerenderContentsFromRenderFrame( 217 PrerenderContents* PrerenderResourceThrottle::PrerenderContentsFromRenderFrame(
202 int render_process_id, int render_frame_id) { 218 int render_process_id, int render_frame_id) {
203 if (g_prerender_contents_for_testing) 219 if (g_prerender_contents_for_testing)
204 return g_prerender_contents_for_testing; 220 return g_prerender_contents_for_testing;
205 content::RenderFrameHost* rfh = content::RenderFrameHost::FromID( 221 content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(
206 render_process_id, render_frame_id); 222 render_process_id, render_frame_id);
207 content::WebContents* web_contents = 223 content::WebContents* web_contents =
208 content::WebContents::FromRenderFrameHost(rfh); 224 content::WebContents::FromRenderFrameHost(rfh);
209 return PrerenderContents::FromWebContents(web_contents); 225 return PrerenderContents::FromWebContents(web_contents);
210 } 226 }
211 227
212 } // namespace prerender 228 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698