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