Changeset 220329 in webkit


Ignore:
Timestamp:
Aug 6, 2017 11:06:34 PM (7 years ago)
Author:
Carlos Garcia Campos
Message:

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

Source/JavaScriptCore:

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):

Location:
trunk
Files:
3 added
24 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r220324 r220329  
     12017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK][WPE] Add API to provide browser information required by automation
     4        https://bugs.webkit.org/show_bug.cgi?id=175130
     5
     6        Reviewed by Brian Burg.
     7
     8        Add browserName and browserVersion to RemoteInspector::Client::Capabilities and virtual methods to the Client to
     9        get them.
     10
     11        * inspector/remote/RemoteInspector.cpp:
     12        (Inspector::RemoteInspector::updateClientCapabilities): Update also browserName and browserVersion.
     13        * inspector/remote/RemoteInspector.h:
     14        * inspector/remote/glib/RemoteInspectorGlib.cpp:
     15        (Inspector::RemoteInspector::requestAutomationSession): Call updateClientCapabilities() after the session is
     16        requested to ensure they are updated before StartAutomationSession reply is sent.
     17        * inspector/remote/glib/RemoteInspectorServer.cpp: Add browserName and browserVersion as return values of
     18        StartAutomationSession mesasage.
     19
    1202017-08-06  Yusuke Suzuki  <utatane.tea@gmail.com>
    221
  • trunk/Source/JavaScriptCore/inspector/remote/RemoteInspector.cpp

    r216243 r220329  
    134134    else {
    135135        RemoteInspector::Client::Capabilities updatedCapabilities = {
    136             m_client->remoteAutomationAllowed() // remoteAutomationAllowed
     136            m_client->remoteAutomationAllowed(),
     137            m_client->browserName(),
     138            m_client->browserVersion()
    137139        };
    138140
  • trunk/Source/JavaScriptCore/inspector/remote/RemoteInspector.h

    r216243 r220329  
    3131#include <wtf/HashMap.h>
    3232#include <wtf/Lock.h>
     33#include <wtf/text/WTFString.h>
    3334
    3435#if PLATFORM(COCOA)
     
    6768        struct Capabilities {
    6869            bool remoteAutomationAllowed : 1;
     70            String browserName;
     71            String browserVersion;
    6972        };
    7073
    7174        virtual ~Client() { }
    7275        virtual bool remoteAutomationAllowed() const = 0;
     76        virtual String browserName() const { return { }; }
     77        virtual String browserVersion() const { return { }; }
    7378        virtual void requestAutomationSession(const String& sessionIdentifier) = 0;
    7479    };
     
    8691    void setClient(RemoteInspector::Client*);
    8792    void clientCapabilitiesDidChange();
     93    std::optional<RemoteInspector::Client::Capabilities> clientCapabilities() const { return m_clientCapabilities; }
    8894
    8995    void setupFailed(unsigned targetIdentifier);
  • trunk/Source/JavaScriptCore/inspector/remote/glib/RemoteInspectorGlib.cpp

    r217831 r220329  
    356356
    357357    m_client->requestAutomationSession(String::fromUTF8(sessionID));
     358    updateClientCapabilities();
    358359}
    359360
  • trunk/Source/JavaScriptCore/inspector/remote/glib/RemoteInspectorServer.cpp

    r217831 r220329  
    8080    "    <method name='StartAutomationSession'>"
    8181    "      <arg type='s' name='sessionID' direction='in'/>"
     82    "      <arg type='s' name='browserName' direction='out'/>"
     83    "      <arg type='s' name='browserVersion' direction='out'/>"
    8284    "    </method>"
    8385    "  </interface>"
     
    122124            g_variant_get(parameters, "(&s)", &sessionID);
    123125            inspectorServer->startAutomationSession(connection, sessionID);
    124             g_dbus_method_invocation_return_value(invocation, nullptr);
     126            auto capabilities = RemoteInspector::singleton().clientCapabilities();
     127            g_dbus_method_invocation_return_value(invocation, g_variant_new("(ss)",
     128                capabilities ? capabilities->browserName.utf8().data() : "",
     129                capabilities ? capabilities->browserVersion.utf8().data() : ""));
    125130        } else
    126131            g_dbus_method_invocation_return_value(invocation, nullptr);
  • trunk/Source/WebDriver/ChangeLog

    r220317 r220329  
     12017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK][WPE] Add API to provide browser information required by automation
     4        https://bugs.webkit.org/show_bug.cgi?id=175130
     5
     6        Reviewed by Brian Burg.
     7
     8        * Session.cpp:
     9        (WebDriver::Session::createTopLevelBrowsingContext): Check if startAutomationSession and complete the command
     10        with error in that case.
     11        * SessionHost.h:
     12        * glib/SessionHostGlib.cpp:
     13        (WebDriver::SessionHost::matchCapabilities): Match the capabilities that are known only after the browser has
     14        been launched.
     15        (WebDriver::SessionHost::startAutomationSession): Handle the StartAutomationSession response, extracting the
     16        capabilities and calling matchCapabilities() to match them.
     17        (WebDriver::SessionHost::setTargetList): Return early if the session was rejected before due to invalid
     18        capabilities.
     19
    1202017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
    221
  • trunk/Source/WebDriver/Session.cpp

    r220317 r220329  
    123123{
    124124    ASSERT(!m_toplevelBrowsingContext.value());
    125     m_host->startAutomationSession(m_id, [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)]() mutable {
     125    m_host->startAutomationSession(m_id, [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](std::optional<String> errorMessage) mutable {
     126        if (errorMessage) {
     127            completionHandler(CommandResult::fail(CommandResult::ErrorCode::UnknownError, errorMessage.value()));
     128            return;
     129        }
    126130        m_host->sendCommandToBackend(ASCIILiteral("createBrowsingContext"), nullptr, [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) mutable {
    127131            if (response.isError || !response.responseObject) {
  • trunk/Source/WebDriver/SessionHost.h

    r219605 r220329  
    5757    enum class Succeeded { No, Yes };
    5858    void connectToBrowser(Function<void (Succeeded)>&&);
    59     void startAutomationSession(const String& sessionID, Function<void ()>&&);
     59    void startAutomationSession(const String& sessionID, Function<void (std::optional<String>)>&&);
    6060
    6161    struct CommandResponse {
     
    8181    void launchBrowser(Function<void (Succeeded)>&&);
    8282    void connectToBrowser(std::unique_ptr<ConnectToBrowserAsyncData>&&);
     83    std::optional<String> matchCapabilities(GVariant*);
    8384    void setupConnection(GRefPtr<GDBusConnection>&&, Function<void (Succeeded)>&&);
    8485    void setTargetList(uint64_t connectionID, Vector<Target>&&);
     
    9596
    9697#if USE(GLIB)
    97     Function<void ()> m_startSessionCompletionHandler;
     98    Function<void (std::optional<String>)> m_startSessionCompletionHandler;
    9899    GRefPtr<GSubprocess> m_browser;
    99100    GRefPtr<GDBusConnection> m_dbusConnection;
  • trunk/Source/WebDriver/glib/SessionHostGlib.cpp

    r220315 r220329  
    2727#include "SessionHost.h"
    2828
     29#include "WebDriverService.h"
    2930#include <gio/gio.h>
    3031#include <wtf/RunLoop.h>
     
    221222}
    222223
    223 void SessionHost::startAutomationSession(const String& sessionID, Function<void ()>&& completionHandler)
     224std::optional<String> SessionHost::matchCapabilities(GVariant* capabilities)
     225{
     226    const char* browserName;
     227    const char* browserVersion;
     228    g_variant_get(capabilities, "(&s&s)", &browserName, &browserVersion);
     229
     230    if (m_capabilities.browserName) {
     231        if (m_capabilities.browserName.value() != browserName)
     232            return makeString("expected browserName ", m_capabilities.browserName.value(), " but got ", browserName);
     233    } else
     234        m_capabilities.browserName = String(browserName);
     235
     236    if (m_capabilities.browserVersion) {
     237        if (!WebDriverService::platformCompareBrowserVersions(m_capabilities.browserVersion.value(), browserVersion))
     238            return makeString("requested browserVersion is ", m_capabilities.browserVersion.value(), " but actual version is ", browserVersion);
     239    } else
     240        m_capabilities.browserVersion = String(browserVersion);
     241
     242    return std::nullopt;
     243}
     244
     245void SessionHost::startAutomationSession(const String& sessionID, Function<void (std::optional<String>)>&& completionHandler)
    224246{
    225247    ASSERT(m_dbusConnection);
    226248    ASSERT(!m_startSessionCompletionHandler);
    227     // FIXME: Make StartAutomationSession return browser information and we use it to match capabilities.
    228249    m_startSessionCompletionHandler = WTFMove(completionHandler);
    229250    g_dbus_connection_call(m_dbusConnection.get(), nullptr,
     
    233254        g_variant_new("(s)", sessionID.utf8().data()),
    234255        nullptr, G_DBUS_CALL_FLAGS_NO_AUTO_START,
    235         -1, m_cancellable.get(), dbusConnectionCallAsyncReadyCallback, nullptr);
     256        -1, m_cancellable.get(), [](GObject* source, GAsyncResult* result, gpointer userData) {
     257            GUniqueOutPtr<GError> error;
     258            GRefPtr<GVariant> resultVariant = adoptGRef(g_dbus_connection_call_finish(G_DBUS_CONNECTION(source), result, &error.outPtr()));
     259            if (!resultVariant && g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED))
     260                return;
     261
     262            auto sessionHost = static_cast<SessionHost*>(userData);
     263            if (!resultVariant) {
     264                auto completionHandler = std::exchange(sessionHost->m_startSessionCompletionHandler, nullptr);
     265                completionHandler(String("Failed to start automation session"));
     266                return;
     267            }
     268
     269            auto errorString = sessionHost->matchCapabilities(resultVariant.get());
     270            if (errorString) {
     271                auto completionHandler = std::exchange(sessionHost->m_startSessionCompletionHandler, nullptr);
     272                completionHandler(errorString);
     273                return;
     274            }
     275        }, this
     276    );
    236277}
    237278
     
    253294    if (m_connectionID) {
    254295        ASSERT(m_connectionID == connectionID);
     296        return;
     297    }
     298
     299    if (!m_startSessionCompletionHandler) {
     300        // Session creation was already rejected.
    255301        return;
    256302    }
     
    266312
    267313    auto startSessionCompletionHandler = std::exchange(m_startSessionCompletionHandler, nullptr);
    268     startSessionCompletionHandler();
     314    startSessionCompletionHandler(std::nullopt);
    269315}
    270316
  • trunk/Source/WebKit/ChangeLog

    r220326 r220329  
     12017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK][WPE] Add API to provide browser information required by automation
     4        https://bugs.webkit.org/show_bug.cgi?id=175130
     5
     6        Reviewed by Michael Catanzaro.
     7
     8        When a new automation session is started, the web driver receives some required capabilities from the client,
     9        like browser name and version. The session should be rejected if those required capabilities don't match with
     10        the actual browser that is launched. We don't know that information in WebKit, so we need to add API so that
     11        users can provide it when a new session request is made. This patch adds boxed object WebKitApplicationInfo that
     12        can be used to set the application name and version. This object can be set to a WebKitAutomationSession when
     13        WebKitWebContext::automation-started signal is emitted.
     14
     15        * PlatformGTK.cmake:
     16        * PlatformWPE.cmake:
     17        * UIProcess/API/glib/WebKitApplicationInfo.cpp: Added.
     18        (webkit_application_info_new):
     19        (webkit_application_info_ref):
     20        (webkit_application_info_unref):
     21        (webkit_application_info_set_name):
     22        (webkit_application_info_get_name):
     23        (webkit_application_info_set_version):
     24        (webkit_application_info_get_version):
     25        * UIProcess/API/glib/WebKitAutomationSession.cpp:
     26        (webkitAutomationSessionDispose):
     27        (webkit_automation_session_class_init):
     28        (webkitAutomationSessionGetBrowserName):
     29        (webkitAutomationSessionGetBrowserVersion):
     30        (webkit_automation_session_set_application_info):
     31        (webkit_automation_session_get_application_info):
     32        * UIProcess/API/glib/WebKitAutomationSessionPrivate.h:
     33        * UIProcess/API/glib/WebKitWebContext.cpp:
     34        * UIProcess/API/gtk/WebKitApplicationInfo.h: Added.
     35        * UIProcess/API/gtk/WebKitAutomationSession.h:
     36        * UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt:
     37        * UIProcess/API/gtk/docs/webkit2gtk-docs.sgml:
     38        * UIProcess/API/gtk/webkit2.h:
     39        * UIProcess/API/wpe/WebKitApplicationInfo.h: Added.
     40        * UIProcess/API/wpe/WebKitAutomationSession.h:
     41        * UIProcess/API/wpe/webkit.h:
     42
    1432017-08-06  Carlos Alberto Lopez Perez  <clopez@igalia.com>
    244
  • trunk/Source/WebKit/PlatformGTK.cmake

    r220094 r220329  
    118118
    119119    UIProcess/API/glib/IconDatabase.cpp
     120    UIProcess/API/glib/WebKitApplicationInfo.cpp
    120121    UIProcess/API/glib/WebKitAuthenticationRequest.cpp
    121122    UIProcess/API/glib/WebKitAutomationSession.cpp
     
    418419    ${DERIVED_SOURCES_WEBKIT2GTK_API_DIR}/WebKitEnumTypes.h
    419420    ${DERIVED_SOURCES_WEBKIT2GTK_API_DIR}/WebKitVersion.h
     421    ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitApplicationInfo.h
    420422    ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitAuthenticationRequest.h
    421423    ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitAutocleanups.h
  • trunk/Source/WebKit/PlatformWPE.cmake

    r220094 r220329  
    133133
    134134    UIProcess/API/glib/IconDatabase.cpp
     135    UIProcess/API/glib/WebKitApplicationInfo.cpp
    135136    UIProcess/API/glib/WebKitAuthenticationRequest.cpp
    136137    UIProcess/API/glib/WebKitAutomationSession.cpp
     
    276277set(WPE_API_INSTALLED_HEADERS
    277278    ${DERIVED_SOURCES_WPE_API_DIR}/WebKitEnumTypes.h
     279    ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitApplicationInfo.h
    278280    ${WEBKIT2_DIR}/UIProcess/API/wpe/WebKitAuthenticationRequest.h
    279281    ${WEBKIT2_DIR}/UIProcess/API/wpe/WebKitAutomationSession.h
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitAutomationSession.cpp

    r218487 r220329  
    2222
    2323#include "APIAutomationSessionClient.h"
     24#include "WebKitApplicationInfo.h"
    2425#include "WebKitAutomationSessionPrivate.h"
    2526#include "WebKitWebViewPrivate.h"
     
    5960struct _WebKitAutomationSessionPrivate {
    6061    RefPtr<WebAutomationSession> session;
     62    WebKitApplicationInfo* applicationInfo;
    6163    CString id;
    6264};
     
    129131}
    130132
     133static void webkitAutomationSessionDispose(GObject* object)
     134{
     135    WebKitAutomationSession* session = WEBKIT_AUTOMATION_SESSION(object);
     136
     137    if (session->priv->applicationInfo) {
     138        webkit_application_info_unref(session->priv->applicationInfo);
     139        session->priv->applicationInfo = nullptr;
     140    }
     141
     142    G_OBJECT_CLASS(webkit_automation_session_parent_class)->dispose(object);
     143}
     144
    131145static void webkit_automation_session_class_init(WebKitAutomationSessionClass* sessionClass)
    132146{
     
    135149    gObjectClass->set_property = webkitAutomationSessionSetProperty;
    136150    gObjectClass->constructed = webkitAutomationSessionConstructed;
     151    gObjectClass->dispose = webkitAutomationSessionDispose;
    137152
    138153    /**
     
    188203}
    189204
     205String webkitAutomationSessionGetBrowserName(WebKitAutomationSession* session)
     206{
     207    if (session->priv->applicationInfo)
     208        return String::fromUTF8(webkit_application_info_get_name(session->priv->applicationInfo));
     209
     210    return g_get_prgname();
     211}
     212
     213String webkitAutomationSessionGetBrowserVersion(WebKitAutomationSession* session)
     214{
     215    if (!session->priv->applicationInfo)
     216        return { };
     217
     218    guint64 major, minor, micro;
     219    webkit_application_info_get_version(session->priv->applicationInfo, &major, &minor, &micro);
     220
     221    if (!micro && !minor)
     222        return String::number(major);
     223
     224    if (!micro)
     225        return makeString(String::number(major), ".", String::number(minor));
     226
     227    return makeString(String::number(major), ".", String::number(minor), ".", String::number(micro));
     228}
     229
    190230/**
    191231 * webkit_automation_session_get_id:
     
    203243    return session->priv->id.data();
    204244}
     245
     246/**
     247 * webkit_automation_session_set_application_info:
     248 * @session: a #WebKitAutomationSession
     249 * @info: a #WebKitApplicationInfo
     250 *
     251 * Set the application information to @session. This information will be used by the driver service
     252 * to match the requested capabilities with the actual application information. If this information
     253 * is not provided to the session when a new automation session is requested, the creation might fail
     254 * if the client requested a specific browser name or version. This will not have any effect when called
     255 * after the automation session has been fully created, so this must be called in the callback of
     256 * #WebKitWebContext::automation-started signal.
     257 *
     258 * Since: 2.18
     259 */
     260void webkit_automation_session_set_application_info(WebKitAutomationSession* session, WebKitApplicationInfo* info)
     261{
     262    g_return_if_fail(WEBKIT_IS_AUTOMATION_SESSION(session));
     263    g_return_if_fail(info);
     264
     265    if (session->priv->applicationInfo == info)
     266        return;
     267
     268    if (session->priv->applicationInfo)
     269        webkit_application_info_unref(session->priv->applicationInfo);
     270    session->priv->applicationInfo = webkit_application_info_ref(info);
     271}
     272
     273/**
     274 * webkit_automation_session_get_application_info:
     275 * @session: a #WebKitAutomationSession
     276 *
     277 * Get the #WebKitAutomationSession previously set with webkit_automation_session_set_application_info().
     278 *
     279 * Returns: (transfer none): the #WebKitAutomationSession of @session, or %NULL if no one has been set.
     280 *
     281 * Since: 2.18
     282 */
     283WebKitApplicationInfo* webkit_automation_session_get_application_info(WebKitAutomationSession* session)
     284{
     285    g_return_val_if_fail(WEBKIT_IS_AUTOMATION_SESSION(session), nullptr);
     286
     287    return session->priv->applicationInfo;
     288}
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitAutomationSessionPrivate.h

    r218487 r220329  
    2525WebKitAutomationSession* webkitAutomationSessionCreate(const char* sessionID);
    2626WebKit::WebAutomationSession& webkitAutomationSessionGetSession(WebKitAutomationSession*);
     27String webkitAutomationSessionGetBrowserName(WebKitAutomationSession*);
     28String webkitAutomationSessionGetBrowserVersion(WebKitAutomationSession*);
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitWebContext.cpp

    r219796 r220329  
    215215    bool remoteAutomationAllowed() const override { return true; }
    216216
     217    String browserName() const override
     218    {
     219        if (!m_webContext->priv->automationSession)
     220            return { };
     221
     222        return webkitAutomationSessionGetBrowserName(m_webContext->priv->automationSession.get());
     223    }
     224
     225    String browserVersion() const override
     226    {
     227        if (!m_webContext->priv->automationSession)
     228            return { };
     229
     230        return webkitAutomationSessionGetBrowserVersion(m_webContext->priv->automationSession.get());
     231    }
     232
    217233    void requestAutomationSession(const String& sessionIdentifier) override
    218234    {
    219235        ASSERT(!m_webContext->priv->automationSession);
    220236        m_webContext->priv->automationSession = adoptGRef(webkitAutomationSessionCreate(sessionIdentifier.utf8().data()));
     237        g_signal_emit(m_webContext, signals[AUTOMATION_STARTED], 0, m_webContext->priv->automationSession.get());
    221238        m_webContext->priv->processPool->setAutomationSession(&webkitAutomationSessionGetSession(m_webContext->priv->automationSession.get()));
    222         g_signal_emit(m_webContext, signals[AUTOMATION_STARTED], 0, m_webContext->priv->automationSession.get());
    223239    }
    224240
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitAutomationSession.h

    r216006 r220329  
    2626
    2727#include <glib-object.h>
     28#include <webkit2/WebKitApplicationInfo.h>
    2829#include <webkit2/WebKitDefines.h>
    2930
     
    5758
    5859WEBKIT_API GType
    59 webkit_automation_session_get_type (void);
     60webkit_automation_session_get_type             (void);
    6061
    6162WEBKIT_API const char *
    62 webkit_automation_session_get_id   (WebKitAutomationSession *session);
     63webkit_automation_session_get_id               (WebKitAutomationSession *session);
     64
     65WEBKIT_API void
     66webkit_automation_session_set_application_info (WebKitAutomationSession *session,
     67                                                WebKitApplicationInfo   *info);
     68
     69WEBKIT_API WebKitApplicationInfo *
     70webkit_automation_session_get_application_info (WebKitAutomationSession *session);
    6371
    6472G_END_DECLS
  • trunk/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt

    r218325 r220329  
    13591359WebKitAutomationSession
    13601360webkit_automation_session_get_id
     1361webkit_automation_session_set_application_info
     1362webkit_automation_session_get_application_info
    13611363
    13621364<SUBSECTION Private>
     
    13721374WEBKIT_IS_AUTOMATION_SESSION_CLASS
    13731375WEBKIT_AUTOMATION_SESSION_GET_CLASS
     1376</SECTION>
     1377
     1378<SECTION>
     1379<FILE>WebKitApplicationInfo</FILE>
     1380WebKitApplicationInfo
     1381webkit_application_info_new
     1382webkit_application_info_ref
     1383webkit_application_info_unref
     1384webkit_application_info_set_name
     1385webkit_application_info_get_name
     1386webkit_application_info_set_version
     1387webkit_application_info_get_version
     1388
     1389<SUBSECTION Private>
     1390webkit_application_info_get_type
     1391
     1392<SUBSECTION Standard>
     1393WEBKIT_TYPE_APPLICATION_INFO
    13741394</SECTION>
    13751395
  • trunk/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-docs.sgml

    r218325 r220329  
    6060    <xi:include href="xml/WebKitNetworkProxySettings.xml"/>
    6161    <xi:include href="xml/WebKitAutomationSession.xml"/>
     62    <xi:include href="xml/WebKitApplicationInfo.xml"/>
    6263  </chapter>
    6364
  • trunk/Source/WebKit/UIProcess/API/gtk/webkit2.h

    r218325 r220329  
    2828#define __WEBKIT2_H_INSIDE__
    2929
     30#include <webkit2/WebKitApplicationInfo.h>
    3031#include <webkit2/WebKitAuthenticationRequest.h>
    3132#include <webkit2/WebKitAutomationSession.h>
  • trunk/Source/WebKit/UIProcess/API/wpe/WebKitAutomationSession.h

    r218553 r220329  
    2626
    2727#include <glib-object.h>
     28#include <wpe/WebKitApplicationInfo.h>
    2829#include <wpe/WebKitDefines.h>
    2930
     
    5758
    5859WEBKIT_API GType
    59 webkit_automation_session_get_type (void);
     60webkit_automation_session_get_type             (void);
    6061
    6162WEBKIT_API const char *
    62 webkit_automation_session_get_id   (WebKitAutomationSession *session);
     63webkit_automation_session_get_id               (WebKitAutomationSession *session);
     64
     65WEBKIT_API void
     66webkit_automation_session_set_application_info (WebKitAutomationSession *session,
     67                                                WebKitApplicationInfo   *info);
     68
     69WEBKIT_API WebKitApplicationInfo *
     70webkit_automation_session_get_application_info (WebKitAutomationSession *session);
    6371
    6472G_END_DECLS
  • trunk/Source/WebKit/UIProcess/API/wpe/webkit.h

    r218553 r220329  
    2828#define __WEBKIT_H_INSIDE__
    2929
     30#include <wpe/WebKitApplicationInfo.h>
    3031#include <wpe/WebKitAuthenticationRequest.h>
    3132#include <wpe/WebKitAutomationSession.h>
  • trunk/Tools/ChangeLog

    r220328 r220329  
     12017-08-05  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK][WPE] Add API to provide browser information required by automation
     4        https://bugs.webkit.org/show_bug.cgi?id=175130
     5
     6        Reviewed by Michael Catanzaro.
     7
     8        * MiniBrowser/gtk/main.c:
     9        (automationStartedCallback): Set browser information when a new automation session is started.
     10        * TestWebKitAPI/Tests/WebKitGLib/TestAutomationSession.cpp:
     11        (testAutomationSessionApplicationInfo):
     12        (beforeAll):
     13
    1142017-08-06  Ryan Haddad  <ryanhaddad@apple.com>
    215
  • trunk/Tools/MiniBrowser/gtk/main.c

    r216006 r220329  
    459459static void automationStartedCallback(WebKitWebContext *webContext, WebKitAutomationSession *session)
    460460{
     461    WebKitApplicationInfo *info = webkit_application_info_new();
     462    webkit_application_info_set_version(info, WEBKIT_MAJOR_VERSION, WEBKIT_MINOR_VERSION, WEBKIT_MICRO_VERSION);
     463    webkit_automation_session_set_application_info(session, info);
     464    webkit_application_info_unref(info);
     465
    461466    g_signal_connect(session, "create-web-view", G_CALLBACK(createWebViewForAutomationCallback), NULL);
    462467}
  • trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestAutomationSession.cpp

    r218686 r220329  
    2424#include <wtf/UUID.h>
    2525#include <wtf/text/StringBuilder.h>
     26
     27// FIXME: WPE doesn't expose WebKitVersion yet, the numbers defined here don't really matter.
     28#if PLATFORM(WPE)
     29#define WEBKIT_MAJOR_VERSION 1
     30#define WEBKIT_MINOR_VERSION 2
     31#define WEBKIT_MICRO_VERSION 3
     32#endif
    2633
    2734class AutomationTest: public Test {
     
    169176        m_session = session;
    170177        assertObjectIsDeletedWhenTestFinishes(G_OBJECT(m_session));
     178        g_assert(!webkit_automation_session_get_application_info(session));
     179        WebKitApplicationInfo* info = webkit_application_info_new();
     180        webkit_application_info_set_name(info, "AutomationTestBrowser");
     181        webkit_application_info_set_version(info, WEBKIT_MAJOR_VERSION, WEBKIT_MINOR_VERSION, WEBKIT_MICRO_VERSION);
     182        webkit_automation_session_set_application_info(session, info);
     183        webkit_application_info_unref(info);
     184        g_assert(webkit_automation_session_get_application_info(session) == info);
    171185    }
    172186
     
    182196        auto signalID = g_signal_connect(m_webContext.get(), "automation-started", G_CALLBACK(automationStartedCallback), this);
    183197        g_dbus_connection_call(m_connection.get(), nullptr, "/org/webkit/Inspector", "org.webkit.Inspector",
    184             "StartAutomationSession", g_variant_new("(s)", sessionID), nullptr, G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, nullptr, nullptr, nullptr);
     198            "StartAutomationSession", g_variant_new("(s)", sessionID), nullptr, G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, nullptr,
     199            [](GObject* source, GAsyncResult* result, gpointer userData) {
     200                auto* test = static_cast<AutomationTest*>(userData);
     201                if (!test->m_session)
     202                    return;
     203
     204                GRefPtr<GVariant> capabilities = adoptGRef(g_dbus_connection_call_finish(G_DBUS_CONNECTION(source), result, nullptr));
     205                g_assert(capabilities.get());
     206                const char* browserName;
     207                const char* browserVersion;
     208                g_variant_get(capabilities.get(), "(&s&s)", &browserName, &browserVersion);
     209                g_assert_cmpstr(browserName, ==, "AutomationTestBrowser");
     210                GUniquePtr<char> versionString(g_strdup_printf("%u.%u.%u", WEBKIT_MAJOR_VERSION, WEBKIT_MINOR_VERSION, WEBKIT_MICRO_VERSION));
     211                g_assert_cmpstr(browserVersion, ==, versionString.get());
     212            }, this
     213        );
    185214        auto timeoutID = g_timeout_add(1000, [](gpointer userData) -> gboolean {
    186215            g_main_loop_quit(static_cast<GMainLoop*>(userData));
     
    279308}
    280309
     310static void testAutomationSessionApplicationInfo(Test* test, gconstpointer)
     311{
     312    WebKitApplicationInfo* info = webkit_application_info_new();
     313    g_assert_cmpstr(webkit_application_info_get_name(info), ==, g_get_prgname());
     314    webkit_application_info_set_name(info, "WebKitGTKBrowser");
     315    g_assert_cmpstr(webkit_application_info_get_name(info), ==, "WebKitGTKBrowser");
     316    webkit_application_info_set_name(info, nullptr);
     317    g_assert_cmpstr(webkit_application_info_get_name(info), ==, g_get_prgname());
     318
     319    guint64 major, minor, micro;
     320    webkit_application_info_get_version(info, &major, nullptr, nullptr);
     321    g_assert_cmpuint(major, ==, 0);
     322    webkit_application_info_set_version(info, 1, 2, 3);
     323    webkit_application_info_get_version(info, &major, &minor, &micro);
     324    g_assert_cmpuint(major, ==, 1);
     325    g_assert_cmpuint(minor, ==, 2);
     326    g_assert_cmpuint(micro, ==, 3);
     327
     328    webkit_application_info_unref(info);
     329}
     330
     331
    281332void beforeAll()
    282333{
     
    284335
    285336    AutomationTest::add("WebKitAutomationSession", "request-session", testAutomationSessionRequestSession);
     337    Test::add("WebKitAutomationSession", "application-info", testAutomationSessionApplicationInfo);
    286338}
    287339
Note: See TracChangeset for help on using the changeset viewer.