Chromium Code Reviews| Index: chrome/browser/prerender/prerender_manager.cc |
| diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc |
| index d30bc9135c9e81f2c3f35701dae39a972a8a6b4c..9b9200b7b49659c4c24370a4ed66a154939e7c3a 100644 |
| --- a/chrome/browser/prerender/prerender_manager.cc |
| +++ b/chrome/browser/prerender/prerender_manager.cc |
| @@ -107,6 +107,22 @@ bool PrerenderManager::AddPreload(const GURL& url, |
| return true; |
| } |
| +void PrerenderManager::AddPendingPreload(int child_id, int route_id, |
|
cbentzel
2011/03/15 18:42:24
Why isn't this just a const-ref-pair? You are unpa
dominich
2011/03/15 20:41:14
Done.
|
| + const GURL& url, |
| + const std::vector<GURL>& alias_urls, |
| + const GURL& referrer) { |
| + std::pair<int,int> child_route_pair = std::make_pair(child_id, route_id); |
| + PendingPrerenderList::iterator it = |
| + pending_prerender_list_.find(child_route_pair); |
| + if (it == pending_prerender_list_.end()) { |
| + PendingPrerenderList::value_type el = std::make_pair(child_route_pair, |
| + std::vector<PendingContentsData>()); |
| + it = pending_prerender_list_.insert(el).first; |
| + } |
| + |
| + it->second.push_back(PendingContentsData(url, alias_urls, referrer)); |
| +} |
| + |
| void PrerenderManager::DeleteOldEntries() { |
| while (!prerender_list_.empty()) { |
| PrerenderContentsData data = prerender_list_.front(); |
| @@ -155,6 +171,22 @@ bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tc, const GURL& url) { |
| tc->SwapInRenderViewHost(rvh); |
| MarkTabContentsAsPrerendered(tc); |
| + // See if we have any pending prerender requests for this routing id and start |
| + // the preload if we do. |
| + std::pair<int, int> child_route_pair = std::make_pair(rvh->process()->id(), |
| + rvh->routing_id()); |
| + PendingPrerenderList::iterator pending_it = |
| + pending_prerender_list_.find(child_route_pair); |
| + if (pending_it != pending_prerender_list_.end()) { |
| + 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_, |
| + content_it->referrer_); |
| + } |
| + pending_prerender_list_.erase(pending_it); |
| + } |
| + |
| ViewHostMsg_FrameNavigate_Params* p = pc->navigate_params(); |
| if (p != NULL) |
| tc->DidNavigate(rvh, *p); |
| @@ -179,6 +211,7 @@ void PrerenderManager::RemoveEntry(PrerenderContents* entry) { |
| it != prerender_list_.end(); |
| ++it) { |
| if (it->contents_ == entry) { |
| + RemovePendingPreload(entry); |
| prerender_list_.erase(it); |
| break; |
| } |
| @@ -267,6 +300,19 @@ void PrerenderManager::RecordPrefetchTagObservedOnUIThread() { |
| last_prefetch_seen_time_ = base::TimeTicks::Now(); |
| } |
| +void PrerenderManager::RemovePendingPreload(PrerenderContents* entry) { |
| + RenderViewHost* rvh = entry->render_view_host(); |
| + |
| + // If the entry doesn't have a RenderViewHost then it didn't start |
| + // prerendering and there shouldn't be any pending preloads to remove. |
| + if (rvh == NULL) |
| + return; |
| + |
| + std::pair<int, int> child_route_pair = std::make_pair(rvh->process()->id(), |
| + rvh->routing_id()); |
| + pending_prerender_list_.erase(child_route_pair); |
| +} |
| + |
| // static |
| bool PrerenderManager::ShouldRecordWindowedPPLT() { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |