Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9793)

Unified Diff: chrome/test/chromedriver/capabilities.cc

Issue 251933005: [ChromeDriver] Support mobile emulation on desktop Chrome. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Convert Capability to mobileEmulation; add integration- and unit-tests Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(

Powered by Google App Engine
This is Rietveld 408576698