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