Skip to content

Commit

Permalink
Merge r225208 - WebDriver: Implement get active element command
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=180001

Reviewed by Brian Burg.

12.6 Get Active Element
https://w3c.github.io/webdriver/webdriver-spec.html#get-active-element

Fixes imported/w3c/webdriver/tests/element_retrieval/get_active_element.py.

* Session.cpp:
(WebDriver::Session::getActiveElement):
* Session.h:
* WebDriverService.cpp:
(WebDriver::WebDriverService::getActiveElement):
* WebDriverService.h:
  • Loading branch information
carlosgcampos committed Dec 18, 2017
1 parent 19c499b commit e1e2a4a
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 0 deletions.
19 changes: 19 additions & 0 deletions Source/WebDriver/ChangeLog
@@ -1,3 +1,22 @@
2017-11-27 Carlos Garcia Campos <cgarcia@igalia.com>

WebDriver: Implement get active element command
https://bugs.webkit.org/show_bug.cgi?id=180001

Reviewed by Brian Burg.

12.6 Get Active Element
https://w3c.github.io/webdriver/webdriver-spec.html#get-active-element

Fixes imported/w3c/webdriver/tests/element_retrieval/get_active_element.py.

* Session.cpp:
(WebDriver::Session::getActiveElement):
* Session.h:
* WebDriverService.cpp:
(WebDriver::WebDriverService::getActiveElement):
* WebDriverService.h:

2017-11-21 Carlos Garcia Campos <cgarcia@igalia.com>

WebDriver: do not try to parse http body if method is not POST
Expand Down
41 changes: 41 additions & 0 deletions Source/WebDriver/Session.cpp
Expand Up @@ -961,6 +961,47 @@ void Session::findElements(const String& strategy, const String& selector, FindE
});
}

void Session::getActiveElement(Function<void (CommandResult&&)>&& completionHandler)
{
if (!m_toplevelBrowsingContext) {
completionHandler(CommandResult::fail(CommandResult::ErrorCode::NoSuchWindow));
return;
}

handleUserPrompts([this, completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable {
if (result.isError()) {
completionHandler(WTFMove(result));
return;
}
RefPtr<InspectorObject> parameters = InspectorObject::create();
parameters->setString(ASCIILiteral("browsingContextHandle"), m_toplevelBrowsingContext.value());
parameters->setString(ASCIILiteral("function"), ASCIILiteral("function() { return document.activeElement; }"));
parameters->setArray(ASCIILiteral("arguments"), InspectorArray::create());
m_host->sendCommandToBackend(ASCIILiteral("evaluateJavaScriptFunction"), WTFMove(parameters), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) {
if (response.isError || !response.responseObject) {
completionHandler(CommandResult::fail(WTFMove(response.responseObject)));
return;
}
String valueString;
if (!response.responseObject->getString(ASCIILiteral("result"), valueString)) {
completionHandler(CommandResult::fail(CommandResult::ErrorCode::UnknownError));
return;
}
RefPtr<InspectorValue> resultValue;
if (!InspectorValue::parseJSON(valueString, resultValue)) {
completionHandler(CommandResult::fail(CommandResult::ErrorCode::UnknownError));
return;
}
RefPtr<InspectorObject> elementObject = createElement(WTFMove(resultValue));
if (!elementObject) {
completionHandler(CommandResult::fail(CommandResult::ErrorCode::UnknownError));
return;
}
completionHandler(CommandResult::success(WTFMove(elementObject)));
});
});
}

void Session::isElementSelected(const String& elementID, Function<void (CommandResult&&)>&& completionHandler)
{
if (!m_toplevelBrowsingContext) {
Expand Down
1 change: 1 addition & 0 deletions Source/WebDriver/Session.h
Expand Up @@ -90,6 +90,7 @@ class Session : public RefCounted<Session> {
void getWindowRect(Function<void (CommandResult&&)>&&);
void setWindowRect(std::optional<double> x, std::optional<double> y, std::optional<double> width, std::optional<double> height, Function<void (CommandResult&&)>&&);
void findElements(const String& strategy, const String& selector, FindElementsMode, const String& rootElementID, Function<void (CommandResult&&)>&&);
void getActiveElement(Function<void (CommandResult&&)>&&);
void isElementSelected(const String& elementID, Function<void (CommandResult&&)>&&);
void getElementText(const String& elementID, Function<void (CommandResult&&)>&&);
void getElementTagName(const String& elementID, Function<void (CommandResult&&)>&&);
Expand Down
18 changes: 18 additions & 0 deletions Source/WebDriver/WebDriverService.cpp
Expand Up @@ -125,6 +125,7 @@ const WebDriverService::Command WebDriverService::s_commands[] = {
{ HTTPMethod::Post, "/session/$sessionId/elements", &WebDriverService::findElements },
{ HTTPMethod::Post, "/session/$sessionId/element/$elementId/element", &WebDriverService::findElementFromElement },
{ HTTPMethod::Post, "/session/$sessionId/element/$elementId/elements", &WebDriverService::findElementsFromElement },
{ HTTPMethod::Get, "/session/$sessionId/element/active", &WebDriverService::getActiveElement },

{ HTTPMethod::Get, "/session/$sessionId/element/$elementId/selected", &WebDriverService::isElementSelected },
{ HTTPMethod::Get, "/session/$sessionId/element/$elementId/attribute/$name", &WebDriverService::getElementAttribute },
Expand Down Expand Up @@ -1082,6 +1083,23 @@ void WebDriverService::findElementsFromElement(RefPtr<InspectorObject>&& paramet
session->findElements(strategy, selector, Session::FindElementsMode::Multiple, elementID.value(), WTFMove(completionHandler));
}

void WebDriverService::getActiveElement(RefPtr<InspectorObject>&& parameters, Function<void (CommandResult&&)>&& completionHandler)
{
// §12.6 Get Active Element.
// https://w3c.github.io/webdriver/webdriver-spec.html#get-active-element
auto session = findSessionOrCompleteWithError(*parameters, completionHandler);
if (!session)
return;

session->waitForNavigationToComplete([session, completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable {
if (result.isError()) {
completionHandler(WTFMove(result));
return;
}
session->getActiveElement(WTFMove(completionHandler));
});
}

void WebDriverService::isElementSelected(RefPtr<InspectorObject>&& parameters, Function<void (CommandResult&&)>&& completionHandler)
{
// §13.1 Is Element Selected.
Expand Down
1 change: 1 addition & 0 deletions Source/WebDriver/WebDriverService.h
Expand Up @@ -85,6 +85,7 @@ class WebDriverService final : public HTTPRequestHandler {
void findElements(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
void findElementFromElement(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
void findElementsFromElement(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
void getActiveElement(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
void isElementSelected(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
void getElementText(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
void getElementTagName(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
Expand Down

0 comments on commit e1e2a4a

Please sign in to comment.