Title: [220386] trunk/Source/WebDriver
Revision
220386
Author
carlo...@webkit.org
Date
2017-08-07 23:22:02 -0700 (Mon, 07 Aug 2017)

Log Message

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:

Modified Paths

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;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to