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

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

Issue 7210020: Added prerendering to omnibox. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase again Created 9 years, 6 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 c2f0e0053d047b50117d8c777f7a4cb788f287ba..50a2bd1802f29863f5c35aadddcec95e4cec2f02 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -6,6 +6,7 @@
#include <string>
+#include "base/command_line.h"
#include "base/logging.h"
#include "base/metrics/field_trial.h"
#include "base/metrics/histogram.h"
@@ -22,6 +23,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper_delegate.h"
+#include "chrome/common/chrome_switches.h"
#include "chrome/common/render_messages.h"
#include "content/browser/browser_thread.h"
#include "content/browser/renderer_host/render_process_host.h"
@@ -205,11 +207,13 @@ struct PrerenderManager::NavigationRecord {
struct PrerenderManager::PendingContentsData {
PendingContentsData(const GURL& url,
- const GURL& referrer)
- : url_(url), referrer_(referrer) { }
+ const GURL& referrer,
+ Origin origin)
+ : url_(url), referrer_(referrer), origin_(origin) { }
~PendingContentsData() {}
GURL url_;
GURL referrer_;
+ Origin origin_;
};
void HandleTag(
@@ -227,10 +231,11 @@ void HandleTag(
std::pair<int, int> child_route_id_pair = std::make_pair(render_process_id,
render_view_id);
- prerender_manager->AddPreload(child_route_id_pair, url, referrer);
+ prerender_manager->AddPrerenderFromPage(ORIGIN_LINK_REL_PRERENDER,
+ child_route_id_pair, url, referrer);
}
-void DestroyPreloadForRenderView(
+void DestroyPrerenderForRenderView(
const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr,
int render_process_id,
int render_view_id,
@@ -240,7 +245,7 @@ void DestroyPreloadForRenderView(
if (!prerender_manager)
return;
- prerender_manager->DestroyPreloadForChildRouteIdPair(
+ prerender_manager->DestroyPrerenderForChildRouteIdPair(
std::make_pair(render_process_id, render_view_id),
final_status);
}
@@ -276,7 +281,8 @@ void PrerenderManager::SetPrerenderContentsFactory(
prerender_contents_factory_.reset(prerender_contents_factory);
}
-bool PrerenderManager::AddPreload(
+bool PrerenderManager::AddPrerenderFromPage(
+ Origin origin,
const std::pair<int, int>& child_route_id_pair,
const GURL& url_arg,
const GURL& referrer) {
@@ -285,7 +291,7 @@ bool PrerenderManager::AddPreload(
// If the referring page is prerendering, defer the prerender.
if (FindPrerenderContentsForChildRouteIdPair(child_route_id_pair) !=
prerender_list_.end()) {
- AddPendingPreload(child_route_id_pair, url_arg, referrer);
+ AddPendingPrerender(origin, child_route_id_pair, url_arg, referrer);
return true;
}
@@ -313,7 +319,7 @@ bool PrerenderManager::AddPreload(
// case, when a new tab is added to a process used for prerendering.
if (RenderProcessHost::ShouldTryToUseExistingProcessHost() &&
!RenderProcessHost::run_renderer_in_process()) {
- RecordFinalStatus(FINAL_STATUS_TOO_MANY_PROCESSES);
+ RecordFinalStatus(origin, FINAL_STATUS_TOO_MANY_PROCESSES);
return false;
}
@@ -322,7 +328,7 @@ bool PrerenderManager::AddPreload(
// Cancel the prerender. We could add it to the pending prerender list but
// this doesn't make sense as the next prerender request will be triggered
// by a navigation and is unlikely to be the same site.
- RecordFinalStatus(FINAL_STATUS_RATE_LIMIT_EXCEEDED);
+ RecordFinalStatus(origin, FINAL_STATUS_RATE_LIMIT_EXCEEDED);
return false;
}
@@ -335,13 +341,13 @@ bool PrerenderManager::AddPreload(
// 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()) {
- RecordFinalStatus(FINAL_STATUS_SOURCE_RENDER_VIEW_CLOSED);
+ RecordFinalStatus(origin, FINAL_STATUS_SOURCE_RENDER_VIEW_CLOSED);
return false;
}
}
PrerenderContents* prerender_contents =
- CreatePrerenderContents(url, referrer);
+ CreatePrerenderContents(url, referrer, origin);
if (!prerender_contents || !prerender_contents->Init())
return false;
@@ -349,6 +355,7 @@ bool PrerenderManager::AddPreload(
PrerenderContentsData data(prerender_contents, GetCurrentTime());
prerender_list_.push_back(data);
+
if (IsControlGroup()) {
data.contents_->set_final_status(FINAL_STATUS_CONTROL_GROUP);
} else {
@@ -364,7 +371,21 @@ bool PrerenderManager::AddPreload(
return true;
}
-void PrerenderManager::AddPendingPreload(
+bool PrerenderManager::AddPrerender(Origin origin, const GURL& url) {
+ bool should_prerender = true;
+ if (origin == ORIGIN_OMNIBOX) {
+ CommandLine* cl = CommandLine::ForCurrentProcess();
+ should_prerender = cl->HasSwitch(switches::kPrerenderFromOmnibox);
+ }
+
+ if (!should_prerender)
+ return false;
+
+ return AddPrerenderFromPage(origin, std::make_pair(-1, -1), url, GURL());
+}
+
+void PrerenderManager::AddPendingPrerender(
+ Origin origin,
const std::pair<int, int>& child_route_id_pair,
const GURL& url,
const GURL& referrer) {
@@ -378,7 +399,7 @@ void PrerenderManager::AddPendingPreload(
it = pending_prerender_list_.insert(el).first;
}
- it->second.push_back(PendingContentsData(url, referrer));
+ it->second.push_back(PendingContentsData(url, referrer, origin));
}
std::list<PrerenderManager::PrerenderContentsData>::iterator
@@ -403,7 +424,7 @@ std::list<PrerenderManager::PrerenderContentsData>::iterator
return it;
}
-void PrerenderManager::DestroyPreloadForChildRouteIdPair(
+void PrerenderManager::DestroyPrerenderForChildRouteIdPair(
const std::pair<int, int>& child_route_id_pair,
FinalStatus final_status) {
DCHECK(CalledOnValidThread());
@@ -453,9 +474,9 @@ PrerenderContents* PrerenderManager::GetEntry(const GURL& url) {
return GetEntryButNotSpecifiedTC(url, NULL);
}
-bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tab_contents,
- const GURL& url,
- bool has_opener_set) {
+bool PrerenderManager::MaybeUsePrerenderedPage(TabContents* tab_contents,
+ const GURL& url,
+ bool has_opener_set) {
DCHECK(CalledOnValidThread());
scoped_ptr<PrerenderContents> prerender_contents(
GetEntryButNotSpecifiedTC(url, tab_contents));
@@ -560,7 +581,8 @@ bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tab_contents,
for (std::vector<PendingContentsData>::iterator content_it =
pending_it->second.begin();
content_it != pending_it->second.end(); ++content_it) {
- AddPreload(pending_it->first, content_it->url_, content_it->referrer_);
+ AddPrerenderFromPage(content_it->origin_, pending_it->first,
+ content_it->url_, content_it->referrer_);
}
pending_prerender_list_.erase(pending_it);
}
@@ -588,7 +610,7 @@ void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry) {
it != prerender_list_.end();
++it) {
if (it->contents_ == entry) {
- RemovePendingPreload(entry);
+ RemovePendingPrerender(entry);
prerender_list_.erase(it);
break;
}
@@ -629,10 +651,11 @@ bool PrerenderManager::IsPrerenderElementFresh(const base::Time start) const {
PrerenderContents* PrerenderManager::CreatePrerenderContents(
const GURL& url,
- const GURL& referrer) {
+ const GURL& referrer,
+ Origin origin) {
DCHECK(CalledOnValidThread());
return prerender_contents_factory_->CreatePrerenderContents(
- this, prerender_tracker_, profile_, url, referrer);
+ this, prerender_tracker_, profile_, url, referrer, origin);
}
void PrerenderManager::DeletePendingDeleteEntries() {
@@ -772,7 +795,7 @@ void PrerenderManager::RecordTagObserved() {
last_prerender_seen_time_ = base::TimeTicks::Now();
}
-void PrerenderManager::RemovePendingPreload(PrerenderContents* entry) {
+void PrerenderManager::RemovePendingPrerender(PrerenderContents* entry) {
DCHECK(CalledOnValidThread());
int child_id;
int route_id;
« no previous file with comments | « chrome/browser/prerender/prerender_manager.h ('k') | chrome/browser/prerender/prerender_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698