| 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.
|
| + 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);
|
|
|