| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Implementation of helper functions for the Chrome Extensions Proxy Settings | 5 // Implementation of helper functions for the Chrome Extensions Proxy Settings |
| 6 // API. | 6 // API. |
| 7 // | 7 // |
| 8 // Throughout this code, we report errors to the user by setting an |error| | 8 // Throughout this code, we report errors to the user by setting an |error| |
| 9 // parameter, if and only if these errors can be cause by invalid input | 9 // parameter, if and only if these errors can be cause by invalid input |
| 10 // from the extension and we cannot expect that the extensions API has | 10 // from the extension and we cannot expect that the extensions API has |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 if (!url.is_valid()) | 51 if (!url.is_valid()) |
| 52 return false; | 52 return false; |
| 53 | 53 |
| 54 std::string mime_type; | 54 std::string mime_type; |
| 55 std::string charset; | 55 std::string charset; |
| 56 return net::DataURL::Parse(url, &mime_type, &charset, pac_script); | 56 return net::DataURL::Parse(url, &mime_type, &charset, pac_script); |
| 57 } | 57 } |
| 58 | 58 |
| 59 // Extension Pref -> Browser Pref conversion. | 59 // Extension Pref -> Browser Pref conversion. |
| 60 | 60 |
| 61 bool GetProxyModeFromExtensionPref(const DictionaryValue* proxy_config, | 61 bool GetProxyModeFromExtensionPref(const base::DictionaryValue* proxy_config, |
| 62 ProxyPrefs::ProxyMode* out, | 62 ProxyPrefs::ProxyMode* out, |
| 63 std::string* error, | 63 std::string* error, |
| 64 bool* bad_message) { | 64 bool* bad_message) { |
| 65 std::string proxy_mode; | 65 std::string proxy_mode; |
| 66 | 66 |
| 67 // We can safely assume that this is ASCII due to the allowed enumeration | 67 // We can safely assume that this is ASCII due to the allowed enumeration |
| 68 // values specified in the extension API JSON. | 68 // values specified in the extension API JSON. |
| 69 proxy_config->GetStringASCII(keys::kProxyConfigMode, &proxy_mode); | 69 proxy_config->GetStringASCII(keys::kProxyConfigMode, &proxy_mode); |
| 70 if (!ProxyPrefs::StringToProxyMode(proxy_mode, out)) { | 70 if (!ProxyPrefs::StringToProxyMode(proxy_mode, out)) { |
| 71 LOG(ERROR) << "Invalid mode for proxy settings: " << proxy_mode; | 71 LOG(ERROR) << "Invalid mode for proxy settings: " << proxy_mode; |
| 72 *bad_message = true; | 72 *bad_message = true; |
| 73 return false; | 73 return false; |
| 74 } | 74 } |
| 75 return true; | 75 return true; |
| 76 } | 76 } |
| 77 | 77 |
| 78 bool GetPacMandatoryFromExtensionPref(const DictionaryValue* proxy_config, | 78 bool GetPacMandatoryFromExtensionPref(const base::DictionaryValue* proxy_config, |
| 79 bool* out, | 79 bool* out, |
| 80 std::string* error, | 80 std::string* error, |
| 81 bool* bad_message){ | 81 bool* bad_message){ |
| 82 const DictionaryValue* pac_dict = NULL; | 82 const base::DictionaryValue* pac_dict = NULL; |
| 83 proxy_config->GetDictionary(keys::kProxyConfigPacScript, &pac_dict); | 83 proxy_config->GetDictionary(keys::kProxyConfigPacScript, &pac_dict); |
| 84 if (!pac_dict) | 84 if (!pac_dict) |
| 85 return true; | 85 return true; |
| 86 | 86 |
| 87 bool mandatory_pac = false; | 87 bool mandatory_pac = false; |
| 88 if (pac_dict->HasKey(keys::kProxyConfigPacScriptMandatory) && | 88 if (pac_dict->HasKey(keys::kProxyConfigPacScriptMandatory) && |
| 89 !pac_dict->GetBoolean(keys::kProxyConfigPacScriptMandatory, | 89 !pac_dict->GetBoolean(keys::kProxyConfigPacScriptMandatory, |
| 90 &mandatory_pac)) { | 90 &mandatory_pac)) { |
| 91 LOG(ERROR) << "'pacScript.mandatory' could not be parsed."; | 91 LOG(ERROR) << "'pacScript.mandatory' could not be parsed."; |
| 92 *bad_message = true; | 92 *bad_message = true; |
| 93 return false; | 93 return false; |
| 94 } | 94 } |
| 95 *out = mandatory_pac; | 95 *out = mandatory_pac; |
| 96 return true; | 96 return true; |
| 97 } | 97 } |
| 98 | 98 |
| 99 bool GetPacUrlFromExtensionPref(const DictionaryValue* proxy_config, | 99 bool GetPacUrlFromExtensionPref(const base::DictionaryValue* proxy_config, |
| 100 std::string* out, | 100 std::string* out, |
| 101 std::string* error, | 101 std::string* error, |
| 102 bool* bad_message) { | 102 bool* bad_message) { |
| 103 const DictionaryValue* pac_dict = NULL; | 103 const base::DictionaryValue* pac_dict = NULL; |
| 104 proxy_config->GetDictionary(keys::kProxyConfigPacScript, &pac_dict); | 104 proxy_config->GetDictionary(keys::kProxyConfigPacScript, &pac_dict); |
| 105 if (!pac_dict) | 105 if (!pac_dict) |
| 106 return true; | 106 return true; |
| 107 | 107 |
| 108 // TODO(battre): Handle UTF-8 URLs (http://crbug.com/72692). | 108 // TODO(battre): Handle UTF-8 URLs (http://crbug.com/72692). |
| 109 string16 pac_url16; | 109 string16 pac_url16; |
| 110 if (pac_dict->HasKey(keys::kProxyConfigPacScriptUrl) && | 110 if (pac_dict->HasKey(keys::kProxyConfigPacScriptUrl) && |
| 111 !pac_dict->GetString(keys::kProxyConfigPacScriptUrl, &pac_url16)) { | 111 !pac_dict->GetString(keys::kProxyConfigPacScriptUrl, &pac_url16)) { |
| 112 LOG(ERROR) << "'pacScript.url' could not be parsed."; | 112 LOG(ERROR) << "'pacScript.url' could not be parsed."; |
| 113 *bad_message = true; | 113 *bad_message = true; |
| 114 return false; | 114 return false; |
| 115 } | 115 } |
| 116 if (!IsStringASCII(pac_url16)) { | 116 if (!IsStringASCII(pac_url16)) { |
| 117 *error = "'pacScript.url' supports only ASCII URLs " | 117 *error = "'pacScript.url' supports only ASCII URLs " |
| 118 "(encode URLs in Punycode format)."; | 118 "(encode URLs in Punycode format)."; |
| 119 return false; | 119 return false; |
| 120 } | 120 } |
| 121 *out = UTF16ToASCII(pac_url16); | 121 *out = UTF16ToASCII(pac_url16); |
| 122 return true; | 122 return true; |
| 123 } | 123 } |
| 124 | 124 |
| 125 bool GetPacDataFromExtensionPref(const DictionaryValue* proxy_config, | 125 bool GetPacDataFromExtensionPref(const base::DictionaryValue* proxy_config, |
| 126 std::string* out, | 126 std::string* out, |
| 127 std::string* error, | 127 std::string* error, |
| 128 bool* bad_message) { | 128 bool* bad_message) { |
| 129 const DictionaryValue* pac_dict = NULL; | 129 const base::DictionaryValue* pac_dict = NULL; |
| 130 proxy_config->GetDictionary(keys::kProxyConfigPacScript, &pac_dict); | 130 proxy_config->GetDictionary(keys::kProxyConfigPacScript, &pac_dict); |
| 131 if (!pac_dict) | 131 if (!pac_dict) |
| 132 return true; | 132 return true; |
| 133 | 133 |
| 134 string16 pac_data16; | 134 string16 pac_data16; |
| 135 if (pac_dict->HasKey(keys::kProxyConfigPacScriptData) && | 135 if (pac_dict->HasKey(keys::kProxyConfigPacScriptData) && |
| 136 !pac_dict->GetString(keys::kProxyConfigPacScriptData, &pac_data16)) { | 136 !pac_dict->GetString(keys::kProxyConfigPacScriptData, &pac_data16)) { |
| 137 LOG(ERROR) << "'pacScript.data' could not be parsed."; | 137 LOG(ERROR) << "'pacScript.data' could not be parsed."; |
| 138 *bad_message = true; | 138 *bad_message = true; |
| 139 return false; | 139 return false; |
| 140 } | 140 } |
| 141 if (!IsStringASCII(pac_data16)) { | 141 if (!IsStringASCII(pac_data16)) { |
| 142 *error = "'pacScript.data' supports only ASCII code" | 142 *error = "'pacScript.data' supports only ASCII code" |
| 143 "(encode URLs in Punycode format)."; | 143 "(encode URLs in Punycode format)."; |
| 144 return false; | 144 return false; |
| 145 } | 145 } |
| 146 *out = UTF16ToASCII(pac_data16); | 146 *out = UTF16ToASCII(pac_data16); |
| 147 return true; | 147 return true; |
| 148 } | 148 } |
| 149 | 149 |
| 150 bool GetProxyServer(const DictionaryValue* proxy_server, | 150 bool GetProxyServer(const base::DictionaryValue* proxy_server, |
| 151 net::ProxyServer::Scheme default_scheme, | 151 net::ProxyServer::Scheme default_scheme, |
| 152 net::ProxyServer* out, | 152 net::ProxyServer* out, |
| 153 std::string* error, | 153 std::string* error, |
| 154 bool* bad_message) { | 154 bool* bad_message) { |
| 155 std::string scheme_string; // optional. | 155 std::string scheme_string; // optional. |
| 156 | 156 |
| 157 // We can safely assume that this is ASCII due to the allowed enumeration | 157 // We can safely assume that this is ASCII due to the allowed enumeration |
| 158 // values specified in the extension API JSON. | 158 // values specified in the extension API JSON. |
| 159 proxy_server->GetStringASCII(keys::kProxyConfigRuleScheme, &scheme_string); | 159 proxy_server->GetStringASCII(keys::kProxyConfigRuleScheme, &scheme_string); |
| 160 | 160 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 181 | 181 |
| 182 int port; // optional. | 182 int port; // optional. |
| 183 if (!proxy_server->GetInteger(keys::kProxyConfigRulePort, &port)) | 183 if (!proxy_server->GetInteger(keys::kProxyConfigRulePort, &port)) |
| 184 port = net::ProxyServer::GetDefaultPortForScheme(scheme); | 184 port = net::ProxyServer::GetDefaultPortForScheme(scheme); |
| 185 | 185 |
| 186 *out = net::ProxyServer(scheme, net::HostPortPair(host, port)); | 186 *out = net::ProxyServer(scheme, net::HostPortPair(host, port)); |
| 187 | 187 |
| 188 return true; | 188 return true; |
| 189 } | 189 } |
| 190 | 190 |
| 191 bool GetProxyRulesStringFromExtensionPref(const DictionaryValue* proxy_config, | 191 bool GetProxyRulesStringFromExtensionPref( |
| 192 std::string* out, | 192 const base::DictionaryValue* proxy_config, |
| 193 std::string* error, | 193 std::string* out, |
| 194 bool* bad_message) { | 194 std::string* error, |
| 195 const DictionaryValue* proxy_rules = NULL; | 195 bool* bad_message) { |
| 196 const base::DictionaryValue* proxy_rules = NULL; |
| 196 proxy_config->GetDictionary(keys::kProxyConfigRules, &proxy_rules); | 197 proxy_config->GetDictionary(keys::kProxyConfigRules, &proxy_rules); |
| 197 if (!proxy_rules) | 198 if (!proxy_rules) |
| 198 return true; | 199 return true; |
| 199 | 200 |
| 200 // Local data into which the parameters will be parsed. has_proxy describes | 201 // Local data into which the parameters will be parsed. has_proxy describes |
| 201 // whether a setting was found for the scheme; proxy_server holds the | 202 // whether a setting was found for the scheme; proxy_server holds the |
| 202 // respective ProxyServer objects containing those descriptions. | 203 // respective ProxyServer objects containing those descriptions. |
| 203 bool has_proxy[keys::SCHEME_MAX + 1]; | 204 bool has_proxy[keys::SCHEME_MAX + 1]; |
| 204 net::ProxyServer proxy_server[keys::SCHEME_MAX + 1]; | 205 net::ProxyServer proxy_server[keys::SCHEME_MAX + 1]; |
| 205 | 206 |
| 206 // Looking for all possible proxy types is inefficient if we have a | 207 // Looking for all possible proxy types is inefficient if we have a |
| 207 // singleProxy that will supersede per-URL proxies, but it's worth it to keep | 208 // singleProxy that will supersede per-URL proxies, but it's worth it to keep |
| 208 // the code simple and extensible. | 209 // the code simple and extensible. |
| 209 for (size_t i = 0; i <= keys::SCHEME_MAX; ++i) { | 210 for (size_t i = 0; i <= keys::SCHEME_MAX; ++i) { |
| 210 const DictionaryValue* proxy_dict = NULL; | 211 const base::DictionaryValue* proxy_dict = NULL; |
| 211 has_proxy[i] = proxy_rules->GetDictionary(keys::field_name[i], | 212 has_proxy[i] = proxy_rules->GetDictionary(keys::field_name[i], |
| 212 &proxy_dict); | 213 &proxy_dict); |
| 213 if (has_proxy[i]) { | 214 if (has_proxy[i]) { |
| 214 net::ProxyServer::Scheme default_scheme = net::ProxyServer::SCHEME_HTTP; | 215 net::ProxyServer::Scheme default_scheme = net::ProxyServer::SCHEME_HTTP; |
| 215 if (!GetProxyServer(proxy_dict, default_scheme, | 216 if (!GetProxyServer(proxy_dict, default_scheme, |
| 216 &proxy_server[i], error, bad_message)) { | 217 &proxy_server[i], error, bad_message)) { |
| 217 // Don't set |error| here, as GetProxyServer takes care of that. | 218 // Don't set |error| here, as GetProxyServer takes care of that. |
| 218 return false; | 219 return false; |
| 219 } | 220 } |
| 220 } | 221 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 248 proxy_pref.append(keys::scheme_name[i]); | 249 proxy_pref.append(keys::scheme_name[i]); |
| 249 proxy_pref.append("="); | 250 proxy_pref.append("="); |
| 250 proxy_pref.append(proxy_server[i].ToURI()); | 251 proxy_pref.append(proxy_server[i].ToURI()); |
| 251 } | 252 } |
| 252 } | 253 } |
| 253 | 254 |
| 254 *out = proxy_pref; | 255 *out = proxy_pref; |
| 255 return true; | 256 return true; |
| 256 } | 257 } |
| 257 | 258 |
| 258 bool JoinUrlList(const ListValue* list, | 259 bool JoinUrlList(const base::ListValue* list, |
| 259 const std::string& joiner, | 260 const std::string& joiner, |
| 260 std::string* out, | 261 std::string* out, |
| 261 std::string* error, | 262 std::string* error, |
| 262 bool* bad_message) { | 263 bool* bad_message) { |
| 263 std::string result; | 264 std::string result; |
| 264 for (size_t i = 0; i < list->GetSize(); ++i) { | 265 for (size_t i = 0; i < list->GetSize(); ++i) { |
| 265 if (!result.empty()) | 266 if (!result.empty()) |
| 266 result.append(joiner); | 267 result.append(joiner); |
| 267 | 268 |
| 268 // TODO(battre): handle UTF-8 (http://crbug.com/72692). | 269 // TODO(battre): handle UTF-8 (http://crbug.com/72692). |
| 269 string16 entry; | 270 string16 entry; |
| 270 if (!list->GetString(i, &entry)) { | 271 if (!list->GetString(i, &entry)) { |
| 271 LOG(ERROR) << "'rules.bypassList' could not be parsed."; | 272 LOG(ERROR) << "'rules.bypassList' could not be parsed."; |
| 272 *bad_message = true; | 273 *bad_message = true; |
| 273 return false; | 274 return false; |
| 274 } | 275 } |
| 275 if (!IsStringASCII(entry)) { | 276 if (!IsStringASCII(entry)) { |
| 276 *error = "'rules.bypassList' supports only ASCII URLs " | 277 *error = "'rules.bypassList' supports only ASCII URLs " |
| 277 "(encode URLs in Punycode format)."; | 278 "(encode URLs in Punycode format)."; |
| 278 return false; | 279 return false; |
| 279 } | 280 } |
| 280 result.append(UTF16ToASCII(entry)); | 281 result.append(UTF16ToASCII(entry)); |
| 281 } | 282 } |
| 282 *out = result; | 283 *out = result; |
| 283 return true; | 284 return true; |
| 284 } | 285 } |
| 285 | 286 |
| 286 bool GetBypassListFromExtensionPref(const DictionaryValue* proxy_config, | 287 bool GetBypassListFromExtensionPref(const base::DictionaryValue* proxy_config, |
| 287 std::string* out, | 288 std::string* out, |
| 288 std::string* error, | 289 std::string* error, |
| 289 bool* bad_message) { | 290 bool* bad_message) { |
| 290 const DictionaryValue* proxy_rules = NULL; | 291 const base::DictionaryValue* proxy_rules = NULL; |
| 291 proxy_config->GetDictionary(keys::kProxyConfigRules, &proxy_rules); | 292 proxy_config->GetDictionary(keys::kProxyConfigRules, &proxy_rules); |
| 292 if (!proxy_rules) | 293 if (!proxy_rules) |
| 293 return true; | 294 return true; |
| 294 | 295 |
| 295 if (!proxy_rules->HasKey(keys::kProxyConfigBypassList)) { | 296 if (!proxy_rules->HasKey(keys::kProxyConfigBypassList)) { |
| 296 *out = ""; | 297 *out = ""; |
| 297 return true; | 298 return true; |
| 298 } | 299 } |
| 299 const ListValue* bypass_list = NULL; | 300 const base::ListValue* bypass_list = NULL; |
| 300 if (!proxy_rules->GetList(keys::kProxyConfigBypassList, &bypass_list)) { | 301 if (!proxy_rules->GetList(keys::kProxyConfigBypassList, &bypass_list)) { |
| 301 LOG(ERROR) << "'rules.bypassList' could not be parsed."; | 302 LOG(ERROR) << "'rules.bypassList' could not be parsed."; |
| 302 *bad_message = true; | 303 *bad_message = true; |
| 303 return false; | 304 return false; |
| 304 } | 305 } |
| 305 | 306 |
| 306 return JoinUrlList(bypass_list, ",", out, error, bad_message); | 307 return JoinUrlList(bypass_list, ",", out, error, bad_message); |
| 307 } | 308 } |
| 308 | 309 |
| 309 DictionaryValue* CreateProxyConfigDict(ProxyPrefs::ProxyMode mode_enum, | 310 base::DictionaryValue* CreateProxyConfigDict( |
| 310 bool pac_mandatory, | 311 ProxyPrefs::ProxyMode mode_enum, |
| 311 const std::string& pac_url, | 312 bool pac_mandatory, |
| 312 const std::string& pac_data, | 313 const std::string& pac_url, |
| 313 const std::string& proxy_rules_string, | 314 const std::string& pac_data, |
| 314 const std::string& bypass_list, | 315 const std::string& proxy_rules_string, |
| 315 std::string* error) { | 316 const std::string& bypass_list, |
| 316 DictionaryValue* result_proxy_config = NULL; | 317 std::string* error) { |
| 318 base::DictionaryValue* result_proxy_config = NULL; |
| 317 switch (mode_enum) { | 319 switch (mode_enum) { |
| 318 case ProxyPrefs::MODE_DIRECT: | 320 case ProxyPrefs::MODE_DIRECT: |
| 319 result_proxy_config = ProxyConfigDictionary::CreateDirect(); | 321 result_proxy_config = ProxyConfigDictionary::CreateDirect(); |
| 320 break; | 322 break; |
| 321 case ProxyPrefs::MODE_AUTO_DETECT: | 323 case ProxyPrefs::MODE_AUTO_DETECT: |
| 322 result_proxy_config = ProxyConfigDictionary::CreateAutoDetect(); | 324 result_proxy_config = ProxyConfigDictionary::CreateAutoDetect(); |
| 323 break; | 325 break; |
| 324 case ProxyPrefs::MODE_PAC_SCRIPT: { | 326 case ProxyPrefs::MODE_PAC_SCRIPT: { |
| 325 std::string url; | 327 std::string url; |
| 326 if (!pac_url.empty()) { | 328 if (!pac_url.empty()) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 350 } | 352 } |
| 351 case ProxyPrefs::MODE_SYSTEM: | 353 case ProxyPrefs::MODE_SYSTEM: |
| 352 result_proxy_config = ProxyConfigDictionary::CreateSystem(); | 354 result_proxy_config = ProxyConfigDictionary::CreateSystem(); |
| 353 break; | 355 break; |
| 354 case ProxyPrefs::kModeCount: | 356 case ProxyPrefs::kModeCount: |
| 355 NOTREACHED(); | 357 NOTREACHED(); |
| 356 } | 358 } |
| 357 return result_proxy_config; | 359 return result_proxy_config; |
| 358 } | 360 } |
| 359 | 361 |
| 360 DictionaryValue* CreateProxyRulesDict( | 362 base::DictionaryValue* CreateProxyRulesDict( |
| 361 const ProxyConfigDictionary& proxy_config) { | 363 const ProxyConfigDictionary& proxy_config) { |
| 362 ProxyPrefs::ProxyMode mode; | 364 ProxyPrefs::ProxyMode mode; |
| 363 CHECK(proxy_config.GetMode(&mode) && mode == ProxyPrefs::MODE_FIXED_SERVERS); | 365 CHECK(proxy_config.GetMode(&mode) && mode == ProxyPrefs::MODE_FIXED_SERVERS); |
| 364 | 366 |
| 365 scoped_ptr<DictionaryValue> extension_proxy_rules(new DictionaryValue); | 367 scoped_ptr<base::DictionaryValue> extension_proxy_rules( |
| 368 new base::DictionaryValue); |
| 366 | 369 |
| 367 std::string proxy_servers; | 370 std::string proxy_servers; |
| 368 if (!proxy_config.GetProxyServer(&proxy_servers)) { | 371 if (!proxy_config.GetProxyServer(&proxy_servers)) { |
| 369 LOG(ERROR) << "Missing proxy servers in configuration."; | 372 LOG(ERROR) << "Missing proxy servers in configuration."; |
| 370 return NULL; | 373 return NULL; |
| 371 } | 374 } |
| 372 | 375 |
| 373 net::ProxyConfig::ProxyRules rules; | 376 net::ProxyConfig::ProxyRules rules; |
| 374 rules.ParseFromString(proxy_servers); | 377 rules.ParseFromString(proxy_servers); |
| 375 | 378 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 410 // If we add a new scheme some time, we need to also store a new dictionary | 413 // If we add a new scheme some time, we need to also store a new dictionary |
| 411 // representing this scheme in the code above. | 414 // representing this scheme in the code above. |
| 412 COMPILE_ASSERT(keys::SCHEME_MAX == 4, SCHEME_FORGOTTEN); | 415 COMPILE_ASSERT(keys::SCHEME_MAX == 4, SCHEME_FORGOTTEN); |
| 413 | 416 |
| 414 if (proxy_config.HasBypassList()) { | 417 if (proxy_config.HasBypassList()) { |
| 415 std::string bypass_list_string; | 418 std::string bypass_list_string; |
| 416 if (!proxy_config.GetBypassList(&bypass_list_string)) { | 419 if (!proxy_config.GetBypassList(&bypass_list_string)) { |
| 417 LOG(ERROR) << "Invalid bypassList in configuration."; | 420 LOG(ERROR) << "Invalid bypassList in configuration."; |
| 418 return NULL; | 421 return NULL; |
| 419 } | 422 } |
| 420 ListValue* bypass_list = TokenizeToStringList(bypass_list_string, ",;"); | 423 base::ListValue* bypass_list = |
| 424 TokenizeToStringList(bypass_list_string, ",;"); |
| 421 extension_proxy_rules->Set(keys::kProxyConfigBypassList, bypass_list); | 425 extension_proxy_rules->Set(keys::kProxyConfigBypassList, bypass_list); |
| 422 } | 426 } |
| 423 | 427 |
| 424 return extension_proxy_rules.release(); | 428 return extension_proxy_rules.release(); |
| 425 } | 429 } |
| 426 | 430 |
| 427 DictionaryValue* CreateProxyServerDict(const net::ProxyServer& proxy) { | 431 base::DictionaryValue* CreateProxyServerDict(const net::ProxyServer& proxy) { |
| 428 scoped_ptr<DictionaryValue> out(new DictionaryValue); | 432 scoped_ptr<base::DictionaryValue> out(new base::DictionaryValue); |
| 429 switch (proxy.scheme()) { | 433 switch (proxy.scheme()) { |
| 430 case net::ProxyServer::SCHEME_HTTP: | 434 case net::ProxyServer::SCHEME_HTTP: |
| 431 out->SetString(keys::kProxyConfigRuleScheme, "http"); | 435 out->SetString(keys::kProxyConfigRuleScheme, "http"); |
| 432 break; | 436 break; |
| 433 case net::ProxyServer::SCHEME_HTTPS: | 437 case net::ProxyServer::SCHEME_HTTPS: |
| 434 out->SetString(keys::kProxyConfigRuleScheme, "https"); | 438 out->SetString(keys::kProxyConfigRuleScheme, "https"); |
| 435 break; | 439 break; |
| 436 case net::ProxyServer::SCHEME_SOCKS4: | 440 case net::ProxyServer::SCHEME_SOCKS4: |
| 437 out->SetString(keys::kProxyConfigRuleScheme, "socks4"); | 441 out->SetString(keys::kProxyConfigRuleScheme, "socks4"); |
| 438 break; | 442 break; |
| 439 case net::ProxyServer::SCHEME_SOCKS5: | 443 case net::ProxyServer::SCHEME_SOCKS5: |
| 440 out->SetString(keys::kProxyConfigRuleScheme, "socks5"); | 444 out->SetString(keys::kProxyConfigRuleScheme, "socks5"); |
| 441 break; | 445 break; |
| 442 case net::ProxyServer::SCHEME_DIRECT: | 446 case net::ProxyServer::SCHEME_DIRECT: |
| 443 case net::ProxyServer::SCHEME_INVALID: | 447 case net::ProxyServer::SCHEME_INVALID: |
| 444 NOTREACHED(); | 448 NOTREACHED(); |
| 445 return NULL; | 449 return NULL; |
| 446 } | 450 } |
| 447 out->SetString(keys::kProxyConfigRuleHost, proxy.host_port_pair().host()); | 451 out->SetString(keys::kProxyConfigRuleHost, proxy.host_port_pair().host()); |
| 448 out->SetInteger(keys::kProxyConfigRulePort, proxy.host_port_pair().port()); | 452 out->SetInteger(keys::kProxyConfigRulePort, proxy.host_port_pair().port()); |
| 449 return out.release(); | 453 return out.release(); |
| 450 } | 454 } |
| 451 | 455 |
| 452 DictionaryValue* CreatePacScriptDict( | 456 base::DictionaryValue* CreatePacScriptDict( |
| 453 const ProxyConfigDictionary& proxy_config) { | 457 const ProxyConfigDictionary& proxy_config) { |
| 454 ProxyPrefs::ProxyMode mode; | 458 ProxyPrefs::ProxyMode mode; |
| 455 CHECK(proxy_config.GetMode(&mode) && mode == ProxyPrefs::MODE_PAC_SCRIPT); | 459 CHECK(proxy_config.GetMode(&mode) && mode == ProxyPrefs::MODE_PAC_SCRIPT); |
| 456 | 460 |
| 457 scoped_ptr<DictionaryValue> pac_script_dict(new DictionaryValue); | 461 scoped_ptr<base::DictionaryValue> pac_script_dict(new base::DictionaryValue); |
| 458 std::string pac_url; | 462 std::string pac_url; |
| 459 if (!proxy_config.GetPacUrl(&pac_url)) { | 463 if (!proxy_config.GetPacUrl(&pac_url)) { |
| 460 LOG(ERROR) << "Invalid proxy configuration. Missing PAC URL."; | 464 LOG(ERROR) << "Invalid proxy configuration. Missing PAC URL."; |
| 461 return NULL; | 465 return NULL; |
| 462 } | 466 } |
| 463 bool pac_mandatory = false; | 467 bool pac_mandatory = false; |
| 464 if (!proxy_config.GetPacMandatory(&pac_mandatory)) { | 468 if (!proxy_config.GetPacMandatory(&pac_mandatory)) { |
| 465 LOG(ERROR) << "Invalid proxy configuration. Missing PAC mandatory field."; | 469 LOG(ERROR) << "Invalid proxy configuration. Missing PAC mandatory field."; |
| 466 return NULL; | 470 return NULL; |
| 467 } | 471 } |
| 468 | 472 |
| 469 if (pac_url.find("data") == 0) { | 473 if (pac_url.find("data") == 0) { |
| 470 std::string pac_data; | 474 std::string pac_data; |
| 471 if (!CreatePACScriptFromDataURL(pac_url, &pac_data)) { | 475 if (!CreatePACScriptFromDataURL(pac_url, &pac_data)) { |
| 472 LOG(ERROR) << "Cannot decode base64-encoded PAC data URL: " << pac_url; | 476 LOG(ERROR) << "Cannot decode base64-encoded PAC data URL: " << pac_url; |
| 473 return NULL; | 477 return NULL; |
| 474 } | 478 } |
| 475 pac_script_dict->SetString(keys::kProxyConfigPacScriptData, pac_data); | 479 pac_script_dict->SetString(keys::kProxyConfigPacScriptData, pac_data); |
| 476 } else { | 480 } else { |
| 477 pac_script_dict->SetString(keys::kProxyConfigPacScriptUrl, pac_url); | 481 pac_script_dict->SetString(keys::kProxyConfigPacScriptUrl, pac_url); |
| 478 } | 482 } |
| 479 pac_script_dict->SetBoolean(keys::kProxyConfigPacScriptMandatory, | 483 pac_script_dict->SetBoolean(keys::kProxyConfigPacScriptMandatory, |
| 480 pac_mandatory); | 484 pac_mandatory); |
| 481 return pac_script_dict.release(); | 485 return pac_script_dict.release(); |
| 482 } | 486 } |
| 483 | 487 |
| 484 ListValue* TokenizeToStringList(const std::string& in, | 488 base::ListValue* TokenizeToStringList(const std::string& in, |
| 485 const std::string& delims) { | 489 const std::string& delims) { |
| 486 ListValue* out = new ListValue; | 490 base::ListValue* out = new base::ListValue; |
| 487 base::StringTokenizer entries(in, delims); | 491 base::StringTokenizer entries(in, delims); |
| 488 while (entries.GetNext()) | 492 while (entries.GetNext()) |
| 489 out->Append(Value::CreateStringValue(entries.token())); | 493 out->Append(Value::CreateStringValue(entries.token())); |
| 490 return out; | 494 return out; |
| 491 } | 495 } |
| 492 | 496 |
| 493 } // namespace proxy_api_helpers | 497 } // namespace proxy_api_helpers |
| 494 } // namespace extensions | 498 } // namespace extensions |
| OLD | NEW |