Diff
Modified: trunk/Source/WebDriver/ChangeLog (220385 => 220386)
--- trunk/Source/WebDriver/ChangeLog 2017-08-08 05:48:26 UTC (rev 220385)
+++ trunk/Source/WebDriver/ChangeLog 2017-08-08 06:22:02 UTC (rev 220386)
@@ -1,3 +1,28 @@
+2017-08-07 Carlos Garcia Campos <cgar...@igalia.com>
+
+ WebDriver: implement user prompt commands
+ https://bugs.webkit.org/show_bug.cgi?id=174614
+
+ Reviewed by Brian Burg.
+
+ * CommandResult.cpp:
+ (WebDriver::CommandResult::CommandResult): Handle NoJavaScriptDialog protocol error.
+ (WebDriver::CommandResult::httpStatusCode const): Add NoSuchAlert.
+ (WebDriver::CommandResult::errorString const): Ditto.
+ * CommandResult.h:
+ * Session.cpp:
+ (WebDriver::Session::dismissAlert):
+ (WebDriver::Session::acceptAlert):
+ (WebDriver::Session::getAlertText):
+ (WebDriver::Session::sendAlertText):
+ * Session.h:
+ * WebDriverService.cpp:
+ (WebDriver::WebDriverService::dismissAlert):
+ (WebDriver::WebDriverService::acceptAlert):
+ (WebDriver::WebDriverService::getAlertText):
+ (WebDriver::WebDriverService::sendAlertText):
+ * WebDriverService.h:
+
2017-08-05 Carlos Garcia Campos <cgar...@igalia.com>
[GTK][WPE] Add API to provide browser information required by automation
Modified: trunk/Source/WebDriver/CommandResult.cpp (220385 => 220386)
--- trunk/Source/WebDriver/CommandResult.cpp 2017-08-08 05:48:26 UTC (rev 220385)
+++ trunk/Source/WebDriver/CommandResult.cpp 2017-08-08 06:22:02 UTC (rev 220386)
@@ -102,6 +102,8 @@
m_errorCode = ErrorCode::InvalidSelector;
else if (errorName == "Timeout")
m_errorCode = ErrorCode::Timeout;
+ else if (errorName == "NoJavaScriptDialog")
+ m_errorCode = ErrorCode::NoSuchAlert;
break;
}
@@ -127,6 +129,7 @@
case ErrorCode::InvalidArgument:
case ErrorCode::InvalidElementState:
case ErrorCode::InvalidSelector:
+ case ErrorCode::NoSuchAlert:
case ErrorCode::NoSuchElement:
case ErrorCode::NoSuchFrame:
case ErrorCode::NoSuchWindow:
@@ -168,6 +171,8 @@
return ASCIILiteral("invalid session id");
case ErrorCode::_javascript_Error:
return ASCIILiteral("_javascript_ error");
+ case ErrorCode::NoSuchAlert:
+ return ASCIILiteral("no such alert");
case ErrorCode::NoSuchElement:
return ASCIILiteral("no such element");
case ErrorCode::NoSuchFrame:
Modified: trunk/Source/WebDriver/CommandResult.h (220385 => 220386)
--- trunk/Source/WebDriver/CommandResult.h 2017-08-08 05:48:26 UTC (rev 220385)
+++ trunk/Source/WebDriver/CommandResult.h 2017-08-08 06:22:02 UTC (rev 220386)
@@ -46,6 +46,7 @@
InvalidSelector,
InvalidSessionID,
_javascript_Error,
+ NoSuchAlert,
NoSuchElement,
NoSuchFrame,
NoSuchWindow,
Modified: trunk/Source/WebDriver/Session.cpp (220385 => 220386)
--- trunk/Source/WebDriver/Session.cpp 2017-08-08 05:48:26 UTC (rev 220385)
+++ trunk/Source/WebDriver/Session.cpp 2017-08-08 06:22:02 UTC (rev 220386)
@@ -1463,4 +1463,82 @@
});
}
+void Session::dismissAlert(Function<void (CommandResult&&)>&& completionHandler)
+{
+ if (!m_toplevelBrowsingContext) {
+ completionHandler(CommandResult::fail(CommandResult::ErrorCode::NoSuchWindow));
+ return;
+ }
+
+ RefPtr<InspectorObject> parameters = InspectorObject::create();
+ parameters->setString(ASCIILiteral("browsingContextHandle"), m_toplevelBrowsingContext.value());
+ m_host->sendCommandToBackend(ASCIILiteral("dismissCurrentJavaScriptDialog"), WTFMove(parameters), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) {
+ if (response.isError) {
+ completionHandler(CommandResult::fail(WTFMove(response.responseObject)));
+ return;
+ }
+ completionHandler(CommandResult::success());
+ });
+}
+
+void Session::acceptAlert(Function<void (CommandResult&&)>&& completionHandler)
+{
+ if (!m_toplevelBrowsingContext) {
+ completionHandler(CommandResult::fail(CommandResult::ErrorCode::NoSuchWindow));
+ return;
+ }
+
+ RefPtr<InspectorObject> parameters = InspectorObject::create();
+ parameters->setString(ASCIILiteral("browsingContextHandle"), m_toplevelBrowsingContext.value());
+ m_host->sendCommandToBackend(ASCIILiteral("acceptCurrentJavaScriptDialog"), WTFMove(parameters), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) {
+ if (response.isError) {
+ completionHandler(CommandResult::fail(WTFMove(response.responseObject)));
+ return;
+ }
+ completionHandler(CommandResult::success());
+ });
+}
+
+void Session::getAlertText(Function<void (CommandResult&&)>&& completionHandler)
+{
+ if (!m_toplevelBrowsingContext) {
+ completionHandler(CommandResult::fail(CommandResult::ErrorCode::NoSuchWindow));
+ return;
+ }
+
+ RefPtr<InspectorObject> parameters = InspectorObject::create();
+ parameters->setString(ASCIILiteral("browsingContextHandle"), m_toplevelBrowsingContext.value());
+ m_host->sendCommandToBackend(ASCIILiteral("messageOfCurrentJavaScriptDialog"), 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("message"), valueString)) {
+ completionHandler(CommandResult::fail(CommandResult::ErrorCode::UnknownError));
+ return;
+ }
+ completionHandler(CommandResult::success(InspectorValue::create(valueString)));
+ });
+}
+
+void Session::sendAlertText(const String& text, Function<void (CommandResult&&)>&& completionHandler)
+{
+ if (!m_toplevelBrowsingContext) {
+ completionHandler(CommandResult::fail(CommandResult::ErrorCode::NoSuchWindow));
+ return;
+ }
+
+ RefPtr<InspectorObject> parameters = InspectorObject::create();
+ parameters->setString(ASCIILiteral("browsingContextHandle"), m_toplevelBrowsingContext.value());
+ parameters->setString(ASCIILiteral("userInput"), text);
+ m_host->sendCommandToBackend(ASCIILiteral("setUserInputForCurrentJavaScriptPrompt"), WTFMove(parameters), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) {
+ if (response.isError) {
+ completionHandler(CommandResult::fail(WTFMove(response.responseObject)));
+ return;
+ }
+ completionHandler(CommandResult::success());
+ });
+}
+
} // namespace WebDriver
Modified: trunk/Source/WebDriver/Session.h (220385 => 220386)
--- trunk/Source/WebDriver/Session.h 2017-08-08 05:48:26 UTC (rev 220385)
+++ trunk/Source/WebDriver/Session.h 2017-08-08 06:22:02 UTC (rev 220386)
@@ -94,6 +94,10 @@
void elementSendKeys(const String& elementID, Vector<String>&& keys, Function<void (CommandResult&&)>&&);
void elementSubmit(const String& elementID, Function<void (CommandResult&&)>&&);
void executeScript(const String& script, RefPtr<Inspector::InspectorArray>&& arguments, ExecuteScriptMode, Function<void (CommandResult&&)>&&);
+ void dismissAlert(Function<void (CommandResult&&)>&&);
+ void acceptAlert(Function<void (CommandResult&&)>&&);
+ void getAlertText(Function<void (CommandResult&&)>&&);
+ void sendAlertText(const String&, Function<void (CommandResult&&)>&&);
private:
Session(std::unique_ptr<SessionHost>&&);
Modified: trunk/Source/WebDriver/WebDriverService.cpp (220385 => 220386)
--- trunk/Source/WebDriver/WebDriverService.cpp 2017-08-08 05:48:26 UTC (rev 220385)
+++ trunk/Source/WebDriver/WebDriverService.cpp 2017-08-08 06:22:02 UTC (rev 220386)
@@ -151,6 +151,11 @@
{ HTTPMethod::Post, "/session/$sessionId/execute/sync", &WebDriverService::executeScript },
{ HTTPMethod::Post, "/session/$sessionId/execute/async", &WebDriverService::executeAsyncScript },
+ { HTTPMethod::Post, "/session/$sessionId/alert/dismiss", &WebDriverService::dismissAlert },
+ { HTTPMethod::Post, "/session/$sessionId/alert/accept", &WebDriverService::acceptAlert },
+ { HTTPMethod::Get, "/session/$sessionId/alert/text", &WebDriverService::getAlertText },
+ { HTTPMethod::Post, "/session/$sessionId/alert/text", &WebDriverService::sendAlertText },
+
{ HTTPMethod::Get, "/session/$sessionId/element/$elementId/displayed", &WebDriverService::isElementDisplayed },
};
@@ -1228,4 +1233,78 @@
});
}
+void WebDriverService::dismissAlert(RefPtr<InspectorObject>&& parameters, Function<void (CommandResult&&)>&& completionHandler)
+{
+ // §18.1 Dismiss Alert.
+ // https://w3c.github.io/webdriver/webdriver-spec.html#dismiss-alert
+ 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->dismissAlert(WTFMove(completionHandler));
+ });
+}
+
+void WebDriverService::acceptAlert(RefPtr<InspectorObject>&& parameters, Function<void (CommandResult&&)>&& completionHandler)
+{
+ // §18.2 Accept Alert.
+ // https://w3c.github.io/webdriver/webdriver-spec.html#accept-alert
+ 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->acceptAlert(WTFMove(completionHandler));
+ });
+}
+
+void WebDriverService::getAlertText(RefPtr<InspectorObject>&& parameters, Function<void (CommandResult&&)>&& completionHandler)
+{
+ // §18.3 Get Alert Text.
+ // https://w3c.github.io/webdriver/webdriver-spec.html#get-alert-text
+ 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->getAlertText(WTFMove(completionHandler));
+ });
+}
+
+void WebDriverService::sendAlertText(RefPtr<InspectorObject>&& parameters, Function<void (CommandResult&&)>&& completionHandler)
+{
+ // §18.4 Send Alert Text.
+ // https://w3c.github.io/webdriver/webdriver-spec.html#send-alert-text
+ auto session = findSessionOrCompleteWithError(*parameters, completionHandler);
+ if (!session)
+ return;
+
+ String text;
+ if (!parameters->getString(ASCIILiteral("text"), text)) {
+ completionHandler(CommandResult::fail(CommandResult::ErrorCode::InvalidArgument));
+ return;
+ }
+
+ session->waitForNavigationToComplete([session, text = WTFMove(text), completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable {
+ if (result.isError()) {
+ completionHandler(WTFMove(result));
+ return;
+ }
+ session->sendAlertText(text, WTFMove(completionHandler));
+ });
+}
+
} // namespace WebDriver
Modified: trunk/Source/WebDriver/WebDriverService.h (220385 => 220386)
--- trunk/Source/WebDriver/WebDriverService.h 2017-08-08 05:48:26 UTC (rev 220385)
+++ trunk/Source/WebDriver/WebDriverService.h 2017-08-08 06:22:02 UTC (rev 220386)
@@ -101,6 +101,10 @@
void elementSubmit(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
void executeScript(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
void executeAsyncScript(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
+ void dismissAlert(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
+ void acceptAlert(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
+ void getAlertText(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
+ void sendAlertText(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
static Capabilities platformCapabilities();
RefPtr<Inspector::InspectorObject> processCapabilities(const Inspector::InspectorObject&, Function<void (CommandResult&&)>&) const;