1 // Copyright (c) 2011 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 "chrome/browser/prefs/command_line_pref_store.h" 6 7 #include "base/logging.h" 8 #include "base/values.h" 9 #include "chrome/browser/prefs/proxy_config_dictionary.h" 10 #include "chrome/common/chrome_switches.h" 11 #include "chrome/common/pref_names.h" 12 #include "ui/base/ui_base_switches.h" 13 14 const CommandLinePrefStore::StringSwitchToPreferenceMapEntry 15 CommandLinePrefStore::string_switch_map_[] = { 16 { switches::kLang, prefs::kApplicationLocale }, 17 { switches::kAuthSchemes, prefs::kAuthSchemes }, 18 { switches::kAuthServerWhitelist, prefs::kAuthServerWhitelist }, 19 { switches::kAuthNegotiateDelegateWhitelist, 20 prefs::kAuthNegotiateDelegateWhitelist }, 21 { switches::kGSSAPILibraryName, prefs::kGSSAPILibraryName }, 22 }; 23 24 const CommandLinePrefStore::BooleanSwitchToPreferenceMapEntry 25 CommandLinePrefStore::boolean_switch_map_[] = { 26 { switches::kDisableAuthNegotiateCnameLookup, 27 prefs::kDisableAuthNegotiateCnameLookup, true }, 28 { switches::kEnableAuthNegotiatePort, prefs::kEnableAuthNegotiatePort, 29 true }, 30 { switches::kDisable3DAPIs, prefs::kDisable3DAPIs, true }, 31 { switches::kEnableCloudPrintProxy, prefs::kCloudPrintProxyEnabled, 32 true }, 33 { switches::kAllowOutdatedPlugins, prefs::kPluginsAllowOutdated, true }, 34 { switches::kNoPings, prefs::kEnableHyperlinkAuditing, false }, 35 { switches::kNoReferrers, prefs::kEnableReferrers, false }, 36 }; 37 38 CommandLinePrefStore::CommandLinePrefStore(const CommandLine* command_line) 39 : command_line_(command_line) { 40 ApplySimpleSwitches(); 41 ApplyProxyMode(); 42 ValidateProxySwitches(); 43 } 44 45 CommandLinePrefStore::~CommandLinePrefStore() {} 46 47 void CommandLinePrefStore::ApplySimpleSwitches() { 48 // Look for each switch we know about and set its preference accordingly. 49 for (size_t i = 0; i < arraysize(string_switch_map_); ++i) { 50 if (command_line_->HasSwitch(string_switch_map_[i].switch_name)) { 51 Value* value = Value::CreateStringValue(command_line_-> 52 GetSwitchValueASCII(string_switch_map_[i].switch_name)); 53 SetValue(string_switch_map_[i].preference_path, value); 54 } 55 } 56 57 for (size_t i = 0; i < arraysize(boolean_switch_map_); ++i) { 58 if (command_line_->HasSwitch(boolean_switch_map_[i].switch_name)) { 59 Value* value = Value::CreateBooleanValue( 60 boolean_switch_map_[i].set_value); 61 SetValue(boolean_switch_map_[i].preference_path, value); 62 } 63 } 64 } 65 66 bool CommandLinePrefStore::ValidateProxySwitches() { 67 if (command_line_->HasSwitch(switches::kNoProxyServer) && 68 (command_line_->HasSwitch(switches::kProxyAutoDetect) || 69 command_line_->HasSwitch(switches::kProxyServer) || 70 command_line_->HasSwitch(switches::kProxyPacUrl) || 71 command_line_->HasSwitch(switches::kProxyBypassList))) { 72 LOG(WARNING) << "Additional command-line proxy switches specified when --" 73 << switches::kNoProxyServer << " was also specified."; 74 return false; 75 } 76 return true; 77 } 78 79 void CommandLinePrefStore::ApplyProxyMode() { 80 if (command_line_->HasSwitch(switches::kNoProxyServer)) { 81 SetValue(prefs::kProxy, 82 ProxyConfigDictionary::CreateDirect()); 83 } else if (command_line_->HasSwitch(switches::kProxyPacUrl)) { 84 std::string pac_script_url = 85 command_line_->GetSwitchValueASCII(switches::kProxyPacUrl); 86 SetValue(prefs::kProxy, 87 ProxyConfigDictionary::CreatePacScript(pac_script_url)); 88 } else if (command_line_->HasSwitch(switches::kProxyAutoDetect)) { 89 SetValue(prefs::kProxy, 90 ProxyConfigDictionary::CreateAutoDetect()); 91 } else if (command_line_->HasSwitch(switches::kProxyServer)) { 92 std::string proxy_server = 93 command_line_->GetSwitchValueASCII(switches::kProxyServer); 94 std::string bypass_list = 95 command_line_->GetSwitchValueASCII(switches::kProxyBypassList); 96 SetValue(prefs::kProxy, 97 ProxyConfigDictionary::CreateFixedServers(proxy_server, 98 bypass_list)); 99 } 100 } 101