Title: [220329] trunk
Revision
220329
Author
carlo...@webkit.org
Date
2017-08-06 23:06:34 -0700 (Sun, 06 Aug 2017)

Log Message

[GTK][WPE] Add API to provide browser information required by automation
https://bugs.webkit.org/show_bug.cgi?id=175130

Source/_javascript_Core:

Reviewed by Brian Burg.

Add browserName and browserVersion to RemoteInspector::Client::Capabilities and virtual methods to the Client to
get them.

* inspector/remote/RemoteInspector.cpp:
(Inspector::RemoteInspector::updateClientCapabilities): Update also browserName and browserVersion.
* inspector/remote/RemoteInspector.h:
* inspector/remote/glib/RemoteInspectorGlib.cpp:
(Inspector::RemoteInspector::requestAutomationSession): Call updateClientCapabilities() after the session is
requested to ensure they are updated before StartAutomationSession reply is sent.
* inspector/remote/glib/RemoteInspectorServer.cpp: Add browserName and browserVersion as return values of
StartAutomationSession mesasage.

Source/WebDriver:

Reviewed by Brian Burg.

* Session.cpp:
(WebDriver::Session::createTopLevelBrowsingContext): Check if startAutomationSession and complete the command
with error in that case.
* SessionHost.h:
* glib/SessionHostGlib.cpp:
(WebDriver::SessionHost::matchCapabilities): Match the capabilities that are known only after the browser has
been launched.
(WebDriver::SessionHost::startAutomationSession): Handle the StartAutomationSession response, extracting the
capabilities and calling matchCapabilities() to match them.
(WebDriver::SessionHost::setTargetList): Return early if the session was rejected before due to invalid
capabilities.

Source/WebKit:

Reviewed by Michael Catanzaro.

When a new automation session is started, the web driver receives some required capabilities from the client,
like browser name and version. The session should be rejected if those required capabilities don't match with
the actual browser that is launched. We don't know that information in WebKit, so we need to add API so that
users can provide it when a new session request is made. This patch adds boxed object WebKitApplicationInfo that
can be used to set the application name and version. This object can be set to a WebKitAutomationSession when
WebKitWebContext::automation-started signal is emitted.

* PlatformGTK.cmake:
* PlatformWPE.cmake:
* UIProcess/API/glib/WebKitApplicationInfo.cpp: Added.
(webkit_application_info_new):
(webkit_application_info_ref):
(webkit_application_info_unref):
(webkit_application_info_set_name):
(webkit_application_info_get_name):
(webkit_application_info_set_version):
(webkit_application_info_get_version):
* UIProcess/API/glib/WebKitAutomationSession.cpp:
(webkitAutomationSessionDispose):
(webkit_automation_session_class_init):
(webkitAutomationSessionGetBrowserName):
(webkitAutomationSessionGetBrowserVersion):
(webkit_automation_session_set_application_info):
(webkit_automation_session_get_application_info):
* UIProcess/API/glib/WebKitAutomationSessionPrivate.h:
* UIProcess/API/glib/WebKitWebContext.cpp:
* UIProcess/API/gtk/WebKitApplicationInfo.h: Added.
* UIProcess/API/gtk/WebKitAutomationSession.h:
* UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt:
* UIProcess/API/gtk/docs/webkit2gtk-docs.sgml:
* UIProcess/API/gtk/webkit2.h:
* UIProcess/API/wpe/WebKitApplicationInfo.h: Added.
* UIProcess/API/wpe/WebKitAutomationSession.h:
* UIProcess/API/wpe/webkit.h:

Tools:

Reviewed by Michael Catanzaro.

* MiniBrowser/gtk/main.c:
(automationStartedCallback): Set browser information when a new automation session is started.
* TestWebKitAPI/Tests/WebKitGLib/TestAutomationSession.cpp:
(testAutomationSessionApplicationInfo):
(beforeAll):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (220328 => 220329)


--- trunk/Source/_javascript_Core/ChangeLog	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/_javascript_Core/ChangeLog	2017-08-07 06:06:34 UTC (rev 220329)
@@ -1,3 +1,22 @@
+2017-08-05  Carlos Garcia Campos  <cgar...@igalia.com>
+
+        [GTK][WPE] Add API to provide browser information required by automation
+        https://bugs.webkit.org/show_bug.cgi?id=175130
+
+        Reviewed by Brian Burg.
+
+        Add browserName and browserVersion to RemoteInspector::Client::Capabilities and virtual methods to the Client to
+        get them.
+
+        * inspector/remote/RemoteInspector.cpp:
+        (Inspector::RemoteInspector::updateClientCapabilities): Update also browserName and browserVersion.
+        * inspector/remote/RemoteInspector.h:
+        * inspector/remote/glib/RemoteInspectorGlib.cpp:
+        (Inspector::RemoteInspector::requestAutomationSession): Call updateClientCapabilities() after the session is
+        requested to ensure they are updated before StartAutomationSession reply is sent.
+        * inspector/remote/glib/RemoteInspectorServer.cpp: Add browserName and browserVersion as return values of
+        StartAutomationSession mesasage.
+
 2017-08-06  Yusuke Suzuki  <utatane....@gmail.com>
 
         Promise resolve and reject function should have length = 1

Modified: trunk/Source/_javascript_Core/inspector/remote/RemoteInspector.cpp (220328 => 220329)


--- trunk/Source/_javascript_Core/inspector/remote/RemoteInspector.cpp	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/_javascript_Core/inspector/remote/RemoteInspector.cpp	2017-08-07 06:06:34 UTC (rev 220329)
@@ -133,7 +133,9 @@
         m_clientCapabilities = std::nullopt;
     else {
         RemoteInspector::Client::Capabilities updatedCapabilities = {
-            m_client->remoteAutomationAllowed() // remoteAutomationAllowed
+            m_client->remoteAutomationAllowed(),
+            m_client->browserName(),
+            m_client->browserVersion()
         };
 
         m_clientCapabilities = updatedCapabilities;

Modified: trunk/Source/_javascript_Core/inspector/remote/RemoteInspector.h (220328 => 220329)


--- trunk/Source/_javascript_Core/inspector/remote/RemoteInspector.h	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/_javascript_Core/inspector/remote/RemoteInspector.h	2017-08-07 06:06:34 UTC (rev 220329)
@@ -30,6 +30,7 @@
 #include <wtf/Forward.h>
 #include <wtf/HashMap.h>
 #include <wtf/Lock.h>
+#include <wtf/text/WTFString.h>
 
 #if PLATFORM(COCOA)
 #include "RemoteInspectorXPCConnection.h"
@@ -66,10 +67,14 @@
     public:
         struct Capabilities {
             bool remoteAutomationAllowed : 1;
+            String browserName;
+            String browserVersion;
         };
 
         virtual ~Client() { }
         virtual bool remoteAutomationAllowed() const = 0;
+        virtual String browserName() const { return { }; }
+        virtual String browserVersion() const { return { }; }
         virtual void requestAutomationSession(const String& sessionIdentifier) = 0;
     };
 
@@ -85,6 +90,7 @@
     RemoteInspector::Client* client() const { return m_client; }
     void setClient(RemoteInspector::Client*);
     void clientCapabilitiesDidChange();
+    std::optional<RemoteInspector::Client::Capabilities> clientCapabilities() const { return m_clientCapabilities; }
 
     void setupFailed(unsigned targetIdentifier);
     void setupCompleted(unsigned targetIdentifier);

Modified: trunk/Source/_javascript_Core/inspector/remote/glib/RemoteInspectorGlib.cpp (220328 => 220329)


--- trunk/Source/_javascript_Core/inspector/remote/glib/RemoteInspectorGlib.cpp	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/_javascript_Core/inspector/remote/glib/RemoteInspectorGlib.cpp	2017-08-07 06:06:34 UTC (rev 220329)
@@ -355,6 +355,7 @@
         return;
 
     m_client->requestAutomationSession(String::fromUTF8(sessionID));
+    updateClientCapabilities();
 }
 
 } // namespace Inspector

Modified: trunk/Source/_javascript_Core/inspector/remote/glib/RemoteInspectorServer.cpp (220328 => 220329)


--- trunk/Source/_javascript_Core/inspector/remote/glib/RemoteInspectorServer.cpp	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/_javascript_Core/inspector/remote/glib/RemoteInspectorServer.cpp	2017-08-07 06:06:34 UTC (rev 220329)
@@ -79,6 +79,8 @@
     "    </method>"
     "    <method name='StartAutomationSession'>"
     "      <arg type='s' name='sessionID' direction='in'/>"
+    "      <arg type='s' name='browserName' direction='out'/>"
+    "      <arg type='s' name='browserVersion' direction='out'/>"
     "    </method>"
     "  </interface>"
     "</node>";
@@ -121,7 +123,10 @@
             const char* sessionID;
             g_variant_get(parameters, "(&s)", &sessionID);
             inspectorServer->startAutomationSession(connection, sessionID);
-            g_dbus_method_invocation_return_value(invocation, nullptr);
+            auto capabilities = RemoteInspector::singleton().clientCapabilities();
+            g_dbus_method_invocation_return_value(invocation, g_variant_new("(ss)",
+                capabilities ? capabilities->browserName.utf8().data() : "",
+                capabilities ? capabilities->browserVersion.utf8().data() : ""));
         } else
             g_dbus_method_invocation_return_value(invocation, nullptr);
     },

Modified: trunk/Source/WebDriver/ChangeLog (220328 => 220329)


--- trunk/Source/WebDriver/ChangeLog	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebDriver/ChangeLog	2017-08-07 06:06:34 UTC (rev 220329)
@@ -1,5 +1,24 @@
 2017-08-05  Carlos Garcia Campos  <cgar...@igalia.com>
 
+        [GTK][WPE] Add API to provide browser information required by automation
+        https://bugs.webkit.org/show_bug.cgi?id=175130
+
+        Reviewed by Brian Burg.
+
+        * Session.cpp:
+        (WebDriver::Session::createTopLevelBrowsingContext): Check if startAutomationSession and complete the command
+        with error in that case.
+        * SessionHost.h:
+        * glib/SessionHostGlib.cpp:
+        (WebDriver::SessionHost::matchCapabilities): Match the capabilities that are known only after the browser has
+        been launched.
+        (WebDriver::SessionHost::startAutomationSession): Handle the StartAutomationSession response, extracting the
+        capabilities and calling matchCapabilities() to match them.
+        (WebDriver::SessionHost::setTargetList): Return early if the session was rejected before due to invalid
+        capabilities.
+
+2017-08-05  Carlos Garcia Campos  <cgar...@igalia.com>
+
         WebDriver: Implement page load strategy
         https://bugs.webkit.org/show_bug.cgi?id=175183
 

Modified: trunk/Source/WebDriver/Session.cpp (220328 => 220329)


--- trunk/Source/WebDriver/Session.cpp	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebDriver/Session.cpp	2017-08-07 06:06:34 UTC (rev 220329)
@@ -122,7 +122,11 @@
 void Session::createTopLevelBrowsingContext(Function<void (CommandResult&&)>&& completionHandler)
 {
     ASSERT(!m_toplevelBrowsingContext.value());
-    m_host->startAutomationSession(m_id, [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)]() mutable {
+    m_host->startAutomationSession(m_id, [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](std::optional<String> errorMessage) mutable {
+        if (errorMessage) {
+            completionHandler(CommandResult::fail(CommandResult::ErrorCode::UnknownError, errorMessage.value()));
+            return;
+        }
         m_host->sendCommandToBackend(ASCIILiteral("createBrowsingContext"), nullptr, [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) mutable {
             if (response.isError || !response.responseObject) {
                 completionHandler(CommandResult::fail(WTFMove(response.responseObject)));

Modified: trunk/Source/WebDriver/SessionHost.h (220328 => 220329)


--- trunk/Source/WebDriver/SessionHost.h	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebDriver/SessionHost.h	2017-08-07 06:06:34 UTC (rev 220329)
@@ -56,7 +56,7 @@
 
     enum class Succeeded { No, Yes };
     void connectToBrowser(Function<void (Succeeded)>&&);
-    void startAutomationSession(const String& sessionID, Function<void ()>&&);
+    void startAutomationSession(const String& sessionID, Function<void (std::optional<String>)>&&);
 
     struct CommandResponse {
         RefPtr<Inspector::InspectorObject> responseObject;
@@ -80,6 +80,7 @@
     static const GDBusInterfaceVTable s_interfaceVTable;
     void launchBrowser(Function<void (Succeeded)>&&);
     void connectToBrowser(std::unique_ptr<ConnectToBrowserAsyncData>&&);
+    std::optional<String> matchCapabilities(GVariant*);
     void setupConnection(GRefPtr<GDBusConnection>&&, Function<void (Succeeded)>&&);
     void setTargetList(uint64_t connectionID, Vector<Target>&&);
     void sendMessageToFrontend(uint64_t connectionID, uint64_t targetID, const char* message);
@@ -94,7 +95,7 @@
     long m_closeMessageID { 0 };
 
 #if USE(GLIB)
-    Function<void ()> m_startSessionCompletionHandler;
+    Function<void (std::optional<String>)> m_startSessionCompletionHandler;
     GRefPtr<GSubprocess> m_browser;
     GRefPtr<GDBusConnection> m_dbusConnection;
     GRefPtr<GCancellable> m_cancellable;

Modified: trunk/Source/WebDriver/glib/SessionHostGlib.cpp (220328 => 220329)


--- trunk/Source/WebDriver/glib/SessionHostGlib.cpp	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebDriver/glib/SessionHostGlib.cpp	2017-08-07 06:06:34 UTC (rev 220329)
@@ -26,6 +26,7 @@
 #include "config.h"
 #include "SessionHost.h"
 
+#include "WebDriverService.h"
 #include <gio/gio.h>
 #include <wtf/RunLoop.h>
 #include <wtf/glib/GUniquePtr.h>
@@ -220,11 +221,31 @@
     completionHandler(Succeeded::Yes);
 }
 
-void SessionHost::startAutomationSession(const String& sessionID, Function<void ()>&& completionHandler)
+std::optional<String> SessionHost::matchCapabilities(GVariant* capabilities)
 {
+    const char* browserName;
+    const char* browserVersion;
+    g_variant_get(capabilities, "(&s&s)", &browserName, &browserVersion);
+
+    if (m_capabilities.browserName) {
+        if (m_capabilities.browserName.value() != browserName)
+            return makeString("expected browserName ", m_capabilities.browserName.value(), " but got ", browserName);
+    } else
+        m_capabilities.browserName = String(browserName);
+
+    if (m_capabilities.browserVersion) {
+        if (!WebDriverService::platformCompareBrowserVersions(m_capabilities.browserVersion.value(), browserVersion))
+            return makeString("requested browserVersion is ", m_capabilities.browserVersion.value(), " but actual version is ", browserVersion);
+    } else
+        m_capabilities.browserVersion = String(browserVersion);
+
+    return std::nullopt;
+}
+
+void SessionHost::startAutomationSession(const String& sessionID, Function<void (std::optional<String>)>&& completionHandler)
+{
     ASSERT(m_dbusConnection);
     ASSERT(!m_startSessionCompletionHandler);
-    // FIXME: Make StartAutomationSession return browser information and we use it to match capabilities.
     m_startSessionCompletionHandler = WTFMove(completionHandler);
     g_dbus_connection_call(m_dbusConnection.get(), nullptr,
         INSPECTOR_DBUS_OBJECT_PATH,
@@ -232,7 +253,27 @@
         "StartAutomationSession",
         g_variant_new("(s)", sessionID.utf8().data()),
         nullptr, G_DBUS_CALL_FLAGS_NO_AUTO_START,
-        -1, m_cancellable.get(), dbusConnectionCallAsyncReadyCallback, nullptr);
+        -1, m_cancellable.get(), [](GObject* source, GAsyncResult* result, gpointer userData) {
+            GUniqueOutPtr<GError> error;
+            GRefPtr<GVariant> resultVariant = adoptGRef(g_dbus_connection_call_finish(G_DBUS_CONNECTION(source), result, &error.outPtr()));
+            if (!resultVariant && g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED))
+                return;
+
+            auto sessionHost = static_cast<SessionHost*>(userData);
+            if (!resultVariant) {
+                auto completionHandler = std::exchange(sessionHost->m_startSessionCompletionHandler, nullptr);
+                completionHandler(String("Failed to start automation session"));
+                return;
+            }
+
+            auto errorString = sessionHost->matchCapabilities(resultVariant.get());
+            if (errorString) {
+                auto completionHandler = std::exchange(sessionHost->m_startSessionCompletionHandler, nullptr);
+                completionHandler(errorString);
+                return;
+            }
+        }, this
+    );
 }
 
 void SessionHost::setTargetList(uint64_t connectionID, Vector<Target>&& targetList)
@@ -255,6 +296,11 @@
         return;
     }
 
+    if (!m_startSessionCompletionHandler) {
+        // Session creation was already rejected.
+        return;
+    }
+
     m_connectionID = connectionID;
     g_dbus_connection_call(m_dbusConnection.get(), nullptr,
         INSPECTOR_DBUS_OBJECT_PATH,
@@ -265,7 +311,7 @@
         -1, m_cancellable.get(), dbusConnectionCallAsyncReadyCallback, nullptr);
 
     auto startSessionCompletionHandler = std::exchange(m_startSessionCompletionHandler, nullptr);
-    startSessionCompletionHandler();
+    startSessionCompletionHandler(std::nullopt);
 }
 
 void SessionHost::sendMessageToFrontend(uint64_t connectionID, uint64_t targetID, const char* message)

Modified: trunk/Source/WebKit/ChangeLog (220328 => 220329)


--- trunk/Source/WebKit/ChangeLog	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebKit/ChangeLog	2017-08-07 06:06:34 UTC (rev 220329)
@@ -1,3 +1,45 @@
+2017-08-05  Carlos Garcia Campos  <cgar...@igalia.com>
+
+        [GTK][WPE] Add API to provide browser information required by automation
+        https://bugs.webkit.org/show_bug.cgi?id=175130
+
+        Reviewed by Michael Catanzaro.
+
+        When a new automation session is started, the web driver receives some required capabilities from the client,
+        like browser name and version. The session should be rejected if those required capabilities don't match with
+        the actual browser that is launched. We don't know that information in WebKit, so we need to add API so that
+        users can provide it when a new session request is made. This patch adds boxed object WebKitApplicationInfo that
+        can be used to set the application name and version. This object can be set to a WebKitAutomationSession when
+        WebKitWebContext::automation-started signal is emitted.
+
+        * PlatformGTK.cmake:
+        * PlatformWPE.cmake:
+        * UIProcess/API/glib/WebKitApplicationInfo.cpp: Added.
+        (webkit_application_info_new):
+        (webkit_application_info_ref):
+        (webkit_application_info_unref):
+        (webkit_application_info_set_name):
+        (webkit_application_info_get_name):
+        (webkit_application_info_set_version):
+        (webkit_application_info_get_version):
+        * UIProcess/API/glib/WebKitAutomationSession.cpp:
+        (webkitAutomationSessionDispose):
+        (webkit_automation_session_class_init):
+        (webkitAutomationSessionGetBrowserName):
+        (webkitAutomationSessionGetBrowserVersion):
+        (webkit_automation_session_set_application_info):
+        (webkit_automation_session_get_application_info):
+        * UIProcess/API/glib/WebKitAutomationSessionPrivate.h:
+        * UIProcess/API/glib/WebKitWebContext.cpp:
+        * UIProcess/API/gtk/WebKitApplicationInfo.h: Added.
+        * UIProcess/API/gtk/WebKitAutomationSession.h:
+        * UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt:
+        * UIProcess/API/gtk/docs/webkit2gtk-docs.sgml:
+        * UIProcess/API/gtk/webkit2.h:
+        * UIProcess/API/wpe/WebKitApplicationInfo.h: Added.
+        * UIProcess/API/wpe/WebKitAutomationSession.h:
+        * UIProcess/API/wpe/webkit.h:
+
 2017-08-06  Carlos Alberto Lopez Perez  <clo...@igalia.com>
 
         [GTK][WPE] CFLAGS from pkg-config for (E)GL are not passed to WebKit

Modified: trunk/Source/WebKit/PlatformGTK.cmake (220328 => 220329)


--- trunk/Source/WebKit/PlatformGTK.cmake	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebKit/PlatformGTK.cmake	2017-08-07 06:06:34 UTC (rev 220329)
@@ -117,6 +117,7 @@
     UIProcess/API/C/gtk/WKView.cpp
 
     UIProcess/API/glib/IconDatabase.cpp
+    UIProcess/API/glib/WebKitApplicationInfo.cpp
     UIProcess/API/glib/WebKitAuthenticationRequest.cpp
     UIProcess/API/glib/WebKitAutomationSession.cpp
     UIProcess/API/glib/WebKitBackForwardList.cpp
@@ -417,6 +418,7 @@
 set(WebKit2GTK_INSTALLED_HEADERS
     ${DERIVED_SOURCES_WEBKIT2GTK_API_DIR}/WebKitEnumTypes.h
     ${DERIVED_SOURCES_WEBKIT2GTK_API_DIR}/WebKitVersion.h
+    ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitApplicationInfo.h
     ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitAuthenticationRequest.h
     ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitAutocleanups.h
     ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitAutomationSession.h

Modified: trunk/Source/WebKit/PlatformWPE.cmake (220328 => 220329)


--- trunk/Source/WebKit/PlatformWPE.cmake	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebKit/PlatformWPE.cmake	2017-08-07 06:06:34 UTC (rev 220329)
@@ -132,6 +132,7 @@
     UIProcess/API/C/wpe/WKView.cpp
 
     UIProcess/API/glib/IconDatabase.cpp
+    UIProcess/API/glib/WebKitApplicationInfo.cpp
     UIProcess/API/glib/WebKitAuthenticationRequest.cpp
     UIProcess/API/glib/WebKitAutomationSession.cpp
     UIProcess/API/glib/WebKitBackForwardList.cpp
@@ -275,6 +276,7 @@
 
 set(WPE_API_INSTALLED_HEADERS
     ${DERIVED_SOURCES_WPE_API_DIR}/WebKitEnumTypes.h
+    ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitApplicationInfo.h
     ${WEBKIT2_DIR}/UIProcess/API/wpe/WebKitAuthenticationRequest.h
     ${WEBKIT2_DIR}/UIProcess/API/wpe/WebKitAutomationSession.h
     ${WEBKIT2_DIR}/UIProcess/API/wpe/WebKitBackForwardList.h

Added: trunk/Source/WebKit/UIProcess/API/glib/WebKitApplicationInfo.cpp (0 => 220329)


--- trunk/Source/WebKit/UIProcess/API/glib/WebKitApplicationInfo.cpp	                        (rev 0)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitApplicationInfo.cpp	2017-08-07 06:06:34 UTC (rev 220329)
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2017 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include "WebKitApplicationInfo.h"
+
+#include <wtf/text/CString.h>
+
+struct _WebKitApplicationInfo {
+    CString name;
+    uint64_t majorVersion;
+    uint64_t minorVersion;
+    uint64_t microVersion;
+
+    int referenceCount { 1 };
+};
+
+G_DEFINE_BOXED_TYPE(WebKitApplicationInfo, webkit_application_info, webkit_application_info_ref, webkit_application_info_unref)
+
+/**
+ * webkit_application_info_new:
+ *
+ * Creates a new #WebKitApplicationInfo
+ *
+ * Returns: (transfer full): the newly created #WebKitApplicationInfo.
+ *
+ * since: 2.18
+ */
+WebKitApplicationInfo* webkit_application_info_new()
+{
+    WebKitApplicationInfo* info = static_cast<WebKitApplicationInfo*>(fastMalloc(sizeof(WebKitApplicationInfo)));
+    new (info) WebKitApplicationInfo();
+    return info;
+}
+
+/**
+ * webkit_application_info_ref:
+ * @info: a #WebKitApplicationInfo
+ *
+ * Atomically increments the reference count of @info by one. This
+ * function is MT-safe and may be called from any thread.
+ *
+ * Returns: The passed in #WebKitApplicationInfo
+ *
+ * Since: 2.18
+ */
+WebKitApplicationInfo* webkit_application_info_ref(WebKitApplicationInfo* info)
+{
+    g_atomic_int_inc(&info->referenceCount);
+    return info;
+}
+
+/**
+ * webkit_application_info_unref:
+ * @info: a #WebKitApplicationInfo
+ *
+ * Atomically decrements the reference count of @info by one. If the
+ * reference count drops to 0, all memory allocated by the #WebKitApplicationInfo is
+ * released. This function is MT-safe and may be called from any
+ * thread.
+ *
+ * Since: 2.18
+ */
+void webkit_application_info_unref(WebKitApplicationInfo* info)
+{
+    if (g_atomic_int_dec_and_test(&info->referenceCount)) {
+        info->~WebKitApplicationInfo();
+        fastFree(info);
+    }
+}
+
+/**
+ * webkit_application_info_set_name:
+ * @info: a #WebKitApplicationInfo
+ * @name: the application name
+ *
+ * Set the name of the application. If not provided, or %NULL is passed,
+ * g_get_prgname() will be used.
+ *
+ * Since: 2.18
+ */
+void webkit_application_info_set_name(WebKitApplicationInfo* info, const char* name)
+{
+    g_return_if_fail(info);
+
+    info->name = name;
+}
+
+/**
+ * webkit_application_info_get_name:
+ * @info: a #WebKitApplicationInfo
+ *
+ * Get the name of the application. If webkit_application_info_set_name() hasn't been
+ * called with a valid name, this returns g_get_prgname().
+ *
+ * Returns: the application name
+ *
+ * Since: 2.18
+ */
+const char* webkit_application_info_get_name(WebKitApplicationInfo* info)
+{
+    g_return_val_if_fail(info, nullptr);
+
+    if (!info->name.isNull())
+        return info->name.data();
+
+    return g_get_prgname();
+}
+
+/**
+ * webkit_application_info_set_version:
+ * @info: a #WebKitApplicationInfo
+ * @major: the major version number
+ * @minor: the minor version number
+ * @micro: the micro version number
+ *
+ * Set the application version. If the application doesn't use the format
+ * major.minor.micro you can pass 0 as the micro to use major.minor, or pass
+ * 0 as both micro and minor to use only major number. Any other format must
+ * be converted to major.minor.micro so that it can be used in version comparisons.
+ *
+ * Since: 2.18
+ */
+void webkit_application_info_set_version(WebKitApplicationInfo* info, guint64 major, guint64 minor, guint64 micro)
+{
+    g_return_if_fail(info);
+
+    info->majorVersion = major;
+    info->minorVersion = minor;
+    info->microVersion = micro;
+}
+
+/**
+ * webkit_application_info_get_version:
+ * @info: a #WebKitApplicationInfo
+ * @major: (out): return location for the major version number
+ * @minor: (out) (allow-none): return location for the minor version number
+ * @micro: (out) (allow-none): return location for the micro version number
+ *
+ * Get the application version previously set with webkit_application_info_set_version().
+ *
+ * Since: 2.18
+ */
+void webkit_application_info_get_version(WebKitApplicationInfo* info, guint64* major, guint64* minor, guint64* micro)
+{
+    g_return_if_fail(info && major);
+
+    *major = info->majorVersion;
+    if (minor)
+        *minor = info->minorVersion;
+    if (micro)
+        *micro = info->microVersion;
+}

Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitAutomationSession.cpp (220328 => 220329)


--- trunk/Source/WebKit/UIProcess/API/glib/WebKitAutomationSession.cpp	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitAutomationSession.cpp	2017-08-07 06:06:34 UTC (rev 220329)
@@ -21,6 +21,7 @@
 #include "WebKitAutomationSession.h"
 
 #include "APIAutomationSessionClient.h"
+#include "WebKitApplicationInfo.h"
 #include "WebKitAutomationSessionPrivate.h"
 #include "WebKitWebViewPrivate.h"
 #include <glib/gi18n-lib.h>
@@ -58,6 +59,7 @@
 
 struct _WebKitAutomationSessionPrivate {
     RefPtr<WebAutomationSession> session;
+    WebKitApplicationInfo* applicationInfo;
     CString id;
 };
 
@@ -128,6 +130,18 @@
     session->priv->session->setClient(std::make_unique<AutomationSessionClient>(session));
 }
 
+static void webkitAutomationSessionDispose(GObject* object)
+{
+    WebKitAutomationSession* session = WEBKIT_AUTOMATION_SESSION(object);
+
+    if (session->priv->applicationInfo) {
+        webkit_application_info_unref(session->priv->applicationInfo);
+        session->priv->applicationInfo = nullptr;
+    }
+
+    G_OBJECT_CLASS(webkit_automation_session_parent_class)->dispose(object);
+}
+
 static void webkit_automation_session_class_init(WebKitAutomationSessionClass* sessionClass)
 {
     GObjectClass* gObjectClass = G_OBJECT_CLASS(sessionClass);
@@ -134,6 +148,7 @@
     gObjectClass->get_property = webkitAutomationSessionGetProperty;
     gObjectClass->set_property = webkitAutomationSessionSetProperty;
     gObjectClass->constructed = webkitAutomationSessionConstructed;
+    gObjectClass->dispose = webkitAutomationSessionDispose;
 
     /**
      * WebKitAutomationSession:id:
@@ -187,6 +202,31 @@
     return *session->priv->session;
 }
 
+String webkitAutomationSessionGetBrowserName(WebKitAutomationSession* session)
+{
+    if (session->priv->applicationInfo)
+        return String::fromUTF8(webkit_application_info_get_name(session->priv->applicationInfo));
+
+    return g_get_prgname();
+}
+
+String webkitAutomationSessionGetBrowserVersion(WebKitAutomationSession* session)
+{
+    if (!session->priv->applicationInfo)
+        return { };
+
+    guint64 major, minor, micro;
+    webkit_application_info_get_version(session->priv->applicationInfo, &major, &minor, &micro);
+
+    if (!micro && !minor)
+        return String::number(major);
+
+    if (!micro)
+        return makeString(String::number(major), ".", String::number(minor));
+
+    return makeString(String::number(major), ".", String::number(minor), ".", String::number(micro));
+}
+
 /**
  * webkit_automation_session_get_id:
  * @session: a #WebKitAutomationSession
@@ -202,3 +242,47 @@
     g_return_val_if_fail(WEBKIT_IS_AUTOMATION_SESSION(session), nullptr);
     return session->priv->id.data();
 }
+
+/**
+ * webkit_automation_session_set_application_info:
+ * @session: a #WebKitAutomationSession
+ * @info: a #WebKitApplicationInfo
+ *
+ * Set the application information to @session. This information will be used by the driver service
+ * to match the requested capabilities with the actual application information. If this information
+ * is not provided to the session when a new automation session is requested, the creation might fail
+ * if the client requested a specific browser name or version. This will not have any effect when called
+ * after the automation session has been fully created, so this must be called in the callback of
+ * #WebKitWebContext::automation-started signal.
+ *
+ * Since: 2.18
+ */
+void webkit_automation_session_set_application_info(WebKitAutomationSession* session, WebKitApplicationInfo* info)
+{
+    g_return_if_fail(WEBKIT_IS_AUTOMATION_SESSION(session));
+    g_return_if_fail(info);
+
+    if (session->priv->applicationInfo == info)
+        return;
+
+    if (session->priv->applicationInfo)
+        webkit_application_info_unref(session->priv->applicationInfo);
+    session->priv->applicationInfo = webkit_application_info_ref(info);
+}
+
+/**
+ * webkit_automation_session_get_application_info:
+ * @session: a #WebKitAutomationSession
+ *
+ * Get the #WebKitAutomationSession previously set with webkit_automation_session_set_application_info().
+ *
+ * Returns: (transfer none): the #WebKitAutomationSession of @session, or %NULL if no one has been set.
+ *
+ * Since: 2.18
+ */
+WebKitApplicationInfo* webkit_automation_session_get_application_info(WebKitAutomationSession* session)
+{
+    g_return_val_if_fail(WEBKIT_IS_AUTOMATION_SESSION(session), nullptr);
+
+    return session->priv->applicationInfo;
+}

Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitAutomationSessionPrivate.h (220328 => 220329)


--- trunk/Source/WebKit/UIProcess/API/glib/WebKitAutomationSessionPrivate.h	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitAutomationSessionPrivate.h	2017-08-07 06:06:34 UTC (rev 220329)
@@ -24,3 +24,5 @@
 
 WebKitAutomationSession* webkitAutomationSessionCreate(const char* sessionID);
 WebKit::WebAutomationSession& webkitAutomationSessionGetSession(WebKitAutomationSession*);
+String webkitAutomationSessionGetBrowserName(WebKitAutomationSession*);
+String webkitAutomationSessionGetBrowserVersion(WebKitAutomationSession*);

Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitWebContext.cpp (220328 => 220329)


--- trunk/Source/WebKit/UIProcess/API/glib/WebKitWebContext.cpp	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitWebContext.cpp	2017-08-07 06:06:34 UTC (rev 220329)
@@ -214,12 +214,28 @@
 private:
     bool remoteAutomationAllowed() const override { return true; }
 
+    String browserName() const override
+    {
+        if (!m_webContext->priv->automationSession)
+            return { };
+
+        return webkitAutomationSessionGetBrowserName(m_webContext->priv->automationSession.get());
+    }
+
+    String browserVersion() const override
+    {
+        if (!m_webContext->priv->automationSession)
+            return { };
+
+        return webkitAutomationSessionGetBrowserVersion(m_webContext->priv->automationSession.get());
+    }
+
     void requestAutomationSession(const String& sessionIdentifier) override
     {
         ASSERT(!m_webContext->priv->automationSession);
         m_webContext->priv->automationSession = adoptGRef(webkitAutomationSessionCreate(sessionIdentifier.utf8().data()));
+        g_signal_emit(m_webContext, signals[AUTOMATION_STARTED], 0, m_webContext->priv->automationSession.get());
         m_webContext->priv->processPool->setAutomationSession(&webkitAutomationSessionGetSession(m_webContext->priv->automationSession.get()));
-        g_signal_emit(m_webContext, signals[AUTOMATION_STARTED], 0, m_webContext->priv->automationSession.get());
     }
 
     WebKitWebContext* m_webContext;

Added: trunk/Source/WebKit/UIProcess/API/gtk/WebKitApplicationInfo.h (0 => 220329)


--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitApplicationInfo.h	                        (rev 0)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitApplicationInfo.h	2017-08-07 06:06:34 UTC (rev 220329)
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2017 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#if !defined(__WEBKIT2_H_INSIDE__) && !defined(WEBKIT2_COMPILATION)
+#error "Only <webkit2/webkit2.h> can be included directly."
+#endif
+
+#ifndef WebKitApplicationInfo_h
+#define WebKitApplicationInfo_h
+
+#include <glib-object.h>
+#include <webkit2/WebKitDefines.h>
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_APPLICATION_INFO (webkit_application_info_get_type())
+
+typedef struct _WebKitApplicationInfo WebKitApplicationInfo;
+
+
+WEBKIT_API GType
+webkit_application_info_get_type    (void);
+
+WEBKIT_API WebKitApplicationInfo *
+webkit_application_info_new         (void);
+
+WEBKIT_API WebKitApplicationInfo *
+webkit_application_info_ref         (WebKitApplicationInfo *info);
+
+WEBKIT_API void
+webkit_application_info_unref       (WebKitApplicationInfo *info);
+
+WEBKIT_API void
+webkit_application_info_set_name    (WebKitApplicationInfo *info,
+                                     const gchar           *name);
+WEBKIT_API const gchar *
+webkit_application_info_get_name    (WebKitApplicationInfo *info);
+
+WEBKIT_API void
+webkit_application_info_set_version (WebKitApplicationInfo *info,
+                                     guint64                major,
+                                     guint64                minor,
+                                     guint64                micro);
+
+WEBKIT_API void
+webkit_application_info_get_version (WebKitApplicationInfo *info,
+                                     guint64               *major,
+                                     guint64               *minor,
+                                     guint64               *micro);
+
+G_END_DECLS
+
+#endif

Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitAutomationSession.h (220328 => 220329)


--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitAutomationSession.h	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitAutomationSession.h	2017-08-07 06:06:34 UTC (rev 220329)
@@ -25,6 +25,7 @@
 #define WebKitAutomationSession_h
 
 #include <glib-object.h>
+#include <webkit2/WebKitApplicationInfo.h>
 #include <webkit2/WebKitDefines.h>
 
 G_BEGIN_DECLS
@@ -56,11 +57,18 @@
 };
 
 WEBKIT_API GType
-webkit_automation_session_get_type (void);
+webkit_automation_session_get_type             (void);
 
 WEBKIT_API const char *
-webkit_automation_session_get_id   (WebKitAutomationSession *session);
+webkit_automation_session_get_id               (WebKitAutomationSession *session);
 
+WEBKIT_API void
+webkit_automation_session_set_application_info (WebKitAutomationSession *session,
+                                                WebKitApplicationInfo   *info);
+
+WEBKIT_API WebKitApplicationInfo *
+webkit_automation_session_get_application_info (WebKitAutomationSession *session);
+
 G_END_DECLS
 
 #endif /* WebKitAutomationSession_h */

Modified: trunk/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt (220328 => 220329)


--- trunk/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt	2017-08-07 06:06:34 UTC (rev 220329)
@@ -1358,6 +1358,8 @@
 <FILE>WebKitAutomationSession</FILE>
 WebKitAutomationSession
 webkit_automation_session_get_id
+webkit_automation_session_set_application_info
+webkit_automation_session_get_application_info
 
 <SUBSECTION Private>
 WebKitAutomationSessionPrivate
@@ -1374,6 +1376,24 @@
 </SECTION>
 
 <SECTION>
+<FILE>WebKitApplicationInfo</FILE>
+WebKitApplicationInfo
+webkit_application_info_new
+webkit_application_info_ref
+webkit_application_info_unref
+webkit_application_info_set_name
+webkit_application_info_get_name
+webkit_application_info_set_version
+webkit_application_info_get_version
+
+<SUBSECTION Private>
+webkit_application_info_get_type
+
+<SUBSECTION Standard>
+WEBKIT_TYPE_APPLICATION_INFO
+</SECTION>
+
+<SECTION>
 <FILE>WebKitWebExtension</FILE>
 WebKitWebExtension
 WebKitWebExtensionInitializeFunction

Modified: trunk/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-docs.sgml (220328 => 220329)


--- trunk/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-docs.sgml	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-docs.sgml	2017-08-07 06:06:34 UTC (rev 220329)
@@ -59,6 +59,7 @@
     <xi:include href=""
     <xi:include href=""
     <xi:include href=""
+    <xi:include href=""
   </chapter>
 
   <chapter>

Modified: trunk/Source/WebKit/UIProcess/API/gtk/webkit2.h (220328 => 220329)


--- trunk/Source/WebKit/UIProcess/API/gtk/webkit2.h	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebKit/UIProcess/API/gtk/webkit2.h	2017-08-07 06:06:34 UTC (rev 220329)
@@ -27,6 +27,7 @@
 
 #define __WEBKIT2_H_INSIDE__
 
+#include <webkit2/WebKitApplicationInfo.h>
 #include <webkit2/WebKitAuthenticationRequest.h>
 #include <webkit2/WebKitAutomationSession.h>
 #include <webkit2/WebKitBackForwardList.h>

Added: trunk/Source/WebKit/UIProcess/API/wpe/WebKitApplicationInfo.h (0 => 220329)


--- trunk/Source/WebKit/UIProcess/API/wpe/WebKitApplicationInfo.h	                        (rev 0)
+++ trunk/Source/WebKit/UIProcess/API/wpe/WebKitApplicationInfo.h	2017-08-07 06:06:34 UTC (rev 220329)
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2017 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#if !defined(__WEBKIT_H_INSIDE__) && !defined(WEBKIT2_COMPILATION)
+#error "Only <wpe/webkit.h> can be included directly."
+#endif
+
+#ifndef WebKitApplicationInfo_h
+#define WebKitApplicationInfo_h
+
+#include <glib-object.h>
+#include <wpe/WebKitDefines.h>
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_APPLICATION_INFO (webkit_application_info_get_type())
+
+typedef struct _WebKitApplicationInfo WebKitApplicationInfo;
+
+
+WEBKIT_API GType
+webkit_application_info_get_type    (void);
+
+WEBKIT_API WebKitApplicationInfo *
+webkit_application_info_new         (void);
+
+WEBKIT_API WebKitApplicationInfo *
+webkit_application_info_ref         (WebKitApplicationInfo *info);
+
+WEBKIT_API void
+webkit_application_info_unref       (WebKitApplicationInfo *info);
+
+WEBKIT_API void
+webkit_application_info_set_name    (WebKitApplicationInfo *info,
+                                     const gchar           *name);
+WEBKIT_API const gchar *
+webkit_application_info_get_name    (WebKitApplicationInfo *info);
+
+WEBKIT_API void
+webkit_application_info_set_version (WebKitApplicationInfo *info,
+                                     guint64                major,
+                                     guint64                minor,
+                                     guint64                micro);
+
+WEBKIT_API void
+webkit_application_info_get_version (WebKitApplicationInfo *info,
+                                     guint64               *major,
+                                     guint64               *minor,
+                                     guint64               *micro);
+
+G_END_DECLS
+
+#endif

Modified: trunk/Source/WebKit/UIProcess/API/wpe/WebKitAutomationSession.h (220328 => 220329)


--- trunk/Source/WebKit/UIProcess/API/wpe/WebKitAutomationSession.h	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebKit/UIProcess/API/wpe/WebKitAutomationSession.h	2017-08-07 06:06:34 UTC (rev 220329)
@@ -25,6 +25,7 @@
 #define WebKitAutomationSession_h
 
 #include <glib-object.h>
+#include <wpe/WebKitApplicationInfo.h>
 #include <wpe/WebKitDefines.h>
 
 G_BEGIN_DECLS
@@ -56,11 +57,18 @@
 };
 
 WEBKIT_API GType
-webkit_automation_session_get_type (void);
+webkit_automation_session_get_type             (void);
 
 WEBKIT_API const char *
-webkit_automation_session_get_id   (WebKitAutomationSession *session);
+webkit_automation_session_get_id               (WebKitAutomationSession *session);
 
+WEBKIT_API void
+webkit_automation_session_set_application_info (WebKitAutomationSession *session,
+                                                WebKitApplicationInfo   *info);
+
+WEBKIT_API WebKitApplicationInfo *
+webkit_automation_session_get_application_info (WebKitAutomationSession *session);
+
 G_END_DECLS
 
 #endif /* WebKitAutomationSession_h */

Modified: trunk/Source/WebKit/UIProcess/API/wpe/webkit.h (220328 => 220329)


--- trunk/Source/WebKit/UIProcess/API/wpe/webkit.h	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Source/WebKit/UIProcess/API/wpe/webkit.h	2017-08-07 06:06:34 UTC (rev 220329)
@@ -27,6 +27,7 @@
 
 #define __WEBKIT_H_INSIDE__
 
+#include <wpe/WebKitApplicationInfo.h>
 #include <wpe/WebKitAuthenticationRequest.h>
 #include <wpe/WebKitAutomationSession.h>
 #include <wpe/WebKitBackForwardList.h>

Modified: trunk/Tools/ChangeLog (220328 => 220329)


--- trunk/Tools/ChangeLog	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Tools/ChangeLog	2017-08-07 06:06:34 UTC (rev 220329)
@@ -1,3 +1,16 @@
+2017-08-05  Carlos Garcia Campos  <cgar...@igalia.com>
+
+        [GTK][WPE] Add API to provide browser information required by automation
+        https://bugs.webkit.org/show_bug.cgi?id=175130
+
+        Reviewed by Michael Catanzaro.
+
+        * MiniBrowser/gtk/main.c:
+        (automationStartedCallback): Set browser information when a new automation session is started.
+        * TestWebKitAPI/Tests/WebKitGLib/TestAutomationSession.cpp:
+        (testAutomationSessionApplicationInfo):
+        (beforeAll):
+
 2017-08-06  Ryan Haddad  <ryanhad...@apple.com>
 
         Unreviewed, rolling out r220295.

Modified: trunk/Tools/MiniBrowser/gtk/main.c (220328 => 220329)


--- trunk/Tools/MiniBrowser/gtk/main.c	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Tools/MiniBrowser/gtk/main.c	2017-08-07 06:06:34 UTC (rev 220329)
@@ -458,6 +458,11 @@
 
 static void automationStartedCallback(WebKitWebContext *webContext, WebKitAutomationSession *session)
 {
+    WebKitApplicationInfo *info = webkit_application_info_new();
+    webkit_application_info_set_version(info, WEBKIT_MAJOR_VERSION, WEBKIT_MINOR_VERSION, WEBKIT_MICRO_VERSION);
+    webkit_automation_session_set_application_info(session, info);
+    webkit_application_info_unref(info);
+
     g_signal_connect(session, "create-web-view", G_CALLBACK(createWebViewForAutomationCallback), NULL);
 }
 

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestAutomationSession.cpp (220328 => 220329)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestAutomationSession.cpp	2017-08-07 03:24:50 UTC (rev 220328)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestAutomationSession.cpp	2017-08-07 06:06:34 UTC (rev 220329)
@@ -24,6 +24,13 @@
 #include <wtf/UUID.h>
 #include <wtf/text/StringBuilder.h>
 
+// FIXME: WPE doesn't expose WebKitVersion yet, the numbers defined here don't really matter.
+#if PLATFORM(WPE)
+#define WEBKIT_MAJOR_VERSION 1
+#define WEBKIT_MINOR_VERSION 2
+#define WEBKIT_MICRO_VERSION 3
+#endif
+
 class AutomationTest: public Test {
 public:
     MAKE_GLIB_TEST_FIXTURE(AutomationTest);
@@ -168,6 +175,13 @@
     {
         m_session = session;
         assertObjectIsDeletedWhenTestFinishes(G_OBJECT(m_session));
+        g_assert(!webkit_automation_session_get_application_info(session));
+        WebKitApplicationInfo* info = webkit_application_info_new();
+        webkit_application_info_set_name(info, "AutomationTestBrowser");
+        webkit_application_info_set_version(info, WEBKIT_MAJOR_VERSION, WEBKIT_MINOR_VERSION, WEBKIT_MICRO_VERSION);
+        webkit_automation_session_set_application_info(session, info);
+        webkit_application_info_unref(info);
+        g_assert(webkit_automation_session_get_application_info(session) == info);
     }
 
     static void automationStartedCallback(WebKitWebContext* webContext, WebKitAutomationSession* session, AutomationTest* test)
@@ -181,7 +195,22 @@
     {
         auto signalID = g_signal_connect(m_webContext.get(), "automation-started", G_CALLBACK(automationStartedCallback), this);
         g_dbus_connection_call(m_connection.get(), nullptr, "/org/webkit/Inspector", "org.webkit.Inspector",
-            "StartAutomationSession", g_variant_new("(s)", sessionID), nullptr, G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, nullptr, nullptr, nullptr);
+            "StartAutomationSession", g_variant_new("(s)", sessionID), nullptr, G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, nullptr,
+            [](GObject* source, GAsyncResult* result, gpointer userData) {
+                auto* test = static_cast<AutomationTest*>(userData);
+                if (!test->m_session)
+                    return;
+
+                GRefPtr<GVariant> capabilities = adoptGRef(g_dbus_connection_call_finish(G_DBUS_CONNECTION(source), result, nullptr));
+                g_assert(capabilities.get());
+                const char* browserName;
+                const char* browserVersion;
+                g_variant_get(capabilities.get(), "(&s&s)", &browserName, &browserVersion);
+                g_assert_cmpstr(browserName, ==, "AutomationTestBrowser");
+                GUniquePtr<char> versionString(g_strdup_printf("%u.%u.%u", WEBKIT_MAJOR_VERSION, WEBKIT_MINOR_VERSION, WEBKIT_MICRO_VERSION));
+                g_assert_cmpstr(browserVersion, ==, versionString.get());
+            }, this
+        );
         auto timeoutID = g_timeout_add(1000, [](gpointer userData) -> gboolean {
             g_main_loop_quit(static_cast<GMainLoop*>(userData));
             return G_SOURCE_REMOVE;
@@ -278,11 +307,34 @@
     webkit_web_context_set_automation_allowed(test->m_webContext.get(), FALSE);
 }
 
+static void testAutomationSessionApplicationInfo(Test* test, gconstpointer)
+{
+    WebKitApplicationInfo* info = webkit_application_info_new();
+    g_assert_cmpstr(webkit_application_info_get_name(info), ==, g_get_prgname());
+    webkit_application_info_set_name(info, "WebKitGTKBrowser");
+    g_assert_cmpstr(webkit_application_info_get_name(info), ==, "WebKitGTKBrowser");
+    webkit_application_info_set_name(info, nullptr);
+    g_assert_cmpstr(webkit_application_info_get_name(info), ==, g_get_prgname());
+
+    guint64 major, minor, micro;
+    webkit_application_info_get_version(info, &major, nullptr, nullptr);
+    g_assert_cmpuint(major, ==, 0);
+    webkit_application_info_set_version(info, 1, 2, 3);
+    webkit_application_info_get_version(info, &major, &minor, &micro);
+    g_assert_cmpuint(major, ==, 1);
+    g_assert_cmpuint(minor, ==, 2);
+    g_assert_cmpuint(micro, ==, 3);
+
+    webkit_application_info_unref(info);
+}
+
+
 void beforeAll()
 {
     g_setenv("WEBKIT_INSPECTOR_SERVER", "127.0.0.1:2229", TRUE);
 
     AutomationTest::add("WebKitAutomationSession", "request-session", testAutomationSessionRequestSession);
+    Test::add("WebKitAutomationSession", "application-info", testAutomationSessionApplicationInfo);
 }
 
 void afterAll()
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to