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

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

Issue 141163002: Make PrerenderTracker's resource_throttle_io_thread_map_ use RenderFrame IDs instead of RenderView … (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: simplify code Created 6 years, 11 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 | Annotate | Revision Log
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 "chrome/browser/prerender/prerender_final_status.h" 7 #include "chrome/browser/prerender/prerender_final_status.h"
8 #include "chrome/browser/prerender/prerender_manager.h" 8 #include "chrome/browser/prerender/prerender_manager.h"
9 #include "chrome/browser/prerender/prerender_tracker.h"
10 #include "chrome/browser/prerender/prerender_util.h" 9 #include "chrome/browser/prerender/prerender_util.h"
11 #include "content/public/browser/browser_thread.h" 10 #include "content/public/browser/browser_thread.h"
12 #include "content/public/browser/render_frame_host.h" 11 #include "content/public/browser/render_frame_host.h"
13 #include "content/public/browser/resource_controller.h" 12 #include "content/public/browser/resource_controller.h"
14 #include "content/public/browser/resource_request_info.h" 13 #include "content/public/browser/resource_request_info.h"
15 #include "content/public/browser/web_contents.h" 14 #include "content/public/browser/web_contents.h"
16 #include "net/url_request/url_request.h" 15 #include "net/url_request/url_request.h"
17 16
18 namespace prerender { 17 namespace prerender {
19 18
20 namespace { 19 namespace {
21 static const char kFollowOnlyWhenPrerenderShown[] = 20 static const char kFollowOnlyWhenPrerenderShown[] =
22 "follow-only-when-prerender-shown"; 21 "follow-only-when-prerender-shown";
23 22
24 PrerenderContents* g_prerender_contents_for_testing; 23 PrerenderContents* g_prerender_contents_for_testing;
25 } 24 }
26 25
27 void PrerenderResourceThrottle::OverridePrerenderContentsForTesting( 26 void PrerenderResourceThrottle::OverridePrerenderContentsForTesting(
28 PrerenderContents* contents) { 27 PrerenderContents* contents) {
29 g_prerender_contents_for_testing = contents; 28 g_prerender_contents_for_testing = contents;
30 } 29 }
31 30
32 PrerenderResourceThrottle::PrerenderResourceThrottle( 31 PrerenderResourceThrottle::PrerenderResourceThrottle(net::URLRequest* request)
33 net::URLRequest* request, 32 : request_(request) {
34 PrerenderTracker* tracker)
35 : request_(request),
36 tracker_(tracker) {
37 } 33 }
38 34
39 void PrerenderResourceThrottle::WillStartRequest(bool* defer) { 35 void PrerenderResourceThrottle::WillStartRequest(bool* defer) {
40 const content::ResourceRequestInfo* info = 36 const content::ResourceRequestInfo* info =
41 content::ResourceRequestInfo::ForRequest(request_); 37 content::ResourceRequestInfo::ForRequest(request_);
42 int child_id = info->GetChildID();
43 int route_id = info->GetRouteID();
44
45 // If the prerender was used since the throttle was added, leave it
46 // alone.
47 if (!tracker_->IsPrerenderingOnIOThread(child_id, route_id))
48 return;
49
50 *defer = true; 38 *defer = true;
51 content::BrowserThread::PostTask( 39 content::BrowserThread::PostTask(
52 content::BrowserThread::UI, 40 content::BrowserThread::UI,
53 FROM_HERE, 41 FROM_HERE,
54 base::Bind(&PrerenderResourceThrottle::WillStartRequestOnUI, 42 base::Bind(&PrerenderResourceThrottle::WillStartRequestOnUI,
55 AsWeakPtr(), request_->method(), info->GetChildID(), 43 AsWeakPtr(), request_->method(), info->GetChildID(),
56 info->GetRenderFrameID(), request_->url())); 44 info->GetRenderFrameID(), request_->url()));
57 } 45 }
58 46
59 void PrerenderResourceThrottle::WillRedirectRequest(const GURL& new_url, 47 void PrerenderResourceThrottle::WillRedirectRequest(const GURL& new_url,
60 bool* defer) { 48 bool* defer) {
61 const content::ResourceRequestInfo* info = 49 const content::ResourceRequestInfo* info =
62 content::ResourceRequestInfo::ForRequest(request_); 50 content::ResourceRequestInfo::ForRequest(request_);
63 int child_id = info->GetChildID();
64 int route_id = info->GetRouteID();
65
66 // If the prerender was used since the throttle was added, leave it
67 // alone.
68 if (!tracker_->IsPrerenderingOnIOThread(child_id, route_id))
69 return;
70
71 *defer = true; 51 *defer = true;
72 std::string header; 52 std::string header;
73 request_->GetResponseHeaderByName(kFollowOnlyWhenPrerenderShown, &header); 53 request_->GetResponseHeaderByName(kFollowOnlyWhenPrerenderShown, &header);
74 54
75 content::BrowserThread::PostTask( 55 content::BrowserThread::PostTask(
76 content::BrowserThread::UI, 56 content::BrowserThread::UI,
77 FROM_HERE, 57 FROM_HERE,
78 base::Bind(&PrerenderResourceThrottle::WillRedirectRequestOnUI, 58 base::Bind(&PrerenderResourceThrottle::WillRedirectRequestOnUI,
79 AsWeakPtr(), header, info->GetResourceType(), info->IsAsync(), 59 AsWeakPtr(), header, info->GetResourceType(), info->IsAsync(),
80 info->GetChildID(), info->GetRenderFrameID(), new_url)); 60 info->GetChildID(), info->GetRenderFrameID(), new_url));
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 } else if (follow_only_when_prerender_shown_header == "1" && 121 } else if (follow_only_when_prerender_shown_header == "1" &&
142 resource_type != ResourceType::MAIN_FRAME) { 122 resource_type != ResourceType::MAIN_FRAME) {
143 // Only defer redirects with the Follow-Only-When-Prerender-Shown 123 // Only defer redirects with the Follow-Only-When-Prerender-Shown
144 // header. Do not defer redirects on main frame loads. 124 // header. Do not defer redirects on main frame loads.
145 if (!async) { 125 if (!async) {
146 // Cancel on deferred synchronous requests. Those will 126 // Cancel on deferred synchronous requests. Those will
147 // indefinitely hang up a renderer process. 127 // indefinitely hang up a renderer process.
148 prerender_contents->Destroy(FINAL_STATUS_BAD_DEFERRED_REDIRECT); 128 prerender_contents->Destroy(FINAL_STATUS_BAD_DEFERRED_REDIRECT);
149 cancel = true; 129 cancel = true;
150 } else { 130 } else {
151 // Defer the redirect until the prerender is used or 131 // Defer the redirect until the prerender is used or canceled.
152 // canceled. It is possible for the UI thread to used the 132 prerender_contents->AddResourceThrottle(throttle);
davidben 2014/01/20 20:51:57 This is fine (the assumption the code is making is
jam 2014/01/21 00:30:08 yep precisely, I was worried about this case as we
153 // prerender at the same time. But then |tracker_| will resume
154 // the request soon in
155 // PrerenderTracker::RemovePrerenderOnIOThread.
156 content::BrowserThread::PostTask(
157 content::BrowserThread::IO,
158 FROM_HERE,
159 base::Bind(&PrerenderResourceThrottle::AddResourceThrottle,
160 throttle));
161 return; 133 return;
162 } 134 }
163 } 135 }
164 } 136 }
165 137
166 content::BrowserThread::PostTask( 138 content::BrowserThread::PostTask(
167 content::BrowserThread::IO, 139 content::BrowserThread::IO,
168 FROM_HERE, 140 FROM_HERE,
169 base::Bind(cancel ? &PrerenderResourceThrottle::Cancel : 141 base::Bind(cancel ? &PrerenderResourceThrottle::Cancel :
170 &PrerenderResourceThrottle::Resume, throttle)); 142 &PrerenderResourceThrottle::Resume, throttle));
171 } 143 }
172 144
173 PrerenderContents* PrerenderResourceThrottle::PrerenderContentsFromRenderFrame( 145 PrerenderContents* PrerenderResourceThrottle::PrerenderContentsFromRenderFrame(
174 int render_process_id, int render_frame_id) { 146 int render_process_id, int render_frame_id) {
175 if (g_prerender_contents_for_testing) 147 if (g_prerender_contents_for_testing)
176 return g_prerender_contents_for_testing; 148 return g_prerender_contents_for_testing;
177 content::RenderFrameHost* rfh = content::RenderFrameHost::FromID( 149 content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(
178 render_process_id, render_frame_id); 150 render_process_id, render_frame_id);
179 content::WebContents* web_contents = 151 content::WebContents* web_contents =
180 content::WebContents::FromRenderFrameHost(rfh); 152 content::WebContents::FromRenderFrameHost(rfh);
181 return PrerenderContents::FromWebContents(web_contents); 153 return PrerenderContents::FromWebContents(web_contents);
182 } 154 }
183 155
184 void PrerenderResourceThrottle::AddResourceThrottle() {
185 const content::ResourceRequestInfo* info =
186 content::ResourceRequestInfo::ForRequest(request_);
187 int child_id = info->GetChildID();
188 int route_id = info->GetRouteID();
189 tracker_->AddResourceThrottleOnIOThread(child_id, route_id, AsWeakPtr());
190 }
191
192 } // namespace prerender 156 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698