summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-02-03 09:55:33 +0100
committerSimon Hausmann <simon.hausmann@nokia.com>2012-02-03 09:55:33 +0100
commitcd44dc59cdfc39534aef4d417e9f3c412e3be139 (patch)
tree8d89889ba95ed6ec9322e733846cc9cce9d7dff1 /Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp
parentd11f84f5b5cdc0d92a08af01b13472fdd5f9acb9 (diff)
downloadqtwebkit-cd44dc59cdfc39534aef4d417e9f3c412e3be139.tar.gz
Imported WebKit commit fce473cb4d55aa9fe9d0b0322a2fffecb731b961 (http://svn.webkit.org/repository/webkit/trunk@106560)
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp')
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp98
1 files changed, 80 insertions, 18 deletions
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp
index fd2bb5190..fcaa2db1d 100644
--- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp
+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp
@@ -24,20 +24,19 @@
#include "WebKitBackForwardListPrivate.h"
#include "WebKitEnumTypes.h"
#include "WebKitError.h"
+#include "WebKitLoaderClient.h"
#include "WebKitMarshal.h"
+#include "WebKitPolicyClient.h"
#include "WebKitSettingsPrivate.h"
#include "WebKitUIClient.h"
#include "WebKitWebContextPrivate.h"
-#include "WebKitWebLoaderClient.h"
#include "WebKitWebViewBasePrivate.h"
#include "WebKitWebViewPrivate.h"
#include "WebKitWindowPropertiesPrivate.h"
#include "WebKitPrivate.h"
#include "WebPageProxy.h"
#include <WebCore/DragIcon.h>
-#include <WebKit2/WKBase.h>
-#include <WebKit2/WKRetainPtr.h>
-#include <WebKit2/WKURL.h>
+#include <WebCore/GtkUtilities.h>
#include <glib/gi18n-lib.h>
#include <wtf/gobject/GOwnPtr.h>
#include <wtf/gobject/GRefPtr.h>
@@ -58,6 +57,8 @@ enum {
SCRIPT_CONFIRM,
SCRIPT_PROMPT,
+ DECIDE_POLICY,
+
LAST_SIGNAL
};
@@ -79,8 +80,6 @@ struct _WebKitWebViewPrivate {
CString activeURI;
bool replacingContent;
- GRefPtr<WebKitWebLoaderClient> loaderClient;
- GRefPtr<WebKitUIClient> uiClient;
GRefPtr<WebKitBackForwardList> backForwardList;
GRefPtr<WebKitSettings> settings;
GRefPtr<WebKitWindowProperties> windowProperties;
@@ -111,7 +110,7 @@ static GtkWidget* webkitWebViewCreate(WebKitWebView*)
static GtkWidget* webkitWebViewCreateJavaScriptDialog(WebKitWebView* webView, GtkMessageType type, GtkButtonsType buttons, int defaultResponse, const char* message)
{
GtkWidget* parent = gtk_widget_get_toplevel(GTK_WIDGET(webView));
- GtkWidget* dialog = gtk_message_dialog_new(gtk_widget_is_toplevel(parent) ? GTK_WINDOW(parent) : 0,
+ GtkWidget* dialog = gtk_message_dialog_new(widgetIsOnscreenToplevelWindow(parent) ? GTK_WINDOW(parent) : 0,
GTK_DIALOG_DESTROY_WITH_PARENT, type, buttons, "%s", message);
GOwnPtr<char> title(g_strdup_printf("JavaScript - %s", webkit_web_view_get_uri(webView)));
gtk_window_set_title(GTK_WINDOW(dialog), title.get());
@@ -149,10 +148,10 @@ static gboolean webkitWebViewScriptPrompt(WebKitWebView* webView, const char* me
return TRUE;
}
-static void webkitWebViewSetLoaderClient(WebKitWebView* webView, WebKitWebLoaderClient* loaderClient, WKPageRef wkPage)
+static gboolean webkitWebViewDecidePolicy(WebKitWebView*, WebKitPolicyDecision* decision, WebKitPolicyDecisionType)
{
- webView->priv->loaderClient = loaderClient;
- webkitWebLoaderClientAttachLoaderClientToPage(loaderClient, wkPage);
+ webkit_policy_decision_use(decision);
+ return TRUE;
}
static void webkitWebViewConstructed(GObject* object)
@@ -166,15 +165,11 @@ static void webkitWebViewConstructed(GObject* object)
webkitWebViewBaseCreateWebPage(webViewBase, webkitWebContextGetWKContext(priv->context), 0);
- WebPageProxy* page = webkitWebViewBaseGetPage(webViewBase);
-
- 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));
+ attachLoaderClientToView(webView);
+ attachUIClientToView(webView);
+ attachPolicyClientToPage(webView);
+ WebPageProxy* page = webkitWebViewBaseGetPage(webViewBase);
priv->backForwardList = adoptGRef(webkitBackForwardListCreate(WKPageGetBackForwardList(toAPI(page))));
priv->settings = adoptGRef(webkit_settings_new());
webkitSettingsAttachSettingsToPage(priv->settings.get(), toAPI(page));
@@ -259,6 +254,7 @@ static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass)
webViewClass->script_alert = webkitWebViewScriptAlert;
webViewClass->script_confirm = webkitWebViewScriptConfirm;
webViewClass->script_prompt = webkitWebViewScriptPrompt;
+ webViewClass->decide_policy = webkitWebViewDecidePolicy;
g_type_class_add_private(webViewClass, sizeof(WebKitWebViewPrivate));
@@ -557,6 +553,66 @@ static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass)
G_TYPE_BOOLEAN, 3,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
+ /**
+ * WebKitPolicyClient::decide-policy
+ * @web_view: the #WebKitWebView on which the signal is emitted
+ * @decision: the #WebKitNavigationPolicyDecision
+ * @decision_type: a #WebKitPolicyDecisionType denoting the type of @decision
+ *
+ * This signal is emitted when WebKit is requesting the client to decide a policy
+ * decision, such as whether to navigate to a page, open a new window or whether or
+ * not to download a resource. The #WebKitNavigationPolicyDecision passed in the
+ * @decision argument is a generic type, but should be casted to a more
+ * specific type when making the decision. For example:
+ *
+ * <informalexample><programlisting>
+ * static gboolean
+ * decide_policy_cb (WebKitWebView *web_view,
+ * WebKitPolicyDecision *decision,
+ * WebKitPolicyDecisionType type)
+ * {
+ * switch (type) {
+ * case WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION:
+ * WebKitNavigationPolicyDecision *navigation_decision = WEBKIT_NAVIGATION_POLICY_DECISION (decision);
+ * /<!-- -->* Make a policy decision here. *<!-- -->/
+ * break;
+ * case WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION:
+ * WebKitNavigationPolicyDecision *navigation_decision = WEBKIT_NAVIGATION_POLICY_DECISION (decision);
+ * /<!-- -->* Make a policy decision here. *<!-- -->/
+ * break;
+ * case WEBKIT_POLICY_DECISION_TYPE_RESPONSE:
+ * WebKitResponsePolicyDecision *response = WEBKIT_RESPONSE_POLICY_DECISION (decision);
+ * /<!-- -->* Make a policy decision here. *<!-- -->/
+ * break;
+ * default:
+ * /<!-- -->* Making no decision results in webkit_policy_decision_use(). *<!-- -->/
+ * return FALSE;
+ * }
+ * return TRUE;
+ * }
+ * </programlisting></informalexample>
+ *
+ * It is possible to make policy decision asynchronously, by simply calling g_object_ref()
+ * on the @decision argument and returning %TRUE to block the default signal handler.
+ * If the last reference is removed on a #WebKitPolicyDecision and no decision has been
+ * made explicitly, webkit_policy_decision_use() will be the default policy decision. The
+ * default signal handler will simply call webkit_policy_decision_use(). Only the first
+ * policy decision chosen for a given #WebKitPolicyDecision will have any affect.
+ *
+ * Returns: %TRUE to stop other handlers from being invoked for the event.
+ * %FALSE to propagate the event further.
+ *
+ */
+ signals[DECIDE_POLICY] =
+ g_signal_new("decide-policy",
+ G_TYPE_FROM_CLASS(webViewClass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(WebKitWebViewClass, decide_policy),
+ g_signal_accumulator_true_handled, 0 /* accumulator data */,
+ webkit_marshal_BOOLEAN__OBJECT_ENUM,
+ G_TYPE_BOOLEAN, 2, /* number of parameters */
+ WEBKIT_TYPE_POLICY_DECISION,
+ WEBKIT_TYPE_POLICY_DECISION_TYPE);
}
void webkitWebViewLoadChanged(WebKitWebView* webView, WebKitLoadEvent loadEvent)
@@ -662,6 +718,12 @@ WKStringRef webkitWebViewRunJavaScriptPrompt(WebKitWebView* webView, const CStri
return text ? WKStringCreateWithUTF8CString(text.get()) : 0;
}
+void webkitWebViewMakePolicyDecision(WebKitWebView* webView, WebKitPolicyDecisionType type, WebKitPolicyDecision* decision)
+{
+ gboolean returnValue;
+ g_signal_emit(webView, signals[DECIDE_POLICY], 0, decision, type, &returnValue);
+}
+
/**
* webkit_web_view_new:
*