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