prerender_field_trial.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_field_trial.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/field_trial.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/metrics/metrics_service.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/predictors/autocomplete_action_predictor.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_version_info.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::FieldTrial; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::FieldTrialList; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOmniboxTrialName[] = "PrerenderFromOmnibox"; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int g_omnibox_trial_default_group_number = kint32min; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLocalPredictorTrialName[] = "PrerenderLocalPredictor"; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kLocalPredictorEnabledGroup[] = "Enabled"; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kLoggedInPredictorTrialName[] = "PrerenderLoggedInPredictor"; 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kLoggedInPredictorEnabledGroup[] = "Enabled"; 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kLoggedInPredictorDisabledGroup[] = "Disabled"; 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kSideEffectFreeWhitelistTrialName[] = "SideEffectFreeWhitelist"; 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kSideEffectFreeWhitelistEnabledGroup[] = "Enabled"; 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kSideEffectFreeWhitelistDisabledGroup[] = "Disabled"; 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetupPrefetchFieldTrial() { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (channel == chrome::VersionInfo::CHANNEL_STABLE || 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel == chrome::VersionInfo::CHANNEL_BETA) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability divisor = 1000; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability prefetch_probability = 500; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<FieldTrial> trial( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::FactoryGetFieldTrial( 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Prefetch", divisor, "ContentPrefetchPrefetchOff", 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2013, 12, 31, NULL)); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kPrefetchOnGroup = trial->AppendGroup("ContentPrefetchPrefetchOn", 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefetch_probability); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetIsPrefetchEnabled(trial->group() == kPrefetchOnGroup); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetupPrerenderFieldTrial() { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability divisor = 1000; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial::Probability control_probability; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial::Probability experiment_multi_prerender_probability; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial::Probability experiment_15min_ttl_probability; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial::Probability experiment_no_use_probability; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (channel == chrome::VersionInfo::CHANNEL_STABLE || 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel == chrome::VersionInfo::CHANNEL_BETA) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use very conservatives and stable settings in beta and stable. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability release_prerender_enabled_probability = 980; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability release_control_probability = 10; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) release_experiment_multi_prerender_probability = 0; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability release_experiment_15min_ttl_probability = 10; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability release_experiment_no_use_probability = 0; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT( 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) release_prerender_enabled_probability + release_control_probability + 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) release_experiment_multi_prerender_probability + 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) release_experiment_15min_ttl_probability + 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) release_experiment_no_use_probability == divisor, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) release_experiment_probabilities_must_equal_divisor); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) control_probability = release_control_probability; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment_multi_prerender_probability = 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) release_experiment_multi_prerender_probability; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) experiment_15min_ttl_probability = release_experiment_15min_ttl_probability; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment_no_use_probability = release_experiment_no_use_probability; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In testing channels, use more experiments and a larger control group to 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // improve quality of data. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability dev_prerender_enabled_probability = 250; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability dev_control_probability = 250; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dev_experiment_multi_prerender_probability = 250; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability dev_experiment_15min_ttl_probability = 125; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability dev_experiment_no_use_probability = 125; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(dev_prerender_enabled_probability + dev_control_probability + 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dev_experiment_multi_prerender_probability + 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dev_experiment_15min_ttl_probability + 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dev_experiment_no_use_probability == divisor, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dev_experiment_probabilities_must_equal_divisor); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) control_probability = dev_control_probability; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment_multi_prerender_probability = 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dev_experiment_multi_prerender_probability; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) experiment_15min_ttl_probability = dev_experiment_15min_ttl_probability; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment_no_use_probability = dev_experiment_no_use_probability; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prerender_enabled_group = -1; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<FieldTrial> trial( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::FactoryGetFieldTrial( 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Prerender", divisor, "PrerenderEnabled", 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2013, 12, 31, &prerender_enabled_group)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int control_group = 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("PrerenderControl", 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_probability); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int experiment_multi_prerender_group = 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("PrerenderMulti", 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment_multi_prerender_probability); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int experiment_15_min_TTL_group = 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("Prerender15minTTL", 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment_15min_ttl_probability); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int experiment_no_use_group = 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("PrerenderNoUse", 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment_no_use_probability); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int trial_group = trial->group(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (trial_group == prerender_enabled_group) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (trial_group == control_group) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (trial_group == experiment_multi_prerender_group) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_MULTI_PRERENDER_GROUP); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (trial_group == experiment_15_min_TTL_group) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_15MIN_TTL_GROUP); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (trial_group == experiment_no_use_group) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_NO_USE_GROUP); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // end namespace 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConfigureOmniboxPrerender(); 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ConfigureLoggedInPredictor(); 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ConfigureSideEffectFreeWhitelist(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConfigurePrefetchAndPrerender(const CommandLine& command_line) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum PrerenderOption { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_OPTION_AUTO, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_OPTION_DISABLED, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_OPTION_ENABLED, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_OPTION_PREFETCH_ONLY, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderOption prerender_option = PRERENDER_OPTION_AUTO; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kPrerenderMode)) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string switch_value = 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.GetSwitchValueASCII(switches::kPrerenderMode); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (switch_value == switches::kPrerenderModeSwitchValueAuto) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_option = PRERENDER_OPTION_AUTO; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (switch_value == switches::kPrerenderModeSwitchValueDisabled) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_option = PRERENDER_OPTION_DISABLED; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (switch_value.empty() || 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch_value == switches::kPrerenderModeSwitchValueEnabled) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The empty string means the option was provided with no value, and that 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // means enable. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_option = PRERENDER_OPTION_ENABLED; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (switch_value == 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPrerenderModeSwitchValuePrefetchOnly) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_option = PRERENDER_OPTION_PREFETCH_ONLY; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_option = PRERENDER_OPTION_DISABLED; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Invalid --prerender option received on command line: " 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << switch_value; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Disabling prerendering!"; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (prerender_option) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRERENDER_OPTION_AUTO: 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupPrefetchFieldTrial(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupPrerenderFieldTrial(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRERENDER_OPTION_DISABLED: 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetIsPrefetchEnabled(false); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_DISABLED); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRERENDER_OPTION_ENABLED: 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetIsPrefetchEnabled(true); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_ENABLED); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRERENDER_OPTION_PREFETCH_ONLY: 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetIsPrefetchEnabled(true); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_DISABLED); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureOmniboxPrerender(); 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ConfigureLoggedInPredictor(); 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ConfigureSideEffectFreeWhitelist(); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConfigureOmniboxPrerender() { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Field trial to see if we're enabled. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability kDivisor = 100; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial::Probability kDisabledProbability = 10; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (channel == chrome::VersionInfo::CHANNEL_STABLE || 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel == chrome::VersionInfo::CHANNEL_BETA) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDisabledProbability = 1; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<FieldTrial> omnibox_prerender_trial( 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::FactoryGetFieldTrial( 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kOmniboxTrialName, kDivisor, "OmniboxPrerenderEnabled", 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2013, 12, 31, &g_omnibox_trial_default_group_number)); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) omnibox_prerender_trial->AppendGroup("OmniboxPrerenderDisabled", 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDisabledProbability); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ConfigureLoggedInPredictor() { 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (channel == chrome::VersionInfo::CHANNEL_STABLE || 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) channel == chrome::VersionInfo::CHANNEL_BETA) { 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FieldTrial> logged_in_predictor_trial( 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FieldTrialList::FactoryGetFieldTrial( 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kLoggedInPredictorTrialName, 100, 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kLoggedInPredictorDisabledGroup, 2013, 12, 31, NULL)); 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) logged_in_predictor_trial->AppendGroup(kLoggedInPredictorEnabledGroup, 100); 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ConfigureSideEffectFreeWhitelist() { 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<FieldTrial> side_effect_free_whitelist_trial( 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FieldTrialList::FactoryGetFieldTrial( 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kSideEffectFreeWhitelistTrialName, 100, 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kSideEffectFreeWhitelistDisabledGroup, 2013, 12, 31, NULL)); 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (channel == chrome::VersionInfo::CHANNEL_STABLE || 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) channel == chrome::VersionInfo::CHANNEL_BETA) { 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) side_effect_free_whitelist_trial->AppendGroup( 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kSideEffectFreeWhitelistEnabledGroup, 100); 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsOmniboxEnabled(Profile* profile) { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!profile) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PrerenderManager::IsPrerenderingPossible()) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override any field trial groups if the user has set a command line flag. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPrerenderFromOmnibox)) { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string switch_value = 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::ForCurrentProcess()->GetSwitchValueASCII( 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPrerenderFromOmnibox); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (switch_value == switches::kPrerenderFromOmniboxSwitchValueEnabled) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (switch_value == switches::kPrerenderFromOmniboxSwitchValueDisabled) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(switch_value == switches::kPrerenderFromOmniboxSwitchValueAuto); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int group = FieldTrialList::FindValue(kOmniboxTrialName); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return group == FieldTrial::kNotFinalized || 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group == g_omnibox_trial_default_group_number; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsLocalPredictorEnabled() { 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FieldTrialList::FindFullName(kLocalPredictorTrialName) == 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kLocalPredictorEnabledGroup; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsLoggedInPredictorEnabled() { 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return base::FieldTrialList::FindFullName(kLoggedInPredictorTrialName) == 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kLoggedInPredictorEnabledGroup; 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsSideEffectFreeWhitelistEnabled() { 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return base::FieldTrialList::FindFullName(kSideEffectFreeWhitelistTrialName) 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) == kSideEffectFreeWhitelistEnabledGroup; 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace prerender 303