Diff
Modified: releases/WebKitGTK/webkit-2.4/Source/WebKit2/ChangeLog (163783 => 163784)
--- releases/WebKitGTK/webkit-2.4/Source/WebKit2/ChangeLog 2014-02-10 14:55:47 UTC (rev 163783)
+++ releases/WebKitGTK/webkit-2.4/Source/WebKit2/ChangeLog 2014-02-10 15:00:47 UTC (rev 163784)
@@ -1,3 +1,31 @@
+2014-02-10 Carlos Garcia Campos <cgar...@igalia.com>
+
+ [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.
+
+ 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.
+
2014-02-07 Anders Carlsson <ander...@apple.com>
Simplify web page creation
Modified: releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp (163783 => 163784)
--- releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp 2014-02-10 14:55:47 UTC (rev 163783)
+++ releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp 2014-02-10 15:00:47 UTC (rev 163784)
@@ -1037,11 +1037,12 @@
context->priv->uriSchemeRequests.remove(customProtocolID);
}
-void webkitWebContextCreatePageForWebView(WebKitWebContext* context, WebKitWebView* webView, WebKitWebViewGroup* webViewGroup)
+void webkitWebContextCreatePageForWebView(WebKitWebContext* context, WebKitWebView* webView, WebKitWebViewGroup* webViewGroup, WebKitWebView* relatedView)
{
WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(webView);
WebPageGroup* pageGroup = webViewGroup ? webkitWebViewGroupGetPageGroup(webViewGroup) : 0;
- webkitWebViewBaseCreateWebPage(webViewBase, context->priv->context.get(), pageGroup);
+ WebPageProxy* relatedPage = relatedView ? webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(relatedView)) : nullptr;
+ webkitWebViewBaseCreateWebPage(webViewBase, context->priv->context.get(), pageGroup, relatedPage);
WebPageProxy* page = webkitWebViewBaseGetPage(webViewBase);
context->priv->webViews.set(page->pageID(), webView);
Modified: releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebContextPrivate.h (163783 => 163784)
--- releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebContextPrivate.h 2014-02-10 14:55:47 UTC (rev 163783)
+++ releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebContextPrivate.h 2014-02-10 15:00:47 UTC (rev 163784)
@@ -42,7 +42,7 @@
void webkitWebContextStartLoadingCustomProtocol(WebKitWebContext*, uint64_t customProtocolID, API::URLRequest*);
void webkitWebContextStopLoadingCustomProtocol(WebKitWebContext*, uint64_t customProtocolID);
void webkitWebContextDidFinishLoadingCustomProtocol(WebKitWebContext*, uint64_t customProtocolID);
-void webkitWebContextCreatePageForWebView(WebKitWebContext*, WebKitWebView*, WebKitWebViewGroup*);
+void webkitWebContextCreatePageForWebView(WebKitWebContext*, WebKitWebView*, WebKitWebViewGroup*, WebKitWebView*);
void webkitWebContextWebViewDestroyed(WebKitWebContext*, WebKitWebView*);
WebKitWebView* webkitWebContextGetWebViewForPage(WebKitWebContext*, WebKit::WebPageProxy*);
WebKitWebViewGroup* webkitWebContextGetDefaultWebViewGroup(WebKitWebContext*);
Modified: releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp (163783 => 163784)
--- releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp 2014-02-10 14:55:47 UTC (rev 163783)
+++ releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp 2014-02-10 15:00:47 UTC (rev 163784)
@@ -132,6 +132,7 @@
PROP_0,
PROP_WEB_CONTEXT,
+ PROP_RELATED_VIEW,
PROP_GROUP,
PROP_TITLE,
PROP_ESTIMATED_LOAD_PROGRESS,
@@ -157,6 +158,7 @@
}
WebKitWebContext* context;
+ WebKitWebView* relatedView;
CString title;
CString customTextEncoding;
double estimatedLoadProgress;
@@ -502,7 +504,9 @@
WebKitWebView* webView = WEBKIT_WEB_VIEW(object);
WebKitWebViewPrivate* priv = webView->priv;
- webkitWebContextCreatePageForWebView(priv->context, webView, priv->group.get());
+ webkitWebContextCreatePageForWebView(priv->context, webView, priv->group.get(), priv->relatedView);
+ // The related view is only valid during the construction.
+ priv->relatedView = nullptr;
webkitWebViewBaseSetDownloadRequestHandler(WEBKIT_WEB_VIEW_BASE(webView), webkitWebViewHandleDownloadRequest);
@@ -531,6 +535,11 @@
webView->priv->context = webContext ? WEBKIT_WEB_CONTEXT(webContext) : webkit_web_context_get_default();
break;
}
+ case PROP_RELATED_VIEW: {
+ gpointer relatedView = g_value_get_object(value);
+ webView->priv->relatedView = relatedView ? WEBKIT_WEB_VIEW(relatedView) : nullptr;
+ break;
+ }
case PROP_GROUP: {
gpointer group = g_value_get_object(value);
webView->priv->group = group ? WEBKIT_WEB_VIEW_GROUP(group) : 0;
@@ -637,6 +646,25 @@
WEBKIT_TYPE_WEB_CONTEXT,
static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
/**
+ * WebKitWebView:related-view:
+ *
+ * The related #WebKitWebView used when creating the view to share the
+ * same web process. This property is not readable because the related
+ * web view is only valid during the object construction.
+ *
+ * Since: 2.4
+ */
+ g_object_class_install_property(
+ gObjectClass,
+ PROP_RELATED_VIEW,
+ g_param_spec_object(
+ "related-view",
+ _("Related WebView"),
+ _("The related WebKitWebView used when creating the view to share the same web process"),
+ WEBKIT_TYPE_WEB_VIEW,
+ static_cast<GParamFlags>(WEBKIT_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)));
+
+ /**
* WebKitWebView:group:
*
* The #WebKitWebViewGroup of the view.
@@ -890,6 +918,11 @@
* If this signal is handled the signal handler should return the
* newly created #WebKitWebView.
*
+ * When using %WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES
+ * process model, the new #WebKitWebView should be related to
+ * @web_view to share the same web process, see webkit_web_view_new_with_related_view
+ * for more details.
+ *
* The new #WebKitWebView should not be displayed to the user
* until the #WebKitWebView::ready-to-show signal is emitted.
*
@@ -1882,6 +1915,29 @@
}
/**
+ * webkit_web_view_new_with_related_view:
+ * @web_view: the related #WebKitWebView
+ *
+ * Creates a new #WebKitWebView sharing the same web process with @web_view.
+ * This method doesn't have any effect when %WEBKIT_PROCESS_MODEL_SHARED_SECONDARY_PROCESS
+ * process model is used, because a single web process is shared for all the web views in the
+ * same #WebKitWebContext. When using %WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES process model,
+ * this method should always be used when creating the #WebKitWebView in the #WebKitWebView::create signal.
+ * You can also use this method to implement other process models based on %WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES,
+ * like for example, sharing the same web process for all the views in the same security domain.
+ *
+ * Returns: (transfer full): The newly created #WebKitWebView widget
+ *
+ * Since: 2.4
+ */
+GtkWidget* webkit_web_view_new_with_related_view(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), nullptr);
+
+ return GTK_WIDGET(g_object_new(WEBKIT_TYPE_WEB_VIEW, "related-view", webView, nullptr));
+}
+
+/**
* webkit_web_view_new_with_group:
* @group: a #WebKitWebViewGroup
*
Modified: releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h (163783 => 163784)
--- releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h 2014-02-10 14:55:47 UTC (rev 163783)
+++ releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h 2014-02-10 15:00:47 UTC (rev 163784)
@@ -266,6 +266,9 @@
webkit_web_view_new_with_context (WebKitWebContext *context);
WEBKIT_API GtkWidget *
+webkit_web_view_new_with_related_view (WebKitWebView *web_view);
+
+WEBKIT_API GtkWidget *
webkit_web_view_new_with_group (WebKitWebViewGroup *group);
WEBKIT_API WebKitWebContext *
Modified: releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp (163783 => 163784)
--- releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp 2014-02-10 14:55:47 UTC (rev 163783)
+++ releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp 2014-02-10 15:00:47 UTC (rev 163784)
@@ -939,7 +939,7 @@
WebKitWebViewBase* webkitWebViewBaseCreate(WebContext* context, WebPageGroup* pageGroup)
{
WebKitWebViewBase* webkitWebViewBase = WEBKIT_WEB_VIEW_BASE(g_object_new(WEBKIT_TYPE_WEB_VIEW_BASE, NULL));
- webkitWebViewBaseCreateWebPage(webkitWebViewBase, context, pageGroup);
+ webkitWebViewBaseCreateWebPage(webkitWebViewBase, context, pageGroup, nullptr);
return webkitWebViewBase;
}
@@ -965,12 +965,13 @@
priv->pageProxy->pageGroup().preferences()->setAcceleratedCompositingEnabled(false);
}
-void webkitWebViewBaseCreateWebPage(WebKitWebViewBase* webkitWebViewBase, WebContext* context, WebPageGroup* pageGroup)
+void webkitWebViewBaseCreateWebPage(WebKitWebViewBase* webkitWebViewBase, WebContext* context, WebPageGroup* pageGroup, WebPageProxy* relatedPage)
{
WebKitWebViewBasePrivate* priv = webkitWebViewBase->priv;
WebPageConfiguration webPageConfiguration;
webPageConfiguration.pageGroup = pageGroup;
+ webPageConfiguration.relatedPage = relatedPage;
priv->pageProxy = context->createWebPage(*priv->pageClient, std::move(webPageConfiguration));
priv->pageProxy->initializeWebPage();
Modified: releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h (163783 => 163784)
--- releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h 2014-02-10 14:55:47 UTC (rev 163783)
+++ releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h 2014-02-10 15:00:47 UTC (rev 163784)
@@ -37,7 +37,7 @@
WebKitWebViewBase* webkitWebViewBaseCreate(WebKit::WebContext*, WebKit::WebPageGroup*);
GtkIMContext* webkitWebViewBaseGetIMContext(WebKitWebViewBase*);
WebKit::WebPageProxy* webkitWebViewBaseGetPage(WebKitWebViewBase*);
-void webkitWebViewBaseCreateWebPage(WebKitWebViewBase*, WebKit::WebContext*, WebKit::WebPageGroup*);
+void webkitWebViewBaseCreateWebPage(WebKitWebViewBase*, WebKit::WebContext*, WebKit::WebPageGroup*, WebKit::WebPageProxy*);
void webkitWebViewBaseSetTooltipText(WebKitWebViewBase*, const char*);
void webkitWebViewBaseSetTooltipArea(WebKitWebViewBase*, const WebCore::IntRect&);
void webkitWebViewBaseForwardNextKeyEvent(WebKitWebViewBase*);
Modified: releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt (163783 => 163784)
--- releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt 2014-02-10 14:55:47 UTC (rev 163783)
+++ releases/WebKitGTK/webkit-2.4/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt 2014-02-10 15:00:47 UTC (rev 163784)
@@ -95,6 +95,7 @@
<SUBSECTION>
webkit_web_view_new
webkit_web_view_new_with_context
+webkit_web_view_new_with_related_view
webkit_web_view_new_with_group
webkit_web_view_get_context
webkit_web_view_get_group
Modified: releases/WebKitGTK/webkit-2.4/Tools/ChangeLog (163783 => 163784)
--- releases/WebKitGTK/webkit-2.4/Tools/ChangeLog 2014-02-10 14:55:47 UTC (rev 163783)
+++ releases/WebKitGTK/webkit-2.4/Tools/ChangeLog 2014-02-10 15:00:47 UTC (rev 163784)
@@ -1,3 +1,20 @@
+2014-02-10 Carlos Garcia Campos <cgar...@igalia.com>
+
+ [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.
+
+ * 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):
+
2014-02-08 Adrian Perez de Castro <ape...@igalia.com>
[GTK] Make process model names properly meaningful
Modified: releases/WebKitGTK/webkit-2.4/Tools/MiniBrowser/gtk/BrowserWindow.c (163783 => 163784)
--- releases/WebKitGTK/webkit-2.4/Tools/MiniBrowser/gtk/BrowserWindow.c 2014-02-10 14:55:47 UTC (rev 163783)
+++ releases/WebKitGTK/webkit-2.4/Tools/MiniBrowser/gtk/BrowserWindow.c 2014-02-10 15:00:47 UTC (rev 163784)
@@ -346,7 +346,7 @@
static GtkWidget *webViewCreate(WebKitWebView *webView, BrowserWindow *window)
{
- WebKitWebView *newWebView = WEBKIT_WEB_VIEW(webkit_web_view_new_with_context(webkit_web_view_get_context(webView)));
+ WebKitWebView *newWebView = WEBKIT_WEB_VIEW(webkit_web_view_new_with_related_view(webView));
webkit_web_view_set_settings(newWebView, webkit_web_view_get_settings(webView));
GtkWidget *newWindow = browser_window_new(newWebView, GTK_WINDOW(window));
Modified: releases/WebKitGTK/webkit-2.4/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestMultiprocess.cpp (163783 => 163784)
--- releases/WebKitGTK/webkit-2.4/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestMultiprocess.cpp 2014-02-10 14:55:47 UTC (rev 163783)
+++ releases/WebKitGTK/webkit-2.4/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestMultiprocess.cpp 2014-02-10 15:00:47 UTC (rev 163784)
@@ -21,6 +21,7 @@
#include "TestMain.h"
#include "WebKitTestBus.h"
+#include "WebViewTest.h"
#include <webkit2/webkit2.h>
#include <wtf/Vector.h>
@@ -104,6 +105,99 @@
g_assert_cmpuint(test->webProcessPid(0), !=, test->webProcessPid(1));
}
+class UIClientMultiprocessTest: public WebViewTest {
+public:
+ MAKE_GLIB_TEST_FIXTURE(UIClientMultiprocessTest);
+
+ enum WebViewEvents {
+ Create,
+ ReadyToShow,
+ Close
+ };
+
+ static GtkWidget* viewCreateCallback(WebKitWebView* webView, UIClientMultiprocessTest* test)
+ {
+ return test->viewCreate(webView);
+ }
+
+ static void viewReadyToShowCallback(WebKitWebView* webView, UIClientMultiprocessTest* test)
+ {
+ test->viewReadyToShow(webView);
+ }
+
+ static void viewCloseCallback(WebKitWebView* webView, UIClientMultiprocessTest* test)
+ {
+ test->viewClose(webView);
+ }
+
+ UIClientMultiprocessTest()
+ {
+ webkit_settings_set_javascript_can_open_windows_automatically(webkit_web_view_get_settings(m_webView), TRUE);
+ g_signal_connect(m_webView, "create", G_CALLBACK(viewCreateCallback), this);
+ }
+
+ ~UIClientMultiprocessTest()
+ {
+ g_signal_handlers_disconnect_matched(m_webView, G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, this);
+ }
+
+ GtkWidget* viewCreate(WebKitWebView* webView)
+ {
+ g_assert(webView == m_webView);
+
+ GtkWidget* newWebView = webkit_web_view_new_with_related_view(webView);
+ g_object_ref_sink(newWebView);
+ assertObjectIsDeletedWhenTestFinishes(G_OBJECT(newWebView));
+ m_webViewEvents.append(Create);
+
+ g_signal_connect(newWebView, "ready-to-show", G_CALLBACK(viewReadyToShowCallback), this);
+ g_signal_connect(newWebView, "close", G_CALLBACK(viewCloseCallback), this);
+
+ return newWebView;
+ }
+
+ void viewReadyToShow(WebKitWebView* webView)
+ {
+ g_assert(m_webView != webView);
+ m_webViewEvents.append(ReadyToShow);
+ }
+
+ void viewClose(WebKitWebView* webView)
+ {
+ g_assert(m_webView != webView);
+
+ m_webViewEvents.append(Close);
+ g_object_unref(webView);
+ g_main_loop_quit(m_mainLoop);
+ }
+
+ void waitUntilNewWebViewClose()
+ {
+ g_main_loop_run(m_mainLoop);
+ }
+
+ Vector<WebViewEvents> m_webViewEvents;
+};
+
+static void testMultiprocessWebViewCreateReadyClose(UIClientMultiprocessTest* test, gconstpointer)
+{
+ // At this point the web process of the current view has already been created.
+ // We save it here to check that after window.open() the number of processes
+ // is the same.
+ guint32 processCountBefore = nextInitializationId - 1;
+ test->loadHtml("<html><body _onLoad_=\"window.open().close();\"></html>", nullptr);
+ test->waitUntilNewWebViewClose();
+
+ Vector<UIClientMultiprocessTest::WebViewEvents>& events = test->m_webViewEvents;
+ g_assert_cmpint(events.size(), ==, 3);
+ g_assert_cmpint(events[0], ==, UIClientMultiprocessTest::Create);
+ g_assert_cmpint(events[1], ==, UIClientMultiprocessTest::ReadyToShow);
+ g_assert_cmpint(events[2], ==, UIClientMultiprocessTest::Close);
+
+ guint32 processesCountAfter = nextInitializationId - 1;
+ g_assert_cmpuint(processesCountAfter, ==, processCountBefore);
+}
+
static void initializeWebExtensions(WebKitWebContext* context, gpointer)
{
initializeWebExtensionsSignalCount++;
@@ -133,6 +227,7 @@
return;
MultiprocessTest::add("WebKitWebContext", "process-per-web-view", testProcessPerWebView);
+ UIClientMultiprocessTest::add("WebKitWebView", "multiprocess-create-ready-close", testMultiprocessWebViewCreateReadyClose);
}
void afterAll()