profile_management_switches.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/signin/core/common/profile_management_switches.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/command_line.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/metrics/field_trial.h"
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "build/build_config.h"
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/signin/core/common/signin_switches.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kNewProfileManagementFieldTrialName[] = "NewProfileManagement";
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Different state of new profile management/identity consistency.  The code
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// below assumes the order of the values in this enum.  That is, new profile
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// management is included in consistent identity.
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)enum State {
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  STATE_NONE,
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  STATE_NEW_PROFILE_MANAGEMENT,
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  STATE_ACCOUNT_CONSISTENCY
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)State GetProcessState() {
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Get the full name of the field trial so that the underlying mechanism
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // is properly initialized.
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string trial_type =
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::FieldTrialList::FindFullName(kNewProfileManagementFieldTrialName);
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Find the state of both command line args.
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_new_profile_management =
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CommandLine::ForCurrentProcess()->HasSwitch(
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          switches::kEnableNewProfileManagement);
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_consistent_identity =
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CommandLine::ForCurrentProcess()->HasSwitch(
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          switches::kEnableAccountConsistency);
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool not_new_profile_management =
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      CommandLine::ForCurrentProcess()->HasSwitch(
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          switches::kDisableNewProfileManagement);
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool not_consistent_identity =
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      CommandLine::ForCurrentProcess()->HasSwitch(
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          switches::kDisableAccountConsistency);
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int count_args = (is_new_profile_management ? 1 : 0) +
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      (is_consistent_identity ? 1 : 0) +
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      (not_new_profile_management ? 1 : 0) +
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      (not_consistent_identity ? 1 : 0);
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool invalid_commandline = count_args > 1;
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // At most only one of the command line args should be specified, otherwise
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // the finch group assignment is undefined.  If this is the case, disable
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // the field trial so that data is not collected in the wrong group.
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (invalid_commandline) {
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::FieldTrial* field_trial =
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        base::FieldTrialList::Find(kNewProfileManagementFieldTrialName);
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (field_trial)
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      field_trial->Disable();
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    trial_type.clear();
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Enable command line args take precedent over disable command line args.
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Consistent identity args take precedent over new profile management args.
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (is_consistent_identity) {
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return STATE_ACCOUNT_CONSISTENCY;
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else if (is_new_profile_management) {
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return STATE_NEW_PROFILE_MANAGEMENT;
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  } else if (not_new_profile_management) {
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return STATE_NONE;
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  } else if (not_consistent_identity) {
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return STATE_NEW_PROFILE_MANAGEMENT;
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_ANDROID)
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  State state = STATE_ACCOUNT_CONSISTENCY;
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  State state = STATE_NONE;
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!trial_type.empty()) {
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (trial_type == "Enabled") {
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      state = STATE_NEW_PROFILE_MANAGEMENT;
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    } else if (trial_type == "AccountConsistency") {
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      state = STATE_ACCOUNT_CONSISTENCY;
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    } else {
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      state = STATE_NONE;
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return state;
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool CheckFlag(std::string command_switch, State min_state) {
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Individiual flag settings take precedence.
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(command_switch))
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return true;
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return GetProcessState() >= min_state;
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace switches {
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool IsEnableAccountConsistency() {
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return GetProcessState() >= STATE_ACCOUNT_CONSISTENCY;
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool IsEnableWebBasedSignin() {
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return CommandLine::ForCurrentProcess()->HasSwitch(
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      switches::kEnableWebBasedSignin) && !IsNewProfileManagement();
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool IsExtensionsMultiAccount() {
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return CheckFlag(switches::kExtensionsMultiAccount,
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   STATE_NEW_PROFILE_MANAGEMENT);
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool IsFastUserSwitching() {
1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool use_mirror_promo_menu =
1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      CommandLine::ForCurrentProcess()->HasSwitch(switches::kNewAvatarMenu) &&
1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      !IsNewProfileManagement();
1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return CommandLine::ForCurrentProcess()->HasSwitch(
1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      switches::kFastUserSwitching) || use_mirror_promo_menu;
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool IsGoogleProfileInfo() {
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return CheckFlag(switches::kGoogleProfileInfo,
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   STATE_NEW_PROFILE_MANAGEMENT);
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
132a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool IsNewAvatarMenu() {
133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool is_new_avatar_menu =
134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      CommandLine::ForCurrentProcess()->HasSwitch(switches::kNewAvatarMenu);
135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return is_new_avatar_menu || IsNewProfileManagement();
136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool IsNewProfileManagement() {
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return GetProcessState() >= STATE_NEW_PROFILE_MANAGEMENT;
1400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
142a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool IsNewProfileManagementPreviewEnabled() {
143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool is_new_avatar_menu =
144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      CommandLine::ForCurrentProcess()->HasSwitch(switches::kNewAvatarMenu);
145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return is_new_avatar_menu && IsNewProfileManagement();
146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void EnableNewProfileManagementForTesting(base::CommandLine* command_line) {
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  command_line->AppendSwitch(switches::kEnableNewProfileManagement);
150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(!command_line->HasSwitch(switches::kDisableNewProfileManagement));
151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void EnableAccountConsistencyForTesting(base::CommandLine* command_line) {
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  command_line->AppendSwitch(switches::kEnableAccountConsistency);
155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(!command_line->HasSwitch(switches::kDisableAccountConsistency));
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace switches
159