feature_switch.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/field_trial.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "extensions/common/switches.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommonSwitches {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommonSwitches()
20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      : easy_off_store_install(
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            NULL,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            FeatureSwitch::DEFAULT_DISABLED),
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        force_dev_mode_highlighting(
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            switches::kForceDevModeHighlighting,
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            FeatureSwitch::DEFAULT_DISABLED),
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prompt_for_external_extensions(
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            NULL,
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            FeatureSwitch::DEFAULT_ENABLED),
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            FeatureSwitch::DEFAULT_DISABLED),
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        error_console(
34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            switches::kErrorConsole,
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            FeatureSwitch::DEFAULT_DISABLED),
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        enable_override_bookmarks_ui(
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            switches::kEnableOverrideBookmarksUI,
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            FeatureSwitch::DEFAULT_DISABLED),
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        extension_action_redesign(
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            switches::kExtensionActionRedesign,
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            FeatureSwitch::DEFAULT_DISABLED),
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        scripts_require_action(switches::kScriptsRequireAction,
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               FeatureSwitch::DEFAULT_DISABLED),
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        embedded_extension_options(
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            switches::kEmbeddedExtensionOptions,
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            FeatureSwitch::DEFAULT_DISABLED) {}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Enables extensions to be easily installed from sites other than the web
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // store.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FeatureSwitch easy_off_store_install;
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FeatureSwitch force_dev_mode_highlighting;
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Should we prompt the user before allowing external extensions to install?
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Default is yes.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FeatureSwitch prompt_for_external_extensions;
57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
58424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  FeatureSwitch error_console;
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FeatureSwitch enable_override_bookmarks_ui;
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FeatureSwitch extension_action_redesign;
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FeatureSwitch scripts_require_action;
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FeatureSwitch embedded_extension_options;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::LazyInstance<CommonSwitches> g_common_switches =
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FeatureSwitch* FeatureSwitch::force_dev_mode_highlighting() {
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return &g_common_switches.Get().force_dev_mode_highlighting;
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FeatureSwitch* FeatureSwitch::easy_off_store_install() {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &g_common_switches.Get().easy_off_store_install;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FeatureSwitch* FeatureSwitch::prompt_for_external_extensions() {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &g_common_switches.Get().prompt_for_external_extensions;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
79424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)FeatureSwitch* FeatureSwitch::error_console() {
80424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return &g_common_switches.Get().error_console;
81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FeatureSwitch* FeatureSwitch::enable_override_bookmarks_ui() {
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return &g_common_switches.Get().enable_override_bookmarks_ui;
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
85116680a4aac90f2aa7413d9095a592090648e557Ben MurdochFeatureSwitch* FeatureSwitch::extension_action_redesign() {
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return &g_common_switches.Get().extension_action_redesign;
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)FeatureSwitch* FeatureSwitch::scripts_require_action() {
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return &g_common_switches.Get().scripts_require_action;
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
91116680a4aac90f2aa7413d9095a592090648e557Ben MurdochFeatureSwitch* FeatureSwitch::embedded_extension_options() {
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return &g_common_switches.Get().embedded_extension_options;
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FeatureSwitch::ScopedOverride::ScopedOverride(FeatureSwitch* feature,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              bool override_value)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : feature_(feature),
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      previous_value_(feature->GetOverrideValue()) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  feature_->SetOverrideValue(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      override_value ? OVERRIDE_ENABLED : OVERRIDE_DISABLED);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FeatureSwitch::ScopedOverride::~ScopedOverride() {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  feature_->SetOverrideValue(previous_value_);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FeatureSwitch::FeatureSwitch(const char* switch_name,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             DefaultValue default_value) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Init(CommandLine::ForCurrentProcess(), switch_name, default_value);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FeatureSwitch::FeatureSwitch(const CommandLine* command_line,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const char* switch_name,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             DefaultValue default_value) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Init(command_line, switch_name, default_value);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FeatureSwitch::Init(const CommandLine* command_line,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const char* switch_name,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         DefaultValue default_value) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line_ = command_line;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch_name_ = switch_name;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_value_ = default_value == DEFAULT_ENABLED;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  override_value_ = OVERRIDE_NONE;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FeatureSwitch::IsEnabled() const {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (override_value_ != OVERRIDE_NONE)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return override_value_ == OVERRIDE_ENABLED;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!switch_name_)
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return default_value_;
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string temp = command_line_->GetSwitchValueASCII(switch_name_);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string switch_value;
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TrimWhitespaceASCII(temp, base::TRIM_ALL, &switch_value);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (switch_value == "1")
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (switch_value == "0")
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!default_value_ && command_line_->HasSwitch(GetLegacyEnableFlag()))
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (default_value_ && command_line_->HasSwitch(GetLegacyDisableFlag()))
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_value_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string FeatureSwitch::GetLegacyEnableFlag() const {
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(switch_name_);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string("enable-") + switch_name_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string FeatureSwitch::GetLegacyDisableFlag() const {
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(switch_name_);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string("disable-") + switch_name_;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FeatureSwitch::SetOverrideValue(OverrideValue override_value) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  override_value_ = override_value;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FeatureSwitch::OverrideValue FeatureSwitch::GetOverrideValue() const {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return override_value_;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
172