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

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

Issue 6625066: Add pending preloads indexed by routing id. Start preloading once we navigate. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Responding to comments Created 9 years, 9 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 "base/logging.h" 7 #include "base/logging.h"
8 #include "base/metrics/histogram.h" 8 #include "base/metrics/histogram.h"
9 #include "base/time.h" 9 #include "base/time.h"
10 #include "base/utf_string_conversions.h" 10 #include "base/utf_string_conversions.h"
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 while (prerender_list_.size() > max_elements_) { 100 while (prerender_list_.size() > max_elements_) {
101 data = prerender_list_.front(); 101 data = prerender_list_.front();
102 prerender_list_.pop_front(); 102 prerender_list_.pop_front();
103 data.contents_->set_final_status(FINAL_STATUS_EVICTED); 103 data.contents_->set_final_status(FINAL_STATUS_EVICTED);
104 delete data.contents_; 104 delete data.contents_;
105 } 105 }
106 StartSchedulingPeriodicCleanups(); 106 StartSchedulingPeriodicCleanups();
107 return true; 107 return true;
108 } 108 }
109 109
110 void PrerenderManager::AddPendingPreload(int child_id, int route_id,
111 const GURL& url,
112 const std::vector<GURL>& alias_urls,
113 const GURL& referrer) {
114 pending_prerender_list_.push_back(PendingContentsData(child_id, route_id,
115 url, alias_urls, referrer));
116 }
117
110 void PrerenderManager::DeleteOldEntries() { 118 void PrerenderManager::DeleteOldEntries() {
111 while (!prerender_list_.empty()) { 119 while (!prerender_list_.empty()) {
112 PrerenderContentsData data = prerender_list_.front(); 120 PrerenderContentsData data = prerender_list_.front();
113 if (IsPrerenderElementFresh(data.start_time_)) 121 if (IsPrerenderElementFresh(data.start_time_))
114 return; 122 return;
115 prerender_list_.pop_front(); 123 prerender_list_.pop_front();
116 data.contents_->set_final_status(FINAL_STATUS_TIMED_OUT); 124 data.contents_->set_final_status(FINAL_STATUS_TIMED_OUT);
117 delete data.contents_; 125 delete data.contents_;
118 } 126 }
119 if (prerender_list_.empty()) 127 if (prerender_list_.empty())
(...skipping 28 matching lines...) Expand all
148 156
149 RenderViewHost* rvh = pc->render_view_host(); 157 RenderViewHost* rvh = pc->render_view_host();
150 // RenderViewHosts in PrerenderContents start out hidden. 158 // RenderViewHosts in PrerenderContents start out hidden.
151 // Since we are actually using it now, restore it. 159 // Since we are actually using it now, restore it.
152 rvh->WasRestored(); 160 rvh->WasRestored();
153 pc->set_render_view_host(NULL); 161 pc->set_render_view_host(NULL);
154 rvh->Send(new ViewMsg_DisplayPrerenderedPage(rvh->routing_id())); 162 rvh->Send(new ViewMsg_DisplayPrerenderedPage(rvh->routing_id()));
155 tc->SwapInRenderViewHost(rvh); 163 tc->SwapInRenderViewHost(rvh);
156 MarkTabContentsAsPrerendered(tc); 164 MarkTabContentsAsPrerendered(tc);
157 165
166 // See if we have any pending prerender requests for this routing id and start
167 // the preload if we do.
168 const int child_id = rvh->process()->id();
169 const int route_id = rvh->routing_id();
170 for (PendingPrerenderList::iterator pending_it =
171 pending_prerender_list_.begin();
172 pending_it != pending_prerender_list_.end();) {
173 if (pending_it->route_id_ == route_id &&
174 pending_it->child_id_ == child_id) {
175 AddPreload(pending_it->url_, pending_it->alias_urls_,
176 pending_it->referrer_);
177 pending_it = pending_prerender_list_.erase(pending_it);
178 } else
179 ++pending_it;
180 }
181
158 ViewHostMsg_FrameNavigate_Params* p = pc->navigate_params(); 182 ViewHostMsg_FrameNavigate_Params* p = pc->navigate_params();
159 if (p != NULL) 183 if (p != NULL)
160 tc->DidNavigate(rvh, *p); 184 tc->DidNavigate(rvh, *p);
161 185
162 string16 title = pc->title(); 186 string16 title = pc->title();
163 if (!title.empty()) 187 if (!title.empty())
164 tc->UpdateTitle(rvh, pc->page_id(), UTF16ToWideHack(title)); 188 tc->UpdateTitle(rvh, pc->page_id(), UTF16ToWideHack(title));
165 189
166 GURL icon_url = pc->icon_url(); 190 GURL icon_url = pc->icon_url();
167 if (!icon_url.is_empty()) 191 if (!icon_url.is_empty())
168 tc->fav_icon_helper().OnUpdateFavIconURL(pc->page_id(), icon_url); 192 tc->fav_icon_helper().OnUpdateFavIconURL(pc->page_id(), icon_url);
169 193
170 if (pc->has_stopped_loading()) 194 if (pc->has_stopped_loading())
171 tc->DidStopLoading(); 195 tc->DidStopLoading();
172 196
173 return true; 197 return true;
174 } 198 }
175 199
176 void PrerenderManager::RemoveEntry(PrerenderContents* entry) { 200 void PrerenderManager::RemoveEntry(PrerenderContents* entry) {
177 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 201 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
178 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin(); 202 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin();
179 it != prerender_list_.end(); 203 it != prerender_list_.end();
180 ++it) { 204 ++it) {
181 if (it->contents_ == entry) { 205 if (it->contents_ == entry) {
206 RemovePendingPreload(entry);
182 prerender_list_.erase(it); 207 prerender_list_.erase(it);
183 break; 208 break;
184 } 209 }
185 } 210 }
186 DeleteOldEntries(); 211 DeleteOldEntries();
187 } 212 }
188 213
189 base::Time PrerenderManager::GetCurrentTime() const { 214 base::Time PrerenderManager::GetCurrentTime() const {
190 return base::Time::Now(); 215 return base::Time::Now();
191 } 216 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 void PrerenderManager::RecordPrefetchTagObservedOnUIThread() { 285 void PrerenderManager::RecordPrefetchTagObservedOnUIThread() {
261 // Once we get here, we have to be on the UI thread. 286 // Once we get here, we have to be on the UI thread.
262 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 287 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
263 288
264 // If we observe multiple tags within the 30 second window, we will still 289 // If we observe multiple tags within the 30 second window, we will still
265 // reset the window to begin at the most recent occurrence, so that we will 290 // reset the window to begin at the most recent occurrence, so that we will
266 // always be in a window in the 30 seconds from each occurrence. 291 // always be in a window in the 30 seconds from each occurrence.
267 last_prefetch_seen_time_ = base::TimeTicks::Now(); 292 last_prefetch_seen_time_ = base::TimeTicks::Now();
268 } 293 }
269 294
295 void PrerenderManager::RemovePendingPreload(PrerenderContents* entry) {
296 RenderViewHost* rvh = entry->render_view_host();
297
298 // If the entry doesn't have a RenderViewHost then it didn't start
299 // prerendering and there shouldn't be any pending preloads to remove.
300 if (rvh == NULL)
301 return;
302
303 const int child_id = rvh->process()->id();
304 const int route_id = rvh->routing_id();
305 for (PendingPrerenderList::iterator it = pending_prerender_list_.begin();
306 it != pending_prerender_list_.end();) {
307 if (it->child_id_ == child_id && it->route_id_ == route_id)
308 it = pending_prerender_list_.erase(it);
309 else
310 ++it;
311 }
312 }
313
270 // static 314 // static
271 bool PrerenderManager::ShouldRecordWindowedPPLT() { 315 bool PrerenderManager::ShouldRecordWindowedPPLT() {
272 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 316 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
273 if (last_prefetch_seen_time_.is_null()) 317 if (last_prefetch_seen_time_.is_null())
274 return false; 318 return false;
275 base::TimeDelta elapsed_time = 319 base::TimeDelta elapsed_time =
276 base::TimeTicks::Now() - last_prefetch_seen_time_; 320 base::TimeTicks::Now() - last_prefetch_seen_time_;
277 return elapsed_time <= base::TimeDelta::FromSeconds(kWindowedPPLTSeconds); 321 return elapsed_time <= base::TimeDelta::FromSeconds(kWindowedPPLTSeconds);
278 } 322 }
279 323
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 358
315 void PrerenderManager::MarkTabContentsAsNotPrerendered(TabContents* tc) { 359 void PrerenderManager::MarkTabContentsAsNotPrerendered(TabContents* tc) {
316 prerendered_tc_set_.erase(tc); 360 prerendered_tc_set_.erase(tc);
317 } 361 }
318 362
319 bool PrerenderManager::IsTabContentsPrerendered(TabContents* tc) const { 363 bool PrerenderManager::IsTabContentsPrerendered(TabContents* tc) const {
320 return prerendered_tc_set_.count(tc) > 0; 364 return prerendered_tc_set_.count(tc) > 0;
321 } 365 }
322 366
323 } // namespace prerender 367 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698