Changeset 163781 in webkit


Ignore:
Timestamp:
Feb 10, 2014 5:46:59 AM (10 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK] Add API to create a webview related to another one
https://bugs.webkit.org/show_bug.cgi?id=128498

Reviewed by Gustavo Noronha Silva.

Source/WebKit2:

Add webkit_web_view_new_with_related_view() to create a new
WebView sharing the same web process as the given one.

  • UIProcess/API/gtk/WebKitWebContext.cpp:

(webkitWebContextCreatePageForWebView): Use the given related
WebView to pass a related WebPageProxy to webkitWebViewBaseCreateWebPage().

  • UIProcess/API/gtk/WebKitWebContextPrivate.h:
  • UIProcess/API/gtk/WebKitWebView.cpp:

(webkitWebViewConstructed): Pass the related web view to webkitWebContextCreatePageForWebView().
(webkitWebViewSetProperty):
(webkit_web_view_class_init): Add related-view construct-only property.
(webkit_web_view_new_with_related_view): New public method to
create a web view with a related one.

  • UIProcess/API/gtk/WebKitWebView.h:
  • UIProcess/API/gtk/WebKitWebViewBase.cpp:

(webkitWebViewBaseCreate): Pass nullptr as related page to webkitWebViewBaseCreateWebPage().
(webkitWebViewBaseCreateWebPage): Use the given related
WebPageProxy to initialize the web page configuration.

  • UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
  • UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Add new symbol.

Tools:

  • MiniBrowser/gtk/BrowserWindow.c:

(webViewCreate): Use webkit_web_view_new_with_related_view() when
creating a new web view for window.open().

  • TestWebKitAPI/Tests/WebKit2Gtk/TestMultiprocess.cpp:

(testMultiprocessWebViewCreateReadyClose): Add test case to check
that window.open() works when creating the new WebView related to
the existing one, and that no new web process is spawned when
using webkit_web_view_new_with_related_view().
(beforeAll):

Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r163779 r163781  
     12014-02-10  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Add API to create a webview related to another one
     4        https://bugs.webkit.org/show_bug.cgi?id=128498
     5
     6        Reviewed by Gustavo Noronha Silva.
     7
     8        Add webkit_web_view_new_with_related_view() to create a new
     9        WebView sharing the same web process as the given one.
     10
     11        * UIProcess/API/gtk/WebKitWebContext.cpp:
     12        (webkitWebContextCreatePageForWebView): Use the given related
     13        WebView to pass a related WebPageProxy to webkitWebViewBaseCreateWebPage().
     14        * UIProcess/API/gtk/WebKitWebContextPrivate.h:
     15        * UIProcess/API/gtk/WebKitWebView.cpp:
     16        (webkitWebViewConstructed): Pass the related web view to webkitWebContextCreatePageForWebView().
     17        (webkitWebViewSetProperty):
     18        (webkit_web_view_class_init): Add related-view construct-only property.
     19        (webkit_web_view_new_with_related_view): New public method to
     20        create a web view with a related one.
     21        * UIProcess/API/gtk/WebKitWebView.h:
     22        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
     23        (webkitWebViewBaseCreate): Pass nullptr as related page to webkitWebViewBaseCreateWebPage().
     24        (webkitWebViewBaseCreateWebPage): Use the given related
     25        WebPageProxy to initialize the web page configuration.
     26        * UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
     27        * UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Add new symbol.
     28
    1292014-02-10  Lukasz Bialek  <l.bialek@samsung.com>
    230
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp

    r163698 r163781  
    10391039}
    10401040
    1041 void webkitWebContextCreatePageForWebView(WebKitWebContext* context, WebKitWebView* webView, WebKitWebViewGroup* webViewGroup)
     1041void webkitWebContextCreatePageForWebView(WebKitWebContext* context, WebKitWebView* webView, WebKitWebViewGroup* webViewGroup, WebKitWebView* relatedView)
    10421042{
    10431043    WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(webView);
    10441044    WebPageGroup* pageGroup = webViewGroup ? webkitWebViewGroupGetPageGroup(webViewGroup) : 0;
    1045     webkitWebViewBaseCreateWebPage(webViewBase, context->priv->context.get(), pageGroup);
     1045    WebPageProxy* relatedPage = relatedView ? webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(relatedView)) : nullptr;
     1046    webkitWebViewBaseCreateWebPage(webViewBase, context->priv->context.get(), pageGroup, relatedPage);
    10461047
    10471048    WebPageProxy* page = webkitWebViewBaseGetPage(webViewBase);
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContextPrivate.h

    r162835 r163781  
    4343void webkitWebContextStopLoadingCustomProtocol(WebKitWebContext*, uint64_t customProtocolID);
    4444void webkitWebContextDidFinishLoadingCustomProtocol(WebKitWebContext*, uint64_t customProtocolID);
    45 void webkitWebContextCreatePageForWebView(WebKitWebContext*, WebKitWebView*, WebKitWebViewGroup*);
     45void webkitWebContextCreatePageForWebView(WebKitWebContext*, WebKitWebView*, WebKitWebViewGroup*, WebKitWebView*);
    4646void webkitWebContextWebViewDestroyed(WebKitWebContext*, WebKitWebView*);
    4747WebKitWebView* webkitWebContextGetWebViewForPage(WebKitWebContext*, WebKit::WebPageProxy*);
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp

    r163074 r163781  
    133133
    134134    PROP_WEB_CONTEXT,
     135    PROP_RELATED_VIEW,
    135136    PROP_GROUP,
    136137    PROP_TITLE,
     
    158159
    159160    WebKitWebContext* context;
     161    WebKitWebView* relatedView;
    160162    CString title;
    161163    CString customTextEncoding;
     
    503505    WebKitWebView* webView = WEBKIT_WEB_VIEW(object);
    504506    WebKitWebViewPrivate* priv = webView->priv;
    505     webkitWebContextCreatePageForWebView(priv->context, webView, priv->group.get());
     507    webkitWebContextCreatePageForWebView(priv->context, webView, priv->group.get(), priv->relatedView);
     508    // The related view is only valid during the construction.
     509    priv->relatedView = nullptr;
    506510
    507511    webkitWebViewBaseSetDownloadRequestHandler(WEBKIT_WEB_VIEW_BASE(webView), webkitWebViewHandleDownloadRequest);
     
    530534        gpointer webContext = g_value_get_object(value);
    531535        webView->priv->context = webContext ? WEBKIT_WEB_CONTEXT(webContext) : webkit_web_context_get_default();
     536        break;
     537    }
     538    case PROP_RELATED_VIEW: {
     539        gpointer relatedView = g_value_get_object(value);
     540        webView->priv->relatedView = relatedView ? WEBKIT_WEB_VIEW(relatedView) : nullptr;
    532541        break;
    533542    }
     
    637646                                                        WEBKIT_TYPE_WEB_CONTEXT,
    638647                                                        static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
     648    /**
     649     * WebKitWebView:related-view:
     650     *
     651     * The related #WebKitWebView used when creating the view to share the
     652     * same web process. This property is not readable because the related
     653     * web view is only valid during the object construction.
     654     *
     655     * Since: 2.4
     656     */
     657    g_object_class_install_property(
     658        gObjectClass,
     659        PROP_RELATED_VIEW,
     660        g_param_spec_object(
     661            "related-view",
     662            _("Related WebView"),
     663            _("The related WebKitWebView used when creating the view to share the same web process"),
     664            WEBKIT_TYPE_WEB_VIEW,
     665            static_cast<GParamFlags>(WEBKIT_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)));
     666
    639667    /**
    640668     * WebKitWebView:group:
     
    891919     * newly created #WebKitWebView.
    892920     *
     921     * When using %WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES
     922     * process model, the new #WebKitWebView should be related to
     923     * @web_view to share the same web process, see webkit_web_view_new_with_related_view
     924     * for more details.
     925     *
    893926     * The new #WebKitWebView should not be displayed to the user
    894927     * until the #WebKitWebView::ready-to-show signal is emitted.
     
    18801913
    18811914    return GTK_WIDGET(g_object_new(WEBKIT_TYPE_WEB_VIEW, "web-context", context, NULL));
     1915}
     1916
     1917/**
     1918 * webkit_web_view_new_with_related_view:
     1919 * @web_view: the related #WebKitWebView
     1920 *
     1921 * Creates a new #WebKitWebView sharing the same web process with @web_view.
     1922 * This method doesn't have any effect when %WEBKIT_PROCESS_MODEL_SHARED_SECONDARY_PROCESS
     1923 * process model is used, because a single web process is shared for all the web views in the
     1924 * same #WebKitWebContext. When using %WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES process model,
     1925 * this method should always be used when creating the #WebKitWebView in the #WebKitWebView::create signal.
     1926 * You can also use this method to implement other process models based on %WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES,
     1927 * like for example, sharing the same web process for all the views in the same security domain.
     1928 *
     1929 * Returns: (transfer full): The newly created #WebKitWebView widget
     1930 *
     1931 * Since: 2.4
     1932 */
     1933GtkWidget* webkit_web_view_new_with_related_view(WebKitWebView* webView)
     1934{
     1935    g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), nullptr);
     1936
     1937    return GTK_WIDGET(g_object_new(WEBKIT_TYPE_WEB_VIEW, "related-view", webView, nullptr));
    18821938}
    18831939
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h

    r157781 r163781  
    267267
    268268WEBKIT_API GtkWidget *
     269webkit_web_view_new_with_related_view                (WebKitWebView             *web_view);
     270
     271WEBKIT_API GtkWidget *
    269272webkit_web_view_new_with_group                       (WebKitWebViewGroup        *group);
    270273
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp

    r163749 r163781  
    940940{
    941941    WebKitWebViewBase* webkitWebViewBase = WEBKIT_WEB_VIEW_BASE(g_object_new(WEBKIT_TYPE_WEB_VIEW_BASE, NULL));
    942     webkitWebViewBaseCreateWebPage(webkitWebViewBase, context, pageGroup);
     942    webkitWebViewBaseCreateWebPage(webkitWebViewBase, context, pageGroup, nullptr);
    943943    return webkitWebViewBase;
    944944}
     
    966966}
    967967
    968 void webkitWebViewBaseCreateWebPage(WebKitWebViewBase* webkitWebViewBase, WebContext* context, WebPageGroup* pageGroup)
     968void webkitWebViewBaseCreateWebPage(WebKitWebViewBase* webkitWebViewBase, WebContext* context, WebPageGroup* pageGroup, WebPageProxy* relatedPage)
    969969{
    970970    WebKitWebViewBasePrivate* priv = webkitWebViewBase->priv;
     
    972972    WebPageConfiguration webPageConfiguration;
    973973    webPageConfiguration.pageGroup = pageGroup;
     974    webPageConfiguration.relatedPage = relatedPage;
    974975    priv->pageProxy = context->createWebPage(*priv->pageClient, std::move(webPageConfiguration));
    975976    priv->pageProxy->initializeWebPage();
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h

    r162724 r163781  
    3838GtkIMContext* webkitWebViewBaseGetIMContext(WebKitWebViewBase*);
    3939WebKit::WebPageProxy* webkitWebViewBaseGetPage(WebKitWebViewBase*);
    40 void webkitWebViewBaseCreateWebPage(WebKitWebViewBase*, WebKit::WebContext*, WebKit::WebPageGroup*);
     40void webkitWebViewBaseCreateWebPage(WebKitWebViewBase*, WebKit::WebContext*, WebKit::WebPageGroup*, WebKit::WebPageProxy*);
    4141void webkitWebViewBaseSetTooltipText(WebKitWebViewBase*, const char*);
    4242void webkitWebViewBaseSetTooltipArea(WebKitWebViewBase*, const WebCore::IntRect&);
  • trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt

    r162928 r163781  
    9696webkit_web_view_new
    9797webkit_web_view_new_with_context
     98webkit_web_view_new_with_related_view
    9899webkit_web_view_new_with_group
    99100webkit_web_view_get_context
  • trunk/Tools/ChangeLog

    r163780 r163781  
     12014-02-10  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Add API to create a webview related to another one
     4        https://bugs.webkit.org/show_bug.cgi?id=128498
     5
     6        Reviewed by Gustavo Noronha Silva.
     7
     8        * MiniBrowser/gtk/BrowserWindow.c:
     9        (webViewCreate): Use webkit_web_view_new_with_related_view() when
     10        creating a new web view for window.open().
     11        * TestWebKitAPI/Tests/WebKit2Gtk/TestMultiprocess.cpp:
     12        (testMultiprocessWebViewCreateReadyClose): Add test case to check
     13        that window.open() works when creating the new WebView related to
     14        the existing one, and that no new web process is spawned when
     15        using webkit_web_view_new_with_related_view().
     16        (beforeAll):
     17
    1182014-02-10  Eva Balazsfalvi  <balazsfalvi.eva@stud.u-szeged.hu>
    219
  • trunk/Tools/MiniBrowser/gtk/BrowserWindow.c

    r162122 r163781  
    347347static GtkWidget *webViewCreate(WebKitWebView *webView, BrowserWindow *window)
    348348{
    349     WebKitWebView *newWebView = WEBKIT_WEB_VIEW(webkit_web_view_new_with_context(webkit_web_view_get_context(webView)));
     349    WebKitWebView *newWebView = WEBKIT_WEB_VIEW(webkit_web_view_new_with_related_view(webView));
    350350    webkit_web_view_set_settings(newWebView, webkit_web_view_get_settings(webView));
    351351
  • trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestMultiprocess.cpp

    r163698 r163781  
    2222#include "TestMain.h"
    2323#include "WebKitTestBus.h"
     24#include "WebViewTest.h"
    2425#include <webkit2/webkit2.h>
    2526#include <wtf/Vector.h>
     
    105106}
    106107
     108class UIClientMultiprocessTest: public WebViewTest {
     109public:
     110    MAKE_GLIB_TEST_FIXTURE(UIClientMultiprocessTest);
     111
     112    enum WebViewEvents {
     113        Create,
     114        ReadyToShow,
     115        Close
     116    };
     117
     118    static GtkWidget* viewCreateCallback(WebKitWebView* webView, UIClientMultiprocessTest* test)
     119    {
     120        return test->viewCreate(webView);
     121    }
     122
     123    static void viewReadyToShowCallback(WebKitWebView* webView, UIClientMultiprocessTest* test)
     124    {
     125        test->viewReadyToShow(webView);
     126    }
     127
     128    static void viewCloseCallback(WebKitWebView* webView, UIClientMultiprocessTest* test)
     129    {
     130        test->viewClose(webView);
     131    }
     132
     133    UIClientMultiprocessTest()
     134    {
     135        webkit_settings_set_javascript_can_open_windows_automatically(webkit_web_view_get_settings(m_webView), TRUE);
     136        g_signal_connect(m_webView, "create", G_CALLBACK(viewCreateCallback), this);
     137    }
     138
     139    ~UIClientMultiprocessTest()
     140    {
     141        g_signal_handlers_disconnect_matched(m_webView, G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, this);
     142    }
     143
     144    GtkWidget* viewCreate(WebKitWebView* webView)
     145    {
     146        g_assert(webView == m_webView);
     147
     148        GtkWidget* newWebView = webkit_web_view_new_with_related_view(webView);
     149        g_object_ref_sink(newWebView);
     150        assertObjectIsDeletedWhenTestFinishes(G_OBJECT(newWebView));
     151        m_webViewEvents.append(Create);
     152
     153        g_signal_connect(newWebView, "ready-to-show", G_CALLBACK(viewReadyToShowCallback), this);
     154        g_signal_connect(newWebView, "close", G_CALLBACK(viewCloseCallback), this);
     155
     156        return newWebView;
     157    }
     158
     159    void viewReadyToShow(WebKitWebView* webView)
     160    {
     161        g_assert(m_webView != webView);
     162        m_webViewEvents.append(ReadyToShow);
     163    }
     164
     165    void viewClose(WebKitWebView* webView)
     166    {
     167        g_assert(m_webView != webView);
     168
     169        m_webViewEvents.append(Close);
     170        g_object_unref(webView);
     171        g_main_loop_quit(m_mainLoop);
     172    }
     173
     174    void waitUntilNewWebViewClose()
     175    {
     176        g_main_loop_run(m_mainLoop);
     177    }
     178
     179    Vector<WebViewEvents> m_webViewEvents;
     180};
     181
     182static void testMultiprocessWebViewCreateReadyClose(UIClientMultiprocessTest* test, gconstpointer)
     183{
     184    // At this point the web process of the current view has already been created.
     185    // We save it here to check that after window.open() the number of processes
     186    // is the same.
     187    guint32 processCountBefore = nextInitializationId - 1;
     188    test->loadHtml("<html><body onLoad=\"window.open().close();\"></html>", nullptr);
     189    test->waitUntilNewWebViewClose();
     190
     191    Vector<UIClientMultiprocessTest::WebViewEvents>& events = test->m_webViewEvents;
     192    g_assert_cmpint(events.size(), ==, 3);
     193    g_assert_cmpint(events[0], ==, UIClientMultiprocessTest::Create);
     194    g_assert_cmpint(events[1], ==, UIClientMultiprocessTest::ReadyToShow);
     195    g_assert_cmpint(events[2], ==, UIClientMultiprocessTest::Close);
     196
     197    guint32 processesCountAfter =  nextInitializationId - 1;
     198    g_assert_cmpuint(processesCountAfter, ==, processCountBefore);
     199}
     200
    107201static void initializeWebExtensions(WebKitWebContext* context, gpointer)
    108202{
     
    134228
    135229    MultiprocessTest::add("WebKitWebContext", "process-per-web-view", testProcessPerWebView);
     230    UIClientMultiprocessTest::add("WebKitWebView", "multiprocess-create-ready-close", testMultiprocessWebViewCreateReadyClose);
    136231}
    137232
Note: See TracChangeset for help on using the changeset viewer.