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..98cc27c7dbfe7c323778004bce872df57313c18d 100644 |
--- a/chrome/browser/prerender/prerender_manager.cc |
+++ b/chrome/browser/prerender/prerender_manager.cc |
@@ -107,6 +107,14 @@ bool PrerenderManager::AddPreload(const GURL& url, |
return true; |
} |
+void PrerenderManager::AddPendingPreload(int child_id, int route_id, |
+ const GURL& url, |
+ const std::vector<GURL>& alias_urls, |
+ const GURL& referrer) { |
+ pending_prerender_list_.push_back(PendingContentsData(child_id, route_id, |
+ url, alias_urls, referrer)); |
+} |
+ |
void PrerenderManager::DeleteOldEntries() { |
while (!prerender_list_.empty()) { |
PrerenderContentsData data = prerender_list_.front(); |
@@ -155,6 +163,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. |
+ const int child_id = rvh->process()->id(); |
+ const int route_id = rvh->routing_id(); |
+ for (PendingPrerenderList::iterator pending_it = |
+ pending_prerender_list_.begin(); |
+ pending_it != pending_prerender_list_.end();) { |
+ if (pending_it->route_id_ == route_id && |
+ pending_it->child_id_ == child_id) { |
+ AddPreload(pending_it->url_, pending_it->alias_urls_, |
+ pending_it->referrer_); |
+ pending_it = pending_prerender_list_.erase(pending_it); |
+ } else |
+ ++pending_it; |
+ } |
+ |
ViewHostMsg_FrameNavigate_Params* p = pc->navigate_params(); |
if (p != NULL) |
tc->DidNavigate(rvh, *p); |
@@ -179,6 +203,7 @@ void PrerenderManager::RemoveEntry(PrerenderContents* entry) { |
it != prerender_list_.end(); |
++it) { |
if (it->contents_ == entry) { |
+ RemovePendingPreload(entry); |
prerender_list_.erase(it); |
break; |
} |
@@ -267,6 +292,25 @@ 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; |
+ |
+ const int child_id = rvh->process()->id(); |
+ const int route_id = rvh->routing_id(); |
+ for (PendingPrerenderList::iterator it = pending_prerender_list_.begin(); |
+ it != pending_prerender_list_.end();) { |
+ if (it->child_id_ == child_id && it->route_id_ == route_id) |
+ it = pending_prerender_list_.erase(it); |
+ else |
+ ++it; |
+ } |
+} |
+ |
// static |
bool PrerenderManager::ShouldRecordWindowedPPLT() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |