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

Side by Side Diff: extensions/common/feature_switch.cc

Issue 1680823004: [Feature Switch][Media Router] Add required field trials to MR switch. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 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 "extensions/common/feature_switch.h" 5 #include "extensions/common/feature_switch.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/lazy_instance.h" 8 #include "base/lazy_instance.h"
9 #include "base/metrics/field_trial.h" 9 #include "base/metrics/field_trial.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
11 #include "build/build_config.h" 11 #include "build/build_config.h"
12 #include "extensions/common/switches.h" 12 #include "extensions/common/switches.h"
13 13
14 namespace extensions { 14 namespace extensions {
15 15
16 namespace { 16 namespace {
17 17
18 // The switch media-router is defined in chrome/common/chrome_switches.cc, but
19 // we can't depend on chrome here.
20 const char kMediaRouterFlag[] = "media-router";
21
18 const char kEnableMediaRouterExperiment[] = "EnableMediaRouter"; 22 const char kEnableMediaRouterExperiment[] = "EnableMediaRouter";
19 const char kEnableMediaRouterWithCastExtensionExperiment[] = 23 const char kEnableMediaRouterWithCastExtensionExperiment[] =
20 "EnableMediaRouterWithCastExtension"; 24 "EnableMediaRouterWithCastExtension";
21 const char kExtensionActionRedesignExperiment[] = "ExtensionActionRedesign"; 25 const char kExtensionActionRedesignExperiment[] = "ExtensionActionRedesign";
22 26
27 const char* kEnableMediaRouterExperimentDependencies[] = {
28 kExtensionActionRedesignExperiment};
29
23 class CommonSwitches { 30 class CommonSwitches {
24 public: 31 public:
25 CommonSwitches() 32 CommonSwitches()
26 : easy_off_store_install(nullptr, FeatureSwitch::DEFAULT_DISABLED), 33 : easy_off_store_install(nullptr, FeatureSwitch::DEFAULT_DISABLED),
27 force_dev_mode_highlighting(switches::kForceDevModeHighlighting, 34 force_dev_mode_highlighting(switches::kForceDevModeHighlighting,
28 FeatureSwitch::DEFAULT_DISABLED), 35 FeatureSwitch::DEFAULT_DISABLED),
29 prompt_for_external_extensions( 36 prompt_for_external_extensions(
30 #if defined(CHROMIUM_BUILD) 37 #if defined(CHROMIUM_BUILD)
31 switches::kPromptForExternalExtensions, 38 switches::kPromptForExternalExtensions,
32 #else 39 #else
(...skipping 11 matching lines...) Expand all
44 kExtensionActionRedesignExperiment, 51 kExtensionActionRedesignExperiment,
45 FeatureSwitch::DEFAULT_DISABLED), 52 FeatureSwitch::DEFAULT_DISABLED),
46 extension_action_redesign_override(switches::kExtensionActionRedesign, 53 extension_action_redesign_override(switches::kExtensionActionRedesign,
47 FeatureSwitch::DEFAULT_ENABLED), 54 FeatureSwitch::DEFAULT_ENABLED),
48 scripts_require_action(switches::kScriptsRequireAction, 55 scripts_require_action(switches::kScriptsRequireAction,
49 FeatureSwitch::DEFAULT_DISABLED), 56 FeatureSwitch::DEFAULT_DISABLED),
50 embedded_extension_options(switches::kEmbeddedExtensionOptions, 57 embedded_extension_options(switches::kEmbeddedExtensionOptions,
51 FeatureSwitch::DEFAULT_DISABLED), 58 FeatureSwitch::DEFAULT_DISABLED),
52 trace_app_source(switches::kTraceAppSource, 59 trace_app_source(switches::kTraceAppSource,
53 FeatureSwitch::DEFAULT_ENABLED), 60 FeatureSwitch::DEFAULT_ENABLED),
54 // The switch media-router is defined in 61 media_router(
55 // chrome/common/chrome_switches.cc, but we can't depend on chrome here. 62 kMediaRouterFlag,
56 media_router("media-router", 63 kEnableMediaRouterExperiment,
57 kEnableMediaRouterExperiment, 64 std::vector<const char*>(
58 FeatureSwitch::DEFAULT_DISABLED), 65 kEnableMediaRouterExperimentDependencies,
66 kEnableMediaRouterExperimentDependencies +
67 arraysize(kEnableMediaRouterExperimentDependencies)),
68 FeatureSwitch::DEFAULT_DISABLED),
59 media_router_with_cast_extension( 69 media_router_with_cast_extension(
60 "media-router", 70 kMediaRouterFlag,
61 kEnableMediaRouterWithCastExtensionExperiment, 71 kEnableMediaRouterWithCastExtensionExperiment,
72 std::vector<const char*>(
73 kEnableMediaRouterExperimentDependencies,
74 kEnableMediaRouterExperimentDependencies +
75 arraysize(kEnableMediaRouterExperimentDependencies)),
62 FeatureSwitch::DEFAULT_DISABLED) { 76 FeatureSwitch::DEFAULT_DISABLED) {
63 } 77 }
64 78
65 // Enables extensions to be easily installed from sites other than the web 79 // Enables extensions to be easily installed from sites other than the web
66 // store. 80 // store.
67 FeatureSwitch easy_off_store_install; 81 FeatureSwitch easy_off_store_install;
68 82
69 FeatureSwitch force_dev_mode_highlighting; 83 FeatureSwitch force_dev_mode_highlighting;
70 84
71 // Should we prompt the user before allowing external extensions to install? 85 // Should we prompt the user before allowing external extensions to install?
72 // Default is yes. 86 // Default is yes.
73 FeatureSwitch prompt_for_external_extensions; 87 FeatureSwitch prompt_for_external_extensions;
74 88
75 FeatureSwitch error_console; 89 FeatureSwitch error_console;
76 FeatureSwitch enable_override_bookmarks_ui; 90 FeatureSwitch enable_override_bookmarks_ui;
77 FeatureSwitch extension_action_redesign; 91 FeatureSwitch extension_action_redesign;
78 FeatureSwitch extension_action_redesign_override; 92 FeatureSwitch extension_action_redesign_override;
79 FeatureSwitch scripts_require_action; 93 FeatureSwitch scripts_require_action;
80 FeatureSwitch embedded_extension_options; 94 FeatureSwitch embedded_extension_options;
81 FeatureSwitch trace_app_source; 95 FeatureSwitch trace_app_source;
82 FeatureSwitch media_router; 96 FeatureSwitch media_router;
83 FeatureSwitch media_router_with_cast_extension; 97 FeatureSwitch media_router_with_cast_extension;
84 }; 98 };
85 99
86 base::LazyInstance<CommonSwitches> g_common_switches = 100 base::LazyInstance<CommonSwitches> g_common_switches =
87 LAZY_INSTANCE_INITIALIZER; 101 LAZY_INSTANCE_INITIALIZER;
88 102
103 std::string GetSwitchValue(const base::CommandLine* command_line,
104 const std::string& switch_name) {
105 std::string temp = command_line->GetSwitchValueASCII(switch_name);
106 std::string switch_value;
107 base::TrimWhitespaceASCII(temp, base::TRIM_ALL, &switch_value);
108 return switch_value;
109 }
110
89 } // namespace 111 } // namespace
90 112
91 FeatureSwitch* FeatureSwitch::force_dev_mode_highlighting() { 113 FeatureSwitch* FeatureSwitch::force_dev_mode_highlighting() {
92 return &g_common_switches.Get().force_dev_mode_highlighting; 114 return &g_common_switches.Get().force_dev_mode_highlighting;
93 } 115 }
94 FeatureSwitch* FeatureSwitch::easy_off_store_install() { 116 FeatureSwitch* FeatureSwitch::easy_off_store_install() {
95 return &g_common_switches.Get().easy_off_store_install; 117 return &g_common_switches.Get().easy_off_store_install;
96 } 118 }
97 FeatureSwitch* FeatureSwitch::prompt_for_external_extensions() { 119 FeatureSwitch* FeatureSwitch::prompt_for_external_extensions() {
98 return &g_common_switches.Get().prompt_for_external_extensions; 120 return &g_common_switches.Get().prompt_for_external_extensions;
99 } 121 }
100 FeatureSwitch* FeatureSwitch::error_console() { 122 FeatureSwitch* FeatureSwitch::error_console() {
101 return &g_common_switches.Get().error_console; 123 return &g_common_switches.Get().error_console;
102 } 124 }
103 FeatureSwitch* FeatureSwitch::enable_override_bookmarks_ui() { 125 FeatureSwitch* FeatureSwitch::enable_override_bookmarks_ui() {
104 return &g_common_switches.Get().enable_override_bookmarks_ui; 126 return &g_common_switches.Get().enable_override_bookmarks_ui;
105 } 127 }
106 FeatureSwitch* FeatureSwitch::extension_action_redesign() { 128 FeatureSwitch* FeatureSwitch::extension_action_redesign() {
107 // Force-enable the redesigned extension action toolbar when the Media Router 129 // Force-enable the redesigned extension action toolbar when the Media Router
108 // is enabled. Should be removed when the toolbar redesign is used by default. 130 // is enabled. Should be removed when the toolbar redesign is used by default.
109 // See crbug.com/514694 131 // See crbug.com/514694
110 // TODO(kmarshall): Remove this override. 132 // TODO(kmarshall): Remove this override.
111 if (media_router()->IsEnabled()) 133 if (GetSwitchValue(base::CommandLine::ForCurrentProcess(),
134 kMediaRouterFlag) == "1")
Devlin 2016/02/09 18:45:14 This doesn't account for the case of, e.g., --enab
imcheng 2016/02/09 21:35:39 Checking media_router() isn't correct for users wi
Devlin 2016/02/10 18:08:33 So we need to check media_router() for most users
112 return &g_common_switches.Get().extension_action_redesign_override; 135 return &g_common_switches.Get().extension_action_redesign_override;
113 136
114 return &g_common_switches.Get().extension_action_redesign; 137 return &g_common_switches.Get().extension_action_redesign;
115 } 138 }
116 FeatureSwitch* FeatureSwitch::scripts_require_action() { 139 FeatureSwitch* FeatureSwitch::scripts_require_action() {
117 return &g_common_switches.Get().scripts_require_action; 140 return &g_common_switches.Get().scripts_require_action;
118 } 141 }
119 FeatureSwitch* FeatureSwitch::embedded_extension_options() { 142 FeatureSwitch* FeatureSwitch::embedded_extension_options() {
120 return &g_common_switches.Get().embedded_extension_options; 143 return &g_common_switches.Get().embedded_extension_options;
121 } 144 }
(...skipping 24 matching lines...) Expand all
146 : FeatureSwitch(base::CommandLine::ForCurrentProcess(), 169 : FeatureSwitch(base::CommandLine::ForCurrentProcess(),
147 switch_name, 170 switch_name,
148 default_value) {} 171 default_value) {}
149 172
150 FeatureSwitch::FeatureSwitch(const char* switch_name, 173 FeatureSwitch::FeatureSwitch(const char* switch_name,
151 const char* field_trial_name, 174 const char* field_trial_name,
152 DefaultValue default_value) 175 DefaultValue default_value)
153 : FeatureSwitch(base::CommandLine::ForCurrentProcess(), 176 : FeatureSwitch(base::CommandLine::ForCurrentProcess(),
154 switch_name, 177 switch_name,
155 field_trial_name, 178 field_trial_name,
179 std::vector<const char*>(),
180 default_value) {}
181
182 FeatureSwitch::FeatureSwitch(
183 const char* switch_name,
184 const char* field_trial_name,
Devlin 2016/02/09 18:45:14 Could we instead just always take a vector of requ
imcheng 2016/02/09 21:35:39 I think it depends on how you interpret the requir
185 const std::vector<const char*>& dependent_field_trials,
186 DefaultValue default_value)
187 : FeatureSwitch(base::CommandLine::ForCurrentProcess(),
188 switch_name,
189 field_trial_name,
190 dependent_field_trials,
156 default_value) {} 191 default_value) {}
157 192
158 FeatureSwitch::FeatureSwitch(const base::CommandLine* command_line, 193 FeatureSwitch::FeatureSwitch(const base::CommandLine* command_line,
159 const char* switch_name, 194 const char* switch_name,
160 DefaultValue default_value) 195 DefaultValue default_value)
161 : FeatureSwitch(command_line, switch_name, nullptr, default_value) {} 196 : FeatureSwitch(command_line,
197 switch_name,
198 nullptr,
199 std::vector<const char*>(),
200 default_value) {}
162 201
163 FeatureSwitch::FeatureSwitch(const base::CommandLine* command_line, 202 FeatureSwitch::FeatureSwitch(
164 const char* switch_name, 203 const base::CommandLine* command_line,
165 const char* field_trial_name, 204 const char* switch_name,
166 DefaultValue default_value) 205 const char* field_trial_name,
206 const std::vector<const char*>& dependent_field_trials,
207 DefaultValue default_value)
167 : command_line_(command_line), 208 : command_line_(command_line),
168 switch_name_(switch_name), 209 switch_name_(switch_name),
169 field_trial_name_(field_trial_name), 210 field_trial_name_(field_trial_name),
211 dependent_field_trials_(dependent_field_trials),
170 default_value_(default_value == DEFAULT_ENABLED), 212 default_value_(default_value == DEFAULT_ENABLED),
171 override_value_(OVERRIDE_NONE) {} 213 override_value_(OVERRIDE_NONE) {}
172 214
215 FeatureSwitch::~FeatureSwitch() = default;
Devlin 2016/02/09 18:45:14 we don't really use this style anywhere else that
imcheng 2016/02/09 21:35:39 Done.
216
173 bool FeatureSwitch::IsEnabled() const { 217 bool FeatureSwitch::IsEnabled() const {
174 if (override_value_ != OVERRIDE_NONE) 218 if (override_value_ != OVERRIDE_NONE)
175 return override_value_ == OVERRIDE_ENABLED; 219 return override_value_ == OVERRIDE_ENABLED;
176 220
177 if (!switch_name_) 221 if (!switch_name_)
178 return default_value_; 222 return default_value_;
179 223
180 std::string temp = command_line_->GetSwitchValueASCII(switch_name_); 224 std::string switch_value = GetSwitchValue(command_line_, switch_name_);
181 std::string switch_value;
182 base::TrimWhitespaceASCII(temp, base::TRIM_ALL, &switch_value);
183
184 if (switch_value == "1") 225 if (switch_value == "1")
185 return true; 226 return true;
186 227
187 if (switch_value == "0") 228 if (switch_value == "0")
188 return false; 229 return false;
189 230
190 if (!default_value_ && command_line_->HasSwitch(GetLegacyEnableFlag())) 231 if (!default_value_ && command_line_->HasSwitch(GetLegacyEnableFlag()))
Devlin 2016/02/09 18:45:14 unrelated to this change, but these should really
imcheng 2016/02/09 21:35:39 Ok, I will file a bug for it.
191 return true; 232 return true;
192 233
193 if (default_value_ && command_line_->HasSwitch(GetLegacyDisableFlag())) 234 if (default_value_ && command_line_->HasSwitch(GetLegacyDisableFlag()))
194 return false; 235 return false;
195 236
196 if (field_trial_name_) { 237 if (field_trial_name_) {
197 std::string group_name = 238 std::string group_name =
198 base::FieldTrialList::FindFullName(field_trial_name_); 239 base::FieldTrialList::FindFullName(field_trial_name_);
199 if (group_name == "Enabled") 240 if (group_name == "Enabled" && DependentFieldTrialsEnabled())
200 return true; 241 return true;
201 if (group_name == "Disabled") 242 if (group_name == "Disabled")
202 return false; 243 return false;
203 } 244 }
204 245
205 return default_value_; 246 return default_value_;
206 } 247 }
207 248
208 std::string FeatureSwitch::GetLegacyEnableFlag() const { 249 std::string FeatureSwitch::GetLegacyEnableFlag() const {
209 DCHECK(switch_name_); 250 DCHECK(switch_name_);
210 return std::string("enable-") + switch_name_; 251 return std::string("enable-") + switch_name_;
211 } 252 }
212 253
213 std::string FeatureSwitch::GetLegacyDisableFlag() const { 254 std::string FeatureSwitch::GetLegacyDisableFlag() const {
214 DCHECK(switch_name_); 255 DCHECK(switch_name_);
215 return std::string("disable-") + switch_name_; 256 return std::string("disable-") + switch_name_;
216 } 257 }
217 258
259 bool FeatureSwitch::DependentFieldTrialsEnabled() const {
260 for (const std::string& dependent_field_trial : dependent_field_trials_) {
261 std::string group_name =
262 base::FieldTrialList::FindFullName(dependent_field_trial);
263 if (group_name != "Enabled")
264 return false;
265 }
266 return true;
267 }
268
218 void FeatureSwitch::SetOverrideValue(OverrideValue override_value) { 269 void FeatureSwitch::SetOverrideValue(OverrideValue override_value) {
219 override_value_ = override_value; 270 override_value_ = override_value;
220 } 271 }
221 272
222 FeatureSwitch::OverrideValue FeatureSwitch::GetOverrideValue() const { 273 FeatureSwitch::OverrideValue FeatureSwitch::GetOverrideValue() const {
223 return override_value_; 274 return override_value_;
224 } 275 }
225 276
226 } // namespace extensions 277 } // namespace extensions
OLDNEW
« extensions/common/feature_switch.h ('K') | « extensions/common/feature_switch.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698