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,47 +100,53 @@ InitSessionParams::~InitSessionParams() {} ...@@ -100,47 +100,53 @@ 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);
caps->SetString("chrome.chromedriverVersion", kChromeDriverVersion); if (session->w3c_compliant)
caps->SetString( caps->SetString(
"goog:chromeOptions.debuggerAddress", "platformName",
session->chrome->GetBrowserInfo()->debugger_address.ToString()); base::ToLowerASCII(session->chrome->GetOperatingSystemName()));
caps->SetString("platform", session->chrome->GetOperatingSystemName()); else
caps->SetString("platform", session->chrome->GetOperatingSystemName());
caps->SetString("pageLoadStrategy", session->chrome->page_load_strategy()); caps->SetString("pageLoadStrategy", session->chrome->page_load_strategy());
caps->SetBoolean("javascriptEnabled", true);
caps->SetBoolean("takesScreenshot", true);
caps->SetBoolean("takesHeapSnapshot", true);
caps->SetBoolean("handlesAlerts", true);
caps->SetBoolean("databaseEnabled", false);
caps->SetBoolean("locationContextEnabled", true);
caps->SetBoolean("mobileEmulationEnabled",
session->chrome->IsMobileEmulationEnabled());
caps->SetBoolean("applicationCacheEnabled", false);
caps->SetBoolean("browserConnectionEnabled", false);
caps->SetBoolean("cssSelectorsEnabled", true);
caps->SetBoolean("webStorageEnabled", true);
caps->SetBoolean("rotatable", false);
caps->SetBoolean("acceptSslCerts", capabilities.accept_insecure_certs);
caps->SetBoolean("acceptInsecureCerts", capabilities.accept_insecure_certs); caps->SetBoolean("acceptInsecureCerts", capabilities.accept_insecure_certs);
caps->SetBoolean("nativeEvents", true); const base::Value* proxy = desired_caps.FindKey("proxy");
caps->SetBoolean("hasTouchScreen", session->chrome->HasTouchScreen()); if (proxy == nullptr || proxy->is_none())
caps->SetString(session->w3c_compliant ? "unhandledPromptBehavior" caps->SetKey("proxy", base::Value(base::Value::Type::DICTIONARY));
: "unexpectedAlertBehaviour", else
session->unhandled_prompt_behavior); caps->SetKey("proxy", proxy->Clone());
// add setWindowRect based on whether we are desktop/android/remote // add setWindowRect based on whether we are desktop/android/remote
if (capabilities.IsAndroid() || capabilities.IsRemoteBrowser()) { if (capabilities.IsAndroid() || capabilities.IsRemoteBrowser()) {
caps->SetBoolean("setWindowRect", false); caps->SetBoolean("setWindowRect", false);
} else { } else {
caps->SetBoolean("setWindowRect", true); 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(
"goog:chromeOptions.debuggerAddress",
session->chrome->GetBrowserInfo()->debugger_address.ToString());
ChromeDesktopImpl* desktop = NULL; ChromeDesktopImpl* desktop = NULL;
Status status = session->chrome->GetAsDesktop(&desktop); Status status = session->chrome->GetAsDesktop(&desktop);
if (status.IsOk()) { if (status.IsOk()) {
...@@ -150,6 +156,26 @@ std::unique_ptr<base::DictionaryValue> CreateCapabilities( ...@@ -150,6 +156,26 @@ std::unique_ptr<base::DictionaryValue> CreateCapabilities(
desktop->IsNetworkConnectionEnabled()); desktop->IsNetworkConnectionEnabled());
} }
// Legacy capabilities.
if (!session->w3c_compliant) {
caps->SetBoolean("javascriptEnabled", true);
caps->SetBoolean("takesScreenshot", true);
caps->SetBoolean("takesHeapSnapshot", true);
caps->SetBoolean("handlesAlerts", true);
caps->SetBoolean("databaseEnabled", false);
caps->SetBoolean("locationContextEnabled", true);
caps->SetBoolean("mobileEmulationEnabled",
session->chrome->IsMobileEmulationEnabled());
caps->SetBoolean("applicationCacheEnabled", false);
caps->SetBoolean("browserConnectionEnabled", false);
caps->SetBoolean("cssSelectorsEnabled", true);
caps->SetBoolean("webStorageEnabled", true);
caps->SetBoolean("rotatable", false);
caps->SetBoolean("acceptSslCerts", capabilities.accept_insecure_certs);
caps->SetBoolean("nativeEvents", true);
caps->SetBoolean("hasTouchScreen", session->chrome->HasTouchScreen());
}
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