summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authordominich@chromium.org <dominich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-24 17:55:40 +0000
committerdominich@chromium.org <dominich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-24 17:55:40 +0000
commit81a6b0b57290b80a5cc292b1ee293feda5123c66 (patch)
treee9834f31216cd224d5f5eb916a19817987990940 /chrome
parent380f60794c703ca3647b8048bad5aaa0abfc87c6 (diff)
downloadchromium_src-81a6b0b57290b80a5cc292b1ee293feda5123c66.zip
chromium_src-81a6b0b57290b80a5cc292b1ee293feda5123c66.tar.gz
chromium_src-81a6b0b57290b80a5cc292b1ee293feda5123c66.tar.bz2
Added prerendering to omnibox. Enable through --prerender-from-omnibox command-line-flag or through the about:flag with the same name. Only effective if prerender is enabled and instant is disabled or restricted to search.
BUG=87124 TEST=none Review URL: http://codereview.chromium.org/7210020 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90384 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/app/generated_resources.grd6
-rw-r--r--chrome/browser/about_flags.cc7
-rw-r--r--chrome/browser/autocomplete/autocomplete_edit.cc46
-rw-r--r--chrome/browser/autocomplete/autocomplete_edit.h9
-rw-r--r--chrome/browser/instant/instant_controller.cc37
-rw-r--r--chrome/browser/instant/instant_controller.h18
-rw-r--r--chrome/browser/prerender/prerender_browsertest.cc5
-rw-r--r--chrome/browser/prerender/prerender_contents.cc59
-rw-r--r--chrome/browser/prerender/prerender_contents.h9
-rw-r--r--chrome/browser/prerender/prerender_final_status.cc17
-rw-r--r--chrome/browser/prerender/prerender_final_status.h4
-rw-r--r--chrome/browser/prerender/prerender_manager.cc67
-rw-r--r--chrome/browser/prerender/prerender_manager.h44
-rw-r--r--chrome/browser/prerender/prerender_manager_unittest.cc79
-rw-r--r--chrome/browser/prerender/prerender_observer.cc12
-rw-r--r--chrome/browser/prerender/prerender_observer.h2
-rw-r--r--chrome/browser/prerender/prerender_origin.cc30
-rw-r--r--chrome/browser/prerender/prerender_origin.h23
-rw-r--r--chrome/browser/prerender/prerender_tracker.cc2
-rw-r--r--chrome/browser/prerender/prerender_tracker_unittest.cc16
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/common/chrome_switches.cc4
-rw-r--r--chrome/common/chrome_switches.h1
23 files changed, 336 insertions, 163 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index f79e43a0a..e0cb65b 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -4348,6 +4348,12 @@ Keep your key file in a safe place. You will need it to create new versions of y
<message name="IDS_FLAGS_SYNC_TYPED_URLS_DESCRIPTION" desc="Description for the flag to enable syncing the TypedURL datatype">
Enable typed URLs in the sync options. This allows syncing your typed URL history to other clients to assist in omnibox auto-completion.
</message>
+ <message name="IDS_FLAGS_PRERENDER_FROM_OMNIBOX_NAME" desc="Title for the flag to prerender from the omnibox">
+ Prerender from omnibox.
+ </message>
+ <message name="IDS_FLAGS_PRERENDER_FROM_OMNIBOX_DESCRIPTION" desc="Description for the flag to prerender from the omnibox">
+ Prerender suggestions given in the omnibox.
+ </message>
<!-- Crashes -->
<message name="IDS_CRASHES_TITLE" desc="Title for the chrome://crashes page.">
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 75f9d66..eeeeca3 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -376,6 +376,13 @@ const Experiment kExperiments[] = {
#endif
SINGLE_VALUE_TYPE(switches::kEnableSmoothScrolling)
},
+ {
+ "prerender-from-omnibox",
+ IDS_FLAGS_PRERENDER_FROM_OMNIBOX_NAME,
+ IDS_FLAGS_PRERENDER_FROM_OMNIBOX_DESCRIPTION,
+ kOsAll,
+ SINGLE_VALUE_TYPE(switches::kPrerenderFromOmnibox)
+ },
};
const Experiment* experiments = kExperiments;
diff --git a/chrome/browser/autocomplete/autocomplete_edit.cc b/chrome/browser/autocomplete/autocomplete_edit.cc
index eb6c6a7..8c6eb8f 100644
--- a/chrome/browser/autocomplete/autocomplete_edit.cc
+++ b/chrome/browser/autocomplete/autocomplete_edit.cc
@@ -23,6 +23,7 @@
#include "chrome/browser/instant/instant_controller.h"
#include "chrome/browser/net/predictor_api.h"
#include "chrome/browser/net/url_fixer_upper.h"
+#include "chrome/browser/prerender/prerender_manager.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search_engines/template_url.h"
#include "chrome/browser/search_engines/template_url_service.h"
@@ -79,7 +80,7 @@ AutocompleteEditModel::AutocompleteEditModel(
control_key_state_(UP),
is_keyword_hint_(false),
profile_(profile),
- update_instant_(true),
+ in_revert_(false),
allow_exact_keyword_match_(false),
instant_complete_behavior_(INSTANT_COMPLETE_DELAYED) {
}
@@ -213,22 +214,33 @@ void AutocompleteEditModel::OnChanged() {
string16 suggested_text;
TabContentsWrapper* tab = controller_->GetTabContentsWrapper();
bool might_support_instant = false;
- if (update_instant_ && instant && tab) {
- if (user_input_in_progress() && popup_->IsOpen()) {
- AutocompleteMatch current_match = CurrentMatch();
- if (current_match.destination_url == PermanentURL()) {
- // The destination is the same as the current url. This typically
- // happens if the user presses the down error in the omnibox, in which
- // case we don't want to load a preview.
- instant->DestroyPreviewContentsAndLeaveActive();
+ if (!in_revert_ && tab) {
+ if (instant) {
+ if (user_input_in_progress() && popup_->IsOpen()) {
+ AutocompleteMatch current_match = CurrentMatch();
+ if (current_match.destination_url == PermanentURL()) {
+ // The destination is the same as the current url. This typically
+ // happens if the user presses the down error in the omnibox, in which
+ // case we don't want to load a preview.
+ instant->DestroyPreviewContentsAndLeaveActive();
+ } else {
+ instant->Update(tab, current_match, view_->GetText(),
+ UseVerbatimInstant(), &suggested_text);
+ }
} else {
- instant->Update(tab, CurrentMatch(), view_->GetText(),
- UseVerbatimInstant(), &suggested_text);
+ instant->DestroyPreviewContents();
+ }
+ might_support_instant = instant->MightSupportInstant();
+ } else if (user_input_in_progress() && popup_->IsOpen()) {
+ // Start Prerender of this page instead.
+ CHECK(tab->tab_contents());
+ prerender::PrerenderManager* prerender_manager =
+ tab->tab_contents()->profile()->GetPrerenderManager();
+ if (prerender_manager) {
+ prerender_manager->AddPrerender(prerender::ORIGIN_OMNIBOX,
+ CurrentMatch().destination_url);
}
- } else {
- instant->DestroyPreviewContents();
}
- might_support_instant = instant->MightSupportInstant();
}
if (!might_support_instant) {
@@ -399,7 +411,7 @@ void AutocompleteEditModel::StartAutocomplete(
}
void AutocompleteEditModel::StopAutocomplete() {
- if (popup_->IsOpen() && update_instant_) {
+ if (popup_->IsOpen() && !in_revert_) {
InstantController* instant = controller_->GetInstant();
if (instant && !instant->commit_on_mouse_up())
instant->DestroyPreviewContents();
@@ -534,7 +546,7 @@ void AutocompleteEditModel::OpenMatch(const AutocompleteMatch& match,
}
if (disposition != NEW_BACKGROUND_TAB) {
- update_instant_ = false;
+ in_revert_ = true;
view_->RevertAll(); // Revert the box to its unedited state
}
@@ -548,7 +560,7 @@ void AutocompleteEditModel::OpenMatch(const AutocompleteMatch& match,
InstantController* instant = controller_->GetInstant();
if (instant && !popup_->IsOpen())
instant->DestroyPreviewContents();
- update_instant_ = true;
+ in_revert_ = false;
}
bool AutocompleteEditModel::AcceptKeyword() {
diff --git a/chrome/browser/autocomplete/autocomplete_edit.h b/chrome/browser/autocomplete/autocomplete_edit.h
index 1da8241..171a716 100644
--- a/chrome/browser/autocomplete/autocomplete_edit.h
+++ b/chrome/browser/autocomplete/autocomplete_edit.h
@@ -529,11 +529,10 @@ class AutocompleteEditModel : public AutocompleteControllerDelegate {
Profile* profile_;
- // Should instant be updated? This is needed as prior to accepting the current
- // text the model is reverted, which triggers resetting instant. We don't want
- // to update instant in this case, so we use the flag to determine if this is
- // happening.
- bool update_instant_;
+ // This is needed as prior to accepting the current text the model is
+ // reverted, which triggers resetting instant. We don't want to update instant
+ // in this case, so we use the flag to determine if this is happening.
+ bool in_revert_;
// Indicates if the upcoming autocomplete search is allowed to be treated as
// an exact keyword match. If it's true then keyword mode will be triggered
diff --git a/chrome/browser/instant/instant_controller.cc b/chrome/browser/instant/instant_controller.cc
index 592c0e3..7269522 100644
--- a/chrome/browser/instant/instant_controller.cc
+++ b/chrome/browser/instant/instant_controller.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/instant/promo_counter.h"
#include "chrome/browser/platform_util.h"
#include "chrome/browser/prefs/pref_service.h"
+#include "chrome/browser/prerender/prerender_manager.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search_engines/template_url.h"
#include "chrome/browser/search_engines/template_url_service.h"
@@ -167,7 +168,23 @@ void InstantController::Update(TabContentsWrapper* tab_contents,
return;
}
- if (!ShouldShowPreviewFor(match, &template_url)) {
+ PreviewCondition preview_condition = GetPreviewConditionFor(match,
+ &template_url);
+ if (preview_condition == PREVIEW_CONDITION_SUCCESS) {
+ // Do nothing if we should show it.
+ } else if (preview_condition == PREVIEW_CONDITION_INSTANT_SEARCH_ONLY) {
+ // Start Prerender of this page instead.
+ prerender::PrerenderManager* prerender_manager =
+ tab_contents_->profile()->GetPrerenderManager();
+ if (prerender_manager) {
+ prerender_manager->AddPrerender(prerender::ORIGIN_OMNIBOX,
+ match.destination_url);
+ }
+
+ DestroyPreviewContentsAndLeaveActive();
+ return;
+ } else {
+ // Just destroy the preview and cancel the update.
DestroyPreviewContentsAndLeaveActive();
return;
}
@@ -661,8 +678,8 @@ void InstantController::UpdateLoader(const TemplateURL* template_url,
UpdateDisplayableLoader();
}
-bool InstantController::ShouldShowPreviewFor(const AutocompleteMatch& match,
- const TemplateURL** template_url) {
+InstantController::PreviewCondition InstantController::GetPreviewConditionFor(
+ const AutocompleteMatch& match, const TemplateURL** template_url) {
const TemplateURL* t_url = GetTemplateURL(match);
if (t_url) {
if (!t_url->id() ||
@@ -671,21 +688,21 @@ bool InstantController::ShouldShowPreviewFor(const AutocompleteMatch& match,
!t_url->instant_url()->SupportsReplacement()) {
// To avoid extra load on other search engines we only enable previews if
// they support the instant API.
- return false;
+ return PREVIEW_CONDITION_INVALID_TEMPLATE_URL;
}
}
*template_url = t_url;
if (match.destination_url.SchemeIs(chrome::kJavaScriptScheme))
- return false;
+ return PREVIEW_CONDITION_JAVASCRIPT_SCHEME;
- // Extension keywords don't have a real destionation URL.
+ // Extension keywords don't have a real destination URL.
if (match.template_url && match.template_url->IsExtensionKeyword())
- return false;
+ return PREVIEW_CONDITION_EXTENSION_KEYWORD;
// Was the host blacklisted?
if (host_blacklist_ && host_blacklist_->count(match.destination_url.host()))
- return false;
+ return PREVIEW_CONDITION_BLACKLISTED;
const CommandLine* cl = CommandLine::ForCurrentProcess();
if (cl->HasSwitch(switches::kRestrictInstantToSearch) &&
@@ -693,10 +710,10 @@ bool InstantController::ShouldShowPreviewFor(const AutocompleteMatch& match,
match.type != AutocompleteMatch::SEARCH_HISTORY &&
match.type != AutocompleteMatch::SEARCH_SUGGEST &&
match.type != AutocompleteMatch::SEARCH_OTHER_ENGINE) {
- return false;
+ return PREVIEW_CONDITION_INSTANT_SEARCH_ONLY;
}
- return true;
+ return PREVIEW_CONDITION_SUCCESS;
}
void InstantController::BlacklistFromInstant(TemplateURLID id) {
diff --git a/chrome/browser/instant/instant_controller.h b/chrome/browser/instant/instant_controller.h
index f8d4bd7..8556e85 100644
--- a/chrome/browser/instant/instant_controller.h
+++ b/chrome/browser/instant/instant_controller.h
@@ -193,6 +193,15 @@ class InstantController : public InstantLoaderDelegate {
private:
friend class InstantTest;
+ enum PreviewCondition {
+ PREVIEW_CONDITION_SUCCESS,
+ PREVIEW_CONDITION_INVALID_TEMPLATE_URL,
+ PREVIEW_CONDITION_JAVASCRIPT_SCHEME,
+ PREVIEW_CONDITION_EXTENSION_KEYWORD,
+ PREVIEW_CONDITION_BLACKLISTED,
+ PREVIEW_CONDITION_INSTANT_SEARCH_ONLY,
+ };
+
typedef std::set<std::string> HostBlacklist;
// Updates |displayable_loader_| and if necessary notifies the delegate.
@@ -228,10 +237,11 @@ class InstantController : public InstantLoaderDelegate {
bool verbatim,
string16* suggested_text);
- // Returns true if a preview should be shown for |match|. If |match| has
- // a TemplateURL that supports the instant API it is set in |template_url|.
- bool ShouldShowPreviewFor(const AutocompleteMatch& match,
- const TemplateURL** template_url);
+ // Returns a PreviewCondition indicating why we might decide not to show a
+ // preview for |match|. If |match| has a TemplateURL that supports the instant
+ // API it is set in |template_url|.
+ PreviewCondition GetPreviewConditionFor(const AutocompleteMatch& match,
+ const TemplateURL** template_url);
// Marks the specified search engine id as not supporting instant.
void BlacklistFromInstant(TemplateURLID id);
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index 1b598c2..8bb5b76 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -98,7 +98,7 @@ class TestPrerenderContents : public PrerenderContents {
int number_of_loads,
FinalStatus expected_final_status)
: PrerenderContents(prerender_manager, prerender_tracker, profile,
- url, referrer),
+ url, referrer, ORIGIN_LINK_REL_PRERENDER),
number_of_loads_(0),
expected_number_of_loads_(number_of_loads),
expected_final_status_(expected_final_status),
@@ -243,7 +243,8 @@ class WaitForLoadPrerenderContentsFactory : public PrerenderContents::Factory {
PrerenderTracker* prerender_tracker,
Profile* profile,
const GURL& url,
- const GURL& referrer) OVERRIDE {
+ const GURL& referrer,
+ Origin origin) OVERRIDE {
CHECK(!expected_final_status_queue_.empty()) <<
"Creating prerender contents for " << url.path() <<
" with no expected final status";
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index ae72b91..ec5c727 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -60,9 +60,10 @@ class PrerenderContentsFactoryImpl : public PrerenderContents::Factory {
public:
virtual PrerenderContents* CreatePrerenderContents(
PrerenderManager* prerender_manager, PrerenderTracker* prerender_tracker,
- Profile* profile, const GURL& url, const GURL& referrer) OVERRIDE {
+ Profile* profile, const GURL& url, const GURL& referrer,
+ Origin origin) OVERRIDE {
return new PrerenderContents(prerender_manager, prerender_tracker, profile,
- url, referrer);
+ url, referrer, origin);
}
};
@@ -124,7 +125,8 @@ PrerenderContents::PrerenderContents(PrerenderManager* prerender_manager,
PrerenderTracker* prerender_tracker,
Profile* profile,
const GURL& url,
- const GURL& referrer)
+ const GURL& referrer,
+ Origin origin)
: prerender_manager_(prerender_manager),
prerender_tracker_(prerender_tracker),
prerender_url_(url),
@@ -137,7 +139,8 @@ PrerenderContents::PrerenderContents(PrerenderManager* prerender_manager,
prerendering_has_been_cancelled_(false),
child_id_(-1),
route_id_(-1),
- starting_page_id_(-1) {
+ starting_page_id_(-1),
+ origin_(origin) {
DCHECK(prerender_manager != NULL);
}
@@ -155,8 +158,6 @@ void PrerenderContents::StartPrerendering(
DCHECK(profile_ != NULL);
DCHECK(!prerendering_has_started_);
DCHECK(prerender_contents_.get() == NULL);
- DCHECK(source_render_view_host != NULL);
- DCHECK(source_render_view_host->view() != NULL);
prerendering_has_started_ = true;
TabContents* new_contents = new TabContents(profile_, NULL, MSG_ROUTING_NONE,
@@ -165,26 +166,29 @@ void PrerenderContents::StartPrerendering(
TabContentsObserver::Observe(new_contents);
prerender_contents_->download_tab_helper()->set_delegate(this);
- TabContents* source_tc =
- source_render_view_host->delegate()->GetAsTabContents();
- if (source_tc) {
- // So that history merging will work, get the max page ID
- // of the old page, and add a safety margin of 10 to it (for things
- // such as redirects).
- starting_page_id_ = source_tc->GetMaxPageID();
- if (starting_page_id_ < 0)
- starting_page_id_ = 0;
- starting_page_id_ += kPrerenderPageIdOffset;
- prerender_contents_->controller().set_max_restored_page_id(
- starting_page_id_);
-
- tab_contents_delegate_.reset(new TabContentsDelegateImpl(this));
- new_contents->set_delegate(tab_contents_delegate_.get());
-
- // Set the size of the new TC to that of the old TC.
- gfx::Rect tab_bounds;
- source_tc->view()->GetContainerBounds(&tab_bounds);
- prerender_contents_->view()->SizeContents(tab_bounds.size());
+ if (source_render_view_host) {
+ DCHECK(source_render_view_host->view() != NULL);
+ TabContents* source_tc =
+ source_render_view_host->delegate()->GetAsTabContents();
+ if (source_tc) {
+ // So that history merging will work, get the max page ID
+ // of the old page, and add a safety margin of 10 to it (for things
+ // such as redirects).
+ starting_page_id_ = source_tc->GetMaxPageID();
+ if (starting_page_id_ < 0)
+ starting_page_id_ = 0;
+ starting_page_id_ += kPrerenderPageIdOffset;
+ prerender_contents_->controller().set_max_restored_page_id(
+ starting_page_id_);
+
+ tab_contents_delegate_.reset(new TabContentsDelegateImpl(this));
+ new_contents->set_delegate(tab_contents_delegate_.get());
+
+ // Set the size of the new TC to that of the old TC.
+ gfx::Rect tab_bounds;
+ source_tc->view()->GetContainerBounds(&tab_bounds);
+ prerender_contents_->view()->SizeContents(tab_bounds.size());
+ }
}
// Register as an observer of the RenderViewHost so we get messages.
@@ -272,11 +276,12 @@ PrerenderContents::~PrerenderContents() {
DCHECK(prerendering_has_been_cancelled_ ||
final_status_ == FINAL_STATUS_USED ||
final_status_ == FINAL_STATUS_CONTROL_GROUP);
+ DCHECK(origin_ != ORIGIN_MAX);
// If we haven't even started prerendering, we were just in the control
// group, which means we do not want to record the status.
if (prerendering_has_started())
- RecordFinalStatus(final_status_);
+ RecordFinalStatus(origin_, final_status_);
if (child_id_ != -1 && route_id_ != -1)
prerender_tracker_->OnPrerenderingFinished(child_id_, route_id_);
diff --git a/chrome/browser/prerender/prerender_contents.h b/chrome/browser/prerender/prerender_contents.h
index 8a8de52..47cba32 100644
--- a/chrome/browser/prerender/prerender_contents.h
+++ b/chrome/browser/prerender/prerender_contents.h
@@ -60,7 +60,8 @@ class PrerenderContents : public NotificationObserver,
PrerenderTracker* prerender_tracker,
Profile* profile,
const GURL& url,
- const GURL& referrer) = 0;
+ const GURL& referrer,
+ Origin origin) = 0;
private:
DISALLOW_COPY_AND_ASSIGN(Factory);
@@ -167,7 +168,8 @@ class PrerenderContents : public NotificationObserver,
PrerenderTracker* prerender_tracker,
Profile* profile,
const GURL& url,
- const GURL& referrer);
+ const GURL& referrer,
+ Origin origin);
NotificationRegistrar& notification_registrar() {
return notification_registrar_;
@@ -270,6 +272,9 @@ class PrerenderContents : public NotificationObserver,
// Page ID at which prerendering started.
int32 starting_page_id_;
+ // Origin for this prerender.
+ Origin origin_;
+
// Offset by which to offset prerendered pages
static const int32 kPrerenderPageIdOffset = 10;
diff --git a/chrome/browser/prerender/prerender_final_status.cc b/chrome/browser/prerender/prerender_final_status.cc
index 8d71e41..c598106 100644
--- a/chrome/browser/prerender/prerender_final_status.cc
+++ b/chrome/browser/prerender/prerender_final_status.cc
@@ -51,7 +51,7 @@ COMPILE_ASSERT(arraysize(kFinalStatusNames) == FINAL_STATUS_MAX + 1,
}
-void RecordFinalStatus(FinalStatus final_status) {
+void RecordFinalStatus(Origin origin, FinalStatus final_status) {
DCHECK(final_status != FINAL_STATUS_MAX);
// FINAL_STATUS_CONTROL_GROUP indicates that the PrerenderContents
// was created only to measure "would-have-been-prerendered" for
@@ -62,6 +62,21 @@ void RecordFinalStatus(FinalStatus final_status) {
UMA_HISTOGRAM_ENUMERATION("Prerender.FinalStatus",
final_status,
FINAL_STATUS_MAX);
+ switch (origin) {
+ case ORIGIN_LINK_REL_PRERENDER:
+ UMA_HISTOGRAM_ENUMERATION("Prerender.FinalStatus_LinkRelPrerender",
+ final_status,
+ FINAL_STATUS_MAX);
+ break;
+ case ORIGIN_OMNIBOX:
+ UMA_HISTOGRAM_ENUMERATION("Prerender.FinalStatus_Omnibox",
+ final_status,
+ FINAL_STATUS_MAX);
+ break;
+ default:
+ NOTREACHED();
+ break;
+ };
}
const char* NameFromFinalStatus(FinalStatus final_status) {
diff --git a/chrome/browser/prerender/prerender_final_status.h b/chrome/browser/prerender/prerender_final_status.h
index da9fec8..2713444 100644
--- a/chrome/browser/prerender/prerender_final_status.h
+++ b/chrome/browser/prerender/prerender_final_status.h
@@ -5,6 +5,8 @@
#ifndef CHROME_BROWSER_PRERENDER_PRERENDER_FINAL_STATUS_H_
#define CHROME_BROWSER_PRERENDER_PRERENDER_FINAL_STATUS_H_
+#include "chrome/browser/prerender/prerender_origin.h"
+
namespace prerender {
// FinalStatus indicates whether |this| was used, or why it was cancelled.
@@ -45,7 +47,7 @@ enum FinalStatus {
FINAL_STATUS_MAX,
};
-void RecordFinalStatus(FinalStatus final_status);
+void RecordFinalStatus(Origin origin, FinalStatus final_status);
// Return a human-readable name for |final_status|. |final_status|
// is expected to be a valid value.
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index c2f0e00..50a2bd1 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;
diff --git a/chrome/browser/prerender/prerender_manager.h b/chrome/browser/prerender/prerender_manager.h
index 96e3090..a5cf15c 100644
--- a/chrome/browser/prerender/prerender_manager.h
+++ b/chrome/browser/prerender/prerender_manager.h
@@ -19,6 +19,7 @@
#include "base/time.h"
#include "base/timer.h"
#include "chrome/browser/prerender/prerender_contents.h"
+#include "chrome/browser/prerender/prerender_origin.h"
#include "googleurl/src/gurl.h"
class Profile;
@@ -51,7 +52,7 @@ void HandleTag(
const GURL& url,
const GURL& referrer);
-void DestroyPreloadForRenderView(
+void DestroyPrerenderForRenderView(
const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr,
int child_id,
int route_id,
@@ -86,30 +87,38 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
virtual ~PrerenderManager();
- // Preloads |url| if valid. |child_route_id_pair| identifies the
+ // Starts a prerender for |url| if valid. |child_route_id_pair| identifies the
// RenderViewHost that the prerender request came from and is used to
// set the initial window size of the RenderViewHost used for prerendering.
// Returns true if the URL was added, false if it was not.
// If |child_route_id_pair| itself is prerendering, adds the preloads as
- // a pending preload.
- bool AddPreload(
+ // a pending preload. |origin| enumerates the source of the prerender for
+ // data-tracking purposes.
+ bool AddPrerenderFromPage(
+ Origin origin,
const std::pair<int, int>& child_route_id_pair,
const GURL& url,
const GURL& referrer);
- // Destroy all preloads for the given child route id pair and assign a final
+ // Starts a prerender for |url| if valid. As the prerender request is coming
+ // from a source without a RenderViewHost (ie, the omnibox) we don't have a
+ // child or route id, or a referrer. This method uses sensible values for
+ // those.
+ bool AddPrerender(Origin origin, const GURL& url);
+
+ // Destroy all prerenders for the given child route id pair and assign a final
// status to them.
- virtual void DestroyPreloadForChildRouteIdPair(
+ virtual void DestroyPrerenderForChildRouteIdPair(
const std::pair<int, int>& child_route_id_pair,
FinalStatus final_status);
// For a given TabContents that wants to navigate to the URL supplied,
- // determines whether a preloaded version of the URL can be used,
+ // determines whether a prerendered version of the URL can be used,
// and substitutes the prerendered RVH into the TabContents. Returns
// whether or not a prerendered RVH could be used or not.
- bool MaybeUsePreloadedPage(TabContents* tab_contents,
- const GURL& url,
- bool has_opener_set);
+ bool MaybeUsePrerenderedPage(TabContents* tab_contents,
+ const GURL& url,
+ bool has_opener_set);
// Moves a PrerenderContents to the pending delete list from the list of
// active prerenders when prerendering should be cancelled.
@@ -240,9 +249,10 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
// Adds a pending preload issued by the prerendering RenderView identified by
// |child_route_id_pair|. If and when that prerendering RenderView is used,
// the specified prerender will start.
- void AddPendingPreload(const std::pair<int, int>& child_route_id_pair,
- const GURL& url,
- const GURL& referrer);
+ void AddPendingPrerender(Origin origin,
+ const std::pair<int, int>& child_route_id_pair,
+ const GURL& url,
+ const GURL& referrer);
// Starts scheduling periodic cleanups.
void StartSchedulingPeriodicCleanups();
@@ -264,9 +274,9 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
void DeleteOldEntries();
virtual base::Time GetCurrentTime() const;
virtual base::TimeTicks GetCurrentTimeTicks() const;
- virtual PrerenderContents* CreatePrerenderContents(
- const GURL& url,
- const GURL& referrer);
+ virtual PrerenderContents* CreatePrerenderContents(const GURL& url,
+ const GURL& referrer,
+ Origin origin);
// Deletes any PrerenderContents that have been added to the pending delete
// list.
@@ -290,7 +300,7 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
// Called when removing a preload to ensure we clean up any pending preloads
// that might remain in the map.
- void RemovePendingPreload(PrerenderContents* entry);
+ void RemovePendingPrerender(PrerenderContents* entry);
bool DoesRateLimitAllowPrerender() const;
diff --git a/chrome/browser/prerender/prerender_manager_unittest.cc b/chrome/browser/prerender/prerender_manager_unittest.cc
index 63b2a63..dd96725 100644
--- a/chrome/browser/prerender/prerender_manager_unittest.cc
+++ b/chrome/browser/prerender/prerender_manager_unittest.cc
@@ -6,6 +6,7 @@
#include "base/time.h"
#include "chrome/browser/prerender/prerender_contents.h"
#include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_origin.h"
#include "chrome/test/testing_browser_process.h"
#include "content/browser/browser_thread.h"
#include "content/browser/renderer_host/render_view_host.h"
@@ -24,7 +25,7 @@ class DummyPrerenderContents : public PrerenderContents {
const GURL& url,
FinalStatus expected_final_status)
: PrerenderContents(prerender_manager, prerender_tracker, NULL, url,
- GURL()),
+ GURL(), ORIGIN_LINK_REL_PRERENDER),
has_started_(false),
expected_final_status_(expected_final_status) {
}
@@ -118,9 +119,9 @@ class TestPrerenderManager : public PrerenderManager {
return prerender_contents;
}
- // Shorthand to add a simple preload with no aliases.
- bool AddSimplePreload(const GURL& url) {
- return AddPreload(std::pair<int, int>(-1, -1), url, GURL());
+ // Shorthand to add a simple preload with a reasonable source.
+ bool AddSimplePrerender(const GURL& url) {
+ return AddPrerender(ORIGIN_LINK_REL_PRERENDER, url);
}
bool IsPendingEntry(const GURL& url) {
@@ -151,7 +152,8 @@ class TestPrerenderManager : public PrerenderManager {
virtual PrerenderContents* CreatePrerenderContents(
const GURL& url,
- const GURL& referrer) OVERRIDE {
+ const GURL& referrer,
+ Origin origin) OVERRIDE {
DCHECK(next_prerender_contents_.get());
return next_prerender_contents_.release();
}
@@ -203,7 +205,7 @@ class PrerenderManagerTest : public testing::Test {
TEST_F(PrerenderManagerTest, EmptyTest) {
GURL url("http://www.google.com/");
- EXPECT_FALSE(prerender_manager()->MaybeUsePreloadedPage(NULL, url, false));
+ EXPECT_FALSE(prerender_manager()->MaybeUsePrerenderedPage(NULL, url, false));
}
TEST_F(PrerenderManagerTest, FoundTest) {
@@ -212,7 +214,7 @@ TEST_F(PrerenderManagerTest, FoundTest) {
prerender_manager()->CreateNextPrerenderContents(
url,
FINAL_STATUS_USED);
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url));
EXPECT_TRUE(prerender_contents->has_started());
ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(url));
}
@@ -226,7 +228,7 @@ TEST_F(PrerenderManagerTest, DropSecondRequestTest) {
url,
FINAL_STATUS_USED);
DummyPrerenderContents* null = NULL;
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url));
EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
EXPECT_TRUE(prerender_contents->has_started());
@@ -234,7 +236,7 @@ TEST_F(PrerenderManagerTest, DropSecondRequestTest) {
prerender_manager()->CreateNextPrerenderContents(
url,
FINAL_STATUS_MANAGER_SHUTDOWN);
- EXPECT_FALSE(prerender_manager()->AddSimplePreload(url));
+ EXPECT_FALSE(prerender_manager()->AddSimplePrerender(url));
EXPECT_EQ(prerender_contents1,
prerender_manager()->next_prerender_contents());
EXPECT_FALSE(prerender_contents1->has_started());
@@ -250,7 +252,7 @@ TEST_F(PrerenderManagerTest, ExpireTest) {
url,
FINAL_STATUS_TIMED_OUT);
DummyPrerenderContents* null = NULL;
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url));
EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
EXPECT_TRUE(prerender_contents->has_started());
prerender_manager()->AdvanceTime(prerender_manager()->max_prerender_age()
@@ -267,7 +269,7 @@ TEST_F(PrerenderManagerTest, DropOldestRequestTest) {
url,
FINAL_STATUS_EVICTED);
DummyPrerenderContents* null = NULL;
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url));
EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
EXPECT_TRUE(prerender_contents->has_started());
@@ -276,7 +278,7 @@ TEST_F(PrerenderManagerTest, DropOldestRequestTest) {
prerender_manager()->CreateNextPrerenderContents(
url1,
FINAL_STATUS_USED);
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url1));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url1));
EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
EXPECT_TRUE(prerender_contents1->has_started());
@@ -294,7 +296,7 @@ TEST_F(PrerenderManagerTest, TwoElementPrerenderTest) {
url,
FINAL_STATUS_EVICTED);
DummyPrerenderContents* null = NULL;
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url));
EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
EXPECT_TRUE(prerender_contents->has_started());
@@ -303,7 +305,7 @@ TEST_F(PrerenderManagerTest, TwoElementPrerenderTest) {
prerender_manager()->CreateNextPrerenderContents(
url1,
FINAL_STATUS_USED);
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url1));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url1));
EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
EXPECT_TRUE(prerender_contents1->has_started());
@@ -312,7 +314,7 @@ TEST_F(PrerenderManagerTest, TwoElementPrerenderTest) {
prerender_manager()->CreateNextPrerenderContents(
url2,
FINAL_STATUS_USED);
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url2));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url2));
EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
EXPECT_TRUE(prerender_contents2->has_started());
@@ -334,25 +336,25 @@ TEST_F(PrerenderManagerTest, AliasURLTest) {
DummyPrerenderContents* prerender_contents =
prerender_manager()->CreateNextPrerenderContents(
url, alias_urls, FINAL_STATUS_USED);
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url));
ASSERT_EQ(NULL, prerender_manager()->GetEntry(not_an_alias_url));
ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(alias_url1));
prerender_contents = prerender_manager()->CreateNextPrerenderContents(
url, alias_urls, FINAL_STATUS_USED);
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url));
ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(alias_url2));
prerender_contents = prerender_manager()->CreateNextPrerenderContents(
url, alias_urls, FINAL_STATUS_USED);
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url));
ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(url));
// Test that alias URLs can not be added.
prerender_contents = prerender_manager()->CreateNextPrerenderContents(
url, alias_urls, FINAL_STATUS_USED);
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url));
- EXPECT_FALSE(prerender_manager()->AddSimplePreload(url));
- EXPECT_FALSE(prerender_manager()->AddSimplePreload(alias_url1));
- EXPECT_FALSE(prerender_manager()->AddSimplePreload(alias_url2));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url));
+ EXPECT_FALSE(prerender_manager()->AddSimplePrerender(url));
+ EXPECT_FALSE(prerender_manager()->AddSimplePrerender(alias_url1));
+ EXPECT_FALSE(prerender_manager()->AddSimplePrerender(alias_url2));
ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(url));
}
@@ -364,7 +366,7 @@ TEST_F(PrerenderManagerTest, RateLimitInWindowTest) {
url,
FINAL_STATUS_MANAGER_SHUTDOWN);
DummyPrerenderContents* null = NULL;
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url));
EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
EXPECT_TRUE(prerender_contents->has_started());
@@ -375,7 +377,7 @@ TEST_F(PrerenderManagerTest, RateLimitInWindowTest) {
prerender_manager()->CreateNextPrerenderContents(
url,
FINAL_STATUS_MANAGER_SHUTDOWN);
- EXPECT_FALSE(prerender_manager()->AddSimplePreload(url1));
+ EXPECT_FALSE(prerender_manager()->AddSimplePrerender(url1));
prerender_manager()->set_rate_limit_enabled(false);
}
@@ -387,7 +389,7 @@ TEST_F(PrerenderManagerTest, RateLimitOutsideWindowTest) {
url,
FINAL_STATUS_EVICTED);
DummyPrerenderContents* null = NULL;
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url));
EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
EXPECT_TRUE(prerender_contents->has_started());
@@ -400,19 +402,19 @@ TEST_F(PrerenderManagerTest, RateLimitOutsideWindowTest) {
prerender_manager()->CreateNextPrerenderContents(
url1,
FINAL_STATUS_MANAGER_SHUTDOWN);
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url1));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url1));
EXPECT_EQ(null, prerender_manager()->next_prerender_contents());
EXPECT_TRUE(rate_limit_prerender_contents->has_started());
prerender_manager()->set_rate_limit_enabled(false);
}
-TEST_F(PrerenderManagerTest, PendingPreloadTest) {
+TEST_F(PrerenderManagerTest, PendingPrerenderTest) {
GURL url("http://www.google.com/");
DummyPrerenderContents* prerender_contents =
prerender_manager()->CreateNextPrerenderContents(
url,
FINAL_STATUS_USED);
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url));
int child_id;
int route_id;
@@ -421,10 +423,9 @@ TEST_F(PrerenderManagerTest, PendingPreloadTest) {
GURL pending_url("http://news.google.com/");
- EXPECT_TRUE(
- prerender_manager()->AddPreload(std::make_pair(child_id, route_id),
- pending_url,
- url));
+ EXPECT_TRUE(prerender_manager()->AddPrerenderFromPage(
+ ORIGIN_LINK_REL_PRERENDER, std::make_pair(child_id, route_id),
+ pending_url, url));
EXPECT_TRUE(prerender_manager()->IsPendingEntry(pending_url));
EXPECT_TRUE(prerender_contents->has_started());
@@ -460,7 +461,7 @@ TEST_F(PrerenderManagerTest, ControlGroup) {
prerender_manager()->CreateNextPrerenderContents(
url,
FINAL_STATUS_CONTROL_GROUP);
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url));
EXPECT_FALSE(prerender_contents->has_started());
}
@@ -472,8 +473,8 @@ TEST_F(PrerenderManagerTest, SourceRenderViewClosed) {
prerender_manager()->CreateNextPrerenderContents(
url,
FINAL_STATUS_MANAGER_SHUTDOWN);
- EXPECT_FALSE(prerender_manager()->AddPreload(
- std::pair<int, int>(100, 100), url, GURL()));
+ EXPECT_FALSE(prerender_manager()->AddPrerenderFromPage(
+ ORIGIN_LINK_REL_PRERENDER, std::pair<int, int>(100, 100), url, GURL()));
}
// Tests that the prerender manager ignores fragment references when matching
@@ -485,7 +486,7 @@ TEST_F(PrerenderManagerTest, PageMatchesFragmentTest) {
DummyPrerenderContents* prerender_contents =
prerender_manager()->CreateNextPrerenderContents(url,
FINAL_STATUS_USED);
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url));
EXPECT_TRUE(prerender_contents->has_started());
ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(fragment_url));
}
@@ -499,7 +500,7 @@ TEST_F(PrerenderManagerTest, FragmentMatchesPageTest) {
DummyPrerenderContents* prerender_contents =
prerender_manager()->CreateNextPrerenderContents(fragment_url,
FINAL_STATUS_USED);
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(fragment_url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(fragment_url));
EXPECT_TRUE(prerender_contents->has_started());
ASSERT_EQ(prerender_contents, prerender_manager()->GetEntry(url));
}
@@ -513,7 +514,7 @@ TEST_F(PrerenderManagerTest, FragmentMatchesFragmentTest) {
DummyPrerenderContents* prerender_contents =
prerender_manager()->CreateNextPrerenderContents(fragment_url,
FINAL_STATUS_USED);
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(fragment_url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(fragment_url));
EXPECT_TRUE(prerender_contents->has_started());
ASSERT_EQ(prerender_contents,
prerender_manager()->GetEntry(other_fragment_url));
@@ -526,7 +527,7 @@ TEST_F(PrerenderManagerTest, ClearTest) {
prerender_manager()->CreateNextPrerenderContents(
url,
FINAL_STATUS_CACHE_OR_HISTORY_CLEARED);
- EXPECT_TRUE(prerender_manager()->AddSimplePreload(url));
+ EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url));
EXPECT_TRUE(prerender_contents->has_started());
prerender_manager()->ClearData(PrerenderManager::CLEAR_PRERENDER_CONTENTS);
DummyPrerenderContents* null = NULL;
diff --git a/chrome/browser/prerender/prerender_observer.cc b/chrome/browser/prerender/prerender_observer.cc
index eb5e257..b75d945 100644
--- a/chrome/browser/prerender/prerender_observer.cc
+++ b/chrome/browser/prerender/prerender_observer.cc
@@ -32,7 +32,7 @@ void PrerenderObserver::ProvisionalChangeToMainFrameUrl(const GURL& url,
if (prerender_manager->IsTabContentsPrerendering(tab_contents()))
return;
prerender_manager->MarkTabContentsAsNotPrerendered(tab_contents());
- MaybeUsePreloadedPage(url, has_opener_set);
+ MaybeUsePrerenderedPage(url, has_opener_set);
prerender_manager->RecordNavigation(url);
}
@@ -72,15 +72,15 @@ PrerenderManager* PrerenderObserver::MaybeGetPrerenderManager() {
return tab_contents()->profile()->GetPrerenderManager();
}
-bool PrerenderObserver::MaybeUsePreloadedPage(const GURL& url,
- bool has_opener_set) {
+bool PrerenderObserver::MaybeUsePrerenderedPage(const GURL& url,
+ bool has_opener_set) {
PrerenderManager* prerender_manager = MaybeGetPrerenderManager();
if (!prerender_manager)
return false;
DCHECK(!prerender_manager->IsTabContentsPrerendering(tab_contents()));
- return prerender_manager->MaybeUsePreloadedPage(tab_contents(),
- url,
- has_opener_set);
+ return prerender_manager->MaybeUsePrerenderedPage(tab_contents(),
+ url,
+ has_opener_set);
}
bool PrerenderObserver::IsPrerendering() {
diff --git a/chrome/browser/prerender/prerender_observer.h b/chrome/browser/prerender/prerender_observer.h
index 9f8526a..d851191 100644
--- a/chrome/browser/prerender/prerender_observer.h
+++ b/chrome/browser/prerender/prerender_observer.h
@@ -46,7 +46,7 @@ class PrerenderObserver : public TabContentsObserver {
// Checks with the PrerenderManager if the specified URL has been preloaded,
// and if so, swap the RenderViewHost with the preload into this TabContents
// object.
- bool MaybeUsePreloadedPage(const GURL& url, bool has_opener_set);
+ bool MaybeUsePrerenderedPage(const GURL& url, bool has_opener_set);
// Returns whether the TabContents being observed is currently prerendering.
bool IsPrerendering();
diff --git a/chrome/browser/prerender/prerender_origin.cc b/chrome/browser/prerender/prerender_origin.cc
new file mode 100644
index 0000000..5aab26c
--- /dev/null
+++ b/chrome/browser/prerender/prerender_origin.cc
@@ -0,0 +1,30 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/prerender/prerender_origin.h"
+
+#include "base/metrics/histogram.h"
+#include "chrome/browser/prerender/prerender_manager.h"
+
+namespace prerender {
+
+namespace {
+
+const char* kOriginNames[] = {
+ "Link Rel Prerender",
+ "Omnibox",
+ "Max"
+};
+COMPILE_ASSERT(arraysize(kOriginNames) == ORIGIN_MAX + 1,
+ PrerenderOrigin_name_count_mismatch);
+
+}
+
+const char* NameFromOrigin(Origin origin) {
+ DCHECK(static_cast<int>(origin) >= 0 &&
+ origin <= ORIGIN_MAX);
+ return kOriginNames[origin];
+}
+
+} // namespace prerender
diff --git a/chrome/browser/prerender/prerender_origin.h b/chrome/browser/prerender/prerender_origin.h
new file mode 100644
index 0000000..6b7fe0aa
--- /dev/null
+++ b/chrome/browser/prerender/prerender_origin.h
@@ -0,0 +1,23 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_PRERENDER_PRERENDER_ORIGIN_H_
+#define CHROME_BROWSER_PRERENDER_PRERENDER_ORIGIN_H_
+
+namespace prerender {
+
+// Origin indicates what caused the prerender.
+// NOTE: New values need to be appended, since they are used in histograms.
+enum Origin {
+ ORIGIN_LINK_REL_PRERENDER = 0,
+ ORIGIN_OMNIBOX = 1,
+ ORIGIN_MAX
+};
+
+// Return a human-readable name for |origin|.
+const char* NameFromOrigin(Origin origin);
+
+} // namespace prerender
+
+#endif // CHROME_BROWSER_PRERENDER_PRERENDER_ORIGIN_H_
diff --git a/chrome/browser/prerender/prerender_tracker.cc b/chrome/browser/prerender/prerender_tracker.cc
index b209ae9..719dae4 100644
--- a/chrome/browser/prerender/prerender_tracker.cc
+++ b/chrome/browser/prerender/prerender_tracker.cc
@@ -287,7 +287,7 @@ bool PrerenderTracker::SetFinalStatus(int child_id, int route_id,
if (desired_final_status != FINAL_STATUS_USED) {
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
- NewRunnableFunction(&DestroyPreloadForRenderView,
+ NewRunnableFunction(&DestroyPrerenderForRenderView,
final_status_it->second.prerender_manager,
child_id,
route_id,
diff --git a/chrome/browser/prerender/prerender_tracker_unittest.cc b/chrome/browser/prerender/prerender_tracker_unittest.cc
index 2518b691..c1cd80b 100644
--- a/chrome/browser/prerender/prerender_tracker_unittest.cc
+++ b/chrome/browser/prerender/prerender_tracker_unittest.cc
@@ -22,7 +22,7 @@ class TestPrerenderManager : public PrerenderManager {
rate_limit_enabled_ = false;
}
- virtual void DestroyPreloadForChildRouteIdPair(
+ virtual void DestroyPrerenderForChildRouteIdPair(
const std::pair<int, int>& child_route_id_pair,
FinalStatus final_status) OVERRIDE {
cancelled_id_pairs_.insert(child_route_id_pair);
@@ -111,8 +111,8 @@ TEST_F(PrerenderTrackerTest, PrerenderTrackerUsed) {
0, 0, FINAL_STATUS_TIMED_OUT));
EXPECT_EQ(FINAL_STATUS_USED, GetCurrentStatus(0, 0));
- // This would call DestroyPreloadForChildRouteIdPair(), if the prerender were
- // cancelled.
+ // This would call DestroyPrerenderForChildRouteIdPair(), if the prerender
+ // were cancelled.
RunEvents();
// These functions should all behave as before.
@@ -121,7 +121,7 @@ TEST_F(PrerenderTrackerTest, PrerenderTrackerUsed) {
0, 0, FINAL_STATUS_TIMED_OUT));
EXPECT_EQ(FINAL_STATUS_USED, GetCurrentStatus(0, 0));
- // This calls DestroyPreloadForChildRouteIdPair().
+ // This calls DestroyPrerenderForChildRouteIdPair().
prerender_tracker()->OnPrerenderingFinished(0, 0);
EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0));
@@ -152,7 +152,7 @@ TEST_F(PrerenderTrackerTest, PrerenderTrackerCancelled) {
0, 0, FINAL_STATUS_TIMED_OUT));
EXPECT_EQ(FINAL_STATUS_HTTPS, GetCurrentStatus(0, 0));
- // This calls DestroyPreloadForChildRouteIdPair().
+ // This calls DestroyPrerenderForChildRouteIdPair().
RunEvents();
EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(0, 0));
@@ -192,7 +192,7 @@ TEST_F(PrerenderTrackerTest, PrerenderTrackerCancelledOnIO) {
0, 0, FINAL_STATUS_HTTPS));
EXPECT_EQ(FINAL_STATUS_TIMED_OUT, GetCurrentStatus(0, 0));
- // This calls DestroyPreloadForChildRouteIdPair().
+ // This calls DestroyPrerenderForChildRouteIdPair().
RunEvents();
EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(0, 0));
@@ -224,7 +224,7 @@ TEST_F(PrerenderTrackerTest, PrerenderTrackerCancelledFast) {
EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_TIMED_OUT));
// This calls AddPrerenderOnIOThreadTask() and
- // DestroyPreloadForChildRouteIdPair().
+ // DestroyPrerenderForChildRouteIdPair().
RunEvents();
EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(0, 0));
@@ -275,7 +275,7 @@ TEST_F(PrerenderTrackerTest, PrerenderTrackerMultiple) {
EXPECT_TRUE(prerender_tracker()->TryCancel(1, 2, FINAL_STATUS_HTTPS));
EXPECT_EQ(FINAL_STATUS_HTTPS, GetCurrentStatus(1, 2));
- // This calls DestroyPreloadForChildRouteIdPair().
+ // This calls DestroyPrerenderForChildRouteIdPair().
RunEvents();
EXPECT_FALSE(prerender_manager()->WasPrerenderCancelled(0, 0));
EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(1, 2));
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 5b22575..c6a77c2 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1700,6 +1700,8 @@
'browser/prerender/prerender_manager.h',
'browser/prerender/prerender_observer.cc',
'browser/prerender/prerender_observer.h',
+ 'browser/prerender/prerender_origin.cc',
+ 'browser/prerender/prerender_origin.h',
'browser/prerender/prerender_render_view_host_observer.cc',
'browser/prerender/prerender_render_view_host_observer.h',
'browser/prerender/prerender_tracker.cc',
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index 4077b6a..9d85e1d 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -779,6 +779,10 @@ const char kPreloadInstantSearch[] = "preload-instant-search";
// Controls speculative prerendering of pages, and content prefetching. Both
// are dispatched from <link rel=prefetch href=...> elements.
const char kPrerender[] = "prerender";
+// Trigger prerendering of pages from suggestions in the omnibox. Only has an
+// effect when Instant is either disabled or restricted to search, and when
+// prerender is enabled.
+const char kPrerenderFromOmnibox[] = "prerender-from-omnibox";
// These are the values the switch may have, as in "--prerender=auto".
// auto: Allow field trial selection in both prerender and prefetch.
const char kPrerenderSwitchValueAuto[] = "auto";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index bea468a..7fb5c96 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -217,6 +217,7 @@ extern const char kParentProfile[];
extern const char kPpapiFlashInProcess[];
extern const char kPreloadInstantSearch[];
extern const char kPrerender[];
+extern const char kPrerenderFromOmnibox[];
extern const char kPrerenderSwitchValueAuto[];
extern const char kPrerenderSwitchValueDisabled[];
extern const char kPrerenderSwitchValueEnabled[];