Index: chrome/browser/prerender/prerender_field_trial.cc |
diff --git a/chrome/browser/prerender/prerender_field_trial.cc b/chrome/browser/prerender/prerender_field_trial.cc |
index 6e3dea425c5594e9f2d8d0b4197a2987df9ec37b..54d3c3801cec1c567d686fc035122ee450a3bc5c 100644 |
--- a/chrome/browser/prerender/prerender_field_trial.cc |
+++ b/chrome/browser/prerender/prerender_field_trial.cc |
@@ -6,11 +6,6 @@ |
#include "base/command_line.h" |
#include "base/logging.h" |
-#include "base/metrics/field_trial.h" |
-#include "base/metrics/histogram.h" |
-#include "base/prefs/pref_service.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/string_split.h" |
#include "chrome/browser/net/prediction_options.h" |
#include "chrome/browser/predictors/autocomplete_action_predictor.h" |
#include "chrome/browser/prerender/prerender_manager.h" |
@@ -18,224 +13,43 @@ |
#include "chrome/browser/sync/profile_sync_service.h" |
#include "chrome/browser/sync/profile_sync_service_factory.h" |
#include "chrome/common/chrome_switches.h" |
-#include "chrome/common/chrome_version_info.h" |
-#include "components/metrics/metrics_service.h" |
-#include "components/variations/variations_associated_data.h" |
-using base::FieldTrial; |
-using base::FieldTrialList; |
-using base::StringToInt; |
using std::string; |
-using std::vector; |
namespace prerender { |
namespace { |
-const char kDisabledGroup[] = "Disabled"; |
-const char kEnabledGroup[] = "Enabled"; |
- |
-const char kLocalPredictorSpecTrialName[] = "PrerenderLocalPredictorSpec"; |
-const char kLocalPredictorKeyName[] = "LocalPredictor"; |
-const char kLocalPredictorUnencryptedSyncOnlyKeyName[] = |
- "LocalPredictorUnencryptedSyncOnly"; |
-const char kLocalPredictorNetworkPredictionEnabledOnly[] = |
- "LocalPredictorNetworkPredictionEnabledOnly"; |
-const char kLocalPredictorOnCellularOnly[] = "LocalPredictorOnCellularOnly"; |
-const char kSideEffectFreeWhitelistKeyName[] = "SideEffectFreeWhitelist"; |
-const char kPrerenderLaunchKeyName[] = "PrerenderLaunch"; |
-const char kPrerenderAlwaysControlKeyName[] = "PrerenderAlwaysControl"; |
-const char kPrerenderPrefetchKeyName[] = "PrerenderPrefetch"; |
-const char kPrerenderQueryPrerenderServiceKeyName[] = |
- "PrerenderQueryPrerenderService"; |
-const char kPrerenderQueryPrerenderServiceCurrentURLKeyName[] = |
- "PrerenderQueryPrerenderServiceCurrentURL"; |
-const char kPrerenderQueryPrerenderServiceCandidateURLsKeyName[] = |
- "PrerenderQueryPrerenderServiceCandidateURLs"; |
-const char kPrerenderServiceBehaviorIDKeyName[] = "PrerenderServiceBehaviorID"; |
-const char kPrerenderServiceFetchTimeoutKeyName[] = |
- "PrerenderServiceFetchTimeoutMs"; |
-const char kPrefetchListTimeoutKeyName[] = "PrefetchListTimeoutSeconds"; |
-const char kPrerenderTTLKeyName[] = "PrerenderTTLSeconds"; |
-const char kPrerenderPriorityHalfLifeTimeKeyName[] = |
- "PrerenderPriorityHalfLifeTimeSeconds"; |
-const char kMaxConcurrentPrerenderKeyName[] = "MaxConcurrentPrerenders"; |
-const char kMaxLaunchPrerenderKeyName[] = "MaxLaunchPrerenders"; |
-const char kSkipFragment[] = "SkipFragment"; |
-const char kSkipHTTPS[] = "SkipHTTPS"; |
-const char kSkipWhitelist[] = "SkipWhitelist"; |
-const char kSkipServiceWhitelist[] = "SkipServiceWhitelist"; |
-const char kSkipLoggedIn[] = "SkipLoggedIn"; |
-const char kSkipDefaultNoPrerender[] = "SkipDefaultNoPrerender"; |
-const char kPrerenderServiceURLPrefixParameterName[] = |
- "PrerenderServiceURLPrefix"; |
const char kDefaultPrerenderServiceURLPrefix[] = |
"https://clients4.google.com/prerenderservice/?q="; |
-const int kMinPrerenderServiceTimeoutMs = 1; |
-const int kMaxPrerenderServiceTimeoutMs = 10000; |
const int kDefaultPrerenderServiceTimeoutMs = 1000; |
-const int kMinPrefetchListTimeoutSeconds = 1; |
-const int kMaxPrefetchListTimeoutSeconds = 1800; |
const int kDefaultPrefetchListTimeoutSeconds = 300; |
-const char kSkipPrerenderLocalCanadidates[] = "SkipPrerenderLocalCandidates"; |
-const char kSkipPrerenderServiceCanadidates[] = |
- "SkipPrerenderServiceCandidates"; |
- |
-void SetupPrerenderFieldTrial() { |
- const FieldTrial::Probability divisor = 1000; |
- |
- FieldTrial::Probability control_probability; |
- FieldTrial::Probability experiment_multi_prerender_probability; |
- FieldTrial::Probability experiment_15min_ttl_probability; |
- FieldTrial::Probability experiment_no_use_probability; |
- FieldTrial::Probability experiment_match_complete_probability; |
- |
- chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); |
- if (channel == chrome::VersionInfo::CHANNEL_STABLE || |
- channel == chrome::VersionInfo::CHANNEL_BETA) { |
- // Use very conservatives and stable settings in beta and stable. |
- const FieldTrial::Probability release_prerender_enabled_probability = 970; |
- const FieldTrial::Probability release_control_probability = 10; |
- const FieldTrial::Probability |
- release_experiment_multi_prerender_probability = 0; |
- const FieldTrial::Probability release_experiment_15min_ttl_probability = 10; |
- const FieldTrial::Probability release_experiment_no_use_probability = 0; |
- const FieldTrial::Probability |
- release_experiment_match_complete_probability = 10; |
- static_assert( |
- release_prerender_enabled_probability + |
- release_control_probability + |
- release_experiment_multi_prerender_probability + |
- release_experiment_15min_ttl_probability + |
- release_experiment_no_use_probability + |
- release_experiment_match_complete_probability == divisor, |
- "release experiment probabilities must equal divisor"); |
- |
- control_probability = release_control_probability; |
- experiment_multi_prerender_probability = |
- release_experiment_multi_prerender_probability; |
- experiment_15min_ttl_probability = release_experiment_15min_ttl_probability; |
- experiment_no_use_probability = release_experiment_no_use_probability; |
- experiment_match_complete_probability = |
- release_experiment_match_complete_probability; |
- } else { |
- // In testing channels, use more experiments and a larger control group to |
- // improve quality of data. |
- const FieldTrial::Probability dev_prerender_enabled_probability = 200; |
- const FieldTrial::Probability dev_control_probability = 200; |
- const FieldTrial::Probability |
- dev_experiment_multi_prerender_probability = 200; |
- const FieldTrial::Probability dev_experiment_15min_ttl_probability = 100; |
- const FieldTrial::Probability dev_experiment_no_use_probability = 100; |
- const FieldTrial::Probability |
- dev_experiment_match_complete_probability = 200; |
- static_assert(dev_prerender_enabled_probability + |
- dev_control_probability + |
- dev_experiment_multi_prerender_probability + |
- dev_experiment_15min_ttl_probability + |
- dev_experiment_no_use_probability + |
- dev_experiment_match_complete_probability == divisor, |
- "dev experiment probabilities must equal divisor"); |
- |
- control_probability = dev_control_probability; |
- experiment_multi_prerender_probability = |
- dev_experiment_multi_prerender_probability; |
- experiment_15min_ttl_probability = dev_experiment_15min_ttl_probability; |
- experiment_no_use_probability = dev_experiment_no_use_probability; |
- experiment_match_complete_probability = |
- dev_experiment_match_complete_probability; |
- } |
- |
- int prerender_enabled_group = -1; |
- scoped_refptr<FieldTrial> trial( |
- FieldTrialList::FactoryGetFieldTrial( |
- "Prerender", divisor, "PrerenderEnabled", |
- 2014, 12, 31, FieldTrial::SESSION_RANDOMIZED, |
- &prerender_enabled_group)); |
- const int control_group = |
- trial->AppendGroup("PrerenderControl", |
- control_probability); |
- const int experiment_multi_prerender_group = |
- trial->AppendGroup("PrerenderMulti", |
- experiment_multi_prerender_probability); |
- const int experiment_15_min_TTL_group = |
- trial->AppendGroup("Prerender15minTTL", |
- experiment_15min_ttl_probability); |
- const int experiment_no_use_group = |
- trial->AppendGroup("PrerenderNoUse", |
- experiment_no_use_probability); |
- const int experiment_match_complete_group = |
- trial->AppendGroup("MatchComplete", |
- experiment_match_complete_probability); |
- |
- const int trial_group = trial->group(); |
- if (trial_group == prerender_enabled_group) { |
- PrerenderManager::SetMode( |
- PrerenderManager::PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP); |
- } else if (trial_group == control_group) { |
- PrerenderManager::SetMode( |
- PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); |
- } else if (trial_group == experiment_multi_prerender_group) { |
- PrerenderManager::SetMode( |
- PrerenderManager::PRERENDER_MODE_EXPERIMENT_MULTI_PRERENDER_GROUP); |
- } else if (trial_group == experiment_15_min_TTL_group) { |
- PrerenderManager::SetMode( |
- PrerenderManager::PRERENDER_MODE_EXPERIMENT_15MIN_TTL_GROUP); |
- } else if (trial_group == experiment_no_use_group) { |
- PrerenderManager::SetMode( |
- PrerenderManager::PRERENDER_MODE_EXPERIMENT_NO_USE_GROUP); |
- } else if (trial_group == experiment_match_complete_group) { |
- PrerenderManager::SetMode( |
- PrerenderManager::PRERENDER_MODE_EXPERIMENT_MATCH_COMPLETE_GROUP); |
- } else { |
- NOTREACHED(); |
- } |
-} |
} // end namespace |
void ConfigurePrerender(const base::CommandLine& command_line) { |
- enum PrerenderOption { |
- PRERENDER_OPTION_AUTO, |
- PRERENDER_OPTION_DISABLED, |
- PRERENDER_OPTION_ENABLED, |
- }; |
- |
- PrerenderOption prerender_option = PRERENDER_OPTION_AUTO; |
+ PrerenderManager::PrerenderManagerMode mode = |
+ PrerenderManager::PRERENDER_MODE_ENABLED; |
if (command_line.HasSwitch(switches::kPrerenderMode)) { |
const string switch_value = |
command_line.GetSwitchValueASCII(switches::kPrerenderMode); |
- if (switch_value == switches::kPrerenderModeSwitchValueAuto) { |
- prerender_option = PRERENDER_OPTION_AUTO; |
- } else if (switch_value == switches::kPrerenderModeSwitchValueDisabled) { |
- prerender_option = PRERENDER_OPTION_DISABLED; |
+ if (switch_value == switches::kPrerenderModeSwitchValueDisabled) { |
+ mode = PrerenderManager::PRERENDER_MODE_DISABLED; |
} else if (switch_value.empty() || |
switch_value == switches::kPrerenderModeSwitchValueEnabled) { |
// The empty string means the option was provided with no value, and that |
// means enable. |
- prerender_option = PRERENDER_OPTION_ENABLED; |
+ mode = PrerenderManager::PRERENDER_MODE_ENABLED; |
} else { |
- prerender_option = PRERENDER_OPTION_DISABLED; |
+ mode = PrerenderManager::PRERENDER_MODE_DISABLED; |
LOG(ERROR) << "Invalid --prerender option received on command line: " |
<< switch_value; |
LOG(ERROR) << "Disabling prerendering!"; |
} |
} |
- switch (prerender_option) { |
- case PRERENDER_OPTION_AUTO: |
- SetupPrerenderFieldTrial(); |
- break; |
- case PRERENDER_OPTION_DISABLED: |
- PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_DISABLED); |
- break; |
- case PRERENDER_OPTION_ENABLED: |
- PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_ENABLED); |
- break; |
- default: |
- NOTREACHED(); |
- } |
+ PrerenderManager::SetMode(mode); |
} |
bool IsOmniboxEnabled(Profile* profile) { |
@@ -261,31 +75,10 @@ bool IsOmniboxEnabled(Profile* profile) { |
DCHECK_EQ(switches::kPrerenderFromOmniboxSwitchValueAuto, switch_value); |
} |
- return (FieldTrialList::FindFullName("PrerenderFromOmnibox") != |
+ return (base::FieldTrialList::FindFullName("PrerenderFromOmnibox") != |
"OmniboxPrerenderDisabled"); |
} |
-/* |
-PrerenderLocalPredictorSpec is a field trial, and its value must have the |
-following format: |
-key1=value1:key2=value2:key3=value3 |
-eg "LocalPredictor=Enabled:SideEffectFreeWhitelist=Enabled" |
-The function below extracts the value corresponding to a key provided from the |
-LocalPredictorSpec. |
-*/ |
-string GetLocalPredictorSpecValue(string spec_key) { |
- vector<string> elements; |
- base::SplitString(FieldTrialList::FindFullName(kLocalPredictorSpecTrialName), |
- ':', &elements); |
- for (int i = 0; i < static_cast<int>(elements.size()); i++) { |
- vector<string> key_value; |
- base::SplitString(elements[i], '=', &key_value); |
- if (key_value.size() == 2 && key_value[0] == spec_key) |
- return key_value[1]; |
- } |
- return string(); |
-} |
- |
bool IsUnencryptedSyncEnabled(Profile* profile) { |
ProfileSyncService* service = ProfileSyncServiceFactory::GetInstance()-> |
GetForProfile(profile); |
@@ -296,44 +89,15 @@ bool IsUnencryptedSyncEnabled(Profile* profile) { |
// Indicates whether the Local Predictor is enabled based on field trial |
// selection. |
bool IsLocalPredictorEnabled() { |
-#if defined(OS_ANDROID) || defined(OS_IOS) |
return false; |
-#endif |
- return !base::CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kDisablePrerenderLocalPredictor) && |
- GetLocalPredictorSpecValue(kLocalPredictorKeyName) == kEnabledGroup; |
} |
bool ShouldDisableLocalPredictorBasedOnSyncAndConfiguration(Profile* profile) { |
- return |
- GetLocalPredictorSpecValue(kLocalPredictorUnencryptedSyncOnlyKeyName) == |
- kEnabledGroup && |
- !IsUnencryptedSyncEnabled(profile); |
+ return false; |
} |
bool ShouldDisableLocalPredictorDueToPreferencesAndNetwork(Profile* profile) { |
- bool on_cellular = |
- net::NetworkChangeNotifier::IsConnectionCellular( |
- net::NetworkChangeNotifier::GetConnectionType()); |
- // If the user is not on a cellular connection, but we require a cellular |
- // connection, we must temporarily disable our local predictions. |
- if (!on_cellular && |
- GetLocalPredictorSpecValue(kLocalPredictorOnCellularOnly) == |
- kEnabledGroup) { |
- return true; |
- } |
- |
- // If we don't care whether or not network prediction will actually be |
- // exercised, we do not need to temporarily disable our predictions. |
- if (GetLocalPredictorSpecValue(kLocalPredictorNetworkPredictionEnabledOnly) != |
- kEnabledGroup) { |
- return false; |
- } |
- |
- // We should temporarily disable iff the predictive network action would |
- // not be exercised. |
- |
- return !chrome_browser_net::CanPrefetchAndPrerenderUI(profile->GetPrefs()); |
+ return false; |
} |
bool IsLoggedInPredictorEnabled() { |
@@ -341,140 +105,98 @@ bool IsLoggedInPredictorEnabled() { |
} |
bool IsSideEffectFreeWhitelistEnabled() { |
- return IsLocalPredictorEnabled() && |
- GetLocalPredictorSpecValue(kSideEffectFreeWhitelistKeyName) != |
- kDisabledGroup; |
+ return IsLocalPredictorEnabled(); |
} |
bool IsLocalPredictorPrerenderLaunchEnabled() { |
- return GetLocalPredictorSpecValue(kPrerenderLaunchKeyName) != kDisabledGroup; |
+ return true; |
} |
bool IsLocalPredictorPrerenderAlwaysControlEnabled() { |
// If we prefetch rather than prerender, we automatically also prerender |
// as a control group only. |
- return (GetLocalPredictorSpecValue(kPrerenderAlwaysControlKeyName) == |
- kEnabledGroup) || IsLocalPredictorPrerenderPrefetchEnabled(); |
+ return IsLocalPredictorPrerenderPrefetchEnabled(); |
} |
bool IsLocalPredictorPrerenderPrefetchEnabled() { |
- return GetLocalPredictorSpecValue(kPrerenderPrefetchKeyName) == |
- kEnabledGroup; |
+ return false; |
} |
bool ShouldQueryPrerenderService(Profile* profile) { |
- return IsUnencryptedSyncEnabled(profile) && |
- GetLocalPredictorSpecValue(kPrerenderQueryPrerenderServiceKeyName) == |
- kEnabledGroup; |
+ return false; |
} |
bool ShouldQueryPrerenderServiceForCurrentURL() { |
- return GetLocalPredictorSpecValue( |
- kPrerenderQueryPrerenderServiceCurrentURLKeyName) != kDisabledGroup; |
+ return true; |
} |
bool ShouldQueryPrerenderServiceForCandidateURLs() { |
- return GetLocalPredictorSpecValue( |
- kPrerenderQueryPrerenderServiceCandidateURLsKeyName) != kDisabledGroup; |
+ return true; |
} |
string GetPrerenderServiceURLPrefix() { |
- string prefix = variations::GetVariationParamValue( |
- kLocalPredictorSpecTrialName, |
- kPrerenderServiceURLPrefixParameterName); |
- return prefix.empty() ? kDefaultPrerenderServiceURLPrefix : prefix; |
+ return kDefaultPrerenderServiceURLPrefix; |
} |
int GetPrerenderServiceBehaviorID() { |
- int id; |
- StringToInt(GetLocalPredictorSpecValue(kPrerenderServiceBehaviorIDKeyName), |
- &id); |
- // The behavior ID must be non-negative. |
- return std::max(id, 0); |
+ return 0; |
} |
int GetPrerenderServiceFetchTimeoutMs() { |
- int result; |
- StringToInt(GetLocalPredictorSpecValue(kPrerenderServiceFetchTimeoutKeyName), |
- &result); |
- // If the value is outside the valid range, use the default value. |
- return (result < kMinPrerenderServiceTimeoutMs || |
- result > kMaxPrerenderServiceTimeoutMs) ? |
- kDefaultPrerenderServiceTimeoutMs : result; |
+ return kDefaultPrerenderServiceTimeoutMs; |
} |
int GetPrerenderPrefetchListTimeoutSeconds() { |
- int result; |
- StringToInt(GetLocalPredictorSpecValue(kPrefetchListTimeoutKeyName), &result); |
- // If the value is outside the valid range, use the default value. |
- return (result < kMinPrefetchListTimeoutSeconds || |
- result > kMaxPrefetchListTimeoutSeconds) ? |
- kDefaultPrefetchListTimeoutSeconds : result; |
+ return kDefaultPrefetchListTimeoutSeconds; |
} |
int GetLocalPredictorTTLSeconds() { |
- int ttl; |
- StringToInt(GetLocalPredictorSpecValue(kPrerenderTTLKeyName), &ttl); |
- // If the value is outside of 10s or 600s, use a default value of 180s. |
- return (ttl < 10 || ttl > 600) ? 180 : ttl; |
+ // Use a default value of 180s. |
+ return 180; |
} |
int GetLocalPredictorPrerenderPriorityHalfLifeTimeSeconds() { |
- int half_life_time; |
- StringToInt(GetLocalPredictorSpecValue(kPrerenderPriorityHalfLifeTimeKeyName), |
- &half_life_time); |
- // Sanity check: Ensure the half life time is non-negative. |
- return std::max(half_life_time, 0); |
+ return 0; |
} |
int GetLocalPredictorMaxConcurrentPrerenders() { |
- int num_prerenders; |
- StringToInt(GetLocalPredictorSpecValue(kMaxConcurrentPrerenderKeyName), |
- &num_prerenders); |
- // Sanity check: Ensure the number of prerenders is between 1 and 10. |
- return std::min(std::max(num_prerenders, 1), 10); |
+ return 1; |
} |
int GetLocalPredictorMaxLaunchPrerenders() { |
- int num_prerenders; |
- StringToInt(GetLocalPredictorSpecValue(kMaxLaunchPrerenderKeyName), |
- &num_prerenders); |
- // Sanity check: Ensure the number of prerenders is between 1 and 10. |
- return std::min(std::max(num_prerenders, 1), 10); |
+ return 1; |
} |
bool SkipLocalPredictorFragment() { |
- return GetLocalPredictorSpecValue(kSkipFragment) == kEnabledGroup; |
+ return false; |
} |
bool SkipLocalPredictorHTTPS() { |
- return GetLocalPredictorSpecValue(kSkipHTTPS) == kEnabledGroup; |
+ return false; |
} |
bool SkipLocalPredictorWhitelist() { |
- return GetLocalPredictorSpecValue(kSkipWhitelist) == kEnabledGroup; |
+ return false; |
} |
bool SkipLocalPredictorServiceWhitelist() { |
- return GetLocalPredictorSpecValue(kSkipServiceWhitelist) == kEnabledGroup; |
+ return false; |
} |
bool SkipLocalPredictorLoggedIn() { |
- return GetLocalPredictorSpecValue(kSkipLoggedIn) == kEnabledGroup; |
+ return false; |
} |
bool SkipLocalPredictorDefaultNoPrerender() { |
- return GetLocalPredictorSpecValue(kSkipDefaultNoPrerender) == kEnabledGroup; |
+ return false; |
} |
bool SkipLocalPredictorLocalCandidates() { |
- return GetLocalPredictorSpecValue(kSkipPrerenderLocalCanadidates) == |
- kEnabledGroup; |
+ return false; |
} |
bool SkipLocalPredictorServiceCandidates() { |
- return GetLocalPredictorSpecValue(kSkipPrerenderServiceCanadidates) == |
- kEnabledGroup; |
+ return false; |
} |
} // namespace prerender |