diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-03 09:55:33 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-03 09:55:33 +0100 |
commit | cd44dc59cdfc39534aef4d417e9f3c412e3be139 (patch) | |
tree | 8d89889ba95ed6ec9322e733846cc9cce9d7dff1 /Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp | |
parent | d11f84f5b5cdc0d92a08af01b13472fdd5f9acb9 (diff) | |
download | qtwebkit-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.cpp | 98 |
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: * |