X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-webkit-mime-part-view.c;h=fa1dd8de56c5bc90902eadaa329cd2e88b73f8ac;hb=0ca412c0351f777d1fb3e3ff12317a3068b01642;hp=51de7ea2da6c413b44bc46d388ed20f43055bf27;hpb=f01b90c66d8e39e31efdd85cc401934ada17bade;p=modest diff --git a/src/widgets/modest-webkit-mime-part-view.c b/src/widgets/modest-webkit-mime-part-view.c index 51de7ea..fa1dd8d 100644 --- a/src/widgets/modest-webkit-mime-part-view.c +++ b/src/widgets/modest-webkit-mime-part-view.c @@ -56,6 +56,28 @@ static void modest_webkit_mime_part_view_finalize (GObject *self); static void modest_webkit_mime_part_view_dispose (GObject *self); /* Webkit signal handlers */ +static void on_resource_request_starting (WebKitWebView *webview, + WebKitWebFrame *frame, + WebKitWebResource *resource, + WebKitNetworkRequest *request, + WebKitNetworkResponse *response, + gpointer userdata); +static gboolean on_new_window_policy_decision_requested (WebKitWebView *web_view, + WebKitWebFrame *frame, + WebKitNetworkRequest *request, + WebKitWebNavigationAction *navigation_action, + WebKitWebPolicyDecision *policy_decision, + gpointer user_data); +static gboolean on_navigation_policy_decision_requested (WebKitWebView *web_view, + WebKitWebFrame *frame, + WebKitNetworkRequest *request, + WebKitWebNavigationAction *navigation_action, + WebKitWebPolicyDecision *policy_decision, + gpointer user_data); +static WebKitNavigationResponse on_navigation_requested (WebKitWebView *web_view, + WebKitWebFrame *frame, + WebKitNetworkRequest *request, + gpointer user_data); static void on_notify_style (GObject *obj, GParamSpec *spec, gpointer userdata); static gboolean update_style (ModestWebkitMimePartView *self); /* TnyMimePartView implementation */ @@ -118,6 +140,7 @@ struct _ModestWebkitMimePartViewPrivate { gboolean view_images; gboolean has_external_images; GSList *sighandlers; + gchar *last_search; }; #define MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -274,6 +297,7 @@ modest_webkit_mime_part_view_init (ModestWebkitMimePartView *self) ModestWebkitMimePartViewPrivate *priv = MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE (self); GdkColor base; GdkColor text; + WebKitWebSettings *settings; gdk_color_parse ("#fff", &base); gdk_color_parse ("#000", &text); @@ -285,11 +309,40 @@ modest_webkit_mime_part_view_init (ModestWebkitMimePartView *self) priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, G_OBJECT(self), "notify::style", G_CALLBACK (on_notify_style), (gpointer) self); + priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, + G_OBJECT (self), "resource-request-starting", + G_CALLBACK (on_resource_request_starting), (gpointer) self); + priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, + G_OBJECT (self), "navigation-policy-decision-requested", + G_CALLBACK (on_navigation_policy_decision_requested), (gpointer) self); + priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, + G_OBJECT (self), "new-window-policy-decision-requested", + G_CALLBACK (on_new_window_policy_decision_requested), (gpointer) self); + priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, + G_OBJECT (self), "navigation-requested", + G_CALLBACK (on_navigation_requested), (gpointer) self); priv->part = NULL; + priv->last_search = NULL; priv->current_zoom = 1.0; priv->view_images = FALSE; priv->has_external_images = FALSE; + + settings = webkit_web_settings_new (); + g_object_set (G_OBJECT (settings), + "auto-load-images", FALSE, + "enable-html5-database", FALSE, + "enable-html5-local-storage", FALSE, + "enable-offline-web-application-cache", FALSE, + "enable-plugins", FALSE, + "enable-private-browsing", TRUE, + "enable-scripts", FALSE, + NULL); + webkit_web_view_set_settings (WEBKIT_WEB_VIEW (self), settings); + g_object_unref (settings); + g_object_set (G_OBJECT (self), + "editable", FALSE, + NULL); } static void @@ -299,6 +352,7 @@ modest_webkit_mime_part_view_finalize (GObject *obj) modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers); priv->sighandlers = NULL; + g_free (priv->last_search); G_OBJECT_CLASS (parent_class)->finalize (obj); } @@ -320,6 +374,97 @@ modest_webkit_mime_part_view_dispose (GObject *obj) /* WEBKIT SIGNALS HANDLERS */ +static WebKitNavigationResponse +on_navigation_requested (WebKitWebView *web_view, + WebKitWebFrame *frame, + WebKitNetworkRequest *request, + gpointer user_data) +{ + const gchar *uri; + + uri = webkit_network_request_get_uri (request); + if (g_strcmp0 (uri, "about:blank") == 0) { + return WEBKIT_NAVIGATION_RESPONSE_ACCEPT; + } else if (g_str_has_prefix (uri, "cid:") == 0) { + return WEBKIT_NAVIGATION_RESPONSE_DOWNLOAD; + } else { + return WEBKIT_NAVIGATION_RESPONSE_ACCEPT; + } +} + +static void +on_resource_request_starting (WebKitWebView *webview, + WebKitWebFrame *frame, + WebKitWebResource *resource, + WebKitNetworkRequest *request, + WebKitNetworkResponse *response, + gpointer userdata) +{ + ModestWebkitMimePartView *self = (ModestWebkitMimePartView *) userdata; + g_return_if_fail (MODEST_IS_WEBKIT_MIME_PART_VIEW (self)); + + if (g_str_has_prefix (webkit_network_request_get_uri (request), "http:")) { + ModestWebkitMimePartViewPrivate *priv = MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE (self); + + if (!priv->view_images) + priv->has_external_images = TRUE; + } + + webkit_network_request_set_uri (request, "about:blank"); +} + +static gboolean +on_navigation_policy_decision_requested (WebKitWebView *web_view, + WebKitWebFrame *frame, + WebKitNetworkRequest *request, + WebKitWebNavigationAction *navigation_action, + WebKitWebPolicyDecision *policy_decision, + gpointer user_data) +{ + WebKitWebNavigationReason reason; + reason = webkit_web_navigation_action_get_reason (navigation_action); + if (reason == WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED) { + const gchar *uri; + gboolean result; + + webkit_web_policy_decision_ignore (policy_decision); + uri = webkit_network_request_get_uri (WEBKIT_NETWORK_REQUEST (request)); + g_signal_emit_by_name (G_OBJECT (user_data), "activate-link", uri, &result); + + return TRUE; + } else if (reason != WEBKIT_WEB_NAVIGATION_REASON_OTHER) { + webkit_web_policy_decision_ignore (policy_decision); + return TRUE; + } + return FALSE; +} + +static gboolean +on_new_window_policy_decision_requested (WebKitWebView *web_view, + WebKitWebFrame *frame, + WebKitNetworkRequest *request, + WebKitWebNavigationAction *navigation_action, + WebKitWebPolicyDecision *policy_decision, + gpointer user_data) +{ + WebKitWebNavigationReason reason; + reason = webkit_web_navigation_action_get_reason (navigation_action); + if (reason == WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED) { + const gchar *uri; + gboolean result; + + webkit_web_policy_decision_ignore (policy_decision); + uri = webkit_network_request_get_uri (WEBKIT_NETWORK_REQUEST (request)); + g_signal_emit_by_name (G_OBJECT (user_data), "activate-link", uri, &result); + + return TRUE; + } else if (reason != WEBKIT_WEB_NAVIGATION_REASON_OTHER) { + webkit_web_policy_decision_ignore (policy_decision); + return TRUE; + } + return FALSE; +} + static void on_notify_style (GObject *obj, GParamSpec *spec, gpointer userdata) { @@ -586,6 +731,7 @@ set_zoom (ModestWebkitMimePartView *self, gdouble zoom) priv = MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE (self); priv->current_zoom = zoom; + webkit_web_view_set_zoom_level (WEBKIT_WEB_VIEW (self), zoom); gtk_widget_queue_resize (GTK_WIDGET (self)); } @@ -605,13 +751,29 @@ static gboolean search (ModestWebkitMimePartView *self, const gchar *string) { - return FALSE; + ModestWebkitMimePartViewPrivate *priv; + + g_return_val_if_fail (MODEST_IS_WEBKIT_MIME_PART_VIEW (self), FALSE); + + priv = MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE (self); + g_free (priv->last_search); + priv->last_search = g_strdup (string); + webkit_web_view_mark_text_matches (WEBKIT_WEB_VIEW (self), priv->last_search, FALSE, 0); + webkit_web_view_set_highlight_text_matches (WEBKIT_WEB_VIEW (self), TRUE); + return webkit_web_view_search_text (WEBKIT_WEB_VIEW (self), priv->last_search, FALSE, TRUE, TRUE); } static gboolean search_next (ModestWebkitMimePartView *self) { - return FALSE; + ModestWebkitMimePartViewPrivate *priv; + + g_return_val_if_fail (MODEST_IS_WEBKIT_MIME_PART_VIEW (self), FALSE); + + priv = MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE (self); + webkit_web_view_mark_text_matches (WEBKIT_WEB_VIEW (self), priv->last_search, FALSE, 0); + webkit_web_view_set_highlight_text_matches (WEBKIT_WEB_VIEW (self), TRUE); + return webkit_web_view_search_text (WEBKIT_WEB_VIEW (self), priv->last_search, FALSE, TRUE, FALSE); } static gboolean