Title: [221363] releases/WebKitGTK/webkit-2.18/Source/WebDriver
Revision
221363
Author
carlo...@webkit.org
Date
2017-08-30 03:14:47 -0700 (Wed, 30 Aug 2017)

Log Message

Merge r221241 - WebDriver: implement cookies commands
https://bugs.webkit.org/show_bug.cgi?id=174613

Reviewed by Brian Burg.

Add cookies commands.

16. Cookies.
https://w3c.github.io/webdriver/webdriver-spec.html#cookies

* CommandResult.cpp:
(WebDriver::CommandResult::httpStatusCode const): Add NoSuchCookie error.
(WebDriver::CommandResult::errorString const): Ditto.
* CommandResult.h:
* Session.cpp:
(WebDriver::parseAutomationCookie): Parse JSON cookie object returned by automation and convert it to a Cookie struct.
(WebDriver::builtAutomationCookie): Build a JSON cookie object as expected by automation from a Cookie struct.
(WebDriver::serializeCookie): Serialize a Cookie struct into a JSON cookie object according to the WebDriver spec.
(WebDriver::Session::getAllCookies):
(WebDriver::Session::getNamedCookie):
(WebDriver::Session::addCookie):
(WebDriver::Session::deleteCookie):
(WebDriver::Session::deleteAllCookies):
* Session.h:
* WebDriverService.cpp:
(WebDriver::WebDriverService::getAllCookies):
(WebDriver::WebDriverService::getNamedCookie):
(WebDriver::deserializeCookie):
(WebDriver::WebDriverService::addCookie):
(WebDriver::WebDriverService::deleteCookie):
(WebDriver::WebDriverService::deleteAllCookies):
* WebDriverService.h:

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/ChangeLog (221362 => 221363)


--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/ChangeLog	2017-08-30 10:14:08 UTC (rev 221362)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/ChangeLog	2017-08-30 10:14:47 UTC (rev 221363)
@@ -1,3 +1,38 @@
+2017-08-28  Carlos Garcia Campos  <cgar...@igalia.com>
+
+        WebDriver: implement cookies commands
+        https://bugs.webkit.org/show_bug.cgi?id=174613
+
+        Reviewed by Brian Burg.
+
+        Add cookies commands.
+
+        16. Cookies.
+        https://w3c.github.io/webdriver/webdriver-spec.html#cookies
+
+        * CommandResult.cpp:
+        (WebDriver::CommandResult::httpStatusCode const): Add NoSuchCookie error.
+        (WebDriver::CommandResult::errorString const): Ditto.
+        * CommandResult.h:
+        * Session.cpp:
+        (WebDriver::parseAutomationCookie): Parse JSON cookie object returned by automation and convert it to a Cookie struct.
+        (WebDriver::builtAutomationCookie): Build a JSON cookie object as expected by automation from a Cookie struct.
+        (WebDriver::serializeCookie): Serialize a Cookie struct into a JSON cookie object according to the WebDriver spec.
+        (WebDriver::Session::getAllCookies):
+        (WebDriver::Session::getNamedCookie):
+        (WebDriver::Session::addCookie):
+        (WebDriver::Session::deleteCookie):
+        (WebDriver::Session::deleteAllCookies):
+        * Session.h:
+        * WebDriverService.cpp:
+        (WebDriver::WebDriverService::getAllCookies):
+        (WebDriver::WebDriverService::getNamedCookie):
+        (WebDriver::deserializeCookie):
+        (WebDriver::WebDriverService::addCookie):
+        (WebDriver::WebDriverService::deleteCookie):
+        (WebDriver::WebDriverService::deleteAllCookies):
+        * WebDriverService.h:
+
 2017-07-28  Carlos Garcia Campos  <cgar...@igalia.com>
 
         WebDriver: fix return value of close window command

Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/CommandResult.cpp (221362 => 221363)


--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/CommandResult.cpp	2017-08-30 10:14:08 UTC (rev 221362)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/CommandResult.cpp	2017-08-30 10:14:47 UTC (rev 221363)
@@ -135,11 +135,12 @@
     case ErrorCode::InvalidElementState:
     case ErrorCode::InvalidSelector:
     case ErrorCode::NoSuchAlert:
-    case ErrorCode::NoSuchElement:
     case ErrorCode::NoSuchFrame:
     case ErrorCode::NoSuchWindow:
     case ErrorCode::StaleElementReference:
         return 400;
+    case ErrorCode::NoSuchCookie:
+    case ErrorCode::NoSuchElement:
     case ErrorCode::InvalidSessionID:
     case ErrorCode::UnknownCommand:
         return 404;
@@ -181,6 +182,8 @@
         return ASCIILiteral("_javascript_ error");
     case ErrorCode::NoSuchAlert:
         return ASCIILiteral("no such alert");
+    case ErrorCode::NoSuchCookie:
+        return ASCIILiteral("no such cookie");
     case ErrorCode::NoSuchElement:
         return ASCIILiteral("no such element");
     case ErrorCode::NoSuchFrame:

Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/CommandResult.h (221362 => 221363)


--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/CommandResult.h	2017-08-30 10:14:08 UTC (rev 221362)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/CommandResult.h	2017-08-30 10:14:47 UTC (rev 221363)
@@ -49,6 +49,7 @@
         InvalidSessionID,
         _javascript_Error,
         NoSuchAlert,
+        NoSuchCookie,
         NoSuchElement,
         NoSuchFrame,
         NoSuchWindow,

Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/Session.cpp (221362 => 221363)


--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/Session.cpp	2017-08-30 10:14:08 UTC (rev 221362)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/Session.cpp	2017-08-30 10:14:47 UTC (rev 221363)
@@ -1712,6 +1712,213 @@
     });
 }
 
+static std::optional<Session::Cookie> parseAutomationCookie(const InspectorObject& cookieObject)
+{
+    Session::Cookie cookie;
+    if (!cookieObject.getString(ASCIILiteral("name"), cookie.name))
+        return std::nullopt;
+    if (!cookieObject.getString(ASCIILiteral("value"), cookie.value))
+        return std::nullopt;
+
+    String path;
+    if (cookieObject.getString(ASCIILiteral("path"), path))
+        cookie.path = path;
+    String domain;
+    if (cookieObject.getString(ASCIILiteral("domain"), domain))
+        cookie.domain = domain;
+    bool secure;
+    if (cookieObject.getBoolean(ASCIILiteral("secure"), secure))
+        cookie.secure = secure;
+    bool httpOnly;
+    if (cookieObject.getBoolean(ASCIILiteral("httpOnly"), httpOnly))
+        cookie.httpOnly = httpOnly;
+    bool session = false;
+    cookieObject.getBoolean(ASCIILiteral("session"), session);
+    if (!session) {
+        double expiry;
+        if (cookieObject.getDouble(ASCIILiteral("expires"), expiry))
+            cookie.expiry = expiry;
+    }
+
+    return cookie;
+}
+
+static RefPtr<InspectorObject> builtAutomationCookie(const Session::Cookie& cookie)
+{
+    RefPtr<InspectorObject> cookieObject = InspectorObject::create();
+    cookieObject->setString(ASCIILiteral("name"), cookie.name);
+    cookieObject->setString(ASCIILiteral("value"), cookie.value);
+    cookieObject->setString(ASCIILiteral("path"), cookie.path.value_or("/"));
+    cookieObject->setString(ASCIILiteral("domain"), cookie.domain.value_or(emptyString()));
+    cookieObject->setBoolean(ASCIILiteral("secure"), cookie.secure.value_or(false));
+    cookieObject->setBoolean(ASCIILiteral("httpOnly"), cookie.httpOnly.value_or(false));
+    cookieObject->setBoolean(ASCIILiteral("session"), !cookie.expiry);
+    cookieObject->setDouble(ASCIILiteral("expires"), cookie.expiry.value_or(0));
+    return cookieObject;
+}
+
+static RefPtr<InspectorObject> serializeCookie(const Session::Cookie& cookie)
+{
+    RefPtr<InspectorObject> cookieObject = InspectorObject::create();
+    cookieObject->setString(ASCIILiteral("name"), cookie.name);
+    cookieObject->setString(ASCIILiteral("value"), cookie.value);
+    if (cookie.path)
+        cookieObject->setString(ASCIILiteral("path"), cookie.path.value());
+    if (cookie.domain)
+        cookieObject->setString(ASCIILiteral("domain"), cookie.domain.value());
+    if (cookie.secure)
+        cookieObject->setBoolean(ASCIILiteral("secure"), cookie.secure.value());
+    if (cookie.httpOnly)
+        cookieObject->setBoolean(ASCIILiteral("httpOnly"), cookie.httpOnly.value());
+    if (cookie.expiry)
+        cookieObject->setInteger(ASCIILiteral("expiry"), cookie.expiry.value());
+    return cookieObject;
+}
+
+void Session::getAllCookies(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());
+        m_host->sendCommandToBackend(ASCIILiteral("getAllCookies"), WTFMove(parameters), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) mutable {
+            if (response.isError || !response.responseObject) {
+                completionHandler(CommandResult::fail(WTFMove(response.responseObject)));
+                return;
+            }
+            RefPtr<InspectorArray> cookiesArray;
+            if (!response.responseObject->getArray(ASCIILiteral("cookies"), cookiesArray)) {
+                completionHandler(CommandResult::fail(CommandResult::ErrorCode::UnknownError));
+                return;
+            }
+            RefPtr<InspectorArray> cookies = InspectorArray::create();
+            for (unsigned i = 0; i < cookiesArray->length(); ++i) {
+                RefPtr<InspectorValue> cookieValue = cookiesArray->get(i);
+                RefPtr<InspectorObject> cookieObject;
+                if (!cookieValue->asObject(cookieObject)) {
+                    completionHandler(CommandResult::fail(CommandResult::ErrorCode::UnknownError));
+                    return;
+                }
+
+                auto cookie = parseAutomationCookie(*cookieObject);
+                if (!cookie) {
+                    completionHandler(CommandResult::fail(CommandResult::ErrorCode::UnknownError));
+                    return;
+                }
+                cookies->pushObject(serializeCookie(cookie.value()));
+            }
+            completionHandler(CommandResult::success(WTFMove(cookies)));
+        });
+    });
+}
+
+void Session::getNamedCookie(const String& name, Function<void (CommandResult&&)>&& completionHandler)
+{
+    getAllCookies([this, name, completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable {
+        if (result.isError()) {
+            completionHandler(WTFMove(result));
+            return;
+        }
+        RefPtr<InspectorArray> cookiesArray;
+        result.result()->asArray(cookiesArray);
+        for (unsigned i = 0; i < cookiesArray->length(); ++i) {
+            RefPtr<InspectorValue> cookieValue = cookiesArray->get(i);
+            RefPtr<InspectorObject> cookieObject;
+            cookieValue->asObject(cookieObject);
+            String cookieName;
+            cookieObject->getString(ASCIILiteral("name"), cookieName);
+            if (cookieName == name) {
+                completionHandler(CommandResult::success(WTFMove(cookieObject)));
+                return;
+            }
+        }
+        completionHandler(CommandResult::fail(CommandResult::ErrorCode::NoSuchCookie));
+    });
+}
+
+void Session::addCookie(const Cookie& cookie, Function<void (CommandResult&&)>&& completionHandler)
+{
+    if (!m_toplevelBrowsingContext) {
+        completionHandler(CommandResult::fail(CommandResult::ErrorCode::NoSuchWindow));
+        return;
+    }
+
+    handleUserPrompts([this, cookie = builtAutomationCookie(cookie), 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->setObject(ASCIILiteral("cookie"), WTFMove(cookie));
+        m_host->sendCommandToBackend(ASCIILiteral("addSingleCookie"), 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::deleteCookie(const String& name, Function<void (CommandResult&&)>&& completionHandler)
+{
+    if (!m_toplevelBrowsingContext) {
+        completionHandler(CommandResult::fail(CommandResult::ErrorCode::NoSuchWindow));
+        return;
+    }
+
+    handleUserPrompts([this, name, 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("cookieName"), name);
+        m_host->sendCommandToBackend(ASCIILiteral("deleteSingleCookie"), 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::deleteAllCookies(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());
+        m_host->sendCommandToBackend(ASCIILiteral("deleteAllCookies"), 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::dismissAlert(Function<void (CommandResult&&)>&& completionHandler)
 {
     if (!m_toplevelBrowsingContext) {

Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/Session.h (221362 => 221363)


--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/Session.h	2017-08-30 10:14:08 UTC (rev 221362)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/Session.h	2017-08-30 10:14:47 UTC (rev 221363)
@@ -59,6 +59,16 @@
     enum class ExecuteScriptMode { Sync, Async };
     enum class Timeout { Script, PageLoad, Implicit };
 
+    struct Cookie {
+        String name;
+        String value;
+        std::optional<String> path;
+        std::optional<String> domain;
+        std::optional<bool> secure;
+        std::optional<bool> httpOnly;
+        std::optional<unsigned> expiry;
+    };
+
     void waitForNavigationToComplete(Function<void (CommandResult&&)>&&);
     void createTopLevelBrowsingContext(Function<void (CommandResult&&)>&&);
     void close(Function<void (CommandResult&&)>&&);
@@ -94,6 +104,11 @@
     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 getAllCookies(Function<void (CommandResult&&)>&&);
+    void getNamedCookie(const String& name, Function<void (CommandResult&&)>&&);
+    void addCookie(const Cookie&, Function<void (CommandResult&&)>&&);
+    void deleteCookie(const String& name, Function<void (CommandResult&&)>&&);
+    void deleteAllCookies(Function<void (CommandResult&&)>&&);
     void dismissAlert(Function<void (CommandResult&&)>&&);
     void acceptAlert(Function<void (CommandResult&&)>&&);
     void getAlertText(Function<void (CommandResult&&)>&&);

Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/WebDriverService.cpp (221362 => 221363)


--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/WebDriverService.cpp	2017-08-30 10:14:08 UTC (rev 221362)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/WebDriverService.cpp	2017-08-30 10:14:47 UTC (rev 221363)
@@ -147,6 +147,12 @@
     { HTTPMethod::Post, "/session/$sessionId/execute/sync", &WebDriverService::executeScript },
     { HTTPMethod::Post, "/session/$sessionId/execute/async", &WebDriverService::executeAsyncScript },
 
+    { HTTPMethod::Get, "/session/$sessionId/cookie", &WebDriverService::getAllCookies },
+    { HTTPMethod::Get, "/session/$sessionId/cookie/$name", &WebDriverService::getNamedCookie },
+    { HTTPMethod::Post, "/session/$sessionId/cookie", &WebDriverService::addCookie },
+    { HTTPMethod::Delete, "/session/$sessionId/cookie/$name", &WebDriverService::deleteCookie },
+    { HTTPMethod::Delete, "/session/$sessionId/cookie", &WebDriverService::deleteAllCookies },
+
     { HTTPMethod::Post, "/session/$sessionId/alert/dismiss", &WebDriverService::dismissAlert },
     { HTTPMethod::Post, "/session/$sessionId/alert/accept", &WebDriverService::acceptAlert },
     { HTTPMethod::Get, "/session/$sessionId/alert/text", &WebDriverService::getAlertText },
@@ -1274,6 +1280,159 @@
     });
 }
 
+void WebDriverService::getAllCookies(RefPtr<InspectorObject>&& parameters, Function<void (CommandResult&&)>&& completionHandler)
+{
+    // §16.1 Get All Cookies.
+    // https://w3c.github.io/webdriver/webdriver-spec.html#get-all-cookies
+    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->getAllCookies(WTFMove(completionHandler));
+    });
+}
+
+void WebDriverService::getNamedCookie(RefPtr<InspectorObject>&& parameters, Function<void (CommandResult&&)>&& completionHandler)
+{
+    // §16.2 Get Named Cookie.
+    // https://w3c.github.io/webdriver/webdriver-spec.html#get-named-cookie
+    auto session = findSessionOrCompleteWithError(*parameters, completionHandler);
+    if (!session)
+        return;
+
+    String name;
+    if (!parameters->getString(ASCIILiteral("name"), name)) {
+        completionHandler(CommandResult::fail(CommandResult::ErrorCode::InvalidArgument));
+        return;
+    }
+
+    session->waitForNavigationToComplete([session, name = WTFMove(name), completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable {
+        if (result.isError()) {
+            completionHandler(WTFMove(result));
+            return;
+        }
+        session->getNamedCookie(name, WTFMove(completionHandler));
+    });
+}
+
+static std::optional<Session::Cookie> deserializeCookie(InspectorObject& cookieObject)
+{
+    Session::Cookie cookie;
+    if (!cookieObject.getString(ASCIILiteral("name"), cookie.name) || cookie.name.isEmpty())
+        return std::nullopt;
+    if (!cookieObject.getString(ASCIILiteral("value"), cookie.value) || cookie.value.isEmpty())
+        return std::nullopt;
+
+    RefPtr<InspectorValue> value;
+    if (cookieObject.getValue(ASCIILiteral("path"), value)) {
+        String path;
+        if (!value->asString(path))
+            return std::nullopt;
+        cookie.path = path;
+    }
+    if (cookieObject.getValue(ASCIILiteral("domain"), value)) {
+        String domain;
+        if (!value->asString(domain))
+            return std::nullopt;
+        cookie.domain = domain;
+    }
+    if (cookieObject.getValue(ASCIILiteral("secure"), value)) {
+        bool secure;
+        if (!value->asBoolean(secure))
+            return std::nullopt;
+        cookie.secure = secure;
+    }
+    if (cookieObject.getValue(ASCIILiteral("httpOnly"), value)) {
+        bool httpOnly;
+        if (!value->asBoolean(httpOnly))
+            return std::nullopt;
+        cookie.httpOnly = httpOnly;
+    }
+    if (cookieObject.getValue(ASCIILiteral("expiry"), value)) {
+        int expiry;
+        if (!value->asInteger(expiry) || expiry < 0 || expiry > INT_MAX)
+            return std::nullopt;
+
+        cookie.expiry = static_cast<unsigned>(expiry);
+    }
+
+    return cookie;
+}
+
+void WebDriverService::addCookie(RefPtr<InspectorObject>&& parameters, Function<void (CommandResult&&)>&& completionHandler)
+{
+    // §16.3 Add Cookie.
+    // https://w3c.github.io/webdriver/webdriver-spec.html#add-cookie
+    auto session = findSessionOrCompleteWithError(*parameters, completionHandler);
+    if (!session)
+        return;
+
+    RefPtr<InspectorObject> cookieObject;
+    if (!parameters->getObject(ASCIILiteral("cookie"), cookieObject)) {
+        completionHandler(CommandResult::fail(CommandResult::ErrorCode::InvalidArgument));
+        return;
+    }
+
+    auto cookie = deserializeCookie(*cookieObject);
+    if (!cookie) {
+        completionHandler(CommandResult::fail(CommandResult::ErrorCode::InvalidArgument));
+        return;
+    }
+
+    session->waitForNavigationToComplete([session, cookie = WTFMove(cookie), completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable {
+        if (result.isError()) {
+            completionHandler(WTFMove(result));
+            return;
+        }
+        session->addCookie(cookie.value(), WTFMove(completionHandler));
+    });
+}
+
+void WebDriverService::deleteCookie(RefPtr<InspectorObject>&& parameters, Function<void (CommandResult&&)>&& completionHandler)
+{
+    // §16.4 Delete Cookie.
+    // https://w3c.github.io/webdriver/webdriver-spec.html#delete-cookie
+    auto session = findSessionOrCompleteWithError(*parameters, completionHandler);
+    if (!session)
+        return;
+
+    String name;
+    if (!parameters->getString(ASCIILiteral("name"), name)) {
+        completionHandler(CommandResult::fail(CommandResult::ErrorCode::InvalidArgument));
+        return;
+    }
+
+    session->waitForNavigationToComplete([session, name = WTFMove(name), completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable {
+        if (result.isError()) {
+            completionHandler(WTFMove(result));
+            return;
+        }
+        session->deleteCookie(name, WTFMove(completionHandler));
+    });
+}
+
+void WebDriverService::deleteAllCookies(RefPtr<InspectorObject>&& parameters, Function<void (CommandResult&&)>&& completionHandler)
+{
+    // §16.5 Delete All Cookies.
+    // https://w3c.github.io/webdriver/webdriver-spec.html#delete-all-cookies
+    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->deleteAllCookies(WTFMove(completionHandler));
+    });
+}
+
 void WebDriverService::dismissAlert(RefPtr<InspectorObject>&& parameters, Function<void (CommandResult&&)>&& completionHandler)
 {
     // §18.1 Dismiss Alert.

Modified: releases/WebKitGTK/webkit-2.18/Source/WebDriver/WebDriverService.h (221362 => 221363)


--- releases/WebKitGTK/webkit-2.18/Source/WebDriver/WebDriverService.h	2017-08-30 10:14:08 UTC (rev 221362)
+++ releases/WebKitGTK/webkit-2.18/Source/WebDriver/WebDriverService.h	2017-08-30 10:14:47 UTC (rev 221363)
@@ -100,6 +100,11 @@
     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 getAllCookies(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
+    void getNamedCookie(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
+    void addCookie(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
+    void deleteCookie(RefPtr<Inspector::InspectorObject>&&, Function<void (CommandResult&&)>&&);
+    void deleteAllCookies(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&&)>&&);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to