Title: [225044] trunk
Revision
225044
Author
[email protected]
Date
2017-11-20 00:16:26 -0800 (Mon, 20 Nov 2017)

Log Message

[WPE] webkit_web_view_new() should enable specifying wpe_view_backend object
https://bugs.webkit.org/show_bug.cgi?id=178655

Reviewed by Michael Catanzaro.

Source/WebKit:

Update all WebKitWebView constructors to receive a WebKitWebViewBackend as argument. It's now required to
provide a backend to create a web view, but it can be NULL to use the default one. WebKitWebViewBackend is a
boxed type wrapping a struct wpe_view_backend* used as construct only property of WebKitWebView. The view always
takes the ownership of the WebKitWebViewBackend which owns the struct wpe_view_backend*. An optional
GDestroyNotify and user data pointer can be passed to the WebKitWebViewBackend constructor to provide a custom
deleter for the backend. In the C API the struct wpe_view_backend* is also mandatory now, but it can't be NULL
and it's owned by the caller, not the view.

* PlatformWPE.cmake:
* UIProcess/API/C/wpe/WKView.cpp:
(WKViewCreate):
* UIProcess/API/C/wpe/WKView.h:
* UIProcess/API/glib/WebKitWebView.cpp:
(_WebKitWebViewPrivate::~_WebKitWebViewPrivate):
(webkitWebViewConstructed):
(webkitWebViewSetProperty):
(webkitWebViewGetProperty):
(webkit_web_view_class_init):
(webkitWebViewCreatePage):
(webkit_web_view_get_backend):
* UIProcess/API/wpe/WPEView.cpp:
(WKWPE::m_backend):
(WKWPE::View::~View):
* UIProcess/API/wpe/WebKitWebView.h:
* UIProcess/API/wpe/WebKitWebViewBackend.cpp: Added.
(_WebKitWebViewBackend::_WebKitWebViewBackend):
(_WebKitWebViewBackend::~_WebKitWebViewBackend):
(webkitWebViewBackendRef):
(webkitWebViewBackendUnref):
(webkitWebViewBackendCreateDefault):
(webkit_web_view_backend_new):
(webkit_web_view_backend_get_wpe_backend):
* UIProcess/API/wpe/WebKitWebViewBackend.h: Added.
* UIProcess/API/wpe/WebKitWebViewBackendPrivate.h: Added.
* UIProcess/API/wpe/WebKitWebViewWPE.cpp:
(webkit_web_view_new):
(webkit_web_view_new_with_context):
(webkit_web_view_new_with_related_view):
(webkit_web_view_new_with_settings):
(webkit_web_view_new_with_user_content_manager):
* UIProcess/API/wpe/webkit.h:

Tools:

Update unit tests to create web views using helper methods that have a different implementation for GTK and
WPE. Also add a new test case to check the new API to create a WebKitWebView with a WPE backend. Use
WKViewCreate in WTR and fix a memory leak in HeadlessViewBackend.

* TestWebKitAPI/Tests/WebKitGLib/TestAutomationSession.cpp:
(testAutomationSessionRequestSession):
* TestWebKitAPI/Tests/WebKitGLib/TestBackForwardList.cpp:
(testWebKitWebViewSessionState):
(testWebKitWebViewSessionStateWithFormData):
(testWebKitWebViewNavigationAfterSessionRestore):
* TestWebKitAPI/Tests/WebKitGLib/TestMultiprocess.cpp:
* TestWebKitAPI/Tests/WebKitGLib/TestResources.cpp:
(testWebResourceGetDataError):
* TestWebKitAPI/Tests/WebKitGLib/TestUIClient.cpp:
* TestWebKitAPI/Tests/WebKitGLib/TestWebKitUserContentManager.cpp:
(testWebViewNewWithUserContentManager):
* TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp:
(testWebContextEphemeral):
* TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp:
(testWebViewWebContext):
(testWebViewWebContextLifetime):
(testWebViewWebBackend):
(testWebViewSettings):
(beforeAll):
* TestWebKitAPI/Tests/WebKitGLib/TestWebsiteData.cpp:
(testWebsiteDataEphemeral):
* TestWebKitAPI/glib/WebKitGLib/TestMain.h:
(Test::createWebView):
* WebKitTestRunner/wpe/HeadlessViewBackend.cpp:
(HeadlessViewBackend::~HeadlessViewBackend):
* WebKitTestRunner/wpe/PlatformWebViewWPE.cpp:
(WTR::PlatformWebView::PlatformWebView):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (225043 => 225044)


--- trunk/Source/WebKit/ChangeLog	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Source/WebKit/ChangeLog	2017-11-20 08:16:26 UTC (rev 225044)
@@ -1,5 +1,54 @@
 2017-11-20  Carlos Garcia Campos  <[email protected]>
 
+        [WPE] webkit_web_view_new() should enable specifying wpe_view_backend object
+        https://bugs.webkit.org/show_bug.cgi?id=178655
+
+        Reviewed by Michael Catanzaro.
+
+        Update all WebKitWebView constructors to receive a WebKitWebViewBackend as argument. It's now required to
+        provide a backend to create a web view, but it can be NULL to use the default one. WebKitWebViewBackend is a
+        boxed type wrapping a struct wpe_view_backend* used as construct only property of WebKitWebView. The view always
+        takes the ownership of the WebKitWebViewBackend which owns the struct wpe_view_backend*. An optional
+        GDestroyNotify and user data pointer can be passed to the WebKitWebViewBackend constructor to provide a custom
+        deleter for the backend. In the C API the struct wpe_view_backend* is also mandatory now, but it can't be NULL
+        and it's owned by the caller, not the view.
+
+        * PlatformWPE.cmake:
+        * UIProcess/API/C/wpe/WKView.cpp:
+        (WKViewCreate):
+        * UIProcess/API/C/wpe/WKView.h:
+        * UIProcess/API/glib/WebKitWebView.cpp:
+        (_WebKitWebViewPrivate::~_WebKitWebViewPrivate):
+        (webkitWebViewConstructed):
+        (webkitWebViewSetProperty):
+        (webkitWebViewGetProperty):
+        (webkit_web_view_class_init):
+        (webkitWebViewCreatePage):
+        (webkit_web_view_get_backend):
+        * UIProcess/API/wpe/WPEView.cpp:
+        (WKWPE::m_backend):
+        (WKWPE::View::~View):
+        * UIProcess/API/wpe/WebKitWebView.h:
+        * UIProcess/API/wpe/WebKitWebViewBackend.cpp: Added.
+        (_WebKitWebViewBackend::_WebKitWebViewBackend):
+        (_WebKitWebViewBackend::~_WebKitWebViewBackend):
+        (webkitWebViewBackendRef):
+        (webkitWebViewBackendUnref):
+        (webkitWebViewBackendCreateDefault):
+        (webkit_web_view_backend_new):
+        (webkit_web_view_backend_get_wpe_backend):
+        * UIProcess/API/wpe/WebKitWebViewBackend.h: Added.
+        * UIProcess/API/wpe/WebKitWebViewBackendPrivate.h: Added.
+        * UIProcess/API/wpe/WebKitWebViewWPE.cpp:
+        (webkit_web_view_new):
+        (webkit_web_view_new_with_context):
+        (webkit_web_view_new_with_related_view):
+        (webkit_web_view_new_with_settings):
+        (webkit_web_view_new_with_user_content_manager):
+        * UIProcess/API/wpe/webkit.h:
+
+2017-11-20  Carlos Garcia Campos  <[email protected]>
+
         [GTK][WPE] webkit_cookie_manager_delete_all_cookies doesn't delete the cookies if called before a web process is running
         https://bugs.webkit.org/show_bug.cgi?id=175265
 

Modified: trunk/Source/WebKit/PlatformWPE.cmake (225043 => 225044)


--- trunk/Source/WebKit/PlatformWPE.cmake	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Source/WebKit/PlatformWPE.cmake	2017-11-20 08:16:26 UTC (rev 225044)
@@ -202,6 +202,7 @@
     UIProcess/API/wpe/PageClientImpl.cpp
     UIProcess/API/wpe/ScrollGestureController.cpp
     UIProcess/API/wpe/WebKitScriptDialogWPE.cpp
+    UIProcess/API/wpe/WebKitWebViewBackend.cpp
     UIProcess/API/wpe/WebKitWebViewWPE.cpp
     UIProcess/API/wpe/WPEView.cpp
 
@@ -333,6 +334,7 @@
     ${WEBKIT_DIR}/UIProcess/API/wpe/WebKitWebContext.h
     ${WEBKIT_DIR}/UIProcess/API/wpe/WebKitWebResource.h
     ${WEBKIT_DIR}/UIProcess/API/wpe/WebKitWebView.h
+    ${WEBKIT_DIR}/UIProcess/API/wpe/WebKitWebViewBackend.h
     ${WEBKIT_DIR}/UIProcess/API/wpe/WebKitWebViewSessionState.h
     ${WEBKIT_DIR}/UIProcess/API/wpe/WebKitWebsiteData.h
     ${WEBKIT_DIR}/UIProcess/API/wpe/WebKitWebsiteDataManager.h

Modified: trunk/Source/WebKit/UIProcess/API/C/wpe/WKView.cpp (225043 => 225044)


--- trunk/Source/WebKit/UIProcess/API/C/wpe/WKView.cpp	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Source/WebKit/UIProcess/API/C/wpe/WKView.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -40,13 +40,8 @@
 };
 }
 
-WKViewRef WKViewCreate(WKPageConfigurationRef configuration)
+WKViewRef WKViewCreate(struct wpe_view_backend* backend, WKPageConfigurationRef configuration)
 {
-    return toAPI(WKWPE::View::create(nullptr, *toImpl(configuration)));
-}
-
-WKViewRef WKViewCreateWithViewBackend(struct wpe_view_backend* backend, WKPageConfigurationRef configuration)
-{
     return toAPI(WKWPE::View::create(backend, *toImpl(configuration)));
 }
 

Modified: trunk/Source/WebKit/UIProcess/API/C/wpe/WKView.h (225043 => 225044)


--- trunk/Source/WebKit/UIProcess/API/C/wpe/WKView.h	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Source/WebKit/UIProcess/API/C/wpe/WKView.h	2017-11-20 08:16:26 UTC (rev 225044)
@@ -35,8 +35,7 @@
 
 struct wpe_view_backend;
 
-WK_EXPORT WKViewRef WKViewCreate(WKPageConfigurationRef);
-WK_EXPORT WKViewRef WKViewCreateWithViewBackend(struct wpe_view_backend*, WKPageConfigurationRef);
+WK_EXPORT WKViewRef WKViewCreate(struct wpe_view_backend*, WKPageConfigurationRef);
 
 WK_EXPORT WKPageRef WKViewGetPage(WKViewRef);
 

Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp (225043 => 225044)


--- trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -84,6 +84,7 @@
 #if PLATFORM(WPE)
 #include "APIViewClient.h"
 #include "WPEView.h"
+#include "WebKitWebViewBackendPrivate.h"
 #endif
 
 #if USE(LIBNOTIFY)
@@ -161,6 +162,10 @@
 enum {
     PROP_0,
 
+#if PLATFORM(WPE)
+    PROP_BACKEND,
+#endif
+
     PROP_WEB_CONTEXT,
     PROP_RELATED_VIEW,
     PROP_SETTINGS,
@@ -192,9 +197,14 @@
         // For modal dialogs, make sure the main loop is stopped when finalizing the webView.
         if (modalLoop && g_main_loop_is_running(modalLoop.get()))
             g_main_loop_quit(modalLoop.get());
+#if PLATFORM(WPE)
+        view = nullptr;
+        webkitWebViewBackendUnref(backend);
+#endif
     }
 
 #if PLATFORM(WPE)
+    WebKitWebViewBackend* backend;
     std::unique_ptr<WKWPE::View> view;
 #endif
 
@@ -619,6 +629,10 @@
 
     WebKitWebView* webView = WEBKIT_WEB_VIEW(object);
     WebKitWebViewPrivate* priv = webView->priv;
+#if PLATFORM(WPE)
+    if (!priv->backend)
+        priv->backend = webkitWebViewBackendCreateDefault();
+#endif
     if (priv->relatedView) {
         priv->context = webkit_web_view_get_context(priv->relatedView);
         priv->isEphemeral = webkit_web_view_is_ephemeral(priv->relatedView);
@@ -673,6 +687,13 @@
     WebKitWebView* webView = WEBKIT_WEB_VIEW(object);
 
     switch (propId) {
+#if PLATFORM(WPE)
+    case PROP_BACKEND: {
+        gpointer backend = g_value_get_boxed(value);
+        webView->priv->backend = backend ? static_cast<WebKitWebViewBackend*>(backend) : nullptr;
+        break;
+    }
+#endif
     case PROP_WEB_CONTEXT: {
         gpointer webContext = g_value_get_object(value);
         webView->priv->context = webContext ? WEBKIT_WEB_CONTEXT(webContext) : nullptr;
@@ -715,6 +736,11 @@
     WebKitWebView* webView = WEBKIT_WEB_VIEW(object);
 
     switch (propId) {
+#if PLATFORM(WPE)
+    case PROP_BACKEND:
+        g_value_set_static_boxed(value, webView->priv->backend);
+        break;
+#endif
     case PROP_WEB_CONTEXT:
         g_value_set_object(value, webView->priv->context.get());
         break;
@@ -821,7 +847,26 @@
     webViewClass->authenticate = webkitWebViewAuthenticate;
     webViewClass->show_notification = webkitWebViewShowNotification;
 
+#if PLATFORM(WPE)
     /**
+     * WebKitWebView:backend:
+     *
+     * The #WebKitWebViewBackend of the view.
+     *
+     * since: 2.20
+     */
+    g_object_class_install_property(
+        gObjectClass,
+        PROP_BACKEND,
+        g_param_spec_boxed(
+            "backend",
+            _("Backend"),
+            _("The backend for the web view"),
+            WEBKIT_TYPE_WEB_VIEW_BACKEND,
+            static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+#endif
+
+    /**
      * WebKitWebView:web-context:
      *
      * The #WebKitWebContext of the view.
@@ -1915,7 +1960,7 @@
 #if PLATFORM(GTK)
     webkitWebViewBaseCreateWebPage(WEBKIT_WEB_VIEW_BASE(webView), WTFMove(configuration));
 #elif PLATFORM(WPE)
-    webView->priv->view.reset(WKWPE::View::create(nullptr, configuration.get()));
+    webView->priv->view.reset(WKWPE::View::create(webkit_web_view_backend_get_wpe_backend(webView->priv->backend), configuration.get()));
 #endif
 }
 
@@ -2347,7 +2392,26 @@
 }
 #endif
 
+#if PLATFORM(WPE)
 /**
+ * webkit_web_view_get_backend:
+ * @web_view: a #WebKitWebView
+ *
+ * Get the #WebKitWebViewBackend of @web_view
+ *
+ * Returns: (transfer none): the #WebKitWebViewBackend of @web_view
+ *
+ * Since: 2.20
+ */
+WebKitWebViewBackend* webkit_web_view_get_backend(WebKitWebView* webView)
+{
+    g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), nullptr);
+
+    return webView->priv->backend;
+}
+#endif
+
+/**
  * webkit_web_view_get_context:
  * @web_view: a #WebKitWebView
  *

Modified: trunk/Source/WebKit/UIProcess/API/wpe/WPEView.cpp (225043 => 225044)


--- trunk/Source/WebKit/UIProcess/API/wpe/WPEView.cpp	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Source/WebKit/UIProcess/API/wpe/WPEView.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -48,7 +48,10 @@
     , m_size { 800, 600 }
     , m_viewStateFlags(WebCore::ActivityState::WindowIsActive | WebCore::ActivityState::IsFocused | WebCore::ActivityState::IsVisible | WebCore::ActivityState::IsInWindow)
     , m_compositingManagerProxy(*this)
+    , m_backend(backend)
 {
+    ASSERT(m_backend);
+
     auto configuration = baseConfiguration.copy();
     auto* preferences = configuration->preferences();
     if (!preferences && configuration->pageGroup()) {
@@ -71,9 +74,6 @@
         pool->startMemorySampler(0);
 #endif
 
-    m_backend = backend;
-    if (!m_backend)
-        m_backend = wpe_view_backend_create();
     m_compositingManagerProxy.initialize();
 
     static struct wpe_view_backend_client s_backendClient = {
@@ -136,7 +136,6 @@
 View::~View()
 {
     m_compositingManagerProxy.finalize();
-    wpe_view_backend_destroy(m_backend);
 }
 
 void View::setClient(std::unique_ptr<API::ViewClient>&& client)

Modified: trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebView.h (225043 => 225044)


--- trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebView.h	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebView.h	2017-11-20 08:16:26 UTC (rev 225044)
@@ -49,6 +49,7 @@
 #include <wpe/WebKitUserContentManager.h>
 #include <wpe/WebKitWebContext.h>
 #include <wpe/WebKitWebResource.h>
+#include <wpe/WebKitWebViewBackend.h>
 #include <wpe/WebKitWebViewSessionState.h>
 #include <wpe/WebKitWindowProperties.h>
 
@@ -228,20 +229,27 @@
 webkit_web_view_get_type                             (void);
 
 WEBKIT_API WebKitWebView *
-webkit_web_view_new                                  (void);
+webkit_web_view_new                                  (WebKitWebViewBackend      *backend);
 
 WEBKIT_API WebKitWebView *
-webkit_web_view_new_with_context                     (WebKitWebContext          *context);
+webkit_web_view_new_with_context                     (WebKitWebViewBackend      *backend,
+                                                      WebKitWebContext          *context);
 
 WEBKIT_API WebKitWebView *
-webkit_web_view_new_with_settings                    (WebKitSettings            *settings);
+webkit_web_view_new_with_settings                    (WebKitWebViewBackend      *backend,
+                                                      WebKitSettings            *settings);
 
 WEBKIT_API WebKitWebView *
-webkit_web_view_new_with_related_view                (WebKitWebView             *web_view);
+webkit_web_view_new_with_related_view                (WebKitWebViewBackend      *backend,
+                                                      WebKitWebView             *web_view);
 
 WEBKIT_API WebKitWebView *
-webkit_web_view_new_with_user_content_manager        (WebKitUserContentManager  *user_content_manager);
+webkit_web_view_new_with_user_content_manager        (WebKitWebViewBackend      *backend,
+                                                      WebKitUserContentManager  *user_content_manager);
 
+WEBKIT_API WebKitWebViewBackend *
+webkit_web_view_get_backend                          (WebKitWebView             *web_view);
+
 WEBKIT_API gboolean
 webkit_web_view_is_ephemeral                         (WebKitWebView             *web_view);
 

Added: trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebViewBackend.cpp (0 => 225044)


--- trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebViewBackend.cpp	                        (rev 0)
+++ trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebViewBackend.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -0,0 +1,131 @@
+/*
+ * 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 "WebKitWebViewBackend.h"
+
+#include "WebKitWebViewBackendPrivate.h"
+
+/**
+ * SECTION: WebKitWebViewBackend
+ * @Short_description: A web view backend
+ * @Title: WebKitWebViewBackend
+ * @See_also: #WebKitWebView.
+ *
+ * A WebKitWebViewBackend is a boxed type wrapping a WPE backend used to create a
+ * #WebKitWebView. A WebKitWebViewBackend is created with webkit_web_view_backend_new()
+ * and it should be passed to a WebKitWebView constructor that will take the ownership.
+ *
+ * Since: 2.20
+ */
+
+struct _WebKitWebViewBackend {
+    _WebKitWebViewBackend(struct wpe_view_backend* backend, GDestroyNotify notifyCallback, gpointer notifyCallbackData)
+        : backend(backend)
+        , notifyCallback(notifyCallback)
+        , notifyCallbackData(notifyCallbackData)
+    {
+        ASSERT(backend);
+        ASSERT(notifyCallback);
+        ASSERT(notifyCallbackData);
+    }
+
+    _WebKitWebViewBackend()
+        : backend(wpe_view_backend_create())
+        , notifyCallback(reinterpret_cast<GDestroyNotify>(wpe_view_backend_destroy))
+        , notifyCallbackData(backend)
+    {
+    }
+
+    ~_WebKitWebViewBackend()
+    {
+        notifyCallback(notifyCallbackData);
+    }
+
+    struct wpe_view_backend* backend;
+    GDestroyNotify notifyCallback;
+    gpointer notifyCallbackData;
+    int referenceCount { 1 };
+};
+
+static WebKitWebViewBackend* webkitWebViewBackendRef(WebKitWebViewBackend* viewBackend)
+{
+    ASSERT(viewBackend);
+    g_atomic_int_inc(&viewBackend->referenceCount);
+    return viewBackend;
+}
+
+G_DEFINE_BOXED_TYPE(WebKitWebViewBackend, webkit_web_view_backend, webkitWebViewBackendRef, webkitWebViewBackendUnref)
+
+void webkitWebViewBackendUnref(WebKitWebViewBackend* viewBackend)
+{
+    ASSERT(viewBackend);
+    if (g_atomic_int_dec_and_test(&viewBackend->referenceCount)) {
+        viewBackend->~WebKitWebViewBackend();
+        fastFree(viewBackend);
+    }
+}
+
+WebKitWebViewBackend* webkitWebViewBackendCreateDefault()
+{
+    auto* viewBackend = static_cast<WebKitWebViewBackend*>(fastMalloc(sizeof(WebKitWebViewBackend)));
+    new (viewBackend) WebKitWebViewBackend();
+    return viewBackend;
+}
+
+/**
+ * webkit_web_view_backend_new:
+ * @backend: (transfer full): a #wpe_view_backend
+ * @notify: (nullable): a #GDestroyNotify, or %NULL
+ * @user_data: user data to pass to @notify
+ *
+ * Create a new #WebKitWebViewBackend for the given WPE @backend. You can pass a #GDestroyNotify
+ * that will be called when the object is destroyed passing @user_data as the argument. If @notify
+ * is %NULL, wpe_view_backend_destroy() will be used with @backend as argument.
+ * The returned #WebKitWebViewBackend should never be freed by the user; it must be passed to a
+ * #WebKitWebView constructor that will take the ownership.
+ *
+ * Returns: a newly created #WebKitWebViewBackend
+ *
+ * Since: 2.20
+ */
+WebKitWebViewBackend* webkit_web_view_backend_new(struct wpe_view_backend* backend, GDestroyNotify notify, gpointer userData)
+{
+    g_return_val_if_fail(backend, nullptr);
+
+    auto* viewBackend = static_cast<WebKitWebViewBackend*>(fastMalloc(sizeof(WebKitWebViewBackend)));
+    new (viewBackend) WebKitWebViewBackend(backend, notify ? notify : reinterpret_cast<GDestroyNotify>(wpe_view_backend_destroy), notify ? userData : backend);
+    return viewBackend;
+}
+
+/**
+ * webkit_web_view_backend_get_wpe_backend:
+ * @view_backend: a #WebKitWebViewBackend
+ *
+ * Get the WPE backend of @view_backend
+ *
+ * Returns: (transfer none): the #wpe_view_backend
+ *
+ * Since: 2.20
+ */
+struct wpe_view_backend* webkit_web_view_backend_get_wpe_backend(WebKitWebViewBackend* viewBackend)
+{
+    g_return_val_if_fail(viewBackend, nullptr);
+    return viewBackend->backend;
+}

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


--- trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebViewBackend.h	                        (rev 0)
+++ trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebViewBackend.h	2017-11-20 08:16:26 UTC (rev 225044)
@@ -0,0 +1,49 @@
+/*
+ * 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 WebKitWebViewBackend_h
+#define WebKitWebViewBackend_h
+
+#include <glib-object.h>
+#include <wpe/WebKitDefines.h>
+#include <wpe/view-backend.h>
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_WEB_VIEW_BACKEND (webkit_web_view_backend_get_type())
+
+typedef struct _WebKitWebViewBackend WebKitWebViewBackend;
+
+WEBKIT_API GType
+webkit_web_view_backend_get_type        (void);
+
+WEBKIT_API WebKitWebViewBackend *
+webkit_web_view_backend_new             (struct wpe_view_backend *backend,
+                                         GDestroyNotify           notify,
+                                         gpointer                 user_data);
+WEBKIT_API struct wpe_view_backend *
+webkit_web_view_backend_get_wpe_backend (WebKitWebViewBackend    *view_backend);
+
+G_END_DECLS
+
+#endif /* WebKitWebViewBackend_h */

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


--- trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebViewBackendPrivate.h	                        (rev 0)
+++ trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebViewBackendPrivate.h	2017-11-20 08:16:26 UTC (rev 225044)
@@ -0,0 +1,25 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include "WebKitWebViewBackend.h"
+
+void webkitWebViewBackendUnref(WebKitWebViewBackend*);
+WebKitWebViewBackend* webkitWebViewBackendCreateDefault();

Modified: trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebViewWPE.cpp (225043 => 225044)


--- trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebViewWPE.cpp	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Source/WebKit/UIProcess/API/wpe/WebKitWebViewWPE.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -39,6 +39,7 @@
 
 /**
  * webkit_web_view_new:
+ * @backend: (nullable) (transfer full): a #WebKitWebViewBackend, or %NULL to use the default
  *
  * Creates a new #WebKitWebView with the default #WebKitWebContext and
  * no #WebKitUserContentManager associated with it.
@@ -48,13 +49,17 @@
  *
  * Returns: The newly created #WebKitWebView
  */
-WebKitWebView* webkit_web_view_new()
+WebKitWebView* webkit_web_view_new(WebKitWebViewBackend* backend)
 {
-    return webkit_web_view_new_with_context(webkit_web_context_get_default());
+    return WEBKIT_WEB_VIEW(g_object_new(WEBKIT_TYPE_WEB_VIEW,
+        "backend", backend,
+        "web-context", webkit_web_context_get_default(),
+        nullptr));
 }
 
 /**
  * webkit_web_view_new_with_context:
+ * @backend: (nullable) (transfer full): a #WebKitWebViewBackend, or %NULL to use the default
  * @context: the #WebKitWebContext to be used by the #WebKitWebView
  *
  * Creates a new #WebKitWebView with the given #WebKitWebContext and
@@ -64,11 +69,12 @@
  *
  * Returns: The newly created #WebKitWebView
  */
-WebKitWebView* webkit_web_view_new_with_context(WebKitWebContext* context)
+WebKitWebView* webkit_web_view_new_with_context(WebKitWebViewBackend* backend, WebKitWebContext* context)
 {
     g_return_val_if_fail(WEBKIT_IS_WEB_CONTEXT(context), nullptr);
 
     return WEBKIT_WEB_VIEW(g_object_new(WEBKIT_TYPE_WEB_VIEW,
+        "backend", backend,
         "is-ephemeral", webkit_web_context_is_ephemeral(context),
         "web-context", context,
         nullptr));
@@ -76,6 +82,7 @@
 
 /**
  * webkit_web_view_new_with_related_view: (constructor)
+ * @backend: (nullable) (transfer full): a #WebKitWebViewBackend, or %NULL to use the default
  * @web_view: the related #WebKitWebView
  *
  * Creates a new #WebKitWebView sharing the same web process with @web_view.
@@ -93,11 +100,12 @@
  *
  * Since: 2.4
  */
-WebKitWebView* webkit_web_view_new_with_related_view(WebKitWebView* webView)
+WebKitWebView* webkit_web_view_new_with_related_view(WebKitWebViewBackend* backend, WebKitWebView* webView)
 {
     g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), nullptr);
 
     return WEBKIT_WEB_VIEW(g_object_new(WEBKIT_TYPE_WEB_VIEW,
+        "backend", backend,
         "user-content-manager", webkit_web_view_get_user_content_manager(webView),
         "settings", webkit_web_view_get_settings(webView),
         "related-view", webView,
@@ -106,6 +114,7 @@
 
 /**
  * webkit_web_view_new_with_settings:
+ * @backend: (nullable) (transfer full): a #WebKitWebViewBackend, or %NULL to use the default
  * @settings: a #WebKitSettings
  *
  * Creates a new #WebKitWebView with the given #WebKitSettings.
@@ -116,14 +125,19 @@
  *
  * Since: 2.6
  */
-WebKitWebView* webkit_web_view_new_with_settings(WebKitSettings* settings)
+WebKitWebView* webkit_web_view_new_with_settings(WebKitWebViewBackend* backend, WebKitSettings* settings)
 {
     g_return_val_if_fail(WEBKIT_IS_SETTINGS(settings), nullptr);
-    return WEBKIT_WEB_VIEW(g_object_new(WEBKIT_TYPE_WEB_VIEW, "settings", settings, nullptr));
+
+    return WEBKIT_WEB_VIEW(g_object_new(WEBKIT_TYPE_WEB_VIEW,
+        "backend", backend,
+        "settings", settings,
+        nullptr));
 }
 
 /**
  * webkit_web_view_new_with_user_content_manager:
+ * @backend: (nullable) (transfer full): a #WebKitWebViewBackend, or %NULL to use the default
  * @user_content_manager: a #WebKitUserContentManager.
  *
  * Creates a new #WebKitWebView with the given #WebKitUserContentManager.
@@ -134,9 +148,12 @@
  *
  * Since: 2.6
  */
-WebKitWebView* webkit_web_view_new_with_user_content_manager(WebKitUserContentManager* userContentManager)
+WebKitWebView* webkit_web_view_new_with_user_content_manager(WebKitWebViewBackend* backend, WebKitUserContentManager* userContentManager)
 {
     g_return_val_if_fail(WEBKIT_IS_USER_CONTENT_MANAGER(userContentManager), nullptr);
 
-    return WEBKIT_WEB_VIEW(g_object_new(WEBKIT_TYPE_WEB_VIEW, "user-content-manager", userContentManager, nullptr));
+    return WEBKIT_WEB_VIEW(g_object_new(WEBKIT_TYPE_WEB_VIEW,
+        "backend", backend,
+        "user-content-manager", userContentManager,
+        nullptr));
 }

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


--- trunk/Source/WebKit/UIProcess/API/wpe/webkit.h	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Source/WebKit/UIProcess/API/wpe/webkit.h	2017-11-20 08:16:26 UTC (rev 225044)
@@ -72,6 +72,7 @@
 #include <wpe/WebKitWebContext.h>
 #include <wpe/WebKitWebResource.h>
 #include <wpe/WebKitWebView.h>
+#include <wpe/WebKitWebViewBackend.h>
 #include <wpe/WebKitWebViewSessionState.h>
 #include <wpe/WebKitWebsiteData.h>
 #include <wpe/WebKitWebsiteDataManager.h>

Modified: trunk/Tools/ChangeLog (225043 => 225044)


--- trunk/Tools/ChangeLog	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Tools/ChangeLog	2017-11-20 08:16:26 UTC (rev 225044)
@@ -1,5 +1,45 @@
 2017-11-20  Carlos Garcia Campos  <[email protected]>
 
+        [WPE] webkit_web_view_new() should enable specifying wpe_view_backend object
+        https://bugs.webkit.org/show_bug.cgi?id=178655
+
+        Reviewed by Michael Catanzaro.
+
+        Update unit tests to create web views using helper methods that have a different implementation for GTK and
+        WPE. Also add a new test case to check the new API to create a WebKitWebView with a WPE backend. Use
+        WKViewCreate in WTR and fix a memory leak in HeadlessViewBackend.
+
+        * TestWebKitAPI/Tests/WebKitGLib/TestAutomationSession.cpp:
+        (testAutomationSessionRequestSession):
+        * TestWebKitAPI/Tests/WebKitGLib/TestBackForwardList.cpp:
+        (testWebKitWebViewSessionState):
+        (testWebKitWebViewSessionStateWithFormData):
+        (testWebKitWebViewNavigationAfterSessionRestore):
+        * TestWebKitAPI/Tests/WebKitGLib/TestMultiprocess.cpp:
+        * TestWebKitAPI/Tests/WebKitGLib/TestResources.cpp:
+        (testWebResourceGetDataError):
+        * TestWebKitAPI/Tests/WebKitGLib/TestUIClient.cpp:
+        * TestWebKitAPI/Tests/WebKitGLib/TestWebKitUserContentManager.cpp:
+        (testWebViewNewWithUserContentManager):
+        * TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp:
+        (testWebContextEphemeral):
+        * TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp:
+        (testWebViewWebContext):
+        (testWebViewWebContextLifetime):
+        (testWebViewWebBackend):
+        (testWebViewSettings):
+        (beforeAll):
+        * TestWebKitAPI/Tests/WebKitGLib/TestWebsiteData.cpp:
+        (testWebsiteDataEphemeral):
+        * TestWebKitAPI/glib/WebKitGLib/TestMain.h:
+        (Test::createWebView):
+        * WebKitTestRunner/wpe/HeadlessViewBackend.cpp:
+        (HeadlessViewBackend::~HeadlessViewBackend):
+        * WebKitTestRunner/wpe/PlatformWebViewWPE.cpp:
+        (WTR::PlatformWebView::PlatformWebView):
+
+2017-11-20  Carlos Garcia Campos  <[email protected]>
+
         [GTK][WPE] webkit_cookie_manager_delete_all_cookies doesn't delete the cookies if called before a web process is running
         https://bugs.webkit.org/show_bug.cgi?id=175265
 

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestAutomationSession.cpp (225043 => 225044)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestAutomationSession.cpp	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestAutomationSession.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -308,7 +308,7 @@
     g_assert(!test->createTopLevelBrowsingContext(nullptr));
 
     // Will also fail if the web view is not controlled by automation.
-    auto webView = Test::adoptView(webkit_web_view_new_with_context(test->m_webContext.get()));
+    auto webView = Test::adoptView(Test::createWebView(test->m_webContext.get()));
     g_assert(!webkit_web_view_is_controlled_by_automation(webView.get()));
     g_assert(!test->createTopLevelBrowsingContext(webView.get()));
 

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestBackForwardList.cpp (225043 => 225044)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestBackForwardList.cpp	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestBackForwardList.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -266,7 +266,7 @@
 {
     WebKitWebViewSessionState* state = webkit_web_view_get_session_state(test->m_webView);
     g_assert(state);
-    auto view = Test::adoptView(webkit_web_view_new());
+    auto view = Test::adoptView(Test::createWebView());
     WebKitBackForwardList* bfList = webkit_web_view_get_back_forward_list(view.get());
     g_assert_cmpuint(webkit_back_forward_list_get_length(bfList), ==, 0);
     webkit_web_view_restore_session_state(view.get(), state);
@@ -275,7 +275,7 @@
     g_assert(data);
     state = webkit_web_view_session_state_new(data.get());
     g_assert(state);
-    view = Test::adoptView(webkit_web_view_new());
+    view = Test::adoptView(Test::createWebView());
     bfList = webkit_web_view_get_back_forward_list(view.get());
     g_assert_cmpuint(webkit_back_forward_list_get_length(bfList), ==, 0);
     webkit_web_view_restore_session_state(view.get(), state);
@@ -318,7 +318,7 @@
     state = webkit_web_view_session_state_new(data.get());
     g_assert(state);
 
-    view = Test::adoptView(webkit_web_view_new());
+    view = Test::adoptView(Test::createWebView());
     bfList = webkit_web_view_get_back_forward_list(view.get());
     g_assert_cmpuint(webkit_back_forward_list_get_length(bfList), ==, 0);
     webkit_web_view_restore_session_state(view.get(), state);
@@ -347,7 +347,7 @@
 
     WebKitWebViewSessionState* state = webkit_web_view_get_session_state(test->m_webView);
     g_assert(state);
-    auto view = Test::adoptView(webkit_web_view_new());
+    auto view = Test::adoptView(Test::createWebView());
     WebKitBackForwardList* bfList = webkit_web_view_get_back_forward_list(view.get());
     g_assert_cmpuint(webkit_back_forward_list_get_length(bfList), ==, 0);
     webkit_web_view_restore_session_state(view.get(), state);
@@ -356,7 +356,7 @@
     g_assert(data);
     state = webkit_web_view_session_state_new(data.get());
     g_assert(state);
-    view = Test::adoptView(webkit_web_view_new());
+    view = Test::adoptView(Test::createWebView());
     bfList = webkit_web_view_get_back_forward_list(view.get());
     g_assert_cmpuint(webkit_back_forward_list_get_length(bfList), ==, 0);
     webkit_web_view_restore_session_state(view.get(), state);
@@ -374,7 +374,7 @@
 {
     // This test checks that a normal load after a session restore with a BackForard list having
     // forward items doesn't produce any runtime critical warning. See https://bugs.webkit.org/show_bug.cgi?id=153233.
-    auto view = Test::adoptView(webkit_web_view_new());
+    auto view = Test::adoptView(Test::createWebView());
     g_signal_connect(view.get(), "load-changed", G_CALLBACK(viewLoadChanged), test->m_mainLoop);
 
     webkit_web_view_load_uri(view.get(), kServer->getURIForPath("/Page1").data());

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestMultiprocess.cpp (225043 => 225044)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestMultiprocess.cpp	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestMultiprocess.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -58,7 +58,7 @@
     {
         g_assert_cmpuint(index, <, numViews);
 
-        m_webViews[index] = Test::adoptView(webkit_web_view_new_with_context(m_webContext.get()));
+        m_webViews[index] = Test::adoptView(Test::createWebView(m_webContext.get()));
         assertObjectIsDeletedWhenTestFinishes(G_OBJECT(m_webViews[index].get()));
 
         m_webViewBusNames[index] = GUniquePtr<char>(g_strdup_printf("org.webkit.gtk.WebExtensionTest%u", Test::s_webExtensionID));
@@ -170,7 +170,7 @@
         , m_initializeWebExtensionsSignalCount(0)
     {
         webkit_web_context_set_process_model(m_webContext.get(), WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES);
-        m_webView = WEBKIT_WEB_VIEW(webkit_web_view_new_with_context(m_webContext.get()));
+        m_webView = WEBKIT_WEB_VIEW(Test::createWebView(m_webContext.get()));
 #if PLATFORM(GTK)
         g_object_ref_sink(m_webView);
 #endif
@@ -195,7 +195,7 @@
     {
         g_assert(webView == m_webView);
 
-        auto* newWebView = webkit_web_view_new_with_related_view(webView);
+        auto* newWebView = Test::createWebView(webView);
 #if PLATFORM(GTK)
         g_object_ref_sink(newWebView);
 #endif

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestResources.cpp (225043 => 225044)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestResources.cpp	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestResources.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -547,7 +547,7 @@
 static void testWebResourceGetDataError(Test* test, gconstpointer)
 {
     GRefPtr<GMainLoop> mainLoop = adoptGRef(g_main_loop_new(nullptr, FALSE));
-    GRefPtr<WebKitWebView> webView = WEBKIT_WEB_VIEW(webkit_web_view_new_with_context(test->m_webContext.get()));
+    GRefPtr<WebKitWebView> webView = WEBKIT_WEB_VIEW(Test::createWebView(test->m_webContext.get()));
     webkit_web_view_load_html(webView.get(), "<html></html>", nullptr);
     g_signal_connect(webView.get(), "load-changed", G_CALLBACK(webViewloadChanged), mainLoop.get());
     g_main_loop_run(mainLoop.get());

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestUIClient.cpp (225043 => 225044)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestUIClient.cpp	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestUIClient.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -321,7 +321,7 @@
         g_assert(webView == m_webView);
         g_assert(navigation);
 
-        auto* newWebView = webkit_web_view_new_with_context(webkit_web_view_get_context(webView));
+        auto* newWebView = Test::createWebView(webkit_web_view_get_context(webView));
 #if PLATFORM(GTK)
         g_object_ref_sink(newWebView);
 #endif

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitUserContentManager.cpp (225043 => 225044)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitUserContentManager.cpp	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitUserContentManager.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -40,10 +40,10 @@
 {
     GRefPtr<WebKitUserContentManager> userContentManager1 = adoptGRef(webkit_user_content_manager_new());
     test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(userContentManager1.get()));
-    auto webView1 = Test::adoptView(webkit_web_view_new_with_user_content_manager(userContentManager1.get()));
+    auto webView1 = Test::adoptView(Test::createWebView(userContentManager1.get()));
     g_assert(webkit_web_view_get_user_content_manager(webView1.get()) == userContentManager1.get());
 
-    auto webView2 = Test::adoptView(webkit_web_view_new());
+    auto webView2 = Test::adoptView(Test::createWebView());
     g_assert(webkit_web_view_get_user_content_manager(webView2.get()) != userContentManager1.get());
 }
 

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp (225043 => 225044)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -51,11 +51,11 @@
     g_assert(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager));
     g_assert(!webkit_website_data_manager_is_ephemeral(manager));
 
-    auto webView = Test::adoptView(webkit_web_view_new());
+    auto webView = Test::adoptView(Test::createWebView());
     g_assert(!webkit_web_view_is_ephemeral(webView.get()));
     g_assert(webkit_web_view_get_website_data_manager(webView.get()) == webkit_web_context_get_website_data_manager(webkit_web_context_get_default()));
 
-    webView = Test::adoptView(webkit_web_view_new_with_context(test->m_webContext.get()));
+    webView = Test::adoptView(Test::createWebView(test->m_webContext.get()));
     g_assert(!webkit_web_view_is_ephemeral(webView.get()));
     g_assert(webkit_web_view_get_website_data_manager(webView.get()) == manager);
 
@@ -66,7 +66,7 @@
     g_assert(webkit_website_data_manager_is_ephemeral(manager));
     g_assert(webkit_web_view_get_website_data_manager(webView.get()) != manager);
 
-    webView = Test::adoptView(webkit_web_view_new_with_context(context.get()));
+    webView = Test::adoptView(Test::createWebView(context.get()));
     g_assert(webkit_web_view_is_ephemeral(webView.get()));
     g_assert(webkit_web_view_get_website_data_manager(webView.get()) == manager);
 

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp (225043 => 225044)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -55,7 +55,7 @@
     g_assert(webkit_web_view_get_context(webView.get()) == webkit_web_context_get_default());
 
     // Check that a web view created with a related view has the related view context.
-    webView = Test::adoptView(webkit_web_view_new_with_related_view(test->m_webView));
+    webView = Test::adoptView(Test::createWebView(test->m_webView));
     g_assert(webkit_web_view_get_context(webView.get()) == test->m_webContext.get());
 
     // Check that a web context given as construct parameter is ignored if a related view is also provided.
@@ -69,7 +69,7 @@
     WebKitWebContext* webContext = webkit_web_context_new();
     test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(webContext));
 
-    auto* webView = webkit_web_view_new_with_context(webContext);
+    auto* webView = Test::createWebView(webContext);
     test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(webView));
 
 #if PLATFORM(GTK)
@@ -85,7 +85,7 @@
     WebKitWebContext* webContext2 = webkit_web_context_new();
     test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(webContext2));
 
-    auto* webView2 = webkit_web_view_new_with_context(webContext2);
+    auto* webView2 = Test::createWebView(webContext2);
     test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(webView2));
 
 #if PLATFORM(GTK)
@@ -98,6 +98,67 @@
     g_object_unref(webContext2);
 }
 
+#if PLATFORM(WPE)
+static void testWebViewWebBackend(Test* test, gconstpointer)
+{
+    // Use the default backend (we don't have a way to check the backend will be actually freed).
+    GRefPtr<WebKitWebView> webView = adoptGRef(webkit_web_view_new(nullptr));
+    test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(webView.get()));
+    auto* viewBackend = webkit_web_view_get_backend(webView.get());
+    g_assert(viewBackend);
+    auto* wpeBackend = webkit_web_view_backend_get_wpe_backend(viewBackend);
+    g_assert(wpeBackend);
+    webView = nullptr;
+
+    // User provided backend with default deleter (we don't have a way to check the backend will be actually freed).
+    webView = adoptGRef(webkit_web_view_new(webkit_web_view_backend_new(wpe_view_backend_create(), nullptr, nullptr)));
+    test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(webView.get()));
+    viewBackend = webkit_web_view_get_backend(webView.get());
+    g_assert(viewBackend);
+    wpeBackend = webkit_web_view_backend_get_wpe_backend(viewBackend);
+    g_assert(wpeBackend);
+    webView = nullptr;
+
+    // User provided backend with destroy notify.
+    wpeBackend = wpe_view_backend_create();
+    webView = adoptGRef(webkit_web_view_new(webkit_web_view_backend_new(wpeBackend, [](gpointer userData) {
+        auto* backend = *static_cast<struct wpe_view_backend**>(userData);
+        wpe_view_backend_destroy(backend);
+        *static_cast<struct wpe_view_backend**>(userData) = nullptr;
+    }, &wpeBackend)));
+    test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(webView.get()));
+    webView = nullptr;
+    g_assert(!wpeBackend);
+
+    // User provided backend owned by another object with destroy notify.
+    static bool hasInstance = false;
+    struct BackendOwner {
+        BackendOwner(struct wpe_view_backend* backend)
+            : backend(backend)
+        {
+            hasInstance = true;
+        }
+
+        ~BackendOwner()
+        {
+            wpe_view_backend_destroy(backend);
+            hasInstance = false;
+        }
+
+        struct wpe_view_backend* backend;
+    };
+    auto* owner = new BackendOwner(wpe_view_backend_create());
+    g_assert(hasInstance);
+    webView = adoptGRef(webkit_web_view_new(webkit_web_view_backend_new(owner->backend, [](gpointer userData) {
+        delete static_cast<BackendOwner*>(userData);
+    }, owner)));
+    test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(webView.get()));
+    g_assert(hasInstance);
+    webView = nullptr;
+    g_assert(!hasInstance);
+}
+#endif // PLATFORM(WPE)
+
 static void ephemeralViewloadChanged(WebKitWebView* webView, WebKitLoadEvent loadEvent, WebViewTest* test)
 {
     if (loadEvent != WEBKIT_LOAD_FINISHED)
@@ -177,7 +238,7 @@
     g_assert(settings != defaultSettings);
     g_assert(!webkit_settings_get_enable_javascript(settings));
 
-    auto webView2 = Test::adoptView(webkit_web_view_new());
+    auto webView2 = Test::adoptView(Test::createWebView());
     test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(webView2.get()));
     webkit_web_view_set_settings(WEBKIT_WEB_VIEW(webView2.get()), settings);
     g_assert(webkit_web_view_get_settings(WEBKIT_WEB_VIEW(webView2.get())) == settings);
@@ -189,7 +250,7 @@
     g_assert(settings == newSettings2.get());
     g_assert(webkit_settings_get_enable_javascript(settings));
 
-    auto webView3 = Test::adoptView(webkit_web_view_new_with_settings(newSettings2.get()));
+    auto webView3 = Test::adoptView(Test::createWebView(newSettings2.get()));
     test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(webView3.get()));
     g_assert(webkit_web_view_get_settings(WEBKIT_WEB_VIEW(webView3.get())) == newSettings2.get());
 }
@@ -1077,6 +1138,9 @@
 
     WebViewTest::add("WebKitWebView", "web-context", testWebViewWebContext);
     WebViewTest::add("WebKitWebView", "web-context-lifetime", testWebViewWebContextLifetime);
+#if PLATFORM(WPE)
+    Test::add("WebKitWebView", "backend", testWebViewWebBackend);
+#endif
     WebViewTest::add("WebKitWebView", "ephemeral", testWebViewEphemeral);
     WebViewTest::add("WebKitWebView", "custom-charset", testWebViewCustomCharset);
     WebViewTest::add("WebKitWebView", "settings", testWebViewSettings);

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebsiteData.cpp (225043 => 225044)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebsiteData.cpp	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebsiteData.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -252,7 +252,7 @@
     // Non persistent data can be queried in an ephemeral manager.
     GRefPtr<WebKitWebContext> webContext = adoptGRef(webkit_web_context_new_with_website_data_manager(manager.get()));
     g_assert(webkit_web_context_is_ephemeral(webContext.get()));
-    auto webView = Test::adoptView(webkit_web_view_new_with_context(webContext.get()));
+    auto webView = Test::adoptView(Test::createWebView(webContext.get()));
     g_assert(webkit_web_view_is_ephemeral(webView.get()));
     g_assert(webkit_web_view_get_website_data_manager(webView.get()) == manager.get());
 

Modified: trunk/Tools/TestWebKitAPI/glib/WebKitGLib/TestMain.h (225043 => 225044)


--- trunk/Tools/TestWebKitAPI/glib/WebKitGLib/TestMain.h	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Tools/TestWebKitAPI/glib/WebKitGLib/TestMain.h	2017-11-20 08:16:26 UTC (rev 225044)
@@ -143,6 +143,51 @@
         webkit_web_context_set_web_extensions_initialization_user_data(m_webContext.get(), g_variant_new_uint32(++s_webExtensionID));
     }
 
+    static WebKitWebView* createWebView()
+    {
+#if PLATFORM(GTK)
+        return WEBKIT_WEB_VIEW(webkit_web_view_new());
+#elif PLATFORM(WPE)
+        return webkit_web_view_new(nullptr);
+#endif
+    }
+
+    static WebKitWebView* createWebView(WebKitWebContext* context)
+    {
+#if PLATFORM(GTK)
+        return WEBKIT_WEB_VIEW(webkit_web_view_new_with_context(context));
+#elif PLATFORM(WPE)
+        return webkit_web_view_new_with_context(nullptr, context);
+#endif
+    }
+
+    static WebKitWebView* createWebView(WebKitWebView* relatedView)
+    {
+#if PLATFORM(GTK)
+        return WEBKIT_WEB_VIEW(webkit_web_view_new_with_related_view(relatedView));
+#elif PLATFORM(WPE)
+        return webkit_web_view_new_with_related_view(nullptr, relatedView);
+#endif
+    }
+
+    static WebKitWebView* createWebView(WebKitUserContentManager* contentManager)
+    {
+#if PLATFORM(GTK)
+        return WEBKIT_WEB_VIEW(webkit_web_view_new_with_user_content_manager(contentManager));
+#elif PLATFORM(WPE)
+        return webkit_web_view_new_with_user_content_manager(nullptr, contentManager);
+#endif
+    }
+
+    static WebKitWebView* createWebView(WebKitSettings* settings)
+    {
+#if PLATFORM(GTK)
+        return WEBKIT_WEB_VIEW(webkit_web_view_new_with_settings(settings));
+#elif PLATFORM(WPE)
+        return webkit_web_view_new_with_settings(nullptr, settings);
+#endif
+    }
+
     static void objectFinalized(Test* test, GObject* finalizedObject)
     {
         test->m_watchedObjects.remove(finalizedObject);

Modified: trunk/Tools/WebKitTestRunner/wpe/HeadlessViewBackend.cpp (225043 => 225044)


--- trunk/Tools/WebKitTestRunner/wpe/HeadlessViewBackend.cpp	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Tools/WebKitTestRunner/wpe/HeadlessViewBackend.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -131,6 +131,8 @@
 
     if (m_egl.context)
         eglDestroyContext(m_egl.display, m_egl.context);
+
+    wpe_mesa_view_backend_exportable_dma_buf_destroy(m_exportable);
 }
 
 struct wpe_view_backend* HeadlessViewBackend::backend() const

Modified: trunk/Tools/WebKitTestRunner/wpe/PlatformWebViewWPE.cpp (225043 => 225044)


--- trunk/Tools/WebKitTestRunner/wpe/PlatformWebViewWPE.cpp	2017-11-20 08:11:29 UTC (rev 225043)
+++ trunk/Tools/WebKitTestRunner/wpe/PlatformWebViewWPE.cpp	2017-11-20 08:16:26 UTC (rev 225044)
@@ -40,7 +40,7 @@
     , m_options(options)
 {
     m_window = new HeadlessViewBackend;
-    m_view = WKViewCreateWithViewBackend(m_window->backend(), configuration);
+    m_view = WKViewCreate(m_window->backend(), configuration);
 }
 
 PlatformWebView::~PlatformWebView()
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to