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"
132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "base/strings/string_split.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/net/prediction_options.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/predictors/autocomplete_action_predictor.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_version_info.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/pref_names.h"
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/metrics/metrics_service.h"
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "components/variations/variations_associated_data.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::FieldTrial;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::FieldTrialList;
282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochusing base::StringToInt;
292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochusing std::string;
302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochusing std::vector;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOmniboxTrialName[] = "PrerenderFromOmnibox";
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int g_omnibox_trial_default_group_number = kint32min;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kDisabledGroup[] = "Disabled";
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kEnabledGroup[] = "Enabled";
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst char kLocalPredictorSpecTrialName[] = "PrerenderLocalPredictorSpec";
432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst char kLocalPredictorKeyName[] = "LocalPredictor";
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kLocalPredictorUnencryptedSyncOnlyKeyName[] =
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "LocalPredictorUnencryptedSyncOnly";
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kLocalPredictorNetworkPredictionEnabledOnly[] =
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    "LocalPredictorNetworkPredictionEnabledOnly";
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kLocalPredictorOnCellularOnly[] = "LocalPredictorOnCellularOnly";
492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst char kSideEffectFreeWhitelistKeyName[] = "SideEffectFreeWhitelist";
502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst char kPrerenderLaunchKeyName[] = "PrerenderLaunch";
512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst char kPrerenderAlwaysControlKeyName[] = "PrerenderAlwaysControl";
526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const char kPrerenderPrefetchKeyName[] = "PrerenderPrefetch";
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kPrerenderQueryPrerenderServiceKeyName[] =
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "PrerenderQueryPrerenderService";
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kPrerenderQueryPrerenderServiceCurrentURLKeyName[] =
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "PrerenderQueryPrerenderServiceCurrentURL";
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kPrerenderQueryPrerenderServiceCandidateURLsKeyName[] =
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "PrerenderQueryPrerenderServiceCandidateURLs";
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kPrerenderServiceBehaviorIDKeyName[] = "PrerenderServiceBehaviorID";
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kPrerenderServiceFetchTimeoutKeyName[] =
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "PrerenderServiceFetchTimeoutMs";
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kPrefetchListTimeoutKeyName[] = "PrefetchListTimeoutSeconds";
632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst char kPrerenderTTLKeyName[] = "PrerenderTTLSeconds";
642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst char kPrerenderPriorityHalfLifeTimeKeyName[] =
652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    "PrerenderPriorityHalfLifeTimeSeconds";
662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst char kMaxConcurrentPrerenderKeyName[] = "MaxConcurrentPrerenders";
676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const char kMaxLaunchPrerenderKeyName[] = "MaxLaunchPrerenders";
682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst char kSkipFragment[] = "SkipFragment";
692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst char kSkipHTTPS[] = "SkipHTTPS";
702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst char kSkipWhitelist[] = "SkipWhitelist";
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kSkipServiceWhitelist[] = "SkipServiceWhitelist";
722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst char kSkipLoggedIn[] = "SkipLoggedIn";
732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst char kSkipDefaultNoPrerender[] = "SkipDefaultNoPrerender";
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kPrerenderServiceURLPrefixParameterName[] =
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "PrerenderServiceURLPrefix";
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kDefaultPrerenderServiceURLPrefix[] =
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "https://clients4.google.com/prerenderservice/?q=";
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const int kMinPrerenderServiceTimeoutMs = 1;
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const int kMaxPrerenderServiceTimeoutMs = 10000;
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const int kDefaultPrerenderServiceTimeoutMs = 1000;
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const int kMinPrefetchListTimeoutSeconds = 1;
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const int kMaxPrefetchListTimeoutSeconds = 1800;
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const int kDefaultPrefetchListTimeoutSeconds = 300;
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kSkipPrerenderLocalCanadidates[] = "SkipPrerenderLocalCandidates";
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kSkipPrerenderServiceCanadidates[] =
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "SkipPrerenderServiceCandidates";
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char kDisableSessionStorageNamespaceMerging[] =
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    "DisableSessionStorageNamespaceMerging";
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kPrerenderCookieStore[] = "PrerenderCookieStore";
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetupPrerenderFieldTrial() {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FieldTrial::Probability divisor = 1000;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FieldTrial::Probability control_probability;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FieldTrial::Probability experiment_multi_prerender_probability;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FieldTrial::Probability experiment_15min_ttl_probability;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FieldTrial::Probability experiment_no_use_probability;
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FieldTrial::Probability experiment_match_complete_probability;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (channel == chrome::VersionInfo::CHANNEL_STABLE ||
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      channel == chrome::VersionInfo::CHANNEL_BETA) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use very conservatives and stable settings in beta and stable.
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const FieldTrial::Probability release_prerender_enabled_probability = 970;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FieldTrial::Probability release_control_probability = 10;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FieldTrial::Probability
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        release_experiment_multi_prerender_probability = 0;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FieldTrial::Probability release_experiment_15min_ttl_probability = 10;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FieldTrial::Probability release_experiment_no_use_probability = 0;
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const FieldTrial::Probability
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        release_experiment_match_complete_probability = 10;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COMPILE_ASSERT(
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        release_prerender_enabled_probability +
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        release_control_probability +
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        release_experiment_multi_prerender_probability +
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        release_experiment_15min_ttl_probability +
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        release_experiment_no_use_probability +
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        release_experiment_match_complete_probability == divisor,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        release_experiment_probabilities_must_equal_divisor);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    control_probability = release_control_probability;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    experiment_multi_prerender_probability =
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        release_experiment_multi_prerender_probability;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    experiment_15min_ttl_probability = release_experiment_15min_ttl_probability;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    experiment_no_use_probability = release_experiment_no_use_probability;
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    experiment_match_complete_probability =
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        release_experiment_match_complete_probability;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // In testing channels, use more experiments and a larger control group to
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // improve quality of data.
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const FieldTrial::Probability dev_prerender_enabled_probability = 200;
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const FieldTrial::Probability dev_control_probability = 200;
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const FieldTrial::Probability
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dev_experiment_multi_prerender_probability = 200;
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const FieldTrial::Probability dev_experiment_15min_ttl_probability = 100;
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const FieldTrial::Probability dev_experiment_no_use_probability = 100;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FieldTrial::Probability
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dev_experiment_match_complete_probability = 200;
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    COMPILE_ASSERT(dev_prerender_enabled_probability +
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   dev_control_probability +
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   dev_experiment_multi_prerender_probability +
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   dev_experiment_15min_ttl_probability +
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   dev_experiment_no_use_probability +
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   dev_experiment_match_complete_probability == divisor,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   dev_experiment_probabilities_must_equal_divisor);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    control_probability = dev_control_probability;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    experiment_multi_prerender_probability =
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dev_experiment_multi_prerender_probability;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    experiment_15min_ttl_probability = dev_experiment_15min_ttl_probability;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    experiment_no_use_probability = dev_experiment_no_use_probability;
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    experiment_match_complete_probability =
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        dev_experiment_match_complete_probability;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int prerender_enabled_group = -1;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<FieldTrial> trial(
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FieldTrialList::FactoryGetFieldTrial(
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "Prerender", divisor, "PrerenderEnabled",
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          2014, 12, 31, FieldTrial::SESSION_RANDOMIZED,
161d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          &prerender_enabled_group));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int control_group =
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trial->AppendGroup("PrerenderControl",
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         control_probability);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int experiment_multi_prerender_group =
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trial->AppendGroup("PrerenderMulti",
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         experiment_multi_prerender_probability);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int experiment_15_min_TTL_group =
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trial->AppendGroup("Prerender15minTTL",
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         experiment_15min_ttl_probability);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int experiment_no_use_group =
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trial->AppendGroup("PrerenderNoUse",
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         experiment_no_use_probability);
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const int experiment_match_complete_group =
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      trial->AppendGroup("MatchComplete",
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         experiment_match_complete_probability);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int trial_group = trial->group();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (trial_group == prerender_enabled_group) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrerenderManager::SetMode(
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PrerenderManager::PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (trial_group == control_group) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrerenderManager::SetMode(
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (trial_group == experiment_multi_prerender_group) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrerenderManager::SetMode(
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PrerenderManager::PRERENDER_MODE_EXPERIMENT_MULTI_PRERENDER_GROUP);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (trial_group == experiment_15_min_TTL_group) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrerenderManager::SetMode(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PrerenderManager::PRERENDER_MODE_EXPERIMENT_15MIN_TTL_GROUP);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (trial_group == experiment_no_use_group) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrerenderManager::SetMode(
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PrerenderManager::PRERENDER_MODE_EXPERIMENT_NO_USE_GROUP);
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (trial_group == experiment_match_complete_group) {
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrerenderManager::SetMode(
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        PrerenderManager::PRERENDER_MODE_EXPERIMENT_MATCH_COMPLETE_GROUP);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // end namespace
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConfigureOmniboxPrerender();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ConfigurePrerender(const CommandLine& command_line) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum PrerenderOption {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRERENDER_OPTION_AUTO,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRERENDER_OPTION_DISABLED,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRERENDER_OPTION_ENABLED,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrerenderOption prerender_option = PRERENDER_OPTION_AUTO;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (command_line.HasSwitch(switches::kPrerenderMode)) {
2152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    const string switch_value =
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        command_line.GetSwitchValueASCII(switches::kPrerenderMode);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (switch_value == switches::kPrerenderModeSwitchValueAuto) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_option = PRERENDER_OPTION_AUTO;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (switch_value == switches::kPrerenderModeSwitchValueDisabled) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_option = PRERENDER_OPTION_DISABLED;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (switch_value.empty() ||
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               switch_value == switches::kPrerenderModeSwitchValueEnabled) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The empty string means the option was provided with no value, and that
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // means enable.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_option = PRERENDER_OPTION_ENABLED;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_option = PRERENDER_OPTION_DISABLED;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Invalid --prerender option received on command line: "
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << switch_value;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Disabling prerendering!";
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (prerender_option) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PRERENDER_OPTION_AUTO:
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetupPrerenderFieldTrial();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PRERENDER_OPTION_DISABLED:
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_DISABLED);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PRERENDER_OPTION_ENABLED:
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_ENABLED);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConfigureOmniboxPrerender();
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConfigureOmniboxPrerender() {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Field trial to see if we're enabled.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FieldTrial::Probability kDivisor = 100;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FieldTrial::Probability kDisabledProbability = 10;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (channel == chrome::VersionInfo::CHANNEL_STABLE ||
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      channel == chrome::VersionInfo::CHANNEL_BETA) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kDisabledProbability = 1;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<FieldTrial> omnibox_prerender_trial(
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FieldTrialList::FactoryGetFieldTrial(
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kOmniboxTrialName, kDivisor, "OmniboxPrerenderEnabled",
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          2014, 12, 31, FieldTrial::SESSION_RANDOMIZED,
266d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          &g_omnibox_trial_default_group_number));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  omnibox_prerender_trial->AppendGroup("OmniboxPrerenderDisabled",
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       kDisabledProbability);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsOmniboxEnabled(Profile* profile) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!profile)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!PrerenderManager::IsPrerenderingPossible())
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override any field trial groups if the user has set a command line flag.
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kPrerenderFromOmnibox)) {
2812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    const string switch_value =
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            switches::kPrerenderFromOmnibox);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (switch_value == switches::kPrerenderFromOmniboxSwitchValueEnabled)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (switch_value == switches::kPrerenderFromOmniboxSwitchValueDisabled)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(switches::kPrerenderFromOmniboxSwitchValueAuto, switch_value);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int group = FieldTrialList::FindValue(kOmniboxTrialName);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return group == FieldTrial::kNotFinalized ||
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         group == g_omnibox_trial_default_group_number;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch/*
3002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochPrerenderLocalPredictorSpec is a field trial, and its value must have the
3012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochfollowing format:
3022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochkey1=value1:key2=value2:key3=value3
3032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdocheg "LocalPredictor=Enabled:SideEffectFreeWhitelist=Enabled"
3042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochThe function below extracts the value corresponding to a key provided from the
3052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochLocalPredictorSpec.
3062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch*/
3072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochstring GetLocalPredictorSpecValue(string spec_key) {
3082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  vector<string> elements;
309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::SplitString(FieldTrialList::FindFullName(kLocalPredictorSpecTrialName),
310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    ':', &elements);
3112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  for (int i = 0; i < static_cast<int>(elements.size()); i++) {
3122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    vector<string> key_value;
313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::SplitString(elements[i], '=', &key_value);
3142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    if (key_value.size() == 2 && key_value[0] == spec_key)
3152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      return key_value[1];
3162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
3172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  return string();
3182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
3192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool IsUnencryptedSyncEnabled(Profile* profile) {
32158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ProfileSyncService* service = ProfileSyncServiceFactory::GetInstance()->
32258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GetForProfile(profile);
323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return service && service->GetOpenTabsUIDelegate() &&
32458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      !service->EncryptEverythingEnabled();
32558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
32658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
32758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Indicates whether the Local Predictor is enabled based on field trial
32858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// selection.
3298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool IsLocalPredictorEnabled() {
330b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#if defined(OS_ANDROID) || defined(OS_IOS)
331b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return false;
332b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif
333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return
334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      !CommandLine::ForCurrentProcess()->HasSwitch(
335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          switches::kDisablePrerenderLocalPredictor) &&
336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      GetLocalPredictorSpecValue(kLocalPredictorKeyName) == kEnabledGroup;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ShouldDisableLocalPredictorBasedOnSyncAndConfiguration(Profile* profile) {
3408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return
3418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      GetLocalPredictorSpecValue(kLocalPredictorUnencryptedSyncOnlyKeyName) ==
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          kEnabledGroup &&
3438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      !IsUnencryptedSyncEnabled(profile);
34458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
34558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ShouldDisableLocalPredictorDueToPreferencesAndNetwork(Profile* profile) {
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool on_cellular =
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::NetworkChangeNotifier::IsConnectionCellular(
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          net::NetworkChangeNotifier::GetConnectionType());
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If the user is not on a cellular connection, but we require a cellular
3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // connection, we must temporarily disable our local predictions.
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!on_cellular &&
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GetLocalPredictorSpecValue(kLocalPredictorOnCellularOnly) ==
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kEnabledGroup) {
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return true;
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If we don't care whether or not network prediction will actually be
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // exercised, we do not need to temporarily disable our predictions.
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (GetLocalPredictorSpecValue(kLocalPredictorNetworkPredictionEnabledOnly) !=
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kEnabledGroup) {
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // We should temporarily disable iff the predictive network action would
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // not be exercised.
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return !chrome_browser_net::CanPrefetchAndPrerenderUI(profile->GetPrefs());
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsLoggedInPredictorEnabled() {
3728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return IsLocalPredictorEnabled();
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsSideEffectFreeWhitelistEnabled() {
3768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return IsLocalPredictorEnabled() &&
3772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      GetLocalPredictorSpecValue(kSideEffectFreeWhitelistKeyName) !=
3787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      kDisabledGroup;
3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool IsLocalPredictorPrerenderLaunchEnabled() {
3822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  return GetLocalPredictorSpecValue(kPrerenderLaunchKeyName) != kDisabledGroup;
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool IsLocalPredictorPrerenderAlwaysControlEnabled() {
3866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // If we prefetch rather than prerender, we automatically also prerender
3876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // as a control group only.
3886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return (GetLocalPredictorSpecValue(kPrerenderAlwaysControlKeyName) ==
3896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          kEnabledGroup) || IsLocalPredictorPrerenderPrefetchEnabled();
3906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
3916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool IsLocalPredictorPrerenderPrefetchEnabled() {
3936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return GetLocalPredictorSpecValue(kPrerenderPrefetchKeyName) ==
3947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      kEnabledGroup;
3957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
39758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool ShouldQueryPrerenderService(Profile* profile) {
39858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return IsUnencryptedSyncEnabled(profile) &&
39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GetLocalPredictorSpecValue(kPrerenderQueryPrerenderServiceKeyName) ==
40058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kEnabledGroup;
40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
40258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
40358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool ShouldQueryPrerenderServiceForCurrentURL() {
40458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return GetLocalPredictorSpecValue(
40558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kPrerenderQueryPrerenderServiceCurrentURLKeyName) != kDisabledGroup;
40658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
40758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
40858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool ShouldQueryPrerenderServiceForCandidateURLs() {
40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return GetLocalPredictorSpecValue(
41058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kPrerenderQueryPrerenderServiceCandidateURLsKeyName) != kDisabledGroup;
41158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
41258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
41358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)string GetPrerenderServiceURLPrefix() {
4145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  string prefix = variations::GetVariationParamValue(
41558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kLocalPredictorSpecTrialName,
41658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kPrerenderServiceURLPrefixParameterName);
417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return prefix.empty() ? kDefaultPrerenderServiceURLPrefix : prefix;
41858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
41958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
42058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)int GetPrerenderServiceBehaviorID() {
42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int id;
42258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  StringToInt(GetLocalPredictorSpecValue(kPrerenderServiceBehaviorIDKeyName),
42358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              &id);
42458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The behavior ID must be non-negative.
425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return std::max(id, 0);
42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)int GetPrerenderServiceFetchTimeoutMs() {
42958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int result;
43058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  StringToInt(GetLocalPredictorSpecValue(kPrerenderServiceFetchTimeoutKeyName),
43158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              &result);
432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If the value is outside the valid range, use the default value.
433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return (result < kMinPrerenderServiceTimeoutMs ||
434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          result > kMaxPrerenderServiceTimeoutMs) ?
435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kDefaultPrerenderServiceTimeoutMs : result;
43658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int GetPrerenderPrefetchListTimeoutSeconds() {
4395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int result;
4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  StringToInt(GetLocalPredictorSpecValue(kPrefetchListTimeoutKeyName), &result);
4415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If the value is outside the valid range, use the default value.
4425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return (result < kMinPrefetchListTimeoutSeconds ||
4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          result > kMaxPrefetchListTimeoutSeconds) ?
4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      kDefaultPrefetchListTimeoutSeconds : result;
4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int GetLocalPredictorTTLSeconds() {
4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int ttl;
4492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  StringToInt(GetLocalPredictorSpecValue(kPrerenderTTLKeyName), &ttl);
4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // If the value is outside of 10s or 600s, use a default value of 180s.
451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return (ttl < 10 || ttl > 600) ? 180 : ttl;
4527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int GetLocalPredictorPrerenderPriorityHalfLifeTimeSeconds() {
4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int half_life_time;
4562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  StringToInt(GetLocalPredictorSpecValue(kPrerenderPriorityHalfLifeTimeKeyName),
4572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch              &half_life_time);
4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Sanity check: Ensure the half life time is non-negative.
459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return std::max(half_life_time, 0);
4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int GetLocalPredictorMaxConcurrentPrerenders() {
4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int num_prerenders;
4642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  StringToInt(GetLocalPredictorSpecValue(kMaxConcurrentPrerenderKeyName),
4652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch              &num_prerenders);
466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Sanity check: Ensure the number of prerenders is between 1 and 10.
467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return std::min(std::max(num_prerenders, 1), 10);
468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
4697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)int GetLocalPredictorMaxLaunchPrerenders() {
4716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  int num_prerenders;
4726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  StringToInt(GetLocalPredictorSpecValue(kMaxLaunchPrerenderKeyName),
4736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)              &num_prerenders);
4746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Sanity check: Ensure the number of prerenders is between 1 and 10.
4756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return std::min(std::max(num_prerenders, 1), 10);
4766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
4776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochbool SkipLocalPredictorFragment() {
4792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  return GetLocalPredictorSpecValue(kSkipFragment) == kEnabledGroup;
4802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
4812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochbool SkipLocalPredictorHTTPS() {
4832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  return GetLocalPredictorSpecValue(kSkipHTTPS) == kEnabledGroup;
4842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
4852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochbool SkipLocalPredictorWhitelist() {
4872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  return GetLocalPredictorSpecValue(kSkipWhitelist) == kEnabledGroup;
4882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
4892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool SkipLocalPredictorServiceWhitelist() {
49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return GetLocalPredictorSpecValue(kSkipServiceWhitelist) == kEnabledGroup;
49258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
49358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochbool SkipLocalPredictorLoggedIn() {
4952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  return GetLocalPredictorSpecValue(kSkipLoggedIn) == kEnabledGroup;
4962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
4972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochbool SkipLocalPredictorDefaultNoPrerender() {
4992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  return GetLocalPredictorSpecValue(kSkipDefaultNoPrerender) == kEnabledGroup;
5002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
5012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
50258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool SkipLocalPredictorLocalCandidates() {
50358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return GetLocalPredictorSpecValue(kSkipPrerenderLocalCanadidates) ==
50458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kEnabledGroup;
50558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
50758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool SkipLocalPredictorServiceCandidates() {
50858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return GetLocalPredictorSpecValue(kSkipPrerenderServiceCanadidates) ==
50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kEnabledGroup;
51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
51158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ShouldMergeSessionStorageNamespaces() {
513f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetLocalPredictorSpecValue(kDisableSessionStorageNamespaceMerging) !=
514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      kDisabledGroup;
515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool IsPrerenderCookieStoreEnabled() {
518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return GetLocalPredictorSpecValue(kPrerenderCookieStore) != kDisabledGroup &&
519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      FieldTrialList::FindFullName(kPrerenderCookieStore) != kDisabledGroup;
520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace prerender
523