prerender_field_trial.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
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" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/metrics/metrics_service.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/predictors/autocomplete_action_predictor.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_version_info.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::FieldTrial; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::FieldTrialList; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOmniboxTrialName[] = "PrerenderFromOmnibox"; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int g_omnibox_trial_default_group_number = kint32min; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kDisabledGroup[] = "Disabled"; 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kEnabledGroup[] = "Enabled"; 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kLocalPredictorTrialName[] = "PrerenderLocalPredictor"; 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kSideEffectFreeWhitelistTrialName[] = 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "PrerenderSideEffectFreeWhitelist"; 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kLocalPredictorPrerenderLaunchTrialName[] = 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "PrerenderLocalPredictorPrerenderLanch"; 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kLocalPredictorPrerenderAlwaysControlTrialName[] = 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "PrerenderLocalPredictorPrerenderAlwaysControl"; 407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kLocalPredictorPrerenderTTLTrialName[] = 417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "PrerenderLocalPredictorPrerenderTTLSeconds"; 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kLocalPredictorPrerenderPriorityHalfLifeTimeTrialName[] = 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "PrerenderLocalPredictorPrerenderPriorityHalfLifeTimeSeconds"; 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kLocalPredictorMaxConcurrentPrerenderTrialName[] = 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "PrerenderLocalPredictorMaxConcurrentPrerenders"; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetupPrefetchFieldTrial() { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (channel == chrome::VersionInfo::CHANNEL_STABLE || 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel == chrome::VersionInfo::CHANNEL_BETA) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability divisor = 1000; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability prefetch_probability = 500; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<FieldTrial> trial( 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::FactoryGetFieldTrial( 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Prefetch", divisor, "ContentPrefetchPrefetchOff", 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2013, 12, 31, NULL)); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kPrefetchOnGroup = trial->AppendGroup("ContentPrefetchPrefetchOn", 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefetch_probability); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetIsPrefetchEnabled(trial->group() == kPrefetchOnGroup); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetupPrerenderFieldTrial() { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability divisor = 1000; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial::Probability control_probability; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial::Probability experiment_multi_prerender_probability; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial::Probability experiment_15min_ttl_probability; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial::Probability experiment_no_use_probability; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (channel == chrome::VersionInfo::CHANNEL_STABLE || 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel == chrome::VersionInfo::CHANNEL_BETA) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use very conservatives and stable settings in beta and stable. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability release_prerender_enabled_probability = 980; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability release_control_probability = 10; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) release_experiment_multi_prerender_probability = 0; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability release_experiment_15min_ttl_probability = 10; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability release_experiment_no_use_probability = 0; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT( 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) release_prerender_enabled_probability + release_control_probability + 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) release_experiment_multi_prerender_probability + 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) release_experiment_15min_ttl_probability + 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) release_experiment_no_use_probability == divisor, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) release_experiment_probabilities_must_equal_divisor); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) control_probability = release_control_probability; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment_multi_prerender_probability = 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) release_experiment_multi_prerender_probability; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) experiment_15min_ttl_probability = release_experiment_15min_ttl_probability; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment_no_use_probability = release_experiment_no_use_probability; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In testing channels, use more experiments and a larger control group to 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // improve quality of data. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability dev_prerender_enabled_probability = 250; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability dev_control_probability = 250; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dev_experiment_multi_prerender_probability = 250; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability dev_experiment_15min_ttl_probability = 125; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability dev_experiment_no_use_probability = 125; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(dev_prerender_enabled_probability + dev_control_probability + 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dev_experiment_multi_prerender_probability + 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dev_experiment_15min_ttl_probability + 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dev_experiment_no_use_probability == divisor, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dev_experiment_probabilities_must_equal_divisor); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) control_probability = dev_control_probability; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment_multi_prerender_probability = 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dev_experiment_multi_prerender_probability; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) experiment_15min_ttl_probability = dev_experiment_15min_ttl_probability; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment_no_use_probability = dev_experiment_no_use_probability; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prerender_enabled_group = -1; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<FieldTrial> trial( 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::FactoryGetFieldTrial( 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Prerender", divisor, "PrerenderEnabled", 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2013, 12, 31, &prerender_enabled_group)); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int control_group = 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("PrerenderControl", 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_probability); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int experiment_multi_prerender_group = 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("PrerenderMulti", 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment_multi_prerender_probability); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int experiment_15_min_TTL_group = 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("Prerender15minTTL", 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment_15min_ttl_probability); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int experiment_no_use_group = 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trial->AppendGroup("PrerenderNoUse", 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) experiment_no_use_probability); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int trial_group = trial->group(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (trial_group == prerender_enabled_group) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (trial_group == control_group) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (trial_group == experiment_multi_prerender_group) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_MULTI_PRERENDER_GROUP); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (trial_group == experiment_15_min_TTL_group) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_15MIN_TTL_GROUP); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (trial_group == experiment_no_use_group) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_NO_USE_GROUP); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // end namespace 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConfigureOmniboxPrerender(); 159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void ConfigureLocalPredictor(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConfigurePrefetchAndPrerender(const CommandLine& command_line) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum PrerenderOption { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_OPTION_AUTO, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_OPTION_DISABLED, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_OPTION_ENABLED, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRERENDER_OPTION_PREFETCH_ONLY, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderOption prerender_option = PRERENDER_OPTION_AUTO; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kPrerenderMode)) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string switch_value = 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.GetSwitchValueASCII(switches::kPrerenderMode); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (switch_value == switches::kPrerenderModeSwitchValueAuto) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_option = PRERENDER_OPTION_AUTO; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (switch_value == switches::kPrerenderModeSwitchValueDisabled) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_option = PRERENDER_OPTION_DISABLED; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (switch_value.empty() || 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch_value == switches::kPrerenderModeSwitchValueEnabled) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The empty string means the option was provided with no value, and that 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // means enable. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_option = PRERENDER_OPTION_ENABLED; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (switch_value == 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPrerenderModeSwitchValuePrefetchOnly) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_option = PRERENDER_OPTION_PREFETCH_ONLY; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_option = PRERENDER_OPTION_DISABLED; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Invalid --prerender option received on command line: " 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << switch_value; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Disabling prerendering!"; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (prerender_option) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRERENDER_OPTION_AUTO: 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupPrefetchFieldTrial(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupPrerenderFieldTrial(); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRERENDER_OPTION_DISABLED: 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetIsPrefetchEnabled(false); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_DISABLED); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRERENDER_OPTION_ENABLED: 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetIsPrefetchEnabled(true); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_ENABLED); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRERENDER_OPTION_PREFETCH_ONLY: 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetIsPrefetchEnabled(true); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_DISABLED); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureOmniboxPrerender(); 216b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ConfigureLocalPredictor(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConfigureOmniboxPrerender() { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Field trial to see if we're enabled. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldTrial::Probability kDivisor = 100; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrial::Probability kDisabledProbability = 10; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (channel == chrome::VersionInfo::CHANNEL_STABLE || 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel == chrome::VersionInfo::CHANNEL_BETA) { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDisabledProbability = 1; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<FieldTrial> omnibox_prerender_trial( 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldTrialList::FactoryGetFieldTrial( 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kOmniboxTrialName, kDivisor, "OmniboxPrerenderEnabled", 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2013, 12, 31, &g_omnibox_trial_default_group_number)); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) omnibox_prerender_trial->AppendGroup("OmniboxPrerenderDisabled", 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDisabledProbability); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void ConfigureLocalPredictor() { 238b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); 239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (channel == chrome::VersionInfo::CHANNEL_STABLE || 240b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) channel == chrome::VersionInfo::CHANNEL_BETA) { 241b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return; 242b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 243b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<FieldTrial> local_predictor_trial( 244b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FieldTrialList::FactoryGetFieldTrial( 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) kLocalPredictorTrialName, 100, kDisabledGroup, 2013, 12, 31, NULL)); 2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) local_predictor_trial->AppendGroup(kEnabledGroup, 100); 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsOmniboxEnabled(Profile* profile) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!profile) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PrerenderManager::IsPrerenderingPossible()) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override any field trial groups if the user has set a command line flag. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPrerenderFromOmnibox)) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string switch_value = 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::ForCurrentProcess()->GetSwitchValueASCII( 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPrerenderFromOmnibox); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (switch_value == switches::kPrerenderFromOmniboxSwitchValueEnabled) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (switch_value == switches::kPrerenderFromOmniboxSwitchValueDisabled) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(switch_value == switches::kPrerenderFromOmniboxSwitchValueAuto); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int group = FieldTrialList::FindValue(kOmniboxTrialName); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return group == FieldTrial::kNotFinalized || 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group == g_omnibox_trial_default_group_number; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsLocalPredictorEnabled() { 278b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#if defined(OS_ANDROID) || defined(OS_IOS) 279b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return false; 280b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif 281b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 282b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) switches::kDisablePrerenderLocalPredictor)) { 283b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return false; 284b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FieldTrialList::FindFullName(kLocalPredictorTrialName) == 2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) kEnabledGroup; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsLoggedInPredictorEnabled() { 2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return IsLocalPredictorEnabled(); 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsSideEffectFreeWhitelistEnabled() { 2947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return IsLocalPredictorEnabled() && 2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::FieldTrialList::FindFullName(kSideEffectFreeWhitelistTrialName) != 2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) kDisabledGroup; 2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool IsLocalPredictorPrerenderLaunchEnabled() { 3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return base::FieldTrialList::FindFullName( 3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) kLocalPredictorPrerenderLaunchTrialName) != 3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) kDisabledGroup; 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool IsLocalPredictorPrerenderAlwaysControlEnabled() { 3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return base::FieldTrialList::FindFullName( 3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) kLocalPredictorPrerenderAlwaysControlTrialName) == 3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) kEnabledGroup; 3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int GetLocalPredictorTTLSeconds() { 3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int ttl; 3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::StringToInt( 3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::FieldTrialList::FindFullName(kLocalPredictorPrerenderTTLTrialName), 3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &ttl); 3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // If the value is outside of 10s or 600s, use a default value of 180s. 3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (ttl < 10 || ttl > 600) 3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ttl = 180; 3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return ttl; 3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int GetLocalPredictorPrerenderPriorityHalfLifeTimeSeconds() { 3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int half_life_time; 3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::StringToInt( 3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::FieldTrialList::FindFullName( 3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) kLocalPredictorPrerenderPriorityHalfLifeTimeTrialName), 3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &half_life_time); 3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Sanity check: Ensure the half life time is non-negative. 3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (half_life_time < 0) 3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) half_life_time = 0; 3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return half_life_time; 3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int GetLocalPredictorMaxConcurrentPrerenders() { 3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int num_prerenders; 3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::StringToInt( 3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::FieldTrialList::FindFullName( 3387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) kLocalPredictorMaxConcurrentPrerenderTrialName), 3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &num_prerenders); 3407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Sanity check: Ensure the number of prerenders is at least 1. 3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (num_prerenders < 1) 3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) num_prerenders = 1; 3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Sanity check: Ensure the number of prerenders is at most 10. 3447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (num_prerenders > 10) 3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) num_prerenders = 10; 3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return num_prerenders; 3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace prerender 350