[evolution/wip/mcrha/webkit-jsc-api] Replace/remove redundant functions



commit 4ea58e68af63df5f634254669f525e35b4958b8d
Author: Milan Crha <mcrha redhat com>
Date:   Tue Oct 1 10:09:27 2019 +0200

    Replace/remove redundant functions

 src/e-util/e-web-view.c                 | 231 +-------------------------------
 src/e-util/e-web-view.h                 |  26 ----
 src/mail/e-mail-display.c               |  84 ------------
 src/mail/e-mail-display.h               |   9 --
 src/mail/e-mail-reader-utils.c          | 148 ++++++++++++++++----
 src/plugins/mail-to-task/mail-to-task.c |  92 ++++++++-----
 6 files changed, 184 insertions(+), 406 deletions(-)
---
diff --git a/src/e-util/e-web-view.c b/src/e-util/e-web-view.c
index d79f765c93..76dcfa566a 100644
--- a/src/e-util/e-web-view.c
+++ b/src/e-util/e-web-view.c
@@ -229,18 +229,19 @@ e_web_view_search_web_get_selection_cb (GObject *source,
                                        GAsyncResult *result,
                                        gpointer user_data)
 {
-       gchar *text;
+       GSList *texts;
        GError *local_error = NULL;
 
        g_return_if_fail (E_IS_WEB_VIEW (source));
 
-       text = e_web_view_get_selection_content_text_finish (E_WEB_VIEW (source), result, &local_error);
+       e_web_view_jsc_get_selection_finish (WEBKIT_WEB_VIEW (source), result, &texts, &local_error);
 
        if (local_error &&
            !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
                e_alert_submit (E_ALERT_SINK (source), "widgets:get-selected-text-failed", 
local_error->message, NULL);
-       } else if (!local_error) {
+       } else if (!texts) {
                GSettings *settings;
+               gchar *text = texts->data;
                gchar *uri_prefix;
                gchar *escaped;
                gchar *uri;
@@ -270,14 +271,14 @@ e_web_view_search_web_get_selection_cb (GObject *source,
        }
 
        g_clear_error (&local_error);
-       g_free (text);
+       g_slist_free_full (texts, g_free);
 }
 
 static void
 action_search_web_cb (GtkAction *action,
                      EWebView *web_view)
 {
-       e_web_view_get_selection_content_text (web_view, web_view->priv->load_cancellable,
+       e_web_view_jsc_get_selection (WEBKIT_WEB_VIEW (web_view), E_TEXT_FORMAT_PLAIN, 
web_view->priv->load_cancellable,
                e_web_view_search_web_get_selection_cb, NULL);
 }
 
@@ -3284,226 +3285,6 @@ e_web_view_update_actions (EWebView *web_view)
        g_signal_emit (web_view, signals[UPDATE_ACTIONS], 0);
 }
 
-static void
-get_selection_content_html_cb (GObject *source_object,
-                              GAsyncResult *result,
-                              gpointer user_data)
-{
-       GDBusProxy *web_extension;
-       GTask *task = user_data;
-       GVariant *result_variant;
-       gchar *html_content = NULL;
-       GError *error = NULL;
-
-       g_return_if_fail (G_IS_DBUS_PROXY (source_object));
-       g_return_if_fail (G_IS_TASK (task));
-
-       web_extension = G_DBUS_PROXY (source_object);
-
-       result_variant = g_dbus_proxy_call_finish (web_extension, result, &error);
-       if (result_variant)
-               g_variant_get (result_variant, "(s)", &html_content);
-       g_variant_unref (result_variant);
-
-       g_task_return_pointer (task, html_content, g_free);
-       g_object_unref (task);
-
-       if (error)
-               g_dbus_error_strip_remote_error (error);
-
-       e_util_claim_dbus_proxy_call_error (web_extension, "GetSelectionContentHTML", error);
-       g_clear_error (&error);
-}
-
-void
-e_web_view_get_selection_content_html (EWebView *web_view,
-                                       GCancellable *cancellable,
-                                       GAsyncReadyCallback callback,
-                                       gpointer user_data)
-{
-       GDBusProxy *web_extension;
-       GTask *task;
-
-       g_return_if_fail (E_IS_WEB_VIEW (web_view));
-
-       task = g_task_new (web_view, cancellable, callback, user_data);
-
-       web_extension = e_web_view_get_web_extension_proxy (web_view);
-       if (web_extension) {
-               g_dbus_proxy_call (
-                       web_extension,
-                       "GetSelectionContentHTML",
-                       g_variant_new (
-                               "(t)",
-                               webkit_web_view_get_page_id (
-                                       WEBKIT_WEB_VIEW (web_view))),
-                       G_DBUS_CALL_FLAGS_NONE,
-                       -1,
-                       cancellable,
-                       get_selection_content_html_cb,
-                       g_object_ref (task));
-       } else
-               g_task_return_pointer (task, NULL, NULL);
-}
-
-gchar *
-e_web_view_get_selection_content_html_finish (EWebView *web_view,
-                                              GAsyncResult *result,
-                                              GError **error)
-{
-       g_return_val_if_fail (E_IS_WEB_VIEW (web_view), NULL);
-       g_return_val_if_fail (g_task_is_valid (result, web_view), FALSE);
-
-       return g_task_propagate_pointer (G_TASK (result), error);
-}
-
-gchar *
-e_web_view_get_selection_content_html_sync (EWebView *web_view,
-                                            GCancellable *cancellable,
-                                            GError **error)
-{
-       GDBusProxy *web_extension;
-
-       g_return_val_if_fail (E_IS_WEB_VIEW (web_view), NULL);
-
-       web_extension = e_web_view_get_web_extension_proxy (web_view);
-       if (web_extension) {
-               GVariant *result;
-
-               result = e_util_invoke_g_dbus_proxy_call_sync_wrapper_full (
-                               web_extension,
-                               "GetSelectionContentHTML",
-                               g_variant_new (
-                                       "(t)",
-                                       webkit_web_view_get_page_id (
-                                               WEBKIT_WEB_VIEW (web_view))),
-                               G_DBUS_CALL_FLAGS_NONE,
-                               -1,
-                               cancellable,
-                               error);
-
-               if (result) {
-                       gchar *html_content = NULL;
-
-                       g_variant_get (result, "(s)", &html_content);
-                       g_variant_unref (result);
-                       return html_content;
-               }
-       }
-
-       return NULL;
-}
-
-static void
-get_selection_content_text_cb (GObject *source_object,
-                              GAsyncResult *result,
-                              gpointer user_data)
-{
-       GDBusProxy *web_extension;
-       GTask *task = user_data;
-       GVariant *result_variant;
-       gchar *text_content = NULL;
-       GError *error = NULL;
-
-       g_return_if_fail (G_IS_DBUS_PROXY (source_object));
-       g_return_if_fail (G_IS_TASK (task));
-
-       web_extension = G_DBUS_PROXY (source_object);
-
-       result_variant = g_dbus_proxy_call_finish (web_extension, result, &error);
-       if (result_variant)
-               g_variant_get (result_variant, "(s)", &text_content);
-       g_variant_unref (result_variant);
-
-       g_task_return_pointer (task, text_content, g_free);
-       g_object_unref (task);
-
-       if (error)
-               g_dbus_error_strip_remote_error (error);
-
-       e_util_claim_dbus_proxy_call_error (web_extension, "GetSelectionContentText", error);
-       g_clear_error (&error);
-}
-
-void
-e_web_view_get_selection_content_text (EWebView *web_view,
-                                      GCancellable *cancellable,
-                                      GAsyncReadyCallback callback,
-                                      gpointer user_data)
-{
-       GDBusProxy *web_extension;
-       GTask *task;
-
-       g_return_if_fail (E_IS_WEB_VIEW (web_view));
-
-       task = g_task_new (web_view, cancellable, callback, user_data);
-
-       web_extension = e_web_view_get_web_extension_proxy (web_view);
-       if (web_extension) {
-               g_dbus_proxy_call (
-                       web_extension,
-                       "GetSelectionContentText",
-                       g_variant_new (
-                               "(t)",
-                               webkit_web_view_get_page_id (
-                                       WEBKIT_WEB_VIEW (web_view))),
-                       G_DBUS_CALL_FLAGS_NONE,
-                       -1,
-                       cancellable,
-                       get_selection_content_text_cb,
-                       g_object_ref (task));
-       } else
-               g_task_return_pointer (task, NULL, NULL);
-}
-
-gchar *
-e_web_view_get_selection_content_text_finish (EWebView *web_view,
-                                             GAsyncResult *result,
-                                             GError **error)
-{
-       g_return_val_if_fail (E_IS_WEB_VIEW (web_view), NULL);
-       g_return_val_if_fail (g_task_is_valid (result, web_view), FALSE);
-
-       return g_task_propagate_pointer (G_TASK (result), error);
-}
-
-gchar *
-e_web_view_get_selection_content_text_sync (EWebView *web_view,
-                                           GCancellable *cancellable,
-                                           GError **error)
-{
-       GDBusProxy *web_extension;
-
-       g_return_val_if_fail (E_IS_WEB_VIEW (web_view), NULL);
-
-       web_extension = e_web_view_get_web_extension_proxy (web_view);
-       if (web_extension) {
-               GVariant *result;
-
-               result = e_util_invoke_g_dbus_proxy_call_sync_wrapper_full (
-                               web_extension,
-                               "GetSelectionContentText",
-                               g_variant_new (
-                                       "(t)",
-                                       webkit_web_view_get_page_id (
-                                               WEBKIT_WEB_VIEW (web_view))),
-                               G_DBUS_CALL_FLAGS_NONE,
-                               -1,
-                               cancellable,
-                               error);
-
-               if (result) {
-                       gchar *text_content = NULL;
-
-                       g_variant_get (result, "(s)", &text_content);
-                       g_variant_unref (result);
-                       return text_content;
-               }
-       }
-
-       return NULL;
-}
-
 const gchar *
 e_web_view_get_citation_color_for_level (gint level)
 {
diff --git a/src/e-util/e-web-view.h b/src/e-util/e-web-view.h
index de1ec6c123..e0cc5cd45a 100644
--- a/src/e-util/e-web-view.h
+++ b/src/e-util/e-web-view.h
@@ -215,32 +215,6 @@ void               e_web_view_status_message       (EWebView *web_view,
                                                 const gchar *status_message);
 void           e_web_view_stop_loading         (EWebView *web_view);
 void           e_web_view_update_actions       (EWebView *web_view);
-void           e_web_view_get_selection_content_html
-                                               (EWebView *web_view,
-                                                GCancellable *cancellable,
-                                                GAsyncReadyCallback callback,
-                                                gpointer user_data);
-gchar *                e_web_view_get_selection_content_html_finish
-                                               (EWebView *web_view,
-                                                GAsyncResult *result,
-                                                GError **error);
-gchar *                e_web_view_get_selection_content_html_sync
-                                               (EWebView *web_view,
-                                                GCancellable *cancellable,
-                                                GError **error);
-void           e_web_view_get_selection_content_text
-                                               (EWebView *web_view,
-                                                GCancellable *cancellable,
-                                                GAsyncReadyCallback callback,
-                                                gpointer user_data);
-gchar *                e_web_view_get_selection_content_text_finish
-                                               (EWebView *web_view,
-                                                GAsyncResult *result,
-                                                GError **error);
-gchar *                e_web_view_get_selection_content_text_sync
-                                               (EWebView *web_view,
-                                                GCancellable *cancellable,
-                                                GError **error);
 void           e_web_view_update_fonts         (EWebView *web_view);
 void           e_web_view_cursor_image_copy    (EWebView *web_view);
 void           e_web_view_cursor_image_save    (EWebView *web_view);
diff --git a/src/mail/e-mail-display.c b/src/mail/e-mail-display.c
index 9257d9fd61..b0c4a365bc 100644
--- a/src/mail/e-mail-display.c
+++ b/src/mail/e-mail-display.c
@@ -2766,90 +2766,6 @@ e_mail_display_set_status (EMailDisplay *display,
        g_free (str);
 }
 
-gchar *
-e_mail_display_get_selection_content_multipart_sync (EMailDisplay *display,
-                                                     gboolean *is_html,
-                                                     GCancellable *cancellable,
-                                                     GError **error)
-{
-       GDBusProxy *web_extension;
-
-       g_return_val_if_fail (E_IS_MAIL_DISPLAY (display), NULL);
-
-       if (!e_web_view_has_selection (E_WEB_VIEW (display)))
-               return NULL;
-
-       web_extension = e_web_view_get_web_extension_proxy (E_WEB_VIEW (display));
-       if (web_extension) {
-               GVariant *result;
-
-               result = e_util_invoke_g_dbus_proxy_call_sync_wrapper_full (
-                               web_extension,
-                               "GetSelectionContentMultipart",
-                               g_variant_new (
-                                       "(t)",
-                                       webkit_web_view_get_page_id (
-                                               WEBKIT_WEB_VIEW (display))),
-                               G_DBUS_CALL_FLAGS_NONE,
-                               -1,
-                               cancellable,
-                               error);
-
-               if (result) {
-                       gchar *content = NULL;
-                       gboolean text_html = FALSE;
-
-                       g_variant_get (result, "(sb)", &content, &text_html);
-                       g_variant_unref (result);
-                       if (is_html)
-                               *is_html = text_html;
-                       return content;
-               }
-       }
-
-       return NULL;
-}
-
-gchar *
-e_mail_display_get_selection_plain_text_sync (EMailDisplay *display,
-                                              GCancellable *cancellable,
-                                              GError **error)
-{
-       GDBusProxy *web_extension;
-
-       g_return_val_if_fail (E_IS_MAIL_DISPLAY (display), NULL);
-
-       if (!e_web_view_has_selection (E_WEB_VIEW (display)))
-               return NULL;
-
-       web_extension = e_web_view_get_web_extension_proxy (E_WEB_VIEW (display));
-       if (web_extension) {
-               GVariant *result;
-
-               result = e_util_invoke_g_dbus_proxy_call_sync_wrapper_full (
-                               web_extension,
-                               "GetSelectionContentText",
-                               g_variant_new (
-                                       "(t)",
-                                       webkit_web_view_get_page_id (
-                                               WEBKIT_WEB_VIEW (display))),
-                               G_DBUS_CALL_FLAGS_NONE,
-                               -1,
-                               cancellable,
-                               error);
-
-               if (result) {
-                       gchar *text;
-
-                       g_variant_get (result, "(s)", &text);
-                       g_variant_unref (result);
-                       return text;
-               }
-       }
-
-       return NULL;
-}
-
 void
 e_mail_display_load_images (EMailDisplay *display)
 {
diff --git a/src/mail/e-mail-display.h b/src/mail/e-mail-display.h
index ed02f189e5..cacf64e2d5 100644
--- a/src/mail/e-mail-display.h
+++ b/src/mail/e-mail-display.h
@@ -94,15 +94,6 @@ GtkAction *  e_mail_display_get_action       (EMailDisplay *display,
                                                 const gchar *action_name);
 void           e_mail_display_set_status       (EMailDisplay *display,
                                                 const gchar *status);
-gchar *                e_mail_display_get_selection_content_multipart_sync
-                                               (EMailDisplay *display,
-                                                gboolean *is_html,
-                                                GCancellable *cancellable,
-                                                GError **error);
-gchar *                e_mail_display_get_selection_plain_text_sync
-                                               (EMailDisplay *display,
-                                                GCancellable *cancellable,
-                                                GError **error);
 void           e_mail_display_load_images      (EMailDisplay *display);
 void           e_mail_display_set_force_load_images
                                                (EMailDisplay *display,
diff --git a/src/mail/e-mail-reader-utils.c b/src/mail/e-mail-reader-utils.c
index 5fe3b12ce7..b8bf1e86f8 100644
--- a/src/mail/e-mail-reader-utils.c
+++ b/src/mail/e-mail-reader-utils.c
@@ -2615,10 +2615,12 @@ mail_reader_reply_to_message_composer_created_cb (GObject *source_object,
        create_composer_data_free (ccd);
 }
 
-void
-e_mail_reader_reply_to_message (EMailReader *reader,
-                                CamelMimeMessage *src_message,
-                                EMailReplyType reply_type)
+static void
+e_mail_reader_reply_to_message_with_selection (EMailReader *reader,
+                                              CamelMimeMessage *src_message,
+                                              EMailReplyType reply_type,
+                                              const gchar *selection,
+                                              gboolean selection_is_html)
 {
        EShell *shell;
        EMailBackend *backend;
@@ -2626,17 +2628,14 @@ e_mail_reader_reply_to_message (EMailReader *reader,
        EMailDisplay *display;
        EMailPartList *part_list = NULL;
        GtkWidget *message_list;
-       CamelContentType *content_type;
        CamelMimeMessage *new_message;
        CamelInternetAddress *address = NULL;
        CamelFolder *folder;
        EMailReplyStyle reply_style;
        EWebView *web_view;
-       gboolean src_is_text_html = FALSE;
        const CamelNameValueArray *headers;
        guint ii, len;
        const gchar *uid;
-       gchar *selection = NULL;
        gint length;
        gchar *mail_uri;
        CamelObjectBag *registry;
@@ -2737,31 +2736,14 @@ e_mail_reader_reply_to_message (EMailReader *reader,
        if (!e_web_view_has_selection (web_view))
                goto whole_message;
 
-       content_type = camel_mime_part_get_content_type (CAMEL_MIME_PART (src_message));
-
-       if (camel_content_type_is (content_type, "text", "plain")) {
-               selection = e_mail_display_get_selection_plain_text_sync (display, NULL, NULL);
-               src_is_text_html = FALSE;
-       } else if (camel_content_type_is (content_type, "text", "html")) {
-               selection = e_web_view_get_selection_content_html_sync (E_WEB_VIEW (display), NULL, NULL);
-               src_is_text_html = TRUE;
-       } else {
-               selection = e_mail_display_get_selection_content_multipart_sync (display, &src_is_text_html, 
NULL, NULL);
-       }
-
        if (selection == NULL || *selection == '\0')
                goto whole_message;
 
        length = strlen (selection);
-       if ((src_is_text_html && !html_contains_nonwhitespace (selection, length)) ||
-           (!src_is_text_html && !plaintext_contains_nonwhitespace (selection, length)))
+       if ((selection_is_html && !html_contains_nonwhitespace (selection, length)) ||
+           (!selection_is_html && !plaintext_contains_nonwhitespace (selection, length)))
                goto whole_message;
 
-       if (!src_is_text_html) {
-               maybe_mangle_plaintext_signature_delimiter (&selection);
-               length = strlen (selection);
-       }
-
        new_message = camel_mime_message_new ();
 
        /* Filter out "content-*" headers. */
@@ -2789,7 +2771,7 @@ e_mail_reader_reply_to_message (EMailReader *reader,
                CAMEL_MIME_PART (new_message),
                selection,
                length,
-               src_is_text_html ? "text/html; charset=utf-8" : "text/plain; charset=utf-8");
+               selection_is_html ? "text/html; charset=utf-8" : "text/plain; charset=utf-8");
 
        ccd = g_new0 (CreateComposerData, 1);
        ccd->reader = g_object_ref (reader);
@@ -2853,11 +2835,121 @@ whole_message:
        }
 
 exit:
-       g_free (selection);
        g_clear_object (&address);
        g_clear_object (&folder);
 }
 
+typedef struct _GetSelectionData {
+       EMailReader *reader;
+       CamelMimeMessage *src_message;
+       EMailReplyType reply_type;
+       gboolean selection_is_html;
+} GetSelectionData;
+
+static void
+reply_got_message_selection_jsc_cb (GObject *source_object,
+                                   GAsyncResult *result,
+                                   gpointer user_data)
+{
+       GetSelectionData *gsd = user_data;
+       gchar *selection;
+       GSList *texts = NULL;
+       GError *error = NULL;
+
+       g_return_if_fail (gsd != NULL);
+       g_return_if_fail (E_IS_WEB_VIEW (source_object));
+
+       if (!e_web_view_jsc_get_selection_finish (WEBKIT_WEB_VIEW (source_object), result, &texts, &error)) {
+               texts = NULL;
+               g_warning ("%s: Failed to get view selection: %s", G_STRFUNC, error ? error->message : 
"Unknown error");
+       }
+
+       selection = texts ? texts->data : NULL;
+
+       if (selection && !gsd->selection_is_html) {
+               maybe_mangle_plaintext_signature_delimiter (&selection);
+               texts->data = selection;
+       }
+
+       e_mail_reader_reply_to_message_with_selection (gsd->reader, gsd->src_message, gsd->reply_type, 
selection, gsd->selection_is_html);
+
+       g_slist_free_full (texts, g_free);
+       g_clear_error (&error);
+       g_clear_object (&gsd->reader);
+       g_clear_object (&gsd->src_message);
+       g_free (gsd);
+}
+
+void
+e_mail_reader_reply_to_message (EMailReader *reader,
+                                CamelMimeMessage *src_message,
+                                EMailReplyType reply_type)
+{
+       CamelContentType *ct;
+       GetSelectionData *gsd;
+       EMailDisplay *mail_display;
+       EMailPartList *part_list = NULL;
+       EWebView *web_view;
+
+       g_return_if_fail (E_IS_MAIL_READER (reader));
+
+       mail_display = e_mail_reader_get_mail_display (reader);
+       g_return_if_fail (E_IS_MAIL_DISPLAY (mail_display));
+
+       web_view = E_WEB_VIEW (mail_display);
+
+       if (!gtk_widget_get_visible (GTK_WIDGET (web_view)) ||
+           !e_web_view_has_selection (web_view)) {
+               e_mail_reader_reply_to_message_with_selection (reader, src_message, reply_type, NULL, FALSE);
+               return;
+       }
+
+       if (!src_message) {
+               CamelFolder *folder;
+               GtkWidget *message_list;
+               const gchar *uid;
+               gchar *mail_uri;
+
+               message_list = e_mail_reader_get_message_list (reader);
+
+               uid = MESSAGE_LIST (message_list)->cursor_uid;
+               g_return_if_fail (uid != NULL);
+
+               folder = e_mail_reader_ref_folder (reader);
+               mail_uri = e_mail_part_build_uri (folder, uid, NULL, NULL);
+               part_list = camel_object_bag_get (e_mail_part_list_get_registry (), mail_uri);
+               g_clear_object (&folder);
+               g_free (mail_uri);
+
+               src_message = part_list ? e_mail_part_list_get_message (part_list) : NULL;
+
+               if (!src_message) {
+                       e_mail_reader_reply_to_message_with_selection (reader, src_message, reply_type, NULL, 
FALSE);
+                       g_clear_object (&part_list);
+                       return;
+               }
+       }
+
+       gsd = g_slice_new0 (GetSelectionData);
+       gsd->reader = g_object_ref (reader);
+       gsd->src_message = src_message ? g_object_ref (src_message) : NULL;
+       gsd->reply_type = reply_type;
+
+       ct = camel_mime_part_get_content_type (CAMEL_MIME_PART (src_message));
+
+       if (camel_content_type_is (ct, "text", "plain")) {
+               gsd->selection_is_html = FALSE;
+               e_web_view_jsc_get_selection (WEBKIT_WEB_VIEW (web_view), E_TEXT_FORMAT_PLAIN, NULL,
+                       reply_got_message_selection_jsc_cb, gsd);
+       } else {
+               gsd->selection_is_html = TRUE;
+               e_web_view_jsc_get_selection (WEBKIT_WEB_VIEW (web_view), E_TEXT_FORMAT_HTML, NULL,
+                       reply_got_message_selection_jsc_cb, gsd);
+       }
+
+       g_clear_object (&part_list);
+}
+
 static void
 mail_reader_save_messages_cb (GObject *source_object,
                               GAsyncResult *result,
diff --git a/src/plugins/mail-to-task/mail-to-task.c b/src/plugins/mail-to-task/mail-to-task.c
index 6d9f6eac8f..ca443dcda5 100644
--- a/src/plugins/mail-to-task/mail-to-task.c
+++ b/src/plugins/mail-to-task/mail-to-task.c
@@ -1091,43 +1091,71 @@ text_contains_nonwhitespace (const gchar *text,
        return p - text < len - 1 && c != 0;
 }
 
-static gchar *
-get_selected_text (EMailReader *reader)
+static void
+get_charsets (EMailReader *reader,
+             gchar **default_charset,
+             gchar **forced_charset)
 {
        EMailDisplay *display;
-       gchar *text = NULL;
+       EMailFormatter *formatter;
 
        display = e_mail_reader_get_mail_display (reader);
+       formatter = e_mail_display_get_formatter (display);
 
-       if (!e_web_view_has_selection (E_WEB_VIEW (display)))
-               return NULL;
+       *default_charset = e_mail_formatter_dup_default_charset (formatter);
+       *forced_charset = e_mail_formatter_dup_charset (formatter);
+}
 
-       text = e_mail_display_get_selection_plain_text_sync (display, NULL, NULL);
+static void
+start_mail_to_event_thread (AsyncData *data)
+{
+       GThread *thread = NULL;
+       GError *error = NULL;
 
-       if (!text)
-               return NULL;
+       thread = g_thread_try_new (NULL, (GThreadFunc) do_mail_to_event, data, &error);
 
-       if (!text_contains_nonwhitespace (text, strlen (text))) {
-               g_free (text);
-               return NULL;
+       if (error != NULL) {
+               g_warning (G_STRLOC ": %s", error->message);
+               g_error_free (error);
+       } else {
+               g_thread_unref (thread);
        }
-
-       return text;
 }
 
 static void
-get_charsets (EMailReader *reader,
-             gchar **default_charset,
-             gchar **forced_charset)
+mail_to_task_got_selection_jsc_cb (GObject *source_object,
+                                  GAsyncResult *result,
+                                  gpointer user_data)
 {
-       EMailDisplay *display;
-       EMailFormatter *formatter;
+       AsyncData *data = user_data;
+       GSList *texts = NULL;
+       gchar *text;
+       GError *error = NULL;
 
-       display = e_mail_reader_get_mail_display (reader);
-       formatter = e_mail_display_get_formatter (display);
+       g_return_if_fail (data != NULL);
+       g_return_if_fail (E_IS_WEB_VIEW (source_object));
 
-       *default_charset = e_mail_formatter_dup_default_charset (formatter);
-       *forced_charset = e_mail_formatter_dup_charset (formatter);
+       if (!e_web_view_jsc_get_selection_finish (WEBKIT_WEB_VIEW (source_object), result, &texts, &error)) {
+               texts = NULL;
+               g_warning ("%s: Failed to get view selection: %s", G_STRFUNC, error ? error->message : 
"Unknown error");
+       }
+
+       text = texts ? texts->data : NULL;
+
+       if (text && !text_contains_nonwhitespace (text, strlen (text))) {
+               text = NULL;
+       } else {
+               /* Steal the pointer */
+               if (texts)
+                       texts->data = NULL;
+       }
+
+       data->selected_text = text;
+
+       start_mail_to_event_thread (data);
+
+       g_slist_free_full (texts, g_free);
+       g_clear_error (&error);
 }
 
 static void
@@ -1227,8 +1255,7 @@ mail_to_event (ECalClientSourceType source_type,
        if (source) {
                /* if a source has been selected, perform the mail2event operation */
                AsyncData *data = NULL;
-               GThread *thread = NULL;
-               GError *error = NULL;
+               EMailDisplay *mail_display;
 
                /* Fill the elements in AsynData */
                data = g_new0 (AsyncData, 1);
@@ -1241,18 +1268,15 @@ mail_to_event (ECalClientSourceType source_type,
                data->with_attendees = with_attendees;
                get_charsets (reader, &data->default_charset, &data->forced_charset);
 
-               if (uids->len == 1)
-                       data->selected_text = get_selected_text (reader);
-               else
-                       data->selected_text = NULL;
+               mail_display = e_mail_reader_get_mail_display (reader);
 
-               thread = g_thread_try_new (
-                       NULL, (GThreadFunc) do_mail_to_event, data, &error);
-               if (error != NULL) {
-                       g_warning (G_STRLOC ": %s", error->message);
-                       g_error_free (error);
+               if (uids->len == 1 && e_web_view_has_selection (E_WEB_VIEW (mail_display))) {
+                       e_web_view_jsc_get_selection (WEBKIT_WEB_VIEW (mail_display), E_TEXT_FORMAT_PLAIN, 
NULL,
+                               mail_to_task_got_selection_jsc_cb, data);
                } else {
-                       g_thread_unref (thread);
+                       data->selected_text = NULL;
+
+                       start_mail_to_event_thread (data);
                }
        }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]