Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2185)

Unified Diff: chrome/browser/prerender/prerender_manager.cc

Issue 6625066: Add pending preloads indexed by routing id. Start preloading once we navigate. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Clang fixes Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/prerender/prerender_manager.cc
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index f857c70a64fc0eb6bddb6822d2d883bf76eb7d0c..30edf7dc55ca51af91c868022c45b667e0abc3a3 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -107,6 +107,17 @@ bool PrerenderManager::AddPreload(const GURL& url,
return true;
}
+void PrerenderManager::AddPendingPreload(int route_id,
+ const GURL& url,
+ const std::vector<GURL>& alias_urls,
+ const GURL& referrer) {
+ DCHECK(pending_prerender_map_.find(route_id) == pending_prerender_map_.end());
cbentzel 2011/03/14 14:32:26 What if there are two <link rel="prefetch"> elemen
dominich 2011/03/14 17:47:15 Good catch. I can remove the DCHECK, but perhaps i
+
+ pending_prerender_map_.insert(
+ std::make_pair<int, PendingContentsData>(route_id,
+ PendingContentsData(url, alias_urls, referrer)));
+}
+
void PrerenderManager::DeleteOldEntries() {
while (!prerender_list_.empty()) {
PrerenderContentsData data = prerender_list_.front();
@@ -155,6 +166,16 @@ bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tc, const GURL& url) {
tc->SwapInRenderViewHost(rvh);
tc->set_was_prerendered(true);
+ // See if we have any pending prerender requests for this routing id and start
+ // the preload if we do.
+ std::map<int, PendingContentsData>::iterator pending_it =
+ pending_prerender_map_.find(rvh->routing_id());
+ if (pending_it != pending_prerender_map_.end()) {
+ const PendingContentsData& data = pending_it->second;
+ AddPreload(data.url_, data.alias_urls_, data.referrer_);
+ pending_prerender_map_.erase(pending_it);
+ }
+
ViewHostMsg_FrameNavigate_Params* p = pc->navigate_params();
if (p != NULL)
tc->DidNavigate(rvh, *p);
@@ -179,6 +200,7 @@ void PrerenderManager::RemoveEntry(PrerenderContents* entry) {
it != prerender_list_.end();
++it) {
if (it->contents_ == entry) {
+ RemovePendingPreload(entry);
prerender_list_.erase(it);
break;
}
@@ -267,6 +289,21 @@ 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;
+
+ int route_id = rvh->routing_id();
+ std::map<int, PendingContentsData>::iterator it =
+ pending_prerender_map_.find(route_id);
+ if (it != pending_prerender_map_.end())
+ pending_prerender_map_.erase(it);
+}
+
// static
bool PrerenderManager::ShouldRecordWindowedPPLT() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));

Powered by Google App Engine
This is Rietveld 408576698