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

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

Issue 7077009: Handle AddPreload/AddPendingPreload on UI thread. (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 "chrome/browser/prerender/prerender_manager.h" 5 #include "chrome/browser/prerender/prerender_manager.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/metrics/field_trial.h" 10 #include "base/metrics/field_trial.h"
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 ~PendingContentsData() {} 166 ~PendingContentsData() {}
167 GURL url_; 167 GURL url_;
168 GURL referrer_; 168 GURL referrer_;
169 }; 169 };
170 170
171 void HandleTag( 171 void HandleTag(
172 const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr, 172 const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr,
173 int render_process_id, 173 int render_process_id,
174 int render_view_id, 174 int render_view_id,
175 const GURL& url, 175 const GURL& url,
176 const GURL& referrer, 176 const GURL& referrer) {
177 bool make_pending) {
178 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 177 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
179 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get(); 178 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get();
180 if (!prerender_manager || !prerender_manager->is_enabled()) 179 if (!prerender_manager || !prerender_manager->is_enabled())
181 return; 180 return;
182 prerender_manager->RecordTagObserved(); 181 prerender_manager->RecordTagObserved();
183 182
184 std::pair<int, int> child_route_id_pair = std::make_pair(render_process_id, 183 std::pair<int, int> child_route_id_pair = std::make_pair(render_process_id,
185 render_view_id); 184 render_view_id);
186 // TODO(cbentzel): Should the decision to make pending be done on the 185
187 // UI thread rather than the IO thread? The page may have 186 prerender_manager->AddPreload(child_route_id_pair, url, referrer);
188 // become activated at this point.
189 if (make_pending)
190 prerender_manager->AddPendingPreload(child_route_id_pair, url, referrer);
191 else
192 prerender_manager->AddPreload(child_route_id_pair, url, referrer);
193 } 187 }
194 188
195 void DestroyPreloadForRenderView( 189 void DestroyPreloadForRenderView(
196 const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr, 190 const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr,
197 int render_process_id, 191 int render_process_id,
198 int render_view_id, 192 int render_view_id,
199 FinalStatus final_status) { 193 FinalStatus final_status) {
200 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 194 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
201 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get(); 195 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get();
202 if (!prerender_manager) 196 if (!prerender_manager)
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 PrerenderContents::Factory* prerender_contents_factory) { 235 PrerenderContents::Factory* prerender_contents_factory) {
242 DCHECK(CalledOnValidThread()); 236 DCHECK(CalledOnValidThread());
243 prerender_contents_factory_.reset(prerender_contents_factory); 237 prerender_contents_factory_.reset(prerender_contents_factory);
244 } 238 }
245 239
246 bool PrerenderManager::AddPreload( 240 bool PrerenderManager::AddPreload(
247 const std::pair<int, int>& child_route_id_pair, 241 const std::pair<int, int>& child_route_id_pair,
248 const GURL& url_arg, 242 const GURL& url_arg,
249 const GURL& referrer) { 243 const GURL& referrer) {
250 DCHECK(CalledOnValidThread()); 244 DCHECK(CalledOnValidThread());
245
246 // If the referring page is prerendering, defer the prerender.
247 if (FindPrerenderContentsForChildRouteIdPair(child_route_id_pair) !=
248 prerender_list_.end()) {
249 AddPendingPreload(child_route_id_pair, url_arg, referrer);
250 return true;
251 }
252
251 DeleteOldEntries(); 253 DeleteOldEntries();
252 DeletePendingDeleteEntries(); 254 DeletePendingDeleteEntries();
253 255
254 GURL url = url_arg; 256 GURL url = url_arg;
255 GURL alias_url; 257 GURL alias_url;
256 if (IsControlGroup() && 258 if (IsControlGroup() &&
257 PrerenderManager::MaybeGetQueryStringBasedAliasURL( 259 PrerenderManager::MaybeGetQueryStringBasedAliasURL(
258 url, &alias_url)) { 260 url, &alias_url)) {
259 url = alias_url; 261 url = alias_url;
260 } 262 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 data.contents_->Destroy(FINAL_STATUS_EVICTED); 322 data.contents_->Destroy(FINAL_STATUS_EVICTED);
321 } 323 }
322 StartSchedulingPeriodicCleanups(); 324 StartSchedulingPeriodicCleanups();
323 return true; 325 return true;
324 } 326 }
325 327
326 void PrerenderManager::AddPendingPreload( 328 void PrerenderManager::AddPendingPreload(
327 const std::pair<int, int>& child_route_id_pair, 329 const std::pair<int, int>& child_route_id_pair,
328 const GURL& url, 330 const GURL& url,
329 const GURL& referrer) { 331 const GURL& referrer) {
330 DCHECK(CalledOnValidThread()); 332 DCHECK(FindPrerenderContentsForChildRouteIdPair(child_route_id_pair) !=
331 // Check if this is coming from a valid prerender RenderViewHost. 333 prerender_list_.end());
332 bool is_valid_prerender =
333 (FindPrerenderContentsForChildRouteIdPair(child_route_id_pair) !=
334 prerender_list_.end());
335
336 // If not, we could check to see if the RenderViewHost specified by the
337 // child_route_id_pair exists and if so just start prerendering, as this
338 // suggests that the link was clicked, though this might prerender something
339 // that the user has already navigated away from. For now, we'll be
340 // conservative and skip the prerender which will mean some prerender requests
341 // from prerendered pages will be missed if the user navigates quickly.
342 if (!is_valid_prerender) {
343 RecordFinalStatus(FINAL_STATUS_PENDING_SKIPPED);
344 return;
345 }
346
347 PendingPrerenderList::iterator it = 334 PendingPrerenderList::iterator it =
348 pending_prerender_list_.find(child_route_id_pair); 335 pending_prerender_list_.find(child_route_id_pair);
349 if (it == pending_prerender_list_.end()) { 336 if (it == pending_prerender_list_.end()) {
350 PendingPrerenderList::value_type el = std::make_pair(child_route_id_pair, 337 PendingPrerenderList::value_type el = std::make_pair(child_route_id_pair,
351 std::vector<PendingContentsData>()); 338 std::vector<PendingContentsData>());
352 it = pending_prerender_list_.insert(el).first; 339 it = pending_prerender_list_.insert(el).first;
353 } 340 }
354 341
355 it->second.push_back(PendingContentsData(url, referrer)); 342 it->second.push_back(PendingContentsData(url, referrer));
356 } 343 }
(...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 base::TimeTicks cutoff = GetCurrentTimeTicks() - 999 base::TimeTicks cutoff = GetCurrentTimeTicks() -
1013 base::TimeDelta::FromMilliseconds(kNavigationRecordWindowMs); 1000 base::TimeDelta::FromMilliseconds(kNavigationRecordWindowMs);
1014 while (!navigations_.empty()) { 1001 while (!navigations_.empty()) {
1015 if (navigations_.front().time_ > cutoff) 1002 if (navigations_.front().time_ > cutoff)
1016 break; 1003 break;
1017 navigations_.pop_front(); 1004 navigations_.pop_front();
1018 } 1005 }
1019 } 1006 }
1020 1007
1021 } // namespace prerender 1008 } // namespace prerender
OLDNEW
« no previous file with comments | « chrome/browser/prerender/prerender_manager.h ('k') | chrome/browser/prerender/prerender_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698