Chromium Code Reviews| Index: chrome/browser/prerender/prerender_manager.cc |
| =================================================================== |
| --- chrome/browser/prerender/prerender_manager.cc (revision 82104) |
| +++ chrome/browser/prerender/prerender_manager.cc (working copy) |
| @@ -134,9 +134,11 @@ |
| prerender_contents_factory_.reset(prerender_contents_factory); |
| } |
| -bool PrerenderManager::AddPreload(const GURL& url, |
| - const std::vector<GURL>& alias_urls, |
| - const GURL& referrer) { |
| +bool PrerenderManager::AddPreload( |
| + const std::pair<int, int>& child_route_id_pair, |
| + const GURL& url, |
| + const std::vector<GURL>& alias_urls, |
| + const GURL& referrer) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| DeleteOldEntries(); |
| if (FindEntry(url)) |
| @@ -177,6 +179,18 @@ |
| return false; |
| } |
| + RenderViewHost* source_render_view_host = NULL; |
| + // This test should fail only during unit tests. |
| + if (child_route_id_pair.first != -1) { |
| + source_render_view_host = |
| + RenderViewHost::FromID(child_route_id_pair.first, |
| + child_route_id_pair.second); |
| + // Don't prerender page if parent RenderViewHost no longer exists, or it has |
| + // no view. The latter should only happen when the RenderView has closed. |
|
cbentzel
2011/04/19 17:42:41
Is it possible to add a browser test [or at least
mmenke
2011/04/19 20:00:01
I'm not sure about a browser test using our curren
|
| + if (!source_render_view_host || !source_render_view_host->view()) |
| + return false; |
| + } |
| + |
| // TODO(cbentzel): Move invalid checks here instead of PrerenderContents? |
| PrerenderContentsData data(CreatePrerenderContents(url, all_alias_urls, |
| referrer), |
| @@ -187,7 +201,7 @@ |
| data.contents_->set_final_status(FINAL_STATUS_CONTROL_GROUP); |
| } else { |
| last_prerender_start_time_ = GetCurrentTimeTicks(); |
| - data.contents_->StartPrerendering(); |
| + data.contents_->StartPrerendering(source_render_view_host); |
| } |
| while (prerender_list_.size() > max_elements_) { |
| data = prerender_list_.front(); |
| @@ -200,7 +214,7 @@ |
| } |
| void PrerenderManager::AddPendingPreload( |
| - const std::pair<int,int>& child_route_id_pair, |
| + const std::pair<int, int>& child_route_id_pair, |
| const GURL& url, |
| const std::vector<GURL>& alias_urls, |
| const GURL& referrer) { |
| @@ -246,14 +260,20 @@ |
| } |
| void PrerenderManager::DeleteOldEntries() { |
| - while (!prerender_list_.empty()) { |
| - PrerenderContentsData data = prerender_list_.front(); |
| - if (IsPrerenderElementFresh(data.start_time_)) |
| - return; |
| - prerender_list_.pop_front(); |
| - data.contents_->set_final_status(FINAL_STATUS_TIMED_OUT); |
| - delete data.contents_; |
| + std::list<PrerenderContentsData>::iterator it = prerender_list_.begin(); |
| + while (it != prerender_list_.end()) { |
| + if (it->contents_->pending_final_status() != FINAL_STATUS_MAX) { |
| + it->contents_->set_final_status(it->contents_->pending_final_status()); |
| + } else if (!IsPrerenderElementFresh(it->start_time_)) { |
| + it->contents_->set_final_status(FINAL_STATUS_TIMED_OUT); |
| + } else { |
| + ++it; |
| + continue; |
| + } |
| + delete it->contents_; |
| + it = prerender_list_.erase(it); |
| } |
| + |
| if (prerender_list_.empty()) |
| StopSchedulingPeriodicCleanups(); |
| } |
| @@ -317,7 +337,7 @@ |
| for (std::vector<PendingContentsData>::iterator content_it = |
| pending_it->second.begin(); |
| content_it != pending_it->second.end(); ++content_it) { |
| - AddPreload(content_it->url_, content_it->alias_urls_, |
| + AddPreload(pending_it->first, content_it->url_, content_it->alias_urls_, |
| content_it->referrer_); |
| } |
| pending_prerender_list_.erase(pending_it); |