| 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" | 18 #include "chrome/browser/sync/profile_sync_service.h" |
| 19 #include "chrome/browser/sync/profile_sync_service_factory.h" | 19 #include "chrome/browser/sync/profile_sync_service_factory.h" |
| 20 #include "chrome/common/chrome_switches.h" | 20 #include "chrome/common/chrome_switches.h" |
| 21 #include "chrome/common/chrome_version_info.h" | 21 #include "chrome/common/chrome_version_info.h" |
| 22 #include "components/variations/variations_associated_data.h" | 22 #include "components/variations/variations_associated_data.h" |
| 23 | 23 |
| 24 using base::FieldTrial; | 24 using base::FieldTrial; |
| 25 using base::FieldTrialList; | 25 using base::FieldTrialList; |
| 26 using base::SplitStringUsingSubstr; | |
| 27 using base::StringToInt; | 26 using base::StringToInt; |
| 28 using std::string; | 27 using std::string; |
| 29 using std::vector; | 28 using std::vector; |
| 30 | 29 |
| 31 namespace prerender { | 30 namespace prerender { |
| 32 | 31 |
| 33 namespace { | 32 namespace { |
| 34 | 33 |
| 35 const char kOmniboxTrialName[] = "PrerenderFromOmnibox"; | 34 const char kOmniboxTrialName[] = "PrerenderFromOmnibox"; |
| 36 int g_omnibox_trial_default_group_number = kint32min; | 35 int g_omnibox_trial_default_group_number = kint32min; |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 const string switch_value = | 250 const string switch_value = |
| 252 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 251 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 253 switches::kPrerenderFromOmnibox); | 252 switches::kPrerenderFromOmnibox); |
| 254 | 253 |
| 255 if (switch_value == switches::kPrerenderFromOmniboxSwitchValueEnabled) | 254 if (switch_value == switches::kPrerenderFromOmniboxSwitchValueEnabled) |
| 256 return true; | 255 return true; |
| 257 | 256 |
| 258 if (switch_value == switches::kPrerenderFromOmniboxSwitchValueDisabled) | 257 if (switch_value == switches::kPrerenderFromOmniboxSwitchValueDisabled) |
| 259 return false; | 258 return false; |
| 260 | 259 |
| 261 DCHECK(switch_value == switches::kPrerenderFromOmniboxSwitchValueAuto); | 260 DCHECK_EQ(switches::kPrerenderFromOmniboxSwitchValueAuto, switch_value); |
| 262 } | 261 } |
| 263 | 262 |
| 264 const int group = FieldTrialList::FindValue(kOmniboxTrialName); | 263 const int group = FieldTrialList::FindValue(kOmniboxTrialName); |
| 265 return group == FieldTrial::kNotFinalized || | 264 return group == FieldTrial::kNotFinalized || |
| 266 group == g_omnibox_trial_default_group_number; | 265 group == g_omnibox_trial_default_group_number; |
| 267 } | 266 } |
| 268 | 267 |
| 269 /* | 268 /* |
| 270 PrerenderLocalPredictorSpec is a field trial, and its value must have the | 269 PrerenderLocalPredictorSpec is a field trial, and its value must have the |
| 271 following format: | 270 following format: |
| 272 key1=value1:key2=value2:key3=value3 | 271 key1=value1:key2=value2:key3=value3 |
| 273 eg "LocalPredictor=Enabled:SideEffectFreeWhitelist=Enabled" | 272 eg "LocalPredictor=Enabled:SideEffectFreeWhitelist=Enabled" |
| 274 The function below extracts the value corresponding to a key provided from the | 273 The function below extracts the value corresponding to a key provided from the |
| 275 LocalPredictorSpec. | 274 LocalPredictorSpec. |
| 276 */ | 275 */ |
| 277 string GetLocalPredictorSpecValue(string spec_key) { | 276 string GetLocalPredictorSpecValue(string spec_key) { |
| 278 vector<string> elements; | 277 vector<string> elements; |
| 279 SplitStringUsingSubstr( | 278 base::SplitString(FieldTrialList::FindFullName(kLocalPredictorSpecTrialName), |
| 280 FieldTrialList::FindFullName(kLocalPredictorSpecTrialName), | 279 ':', &elements); |
| 281 ":", | |
| 282 &elements); | |
| 283 for (int i = 0; i < static_cast<int>(elements.size()); i++) { | 280 for (int i = 0; i < static_cast<int>(elements.size()); i++) { |
| 284 vector<string> key_value; | 281 vector<string> key_value; |
| 285 SplitStringUsingSubstr(elements[i], "=", &key_value); | 282 base::SplitString(elements[i], '=', &key_value); |
| 286 if (key_value.size() == 2 && key_value[0] == spec_key) | 283 if (key_value.size() == 2 && key_value[0] == spec_key) |
| 287 return key_value[1]; | 284 return key_value[1]; |
| 288 } | 285 } |
| 289 return string(); | 286 return string(); |
| 290 } | 287 } |
| 291 | 288 |
| 292 bool IsUnencryptedSyncEnabled(Profile* profile) { | 289 bool IsUnencryptedSyncEnabled(Profile* profile) { |
| 293 ProfileSyncService* service = ProfileSyncServiceFactory::GetInstance()-> | 290 ProfileSyncService* service = ProfileSyncServiceFactory::GetInstance()-> |
| 294 GetForProfile(profile); | 291 GetForProfile(profile); |
| 295 return service && service->GetOpenTabsUIDelegate() && | 292 return service && service->GetOpenTabsUIDelegate() && |
| 296 !service->EncryptEverythingEnabled(); | 293 !service->EncryptEverythingEnabled(); |
| 297 } | 294 } |
| 298 | 295 |
| 299 // Indicates whether the Local Predictor is enabled based on field trial | 296 // Indicates whether the Local Predictor is enabled based on field trial |
| 300 // selection. | 297 // selection. |
| 301 bool IsLocalPredictorEnabled() { | 298 bool IsLocalPredictorEnabled() { |
| 302 #if defined(OS_ANDROID) || defined(OS_IOS) | 299 #if defined(OS_ANDROID) || defined(OS_IOS) |
| 303 return false; | 300 return false; |
| 304 #endif | 301 #endif |
| 305 if (CommandLine::ForCurrentProcess()->HasSwitch( | 302 return |
| 306 switches::kDisablePrerenderLocalPredictor)) { | 303 !CommandLine::ForCurrentProcess()->HasSwitch( |
| 307 return false; | 304 switches::kDisablePrerenderLocalPredictor) && |
| 308 } | 305 GetLocalPredictorSpecValue(kLocalPredictorKeyName) == kEnabledGroup; |
| 309 return GetLocalPredictorSpecValue(kLocalPredictorKeyName) == kEnabledGroup; | |
| 310 } | 306 } |
| 311 | 307 |
| 312 bool DisableLocalPredictorBasedOnSyncAndConfiguration(Profile* profile) { | 308 bool DisableLocalPredictorBasedOnSyncAndConfiguration(Profile* profile) { |
| 313 return | 309 return |
| 314 GetLocalPredictorSpecValue(kLocalPredictorUnencryptedSyncOnlyKeyName) == | 310 GetLocalPredictorSpecValue(kLocalPredictorUnencryptedSyncOnlyKeyName) == |
| 315 kEnabledGroup && | 311 kEnabledGroup && |
| 316 !IsUnencryptedSyncEnabled(profile); | 312 !IsUnencryptedSyncEnabled(profile); |
| 317 } | 313 } |
| 318 | 314 |
| 319 bool IsLoggedInPredictorEnabled() { | 315 bool IsLoggedInPredictorEnabled() { |
| 320 return IsLocalPredictorEnabled(); | 316 return IsLocalPredictorEnabled(); |
| 321 } | 317 } |
| 322 | 318 |
| 323 bool IsSideEffectFreeWhitelistEnabled() { | 319 bool IsSideEffectFreeWhitelistEnabled() { |
| 324 return IsLocalPredictorEnabled() && | 320 return IsLocalPredictorEnabled() && |
| 325 GetLocalPredictorSpecValue(kSideEffectFreeWhitelistKeyName) != | 321 GetLocalPredictorSpecValue(kSideEffectFreeWhitelistKeyName) != |
| (...skipping 22 matching lines...) Expand all Loading... |
| 348 | 344 |
| 349 bool ShouldQueryPrerenderServiceForCandidateURLs() { | 345 bool ShouldQueryPrerenderServiceForCandidateURLs() { |
| 350 return GetLocalPredictorSpecValue( | 346 return GetLocalPredictorSpecValue( |
| 351 kPrerenderQueryPrerenderServiceCandidateURLsKeyName) != kDisabledGroup; | 347 kPrerenderQueryPrerenderServiceCandidateURLsKeyName) != kDisabledGroup; |
| 352 } | 348 } |
| 353 | 349 |
| 354 string GetPrerenderServiceURLPrefix() { | 350 string GetPrerenderServiceURLPrefix() { |
| 355 string prefix = chrome_variations::GetVariationParamValue( | 351 string prefix = chrome_variations::GetVariationParamValue( |
| 356 kLocalPredictorSpecTrialName, | 352 kLocalPredictorSpecTrialName, |
| 357 kPrerenderServiceURLPrefixParameterName); | 353 kPrerenderServiceURLPrefixParameterName); |
| 358 if (prefix.empty()) | 354 return prefix.empty() ? kDefaultPrerenderServiceURLPrefix : prefix; |
| 359 prefix = kDefaultPrerenderServiceURLPrefix; | |
| 360 return prefix; | |
| 361 } | 355 } |
| 362 | 356 |
| 363 int GetPrerenderServiceBehaviorID() { | 357 int GetPrerenderServiceBehaviorID() { |
| 364 int id; | 358 int id; |
| 365 StringToInt(GetLocalPredictorSpecValue(kPrerenderServiceBehaviorIDKeyName), | 359 StringToInt(GetLocalPredictorSpecValue(kPrerenderServiceBehaviorIDKeyName), |
| 366 &id); | 360 &id); |
| 367 // The behavior ID must be non-negative. | 361 // The behavior ID must be non-negative. |
| 368 if (id < 0) | 362 return std::max(id, 0); |
| 369 id = 0; | |
| 370 return id; | |
| 371 } | 363 } |
| 372 | 364 |
| 373 int GetPrerenderServiceFetchTimeoutMs() { | 365 int GetPrerenderServiceFetchTimeoutMs() { |
| 374 int result; | 366 int result; |
| 375 StringToInt(GetLocalPredictorSpecValue(kPrerenderServiceFetchTimeoutKeyName), | 367 StringToInt(GetLocalPredictorSpecValue(kPrerenderServiceFetchTimeoutKeyName), |
| 376 &result); | 368 &result); |
| 377 // The behavior ID must be non-negative. | 369 // If the value is outside the valid range, use the default value. |
| 378 if (result < kMinPrerenderServiceTimeoutMs || | 370 return (result < kMinPrerenderServiceTimeoutMs || |
| 379 result > kMaxPrerenderServiceTimeoutMs) { | 371 result > kMaxPrerenderServiceTimeoutMs) ? |
| 380 result = kDefaultPrerenderServiceTimeoutMs; | 372 kDefaultPrerenderServiceTimeoutMs : result; |
| 381 } | |
| 382 return result; | |
| 383 } | 373 } |
| 384 | 374 |
| 385 int GetLocalPredictorTTLSeconds() { | 375 int GetLocalPredictorTTLSeconds() { |
| 386 int ttl; | 376 int ttl; |
| 387 StringToInt(GetLocalPredictorSpecValue(kPrerenderTTLKeyName), &ttl); | 377 StringToInt(GetLocalPredictorSpecValue(kPrerenderTTLKeyName), &ttl); |
| 388 // If the value is outside of 10s or 600s, use a default value of 180s. | 378 // If the value is outside of 10s or 600s, use a default value of 180s. |
| 389 if (ttl < 10 || ttl > 600) | 379 return (ttl < 10 || ttl > 600) ? 180 : ttl; |
| 390 ttl = 180; | |
| 391 return ttl; | |
| 392 } | 380 } |
| 393 | 381 |
| 394 int GetLocalPredictorPrerenderPriorityHalfLifeTimeSeconds() { | 382 int GetLocalPredictorPrerenderPriorityHalfLifeTimeSeconds() { |
| 395 int half_life_time; | 383 int half_life_time; |
| 396 StringToInt(GetLocalPredictorSpecValue(kPrerenderPriorityHalfLifeTimeKeyName), | 384 StringToInt(GetLocalPredictorSpecValue(kPrerenderPriorityHalfLifeTimeKeyName), |
| 397 &half_life_time); | 385 &half_life_time); |
| 398 // Sanity check: Ensure the half life time is non-negative. | 386 // Sanity check: Ensure the half life time is non-negative. |
| 399 if (half_life_time < 0) | 387 return std::max(half_life_time, 0); |
| 400 half_life_time = 0; | |
| 401 return half_life_time; | |
| 402 } | 388 } |
| 403 | 389 |
| 404 int GetLocalPredictorMaxConcurrentPrerenders() { | 390 int GetLocalPredictorMaxConcurrentPrerenders() { |
| 405 int num_prerenders; | 391 int num_prerenders; |
| 406 StringToInt(GetLocalPredictorSpecValue(kMaxConcurrentPrerenderKeyName), | 392 StringToInt(GetLocalPredictorSpecValue(kMaxConcurrentPrerenderKeyName), |
| 407 &num_prerenders); | 393 &num_prerenders); |
| 408 // Sanity check: Ensure the number of prerenders is at least 1. | 394 // Sanity check: Ensure the number of prerenders is between 1 and 10. |
| 409 if (num_prerenders < 1) | 395 return std::min(std::max(num_prerenders, 1), 10); |
| 410 num_prerenders = 1; | 396 } |
| 411 // Sanity check: Ensure the number of prerenders is at most 10. | |
| 412 if (num_prerenders > 10) | |
| 413 num_prerenders = 10; | |
| 414 return num_prerenders; | |
| 415 }; | |
| 416 | 397 |
| 417 bool SkipLocalPredictorFragment() { | 398 bool SkipLocalPredictorFragment() { |
| 418 return GetLocalPredictorSpecValue(kSkipFragment) == kEnabledGroup; | 399 return GetLocalPredictorSpecValue(kSkipFragment) == kEnabledGroup; |
| 419 } | 400 } |
| 420 | 401 |
| 421 bool SkipLocalPredictorHTTPS() { | 402 bool SkipLocalPredictorHTTPS() { |
| 422 return GetLocalPredictorSpecValue(kSkipHTTPS) == kEnabledGroup; | 403 return GetLocalPredictorSpecValue(kSkipHTTPS) == kEnabledGroup; |
| 423 } | 404 } |
| 424 | 405 |
| 425 bool SkipLocalPredictorWhitelist() { | 406 bool SkipLocalPredictorWhitelist() { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 447 return GetLocalPredictorSpecValue(kSkipPrerenderServiceCanadidates) == | 428 return GetLocalPredictorSpecValue(kSkipPrerenderServiceCanadidates) == |
| 448 kEnabledGroup; | 429 kEnabledGroup; |
| 449 } | 430 } |
| 450 | 431 |
| 451 bool ShouldMergeSessionStorageNamespaces() { | 432 bool ShouldMergeSessionStorageNamespaces() { |
| 452 return GetLocalPredictorSpecValue(kDisableSessionStorageNamespaceMerging) != | 433 return GetLocalPredictorSpecValue(kDisableSessionStorageNamespaceMerging) != |
| 453 kDisabledGroup; | 434 kDisabledGroup; |
| 454 } | 435 } |
| 455 | 436 |
| 456 } // namespace prerender | 437 } // namespace prerender |
| OLD | NEW |