Home | History | Annotate | Download | only in common
      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:
     19   CommonSwitches()
     20       : easy_off_store_install(
     21             NULL,
     22             FeatureSwitch::DEFAULT_DISABLED),
     23         force_dev_mode_highlighting(
     24             switches::kForceDevModeHighlighting,
     25             FeatureSwitch::DEFAULT_DISABLED),
     26         prompt_for_external_extensions(
     27             NULL,
     28 #if defined(OS_WIN)
     29             FeatureSwitch::DEFAULT_ENABLED),
     30 #else
     31             FeatureSwitch::DEFAULT_DISABLED),
     32 #endif
     33         error_console(
     34             switches::kErrorConsole,
     35             FeatureSwitch::DEFAULT_DISABLED),
     36         enable_override_bookmarks_ui(
     37             switches::kEnableOverrideBookmarksUI,
     38             FeatureSwitch::DEFAULT_DISABLED),
     39         extension_action_redesign(
     40             switches::kExtensionActionRedesign,
     41             FeatureSwitch::DEFAULT_DISABLED),
     42         scripts_require_action(switches::kScriptsRequireAction,
     43                                FeatureSwitch::DEFAULT_DISABLED),
     44         embedded_extension_options(
     45             switches::kEmbeddedExtensionOptions,
     46             FeatureSwitch::DEFAULT_DISABLED),
     47         app_view(switches::kAppView,
     48                  FeatureSwitch::DEFAULT_DISABLED),
     49         mime_handler_view(switches::kMimeHandlerView,
     50                           FeatureSwitch::DEFAULT_DISABLED) {}
     51 
     52   // Enables extensions to be easily installed from sites other than the web
     53   // store.
     54   FeatureSwitch easy_off_store_install;
     55 
     56   FeatureSwitch force_dev_mode_highlighting;
     57 
     58   // Should we prompt the user before allowing external extensions to install?
     59   // Default is yes.
     60   FeatureSwitch prompt_for_external_extensions;
     61 
     62   FeatureSwitch error_console;
     63   FeatureSwitch enable_override_bookmarks_ui;
     64   FeatureSwitch extension_action_redesign;
     65   FeatureSwitch scripts_require_action;
     66   FeatureSwitch embedded_extension_options;
     67   FeatureSwitch app_view;
     68   FeatureSwitch mime_handler_view;
     69 };
     70 
     71 base::LazyInstance<CommonSwitches> g_common_switches =
     72     LAZY_INSTANCE_INITIALIZER;
     73 
     74 }  // namespace
     75 
     76 FeatureSwitch* FeatureSwitch::force_dev_mode_highlighting() {
     77   return &g_common_switches.Get().force_dev_mode_highlighting;
     78 }
     79 FeatureSwitch* FeatureSwitch::easy_off_store_install() {
     80   return &g_common_switches.Get().easy_off_store_install;
     81 }
     82 FeatureSwitch* FeatureSwitch::prompt_for_external_extensions() {
     83   return &g_common_switches.Get().prompt_for_external_extensions;
     84 }
     85 FeatureSwitch* FeatureSwitch::error_console() {
     86   return &g_common_switches.Get().error_console;
     87 }
     88 FeatureSwitch* FeatureSwitch::enable_override_bookmarks_ui() {
     89   return &g_common_switches.Get().enable_override_bookmarks_ui;
     90 }
     91 FeatureSwitch* FeatureSwitch::extension_action_redesign() {
     92   return &g_common_switches.Get().extension_action_redesign;
     93 }
     94 FeatureSwitch* FeatureSwitch::scripts_require_action() {
     95   return &g_common_switches.Get().scripts_require_action;
     96 }
     97 FeatureSwitch* FeatureSwitch::embedded_extension_options() {
     98   return &g_common_switches.Get().embedded_extension_options;
     99 }
    100 FeatureSwitch* FeatureSwitch::app_view() {
    101   return &g_common_switches.Get().app_view;
    102 }
    103 FeatureSwitch* FeatureSwitch::mime_handler_view() {
    104   return &g_common_switches.Get().mime_handler_view;
    105 }
    106 
    107 FeatureSwitch::ScopedOverride::ScopedOverride(FeatureSwitch* feature,
    108                                               bool override_value)
    109     : feature_(feature),
    110       previous_value_(feature->GetOverrideValue()) {
    111   feature_->SetOverrideValue(
    112       override_value ? OVERRIDE_ENABLED : OVERRIDE_DISABLED);
    113 }
    114 
    115 FeatureSwitch::ScopedOverride::~ScopedOverride() {
    116   feature_->SetOverrideValue(previous_value_);
    117 }
    118 
    119 FeatureSwitch::FeatureSwitch(const char* switch_name,
    120                              DefaultValue default_value) {
    121   Init(CommandLine::ForCurrentProcess(), switch_name, default_value);
    122 }
    123 
    124 FeatureSwitch::FeatureSwitch(const CommandLine* command_line,
    125                              const char* switch_name,
    126                              DefaultValue default_value) {
    127   Init(command_line, switch_name, default_value);
    128 }
    129 
    130 void FeatureSwitch::Init(const CommandLine* command_line,
    131                          const char* switch_name,
    132                          DefaultValue default_value) {
    133   command_line_ = command_line;
    134   switch_name_ = switch_name;
    135   default_value_ = default_value == DEFAULT_ENABLED;
    136   override_value_ = OVERRIDE_NONE;
    137 }
    138 
    139 bool FeatureSwitch::IsEnabled() const {
    140   if (override_value_ != OVERRIDE_NONE)
    141     return override_value_ == OVERRIDE_ENABLED;
    142 
    143   if (!switch_name_)
    144     return default_value_;
    145 
    146   std::string temp = command_line_->GetSwitchValueASCII(switch_name_);
    147   std::string switch_value;
    148   base::TrimWhitespaceASCII(temp, base::TRIM_ALL, &switch_value);
    149 
    150   if (switch_value == "1")
    151     return true;
    152 
    153   if (switch_value == "0")
    154     return false;
    155 
    156   if (!default_value_ && command_line_->HasSwitch(GetLegacyEnableFlag()))
    157     return true;
    158 
    159   if (default_value_ && command_line_->HasSwitch(GetLegacyDisableFlag()))
    160     return false;
    161 
    162   return default_value_;
    163 }
    164 
    165 std::string FeatureSwitch::GetLegacyEnableFlag() const {
    166   DCHECK(switch_name_);
    167   return std::string("enable-") + switch_name_;
    168 }
    169 
    170 std::string FeatureSwitch::GetLegacyDisableFlag() const {
    171   DCHECK(switch_name_);
    172   return std::string("disable-") + switch_name_;
    173 }
    174 
    175 void FeatureSwitch::SetOverrideValue(OverrideValue override_value) {
    176   override_value_ = override_value;
    177 }
    178 
    179 FeatureSwitch::OverrideValue FeatureSwitch::GetOverrideValue() const {
    180   return override_value_;
    181 }
    182 
    183 }  // namespace extensions
    184