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