1 // Copyright 2014 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 "components/signin/core/common/profile_management_switches.h"
6
7 #include "base/command_line.h"
8 #include "base/metrics/field_trial.h"
9 #include "build/build_config.h"
10 #include "components/signin/core/common/signin_switches.h"
11
12 namespace {
13
14 const char kNewProfileManagementFieldTrialName[] = "NewProfileManagement";
15
16 // Different state of new profile management/identity consistency. The code
17 // below assumes the order of the values in this enum. That is, new profile
18 // management is included in consistent identity.
19 enum State {
20 STATE_OLD_AVATAR_MENU,
21 STATE_NEW_AVATAR_MENU,
22 STATE_NEW_PROFILE_MANAGEMENT,
23 STATE_ACCOUNT_CONSISTENCY,
24 };
25
GetProcessState()26 State GetProcessState() {
27 // Disables the new avatar menu if the web-based signin is turned on, because
28 // the new avatar menu always uses the inline signin, which may break some
29 // SAML users.
30 if (switches::IsEnableWebBasedSignin())
31 return STATE_OLD_AVATAR_MENU;
32
33 // Find the state of both command line args.
34 bool is_new_avatar_menu =
35 CommandLine::ForCurrentProcess()->HasSwitch(
36 switches::kEnableNewAvatarMenu);
37 bool is_new_profile_management =
38 CommandLine::ForCurrentProcess()->HasSwitch(
39 switches::kEnableNewProfileManagement);
40 bool is_consistent_identity =
41 CommandLine::ForCurrentProcess()->HasSwitch(
42 switches::kEnableAccountConsistency);
43 bool not_new_avatar_menu =
44 CommandLine::ForCurrentProcess()->HasSwitch(
45 switches::kDisableNewAvatarMenu);
46 bool not_new_profile_management =
47 CommandLine::ForCurrentProcess()->HasSwitch(
48 switches::kDisableNewProfileManagement);
49 bool not_consistent_identity =
50 CommandLine::ForCurrentProcess()->HasSwitch(
51 switches::kDisableAccountConsistency);
52 int count_args = (is_new_avatar_menu ? 1 : 0) +
53 (is_new_profile_management ? 1 : 0) +
54 (is_consistent_identity ? 1 : 0) +
55 (not_new_avatar_menu ? 1 : 0) +
56 (not_new_profile_management ? 1 : 0) +
57 (not_consistent_identity ? 1 : 0);
58 bool invalid_commandline = count_args > 1;
59
60 // At most only one of the command line args should be specified, otherwise
61 // the finch group assignment is undefined. If this is the case, disable
62 // the field trial so that data is not collected in the wrong group.
63 std::string trial_type;
64 if (invalid_commandline) {
65 base::FieldTrial* field_trial =
66 base::FieldTrialList::Find(kNewProfileManagementFieldTrialName);
67 if (field_trial)
68 field_trial->Disable();
69
70 trial_type.clear();
71 } else {
72 // Since the experiment is not being disabled, get the full name of the
73 // field trial which will initialize the underlying mechanism.
74 trial_type =
75 base::FieldTrialList::FindFullName(kNewProfileManagementFieldTrialName);
76 }
77
78 // Forcing the old avatar menu takes precedent over other args.
79 // Enable command line args take precedent over disable command line args.
80 // Consistent identity args take precedent over new profile management args.
81 if (not_new_avatar_menu) {
82 return STATE_OLD_AVATAR_MENU;
83 } else if (is_consistent_identity) {
84 return STATE_ACCOUNT_CONSISTENCY;
85 } else if (is_new_profile_management) {
86 return STATE_NEW_PROFILE_MANAGEMENT;
87 } else if (is_new_avatar_menu) {
88 return STATE_NEW_AVATAR_MENU;
89 } else if (not_new_profile_management) {
90 return STATE_OLD_AVATAR_MENU;
91 } else if (not_consistent_identity) {
92 return STATE_OLD_AVATAR_MENU;
93 }
94
95 // Set the default state
96 #if defined(OS_ANDROID)
97 State state = STATE_ACCOUNT_CONSISTENCY;
98 #else
99 State state = STATE_OLD_AVATAR_MENU;
100 #endif
101
102 if (!trial_type.empty()) {
103 if (trial_type == "Enabled") {
104 state = STATE_NEW_PROFILE_MANAGEMENT;
105 } else if (trial_type == "AccountConsistency") {
106 state = STATE_ACCOUNT_CONSISTENCY;
107 } else if (trial_type == "NewAvatarMenu") {
108 state = STATE_NEW_AVATAR_MENU;
109 } else {
110 state = STATE_OLD_AVATAR_MENU;
111 }
112 }
113
114 return state;
115 }
116
CheckFlag(std::string command_switch,State min_state)117 bool CheckFlag(std::string command_switch, State min_state) {
118 // Individiual flag settings take precedence.
119 if (CommandLine::ForCurrentProcess()->HasSwitch(command_switch))
120 return true;
121
122 return GetProcessState() >= min_state;
123 }
124
125 } // namespace
126
127 namespace switches {
128
IsEnableAccountConsistency()129 bool IsEnableAccountConsistency() {
130 return GetProcessState() >= STATE_ACCOUNT_CONSISTENCY;
131 }
132
IsEnableWebBasedSignin()133 bool IsEnableWebBasedSignin() {
134 return CommandLine::ForCurrentProcess()->HasSwitch(
135 switches::kEnableWebBasedSignin);
136 }
137
IsExtensionsMultiAccount()138 bool IsExtensionsMultiAccount() {
139 return CheckFlag(switches::kExtensionsMultiAccount,
140 STATE_NEW_PROFILE_MANAGEMENT);
141 }
142
IsFastUserSwitching()143 bool IsFastUserSwitching() {
144 return CommandLine::ForCurrentProcess()->HasSwitch(
145 switches::kFastUserSwitching);
146 }
147
IsGoogleProfileInfo()148 bool IsGoogleProfileInfo() {
149 return CheckFlag(switches::kGoogleProfileInfo, STATE_NEW_AVATAR_MENU);
150 }
151
IsNewAvatarMenu()152 bool IsNewAvatarMenu() {
153 // NewAvatarMenu is only available on desktop.
154 #if defined(OS_ANDROID) || defined(OS_IOS) || defined(OS_CHROMEOS)
155 return false;
156 #else
157 return GetProcessState() >= STATE_NEW_AVATAR_MENU;
158 #endif
159 }
160
IsNewProfileManagement()161 bool IsNewProfileManagement() {
162 return GetProcessState() >= STATE_NEW_PROFILE_MANAGEMENT;
163 }
164
IsNewProfileManagementPreviewEnabled()165 bool IsNewProfileManagementPreviewEnabled() {
166 // No promotion to Enable Account Consistency.
167 return false;
168 }
169
EnableNewAvatarMenuForTesting(base::CommandLine * command_line)170 void EnableNewAvatarMenuForTesting(base::CommandLine* command_line) {
171 command_line->AppendSwitch(switches::kEnableNewAvatarMenu);
172 DCHECK(!command_line->HasSwitch(switches::kDisableNewAvatarMenu));
173 }
174
DisableNewAvatarMenuForTesting(base::CommandLine * command_line)175 void DisableNewAvatarMenuForTesting(base::CommandLine* command_line) {
176 command_line->AppendSwitch(switches::kDisableNewAvatarMenu);
177 DCHECK(!command_line->HasSwitch(switches::kEnableNewAvatarMenu));
178 }
179
EnableNewProfileManagementForTesting(base::CommandLine * command_line)180 void EnableNewProfileManagementForTesting(base::CommandLine* command_line) {
181 command_line->AppendSwitch(switches::kEnableNewProfileManagement);
182 DCHECK(!command_line->HasSwitch(switches::kDisableNewProfileManagement));
183 }
184
EnableAccountConsistencyForTesting(base::CommandLine * command_line)185 void EnableAccountConsistencyForTesting(base::CommandLine* command_line) {
186 command_line->AppendSwitch(switches::kEnableAccountConsistency);
187 DCHECK(!command_line->HasSwitch(switches::kDisableAccountConsistency));
188 }
189
190 } // namespace switches
191