1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/chrome_browser_field_trials_desktop.h"
6
7#include <string>
8
9#include "apps/field_trial_names.h"
10#include "apps/pref_names.h"
11#include "base/command_line.h"
12#include "base/metrics/field_trial.h"
13#include "base/prefs/pref_service.h"
14#include "base/strings/string_util.h"
15#include "chrome/browser/auto_launch_trial.h"
16#include "chrome/browser/google/google_util.h"
17#include "chrome/browser/gpu/chrome_gpu_util.h"
18#include "chrome/browser/omnibox/omnibox_field_trial.h"
19#include "chrome/browser/prerender/prerender_field_trial.h"
20#include "chrome/browser/profiles/profiles_state.h"
21#include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h"
22#include "chrome/browser/ui/sync/one_click_signin_helper.h"
23#include "chrome/common/chrome_switches.h"
24#include "chrome/common/chrome_version_info.h"
25#include "chrome/common/metrics/variations/variations_util.h"
26#include "content/public/common/content_constants.h"
27#include "net/spdy/spdy_session.h"
28#include "ui/base/layout.h"
29
30#if defined(OS_WIN)
31#include "net/socket/tcp_client_socket_win.h"
32#endif  // defined(OS_WIN)
33
34namespace chrome {
35
36namespace {
37
38void SetupAppLauncherFieldTrial(PrefService* local_state) {
39  if (base::FieldTrialList::FindFullName(apps::kLauncherPromoTrialName) ==
40      apps::kResetShowLauncherPromoPrefGroupName) {
41    local_state->SetBoolean(apps::prefs::kShowAppLauncherPromo, true);
42  }
43}
44
45void AutoLaunchChromeFieldTrial() {
46  std::string brand;
47  google_util::GetBrand(&brand);
48
49  // Create a 100% field trial based on the brand code.
50  if (auto_launch_trial::IsInExperimentGroup(brand)) {
51    base::FieldTrialList::CreateFieldTrial(kAutoLaunchTrialName,
52                                           kAutoLaunchTrialAutoLaunchGroup);
53  } else if (auto_launch_trial::IsInControlGroup(brand)) {
54    base::FieldTrialList::CreateFieldTrial(kAutoLaunchTrialName,
55                                           kAutoLaunchTrialControlGroup);
56  }
57}
58
59void SetupInfiniteCacheFieldTrial() {
60  const base::FieldTrial::Probability kDivisor = 100;
61
62  base::FieldTrial::Probability infinite_cache_probability = 0;
63
64  scoped_refptr<base::FieldTrial> trial(
65      base::FieldTrialList::FactoryGetFieldTrial(
66          "InfiniteCache", kDivisor, "No", 2013, 12, 31,
67          base::FieldTrial::ONE_TIME_RANDOMIZED, NULL));
68  trial->AppendGroup("Yes", infinite_cache_probability);
69  trial->AppendGroup("Control", infinite_cache_probability);
70}
71
72void DisableShowProfileSwitcherTrialIfNecessary() {
73  // This trial is created by the VariationsService, but it needs to be disabled
74  // if multi-profiles isn't enabled or if browser frame avatar menu is
75  // always hidden (Chrome OS).
76  bool avatar_menu_always_hidden = false;
77#if defined(OS_CHROMEOS)
78  avatar_menu_always_hidden = true;
79#endif
80  base::FieldTrial* trial = base::FieldTrialList::Find("ShowProfileSwitcher");
81  if (trial && (!profiles::IsMultipleProfilesEnabled() ||
82                avatar_menu_always_hidden)) {
83    trial->Disable();
84  }
85}
86
87void SetupCacheSensitivityAnalysisFieldTrial() {
88  const base::FieldTrial::Probability kDivisor = 100;
89
90  base::FieldTrial::Probability sensitivity_analysis_probability = 0;
91
92#if defined(OS_ANDROID)
93  switch (chrome::VersionInfo::GetChannel()) {
94    case chrome::VersionInfo::CHANNEL_DEV:
95      sensitivity_analysis_probability = 10;
96      break;
97    case chrome::VersionInfo::CHANNEL_BETA:
98      sensitivity_analysis_probability = 5;
99      break;
100    case chrome::VersionInfo::CHANNEL_STABLE:
101      sensitivity_analysis_probability = 1;
102      break;
103    default:
104      break;
105  }
106#endif
107
108  scoped_refptr<base::FieldTrial> trial(
109      base::FieldTrialList::FactoryGetFieldTrial(
110          "CacheSensitivityAnalysis", kDivisor, "No", 2013, 06, 15,
111          base::FieldTrial::SESSION_RANDOMIZED, NULL));
112  trial->AppendGroup("ControlA", sensitivity_analysis_probability);
113  trial->AppendGroup("ControlB", sensitivity_analysis_probability);
114  trial->AppendGroup("100A", sensitivity_analysis_probability);
115  trial->AppendGroup("100B", sensitivity_analysis_probability);
116  trial->AppendGroup("200A", sensitivity_analysis_probability);
117  trial->AppendGroup("200B", sensitivity_analysis_probability);
118  // TODO(gavinp,rvargas): Re-add 400 group to field trial if results justify.
119}
120
121void WindowsOverlappedTCPReadsFieldTrial(
122    const CommandLine& parsed_command_line) {
123#if defined(OS_WIN)
124  if (parsed_command_line.HasSwitch(switches::kOverlappedRead)) {
125    std::string option =
126        parsed_command_line.GetSwitchValueASCII(switches::kOverlappedRead);
127    if (LowerCaseEqualsASCII(option, "off"))
128      net::TCPClientSocketWin::DisableOverlappedReads();
129  } else {
130    const base::FieldTrial::Probability kDivisor = 2;  // 1 in 2 chance
131    const base::FieldTrial::Probability kOverlappedReadProbability = 1;
132    scoped_refptr<base::FieldTrial> overlapped_reads_trial(
133        base::FieldTrialList::FactoryGetFieldTrial(
134            "OverlappedReadImpact", kDivisor, "OverlappedReadEnabled",
135            2013, 6, 1, base::FieldTrial::SESSION_RANDOMIZED, NULL));
136    int overlapped_reads_disabled_group =
137        overlapped_reads_trial->AppendGroup("OverlappedReadDisabled",
138                                            kOverlappedReadProbability);
139    int assigned_group = overlapped_reads_trial->group();
140    if (assigned_group == overlapped_reads_disabled_group)
141      net::TCPClientSocketWin::DisableOverlappedReads();
142  }
143#endif
144}
145
146void SetupLowLatencyFlashAudioFieldTrial() {
147  scoped_refptr<base::FieldTrial> trial(
148      base::FieldTrialList::FactoryGetFieldTrial(
149          content::kLowLatencyFlashAudioFieldTrialName, 100, "Standard",
150          2013, 9, 1, base::FieldTrial::SESSION_RANDOMIZED, NULL));
151
152  // Trial is enabled for dev / beta / canary users only.
153  if (chrome::VersionInfo::GetChannel() != chrome::VersionInfo::CHANNEL_STABLE)
154    trial->AppendGroup(content::kLowLatencyFlashAudioFieldTrialEnabledName, 25);
155}
156
157}  // namespace
158
159void SetupDesktopFieldTrials(const CommandLine& parsed_command_line,
160                             const base::Time& install_time,
161                             PrefService* local_state) {
162  prerender::ConfigurePrefetchAndPrerender(parsed_command_line);
163  AutoLaunchChromeFieldTrial();
164  gpu_util::InitializeCompositingFieldTrial();
165  OmniboxFieldTrial::ActivateStaticTrials();
166  SetupInfiniteCacheFieldTrial();
167  SetupCacheSensitivityAnalysisFieldTrial();
168  DisableShowProfileSwitcherTrialIfNecessary();
169  WindowsOverlappedTCPReadsFieldTrial(parsed_command_line);
170  SetupAppLauncherFieldTrial(local_state);
171  SetupLowLatencyFlashAudioFieldTrial();
172}
173
174}  // namespace chrome
175