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

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

Issue 6966017: Remove a chrome dependency by removing Prerender from ResourceDispatcherHost. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 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 (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 "base/logging.h" 5 #include "base/logging.h"
6 #include "chrome/browser/browser_process.h"
6 #include "chrome/browser/prerender/prerender_manager.h" 7 #include "chrome/browser/prerender/prerender_manager.h"
7 #include "chrome/browser/prerender/prerender_tracker.h" 8 #include "chrome/browser/prerender/prerender_tracker.h"
9 #include "chrome/browser/ui/browser.h"
mmenke 2011/05/23 21:58:41 Is this needed?
dominich 2011/05/23 22:22:55 Done.
8 #include "content/browser/browser_thread.h" 10 #include "content/browser/browser_thread.h"
11 #include "content/browser/resource_context.h"
12 #include "content/common/resource_messages.h"
13 #include "net/base/load_flags.h"
9 14
10 namespace prerender { 15 namespace prerender {
11 16
12 namespace { 17 namespace {
13 18
14 void DestroyPreloadForRenderView( 19 void DestroyPreloadForRenderView(
15 const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr, 20 const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr,
16 int child_id, 21 int child_id,
17 int route_id, 22 int route_id,
18 FinalStatus final_status) { 23 FinalStatus final_status) {
19 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 24 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
20 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get(); 25 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get();
21 if (!prerender_manager) 26 if (!prerender_manager)
22 return; 27 return;
23 28
24 prerender_manager->DestroyPreloadForChildRouteIdPair( 29 prerender_manager->DestroyPreloadForChildRouteIdPair(
25 std::make_pair(child_id, route_id), 30 std::make_pair(child_id, route_id),
26 final_status); 31 final_status);
27 } 32 }
28 33
29 } // namespace 34 } // namespace
30 35
31 struct RenderViewInfo { 36 PrerenderTracker::RenderViewInfo::RenderViewInfo(
32 explicit RenderViewInfo(PrerenderManager* prerender_manager) 37 PrerenderManager* prerender_manager)
33 : final_status(FINAL_STATUS_MAX), 38 : final_status(FINAL_STATUS_MAX),
34 prerender_manager(prerender_manager->AsWeakPtr()) { 39 prerender_manager(prerender_manager->AsWeakPtr()) {
35 }
36
37 FinalStatus final_status;
38 base::WeakPtr<PrerenderManager> prerender_manager;
39 };
40
41 // static
42 PrerenderTracker* PrerenderTracker::GetInstance() {
43 return Singleton<PrerenderTracker>::get();
44 } 40 }
45 41
46 bool PrerenderTracker::TryUse(int child_id, int route_id) { 42 bool PrerenderTracker::TryUse(int child_id, int route_id) {
47 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 43 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
48 44
49 FinalStatus final_status = SetFinalStatus(child_id, route_id, 45 FinalStatus final_status = SetFinalStatus(child_id, route_id,
50 FINAL_STATUS_USED); 46 FINAL_STATUS_USED);
51 return final_status == FINAL_STATUS_USED; 47 return final_status == FINAL_STATUS_USED;
52 } 48 }
53 49
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 123
128 BrowserThread::PostTask( 124 BrowserThread::PostTask(
129 BrowserThread::IO, FROM_HERE, 125 BrowserThread::IO, FROM_HERE,
130 NewRunnableFunction(&RemovePrerenderOnIOThreadTask, child_route_id_pair)); 126 NewRunnableFunction(&RemovePrerenderOnIOThreadTask, child_route_id_pair));
131 127
132 base::AutoLock lock(final_status_map_lock_); 128 base::AutoLock lock(final_status_map_lock_);
133 size_t num_erased = final_status_map_.erase(child_route_id_pair); 129 size_t num_erased = final_status_map_.erase(child_route_id_pair);
134 DCHECK_EQ(1u, num_erased); 130 DCHECK_EQ(1u, num_erased);
135 } 131 }
136 132
137 PrerenderTracker::PrerenderTracker() {
138 }
139
140 PrerenderTracker::~PrerenderTracker() {
141 }
142
143 FinalStatus PrerenderTracker::SetFinalStatus(int child_id, int route_id, 133 FinalStatus PrerenderTracker::SetFinalStatus(int child_id, int route_id,
144 FinalStatus final_status) { 134 FinalStatus final_status) {
145 DCHECK(final_status >= FINAL_STATUS_USED && final_status < FINAL_STATUS_MAX); 135 DCHECK(final_status >= FINAL_STATUS_USED && final_status < FINAL_STATUS_MAX);
146 136
147 ChildRouteIdPair child_route_id_pair(child_id, route_id); 137 ChildRouteIdPair child_route_id_pair(child_id, route_id);
148 138
149 base::AutoLock lock(final_status_map_lock_); 139 base::AutoLock lock(final_status_map_lock_);
150 FinalStatusMap::iterator final_status_it = 140 FinalStatusMap::iterator final_status_it =
151 final_status_map_.find(child_route_id_pair); 141 final_status_map_.find(child_route_id_pair);
152 if (final_status_it == final_status_map_.end()) { 142 if (final_status_it == final_status_map_.end()) {
153 // The RenderView has already been either used or destroyed. 143 // The RenderView has already been either used or destroyed.
154 return FINAL_STATUS_MAX; 144 return FINAL_STATUS_MAX;
155 } 145 }
156 146
157 if (final_status_it->second.final_status == FINAL_STATUS_MAX) { 147 if (final_status_it->second.final_status == FINAL_STATUS_MAX) {
158 final_status_it->second.final_status = final_status; 148 final_status_it->second.final_status = final_status;
159 if (final_status != FINAL_STATUS_USED) { 149 if (final_status != FINAL_STATUS_USED) {
160 BrowserThread::PostTask( 150 BrowserThread::PostTask(
161 BrowserThread::UI, FROM_HERE, 151 BrowserThread::UI, FROM_HERE,
162 NewRunnableFunction(&DestroyPreloadForRenderView, 152 NewRunnableFunction(&DestroyPreloadForRenderView,
163 final_status_it->second.prerender_manager, 153 final_status_it->second.prerender_manager,
164 child_id, 154 child_id,
165 route_id, 155 route_id,
166 final_status)); 156 final_status));
167 } 157 }
168 } 158 }
169 return final_status_it->second.final_status; 159 return final_status_it->second.final_status;
170 } 160 }
171 161
162 bool PrerenderTracker::ShouldBeginRequest(
163 int child_id, int route_id,
164 const ResourceHostMsg_Request& request_data,
165 const content::ResourceContext& resource_context,
166 const GURL& referrer) {
167 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
168 bool is_prerendering = IsPrerenderingOnIOThread(child_id, route_id);
169
170 // Handle a PREFETCH resource type.
171 if (request_data.resource_type == ResourceType::PREFETCH) {
172 // All PREFETCH requests should be GETs, but be defensive about it.
173 if (request_data.method != "GET")
174 return false;
175
176 // If prefetch is disabled, kill the request.
177 if (!ResourceDispatcherHost::is_prefetch_enabled())
178 return false;
179
180 // If prerendering is enabled, trigger a prerender for the URL and abort the
181 // request to prevent double-gets.
182 if (PrerenderManager::IsPrerenderingPossible()) {
183 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
184 NewRunnableFunction(HandlePrefetchTag,
185 resource_context.prerender_manager(),
186 child_id,
187 route_id,
188 request_data.url,
189 referrer,
190 is_prerendering));
191 return false;
192 }
193 }
194
195 // Abort any prerenders that spawn requests that use invalid HTTP methods.
196 if (is_prerendering &&
197 !PrerenderManager::IsValidHttpMethod(request_data.method)) {
198 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
199 NewRunnableFunction(
200 DestroyPreloadForRenderView,
201 resource_context.prerender_manager(),
202 child_id,
203 route_id,
204 FINAL_STATUS_INVALID_HTTP_METHOD));
205 return false;
206 }
207
208 return true;
209 }
210
211 void PrerenderTracker::MutateLoadFlags(int child_id, int route_id,
212 int* load_flags) {
213 DCHECK(load_flags);
214 if (IsPrerenderingOnIOThread(child_id, route_id))
215 *load_flags |= net::LOAD_PRERENDER;
216 }
217
172 void PrerenderTracker::AddPrerenderOnIOThread( 218 void PrerenderTracker::AddPrerenderOnIOThread(
173 const ChildRouteIdPair& child_route_id_pair) { 219 const ChildRouteIdPair& child_route_id_pair) {
174 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 220 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
175 DCHECK(!IsPrerenderingOnIOThread(child_route_id_pair.first, 221 DCHECK(!IsPrerenderingOnIOThread(child_route_id_pair.first,
176 child_route_id_pair.second)); 222 child_route_id_pair.second));
177 223
178 possibly_prerendering_io_thread_set_.insert(child_route_id_pair); 224 possibly_prerendering_io_thread_set_.insert(child_route_id_pair);
179 } 225 }
180 226
181 void PrerenderTracker::RemovePrerenderOnIOThread( 227 void PrerenderTracker::RemovePrerenderOnIOThread(
182 const ChildRouteIdPair& child_route_id_pair) { 228 const ChildRouteIdPair& child_route_id_pair) {
183 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 229 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
184 DCHECK(IsPrerenderingOnIOThread(child_route_id_pair.first, 230 DCHECK(IsPrerenderingOnIOThread(child_route_id_pair.first,
185 child_route_id_pair.second)); 231 child_route_id_pair.second));
186 232
187 possibly_prerendering_io_thread_set_.erase(child_route_id_pair); 233 possibly_prerendering_io_thread_set_.erase(child_route_id_pair);
188 } 234 }
189 235
190 // static 236 // static
191 void PrerenderTracker::AddPrerenderOnIOThreadTask( 237 void PrerenderTracker::AddPrerenderOnIOThreadTask(
192 const ChildRouteIdPair& child_route_id_pair) { 238 const ChildRouteIdPair& child_route_id_pair) {
193 GetInstance()->AddPrerenderOnIOThread(child_route_id_pair); 239 g_browser_process->prerender_tracker()->AddPrerenderOnIOThread(
240 child_route_id_pair);
194 } 241 }
195 242
196 // static 243 // static
197 void PrerenderTracker::RemovePrerenderOnIOThreadTask( 244 void PrerenderTracker::RemovePrerenderOnIOThreadTask(
198 const ChildRouteIdPair& child_route_id_pair) { 245 const ChildRouteIdPair& child_route_id_pair) {
199 GetInstance()->RemovePrerenderOnIOThread(child_route_id_pair); 246 g_browser_process->prerender_tracker()->RemovePrerenderOnIOThread(
247 child_route_id_pair);
200 } 248 }
201 249
202 } // namespace prerender 250 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698