summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordominich@chromium.org <dominich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-20 15:52:22 +0000
committerdominich@chromium.org <dominich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-20 15:52:22 +0000
commit01747e4d5b3ddf8f033536e1cd3c9048bd72a574 (patch)
tree9235db04276eaaf964f4feb5d0872e84d667882b
parent7713c39fa1e8b7ea064739f19f9d107d33b1160a (diff)
downloadchromium_src-01747e4d5b3ddf8f033536e1cd3c9048bd72a574.zip
chromium_src-01747e4d5b3ddf8f033536e1cd3c9048bd72a574.tar.gz
chromium_src-01747e4d5b3ddf8f033536e1cd3c9048bd72a574.tar.bz2
Add Field Trial for Prerender From Omnibox.
BUG=95066 TEST=None Review URL: http://codereview.chromium.org/7825009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@101963 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/autocomplete/autocomplete_edit.cc11
-rw-r--r--chrome/browser/metrics/metrics_service.h7
-rw-r--r--chrome/browser/prerender/prerender_field_trial.cc50
-rw-r--r--chrome/browser/prerender/prerender_field_trial.h5
-rw-r--r--chrome/browser/prerender/prerender_manager.cc8
-rw-r--r--chrome/browser/prerender/prerender_manager.h6
-rw-r--r--chrome/browser/resources/net_internals/prerender_view.html2
-rw-r--r--chrome/browser/resources/net_internals/prerender_view.js8
-rw-r--r--chrome/browser/ui/webui/net_internals_ui.cc8
9 files changed, 87 insertions, 18 deletions
diff --git a/chrome/browser/autocomplete/autocomplete_edit.cc b/chrome/browser/autocomplete/autocomplete_edit.cc
index 8c4958e..9777b41 100644
--- a/chrome/browser/autocomplete/autocomplete_edit.cc
+++ b/chrome/browser/autocomplete/autocomplete_edit.cc
@@ -7,7 +7,6 @@
#include <string>
#include "base/basictypes.h"
-#include "base/command_line.h"
#include "base/metrics/histogram.h"
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
@@ -24,6 +23,7 @@
#include "chrome/browser/instant/instant_controller.h"
#include "chrome/browser/net/predictor.h"
#include "chrome/browser/net/url_fixer_upper.h"
+#include "chrome/browser/prerender/prerender_field_trial.h"
#include "chrome/browser/prerender/prerender_manager.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search_engines/template_url.h"
@@ -208,6 +208,7 @@ bool AutocompleteEditModel::AcceptCurrentInstantPreview() {
void AutocompleteEditModel::OnChanged() {
const AutocompleteMatch current_match = CurrentMatch();
+
string16 suggested_text;
// Confer with the NetworkActionPredictor to determine what action, if any,
@@ -220,10 +221,8 @@ void AutocompleteEditModel::OnChanged() {
bool might_support_instant = false;
if (!DoInstant(current_match, &suggested_text, &might_support_instant)) {
// Ignore the recommended action if Omnibox prerendering is not enabled.
- if (!CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kPrerenderFromOmnibox)) {
+ if (!prerender::IsOmniboxEnabled(profile_))
recommended_action = NetworkActionPredictor::ACTION_NONE;
- }
switch (recommended_action) {
case NetworkActionPredictor::ACTION_PRERENDER:
@@ -835,10 +834,8 @@ void AutocompleteEditModel::OnResultChanged(bool default_match_changed) {
match->fill_into_edit.substr(match->inline_autocomplete_offset);
}
- if (!CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kPrerenderFromOmnibox)) {
+ if (!prerender::IsOmniboxEnabled(profile_))
DoPreconnect(*match);
- }
// We could prefetch the alternate nav URL, if any, but because there
// can be many of these as a user types an initial series of characters,
diff --git a/chrome/browser/metrics/metrics_service.h b/chrome/browser/metrics/metrics_service.h
index 46867ed..7d9f0284 100644
--- a/chrome/browser/metrics/metrics_service.h
+++ b/chrome/browser/metrics/metrics_service.h
@@ -32,6 +32,7 @@ class HistogramSynchronizer;
class MetricsLogBase;
class MetricsReportingScheduler;
class PrefService;
+class Profile;
class TemplateURLService;
namespace base {
@@ -39,10 +40,15 @@ class DictionaryValue;
class ListValue;
}
+namespace prerender {
+bool IsOmniboxEnabled(Profile* profile);
+}
+
namespace webkit {
struct WebPluginInfo;
}
+
class MetricsService : public NotificationObserver,
public URLFetcher::Delegate,
public MetricsServiceBase {
@@ -456,6 +462,7 @@ class MetricsService : public NotificationObserver,
class MetricsServiceHelper {
private:
friend class InstantFieldTrial;
+ friend bool prerender::IsOmniboxEnabled(Profile* profile);
// Returns true if prefs::kMetricsReportingEnabled is set.
static bool IsMetricsReportingEnabled();
diff --git a/chrome/browser/prerender/prerender_field_trial.cc b/chrome/browser/prerender/prerender_field_trial.cc
index 9153eba..ba7184f 100644
--- a/chrome/browser/prerender/prerender_field_trial.cc
+++ b/chrome/browser/prerender/prerender_field_trial.cc
@@ -8,13 +8,19 @@
#include "base/logging.h"
#include "base/metrics/field_trial.h"
#include "base/metrics/histogram.h"
-#include "content/browser/renderer_host/resource_dispatcher_host.h"
+#include "chrome/browser/metrics/metrics_service.h"
+#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_switches.h"
-
+#include "content/browser/renderer_host/resource_dispatcher_host.h"
namespace prerender {
+// If the command line contains the --prerender-from-omnibox switch, enable
+// prerendering from the Omnibox. If not, enter the user into a field trial.
+void ConfigurePrerenderFromOmnibox();
+
void ConfigurePrefetchAndPrerender(const CommandLine& command_line) {
enum PrerenderOption {
PRERENDER_OPTION_AUTO,
@@ -117,6 +123,46 @@ void ConfigurePrefetchAndPrerender(const CommandLine& command_line) {
UMA_HISTOGRAM_ENUMERATION("Prerender.Sessions",
PrerenderManager::GetMode(),
PrerenderManager::PRERENDER_MODE_MAX);
+
+ ConfigurePrerenderFromOmnibox();
+}
+
+void ConfigurePrerenderFromOmnibox() {
+ if (!CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kPrerenderFromOmnibox)) {
+ const base::FieldTrial::Probability kDivisor = 100;
+ const base::FieldTrial::Probability kEnabledProbability = 10;
+
+ scoped_refptr<base::FieldTrial> trial(
+ new base::FieldTrial("PrerenderFromOmnibox", kDivisor,
+ "OmniboxPrerenderDisabled", 2012, 8, 30));
+
+ trial->AppendGroup("OmniboxPrerenderEnabled", kEnabledProbability);
+ }
+}
+
+bool IsOmniboxEnabled(Profile* profile) {
+ if (!profile || profile->IsOffTheRecord())
+ return false;
+
+ if (!PrerenderManager::IsPrerenderingPossible())
+ return false;
+
+ if (CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kPrerenderFromOmnibox)) {
+ return true;
+ }
+
+ if (!MetricsServiceHelper::IsMetricsReportingEnabled())
+ return false;
+
+ const int group = base::FieldTrialList::FindValue("PrerenderFromOmnibox");
+ if (group == base::FieldTrial::kNotFinalized ||
+ group == base::FieldTrial::kDefaultGroupNumber) {
+ return false;
+ }
+
+ return true;
}
} // namespace prerender
diff --git a/chrome/browser/prerender/prerender_field_trial.h b/chrome/browser/prerender/prerender_field_trial.h
index b7543ae6..368a515 100644
--- a/chrome/browser/prerender/prerender_field_trial.h
+++ b/chrome/browser/prerender/prerender_field_trial.h
@@ -6,6 +6,7 @@
#define CHROME_BROWSER_PRERENDER_PRERENDER_FIELD_TRIAL_H_
class CommandLine;
+class Profile;
namespace prerender {
@@ -14,6 +15,10 @@ namespace prerender {
// is assigned to a field trial.
void ConfigurePrefetchAndPrerender(const CommandLine& command_line);
+// Returns true if the user has opted in or has been opted in to the
+// prerendering from Omnibox experiment.
+bool IsOmniboxEnabled(Profile* profile);
+
} // namespace prerender
#endif // CHROME_BROWSER_PRERENDER_PRERENDER_FIELD_TRIAL_H_
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index 4e73530..61a8867 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -6,7 +6,6 @@
#include <string>
-#include "base/command_line.h"
#include "base/logging.h"
#include "base/stl_util.h"
#include "base/time.h"
@@ -17,6 +16,7 @@
#include "chrome/browser/history/top_sites.h"
#include "chrome/browser/prerender/prerender_condition.h"
#include "chrome/browser/prerender/prerender_contents.h"
+#include "chrome/browser/prerender/prerender_field_trial.h"
#include "chrome/browser/prerender/prerender_final_status.h"
#include "chrome/browser/prerender/prerender_histograms.h"
#include "chrome/browser/prerender/prerender_history.h"
@@ -269,8 +269,7 @@ bool PrerenderManager::AddPrerenderFromLinkRelPrerender(int process_id,
}
bool PrerenderManager::AddPrerenderFromOmnibox(const GURL& url) {
- CommandLine* cl = CommandLine::ForCurrentProcess();
- if (!cl->HasSwitch(switches::kPrerenderFromOmnibox))
+ if (!IsOmniboxEnabled(profile_))
return false;
return AddPrerender(ORIGIN_OMNIBOX, std::make_pair(-1, -1), url, GURL());
@@ -952,12 +951,13 @@ void PrerenderManager::ScheduleDeleteOldTabContents(
}
}
-Value* PrerenderManager::GetAsValue() const {
+DictionaryValue* PrerenderManager::GetAsValue() const {
DCHECK(CalledOnValidThread());
DictionaryValue* dict_value = new DictionaryValue();
dict_value->Set("history", prerender_history_->GetEntriesAsValue());
dict_value->Set("active", GetActivePrerendersAsValue());
dict_value->SetBoolean("enabled", enabled_);
+ dict_value->SetBoolean("omnibox_enabled", IsOmniboxEnabled(profile_));
// If prerender is disabled via a flag this method is not even called.
if (IsControlGroup())
dict_value->SetString("disabled_reason", "(Disabled for testing)");
diff --git a/chrome/browser/prerender/prerender_manager.h b/chrome/browser/prerender/prerender_manager.h
index 7e157a71..acdf410 100644
--- a/chrome/browser/prerender/prerender_manager.h
+++ b/chrome/browser/prerender/prerender_manager.h
@@ -28,6 +28,10 @@
class Profile;
class TabContents;
+namespace base {
+class DictionaryValue;
+}
+
#if defined(COMPILER_GCC)
namespace __gnu_cxx {
@@ -176,7 +180,7 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
// Returns a Value object containing the active pages being prerendered, and
// a history of pages which were prerendered. The caller is responsible for
// deleting the return value.
- base::Value* GetAsValue() const;
+ base::DictionaryValue* GetAsValue() const;
// Clears the data indicated by which bits of clear_flags are set.
//
diff --git a/chrome/browser/resources/net_internals/prerender_view.html b/chrome/browser/resources/net_internals/prerender_view.html
index 2b663da..3296ed5 100644
--- a/chrome/browser/resources/net_internals/prerender_view.html
+++ b/chrome/browser/resources/net_internals/prerender_view.html
@@ -2,6 +2,8 @@
<h4>Prerender</h4>
<ul>
<li>Prerender Enabled: <span id=prerender-view-enabled-span></span></li>
+ <li>Prerender Omnibox Enabled:
+ <span id=prerender-view-omnibox-enabled-span></span></li>
</ul>
<p>
Active Prerender Pages
diff --git a/chrome/browser/resources/net_internals/prerender_view.js b/chrome/browser/resources/net_internals/prerender_view.js
index 33ab3a8..746306b 100644
--- a/chrome/browser/resources/net_internals/prerender_view.js
+++ b/chrome/browser/resources/net_internals/prerender_view.js
@@ -11,6 +11,7 @@ var PrerenderView = (function() {
// IDs for special HTML elements in prerender_view.html
var MAIN_BOX_ID = 'prerender-view-tab-content';
var ENABLED_SPAN_ID = 'prerender-view-enabled-span';
+ var OMNIBOX_ENABLED_SPAN_ID = 'prerender-view-omnibox-enabled-span';
var HISTORY_DIV_ID = 'prerender-view-history-div';
var ACTIVE_DIV_ID = 'prerender-view-active-div';
@@ -28,6 +29,7 @@ var PrerenderView = (function() {
g_browser.addPrerenderInfoObserver(this);
this.prerenderEnabledSpan_ = $(ENABLED_SPAN_ID);
+ this.prerenderOmniboxEnabledSpan_ = $(OMNIBOX_ENABLED_SPAN_ID);
this.prerenderHistoryDiv_ = $(HISTORY_DIV_ID);
this.prerenderActiveDiv_ = $(ACTIVE_DIV_ID);
}
@@ -47,6 +49,7 @@ var PrerenderView = (function() {
onPrerenderInfoChanged: function(prerenderInfo) {
this.prerenderEnabledSpan_.textContent = '';
+ this.prerenderOmniboxEnabledSpan_.textContent = '';
this.prerenderHistoryDiv_.innerHTML = '';
this.prerenderActiveDiv_.innerHTML = '';
@@ -59,6 +62,11 @@ var PrerenderView = (function() {
}
}
+ if (prerenderInfo && ('omnibox_enabled' in prerenderInfo)) {
+ this.prerenderOmniboxEnabledSpan_.textContent =
+ prerenderInfo.omnibox_enabled.toString();
+ }
+
if (!isValidPrerenderInfo(prerenderInfo))
return false;
diff --git a/chrome/browser/ui/webui/net_internals_ui.cc b/chrome/browser/ui/webui/net_internals_ui.cc
index 8dd9a59..a75ff83 100644
--- a/chrome/browser/ui/webui/net_internals_ui.cc
+++ b/chrome/browser/ui/webui/net_internals_ui.cc
@@ -640,12 +640,12 @@ void NetInternalsMessageHandler::OnEnableHttpThrottling(const ListValue* list) {
void NetInternalsMessageHandler::OnGetPrerenderInfo(const ListValue* list) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- Value* value = NULL;
+ DictionaryValue* value = NULL;
prerender::PrerenderManager* prerender_manager = prerender_manager_.get();
if (!prerender_manager) {
- DictionaryValue* dict_value = new DictionaryValue();
- dict_value->SetBoolean("enabled", false);
- value = dict_value;
+ value = new DictionaryValue();
+ value->SetBoolean("enabled", false);
+ value->SetBoolean("omnibox_enabled", false);
} else {
value = prerender_manager->GetAsValue();
}