• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "extensions/common/feature_switch.h"
6 
7 #include "base/command_line.h"
8 #include "base/lazy_instance.h"
9 #include "base/metrics/field_trial.h"
10 #include "base/strings/string_util.h"
11 #include "extensions/common/switches.h"
12 
13 namespace extensions {
14 
15 namespace {
16 
17 class CommonSwitches {
18  public:
CommonSwitches()19   CommonSwitches()
20       : easy_off_store_install(
21             switches::kEasyOffStoreExtensionInstall,
22             FeatureSwitch::DEFAULT_DISABLED),
23         force_dev_mode_highlighting(
24             switches::kForceDevModeHighlighting,
25             FeatureSwitch::DEFAULT_DISABLED),
26         global_commands(
27             switches::kGlobalCommands,
28             FeatureSwitch::DEFAULT_DISABLED),
29         script_badges(
30             switches::kScriptBadges,
31             FeatureSwitch::DEFAULT_DISABLED),
32         script_bubble(
33             switches::kScriptBubble,
34             FeatureSwitch::DEFAULT_DISABLED),
35         prompt_for_external_extensions(
36             switches::kPromptForExternalExtensions,
37 #if defined(OS_WIN)
38             FeatureSwitch::DEFAULT_ENABLED),
39 #else
40             FeatureSwitch::DEFAULT_DISABLED),
41 #endif
42         error_console(
43             switches::kErrorConsole,
44             FeatureSwitch::DEFAULT_DISABLED),
45         enable_override_bookmarks_ui(
46             switches::kEnableOverrideBookmarksUI,
47             FeatureSwitch::DEFAULT_DISABLED) {}
48 
49   FeatureSwitch easy_off_store_install;
50   FeatureSwitch force_dev_mode_highlighting;
51   FeatureSwitch global_commands;
52   FeatureSwitch script_badges;
53   FeatureSwitch script_bubble;
54   FeatureSwitch prompt_for_external_extensions;
55   FeatureSwitch error_console;
56   FeatureSwitch enable_override_bookmarks_ui;
57 };
58 
59 base::LazyInstance<CommonSwitches> g_common_switches =
60     LAZY_INSTANCE_INITIALIZER;
61 
62 }  // namespace
63 
force_dev_mode_highlighting()64 FeatureSwitch* FeatureSwitch::force_dev_mode_highlighting() {
65   return &g_common_switches.Get().force_dev_mode_highlighting;
66 }
easy_off_store_install()67 FeatureSwitch* FeatureSwitch::easy_off_store_install() {
68   return &g_common_switches.Get().easy_off_store_install;
69 }
global_commands()70 FeatureSwitch* FeatureSwitch::global_commands() {
71   return &g_common_switches.Get().global_commands;
72 }
script_badges()73 FeatureSwitch* FeatureSwitch::script_badges() {
74   return &g_common_switches.Get().script_badges;
75 }
script_bubble()76 FeatureSwitch* FeatureSwitch::script_bubble() {
77   return &g_common_switches.Get().script_bubble;
78 }
prompt_for_external_extensions()79 FeatureSwitch* FeatureSwitch::prompt_for_external_extensions() {
80   return &g_common_switches.Get().prompt_for_external_extensions;
81 }
error_console()82 FeatureSwitch* FeatureSwitch::error_console() {
83   return &g_common_switches.Get().error_console;
84 }
enable_override_bookmarks_ui()85 FeatureSwitch* FeatureSwitch::enable_override_bookmarks_ui() {
86   return &g_common_switches.Get().enable_override_bookmarks_ui;
87 }
88 
ScopedOverride(FeatureSwitch * feature,bool override_value)89 FeatureSwitch::ScopedOverride::ScopedOverride(FeatureSwitch* feature,
90                                               bool override_value)
91     : feature_(feature),
92       previous_value_(feature->GetOverrideValue()) {
93   feature_->SetOverrideValue(
94       override_value ? OVERRIDE_ENABLED : OVERRIDE_DISABLED);
95 }
96 
~ScopedOverride()97 FeatureSwitch::ScopedOverride::~ScopedOverride() {
98   feature_->SetOverrideValue(previous_value_);
99 }
100 
FeatureSwitch(const char * switch_name,DefaultValue default_value)101 FeatureSwitch::FeatureSwitch(const char* switch_name,
102                              DefaultValue default_value) {
103   Init(CommandLine::ForCurrentProcess(), switch_name, default_value);
104 }
105 
FeatureSwitch(const CommandLine * command_line,const char * switch_name,DefaultValue default_value)106 FeatureSwitch::FeatureSwitch(const CommandLine* command_line,
107                              const char* switch_name,
108                              DefaultValue default_value) {
109   Init(command_line, switch_name, default_value);
110 }
111 
Init(const CommandLine * command_line,const char * switch_name,DefaultValue default_value)112 void FeatureSwitch::Init(const CommandLine* command_line,
113                          const char* switch_name,
114                          DefaultValue default_value) {
115   command_line_ = command_line;
116   switch_name_ = switch_name;
117   default_value_ = default_value == DEFAULT_ENABLED;
118   override_value_ = OVERRIDE_NONE;
119 }
120 
IsEnabled() const121 bool FeatureSwitch::IsEnabled() const {
122   if (override_value_ != OVERRIDE_NONE)
123     return override_value_ == OVERRIDE_ENABLED;
124 
125   std::string temp = command_line_->GetSwitchValueASCII(switch_name_);
126   std::string switch_value;
127   TrimWhitespaceASCII(temp, TRIM_ALL, &switch_value);
128 
129   if (switch_value == "1")
130     return true;
131 
132   if (switch_value == "0")
133     return false;
134 
135   if (!default_value_ && command_line_->HasSwitch(GetLegacyEnableFlag()))
136     return true;
137 
138   if (default_value_ && command_line_->HasSwitch(GetLegacyDisableFlag()))
139     return false;
140 
141   return default_value_;
142 }
143 
GetLegacyEnableFlag() const144 std::string FeatureSwitch::GetLegacyEnableFlag() const {
145   return std::string("enable-") + switch_name_;
146 }
147 
GetLegacyDisableFlag() const148 std::string FeatureSwitch::GetLegacyDisableFlag() const {
149   return std::string("disable-") + switch_name_;
150 }
151 
SetOverrideValue(OverrideValue override_value)152 void FeatureSwitch::SetOverrideValue(OverrideValue override_value) {
153   override_value_ = override_value;
154 }
155 
GetOverrideValue() const156 FeatureSwitch::OverrideValue FeatureSwitch::GetOverrideValue() const {
157   return override_value_;
158 }
159 
160 }  // namespace extensions
161