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