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

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

Issue 2302433002: [NoStatePrefetch] Track redirects in UMA (Closed)
Patch Set: Add histograms for redirect count 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 "build/build_config.h" 7 #include "build/build_config.h"
8 #include "chrome/browser/prerender/prerender_final_status.h" 8 #include "chrome/browser/prerender/prerender_final_status.h"
9 #include "chrome/browser/prerender/prerender_manager.h" 9 #include "chrome/browser/prerender/prerender_manager.h"
10 #include "chrome/browser/prerender/prerender_util.h" 10 #include "chrome/browser/prerender/prerender_util.h"
11 #include "content/public/browser/browser_thread.h" 11 #include "content/public/browser/browser_thread.h"
12 #include "content/public/browser/render_frame_host.h" 12 #include "content/public/browser/render_frame_host.h"
13 #include "content/public/browser/resource_controller.h" 13 #include "content/public/browser/resource_controller.h"
14 #include "content/public/browser/resource_request_info.h" 14 #include "content/public/browser/resource_request_info.h"
15 #include "content/public/browser/web_contents.h" 15 #include "content/public/browser/web_contents.h"
16 #include "net/http/http_response_headers.h" 16 #include "net/http/http_response_headers.h"
17 #include "net/url_request/redirect_info.h" 17 #include "net/url_request/redirect_info.h"
18 #include "net/url_request/url_request.h" 18 #include "net/url_request/url_request.h"
19 19
20 using content::ResourceType; 20 using content::ResourceType;
21 21
22 namespace prerender { 22 namespace prerender {
23 23
24 namespace { 24 namespace {
25 static const char kFollowOnlyWhenPrerenderShown[] = 25 static const char kFollowOnlyWhenPrerenderShown[] =
26 "follow-only-when-prerender-shown"; 26 "follow-only-when-prerender-shown";
27 27
28 PrerenderContents* g_prerender_contents_for_testing; 28 PrerenderContents* g_prerender_contents_for_testing;
29
30 // Returns true if the response has a "no-store" cache control header.
31 bool IsNoStoreResponse(net::URLRequest* request) {
pasko 2016/09/02 16:34:48 would it be possible to pass the argument by const
droger 2016/09/05 12:38:47 Done.
32 const net::HttpResponseInfo& response_info = request->response_info();
33 return response_info.headers.get() &&
34 response_info.headers->HasHeaderValue("cache-control", "no-store");
35 }
36
29 } // namespace 37 } // namespace
30 38
31 void PrerenderResourceThrottle::OverridePrerenderContentsForTesting( 39 void PrerenderResourceThrottle::OverridePrerenderContentsForTesting(
32 PrerenderContents* contents) { 40 PrerenderContents* contents) {
33 g_prerender_contents_for_testing = contents; 41 g_prerender_contents_for_testing = contents;
34 } 42 }
35 43
36 PrerenderResourceThrottle::PrerenderResourceThrottle(net::URLRequest* request) 44 PrerenderResourceThrottle::PrerenderResourceThrottle(net::URLRequest* request)
37 : request_(request) { 45 : request_(request) {
38 } 46 }
(...skipping 14 matching lines...) Expand all
53 void PrerenderResourceThrottle::WillRedirectRequest( 61 void PrerenderResourceThrottle::WillRedirectRequest(
54 const net::RedirectInfo& redirect_info, 62 const net::RedirectInfo& redirect_info,
55 bool* defer) { 63 bool* defer) {
56 const content::ResourceRequestInfo* info = 64 const content::ResourceRequestInfo* info =
57 content::ResourceRequestInfo::ForRequest(request_); 65 content::ResourceRequestInfo::ForRequest(request_);
58 *defer = true; 66 *defer = true;
59 std::string header; 67 std::string header;
60 request_->GetResponseHeaderByName(kFollowOnlyWhenPrerenderShown, &header); 68 request_->GetResponseHeaderByName(kFollowOnlyWhenPrerenderShown, &header);
61 69
62 content::BrowserThread::PostTask( 70 content::BrowserThread::PostTask(
63 content::BrowserThread::UI, 71 content::BrowserThread::UI, FROM_HERE,
64 FROM_HERE,
65 base::Bind(&PrerenderResourceThrottle::WillRedirectRequestOnUI, 72 base::Bind(&PrerenderResourceThrottle::WillRedirectRequestOnUI,
66 AsWeakPtr(), header, info->GetResourceType(), info->IsAsync(), 73 AsWeakPtr(), header, info->GetResourceType(), info->IsAsync(),
67 info->GetChildID(), info->GetRenderFrameID(), 74 IsNoStoreResponse(request_), info->GetChildID(),
68 redirect_info.new_url)); 75 info->GetRenderFrameID(), redirect_info.new_url));
69 } 76 }
70 77
71 void PrerenderResourceThrottle::WillProcessResponse(bool* defer) { 78 void PrerenderResourceThrottle::WillProcessResponse(bool* defer) {
72 const content::ResourceRequestInfo* info = 79 const content::ResourceRequestInfo* info =
73 content::ResourceRequestInfo::ForRequest(request_); 80 content::ResourceRequestInfo::ForRequest(request_);
74 if (!info) 81 if (!info)
75 return; 82 return;
76 83
77 bool is_no_store = false;
78 const net::HttpResponseInfo& response_info = request_->response_info();
79 if (response_info.headers.get()) {
80 is_no_store =
81 response_info.headers->HasHeaderValue("cache-control", "no-store");
82 }
83
84 content::BrowserThread::PostTask( 84 content::BrowserThread::PostTask(
85 content::BrowserThread::UI, FROM_HERE, 85 content::BrowserThread::UI, FROM_HERE,
86 base::Bind(&PrerenderResourceThrottle::WillProcessResponseOnUI, 86 base::Bind(&PrerenderResourceThrottle::WillProcessResponseOnUI,
87 content::IsResourceTypeFrame(info->GetResourceType()), 87 content::IsResourceTypeFrame(info->GetResourceType()),
88 is_no_store, info->GetChildID(), info->GetRenderFrameID())); 88 IsNoStoreResponse(request_), request_->url_chain().size() - 1,
pasko 2016/09/02 16:34:48 Even though size of the chain is unlikely to be ze
droger 2016/09/05 12:38:47 Done.
89 info->GetChildID(), info->GetRenderFrameID()));
89 } 90 }
90 91
91 const char* PrerenderResourceThrottle::GetNameForLogging() const { 92 const char* PrerenderResourceThrottle::GetNameForLogging() const {
92 return "PrerenderResourceThrottle"; 93 return "PrerenderResourceThrottle";
93 } 94 }
94 95
95 void PrerenderResourceThrottle::Resume() { 96 void PrerenderResourceThrottle::Resume() {
96 controller()->Resume(); 97 controller()->Resume();
97 } 98 }
98 99
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 base::Bind(cancel ? &PrerenderResourceThrottle::Cancel : 138 base::Bind(cancel ? &PrerenderResourceThrottle::Cancel :
138 &PrerenderResourceThrottle::Resume, throttle)); 139 &PrerenderResourceThrottle::Resume, throttle));
139 } 140 }
140 141
141 // static 142 // static
142 void PrerenderResourceThrottle::WillRedirectRequestOnUI( 143 void PrerenderResourceThrottle::WillRedirectRequestOnUI(
143 const base::WeakPtr<PrerenderResourceThrottle>& throttle, 144 const base::WeakPtr<PrerenderResourceThrottle>& throttle,
144 const std::string& follow_only_when_prerender_shown_header, 145 const std::string& follow_only_when_prerender_shown_header,
145 ResourceType resource_type, 146 ResourceType resource_type,
146 bool async, 147 bool async,
148 bool is_no_store,
147 int render_process_id, 149 int render_process_id,
148 int render_frame_id, 150 int render_frame_id,
149 const GURL& new_url) { 151 const GURL& new_url) {
150 bool cancel = false; 152 bool cancel = false;
151 PrerenderContents* prerender_contents = 153 PrerenderContents* prerender_contents =
152 PrerenderContentsFromRenderFrame(render_process_id, render_frame_id); 154 PrerenderContentsFromRenderFrame(render_process_id, render_frame_id);
153 if (prerender_contents) { 155 if (prerender_contents) {
156 prerender_contents->prerender_manager()->RecordResourcePrefetch(
157 prerender_contents->origin(),
158 content::IsResourceTypeFrame(resource_type), true /*is_redirect*/,
pasko 2016/09/02 16:34:48 most code I see surrounds the parameter name with
droger 2016/09/05 12:38:47 Done.
159 is_no_store);
154 // Abort any prerenders with requests which redirect to invalid schemes. 160 // Abort any prerenders with requests which redirect to invalid schemes.
155 if (!PrerenderManager::DoesURLHaveValidScheme(new_url)) { 161 if (!PrerenderManager::DoesURLHaveValidScheme(new_url)) {
156 prerender_contents->Destroy(FINAL_STATUS_UNSUPPORTED_SCHEME); 162 prerender_contents->Destroy(FINAL_STATUS_UNSUPPORTED_SCHEME);
157 ReportUnsupportedPrerenderScheme(new_url); 163 ReportUnsupportedPrerenderScheme(new_url);
158 cancel = true; 164 cancel = true;
159 } else if (follow_only_when_prerender_shown_header == "1" && 165 } else if (follow_only_when_prerender_shown_header == "1" &&
160 resource_type != content::RESOURCE_TYPE_MAIN_FRAME) { 166 resource_type != content::RESOURCE_TYPE_MAIN_FRAME) {
161 // Only defer redirects with the Follow-Only-When-Prerender-Shown 167 // Only defer redirects with the Follow-Only-When-Prerender-Shown
162 // header. Do not defer redirects on main frame loads. 168 // header. Do not defer redirects on main frame loads.
163 if (!async) { 169 if (!async) {
(...skipping 12 matching lines...) Expand all
176 content::BrowserThread::PostTask( 182 content::BrowserThread::PostTask(
177 content::BrowserThread::IO, 183 content::BrowserThread::IO,
178 FROM_HERE, 184 FROM_HERE,
179 base::Bind(cancel ? &PrerenderResourceThrottle::Cancel : 185 base::Bind(cancel ? &PrerenderResourceThrottle::Cancel :
180 &PrerenderResourceThrottle::Resume, throttle)); 186 &PrerenderResourceThrottle::Resume, throttle));
181 } 187 }
182 188
183 // static 189 // static
184 void PrerenderResourceThrottle::WillProcessResponseOnUI(bool is_main_resource, 190 void PrerenderResourceThrottle::WillProcessResponseOnUI(bool is_main_resource,
185 bool is_no_store, 191 bool is_no_store,
192 size_t redirect_count,
186 int render_process_id, 193 int render_process_id,
187 int render_frame_id) { 194 int render_frame_id) {
188 PrerenderContents* prerender_contents = 195 PrerenderContents* prerender_contents =
189 PrerenderContentsFromRenderFrame(render_process_id, render_frame_id); 196 PrerenderContentsFromRenderFrame(render_process_id, render_frame_id);
190 if (!prerender_contents) 197 if (!prerender_contents)
191 return; 198 return;
192 199
193 if (prerender_contents->prerender_mode() != PREFETCH_ONLY) 200 if (prerender_contents->prerender_mode() != PREFETCH_ONLY)
194 return; 201 return;
195 202
196 prerender_contents->prerender_manager()->RecordResourcePrefetch( 203 prerender_contents->prerender_manager()->RecordResourcePrefetch(
197 prerender_contents->origin(), is_main_resource, is_no_store); 204 prerender_contents->origin(), is_main_resource, false /*is_redirect*/,
205 is_no_store);
206 prerender_contents->prerender_manager()->RecordPrefetchRedirectCount(
207 prerender_contents->origin(), is_main_resource, redirect_count);
198 } 208 }
199 209
200 // static 210 // static
201 PrerenderContents* PrerenderResourceThrottle::PrerenderContentsFromRenderFrame( 211 PrerenderContents* PrerenderResourceThrottle::PrerenderContentsFromRenderFrame(
202 int render_process_id, int render_frame_id) { 212 int render_process_id, int render_frame_id) {
203 if (g_prerender_contents_for_testing) 213 if (g_prerender_contents_for_testing)
204 return g_prerender_contents_for_testing; 214 return g_prerender_contents_for_testing;
205 content::RenderFrameHost* rfh = content::RenderFrameHost::FromID( 215 content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(
206 render_process_id, render_frame_id); 216 render_process_id, render_frame_id);
207 content::WebContents* web_contents = 217 content::WebContents* web_contents =
208 content::WebContents::FromRenderFrameHost(rfh); 218 content::WebContents::FromRenderFrameHost(rfh);
209 return PrerenderContents::FromWebContents(web_contents); 219 return PrerenderContents::FromWebContents(web_contents);
210 } 220 }
211 221
212 } // namespace prerender 222 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698