Commit a2c6ab4f authored by John Chen's avatar John Chen Committed by Commit Bot

[ChromeDriver] W3C compliant New Session response

Updating capabilities returned from New Session command for W3C spec
compliance. Change verified by Web Platform Tests (13 additional
new_session tests passed).

Bug: chromedriver:1997
Change-Id: I7683acb33cbf2739a867787ba2a3fedd28be32c5
Reviewed-on: https://chromium-review.googlesource.com/c/1347065
Commit-Queue: John Chen <johnchen@chromium.org>
Reviewed-by: default avatarCaleb Rouleau <crouleau@chromium.org>
Cr-Commit-Position: refs/heads/master@{#610223}
parent aa366463
...@@ -100,19 +100,64 @@ InitSessionParams::~InitSessionParams() {} ...@@ -100,19 +100,64 @@ InitSessionParams::~InitSessionParams() {}
namespace { namespace {
// Creates a JSON object (represented by base::DictionaryValue) that contains
// the capabilities, for returning to the client app as the result of New
// Session command.
std::unique_ptr<base::DictionaryValue> CreateCapabilities( std::unique_ptr<base::DictionaryValue> CreateCapabilities(
Session* session, Session* session,
const Capabilities& capabilities) { const Capabilities& capabilities,
const base::DictionaryValue& desired_caps) {
std::unique_ptr<base::DictionaryValue> caps(new base::DictionaryValue()); std::unique_ptr<base::DictionaryValue> caps(new base::DictionaryValue());
// Capabilities defined by W3C. Some of these capabilities have different
// names in legacy mode.
caps->SetString("browserName", "chrome"); caps->SetString("browserName", "chrome");
caps->SetString("version", caps->SetString(session->w3c_compliant ? "browserVersion" : "version",
session->chrome->GetBrowserInfo()->browser_version); session->chrome->GetBrowserInfo()->browser_version);
if (session->w3c_compliant)
caps->SetString(
"platformName",
base::ToLowerASCII(session->chrome->GetOperatingSystemName()));
else
caps->SetString("platform", session->chrome->GetOperatingSystemName());
caps->SetString("pageLoadStrategy", session->chrome->page_load_strategy());
caps->SetBoolean("acceptInsecureCerts", capabilities.accept_insecure_certs);
const base::Value* proxy = desired_caps.FindKey("proxy");
if (proxy == nullptr || proxy->is_none())
caps->SetKey("proxy", base::Value(base::Value::Type::DICTIONARY));
else
caps->SetKey("proxy", proxy->Clone());
// add setWindowRect based on whether we are desktop/android/remote
if (capabilities.IsAndroid() || capabilities.IsRemoteBrowser()) {
caps->SetBoolean("setWindowRect", false);
} else {
caps->SetBoolean("setWindowRect", true);
}
caps->SetInteger("timeouts.script", session->script_timeout.InMilliseconds());
caps->SetInteger("timeouts.pageLoad",
session->page_load_timeout.InMilliseconds());
caps->SetInteger("timeouts.implicit",
session->implicit_wait.InMilliseconds());
caps->SetString(session->w3c_compliant ? "unhandledPromptBehavior"
: "unexpectedAlertBehaviour",
session->unhandled_prompt_behavior);
// Chrome-specific extensions.
caps->SetString("chrome.chromedriverVersion", kChromeDriverVersion); caps->SetString("chrome.chromedriverVersion", kChromeDriverVersion);
caps->SetString( caps->SetString(
"goog:chromeOptions.debuggerAddress", "goog:chromeOptions.debuggerAddress",
session->chrome->GetBrowserInfo()->debugger_address.ToString()); session->chrome->GetBrowserInfo()->debugger_address.ToString());
caps->SetString("platform", session->chrome->GetOperatingSystemName()); ChromeDesktopImpl* desktop = NULL;
caps->SetString("pageLoadStrategy", session->chrome->page_load_strategy()); Status status = session->chrome->GetAsDesktop(&desktop);
if (status.IsOk()) {
caps->SetString("chrome.userDataDir",
desktop->command().GetSwitchValueNative("user-data-dir"));
caps->SetBoolean("networkConnectionEnabled",
desktop->IsNetworkConnectionEnabled());
}
// Legacy capabilities.
if (!session->w3c_compliant) {
caps->SetBoolean("javascriptEnabled", true); caps->SetBoolean("javascriptEnabled", true);
caps->SetBoolean("takesScreenshot", true); caps->SetBoolean("takesScreenshot", true);
caps->SetBoolean("takesHeapSnapshot", true); caps->SetBoolean("takesHeapSnapshot", true);
...@@ -127,27 +172,8 @@ std::unique_ptr<base::DictionaryValue> CreateCapabilities( ...@@ -127,27 +172,8 @@ std::unique_ptr<base::DictionaryValue> CreateCapabilities(
caps->SetBoolean("webStorageEnabled", true); caps->SetBoolean("webStorageEnabled", true);
caps->SetBoolean("rotatable", false); caps->SetBoolean("rotatable", false);
caps->SetBoolean("acceptSslCerts", capabilities.accept_insecure_certs); caps->SetBoolean("acceptSslCerts", capabilities.accept_insecure_certs);
caps->SetBoolean("acceptInsecureCerts", capabilities.accept_insecure_certs);
caps->SetBoolean("nativeEvents", true); caps->SetBoolean("nativeEvents", true);
caps->SetBoolean("hasTouchScreen", session->chrome->HasTouchScreen()); caps->SetBoolean("hasTouchScreen", session->chrome->HasTouchScreen());
caps->SetString(session->w3c_compliant ? "unhandledPromptBehavior"
: "unexpectedAlertBehaviour",
session->unhandled_prompt_behavior);
// add setWindowRect based on whether we are desktop/android/remote
if (capabilities.IsAndroid() || capabilities.IsRemoteBrowser()) {
caps->SetBoolean("setWindowRect", false);
} else {
caps->SetBoolean("setWindowRect", true);
}
ChromeDesktopImpl* desktop = NULL;
Status status = session->chrome->GetAsDesktop(&desktop);
if (status.IsOk()) {
caps->SetString("chrome.userDataDir",
desktop->command().GetSwitchValueNative("user-data-dir"));
caps->SetBoolean("networkConnectionEnabled",
desktop->IsNetworkConnectionEnabled());
} }
return caps; return caps;
...@@ -293,7 +319,8 @@ Status InitSessionHelper(const InitSessionParams& bound_params, ...@@ -293,7 +319,8 @@ Status InitSessionHelper(const InitSessionParams& bound_params,
return status; return status;
session->detach = capabilities.detach; session->detach = capabilities.detach;
session->force_devtools_screenshot = capabilities.force_devtools_screenshot; session->force_devtools_screenshot = capabilities.force_devtools_screenshot;
session->capabilities = CreateCapabilities(session, capabilities); session->capabilities =
CreateCapabilities(session, capabilities, *desired_caps);
if (session->w3c_compliant) { if (session->w3c_compliant) {
base::DictionaryValue body; base::DictionaryValue body;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment