Chromium Code Reviews| Index: chrome/test/chromedriver/capabilities.cc |
| diff --git a/chrome/test/chromedriver/capabilities.cc b/chrome/test/chromedriver/capabilities.cc |
| index 518af52734a45f9c3537650db4f25ebdcaa5986d..0d6cfcaba323ca0b69c7f9c2b18d0531f302ae64 100644 |
| --- a/chrome/test/chromedriver/capabilities.cc |
| +++ b/chrome/test/chromedriver/capabilities.cc |
| @@ -19,6 +19,7 @@ |
| #include "base/values.h" |
| #include "chrome/test/chromedriver/chrome/status.h" |
| #include "chrome/test/chromedriver/logging.h" |
| +#include "chrome/test/chromedriver/mobile_device.h" |
| #include "net/base/net_util.h" |
| namespace { |
| @@ -84,6 +85,67 @@ Status ParseLogPath(const base::Value& option, Capabilities* capabilities) { |
| return Status(kOk); |
| } |
| +Status ParseDeviceName(std::string device_name, Capabilities* capabilities) { |
| + scoped_ptr<MobileDevice> device; |
| + Status status = FindMobileDevice(device_name, &device); |
| + if (status.IsError()) |
| + return Status(kUnknownError, |
| + "'" + device_name + "' must be a valid device", |
| + status); |
| + |
| + capabilities->device_metrics = device->device_metrics; |
| + capabilities->switches.SetUnparsedSwitch( |
| + "--user-agent='" + device->user_agent + "'"); |
| + |
| + return Status(kOk); |
| +} |
| + |
| +Status ParseMobileEmulation(const base::Value& option, |
| + Capabilities* capabilities) { |
|
stgao
2014/05/14 05:10:14
indent.
sam.rawlins
2014/05/16 21:09:38
Done.
|
| + const base::DictionaryValue* mobile_emulation; |
| + if (!option.GetAsDictionary(&mobile_emulation)) |
| + return Status(kUnknownError, "'mobileEmulation' must be a dictionary"); |
| + |
| + if (mobile_emulation->HasKey("deviceName")) { |
| + // Cannot use any other options with deviceName. |
| + if (mobile_emulation->size() > 1) |
| + return Status(kUnknownError, "'deviceName' must be used alone"); |
| + |
| + std::string device_name; |
| + if (!mobile_emulation->GetString("deviceName", &device_name)) |
| + return Status(kUnknownError, "'deviceName' must be a string"); |
| + |
| + return ParseDeviceName(device_name, capabilities); |
| + } |
| + |
| + if (mobile_emulation->HasKey("deviceMetrics")) { |
| + const base::DictionaryValue* metrics; |
| + if (!mobile_emulation->GetDictionary("deviceMetrics", &metrics)) |
| + return Status(kUnknownError, "'deviceMetrics' must be a dictionary"); |
| + |
| + int width; |
| + int height; |
| + double device_scale_factor; |
| + if (!metrics->GetInteger("width", &width) || |
| + !metrics->GetInteger("height", &height) || |
| + !metrics->GetDouble("pixelRatio", &device_scale_factor)) |
| + return Status(kUnknownError, "invalid 'deviceMetrics'"); |
| + capabilities->device_metrics = |
| + DeviceMetrics(width, height, device_scale_factor); |
| + } |
| + |
| + if (mobile_emulation->HasKey("userAgent")) { |
|
stgao
2014/05/14 05:10:14
Do we want to support the case that the user provi
sam.rawlins
2014/05/16 21:09:38
I think this is fine. The behavior wouldn't be und
|
| + std::string user_agent; |
| + if (!mobile_emulation->GetString("userAgent", &user_agent)) |
| + return Status(kUnknownError, "'userAgent' must be a string"); |
| + |
| + capabilities->switches.SetUnparsedSwitch( |
| + "--user-agent='" + user_agent + "'"); |
| + } |
| + |
| + return Status(kOk); |
| +} |
| + |
| Status ParseSwitches(const base::Value& option, |
| Capabilities* capabilities) { |
| const base::ListValue* switches_list = NULL; |
| @@ -272,6 +334,7 @@ Status ParseChromeOptions( |
| parser_map["args"] = base::Bind(&ParseSwitches); |
| parser_map["binary"] = base::Bind(&ParseFilePath, &capabilities->binary); |
| parser_map["detach"] = base::Bind(&ParseBoolean, &capabilities->detach); |
| + parser_map["mobileEmulation"] = base::Bind(&ParseMobileEmulation); |
| parser_map["excludeSwitches"] = base::Bind(&ParseExcludeSwitches); |
| parser_map["extensions"] = base::Bind(&ParseExtensions); |
| parser_map["forceDevToolsScreenshot"] = base::Bind( |