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