| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/prerender/prerender_field_trial.h" | 5 #include "chrome/browser/prerender/prerender_field_trial.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/metrics/field_trial.h" | 9 #include "base/metrics/field_trial.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| 11 #include "base/prefs/pref_service.h" | 11 #include "base/prefs/pref_service.h" |
| 12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/strings/string_split.h" | 13 #include "base/strings/string_split.h" |
| 14 #include "chrome/browser/metrics/metrics_service.h" | 14 #include "chrome/browser/metrics/metrics_service.h" |
| 15 #include "chrome/browser/predictors/autocomplete_action_predictor.h" | 15 #include "chrome/browser/predictors/autocomplete_action_predictor.h" |
| 16 #include "chrome/browser/prerender/prerender_manager.h" | 16 #include "chrome/browser/prerender/prerender_manager.h" |
| 17 #include "chrome/browser/profiles/profile.h" | 17 #include "chrome/browser/profiles/profile.h" |
| 18 #include "chrome/browser/sync/profile_sync_service.h" |
| 19 #include "chrome/browser/sync/profile_sync_service_factory.h" |
| 18 #include "chrome/common/chrome_switches.h" | 20 #include "chrome/common/chrome_switches.h" |
| 19 #include "chrome/common/chrome_version_info.h" | 21 #include "chrome/common/chrome_version_info.h" |
| 20 | 22 |
| 21 using base::FieldTrial; | 23 using base::FieldTrial; |
| 22 using base::FieldTrialList; | 24 using base::FieldTrialList; |
| 23 using base::SplitStringUsingSubstr; | 25 using base::SplitStringUsingSubstr; |
| 24 using base::StringToInt; | 26 using base::StringToInt; |
| 25 using std::string; | 27 using std::string; |
| 26 using std::vector; | 28 using std::vector; |
| 27 | 29 |
| 28 namespace prerender { | 30 namespace prerender { |
| 29 | 31 |
| 30 namespace { | 32 namespace { |
| 31 | 33 |
| 32 const char kOmniboxTrialName[] = "PrerenderFromOmnibox"; | 34 const char kOmniboxTrialName[] = "PrerenderFromOmnibox"; |
| 33 int g_omnibox_trial_default_group_number = kint32min; | 35 int g_omnibox_trial_default_group_number = kint32min; |
| 34 | 36 |
| 35 const char kDisabledGroup[] = "Disabled"; | 37 const char kDisabledGroup[] = "Disabled"; |
| 36 const char kEnabledGroup[] = "Enabled"; | 38 const char kEnabledGroup[] = "Enabled"; |
| 37 | 39 |
| 38 const char kLocalPredictorSpecTrialName[] = "PrerenderLocalPredictorSpec"; | 40 const char kLocalPredictorSpecTrialName[] = "PrerenderLocalPredictorSpec"; |
| 39 const char kLocalPredictorKeyName[] = "LocalPredictor"; | 41 const char kLocalPredictorKeyName[] = "LocalPredictor"; |
| 42 const char kLocalPredictorUnencryptedSyncOnlyKeyName[] = |
| 43 "LocalPredictorUnencryptedSyncOnly"; |
| 40 const char kSideEffectFreeWhitelistKeyName[] = "SideEffectFreeWhitelist"; | 44 const char kSideEffectFreeWhitelistKeyName[] = "SideEffectFreeWhitelist"; |
| 41 const char kPrerenderLaunchKeyName[] = "PrerenderLaunch"; | 45 const char kPrerenderLaunchKeyName[] = "PrerenderLaunch"; |
| 42 const char kPrerenderAlwaysControlKeyName[] = "PrerenderAlwaysControl"; | 46 const char kPrerenderAlwaysControlKeyName[] = "PrerenderAlwaysControl"; |
| 47 const char kPrerenderQueryPrerenderServiceKeyName[] = |
| 48 "PrerenderQueryPrerenderService"; |
| 49 const char kPrerenderServiceBehaviorIDKeyName[] = "PrerenderServiceBehaviorID"; |
| 50 const char kPrerenderServiceFetchTimeoutKeyName[] = |
| 51 "PrerenderServiceFetchTimeoutMs"; |
| 43 const char kPrerenderTTLKeyName[] = "PrerenderTTLSeconds"; | 52 const char kPrerenderTTLKeyName[] = "PrerenderTTLSeconds"; |
| 44 const char kPrerenderPriorityHalfLifeTimeKeyName[] = | 53 const char kPrerenderPriorityHalfLifeTimeKeyName[] = |
| 45 "PrerenderPriorityHalfLifeTimeSeconds"; | 54 "PrerenderPriorityHalfLifeTimeSeconds"; |
| 46 const char kMaxConcurrentPrerenderKeyName[] = "MaxConcurrentPrerenders"; | 55 const char kMaxConcurrentPrerenderKeyName[] = "MaxConcurrentPrerenders"; |
| 47 const char kSkipFragment[] = "SkipFragment"; | 56 const char kSkipFragment[] = "SkipFragment"; |
| 48 const char kSkipHTTPS[] = "SkipHTTPS"; | 57 const char kSkipHTTPS[] = "SkipHTTPS"; |
| 49 const char kSkipWhitelist[] = "SkipWhitelist"; | 58 const char kSkipWhitelist[] = "SkipWhitelist"; |
| 59 const char kSkipServiceWhitelist[] = "SkipServiceWhitelist"; |
| 50 const char kSkipLoggedIn[] = "SkipLoggedIn"; | 60 const char kSkipLoggedIn[] = "SkipLoggedIn"; |
| 51 const char kSkipDefaultNoPrerender[] = "SkipDefaultNoPrerender"; | 61 const char kSkipDefaultNoPrerender[] = "SkipDefaultNoPrerender"; |
| 62 const char kLocalPredictorServiceURLPrefixTrialName[] = |
| 63 "PrerenderLocalPredictorServiceURLPrefix"; |
| 64 const char kDefaultPrerenderServiceURLPrefix[] = |
| 65 "https://clients4.google.com/prerenderservice/?q="; |
| 66 const int kMinPrerenderServiceTimeoutMs = 1; |
| 67 const int kMaxPrerenderServiceTimeoutMs = 10000; |
| 68 const int kDefaultPrerenderServiceTimeoutMs = 1000; |
| 52 | 69 |
| 53 void SetupPrefetchFieldTrial() { | 70 void SetupPrefetchFieldTrial() { |
| 54 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); | 71 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); |
| 55 if (channel == chrome::VersionInfo::CHANNEL_STABLE || | 72 if (channel == chrome::VersionInfo::CHANNEL_STABLE || |
| 56 channel == chrome::VersionInfo::CHANNEL_BETA) { | 73 channel == chrome::VersionInfo::CHANNEL_BETA) { |
| 57 return; | 74 return; |
| 58 } | 75 } |
| 59 | 76 |
| 60 const FieldTrial::Probability divisor = 1000; | 77 const FieldTrial::Probability divisor = 1000; |
| 61 const FieldTrial::Probability prefetch_probability = 500; | 78 const FieldTrial::Probability prefetch_probability = 500; |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 &elements); | 301 &elements); |
| 285 for (int i = 0; i < static_cast<int>(elements.size()); i++) { | 302 for (int i = 0; i < static_cast<int>(elements.size()); i++) { |
| 286 vector<string> key_value; | 303 vector<string> key_value; |
| 287 SplitStringUsingSubstr(elements[i], "=", &key_value); | 304 SplitStringUsingSubstr(elements[i], "=", &key_value); |
| 288 if (key_value.size() == 2 && key_value[0] == spec_key) | 305 if (key_value.size() == 2 && key_value[0] == spec_key) |
| 289 return key_value[1]; | 306 return key_value[1]; |
| 290 } | 307 } |
| 291 return string(); | 308 return string(); |
| 292 } | 309 } |
| 293 | 310 |
| 294 bool IsLocalPredictorEnabled() { | 311 bool IsUnencryptedSyncEnabled(Profile* profile) { |
| 312 ProfileSyncService* service = ProfileSyncServiceFactory::GetInstance()-> |
| 313 GetForProfile(profile); |
| 314 return service && service->GetSessionModelAssociator() && |
| 315 !service->EncryptEverythingEnabled(); |
| 316 } |
| 317 |
| 318 // Indicates whether the Local Predictor is enabled based on field trial |
| 319 // selection. |
| 320 bool IsLocalPredictorEnabledBasedOnSelection() { |
| 295 #if defined(OS_ANDROID) || defined(OS_IOS) | 321 #if defined(OS_ANDROID) || defined(OS_IOS) |
| 296 return false; | 322 return false; |
| 297 #endif | 323 #endif |
| 298 if (CommandLine::ForCurrentProcess()->HasSwitch( | 324 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 299 switches::kDisablePrerenderLocalPredictor)) { | 325 switches::kDisablePrerenderLocalPredictor)) { |
| 300 return false; | 326 return false; |
| 301 } | 327 } |
| 302 return GetLocalPredictorSpecValue(kLocalPredictorKeyName) == kEnabledGroup; | 328 return GetLocalPredictorSpecValue(kLocalPredictorKeyName) == kEnabledGroup; |
| 303 } | 329 } |
| 304 | 330 |
| 331 // Usually, we enable the Local Predictor based on field trial selection |
| 332 // (see above), so we can just return that setting. |
| 333 // However, via Finch, we can specify to not create a LocalPredictor if |
| 334 // UnencryptedSync is not enabled. Therefore, we have to perform this additional |
| 335 // check to determine whether or not we actually want to enable the |
| 336 // LocalPredictor. |
| 337 bool IsLocalPredictorEnabled(Profile* profile) { |
| 338 if (GetLocalPredictorSpecValue(kLocalPredictorUnencryptedSyncOnlyKeyName) == |
| 339 kEnabledGroup && |
| 340 !IsUnencryptedSyncEnabled(profile)) { |
| 341 return false; |
| 342 } |
| 343 return IsLocalPredictorEnabledBasedOnSelection(); |
| 344 } |
| 345 |
| 305 bool IsLoggedInPredictorEnabled() { | 346 bool IsLoggedInPredictorEnabled() { |
| 306 return IsLocalPredictorEnabled(); | 347 return IsLocalPredictorEnabledBasedOnSelection(); |
| 307 } | 348 } |
| 308 | 349 |
| 309 bool IsSideEffectFreeWhitelistEnabled() { | 350 bool IsSideEffectFreeWhitelistEnabled() { |
| 310 return IsLocalPredictorEnabled() && | 351 return IsLocalPredictorEnabledBasedOnSelection() && |
| 311 GetLocalPredictorSpecValue(kSideEffectFreeWhitelistKeyName) != | 352 GetLocalPredictorSpecValue(kSideEffectFreeWhitelistKeyName) != |
| 312 kDisabledGroup; | 353 kDisabledGroup; |
| 313 } | 354 } |
| 314 | 355 |
| 315 bool IsLocalPredictorPrerenderLaunchEnabled() { | 356 bool IsLocalPredictorPrerenderLaunchEnabled() { |
| 316 return GetLocalPredictorSpecValue(kPrerenderLaunchKeyName) != kDisabledGroup; | 357 return GetLocalPredictorSpecValue(kPrerenderLaunchKeyName) != kDisabledGroup; |
| 317 } | 358 } |
| 318 | 359 |
| 319 bool IsLocalPredictorPrerenderAlwaysControlEnabled() { | 360 bool IsLocalPredictorPrerenderAlwaysControlEnabled() { |
| 320 return GetLocalPredictorSpecValue(kPrerenderAlwaysControlKeyName) == | 361 return GetLocalPredictorSpecValue(kPrerenderAlwaysControlKeyName) == |
| 321 kEnabledGroup; | 362 kEnabledGroup; |
| 322 } | 363 } |
| 323 | 364 |
| 365 bool ShouldQueryPrerenderService(Profile* profile) { |
| 366 return IsUnencryptedSyncEnabled(profile) && |
| 367 GetLocalPredictorSpecValue(kPrerenderQueryPrerenderServiceKeyName) == |
| 368 kEnabledGroup; |
| 369 } |
| 370 |
| 371 string GetPrerenderServiceURLPrefix() { |
| 372 string prefix = |
| 373 FieldTrialList::FindFullName(kLocalPredictorServiceURLPrefixTrialName); |
| 374 if (prefix.empty()) |
| 375 prefix = kDefaultPrerenderServiceURLPrefix; |
| 376 return prefix; |
| 377 } |
| 378 |
| 379 int GetPrerenderServiceBehaviorID() { |
| 380 int id; |
| 381 StringToInt(GetLocalPredictorSpecValue(kPrerenderServiceBehaviorIDKeyName), |
| 382 &id); |
| 383 // The behavior ID must be non-negative. |
| 384 if (id < 0) |
| 385 id = 0; |
| 386 return id; |
| 387 } |
| 388 |
| 389 int GetPrerenderServiceFetchTimeoutMs() { |
| 390 int result; |
| 391 StringToInt(GetLocalPredictorSpecValue(kPrerenderServiceFetchTimeoutKeyName), |
| 392 &result); |
| 393 // The behavior ID must be non-negative. |
| 394 if (result < kMinPrerenderServiceTimeoutMs || |
| 395 result > kMaxPrerenderServiceTimeoutMs) { |
| 396 result = kDefaultPrerenderServiceTimeoutMs; |
| 397 } |
| 398 return result; |
| 399 } |
| 400 |
| 324 int GetLocalPredictorTTLSeconds() { | 401 int GetLocalPredictorTTLSeconds() { |
| 325 int ttl; | 402 int ttl; |
| 326 StringToInt(GetLocalPredictorSpecValue(kPrerenderTTLKeyName), &ttl); | 403 StringToInt(GetLocalPredictorSpecValue(kPrerenderTTLKeyName), &ttl); |
| 327 // If the value is outside of 10s or 600s, use a default value of 180s. | 404 // If the value is outside of 10s or 600s, use a default value of 180s. |
| 328 if (ttl < 10 || ttl > 600) | 405 if (ttl < 10 || ttl > 600) |
| 329 ttl = 180; | 406 ttl = 180; |
| 330 return ttl; | 407 return ttl; |
| 331 } | 408 } |
| 332 | 409 |
| 333 int GetLocalPredictorPrerenderPriorityHalfLifeTimeSeconds() { | 410 int GetLocalPredictorPrerenderPriorityHalfLifeTimeSeconds() { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 358 } | 435 } |
| 359 | 436 |
| 360 bool SkipLocalPredictorHTTPS() { | 437 bool SkipLocalPredictorHTTPS() { |
| 361 return GetLocalPredictorSpecValue(kSkipHTTPS) == kEnabledGroup; | 438 return GetLocalPredictorSpecValue(kSkipHTTPS) == kEnabledGroup; |
| 362 } | 439 } |
| 363 | 440 |
| 364 bool SkipLocalPredictorWhitelist() { | 441 bool SkipLocalPredictorWhitelist() { |
| 365 return GetLocalPredictorSpecValue(kSkipWhitelist) == kEnabledGroup; | 442 return GetLocalPredictorSpecValue(kSkipWhitelist) == kEnabledGroup; |
| 366 } | 443 } |
| 367 | 444 |
| 445 bool SkipLocalPredictorServiceWhitelist() { |
| 446 return GetLocalPredictorSpecValue(kSkipServiceWhitelist) == kEnabledGroup; |
| 447 } |
| 448 |
| 368 bool SkipLocalPredictorLoggedIn() { | 449 bool SkipLocalPredictorLoggedIn() { |
| 369 return GetLocalPredictorSpecValue(kSkipLoggedIn) == kEnabledGroup; | 450 return GetLocalPredictorSpecValue(kSkipLoggedIn) == kEnabledGroup; |
| 370 } | 451 } |
| 371 | 452 |
| 372 bool SkipLocalPredictorDefaultNoPrerender() { | 453 bool SkipLocalPredictorDefaultNoPrerender() { |
| 373 return GetLocalPredictorSpecValue(kSkipDefaultNoPrerender) == kEnabledGroup; | 454 return GetLocalPredictorSpecValue(kSkipDefaultNoPrerender) == kEnabledGroup; |
| 374 } | 455 } |
| 375 | 456 |
| 376 } // namespace prerender | 457 } // namespace prerender |
| OLD | NEW |