[evolution/wip/tpopela/composer-dnd: 5/5] Fix DnD in composer



commit fc54b88371d4c9973735123453e5abfb16829fbc
Author: Tomas Popela <tpopela redhat com>
Date:   Thu Mar 9 15:43:01 2017 +0100

    Fix DnD in composer
    
    Most of the stuff works apart of saving undo/redo history. Need to
    figure out how determine if the selection is on the beginning/end of
    line without touching the selection (because that leads to breaking
    the DnD for WebKit).

 src/composer/e-composer-private.c                  |    2 -
 src/composer/e-composer-private.h                  |    4 +-
 src/composer/e-msg-composer.c                      |  290 +++--------------
 src/e-util/e-util-enums.h                          |   24 ++
 src/modules/webkit-editor/e-webkit-editor.c        |  134 ++++++++-
 .../web-extension/e-composer-dom-functions.c       |  244 --------------
 .../web-extension/e-composer-dom-functions.h       |    4 -
 .../web-extension/e-editor-dom-functions.c         |  349 ++++++++++++++++++--
 .../web-extension/e-editor-dom-functions.h         |    3 +-
 .../web-extension/e-editor-web-extension.c         |   40 ---
 10 files changed, 523 insertions(+), 571 deletions(-)
---
diff --git a/src/composer/e-composer-private.c b/src/composer/e-composer-private.c
index 91aef51..caeb272 100644
--- a/src/composer/e-composer-private.c
+++ b/src/composer/e-composer-private.c
@@ -132,8 +132,6 @@ e_composer_private_constructed (EMsgComposer *composer)
        priv->disable_signature = FALSE;
        priv->busy = FALSE;
        priv->saved_editable = FALSE;
-       priv->drop_occured = FALSE;
-       priv->dnd_is_uri = FALSE;
        priv->dnd_history_saved = FALSE;
        priv->check_if_signature_is_changed = FALSE;
        priv->ignore_next_signature_change = FALSE;
diff --git a/src/composer/e-composer-private.h b/src/composer/e-composer-private.h
index b2c50df..72b4d07 100644
--- a/src/composer/e-composer-private.h
+++ b/src/composer/e-composer-private.h
@@ -100,8 +100,6 @@ struct _EMsgComposerPrivate {
         * This is used to restore the previous editable state. */
        gboolean saved_editable;
        gboolean set_signature_from_message;
-       gboolean drop_occured;
-       gboolean dnd_is_uri;
        gboolean is_sending_message;
        gboolean dnd_history_saved;
        gboolean check_if_signature_is_changed;
@@ -119,6 +117,8 @@ struct _EMsgComposerPrivate {
        gulong notify_signature_uid_handler;
        gulong notify_subject_handler;
        gulong notify_subject_changed_handler;
+
+       gulong drag_data_received_handler_id;
 };
 
 void           e_composer_private_constructed  (EMsgComposer *composer);
diff --git a/src/composer/e-msg-composer.c b/src/composer/e-msg-composer.c
index 1268fe1..9ca831b 100644
--- a/src/composer/e-msg-composer.c
+++ b/src/composer/e-msg-composer.c
@@ -103,24 +103,14 @@ enum {
        LAST_SIGNAL
 };
 
-enum DndTargetType {
-       DND_TARGET_TYPE_TEXT_URI_LIST,
-       DND_TARGET_TYPE_MOZILLA_URL,
-       DND_TARGET_TYPE_TEXT_HTML,
-       DND_TARGET_TYPE_UTF8_STRING,
-       DND_TARGET_TYPE_TEXT_PLAIN,
-       DND_TARGET_TYPE_STRING,
-       DND_TARGET_TYPE_TEXT_PLAIN_UTF8
-};
-
 static GtkTargetEntry drag_dest_targets[] = {
-       { (gchar *) "text/uri-list", 0, DND_TARGET_TYPE_TEXT_URI_LIST },
-       { (gchar *) "_NETSCAPE_URL", 0, DND_TARGET_TYPE_MOZILLA_URL },
-       { (gchar *) "text/html", 0, DND_TARGET_TYPE_TEXT_HTML },
-       { (gchar *) "UTF8_STRING", 0, DND_TARGET_TYPE_UTF8_STRING },
-       { (gchar *) "text/plain", 0, DND_TARGET_TYPE_TEXT_PLAIN },
-       { (gchar *) "STRING", 0, DND_TARGET_TYPE_STRING },
-       { (gchar *) "text/plain;charset=utf-8", 0, DND_TARGET_TYPE_TEXT_PLAIN_UTF8 },
+       { (gchar *) "text/uri-list", 0, E_DND_TARGET_TYPE_TEXT_URI_LIST },
+       { (gchar *) "_NETSCAPE_URL", 0, E_DND_TARGET_TYPE_MOZILLA_URL },
+       { (gchar *) "text/html", 0, E_DND_TARGET_TYPE_TEXT_HTML },
+       { (gchar *) "UTF8_STRING", 0, E_DND_TARGET_TYPE_UTF8_STRING },
+       { (gchar *) "text/plain", 0, E_DND_TARGET_TYPE_TEXT_PLAIN },
+       { (gchar *) "STRING", 0, E_DND_TARGET_TYPE_STRING },
+       { (gchar *) "text/plain;charset=utf-8", 0, E_DND_TARGET_TYPE_TEXT_PLAIN_UTF8 },
 };
 
 static guint signals[LAST_SIGNAL];
@@ -1783,135 +1773,6 @@ msg_composer_paste_clipboard_cb (EContentEditor *cnt_editor,
 
        return TRUE;
 }
-#if 0 /* FIXME WK2 */
-static gboolean
-msg_composer_drag_motion_cb (GtkWidget *widget,
-                             GdkDragContext *context,
-                             gint x,
-                             gint y,
-                             guint time,
-                             EMsgComposer *composer)
-{
-       GtkWidget *source_widget;
-       EHTMLEditor *editor = e_msg_composer_get_editor (composer);
-       EHTMLEditorView *editor_view = e_html_editor_get_view (editor);
-
-       source_widget = gtk_drag_get_source_widget (context);
-       /* When we are doind DnD just inside the web view, the DnD is supposed
-        * to move things around. */
-       if (E_IS_HTML_EDITOR_VIEW (source_widget)) {
-               if ((gpointer) editor_view == (gpointer) source_widget) {
-                       gdk_drag_status (context, GDK_ACTION_MOVE, time);
-
-                       return FALSE;
-               }
-       }
-
-       gdk_drag_status (context, GDK_ACTION_COPY, time);
-
-       return FALSE;
-}
-
-static gboolean
-msg_composer_drag_drop_cb (GtkWidget *widget,
-                           GdkDragContext *context,
-                           gint x,
-                           gint y,
-                           guint time,
-                           EMsgComposer *composer)
-{
-       GdkAtom target;
-       GtkWidget *source_widget;
-
-       /* When we are doing DnD just inside the web view, the DnD is supposed
-        * to move things around. */
-       source_widget = gtk_drag_get_source_widget (context);
-       if (E_IS_HTML_EDITOR_VIEW (source_widget)) {
-               EHTMLEditor *editor = e_msg_composer_get_editor (composer);
-               EHTMLEditorView *editor_view = e_html_editor_get_view (editor);
-
-               if ((gpointer) editor_view == (gpointer) source_widget) {
-                       GDBusProxy *web_extension;
-
-                       web_extension = e_html_editor_view_get_web_extension_proxy (editor_view);
-                       if (web_extension) {
-                               e_util_invoke_g_dbus_proxy_call_sync_wrapper_with_error_check (
-                                       web_extension,
-                                       "DOMSaveDragAndDropHistory",
-                                       g_variant_new (
-                                               "(t)",
-                                               webkit_web_view_get_page_id (WEBKIT_WEB_VIEW (editor_view))),
-                                       NULL);
-                       }
-                       return FALSE;
-               }
-       }
-
-       target = gtk_drag_dest_find_target (widget, context, NULL);
-       if (target == GDK_NONE)
-               gdk_drag_status (context, 0, time);
-       else {
-               /* Prevent WebKit from pasting the URI of file into the view. Also
-                * prevent it from inserting the text/plain or text/html content as we
-                * want to insert it ourselves. */
-               if (composer->priv->dnd_is_uri || !E_IS_HTML_EDITOR_VIEW (source_widget))
-                       g_signal_stop_emission_by_name (widget, "drag-drop");
-
-               composer->priv->dnd_is_uri = FALSE;
-
-               if (E_IS_HTML_EDITOR_VIEW (source_widget))
-                       gdk_drag_status (context, GDK_ACTION_MOVE, time);
-               else
-                       gdk_drag_status (context, GDK_ACTION_COPY, time);
-
-               composer->priv->drop_occured = TRUE;
-               gtk_drag_get_data (widget, context, target, time);
-
-               return TRUE;
-       }
-
-       return FALSE;
-}
-
-static void
-msg_composer_drag_data_received_after_cb (GtkWidget *widget,
-                                          GdkDragContext *context,
-                                          gint x,
-                                          gint y,
-                                          GtkSelectionData *selection,
-                                          guint info,
-                                          guint time,
-                                          EMsgComposer *composer)
-{
-       EHTMLEditor *editor;
-       EHTMLEditorView *view;
-       GDBusProxy *web_extension;
-
-       if (!composer->priv->drop_occured)
-               goto out;
-
-       /* Save just history for events handled by WebKit. */
-       if (composer->priv->dnd_history_saved)
-               goto out;
-
-       editor = e_msg_composer_get_editor (composer);
-       view = e_html_editor_get_view (editor);
-       web_extension = e_html_editor_view_get_web_extension_proxy (view);
-       if (!web_extension)
-               goto out;
-
-       e_util_invoke_g_dbus_proxy_call_sync_wrapper_with_error_check (
-               web_extension,
-               "DOMCleanAfterDragAndDrop",
-               g_variant_new (
-                       "(t)",
-                       webkit_web_view_get_page_id (WEBKIT_WEB_VIEW (view))),
-               NULL);
-
- out:
-       composer->priv->drop_occured = FALSE;
-       composer->priv->dnd_history_saved = FALSE;
-}
 
 static gchar *
 next_uri (guchar **uri_list,
@@ -1950,90 +1811,16 @@ msg_composer_drag_data_received_cb (GtkWidget *widget,
 {
        EHTMLEditor *editor;
        EContentEditor *cnt_editor;
-       gboolean html_mode, same_widget = FALSE;
-       GtkWidget *source_widget;
+       gboolean html_mode, is_move;
 
        editor = e_msg_composer_get_editor (composer);
        cnt_editor = e_html_editor_get_content_editor (editor);
        html_mode = e_content_editor_get_html_mode (cnt_editor);
 
-       composer->priv->dnd_history_saved = TRUE;
-
-       /* When we are doing DnD just inside the web view, the DnD is supposed
-        * to move things around. */
-       source_widget = gtk_drag_get_source_widget (context);
-       if (E_IS_CONTENT_EDITOR (source_widget) &&
-           ((gpointer) cnt_editor == (gpointer) source_widget))
-               same_widget = TRUE;
-
-       /* Leave DnD inside the view on WebKit. */
-       if (composer->priv->drop_occured && same_widget) {
-               gdk_drag_status (context, 0, time);
-               return;
-       }
-
-       if (!composer->priv->drop_occured) {
-               if (!same_widget) {
-                       /* Check if we are DnD'ing some URI, if so WebKit will
-                        * insert the URI into the view and we have to prevent it
-                        * from doing that. */
-                       if (info == DND_TARGET_TYPE_TEXT_URI_LIST) {
-                               gchar **uris;
-
-                               uris = gtk_selection_data_get_uris (selection);
-                               /* I don't know what regressed outside of Evo, but
-                                * this is called twice. Firstly with uris set
-                                * following by one with uris not set. */
-                               if (!composer->priv->dnd_is_uri)
-                                       composer->priv->dnd_is_uri = uris != NULL;
-                               g_strfreev (uris);
-                       }
-               }
-               return;
-       }
-
-       composer->priv->dnd_is_uri = FALSE;
-
-       /* Leave the text on WebKit to handle it. */
-       if (info == DND_TARGET_TYPE_UTF8_STRING ||
-           info == DND_TARGET_TYPE_STRING ||
-           info == DND_TARGET_TYPE_TEXT_PLAIN ||
-           info == DND_TARGET_TYPE_TEXT_PLAIN_UTF8) {
-               composer->priv->dnd_history_saved = FALSE;
-               gdk_drag_status (context, 0, time);
-               return;
-       }
-
-       if (info == DND_TARGET_TYPE_TEXT_HTML) {
-               const guchar *data;
-               gint length;
-               gint list_len, len;
-               gchar *text;
+       g_signal_handler_disconnect (cnt_editor, composer->priv->drag_data_received_handler_id);
+       composer->priv->drag_data_received_handler_id = 0;
 
-               data = gtk_selection_data_get_data (selection);
-               length = gtk_selection_data_get_length (selection);
-
-               if (!data || length < 0) {
-                       gtk_drag_finish (context, FALSE, FALSE, time);
-                       return;
-               }
-
-               e_content_editor_move_caret_on_coordinates (cnt_editor, x, y, FALSE);
-
-               list_len = length;
-               do {
-                       text = next_uri ((guchar **) &data, &len, &list_len);
-                       e_content_editor_insert_content (
-                               cnt_editor,
-                               text,
-                               E_CONTENT_EDITOR_INSERT_TEXT_HTML);
-                       g_free (text);
-               } while (list_len);
-
-               gtk_drag_finish (context, TRUE, FALSE, time);
-
-               return;
-       }
+       is_move = gdk_drag_context_get_selected_action (context) == GDK_ACTION_MOVE;
 
        /* HTML mode has a few special cases for drops... */
        /* If we're receiving URIs and -all- the URIs point to
@@ -2064,7 +1851,7 @@ msg_composer_drag_data_received_cb (GtkWidget *widget,
                        g_free (uri);
                } while (list_len);
 
-               gtk_drag_finish (context, TRUE, FALSE, time);
+               gtk_drag_finish (context, TRUE, is_move, time);
        } else {
                EAttachmentView *attachment_view =
                        e_msg_composer_get_attachment_view (composer);
@@ -2077,7 +1864,38 @@ msg_composer_drag_data_received_cb (GtkWidget *widget,
                        context, x, y, selection, info, time);
        }
 }
-#endif
+
+static gboolean
+msg_composer_drag_drop_cb (GtkWidget *widget,
+                           GdkDragContext *context,
+                           gint x,
+                           gint y,
+                           guint time,
+                           EMsgComposer *composer)
+{
+       GdkAtom target = gtk_drag_dest_find_target (widget, context, NULL);
+
+       if (target == GDK_NONE) {
+               gdk_drag_status (context, 0, time);
+       } else {
+               EHTMLEditor *editor;
+               EContentEditor *cnt_editor;
+
+               editor = e_msg_composer_get_editor (composer);
+               cnt_editor = e_html_editor_get_content_editor (editor);
+
+               composer->priv->drag_data_received_handler_id = g_signal_connect (
+                       cnt_editor, "drag-data-received",
+                       G_CALLBACK (msg_composer_drag_data_received_cb), composer);
+
+               gtk_drag_get_data (widget, context, target, time);
+
+               return TRUE;
+       }
+
+       return FALSE;
+}
+
 static void
 msg_composer_notify_header_cb (EMsgComposer *composer)
 {
@@ -2466,29 +2284,11 @@ msg_composer_constructed (GObject *object)
                G_CALLBACK (msg_composer_paste_primary_clipboard_cb), composer);
 
        /* Drag-and-Drop Support */
-#if 0 /* FIXME WK2 */
-       EHTMLEditorView *view;
-
-       view = e_html_editor_get_view (editor);
-
        g_signal_connect (
-               view, "drag-motion",
-               G_CALLBACK (msg_composer_drag_motion_cb), composer);
-
-        g_signal_connect (
-               view, "drag-drop",
+               cnt_editor, "drag-drop",
                G_CALLBACK (msg_composer_drag_drop_cb), composer);
 
        g_signal_connect (
-               view, "drag-data-received",
-               G_CALLBACK (msg_composer_drag_data_received_cb), composer);
-
-       /* Used for fixing various stuff after WebKit processed the DnD data. */
-       g_signal_connect_after (
-               view, "drag-data-received",
-               G_CALLBACK (msg_composer_drag_data_received_after_cb), composer);
-#endif
-       g_signal_connect (
                composer->priv->gallery_icon_view, "drag-data-get",
                G_CALLBACK (msg_composer_gallery_drag_data_get), NULL);
 
diff --git a/src/e-util/e-util-enums.h b/src/e-util/e-util-enums.h
index 6078cb9..75eeeee 100644
--- a/src/e-util/e-util-enums.h
+++ b/src/e-util/e-util-enums.h
@@ -548,6 +548,30 @@ typedef enum {
        E_CLIPBOARD_CAN_PASTE   = 1 << 2 */
 } EClipboardFlags;
 
+/**
+ * EDnDTargetType:
+ * DND_TARGET_TYPE_TEXT_URI_LIST: text/uri-list
+ * DND_TARGET_TYPE_MOZILLA_URL: _NETSCAPE_URL
+ * DND_TARGET_TYPE_TEXT_HTML: text/html
+ * DND_TARGET_TYPE_UTF8_STRING: UTF8_STRING
+ * DND_TARGET_TYPE_TEXT_PLAIN: text/plain
+ * DND_TARGET_TYPE_STRING: STRING
+ * DND_TARGET_TYPE_TEXT_PLAIN_UTF8: text/plain;charser=utf-8
+ *
+ * Drag and drop targets supported by EContentEditor.
+ *
+ * Since: 3.26
+ **/
+typedef enum {
+       E_DND_TARGET_TYPE_TEXT_URI_LIST = 0,
+       E_DND_TARGET_TYPE_MOZILLA_URL,
+       E_DND_TARGET_TYPE_TEXT_HTML,
+       E_DND_TARGET_TYPE_UTF8_STRING,
+       E_DND_TARGET_TYPE_TEXT_PLAIN,
+       E_DND_TARGET_TYPE_STRING,
+       E_DND_TARGET_TYPE_TEXT_PLAIN_UTF8
+} EDnDTargetType;
+
 G_END_DECLS
 
 #endif /* E_UTIL_ENUMS_H */
diff --git a/src/modules/webkit-editor/e-webkit-editor.c b/src/modules/webkit-editor/e-webkit-editor.c
index 00906e1..c9d5bd7 100644
--- a/src/modules/webkit-editor/e-webkit-editor.c
+++ b/src/modules/webkit-editor/e-webkit-editor.c
@@ -132,6 +132,9 @@ struct _EWebKitEditorPrivate {
        gulong found_text_handler_id;
        gulong failed_to_find_text_handler_id;
 
+       gboolean performing_drag;
+       gulong drag_data_received_handler_id;
+
        gchar *last_hover_uri;
 };
 
@@ -5772,10 +5775,127 @@ webkit_editor_context_menu_cb (EWebKitEditor *wk_editor,
 }
 
 static void
+webkit_editor_drag_begin_cb (EWebKitEditor *wk_editor,
+                             GdkDragContext *context)
+{
+       wk_editor->priv->performing_drag = TRUE;
+}
+
+static void
+webkit_editor_drag_failed_cb (EWebKitEditor *wk_editor,
+                              GdkDragContext *context,
+                              GtkDragResult result)
+{
+       wk_editor->priv->performing_drag = FALSE;
+}
+
+static void
 webkit_editor_drag_end_cb (EWebKitEditor *wk_editor,
                            GdkDragContext *context)
 {
-       webkit_editor_call_simple_extension_function (wk_editor, "DOMDragAndDropEnd");
+       wk_editor->priv->performing_drag = FALSE;
+}
+
+static gchar *
+next_uri (guchar **uri_list,
+          gint *len,
+          gint *list_len)
+{
+       guchar *uri, *begin;
+
+       begin = *uri_list;
+       *len = 0;
+       while (**uri_list && **uri_list != '\n' && **uri_list != '\r' && *list_len) {
+               (*uri_list) ++;
+               (*len) ++;
+               (*list_len) --;
+       }
+
+       uri = (guchar *) g_strndup ((gchar *) begin, *len);
+
+       while ((!**uri_list || **uri_list == '\n' || **uri_list == '\r') && *list_len) {
+               (*uri_list) ++;
+               (*list_len) --;
+       }
+
+       return (gchar *) uri;
+}
+
+static void
+webkit_editor_drag_data_received_cb (GtkWidget *widget,
+                                     GdkDragContext *context,
+                                     gint x,
+                                     gint y,
+                                     GtkSelectionData *selection,
+                                     guint info,
+                                     guint time)
+{
+       EWebKitEditor *wk_editor = E_WEBKIT_EDITOR (widget);
+       gboolean is_move = FALSE;
+
+       g_signal_handler_disconnect (wk_editor, wk_editor->priv->drag_data_received_handler_id);
+       wk_editor->priv->drag_data_received_handler_id = 0;
+
+       /* Leave DnD inside the view on WebKit */
+       /* Leave the text on WebKit to handle it. */
+       if (wk_editor->priv->performing_drag ||
+           info == E_DND_TARGET_TYPE_UTF8_STRING || info == E_DND_TARGET_TYPE_STRING ||
+           info == E_DND_TARGET_TYPE_TEXT_PLAIN || info == E_DND_TARGET_TYPE_TEXT_PLAIN_UTF8) {
+               gdk_drag_status (context, gdk_drag_context_get_selected_action(context), time);
+               GTK_WIDGET_CLASS (e_webkit_editor_parent_class)->drag_drop (widget, context, x, y, time);
+               g_signal_stop_emission_by_name (widget, "drag-data-received");
+               return;
+       }
+
+       is_move = gdk_drag_context_get_selected_action(context) == GDK_ACTION_MOVE;
+
+       if (info == E_DND_TARGET_TYPE_TEXT_HTML) {
+               const guchar *data;
+               gint length;
+               gint list_len, len;
+               gchar *text;
+
+               data = gtk_selection_data_get_data (selection);
+               length = gtk_selection_data_get_length (selection);
+
+               if (!data || length < 0) {
+                       gtk_drag_finish (context, FALSE, is_move, time);
+                       g_signal_stop_emission_by_name (widget, "drag-data-received");
+                       return;
+               }
+
+               webkit_editor_move_caret_on_coordinates (E_CONTENT_EDITOR (widget), x, y, FALSE);
+
+               list_len = length;
+               do {
+                       text = next_uri ((guchar **) &data, &len, &list_len);
+                       webkit_editor_insert_content (
+                               E_CONTENT_EDITOR (wk_editor),
+                               text,
+                               E_CONTENT_EDITOR_INSERT_TEXT_HTML);
+                       g_free (text);
+               } while (list_len);
+
+               gtk_drag_finish (context, TRUE, is_move, time);
+               g_signal_stop_emission_by_name (widget, "drag-data-received");
+               return;
+       }
+}
+
+static gboolean
+webkit_editor_drag_drop_cb (EWebKitEditor *wk_editor,
+                            GdkDragContext *context,
+                            gint x,
+                            gint y,
+                            guint time)
+{
+       wk_editor->priv->drag_data_received_handler_id = g_signal_connect (
+               wk_editor, "drag-data-received",
+               G_CALLBACK (webkit_editor_drag_data_received_cb), NULL);
+
+       webkit_editor_set_changed (wk_editor, TRUE);
+
+       return FALSE;
 }
 
 static void
@@ -6079,10 +6199,22 @@ e_webkit_editor_init (EWebKitEditor *wk_editor)
                G_CALLBACK (webkit_editor_mouse_target_changed_cb), NULL);
 
        g_signal_connect (
+               wk_editor, "drag-begin",
+               G_CALLBACK (webkit_editor_drag_begin_cb), NULL);
+
+       g_signal_connect (
+               wk_editor, "drag-failed",
+               G_CALLBACK (webkit_editor_drag_failed_cb), NULL);
+
+       g_signal_connect (
                wk_editor, "drag-end",
                G_CALLBACK (webkit_editor_drag_end_cb), NULL);
 
        g_signal_connect (
+               wk_editor, "drag-drop",
+               G_CALLBACK (webkit_editor_drag_drop_cb), NULL);
+
+       g_signal_connect (
                wk_editor, "web-process-crashed",
                G_CALLBACK (webkit_editor_web_process_crashed_cb), NULL);
 
diff --git a/src/modules/webkit-editor/web-extension/e-composer-dom-functions.c 
b/src/modules/webkit-editor/web-extension/e-composer-dom-functions.c
index a200680..1544081 100644
--- a/src/modules/webkit-editor/web-extension/e-composer-dom-functions.c
+++ b/src/modules/webkit-editor/web-extension/e-composer-dom-functions.c
@@ -589,247 +589,3 @@ e_composer_dom_get_raw_body_content (EEditorPage *editor_page)
 
        return  webkit_dom_html_element_get_inner_text (body);
 }
-
-static void
-insert_nbsp_history_event (WebKitDOMDocument *document,
-                           EEditorUndoRedoManager *manager,
-                           gboolean delete,
-                           guint x,
-                           guint y)
-{
-       EEditorHistoryEvent *event;
-       WebKitDOMDocumentFragment *fragment;
-
-       event = g_new0 (EEditorHistoryEvent, 1);
-       event->type = HISTORY_AND;
-       e_editor_undo_redo_manager_insert_history_event (manager, event);
-
-       fragment = webkit_dom_document_create_document_fragment (document);
-       webkit_dom_node_append_child (
-               WEBKIT_DOM_NODE (fragment),
-               WEBKIT_DOM_NODE (
-                       webkit_dom_document_create_text_node (document, UNICODE_NBSP)),
-               NULL);
-
-       event = g_new0 (EEditorHistoryEvent, 1);
-       event->type = HISTORY_DELETE;
-
-       if (delete)
-               g_object_set_data (G_OBJECT (fragment), "history-delete-key", GINT_TO_POINTER (1));
-
-       event->data.fragment = fragment;
-
-       event->before.start.x = x;
-       event->before.start.y = y;
-       event->before.end.x = x;
-       event->before.end.y = y;
-
-       event->after.start.x = x;
-       event->after.start.y = y;
-       event->after.end.x = x;
-       event->after.end.y = y;
-
-       e_editor_undo_redo_manager_insert_history_event (manager, event);
-}
-
-void
-e_composer_dom_save_drag_and_drop_history (EEditorPage *editor_page)
-{
-       WebKitDOMDocument *document;
-       WebKitDOMDocumentFragment *fragment;
-       WebKitDOMDOMSelection *dom_selection = NULL;
-       WebKitDOMDOMWindow *dom_window = NULL;
-       WebKitDOMRange *beginning_of_line = NULL;
-       WebKitDOMRange *range = NULL, *range_clone = NULL;
-       EEditorHistoryEvent *event;
-       EEditorUndoRedoManager *manager;
-       gboolean start_to_start, end_to_end;
-       gchar *range_text;
-       guint x, y;
-
-       g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
-
-       document = e_editor_page_get_document (editor_page);
-       manager = e_editor_page_get_undo_redo_manager (editor_page);
-
-       if (!(dom_window = webkit_dom_document_get_default_view (document)))
-               return;
-
-       if (!(dom_selection = webkit_dom_dom_window_get_selection (dom_window))) {
-               g_clear_object (&dom_window);
-               return;
-       }
-
-       g_clear_object (&dom_window);
-
-       if (webkit_dom_dom_selection_get_range_count (dom_selection) < 1) {
-               g_clear_object (&dom_selection);
-               return;
-       }
-
-       /* Obtain the dragged content. */
-       range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
-       range_clone = webkit_dom_range_clone_range (range, NULL);
-
-       /* Create the history event for the content that will
-        * be removed by DnD. */
-       event = g_new0 (EEditorHistoryEvent, 1);
-       event->type = HISTORY_DELETE;
-
-       e_editor_dom_selection_get_coordinates (editor_page,
-               &event->before.start.x,
-               &event->before.start.y,
-               &event->before.end.x,
-               &event->before.end.y);
-
-       x = event->before.start.x;
-       y = event->before.start.y;
-
-       event->after.start.x = x;
-       event->after.start.y = y;
-       event->after.end.x = x;
-       event->after.end.y = y;
-
-       /* Save the content that will be removed. */
-       fragment = webkit_dom_range_clone_contents (range_clone, NULL);
-
-       /* Extend the cloned range to point one character after
-        * the selection ends to later check if there is a whitespace
-        * after it. */
-       webkit_dom_range_set_end (
-               range_clone,
-               webkit_dom_range_get_end_container (range_clone, NULL),
-               webkit_dom_range_get_end_offset (range_clone, NULL) + 1,
-               NULL);
-       range_text = webkit_dom_range_get_text (range_clone);
-
-       /* Check if the current selection starts on the beginning
-        * of line. */
-       webkit_dom_dom_selection_modify (
-               dom_selection, "extend", "left", "lineboundary");
-       beginning_of_line = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
-       start_to_start = webkit_dom_range_compare_boundary_points (
-               beginning_of_line, 0 /* START_TO_START */, range, NULL) == 0;
-
-       /* Restore the selection to state before the check. */
-       webkit_dom_dom_selection_remove_all_ranges (dom_selection);
-       webkit_dom_dom_selection_add_range (dom_selection, range);
-       g_clear_object (&beginning_of_line);
-
-       /* Check if the current selection end on the end of the line. */
-       webkit_dom_dom_selection_modify (
-               dom_selection, "extend", "right", "lineboundary");
-       beginning_of_line = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
-       end_to_end = webkit_dom_range_compare_boundary_points (
-               beginning_of_line, 2 /* END_TO_END */, range, NULL) == 0;
-
-       /* Dragging the whole line. */
-       if (start_to_start && end_to_end) {
-               WebKitDOMNode *container, *actual_block, *tmp_block;
-
-               /* Select the whole line (to the beginning of the next
-                * one so we can reuse the undo code while undoing this.
-                * Because of this we need to special mark the event
-                * with history-drag-and-drop to correct the selection
-                * after undoing it (otherwise the beginning of the next
-                * line will be selected as well. */
-               webkit_dom_dom_selection_modify (
-                       dom_selection, "extend", "right", "character");
-               g_clear_object (&beginning_of_line);
-               beginning_of_line = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
-
-               container = webkit_dom_range_get_end_container (range, NULL);
-               actual_block = e_editor_dom_get_parent_block_node_from_child (container);
-
-               tmp_block = webkit_dom_range_get_end_container (beginning_of_line, NULL);
-               if ((tmp_block = e_editor_dom_get_parent_block_node_from_child (tmp_block))) {
-                       e_editor_dom_selection_get_coordinates (editor_page,
-                               &event->before.start.x,
-                               &event->before.start.y,
-                               &event->before.end.x,
-                               &event->before.end.y);
-
-                       /* Create the right content for the history event. */
-                       fragment = webkit_dom_document_create_document_fragment (document);
-                       /* The removed line. */
-                       webkit_dom_node_append_child (
-                               WEBKIT_DOM_NODE (fragment),
-                               webkit_dom_node_clone_node_with_error (actual_block, TRUE, NULL),
-                               NULL);
-                       /* The following block, but empty. */
-                       webkit_dom_node_append_child (
-                               WEBKIT_DOM_NODE (fragment),
-                               webkit_dom_node_clone_node_with_error (tmp_block, FALSE, NULL),
-                               NULL);
-                       g_object_set_data (
-                               G_OBJECT (fragment),
-                               "history-drag-and-drop",
-                               GINT_TO_POINTER (1));
-                       /* It should act as a Delete key press. */
-                       g_object_set_data (
-                               G_OBJECT (fragment),
-                               "history-delete-key",
-                               GINT_TO_POINTER (1));
-               }
-       }
-
-       event->data.fragment = fragment;
-       e_editor_undo_redo_manager_insert_history_event (manager, event);
-
-       /* Selection is ending on the end of the line, check if
-        * there is a space before the selection start. If so, it
-        * will be removed and we need create the history event
-        * for it. */
-       if (end_to_end) {
-               gchar *range_text_start;
-               glong start_offset;
-
-               start_offset = webkit_dom_range_get_start_offset (range_clone, NULL);
-               webkit_dom_range_set_start (
-                       range_clone,
-                       webkit_dom_range_get_start_container (range_clone, NULL),
-                       start_offset > 0 ? start_offset - 1 : 0,
-                       NULL);
-
-               range_text_start = webkit_dom_range_get_text (range_clone);
-               if (g_str_has_prefix (range_text_start, " ") ||
-                   g_str_has_prefix (range_text_start, UNICODE_NBSP))
-                       insert_nbsp_history_event (document, manager, FALSE, x, y);
-
-               g_free (range_text_start);
-       }
-
-       /* WebKit removes the space (if presented) after selection and
-        * we need to create a new history event for it. */
-       if (g_str_has_suffix (range_text, " ") ||
-           g_str_has_suffix (range_text, UNICODE_NBSP))
-               insert_nbsp_history_event (document, manager, TRUE, x, y);
-
-       g_free (range_text);
-
-       /* Restore the selection to original state. */
-       webkit_dom_dom_selection_remove_all_ranges (dom_selection);
-       webkit_dom_dom_selection_add_range (dom_selection, range);
-       g_clear_object (&beginning_of_line);
-
-       /* All the things above were about removing the content,
-        * create an AND event to continue later with inserting
-        * the dropped content. */
-       event = g_new0 (EEditorHistoryEvent, 1);
-       event->type = HISTORY_AND;
-       e_editor_undo_redo_manager_insert_history_event (manager, event);
-
-       g_clear_object (&dom_selection);
-
-       g_clear_object (&range);
-       g_clear_object (&range_clone);
-}
-
-void
-e_composer_dom_clean_after_drag_and_drop (EEditorPage *editor_page)
-{
-       g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
-
-       e_editor_dom_save_history_for_drop (editor_page);
-       e_editor_dom_check_magic_links (editor_page, FALSE);
-}
diff --git a/src/modules/webkit-editor/web-extension/e-composer-dom-functions.h 
b/src/modules/webkit-editor/web-extension/e-composer-dom-functions.h
index 8e0f934..a204346 100644
--- a/src/modules/webkit-editor/web-extension/e-composer-dom-functions.h
+++ b/src/modules/webkit-editor/web-extension/e-composer-dom-functions.h
@@ -38,10 +38,6 @@ gchar *              e_composer_dom_get_raw_body_content_without_signature
                                                (EEditorPage *editor_page);
 gchar *                e_composer_dom_get_raw_body_content
                                                (EEditorPage *editor_page);
-void           e_composer_dom_save_drag_and_drop_history
-                                               (EEditorPage *editor_page);
-void           e_composer_dom_clean_after_drag_and_drop
-                                               (EEditorPage *editor_page);
 
 G_END_DECLS
 
diff --git a/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c 
b/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c
index 214f69d..ad561a0 100644
--- a/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c
+++ b/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c
@@ -5688,6 +5688,64 @@ body_compositionend_event_cb (WebKitDOMElement *element,
 }
 
 static void
+body_drop_event_cb (WebKitDOMElement *element,
+                    WebKitDOMUIEvent *event,
+                    EEditorPage *editor_page)
+{
+       g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
+
+       if (e_editor_page_is_pasting_content_from_itself (editor_page))
+               e_editor_dom_save_history_for_drop (editor_page);
+}
+
+static void
+body_dragstart_event_cb (WebKitDOMElement *element,
+                         WebKitDOMUIEvent *event,
+                         EEditorPage *editor_page)
+{
+       g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
+
+       e_editor_dom_remove_input_event_listener_from_body (editor_page);
+       e_editor_page_set_pasting_content_from_itself (editor_page, TRUE);
+       e_editor_dom_save_history_for_drag (editor_page);
+}
+
+static void
+body_dragend_event_cb (WebKitDOMElement *element,
+                       WebKitDOMUIEvent *event,
+                       EEditorPage *editor_page)
+{
+       EEditorHistoryEvent *ev;
+       EEditorUndoRedoManager *manager;
+
+       g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
+
+       manager = e_editor_page_get_undo_redo_manager (editor_page);
+       if (e_editor_page_is_pasting_content_from_itself (editor_page) &&
+          (ev = e_editor_undo_redo_manager_get_current_history_event (manager))) {
+               if (ev->type == HISTORY_INSERT_HTML &&
+                   ev->after.start.x == 0 && ev->after.start.y == 0 &&
+                   ev->after.end.x == 0 && ev->after.end.y == 0) {
+                       e_editor_dom_selection_get_coordinates (editor_page,
+                               &ev->after.start.x,
+                               &ev->after.start.y,
+                               &ev->after.end.x,
+                               &ev->after.end.y);
+                       e_editor_dom_force_spell_check_in_viewport (editor_page);
+               } else {
+                       /* Drag and Drop was cancelled */
+                       if (ev->type == HISTORY_AND) {
+                               e_editor_undo_redo_manager_remove_current_history_event (manager);
+                               e_editor_undo_redo_manager_remove_current_history_event (manager);
+                       }
+               }
+       }
+
+       e_editor_page_set_pasting_content_from_itself (editor_page, FALSE);
+       e_editor_dom_register_input_event_listener_on_body (editor_page);
+}
+
+static void
 register_html_events_handlers (EEditorPage *editor_page,
                                WebKitDOMHTMLElement *body)
 {
@@ -5727,6 +5785,27 @@ register_html_events_handlers (EEditorPage *editor_page,
                G_CALLBACK (body_compositionend_event_cb),
                FALSE,
                editor_page);
+
+       webkit_dom_event_target_add_event_listener (
+               WEBKIT_DOM_EVENT_TARGET (body),
+               "drop",
+               G_CALLBACK (body_drop_event_cb),
+               FALSE,
+               editor_page);
+
+       webkit_dom_event_target_add_event_listener (
+               WEBKIT_DOM_EVENT_TARGET (body),
+               "dragstart",
+               G_CALLBACK (body_dragstart_event_cb),
+               FALSE,
+               editor_page);
+
+       webkit_dom_event_target_add_event_listener (
+               WEBKIT_DOM_EVENT_TARGET (body),
+               "dragend",
+               G_CALLBACK (body_dragend_event_cb),
+               FALSE,
+               editor_page);
 }
 
 void
@@ -8772,7 +8851,7 @@ e_editor_dom_insert_html (EEditorPage *editor_page,
 {
        EEditorHistoryEvent *ev = NULL;
        EEditorUndoRedoManager *manager;
-       gboolean html_mode;
+       gboolean html_mode, undo_redo_in_progress;
        WebKitDOMDocument *document;
        WebKitDOMNode *block = NULL;
 
@@ -8782,7 +8861,8 @@ e_editor_dom_insert_html (EEditorPage *editor_page,
        document = e_editor_page_get_document (editor_page);
 
        manager = e_editor_page_get_undo_redo_manager (editor_page);
-       if (!e_editor_undo_redo_manager_is_operation_in_progress (manager)) {
+       undo_redo_in_progress = e_editor_undo_redo_manager_is_operation_in_progress (manager);
+       if (!undo_redo_in_progress) {
                gboolean collapsed;
 
                ev = g_new0 (EEditorHistoryEvent, 1);
@@ -10776,6 +10856,239 @@ e_editor_dom_get_caret_position (EEditorPage *editor_page)
        return ret_val;
 }
 
+static void
+insert_nbsp_history_event (WebKitDOMDocument *document,
+                           EEditorUndoRedoManager *manager,
+                           gboolean delete,
+                           guint x,
+                           guint y)
+{
+       EEditorHistoryEvent *event;
+       WebKitDOMDocumentFragment *fragment;
+
+       event = g_new0 (EEditorHistoryEvent, 1);
+       event->type = HISTORY_AND;
+       e_editor_undo_redo_manager_insert_history_event (manager, event);
+
+       fragment = webkit_dom_document_create_document_fragment (document);
+       webkit_dom_node_append_child (
+               WEBKIT_DOM_NODE (fragment),
+               WEBKIT_DOM_NODE (
+                       webkit_dom_document_create_text_node (document, UNICODE_NBSP)),
+               NULL);
+
+       event = g_new0 (EEditorHistoryEvent, 1);
+       event->type = HISTORY_DELETE;
+
+       if (delete)
+               g_object_set_data (G_OBJECT (fragment), "history-delete-key", GINT_TO_POINTER (1));
+
+       event->data.fragment = fragment;
+
+       event->before.start.x = x;
+       event->before.start.y = y;
+       event->before.end.x = x;
+       event->before.end.y = y;
+
+       event->after.start.x = x;
+       event->after.start.y = y;
+       event->after.end.x = x;
+       event->after.end.y = y;
+
+       e_editor_undo_redo_manager_insert_history_event (manager, event);
+}
+void
+e_editor_dom_save_history_for_drag (EEditorPage *editor_page)
+{
+       WebKitDOMDocument *document;
+       WebKitDOMDocumentFragment *fragment;
+       WebKitDOMDOMSelection *dom_selection = NULL;
+       WebKitDOMDOMWindow *dom_window = NULL;
+       WebKitDOMRange *beginning_of_line = NULL;
+       WebKitDOMRange *range = NULL, *range_clone = NULL;
+       EEditorHistoryEvent *event;
+       EEditorUndoRedoManager *manager;
+       gboolean start_to_start, end_to_end;
+       gchar *range_text;
+       guint x, y;
+
+       g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
+
+       document = e_editor_page_get_document (editor_page);
+       manager = e_editor_page_get_undo_redo_manager (editor_page);
+
+       if (!(dom_window = webkit_dom_document_get_default_view (document)))
+               return;
+
+       if (!(dom_selection = webkit_dom_dom_window_get_selection (dom_window))) {
+               g_clear_object (&dom_window);
+               return;
+       }
+
+       g_clear_object (&dom_window);
+
+       if (webkit_dom_dom_selection_get_range_count (dom_selection) < 1) {
+               g_clear_object (&dom_selection);
+               return;
+       }
+
+       /* Obtain the dragged content. */
+       range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
+       range_clone = webkit_dom_range_clone_range (range, NULL);
+
+       /* Create the history event for the content that will
+        * be removed by DnD. */
+       event = g_new0 (EEditorHistoryEvent, 1);
+       event->type = HISTORY_DELETE;
+
+       e_editor_dom_selection_get_coordinates (editor_page,
+               &event->before.start.x,
+               &event->before.start.y,
+               &event->before.end.x,
+               &event->before.end.y);
+
+       x = event->before.start.x;
+       y = event->before.start.y;
+
+       event->after.start.x = x;
+       event->after.start.y = y;
+       event->after.end.x = x;
+       event->after.end.y = y;
+
+       /* Save the content that will be removed. */
+       fragment = webkit_dom_range_clone_contents (range_clone, NULL);
+
+       /* Extend the cloned range to point one character after
+        * the selection ends to later check if there is a whitespace
+        * after it. */
+       webkit_dom_range_set_end (
+               range_clone,
+               webkit_dom_range_get_end_container (range_clone, NULL),
+               webkit_dom_range_get_end_offset (range_clone, NULL) + 1,
+               NULL);
+       range_text = webkit_dom_range_get_text (range_clone);
+
+       /* Check if the current selection starts on the beginning of line. */
+       webkit_dom_dom_selection_modify (
+               dom_selection, "extend", "left", "lineboundary");
+       beginning_of_line = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
+       start_to_start = webkit_dom_range_compare_boundary_points (
+               beginning_of_line, WEBKIT_DOM_RANGE_START_TO_START, range, NULL) == 0;
+
+       /* Restore the selection to state before the check. */
+       webkit_dom_dom_selection_remove_all_ranges (dom_selection);
+       webkit_dom_dom_selection_add_range (dom_selection, range);
+       g_clear_object (&beginning_of_line);
+#if 0
+       /* Check if the current selection end on the end of the line. */
+       webkit_dom_dom_selection_modify (
+               dom_selection, "extend", "right", "lineboundary");
+       beginning_of_line = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
+       end_to_end = webkit_dom_range_compare_boundary_points (
+               beginning_of_line, WEBKIT_DOM_RANGE_END_TO_END, range, NULL) == 0;
+
+       /* Dragging the whole line. */
+       if (start_to_start && end_to_end) {
+               WebKitDOMNode *container, *actual_block, *tmp_block;
+
+               /* Select the whole line (to the beginning of the next
+                * one so we can reuse the undo code while undoing this.
+                * Because of this we need to special mark the event
+                * with history-drag-and-drop to correct the selection
+                * after undoing it (otherwise the beginning of the next
+                * line will be selected as well. */
+               webkit_dom_dom_selection_modify (
+                       dom_selection, "extend", "right", "character");
+               g_clear_object (&beginning_of_line);
+               beginning_of_line = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
+
+               container = webkit_dom_range_get_end_container (range, NULL);
+               actual_block = e_editor_dom_get_parent_block_node_from_child (container);
+
+               tmp_block = webkit_dom_range_get_end_container (beginning_of_line, NULL);
+               if ((tmp_block = e_editor_dom_get_parent_block_node_from_child (tmp_block))) {
+                       e_editor_dom_selection_get_coordinates (editor_page,
+                               &event->before.start.x,
+                               &event->before.start.y,
+                               &event->before.end.x,
+                               &event->before.end.y);
+
+                       /* Create the right content for the history event. */
+                       fragment = webkit_dom_document_create_document_fragment (document);
+                       /* The removed line. */
+                       webkit_dom_node_append_child (
+                               WEBKIT_DOM_NODE (fragment),
+                               webkit_dom_node_clone_node_with_error (actual_block, TRUE, NULL),
+                               NULL);
+                       /* The following block, but empty. */
+                       webkit_dom_node_append_child (
+                               WEBKIT_DOM_NODE (fragment),
+                               webkit_dom_node_clone_node_with_error (tmp_block, FALSE, NULL),
+                               NULL);
+                       g_object_set_data (
+                               G_OBJECT (fragment),
+                               "history-drag-and-drop",
+                               GINT_TO_POINTER (1));
+                       /* It should act as a Delete key press. */
+                       g_object_set_data (
+                               G_OBJECT (fragment),
+                               "history-delete-key",
+                               GINT_TO_POINTER (1));
+               }
+       }
+#endif
+       event->data.fragment = fragment;
+       e_editor_undo_redo_manager_insert_history_event (manager, event);
+#if 0
+       /* Selection is ending on the end of the line, check if
+        * there is a space before the selection start. If so, it
+        * will be removed and we need create the history event
+        * for it. */
+       if (end_to_end) {
+               gchar *range_text_start;
+               glong start_offset;
+
+               start_offset = webkit_dom_range_get_start_offset (range_clone, NULL);
+               webkit_dom_range_set_start (
+                       range_clone,
+                       webkit_dom_range_get_start_container (range_clone, NULL),
+                       start_offset > 0 ? start_offset - 1 : 0,
+                       NULL);
+
+               range_text_start = webkit_dom_range_get_text (range_clone);
+               if (g_str_has_prefix (range_text_start, " ") ||
+                   g_str_has_prefix (range_text_start, UNICODE_NBSP))
+                       insert_nbsp_history_event (document, manager, FALSE, x, y);
+
+               g_free (range_text_start);
+       }
+#endif
+       /* WebKit removes the space (if presented) after selection and
+        * we need to create a new history event for it. */
+       if (g_str_has_suffix (range_text, " ") ||
+           g_str_has_suffix (range_text, UNICODE_NBSP))
+               insert_nbsp_history_event (document, manager, TRUE, x, y);
+
+       g_free (range_text);
+
+       /* Restore the selection to original state. */
+       webkit_dom_dom_selection_remove_all_ranges (dom_selection);
+       webkit_dom_dom_selection_add_range (dom_selection, range);
+       g_clear_object (&beginning_of_line);
+
+       /* All the things above were about removing the content,
+        * create an AND event to continue later with inserting
+        * the dropped content. */
+       event = g_new0 (EEditorHistoryEvent, 1);
+       event->type = HISTORY_AND;
+       e_editor_undo_redo_manager_insert_history_event (manager, event);
+
+       g_clear_object (&dom_selection);
+
+       g_clear_object (&range);
+       g_clear_object (&range_clone);
+}
+
 void
 e_editor_dom_save_history_for_drop (EEditorPage *editor_page)
 {
@@ -10823,14 +11136,6 @@ e_editor_dom_save_history_for_drop (EEditorPage *editor_page)
 
        range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
 
-       /* Remove the last inserted history event as this one was inserted in
-        * body_input_event_cb and is wrong as its type is HISTORY_INPUT. */
-       /* FIXME we could probably disable the HTML input event callback while
-        * doing DnD within the view */
-       event = e_editor_undo_redo_manager_get_current_history_event (manager);
-       if (event && event->type == HISTORY_INPUT)
-               e_editor_undo_redo_manager_remove_current_history_event (manager);
-
        event = g_new0 (EEditorHistoryEvent, 1);
        event->type = HISTORY_INSERT_HTML;
 
@@ -10849,19 +11154,8 @@ e_editor_dom_save_history_for_drop (EEditorPage *editor_page)
        event->before.end.x = event->before.start.x;
        event->before.end.y = event->before.start.y;
 
-       if (length > 0)
-               webkit_dom_dom_selection_collapse_to_start (dom_selection, NULL);
-       else
-               webkit_dom_dom_selection_collapse_to_end (dom_selection, NULL);
-
-       e_editor_dom_selection_get_coordinates (editor_page,
-               &event->after.start.x,
-               &event->after.start.y,
-               &event->after.end.x,
-               &event->after.end.y);
-
        e_editor_undo_redo_manager_insert_history_event (manager, event);
-
+#if 0 /* FIXME Not exactly sure if it is still needed */
        if (!e_editor_page_get_html_mode (editor_page)) {
                list = webkit_dom_document_query_selector_all (
                        document, "span[style^=font-family]", NULL);
@@ -10887,21 +11181,12 @@ e_editor_dom_save_history_for_drop (EEditorPage *editor_page)
                if (length > 0)
                        e_editor_dom_selection_restore (editor_page);
        }
-
-       e_editor_dom_force_spell_check_in_viewport (editor_page);
+#endif
 
        g_clear_object (&range);
        g_clear_object (&dom_selection);
 }
 
-void
-e_editor_dom_drag_and_drop_end (EEditorPage *editor_page)
-{
-       g_return_if_fail (E_IS_EDITOR_PAGE (editor_page));
-
-       e_editor_dom_save_history_for_drop (editor_page);
-}
-
 static void
 dom_set_link_color_in_document (EEditorPage *editor_page,
                                 const gchar *color,
diff --git a/src/modules/webkit-editor/web-extension/e-editor-dom-functions.h 
b/src/modules/webkit-editor/web-extension/e-editor-dom-functions.h
index 518a409..3cb2085 100644
--- a/src/modules/webkit-editor/web-extension/e-editor-dom-functions.h
+++ b/src/modules/webkit-editor/web-extension/e-editor-dom-functions.h
@@ -158,7 +158,6 @@ void                e_editor_dom_process_content_after_mode_change
                                                (EEditorPage *editor_page);
 guint          e_editor_dom_get_caret_offset   (EEditorPage *editor_page);
 guint          e_editor_dom_get_caret_position (EEditorPage *editor_page);
-void           e_editor_dom_drag_and_drop_end  (EEditorPage *editor_page);
 void           e_editor_dom_set_link_color     (EEditorPage *editor_page,
                                                 const gchar *color);
 void           e_editor_dom_set_visited_link_color
@@ -208,6 +207,8 @@ WebKitDOMElement *
                                                 WebKitDOMElement *element);
 gint           e_editor_dom_get_citation_level (WebKitDOMNode *node,
                                                 gboolean set_plaintext_quoted);
+void           e_editor_dom_save_history_for_drag
+                                               (EEditorPage *editor_page);
 void           e_editor_dom_save_history_for_drop
                                                (EEditorPage *editor_page);
 void           e_editor_dom_fix_file_uri_images
diff --git a/src/modules/webkit-editor/web-extension/e-editor-web-extension.c 
b/src/modules/webkit-editor/web-extension/e-editor-web-extension.c
index 15db265..bdb4274 100644
--- a/src/modules/webkit-editor/web-extension/e-editor-web-extension.c
+++ b/src/modules/webkit-editor/web-extension/e-editor-web-extension.c
@@ -478,9 +478,6 @@ static const gchar *introspection_xml =
 "      <arg type='s' name='selector' direction='in'/>"
 "      <arg type='s' name='uri' direction='in'/>"
 "    </method>"
-"    <method name='DOMDragAndDropEnd'>"
-"      <arg type='t' name='page_id' direction='in'/>"
-"    </method>"
 "    <method name='DOMMoveSelectionOnPoint'>"
 "      <arg type='t' name='page_id' direction='in'/>"
 "      <arg type='i' name='x' direction='in'/>"
@@ -579,12 +576,6 @@ static const gchar *introspection_xml =
 "      <arg type='b' name='out_check_if_signature_is_changed' direction='out'/>"
 "      <arg type='b' name='out_ignore_next_signature_change' direction='out'/>"
 "    </method>"
-"    <method name='DOMSaveDragAndDropHistory'>"
-"      <arg type='t' name='page_id' direction='in'/>"
-"    </method>"
-"    <method name='DOMCleanAfterDragAndDrop'>"
-"      <arg type='t' name='page_id' direction='in'/>"
-"    </method>"
 "    <method name='DOMGetActiveSignatureUid'>"
 "      <arg type='t' name='page_id' direction='in'/>"
 "      <arg type='s' name='uid' direction='out'/>"
@@ -1857,15 +1848,6 @@ handle_method_call (GDBusConnection *connection,
                e_editor_dom_replace_image_src (editor_page, selector, uri);
 
                g_dbus_method_invocation_return_value (invocation, NULL);
-       } else if (g_strcmp0 (method_name, "DOMDragAndDropEnd") == 0) {
-               g_variant_get (parameters, "(t)", &page_id);
-
-               editor_page = get_editor_page_or_return_dbus_error (invocation, extension, page_id);
-               if (!editor_page)
-                       goto error;
-
-               e_editor_dom_drag_and_drop_end (editor_page);
-               g_dbus_method_invocation_return_value (invocation, NULL);
        } else if (g_strcmp0 (method_name, "DOMInsertSmiley") == 0) {
                const gchar *smiley_name;
 
@@ -2153,28 +2135,6 @@ handle_method_call (GDBusConnection *connection,
                                ignore_next_signature_change));
 
                g_free (new_signature_id);
-       } else if (g_strcmp0 (method_name, "DOMSaveDragAndDropHistory") == 0) {
-               g_variant_get (
-                       parameters, "(t)", &page_id);
-
-               editor_page = get_editor_page_or_return_dbus_error (invocation, extension, page_id);
-               if (!editor_page)
-                       goto error;
-
-               e_composer_dom_save_drag_and_drop_history (editor_page);
-
-               g_dbus_method_invocation_return_value (invocation, NULL);
-       } else if (g_strcmp0 (method_name, "DOMCleanAfterDragAndDrop") == 0) {
-               g_variant_get (
-                       parameters, "(t)", &page_id);
-
-               editor_page = get_editor_page_or_return_dbus_error (invocation, extension, page_id);
-               if (!editor_page)
-                       goto error;
-
-               e_composer_dom_clean_after_drag_and_drop (editor_page);
-
-               g_dbus_method_invocation_return_value (invocation, NULL);
        } else if (g_strcmp0 (method_name, "DOMGetActiveSignatureUid") == 0) {
                gchar *value;
 



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