Chromium Code Reviews| Index: chrome/test/chromedriver/commands.cc |
| diff --git a/chrome/test/chromedriver/commands.cc b/chrome/test/chromedriver/commands.cc |
| index d6ccc8f8ad634377776b5d2fd481dc6bcb6d36bd..67a05ad771de86c975e237009bebc246869b613d 100644 |
| --- a/chrome/test/chromedriver/commands.cc |
| +++ b/chrome/test/chromedriver/commands.cc |
| @@ -6,6 +6,7 @@ |
| #include "base/callback.h" |
| #include "base/file_util.h" |
| +#include "base/string_util.h" |
| #include "base/stringprintf.h" |
| #include "base/sys_info.h" |
| #include "base/values.h" |
| @@ -41,6 +42,70 @@ Status ExecuteGetStatus( |
| return Status(kOk); |
| } |
| +namespace { |
| + |
| +// Parse information of proxy, add them as chrome switches to |args_list|. |
| +Status ParseProxy(const base::DictionaryValue& proxy_dict, |
|
kkania
2013/03/29 20:52:46
Can we factor the capability parsing out into its
|
| + base::ListValue* args_list) { |
| + std::string proxy_type; |
| + if (!proxy_dict.GetString("proxyType", &proxy_type)) |
| + return Status(kUnknownError, "'proxyType' must be a string"); |
| + proxy_type = StringToLowerASCII(proxy_type); |
| + if (proxy_type == "direct") { |
| + args_list->AppendString("no-proxy-server"); |
| + } else if (proxy_type == "system") { |
| + // Chrome default. |
| + } else if (proxy_type == "pac") { |
| + std::string proxy_pac_url; |
| + if (!proxy_dict.GetString("proxyAutoconfigUrl", &proxy_pac_url)) |
| + return Status(kUnknownError, "'proxyAutoconfigUrl' must be a string"); |
| + args_list->AppendString("proxy-pac-url=" + proxy_pac_url); |
| + } else if (proxy_type == "autodetect") { |
| + args_list->AppendString("proxy-auto-detect"); |
| + } else if (proxy_type == "manual") { |
| + const char* proxy_servers_options[][2] = { |
| + {"ftpProxy", "ftp"}, {"httpProxy", "http"}, {"sslProxy", "https"}}; |
| + std::string proxy_servers; |
| + for (size_t i = 0; i < arraysize(proxy_servers_options); ++i) { |
| + if (!proxy_dict.HasKey(proxy_servers_options[i][0])) |
| + continue; |
| + std::string value; |
| + if (!proxy_dict.GetString(proxy_servers_options[i][0], &value)) { |
| + return Status( |
| + kUnknownError, |
| + base::StringPrintf("'%s' must be a string", |
| + proxy_servers_options[i][0])); |
| + } |
| + // Converts into Chrome proxy scheme. |
| + // Example: "http=localhost:9000;ftp=localhost:8000". |
| + if (!proxy_servers.empty()) |
| + proxy_servers += ";"; |
| + proxy_servers += base::StringPrintf( |
| + "%s=%s", proxy_servers_options[i][1], value.c_str()); |
| + } |
| + |
| + std::string proxy_bypass_list; |
| + if (proxy_dict.HasKey("noProxy")) { |
| + if (!proxy_dict.GetString("noProxy", & proxy_bypass_list)) |
| + return Status(kUnknownError, "'noProxy' must be a string"); |
| + } |
| + |
| + if (proxy_servers.empty() && proxy_bypass_list.empty()) { |
| + return Status(kUnknownError, "proxyType is 'manual' but no manual " |
| + "proxy capabilities were found"); |
| + } |
| + if (!proxy_servers.empty()) |
| + args_list->AppendString("proxy-server=" + proxy_servers); |
| + if (!proxy_bypass_list.empty()) |
| + args_list->AppendString("proxy-bypass-list=" + proxy_bypass_list); |
| + } else { |
| + return Status(kUnknownError, "unrecognized proxy type:" + proxy_type); |
| + } |
| + return Status(kOk); |
| +} |
| + |
| +} |
| + |
| Status ExecuteNewSession( |
| SessionMap* session_map, |
| scoped_refptr<URLRequestContextGetter> context_getter, |
| @@ -109,6 +174,19 @@ Status ExecuteNewSession( |
| "chrome extensions must be a list"); |
| } |
| + const base::Value* proxy = NULL; |
| + scoped_ptr<base::ListValue> new_args_list; |
| + if (desired_caps->Get("chromeOptions.proxy", &proxy)) { |
| + const base::DictionaryValue* proxy_dict = NULL; |
| + if (!proxy->GetAsDictionary(&proxy_dict)) |
| + return Status(kUnknownError, "proxy must be a dictionary"); |
| + new_args_list.reset(args_list->DeepCopy()); |
| + status = ParseProxy(*proxy_dict, new_args_list.get()); |
| + if (status.IsError()) |
| + return status; |
| + args_list = new_args_list.get(); |
| + } |
| + |
| scoped_ptr<ChromeDesktopImpl> chrome_desktop(new ChromeDesktopImpl( |
| context_getter, port, socket_factory)); |
| status = chrome_desktop->Launch(chrome_exe, args_list, extensions_list, |