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

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: Clang fixes 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 route_id,
111 const GURL& url,
112 const std::vector<GURL>& alias_urls,
113 const GURL& referrer) {
114 DCHECK(pending_prerender_map_.find(route_id) == pending_prerender_map_.end());
cbentzel 2011/03/14 14:32:26 What if there are two <link rel="prefetch"> elemen
dominich 2011/03/14 17:47:15 Good catch. I can remove the DCHECK, but perhaps i
115
116 pending_prerender_map_.insert(
117 std::make_pair<int, PendingContentsData>(route_id,
118 PendingContentsData(url, alias_urls, referrer)));
119 }
120
110 void PrerenderManager::DeleteOldEntries() { 121 void PrerenderManager::DeleteOldEntries() {
111 while (!prerender_list_.empty()) { 122 while (!prerender_list_.empty()) {
112 PrerenderContentsData data = prerender_list_.front(); 123 PrerenderContentsData data = prerender_list_.front();
113 if (IsPrerenderElementFresh(data.start_time_)) 124 if (IsPrerenderElementFresh(data.start_time_))
114 return; 125 return;
115 prerender_list_.pop_front(); 126 prerender_list_.pop_front();
116 data.contents_->set_final_status(FINAL_STATUS_TIMED_OUT); 127 data.contents_->set_final_status(FINAL_STATUS_TIMED_OUT);
117 delete data.contents_; 128 delete data.contents_;
118 } 129 }
119 if (prerender_list_.empty()) 130 if (prerender_list_.empty())
(...skipping 28 matching lines...) Expand all
148 159
149 RenderViewHost* rvh = pc->render_view_host(); 160 RenderViewHost* rvh = pc->render_view_host();
150 // RenderViewHosts in PrerenderContents start out hidden. 161 // RenderViewHosts in PrerenderContents start out hidden.
151 // Since we are actually using it now, restore it. 162 // Since we are actually using it now, restore it.
152 rvh->WasRestored(); 163 rvh->WasRestored();
153 pc->set_render_view_host(NULL); 164 pc->set_render_view_host(NULL);
154 rvh->Send(new ViewMsg_DisplayPrerenderedPage(rvh->routing_id())); 165 rvh->Send(new ViewMsg_DisplayPrerenderedPage(rvh->routing_id()));
155 tc->SwapInRenderViewHost(rvh); 166 tc->SwapInRenderViewHost(rvh);
156 tc->set_was_prerendered(true); 167 tc->set_was_prerendered(true);
157 168
169 // See if we have any pending prerender requests for this routing id and start
170 // the preload if we do.
171 std::map<int, PendingContentsData>::iterator pending_it =
172 pending_prerender_map_.find(rvh->routing_id());
173 if (pending_it != pending_prerender_map_.end()) {
174 const PendingContentsData& data = pending_it->second;
175 AddPreload(data.url_, data.alias_urls_, data.referrer_);
176 pending_prerender_map_.erase(pending_it);
177 }
178
158 ViewHostMsg_FrameNavigate_Params* p = pc->navigate_params(); 179 ViewHostMsg_FrameNavigate_Params* p = pc->navigate_params();
159 if (p != NULL) 180 if (p != NULL)
160 tc->DidNavigate(rvh, *p); 181 tc->DidNavigate(rvh, *p);
161 182
162 string16 title = pc->title(); 183 string16 title = pc->title();
163 if (!title.empty()) 184 if (!title.empty())
164 tc->UpdateTitle(rvh, pc->page_id(), UTF16ToWideHack(title)); 185 tc->UpdateTitle(rvh, pc->page_id(), UTF16ToWideHack(title));
165 186
166 GURL icon_url = pc->icon_url(); 187 GURL icon_url = pc->icon_url();
167 if (!icon_url.is_empty()) 188 if (!icon_url.is_empty())
168 tc->fav_icon_helper().OnUpdateFavIconURL(pc->page_id(), icon_url); 189 tc->fav_icon_helper().OnUpdateFavIconURL(pc->page_id(), icon_url);
169 190
170 if (pc->has_stopped_loading()) 191 if (pc->has_stopped_loading())
171 tc->DidStopLoading(); 192 tc->DidStopLoading();
172 193
173 return true; 194 return true;
174 } 195 }
175 196
176 void PrerenderManager::RemoveEntry(PrerenderContents* entry) { 197 void PrerenderManager::RemoveEntry(PrerenderContents* entry) {
177 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 198 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
178 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin(); 199 for (std::list<PrerenderContentsData>::iterator it = prerender_list_.begin();
179 it != prerender_list_.end(); 200 it != prerender_list_.end();
180 ++it) { 201 ++it) {
181 if (it->contents_ == entry) { 202 if (it->contents_ == entry) {
203 RemovePendingPreload(entry);
182 prerender_list_.erase(it); 204 prerender_list_.erase(it);
183 break; 205 break;
184 } 206 }
185 } 207 }
186 DeleteOldEntries(); 208 DeleteOldEntries();
187 } 209 }
188 210
189 base::Time PrerenderManager::GetCurrentTime() const { 211 base::Time PrerenderManager::GetCurrentTime() const {
190 return base::Time::Now(); 212 return base::Time::Now();
191 } 213 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 void PrerenderManager::RecordPrefetchTagObservedOnUIThread() { 282 void PrerenderManager::RecordPrefetchTagObservedOnUIThread() {
261 // Once we get here, we have to be on the UI thread. 283 // Once we get here, we have to be on the UI thread.
262 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 284 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
263 285
264 // If we observe multiple tags within the 30 second window, we will still 286 // 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 287 // 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. 288 // always be in a window in the 30 seconds from each occurrence.
267 last_prefetch_seen_time_ = base::TimeTicks::Now(); 289 last_prefetch_seen_time_ = base::TimeTicks::Now();
268 } 290 }
269 291
292 void PrerenderManager::RemovePendingPreload(PrerenderContents* entry) {
293 RenderViewHost* rvh = entry->render_view_host();
294
295 // If the entry doesn't have a RenderViewHost then it didn't start
296 // prerendering and there shouldn't be any pending preloads to remove.
297 if (rvh == NULL)
298 return;
299
300 int route_id = rvh->routing_id();
301 std::map<int, PendingContentsData>::iterator it =
302 pending_prerender_map_.find(route_id);
303 if (it != pending_prerender_map_.end())
304 pending_prerender_map_.erase(it);
305 }
306
270 // static 307 // static
271 bool PrerenderManager::ShouldRecordWindowedPPLT() { 308 bool PrerenderManager::ShouldRecordWindowedPPLT() {
272 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 309 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
273 if (last_prefetch_seen_time_.is_null()) 310 if (last_prefetch_seen_time_.is_null())
274 return false; 311 return false;
275 base::TimeDelta elapsed_time = 312 base::TimeDelta elapsed_time =
276 base::TimeTicks::Now() - last_prefetch_seen_time_; 313 base::TimeTicks::Now() - last_prefetch_seen_time_;
277 return elapsed_time <= base::TimeDelta::FromSeconds(kWindowedPPLTSeconds); 314 return elapsed_time <= base::TimeDelta::FromSeconds(kWindowedPPLTSeconds);
278 } 315 }
279 316
(...skipping 22 matching lines...) Expand all
302 } 339 }
303 for (std::vector<PrerenderContents*>::iterator it = 340 for (std::vector<PrerenderContents*>::iterator it =
304 prerender_contents.begin(); 341 prerender_contents.begin();
305 it != prerender_contents.end(); 342 it != prerender_contents.end();
306 ++it) { 343 ++it) {
307 (*it)->DestroyWhenUsingTooManyResources(); 344 (*it)->DestroyWhenUsingTooManyResources();
308 } 345 }
309 } 346 }
310 347
311 } // namespace prerender 348 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698