Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(280)

Side by Side Diff: chrome/browser/prerender/prerender_field_trial.cc

Issue 23622012: Integrate the LocalPredictor with the Prerender Service. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/prerender/prerender_field_trial.h ('k') | chrome/browser/prerender/prerender_local_predictor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698