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

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: Added browser test for multiple referenced prerenders and responded 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,
cbentzel 2011/03/15 18:42:24 Why isn't this just a const-ref-pair? You are unpa
dominich 2011/03/15 20:41:14 Done.
111 const GURL& url,
112 const std::vector<GURL>& alias_urls,
113 const GURL& referrer) {
114 std::pair<int,int> child_route_pair = std::make_pair(child_id, route_id);
115 PendingPrerenderList::iterator it =
116 pending_prerender_list_.find(child_route_pair);
117 if (it == pending_prerender_list_.end()) {
118 PendingPrerenderList::value_type el = std::make_pair(child_route_pair,
119 std::vector<PendingContentsData>());
120 it = pending_prerender_list_.insert(el).first;
121 }
122
123 it->second.push_back(PendingContentsData(url, alias_urls, referrer));
124 }
125
110 void PrerenderManager::DeleteOldEntries() { 126 void PrerenderManager::DeleteOldEntries() {
111 while (!prerender_list_.empty()) { 127 while (!prerender_list_.empty()) {
112 PrerenderContentsData data = prerender_list_.front(); 128 PrerenderContentsData data = prerender_list_.front();
113 if (IsPrerenderElementFresh(data.start_time_)) 129 if (IsPrerenderElementFresh(data.start_time_))
114 return; 130 return;
115 prerender_list_.pop_front(); 131 prerender_list_.pop_front();
116 data.contents_->set_final_status(FINAL_STATUS_TIMED_OUT); 132 data.contents_->set_final_status(FINAL_STATUS_TIMED_OUT);
117 delete data.contents_; 133 delete data.contents_;
118 } 134 }
119 if (prerender_list_.empty()) 135 if (prerender_list_.empty())
(...skipping 28 matching lines...) Expand all
148 164
149 RenderViewHost* rvh = pc->render_view_host(); 165 RenderViewHost* rvh = pc->render_view_host();
150 // RenderViewHosts in PrerenderContents start out hidden. 166 // RenderViewHosts in PrerenderContents start out hidden.
151 // Since we are actually using it now, restore it. 167 // Since we are actually using it now, restore it.
152 rvh->WasRestored(); 168 rvh->WasRestored();
153 pc->set_render_view_host(NULL); 169 pc->set_render_view_host(NULL);
154 rvh->Send(new ViewMsg_DisplayPrerenderedPage(rvh->routing_id())); 170 rvh->Send(new ViewMsg_DisplayPrerenderedPage(rvh->routing_id()));
155 tc->SwapInRenderViewHost(rvh); 171 tc->SwapInRenderViewHost(rvh);
156 MarkTabContentsAsPrerendered(tc); 172 MarkTabContentsAsPrerendered(tc);
157 173
174 // See if we have any pending prerender requests for this routing id and start
175 // the preload if we do.
176 std::pair<int, int> child_route_pair = std::make_pair(rvh->process()->id(),
177 rvh->routing_id());
178 PendingPrerenderList::iterator pending_it =
179 pending_prerender_list_.find(child_route_pair);
180 if (pending_it != pending_prerender_list_.end()) {
181 for (std::vector<PendingContentsData>::iterator content_it =
182 pending_it->second.begin();
183 content_it != pending_it->second.end(); ++content_it) {
184 AddPreload(content_it->url_, content_it->alias_urls_,
185 content_it->referrer_);
186 }
187 pending_prerender_list_.erase(pending_it);
188 }
189
158 ViewHostMsg_FrameNavigate_Params* p = pc->navigate_params(); 190 ViewHostMsg_FrameNavigate_Params* p = pc->navigate_params();
159 if (p != NULL) 191 if (p != NULL)
160 tc->DidNavigate(rvh, *p); 192 tc->DidNavigate(rvh, *p);
161 193
162 string16 title = pc->title(); 194 string16 title = pc->title();
163 if (!title.empty()) 195 if (!title.empty())
164 tc->UpdateTitle(rvh, pc->page_id(), UTF16ToWideHack(title)); 196 tc->UpdateTitle(rvh, pc->page_id(), UTF16ToWideHack(title));
165 197
166 GURL icon_url = pc->icon_url(); 198 GURL icon_url = pc->icon_url();
167 if (!icon_url.is_empty()) 199 if (!icon_url.is_empty())
168 tc->fav_icon_helper().OnUpdateFavIconURL(pc->page_id(), icon_url); 200 tc->fav_icon_helper().OnUpdateFavIconURL(pc->page_id(), icon_url);
169 201
170 if (pc->has_stopped_loading()) 202 if (pc->has_stopped_loading())
171 tc->DidStopLoading(); 203 tc->DidStopLoading();
172 204
173 return true; 205 return true;
174 } 206 }
175 207
176 void PrerenderManager::RemoveEntry(PrerenderContents* entry) { 208 void PrerenderManager::RemoveEntry(PrerenderContents* entry) {
177 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 209 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
178 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin(); 210 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin();
179 it != prerender_list_.end(); 211 it != prerender_list_.end();
180 ++it) { 212 ++it) {
181 if (it->contents_ == entry) { 213 if (it->contents_ == entry) {
214 RemovePendingPreload(entry);
182 prerender_list_.erase(it); 215 prerender_list_.erase(it);
183 break; 216 break;
184 } 217 }
185 } 218 }
186 DeleteOldEntries(); 219 DeleteOldEntries();
187 } 220 }
188 221
189 base::Time PrerenderManager::GetCurrentTime() const { 222 base::Time PrerenderManager::GetCurrentTime() const {
190 return base::Time::Now(); 223 return base::Time::Now();
191 } 224 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 void PrerenderManager::RecordPrefetchTagObservedOnUIThread() { 293 void PrerenderManager::RecordPrefetchTagObservedOnUIThread() {
261 // Once we get here, we have to be on the UI thread. 294 // Once we get here, we have to be on the UI thread.
262 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 295 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
263 296
264 // If we observe multiple tags within the 30 second window, we will still 297 // 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 298 // 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. 299 // always be in a window in the 30 seconds from each occurrence.
267 last_prefetch_seen_time_ = base::TimeTicks::Now(); 300 last_prefetch_seen_time_ = base::TimeTicks::Now();
268 } 301 }
269 302
303 void PrerenderManager::RemovePendingPreload(PrerenderContents* entry) {
304 RenderViewHost* rvh = entry->render_view_host();
305
306 // If the entry doesn't have a RenderViewHost then it didn't start
307 // prerendering and there shouldn't be any pending preloads to remove.
308 if (rvh == NULL)
309 return;
310
311 std::pair<int, int> child_route_pair = std::make_pair(rvh->process()->id(),
312 rvh->routing_id());
313 pending_prerender_list_.erase(child_route_pair);
314 }
315
270 // static 316 // static
271 bool PrerenderManager::ShouldRecordWindowedPPLT() { 317 bool PrerenderManager::ShouldRecordWindowedPPLT() {
272 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 318 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
273 if (last_prefetch_seen_time_.is_null()) 319 if (last_prefetch_seen_time_.is_null())
274 return false; 320 return false;
275 base::TimeDelta elapsed_time = 321 base::TimeDelta elapsed_time =
276 base::TimeTicks::Now() - last_prefetch_seen_time_; 322 base::TimeTicks::Now() - last_prefetch_seen_time_;
277 return elapsed_time <= base::TimeDelta::FromSeconds(kWindowedPPLTSeconds); 323 return elapsed_time <= base::TimeDelta::FromSeconds(kWindowedPPLTSeconds);
278 } 324 }
279 325
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 360
315 void PrerenderManager::MarkTabContentsAsNotPrerendered(TabContents* tc) { 361 void PrerenderManager::MarkTabContentsAsNotPrerendered(TabContents* tc) {
316 prerendered_tc_set_.erase(tc); 362 prerendered_tc_set_.erase(tc);
317 } 363 }
318 364
319 bool PrerenderManager::IsTabContentsPrerendered(TabContents* tc) const { 365 bool PrerenderManager::IsTabContentsPrerendered(TabContents* tc) const {
320 return prerendered_tc_set_.count(tc) > 0; 366 return prerendered_tc_set_.count(tc) > 0;
321 } 367 }
322 368
323 } // namespace prerender 369 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698