Index: chrome/test/chromedriver/capabilities.cc |
diff --git a/chrome/test/chromedriver/capabilities.cc b/chrome/test/chromedriver/capabilities.cc |
index 518af52734a45f9c3537650db4f25ebdcaa5986d..53eeec385f5ee2649ec34f0c4a2452f432fbe3c4 100644 |
--- a/chrome/test/chromedriver/capabilities.cc |
+++ b/chrome/test/chromedriver/capabilities.cc |
@@ -84,6 +84,89 @@ Status ParseLogPath(const base::Value& option, Capabilities* capabilities) { |
return Status(kOk); |
} |
+Status ParseDeviceName(std::string device_name, Capabilities* capabilities) { |
+ // TODO(srawlins) Move this list into something auto-generated from WebKit. |
+ std::map<std::string, MobileDevice> devices; |
+ devices["Apple iPhone 3GS"] = MobileDevice( |
+ DeviceMetrics(320, 480, 1), |
+ "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5"); |
+ // ... |
+ devices["Google Nexus 4"] = MobileDevice( |
+ DeviceMetrics(384, 640, 2), |
+ "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19"); |
+ devices["Google Nexus 5"] = MobileDevice( |
+ DeviceMetrics(360, 640, 3), |
+ "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19"); |
+ |
+ std::map<std::string, MobileDevice>::iterator it = devices.find(device_name); |
+ |
+ if (it == devices.end()) |
+ return Status(kUnknownError, "must be a valid device"); |
samuong
2014/05/07 23:39:36
It would be good to also mention what the invalid
sam.rawlins
2014/05/09 05:35:17
Done.
|
+ |
+ MobileDevice device = it->second; |
+ |
+ capabilities->device_metrics.width = device.device_metrics.width; |
+ capabilities->device_metrics.height = device.device_metrics.height; |
+ capabilities->device_metrics.device_scale_factor = |
+ device.device_metrics.device_scale_factor; |
+ capabilities->device_metrics.emulate_viewport = false; |
+ capabilities->device_metrics.fit_window = true; |
+ capabilities->device_metrics.text_autosizing = true; |
+ capabilities->device_metrics.font_scale_factor = 1; |
+ |
+ capabilities->switches.SetUnparsedSwitch( |
+ "--user-agent='" + device.user_agent + "'"); |
+ |
+ return Status(kOk); |
+} |
+ |
+Status ParseMobileEmulation(const base::Value& option, |
+ Capabilities* capabilities) { |
+ const base::DictionaryValue* mobile_emulation; |
+ if (!option.GetAsDictionary(&mobile_emulation)) |
+ return Status(kUnknownError, "must be a dictionary"); |
samuong
2014/05/07 23:39:36
There are a few error messages that just say "must
sam.rawlins
2014/05/09 05:35:17
Done.
|
+ |
+ 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"); |
+ |
+ if (!metrics->GetInteger("width", &capabilities->device_metrics.width) || |
+ !metrics->GetInteger("height", &capabilities->device_metrics.height) || |
+ !metrics->GetDouble("pixelRatio", |
+ &capabilities->device_metrics.device_scale_factor)) |
+ return Status(kUnknownError, "invalid 'deviceMetrics'"); |
+ |
+ capabilities->device_metrics.emulate_viewport = false; |
+ capabilities->device_metrics.fit_window = true; |
+ capabilities->device_metrics.text_autosizing = true; |
+ capabilities->device_metrics.font_scale_factor = 1; |
samuong
2014/05/07 23:39:36
This is done a few times. Should we put this in a
sam.rawlins
2014/05/09 05:35:17
Done.
|
+ } |
+ |
+ if (mobile_emulation->HasKey("userAgent")) { |
+ 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 +355,8 @@ 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); |
samuong
2014/05/07 23:39:36
Can be one line.
sam.rawlins
2014/05/09 05:35:17
Done.
|
parser_map["excludeSwitches"] = base::Bind(&ParseExcludeSwitches); |
parser_map["extensions"] = base::Bind(&ParseExtensions); |
parser_map["forceDevToolsScreenshot"] = base::Bind( |