diff options
author | dominich@chromium.org <dominich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-20 15:52:22 +0000 |
---|---|---|
committer | dominich@chromium.org <dominich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-20 15:52:22 +0000 |
commit | 01747e4d5b3ddf8f033536e1cd3c9048bd72a574 (patch) | |
tree | 9235db04276eaaf964f4feb5d0872e84d667882b | |
parent | 7713c39fa1e8b7ea064739f19f9d107d33b1160a (diff) | |
download | chromium_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.cc | 11 | ||||
-rw-r--r-- | chrome/browser/metrics/metrics_service.h | 7 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_field_trial.cc | 50 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_field_trial.h | 5 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager.cc | 8 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager.h | 6 | ||||
-rw-r--r-- | chrome/browser/resources/net_internals/prerender_view.html | 2 | ||||
-rw-r--r-- | chrome/browser/resources/net_internals/prerender_view.js | 8 | ||||
-rw-r--r-- | chrome/browser/ui/webui/net_internals_ui.cc | 8 |
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(); } |