Diff
Modified: trunk/Source/WebKit2/ChangeLog (102672 => 102673)
--- trunk/Source/WebKit2/ChangeLog 2011-12-13 13:13:08 UTC (rev 102672)
+++ trunk/Source/WebKit2/ChangeLog 2011-12-13 13:23:54 UTC (rev 102673)
@@ -1,3 +1,36 @@
+2011-12-13 Carlos Garcia Campos <cgar...@igalia.com>
+
+ [GTK] Initial UI client implementation for WebKit2 GTK +API
+ https://bugs.webkit.org/show_bug.cgi?id=69753
+
+ Reviewed by Martin Robinson.
+
+ * GNUmakefile.am: Add new files to compilation.
+ * UIProcess/API/gtk/WebKitUIClient.cpp: Added.
+ (createNewPage): Call webkitWebViewCreateNewPage.
+ (showPage): Call webkitWebViewReadyToShowPage.
+ (closePage): Call webkitWebViewClosePage.
+ (webkitUIClientAttachUIClientToPage): Initialize UI client and
+ attach it to the given page.
+ (webkit_ui_client_init):
+ (webkit_ui_client_class_init):
+ * UIProcess/API/gtk/WebKitUIClient.h: Added.
+ * UIProcess/API/gtk/WebKitWebView.cpp:
+ (webkitWebViewCreate): Default implementation of signal
+ WebKitWebView::create that simply returns NULL.
+ (webkitWebViewConstructed): Create the default UI client.
+ (webkitWebViewAccumulatorObjectHandled):
+ (webkit_web_view_class_init):
+ (webkitWebViewCreateNewPage): Emit create signal.
+ (webkitWebViewReadyToShowPage): Emit ready-to-show signal.
+ (webkitWebViewClosePage): Emit close signal.
+ * UIProcess/API/gtk/WebKitWebView.h:
+ * UIProcess/API/gtk/WebKitWebViewPrivate.h:
+ * UIProcess/API/gtk/tests/TestWebKitWebView.cpp:
+ (testWebViewCreateReadyClose):
+ (beforeAll):
+ * UIProcess/API/gtk/webkit2marshal.list:
+
2011-12-13 Caio Marcelo de Oliveira Filho <caio.olive...@openbossa.org>
[Qt][WK2] Move load & navigation related functions out of QtWebPageProxy
Modified: trunk/Source/WebKit2/GNUmakefile.am (102672 => 102673)
--- trunk/Source/WebKit2/GNUmakefile.am 2011-12-13 13:13:08 UTC (rev 102672)
+++ trunk/Source/WebKit2/GNUmakefile.am 2011-12-13 13:23:54 UTC (rev 102673)
@@ -527,6 +527,8 @@
Source/WebKit2/UIProcess/API/gtk/WebKitSettings.cpp \
Source/WebKit2/UIProcess/API/gtk/WebKitSettings.h \
Source/WebKit2/UIProcess/API/gtk/WebKitSettingsPrivate.h \
+ Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp \
+ Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.h \
Source/WebKit2/UIProcess/API/gtk/WebKitURIRequest.cpp \
Source/WebKit2/UIProcess/API/gtk/WebKitURIRequest.h \
Source/WebKit2/UIProcess/API/gtk/WebKitURIResponse.cpp \
Added: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp (0 => 102673)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp 2011-12-13 13:23:54 UTC (rev 102673)
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2011 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 "WebKitUIClient.h"
+
+#include "WebKitWebViewPrivate.h"
+#include "WebPageProxy.h"
+#include <WebKit2/WKBase.h>
+
+using namespace WebKit;
+
+G_DEFINE_TYPE(WebKitUIClient, webkit_ui_client, G_TYPE_OBJECT)
+
+static WKPageRef createNewPage(WKPageRef page, WKURLRequestRef, WKDictionaryRef, WKEventModifiers, WKEventMouseButton, const void*)
+{
+ return webkitWebViewCreateNewPage(WEBKIT_WEB_VIEW(toImpl(page)->viewWidget()));
+}
+
+static void showPage(WKPageRef page, const void*)
+{
+ webkitWebViewReadyToShowPage(WEBKIT_WEB_VIEW(toImpl(page)->viewWidget()));
+}
+
+static void closePage(WKPageRef page, const void*)
+{
+ webkitWebViewClosePage(WEBKIT_WEB_VIEW(toImpl(page)->viewWidget()));
+}
+
+void webkitUIClientAttachUIClientToPage(WebKitUIClient* uiClient, WKPageRef wkPage)
+{
+ WKPageUIClient wkUIClient = {
+ kWKPageUIClientCurrentVersion,
+ uiClient, // clientInfo
+ 0, // createNewPage_deprecatedForUseWithV0
+ showPage,
+ closePage,
+ 0, // takeFocus
+ 0, // focus
+ 0, // unfocus
+ 0, // runJavaScriptAlert
+ 0, // runJavaScriptConfirm
+ 0, // runJavaScriptPrompt
+ 0, // setStatusText
+ 0, // mouseDidMoveOverElement_deprecatedForUseWithV0
+ 0, // missingPluginButtonClicked
+ 0, // didNotHandleKeyEvent
+ 0, // didNotHandleWheelEvent
+ 0, // toolbarsAreVisible
+ 0, // setToolbarsAreVisible
+ 0, // menuBarIsVisible
+ 0, // setMenuBarIsVisible
+ 0, // statusBarIsVisible
+ 0, // setStatusBarIsVisible
+ 0, // isResizable
+ 0, // setIsResizable
+ 0, // getWindowFrame
+ 0, // setWindowFrame
+ 0, // runBeforeUnloadConfirmPanel
+ 0, // didDraw
+ 0, // pageDidScroll
+ 0, // exceededDatabaseQuota
+ 0, // runOpenPanel
+ 0, // decidePolicyForGeolocationPermissionRequest
+ 0, // headerHeight
+ 0, // footerHeight
+ 0, // drawHeader
+ 0, // drawFooter
+ 0, // printFrame
+ 0, // runModal
+ 0, // didCompleteRubberBandForMainFrame
+ 0, // saveDataToFileInDownloadsFolder
+ 0, // shouldInterruptJavaScript
+ createNewPage,
+ 0, // mouseDidMoveOverElement
+ 0, // decidePolicyForNotificationPermissionRequest
+ };
+ WKPageSetPageUIClient(wkPage, &wkUIClient);
+}
+
+static void webkit_ui_client_init(WebKitUIClient* client)
+{
+}
+
+static void webkit_ui_client_class_init(WebKitUIClientClass* clientClass)
+{
+}
Added: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.h (0 => 102673)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.h (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.h 2011-12-13 13:23:54 UTC (rev 102673)
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+#ifndef WebKitUIClient_h
+#define WebKitUIClient_h
+
+#include <WebKit2/WebKit2.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_UI_CLIENT (webkit_ui_client_get_type())
+#define WEBKIT_UI_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_UI_CLIENT, WebKitUIClient))
+#define WEBKIT_UI_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), WEBKIT_TYPE_UI_CLIENT, WebKitUIClientClass))
+#define WEBKIT_IS_UI_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_UI_CLIENT))
+#define WEBKIT_IS_UI_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), WEBKIT_TYPE_UI_CLIENT))
+#define WEBKIT_UI_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), WEBKIT_TYPE_UI_CLIENT, WebKitUIClientClass))
+
+typedef struct _WebKitUIClient WebKitUIClient;
+typedef struct _WebKitUIClientClass WebKitUIClientClass;
+
+struct _WebKitUIClient {
+ GObject parent;
+};
+
+struct _WebKitUIClientClass {
+ GObjectClass parent_class;
+};
+
+GType webkit_ui_client_get_type (void);
+
+void webkitUIClientAttachUIClientToPage(WebKitUIClient*, WKPageRef);
+
+G_END_DECLS
+
+#endif
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp (102672 => 102673)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp 2011-12-13 13:13:08 UTC (rev 102672)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp 2011-12-13 13:23:54 UTC (rev 102673)
@@ -22,7 +22,9 @@
#include "WebKitWebView.h"
#include "WebKitBackForwardListPrivate.h"
+#include "WebKitMarshal.h"
#include "WebKitSettingsPrivate.h"
+#include "WebKitUIClient.h"
#include "WebKitWebContextPrivate.h"
#include "WebKitWebLoaderClient.h"
#include "WebKitWebLoaderClientPrivate.h"
@@ -41,6 +43,14 @@
using namespace WebCore;
enum {
+ CREATE,
+ READY_TO_SHOW,
+ CLOSE,
+
+ LAST_SIGNAL
+};
+
+enum {
PROP_0,
PROP_WEB_CONTEXT,
@@ -57,12 +67,20 @@
CString activeURI;
GRefPtr<WebKitWebLoaderClient> loaderClient;
+ GRefPtr<WebKitUIClient> uiClient;
GRefPtr<WebKitBackForwardList> backForwardList;
GRefPtr<WebKitSettings> settings;
};
+static guint signals[LAST_SIGNAL] = { 0, };
+
G_DEFINE_TYPE(WebKitWebView, webkit_web_view, WEBKIT_TYPE_WEB_VIEW_BASE)
+static GtkWidget* webkitWebViewCreate(WebKitWebView*)
+{
+ return 0;
+}
+
static void webkitWebViewSetLoaderClient(WebKitWebView* webView, WebKitWebLoaderClient* loaderClient, WKPageRef wkPage)
{
webView->priv->loaderClient = loaderClient;
@@ -85,6 +103,10 @@
static GRefPtr<WebKitWebLoaderClient> defaultLoaderClient = adoptGRef(WEBKIT_WEB_LOADER_CLIENT(g_object_new(WEBKIT_TYPE_WEB_LOADER_CLIENT, NULL)));
webkitWebViewSetLoaderClient(webView, defaultLoaderClient.get(), toAPI(page));
+ static GRefPtr<WebKitUIClient> defaultUIClient = adoptGRef(WEBKIT_UI_CLIENT(g_object_new(WEBKIT_TYPE_UI_CLIENT, NULL)));
+ priv->uiClient = defaultUIClient.get();
+ webkitUIClientAttachUIClientToPage(priv->uiClient.get(), toAPI(page));
+
priv->backForwardList = adoptGRef(webkitBackForwardListCreate(WKPageGetBackForwardList(toAPI(page))));
priv->settings = adoptGRef(webkit_settings_new());
webkitSettingsAttachSettingsToPage(priv->settings.get(), toAPI(page));
@@ -138,6 +160,15 @@
new (priv) WebKitWebViewPrivate();
}
+static gboolean webkitWebViewAccumulatorObjectHandled(GSignalInvocationHint*, GValue* returnValue, const GValue* handlerReturn, gpointer)
+{
+ void* object = g_value_get_object(handlerReturn);
+ if (object)
+ g_value_set_object(returnValue, object);
+
+ return !object;
+}
+
static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass)
{
GObjectClass* gObjectClass = G_OBJECT_CLASS(webViewClass);
@@ -147,6 +178,8 @@
gObjectClass->get_property = webkitWebViewGetProperty;
gObjectClass->finalize = webkitWebViewFinalize;
+ webViewClass->create = webkitWebViewCreate;
+
g_type_class_add_private(webViewClass, sizeof(WebKitWebViewPrivate));
/**
@@ -207,6 +240,66 @@
"The current active URI of the view",
0,
WEBKIT_PARAM_READABLE));
+
+ /**
+ * WebKitWebView::create:
+ * @web_view: the #WebKitWebView on which the signal is emitted
+ *
+ * Emitted when the creation of a new #WebKitWebView is requested.
+ * If this signal is handled the signal handler should return the
+ * newly created #WebKitWebView.
+ *
+ * The new #WebKitWebView should not be displayed to the user
+ * until the #WebKitWebView::ready-to-show signal is emitted.
+ *
+ * Returns: (transfer full): a newly allocated #WebKitWebView widget
+ * or %NULL to propagate the event further.
+ */
+ signals[CREATE] =
+ g_signal_new("create",
+ G_TYPE_FROM_CLASS(webViewClass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(WebKitWebViewClass, create),
+ webkitWebViewAccumulatorObjectHandled, 0,
+ webkit_marshal_OBJECT__VOID,
+ GTK_TYPE_WIDGET, 0);
+
+ /**
+ * WebKitWebView::ready-to-show:
+ * @web_view: the #WebKitWebView on which the signal is emitted
+ *
+ * Emitted after #WebKitWebView::create on the newly created #WebKitWebView
+ * when it should be displayed to the user. When this signal is emitted
+ * all the information about how the window should look, including
+ * size, position, whether the location, status and scrollbars
+ * should be displayed, is already set.
+ */
+ signals[READY_TO_SHOW] =
+ g_signal_new("ready-to-show",
+ G_TYPE_FROM_CLASS(webViewClass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(WebKitWebViewClass, ready_to_show),
+ 0, 0,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ /**
+ * WebKitWebView::close:
+ * @webView: the #WebKitWebView on which the signal is emitted
+ *
+ * Emitted when closing a #WebKitWebView is requested. This occurs when a
+ * call is made from _javascript_'s <function>window.close</function> function.
+ * It is the owner's responsibility to handle this signal to hide or
+ * destroy the #WebKitWebView, if necessary.
+ */
+ signals[CLOSE] =
+ g_signal_new("close",
+ G_TYPE_FROM_CLASS(webViewClass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(WebKitWebViewClass, close),
+ 0, 0,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
}
void webkitWebViewSetTitle(WebKitWebView* webView, const CString& title)
@@ -242,6 +335,26 @@
g_object_notify(G_OBJECT(webView), "uri");
}
+WKPageRef webkitWebViewCreateNewPage(WebKitWebView* webView)
+{
+ WebKitWebView* newWebView;
+ g_signal_emit(webView, signals[CREATE], 0, &newWebView);
+ if (!newWebView)
+ return 0;
+
+ return static_cast<WKPageRef>(WKRetain(toAPI(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(newWebView)))));
+}
+
+void webkitWebViewReadyToShowPage(WebKitWebView* webView)
+{
+ g_signal_emit(webView, signals[READY_TO_SHOW], 0, NULL);
+}
+
+void webkitWebViewClosePage(WebKitWebView* webView)
+{
+ g_signal_emit(webView, signals[CLOSE], 0, NULL);
+}
+
/**
* webkit_web_view_new:
*
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h (102672 => 102673)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h 2011-12-13 13:13:08 UTC (rev 102672)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h 2011-12-13 13:23:54 UTC (rev 102673)
@@ -57,6 +57,10 @@
struct _WebKitWebViewClass {
WebKitWebViewBaseClass parent;
+ GtkWidget *(* create) (WebKitWebView *web_view);
+ void (* ready_to_show) (WebKitWebView *web_view);
+ void (* close) (WebKitWebView *web_view);
+
/* Padding for future expansion */
void (*_webkit_reserved0) (void);
void (*_webkit_reserved1) (void);
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h (102672 => 102673)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h 2011-12-13 13:13:08 UTC (rev 102672)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h 2011-12-13 13:23:54 UTC (rev 102673)
@@ -34,5 +34,8 @@
void webkitWebViewSetEstimatedLoadProgress(WebKitWebView*, double estimatedLoadProgress);
void webkitWebViewSetTitle(WebKitWebView*, const CString&);
void webkitWebViewUpdateURI(WebKitWebView*);
+WKPageRef webkitWebViewCreateNewPage(WebKitWebView*);
+void webkitWebViewReadyToShowPage(WebKitWebView*);
+void webkitWebViewClosePage(WebKitWebView*);
#endif // WebKitWebViewPrivate_h
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp (102672 => 102673)
--- trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp 2011-12-13 13:13:08 UTC (rev 102672)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp 2011-12-13 13:23:54 UTC (rev 102673)
@@ -19,7 +19,6 @@
#include "config.h"
#include "WebViewTest.h"
-#include "LoadTrackingTest.h"
#include <wtf/gobject/GRefPtr.h>
static void testWebViewDefaultContext(WebViewTest* test, gconstpointer)
@@ -76,12 +75,86 @@
g_assert(webkit_settings_get_enable_javascript(settings));
}
+class UIClientTest: public WebViewTest {
+public:
+ MAKE_GLIB_TEST_FIXTURE(UIClientTest);
+
+ enum WebViewEvents {
+ Create,
+ ReadyToShow,
+ Close
+ };
+
+ static void viewClose(WebKitWebView* webView, UIClientTest* test)
+ {
+ g_assert(webView != test->m_webView);
+
+ test->m_webViewEvents.append(Close);
+ g_object_unref(webView);
+
+ g_main_loop_quit(test->m_mainLoop);
+ }
+
+ static void viewReadyToShow(WebKitWebView* webView, UIClientTest* test)
+ {
+ g_assert(webView != test->m_webView);
+
+ test->m_webViewEvents.append(ReadyToShow);
+ }
+
+ static GtkWidget* viewCreate(WebKitWebView* webView, UIClientTest* test)
+ {
+ g_assert(webView == test->m_webView);
+
+ GtkWidget* newWebView = webkit_web_view_new_with_context(webkit_web_view_get_context(webView));
+ g_object_ref_sink(newWebView);
+
+ test->m_webViewEvents.append(Create);
+
+ g_signal_connect(newWebView, "ready-to-show", G_CALLBACK(viewReadyToShow), test);
+ g_signal_connect(newWebView, "close", G_CALLBACK(viewClose), test);
+
+ return newWebView;
+ }
+
+ UIClientTest()
+ {
+ webkit_settings_set_javascript_can_open_windows_automatically(webkit_web_view_get_settings(m_webView), TRUE);
+ g_signal_connect(m_webView, "create", G_CALLBACK(viewCreate), this);
+ }
+
+ ~UIClientTest()
+ {
+ g_signal_handlers_disconnect_matched(m_webView, G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, this);
+ }
+
+ void waitUntilMainLoopFinishes()
+ {
+ g_main_loop_run(m_mainLoop);
+ }
+
+ Vector<WebViewEvents> m_webViewEvents;
+};
+
+static void testWebViewCreateReadyClose(UIClientTest* test, gconstpointer)
+{
+ test->loadHtml("<html><body _onLoad_=\"window.open().close();\"></html>", 0);
+ test->waitUntilMainLoopFinishes();
+
+ Vector<UIClientTest::WebViewEvents>& events = test->m_webViewEvents;
+ g_assert_cmpint(events.size(), ==, 3);
+ g_assert_cmpint(events[0], ==, UIClientTest::Create);
+ g_assert_cmpint(events[1], ==, UIClientTest::ReadyToShow);
+ g_assert_cmpint(events[2], ==, UIClientTest::Close);
+}
+
void beforeAll()
{
WebViewTest::add("WebKitWebView", "default-context", testWebViewDefaultContext);
WebViewTest::add("WebKitWebView", "custom-charset", testWebViewCustomCharset);
Test::add("WebKitWebView", "webviews-share-clients", testWebViewsShareClients);
WebViewTest::add("WebKitWebView", "settings", testWebViewSettings);
+ UIClientTest::add("WebKitWebView", "create-ready-close", testWebViewCreateReadyClose);
}
void afterAll()
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/webkit2marshal.list (102672 => 102673)
--- trunk/Source/WebKit2/UIProcess/API/gtk/webkit2marshal.list 2011-12-13 13:13:08 UTC (rev 102672)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/webkit2marshal.list 2011-12-13 13:23:54 UTC (rev 102673)
@@ -1,5 +1,6 @@
BOOLEAN:OBJECT,STRING,POINTER
BOOLEAN:OBJECT
BOOLEAN:VOID
+OBJECT:VOID
VOID:OBJECT,POINTER