Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |