From 6d2c382788a4042d53f49a080acd11b499aa52f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Vr=C3=A1til?= Date: Wed, 28 Mar 2012 18:38:11 +0200 Subject: WebKit port - port formatter and mail module --- modules/Makefile.am | 1 + modules/addressbook/e-book-shell-content.c | 9 -- modules/mail/e-mail-config-format-html.c | 5 + modules/mail/e-mail-config-web-view.c | 6 - modules/mail/e-mail-shell-backend.c | 57 ++++++-- modules/mail/e-mail-shell-content.c | 9 +- modules/mail/e-mail-shell-view-actions.c | 116 +++++++++------ modules/mail/e-mail-shell-view-private.c | 100 ++----------- modules/mail/em-mailer-prefs.c | 6 +- modules/web-inspector/Makefile.am | 23 +++ modules/web-inspector/evolution-web-inspector.c | 185 ++++++++++++++++++++++++ 11 files changed, 351 insertions(+), 166 deletions(-) create mode 100644 modules/web-inspector/Makefile.am create mode 100644 modules/web-inspector/evolution-web-inspector.c (limited to 'modules') diff --git a/modules/Makefile.am b/modules/Makefile.am index ee3cdfdb1a..671215b952 100644 --- a/modules/Makefile.am +++ b/modules/Makefile.am @@ -35,6 +35,7 @@ SUBDIRS = \ plugin-manager \ spamassassin \ startup-wizard \ + web-inspector \ $(MONO_DIR) \ $(PYTHON_DIR) \ $(ONLINE_ACCOUNTS_DIR) \ diff --git a/modules/addressbook/e-book-shell-content.c b/modules/addressbook/e-book-shell-content.c index 0183512f5b..f3457e8999 100644 --- a/modules/addressbook/e-book-shell-content.c +++ b/modules/addressbook/e-book-shell-content.c @@ -286,19 +286,10 @@ book_shell_content_constructed (GObject *object) EAB_CONTACT_DISPLAY (widget), EAB_CONTACT_DISPLAY_RENDER_NORMAL); - eab_contact_display_set_orientation ( - EAB_CONTACT_DISPLAY (widget), - priv->orientation); - eab_contact_display_set_show_maps ( EAB_CONTACT_DISPLAY (widget), priv->preview_show_maps); - g_object_bind_property ( - object, "orientation", - widget, "orientation", - G_BINDING_SYNC_CREATE); - g_object_bind_property ( object, "preview-show-maps", widget, "show-maps", diff --git a/modules/mail/e-mail-config-format-html.c b/modules/mail/e-mail-config-format-html.c index 31ca88b744..dad5f9a518 100644 --- a/modules/mail/e-mail-config-format-html.c +++ b/modules/mail/e-mail-config-format-html.c @@ -76,6 +76,11 @@ mail_config_format_html_constructed (GObject *object) extensible, "show-real-date", G_BINDING_SYNC_CREATE); + g_object_bind_property ( + shell_settings, "mail-show-animated-images", + extensible, "animate-images", + G_BINDING_SYNC_CREATE); + /* Chain up to parent's constructed() method. */ G_OBJECT_CLASS (parent_class)->constructed (object); } diff --git a/modules/mail/e-mail-config-web-view.c b/modules/mail/e-mail-config-web-view.c index 80f3f65c0f..813256efd1 100644 --- a/modules/mail/e-mail-config-web-view.c +++ b/modules/mail/e-mail-config-web-view.c @@ -149,12 +149,6 @@ static void mail_config_web_view_realize (GtkWidget *widget, EMailConfigWebView *extension) { - g_object_bind_property ( - extension->shell_settings, - "mail-show-animated-images", - widget, "animate", - G_BINDING_SYNC_CREATE); - g_object_bind_property ( extension->shell_settings, "composer-inline-spelling", diff --git a/modules/mail/e-mail-shell-backend.c b/modules/mail/e-mail-shell-backend.c index 25902f34df..a30c0240de 100644 --- a/modules/mail/e-mail-shell-backend.c +++ b/modules/mail/e-mail-shell-backend.c @@ -835,37 +835,70 @@ e_mail_labels_get_filter_options (void) return g_slist_reverse (list); } +static void +message_parsed_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + EMFormatHTML *formatter = EM_FORMAT_HTML (source_object); + GObject *preview = user_data; + EMailDisplay *display; + + display = g_object_get_data (preview, "mbox-imp-display"); + e_mail_display_set_formatter (display, formatter); + e_mail_display_load (display, EM_FORMAT (formatter)->uri_base); +} + /* utility functions for mbox importer */ static void mbox_create_preview_cb (GObject *preview, GtkWidget **preview_widget) { - EMFormatHTMLDisplay *format; - EWebView *web_view; + EMailDisplay *display; g_return_if_fail (preview != NULL); g_return_if_fail (preview_widget != NULL); - format = em_format_html_display_new (); - g_object_set_data_full ( - preview, "mbox-imp-formatter", format, g_object_unref); - web_view = em_format_html_get_web_view (EM_FORMAT_HTML (format)); + display = g_object_new (E_TYPE_MAIL_DISPLAY, NULL); + g_object_set_data_full (preview, "mbox-imp-display", + g_object_ref (display), g_object_unref); - *preview_widget = GTK_WIDGET (web_view); + *preview_widget = GTK_WIDGET (display); } static void mbox_fill_preview_cb (GObject *preview, CamelMimeMessage *msg) { - EMFormatHTMLDisplay *format; + EMailDisplay *display; + EMFormat *formatter; + GHashTable *formatters; + SoupSession *session; + gchar *mail_uri; g_return_if_fail (preview != NULL); g_return_if_fail (msg != NULL); - format = g_object_get_data (preview, "mbox-imp-formatter"); - g_return_if_fail (format != NULL); + display = g_object_get_data (preview, "mbox-imp-display"); + g_return_if_fail (display != NULL); + + session = webkit_get_default_session (); + formatters = g_object_get_data (G_OBJECT (session), "formatters"); + if (!formatters) { + formatters = g_hash_table_new_full (g_str_hash, g_str_equal, + (GDestroyNotify) g_free, NULL); + g_object_set_data (G_OBJECT (session), "formatters", formatters); + } + + mail_uri = em_format_build_mail_uri (NULL, msg->message_id, NULL, NULL); + + formatter = EM_FORMAT (em_format_html_display_new ()); + formatter->message_uid = g_strdup (msg->message_id); + formatter->uri_base = g_strdup (mail_uri); + + /* Don't free the mail_uri!! */ + g_hash_table_insert (formatters, mail_uri, formatter); - /* FIXME Not passing a GCancellable here. */ - em_format_format (EM_FORMAT (format), NULL, NULL, msg, NULL); + em_format_parse_async (formatter, msg, NULL, NULL, + message_parsed_cb, preview); } diff --git a/modules/mail/e-mail-shell-content.c b/modules/mail/e-mail-shell-content.c index 5bb60e3784..1bf6d4e29a 100644 --- a/modules/mail/e-mail-shell-content.c +++ b/modules/mail/e-mail-shell-content.c @@ -307,8 +307,8 @@ mail_shell_content_get_backend (EMailReader *reader) return e_mail_reader_get_backend (reader); } -static EMFormatHTML * -mail_shell_content_get_formatter (EMailReader *reader) +static EMailDisplay * +mail_shell_content_get_mail_display (EMailReader *reader) { EMailShellContent *mail_shell_content; @@ -317,8 +317,7 @@ mail_shell_content_get_formatter (EMailReader *reader) /* Forward this to our internal EMailView, which * also implements the EMailReader interface. */ reader = E_MAIL_READER (mail_shell_content->priv->mail_view); - - return e_mail_reader_get_formatter (reader); + return e_mail_reader_get_mail_display (reader); } static gboolean @@ -464,7 +463,7 @@ e_mail_shell_content_reader_init (EMailReaderInterface *interface) { interface->get_action_group = mail_shell_content_get_action_group; interface->get_backend = mail_shell_content_get_backend; - interface->get_formatter = mail_shell_content_get_formatter; + interface->get_mail_display = mail_shell_content_get_mail_display; interface->get_hide_deleted = mail_shell_content_get_hide_deleted; interface->get_message_list = mail_shell_content_get_message_list; interface->get_popup_menu = mail_shell_content_get_popup_menu; diff --git a/modules/mail/e-mail-shell-view-actions.c b/modules/mail/e-mail-shell-view-actions.c index b39d22d13d..5487920c74 100644 --- a/modules/mail/e-mail-shell-view-actions.c +++ b/modules/mail/e-mail-shell-view-actions.c @@ -891,14 +891,16 @@ action_mail_smart_backward_cb (GtkAction *action, EMailShellContent *mail_shell_content; EMailShellSidebar *mail_shell_sidebar; EMFolderTree *folder_tree; - EMFormatHTML *formatter; EMailReader *reader; EMailView *mail_view; GtkWidget *message_list; GtkToggleAction *toggle_action; - EWebView *web_view; + GtkWidget *window; + GtkAdjustment *adj; + EMailDisplay *display; gboolean caret_mode; gboolean magic_spacebar; + gdouble value; /* This implements the so-called "Magic Backspace". */ @@ -914,7 +916,7 @@ action_mail_smart_backward_cb (GtkAction *action, folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar); reader = E_MAIL_READER (mail_view); - formatter = e_mail_reader_get_formatter (reader); + display = e_mail_reader_get_mail_display (reader); message_list = e_mail_reader_get_message_list (reader); magic_spacebar = e_shell_settings_get_boolean ( @@ -923,32 +925,43 @@ action_mail_smart_backward_cb (GtkAction *action, toggle_action = GTK_TOGGLE_ACTION (ACTION (MAIL_CARET_MODE)); caret_mode = gtk_toggle_action_get_active (toggle_action); - web_view = em_format_html_get_web_view (formatter); - - if (e_web_view_scroll_backward (web_view)) + window = gtk_widget_get_parent (GTK_WIDGET (display)); + if (!GTK_IS_SCROLLED_WINDOW (window)) return; - if (caret_mode || !magic_spacebar) - return; + adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (window)); + value = gtk_adjustment_get_value (adj); + if (value == 0) { - /* XXX Are two separate calls really necessary? */ + if (caret_mode || !magic_spacebar) + return; - if (message_list_select ( - MESSAGE_LIST (message_list), - MESSAGE_LIST_SELECT_PREVIOUS, - 0, CAMEL_MESSAGE_SEEN)) - return; + /* XXX Are two separate calls really necessary? */ - if (message_list_select ( - MESSAGE_LIST (message_list), - MESSAGE_LIST_SELECT_PREVIOUS | - MESSAGE_LIST_SELECT_WRAP, 0, - CAMEL_MESSAGE_SEEN)) - return; + if (message_list_select ( + MESSAGE_LIST (message_list), + MESSAGE_LIST_SELECT_PREVIOUS, + 0, CAMEL_MESSAGE_SEEN)) + return; + + if (message_list_select ( + MESSAGE_LIST (message_list), + MESSAGE_LIST_SELECT_PREVIOUS | + MESSAGE_LIST_SELECT_WRAP, + 0, CAMEL_MESSAGE_SEEN)) + return; + + em_folder_tree_select_next_path (folder_tree, TRUE); - em_folder_tree_select_prev_path (folder_tree, TRUE); + gtk_widget_grab_focus (message_list); - gtk_widget_grab_focus (message_list); + } else { + + gtk_adjustment_set_value (adj, + value - gtk_adjustment_get_page_increment (adj)); + + return; + } } static void @@ -962,14 +975,17 @@ action_mail_smart_forward_cb (GtkAction *action, EMailShellContent *mail_shell_content; EMailShellSidebar *mail_shell_sidebar; EMFolderTree *folder_tree; - EMFormatHTML *formatter; EMailReader *reader; EMailView *mail_view; GtkWidget *message_list; + GtkWidget *window; + GtkAdjustment *adj; GtkToggleAction *toggle_action; - EWebView *web_view; + EMailDisplay *display; gboolean caret_mode; gboolean magic_spacebar; + gdouble value; + gdouble upper; /* This implements the so-called "Magic Spacebar". */ @@ -985,7 +1001,7 @@ action_mail_smart_forward_cb (GtkAction *action, folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar); reader = E_MAIL_READER (mail_view); - formatter = e_mail_reader_get_formatter (reader); + display = e_mail_reader_get_mail_display (reader); message_list = e_mail_reader_get_message_list (reader); magic_spacebar = e_shell_settings_get_boolean ( @@ -994,32 +1010,44 @@ action_mail_smart_forward_cb (GtkAction *action, toggle_action = GTK_TOGGLE_ACTION (ACTION (MAIL_CARET_MODE)); caret_mode = gtk_toggle_action_get_active (toggle_action); - web_view = em_format_html_get_web_view (formatter); - - if (e_web_view_scroll_forward (web_view)) + window = gtk_widget_get_parent (GTK_WIDGET (display)); + if (!GTK_IS_SCROLLED_WINDOW (window)) return; - if (caret_mode || !magic_spacebar) - return; + adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (window)); + value = gtk_adjustment_get_value (adj); + upper = gtk_adjustment_get_upper (adj); + if (value + gtk_adjustment_get_page_size (adj) >= upper) { - /* XXX Are two separate calls really necessary? */ + if (caret_mode || !magic_spacebar) + return; - if (message_list_select ( - MESSAGE_LIST (message_list), - MESSAGE_LIST_SELECT_NEXT, - 0, CAMEL_MESSAGE_SEEN)) - return; + /* XXX Are two separate calls really necessary? */ - if (message_list_select ( - MESSAGE_LIST (message_list), - MESSAGE_LIST_SELECT_NEXT | - MESSAGE_LIST_SELECT_WRAP, - 0, CAMEL_MESSAGE_SEEN)) - return; + if (message_list_select ( + MESSAGE_LIST (message_list), + MESSAGE_LIST_SELECT_NEXT, + 0, CAMEL_MESSAGE_SEEN)) + return; + + if (message_list_select ( + MESSAGE_LIST (message_list), + MESSAGE_LIST_SELECT_NEXT | + MESSAGE_LIST_SELECT_WRAP, + 0, CAMEL_MESSAGE_SEEN)) + return; + + em_folder_tree_select_next_path (folder_tree, TRUE); - em_folder_tree_select_next_path (folder_tree, TRUE); + gtk_widget_grab_focus (message_list); - gtk_widget_grab_focus (message_list); + } else { + + gtk_adjustment_set_value (adj, + value + gtk_adjustment_get_page_increment (adj)); + + return; + } } static void diff --git a/modules/mail/e-mail-shell-view-private.c b/modules/mail/e-mail-shell-view-private.c index 8838f1a1ae..9a58f9d2b7 100644 --- a/modules/mail/e-mail-shell-view-private.c +++ b/modules/mail/e-mail-shell-view-private.c @@ -331,11 +331,10 @@ mail_shell_view_popup_event_cb (EMailShellView *mail_shell_view, const gchar *uri) { EMailShellContent *mail_shell_content; - EMFormatHTML *formatter; + EMailDisplay *display; EShellView *shell_view; EMailReader *reader; EMailView *mail_view; - EWebView *web_view; GtkMenu *menu; if (uri != NULL) @@ -345,10 +344,9 @@ mail_shell_view_popup_event_cb (EMailShellView *mail_shell_view, mail_view = e_mail_shell_content_get_mail_view (mail_shell_content); reader = E_MAIL_READER (mail_view); - formatter = e_mail_reader_get_formatter (reader); - web_view = em_format_html_get_web_view (formatter); + display = e_mail_reader_get_mail_display (reader); - if (e_web_view_get_cursor_image (web_view) != NULL) + if (e_web_view_get_cursor_image (E_WEB_VIEW (display)) != NULL) return FALSE; menu = e_mail_reader_get_popup_menu (reader); @@ -367,77 +365,20 @@ mail_shell_view_popup_event_cb (EMailShellView *mail_shell_view, return TRUE; } -static void -mail_shell_view_scroll_cb (EMailShellView *mail_shell_view, - GtkOrientation orientation, - GtkScrollType scroll_type, - gfloat position, - GtkHTML *html) -{ - EShell *shell; - EShellView *shell_view; - EShellWindow *shell_window; - EShellSettings *shell_settings; - EMailShellContent *mail_shell_content; - EMailReader *reader; - EMailView *mail_view; - EWebView *web_view; - GtkWidget *message_list; - gboolean magic_spacebar; - - web_view = E_WEB_VIEW (html); - - if (html->binding_handled || e_web_view_get_caret_mode (web_view)) - return; - - if (orientation != GTK_ORIENTATION_VERTICAL) - return; - - shell_view = E_SHELL_VIEW (mail_shell_view); - shell_window = e_shell_view_get_shell_window (shell_view); - shell = e_shell_window_get_shell (shell_window); - shell_settings = e_shell_get_shell_settings (shell); - - magic_spacebar = e_shell_settings_get_boolean ( - shell_settings, "mail-magic-spacebar"); - - if (!magic_spacebar) - return; - - mail_shell_content = mail_shell_view->priv->mail_shell_content; - mail_view = e_mail_shell_content_get_mail_view (mail_shell_content); - - reader = E_MAIL_READER (mail_view); - message_list = e_mail_reader_get_message_list (reader); - - if (scroll_type == GTK_SCROLL_PAGE_FORWARD) - message_list_select ( - MESSAGE_LIST (message_list), - MESSAGE_LIST_SELECT_NEXT, - 0, CAMEL_MESSAGE_SEEN); - else - message_list_select ( - MESSAGE_LIST (message_list), - MESSAGE_LIST_SELECT_PREVIOUS, - 0, CAMEL_MESSAGE_SEEN); -} - static void mail_shell_view_reader_changed_cb (EMailShellView *mail_shell_view, EMailReader *reader) { GtkWidget *message_list; - EMFormatHTML *formatter; - EWebView *web_view; + EMailDisplay *display; EShellView *shell_view; EShellTaskbar *shell_taskbar; shell_view = E_SHELL_VIEW (mail_shell_view); shell_taskbar = e_shell_view_get_shell_taskbar (shell_view); - formatter = e_mail_reader_get_formatter (reader); + display = e_mail_reader_get_mail_display (reader); message_list = e_mail_reader_get_message_list (reader); - web_view = em_format_html_get_web_view (formatter); e_shell_view_update_actions (E_SHELL_VIEW (mail_shell_view)); e_mail_shell_view_update_sidebar (mail_shell_view); @@ -464,23 +405,17 @@ mail_shell_view_reader_changed_cb (EMailShellView *mail_shell_view, mail_shell_view, G_CONNECT_SWAPPED); g_signal_connect_object ( - web_view, "key-press-event", + display, "key-press-event", G_CALLBACK (mail_shell_view_key_press_event_cb), mail_shell_view, G_CONNECT_SWAPPED); g_signal_connect_object ( - web_view, "popup-event", + display, "popup-event", G_CALLBACK (mail_shell_view_popup_event_cb), mail_shell_view, G_CONNECT_SWAPPED); g_signal_connect_object ( - web_view, "scroll", - G_CALLBACK (mail_shell_view_scroll_cb), - mail_shell_view, - G_CONNECT_AFTER | G_CONNECT_SWAPPED); - - g_signal_connect_object ( - web_view, "status-message", + display, "status-message", G_CALLBACK (e_shell_taskbar_set_message), shell_taskbar, G_CONNECT_SWAPPED); } @@ -634,7 +569,6 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view) EShellTaskbar *shell_taskbar; EShellWindow *shell_window; EShellSearchbar *searchbar; - EMFormatHTML *formatter; EMFolderTree *folder_tree; EActionComboBox *combo_box; ERuleContext *context; @@ -647,7 +581,7 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view) EMailSession *session; EMailReader *reader; EMailView *mail_view; - EWebView *web_view; + EMailDisplay *display; const gchar *source; guint merge_id; gint ii = 0; @@ -691,7 +625,7 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view) combo_box = e_shell_searchbar_get_scope_combo_box (searchbar); reader = E_MAIL_READER (shell_content); - formatter = e_mail_reader_get_formatter (reader); + display = e_mail_reader_get_mail_display (reader); message_list = e_mail_reader_get_message_list (reader); em_folder_tree_set_selectable_widget (folder_tree, message_list); @@ -710,8 +644,6 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view) G_CALLBACK (mail_shell_view_search_filter_changed_cb), mail_shell_view, G_CONNECT_SWAPPED); - web_view = em_format_html_get_web_view (formatter); - g_signal_connect_object ( folder_tree, "folder-selected", G_CALLBACK (mail_shell_view_folder_tree_selected_cb), @@ -784,23 +716,17 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view) mail_shell_view, G_CONNECT_SWAPPED); g_signal_connect_object ( - web_view, "key-press-event", + display, "key-press-event", G_CALLBACK (mail_shell_view_key_press_event_cb), mail_shell_view, G_CONNECT_SWAPPED); g_signal_connect_object ( - web_view, "popup-event", + display, "popup-event", G_CALLBACK (mail_shell_view_popup_event_cb), mail_shell_view, G_CONNECT_SWAPPED); g_signal_connect_object ( - web_view, "scroll", - G_CALLBACK (mail_shell_view_scroll_cb), - mail_shell_view, - G_CONNECT_AFTER | G_CONNECT_SWAPPED); - - g_signal_connect_object ( - web_view, "status-message", + display, "status-message", G_CALLBACK (e_shell_taskbar_set_message), shell_taskbar, G_CONNECT_SWAPPED); diff --git a/modules/mail/em-mailer-prefs.c b/modules/mail/em-mailer-prefs.c index 3f5e371296..d81656f997 100644 --- a/modules/mail/em-mailer-prefs.c +++ b/modules/mail/em-mailer-prefs.c @@ -529,10 +529,10 @@ toggle_button_init (EMMailerPrefs *prefs, const gchar *key, GCallback toggled) { - gboolean bool; + gboolean v_bool; - bool = g_settings_get_boolean (prefs->settings, key); - gtk_toggle_button_set_active (toggle, not ? !bool : bool); + v_bool = g_settings_get_boolean (prefs->settings, key); + gtk_toggle_button_set_active (toggle, not ? !v_bool : v_bool); if (toggled) { g_object_set_data ((GObject *) toggle, "key", (gpointer) key); diff --git a/modules/web-inspector/Makefile.am b/modules/web-inspector/Makefile.am new file mode 100644 index 0000000000..f8a1fc9340 --- /dev/null +++ b/modules/web-inspector/Makefile.am @@ -0,0 +1,23 @@ +module_LTLIBRARIES = libevolution-module-web-inspector.la + +libevolution_module_web_inspector_la_CPPFLAGS = \ + $(AM_CPPFLAGS) \ + -I$(top_srcdir) \ + -I$(top_srcdir)/widgets \ + -DG_LOG_DOMAIN=\"evolution-web-inspector\" \ + $(EVOLUTION_DATA_SERVER_CFLAGS) \ + $(GNOME_PLATFORM_CFLAGS) + +libevolution_module_web_inspector_la_SOURCES = \ + evolution-web-inspector.c + +libevolution_module_web_inspector_la_LIBADD = \ + $(top_builddir)/e-util/libeutil.la \ + $(top_builddir)/widgets/misc/libemiscwidgets.la \ + $(EVOLUTION_DATA_SERVER_LIBS) \ + $(GNOME_PLATFORM_LIBS) + +libevolution_module_web_inspector_la_LDFLAGS = \ + -module -avoid-version $(NO_UNDEFINED) + +-include $(top_srcdir)/git.mk diff --git a/modules/web-inspector/evolution-web-inspector.c b/modules/web-inspector/evolution-web-inspector.c new file mode 100644 index 0000000000..27a21e0693 --- /dev/null +++ b/modules/web-inspector/evolution-web-inspector.c @@ -0,0 +1,185 @@ +/* + * evolution-web-inspector.c + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) version 3. + * + * This program 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with the program; if not, see + * + */ + +#include +#include + +#include +#include + +/* Standard GObject macros */ +#define E_TYPE_WEB_INSPECTOR \ + (e_web_inspector_get_type ()) +#define E_WEB_INSPECTOR(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), E_TYPE_WEB_INSPECTOR, EWebInspector)) + +typedef struct _EWebInspector EWebInspector; +typedef struct _EWebInspectorClass EWebInspectorClass; + +struct _EWebInspector { + EExtension parent; +}; + +struct _EWebInspectorClass { + EExtensionClass parent_class; +}; + +static const gchar *ui = +"" +" " +" " +" " +" " +" " +""; + +/* Module Entry Points */ +void e_module_load (GTypeModule *type_module); +void e_module_unload (GTypeModule *type_module); + +/* Forward Declarations */ +GType e_web_inspector_get_type (void); + +G_DEFINE_DYNAMIC_TYPE (EWebInspector, e_web_inspector, E_TYPE_EXTENSION) + +static EWebView * +web_inspector_get_web_view (EWebInspector *extension) +{ + EExtensible *extensible; + + extensible = e_extension_get_extensible (E_EXTENSION (extension)); + + return E_WEB_VIEW (extensible); +} + +static void +web_inspector_action_inspect_cb (GtkAction *action, + EWebInspector *extension) +{ + WebKitWebInspector *inspector; + EWebView *web_view; + + web_view = web_inspector_get_web_view (extension); + inspector = webkit_web_view_get_inspector (WEBKIT_WEB_VIEW (web_view)); + + webkit_web_inspector_show (inspector); +} + +static GtkActionEntry inspect_entries[] = { + + { "inspect", + NULL, + N_("_Inspect..."), + NULL, + N_("Inspect the HTML content (debugging feature)"), + G_CALLBACK (web_inspector_action_inspect_cb) } +}; + +static WebKitWebView * +web_inspector_inspect_web_view_cb (WebKitWebInspector *inspector, + EWebInspector *extension) +{ + GtkWidget *web_view; + GtkWidget *window; + const gchar *title; + + title = _("Evolution Web Inspector"); + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_title (GTK_WINDOW (window), title); + gtk_widget_set_size_request (window, 600, 400); + gtk_widget_show (window); + + web_view = webkit_web_view_new (); + gtk_container_add (GTK_CONTAINER (window), web_view); + gtk_widget_show (web_view); + + return WEBKIT_WEB_VIEW (web_view); +} + +static void +web_inspector_constructed (GObject *object) +{ + EWebInspector *extension; + WebKitWebSettings *settings; + WebKitWebInspector *inspector; + GtkActionGroup *action_group; + GtkUIManager *ui_manager; + EWebView *web_view; + GError *error = NULL; + + extension = E_WEB_INSPECTOR (object); + web_view = web_inspector_get_web_view (extension); + + ui_manager = e_web_view_get_ui_manager (web_view); + action_group = e_web_view_get_action_group (web_view, "standard"); + + settings = webkit_web_view_get_settings (WEBKIT_WEB_VIEW (web_view)); + g_object_set (settings, "enable-developer-extras", TRUE, NULL); + + inspector = webkit_web_view_get_inspector (WEBKIT_WEB_VIEW (web_view)); + + g_signal_connect ( + inspector, "inspect-web-view", + G_CALLBACK (web_inspector_inspect_web_view_cb), extension); + + gtk_action_group_add_actions ( + action_group, inspect_entries, + G_N_ELEMENTS (inspect_entries), extension); + + /* Because we are loading from a hard-coded string, there is + * no chance of I/O errors. Failure here implies a malformed + * UI definition. Full stop. */ + gtk_ui_manager_add_ui_from_string (ui_manager, ui, -1, &error); + if (error != NULL) + g_error ("%s", error->message); +} + +static void +e_web_inspector_class_init (EWebInspectorClass *class) +{ + GObjectClass *object_class; + EExtensionClass *extension_class; + + object_class = G_OBJECT_CLASS (class); + object_class->constructed = web_inspector_constructed; + + extension_class = E_EXTENSION_CLASS (class); + extension_class->extensible_type = E_TYPE_WEB_VIEW; +} + +static void +e_web_inspector_class_finalize (EWebInspectorClass *class) +{ +} + +static void +e_web_inspector_init (EWebInspector *extension) +{ +} + +G_MODULE_EXPORT void +e_module_load (GTypeModule *type_module) +{ + e_web_inspector_register_type (type_module); +} + +G_MODULE_EXPORT void +e_module_unload (GTypeModule *type_module) +{ +} -- cgit v1.2.3