diff --git a/e-util/e-html-editor-actions.c b/e-util/e-html-editor-actions.c index 1e651495b3..e5b524c470 100644 --- a/e-util/e-html-editor-actions.c +++ b/e-util/e-html-editor-actions.c @@ -517,17 +517,13 @@ action_cut_cb (GtkAction *action, dom_selection = webkit_dom_dom_window_get_selection (dom_window); g_object_unref (dom_window); - if (!webkit_dom_dom_selection_get_range_count (dom_selection)) { + if (!webkit_dom_dom_selection_get_range_count (dom_selection) || + webkit_dom_dom_selection_get_is_collapsed (dom_selection)) { g_object_unref (dom_selection); return; } range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL); - if (webkit_dom_range_get_collapsed (range, NULL)) { - g_object_unref (range); - g_object_unref (dom_selection); - return; - } selection = e_html_editor_view_get_selection (view); diff --git a/e-util/e-html-editor-selection.c b/e-util/e-html-editor-selection.c index 9d13221858..fdbeabfbf0 100644 --- a/e-util/e-html-editor-selection.c +++ b/e-util/e-html-editor-selection.c @@ -913,50 +913,43 @@ e_html_editor_selection_ref_html_editor_view (EHTMLEditorSelection *selection) gboolean e_html_editor_selection_has_text (EHTMLEditorSelection *selection) { - WebKitDOMRange *range; - WebKitDOMNode *node; + EHTMLEditorView *view; + gboolean has_text = FALSE; + gchar *text = NULL; + WebKitDOMDocument *document; + WebKitDOMDOMWindow *dom_window = NULL; + WebKitDOMDOMSelection *dom_selection = NULL; + WebKitDOMRange *range = NULL; g_return_val_if_fail (E_IS_HTML_EDITOR_SELECTION (selection), FALSE); - range = html_editor_selection_get_current_range (selection); + view = e_html_editor_selection_ref_html_editor_view (selection); + g_return_val_if_fail (view != NULL, FALSE); - node = webkit_dom_range_get_start_container (range, NULL); - if (WEBKIT_DOM_IS_TEXT (node)) { - g_object_unref (range); - return TRUE; - } + document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view)); + g_object_unref (view); - node = webkit_dom_range_get_end_container (range, NULL); - if (WEBKIT_DOM_IS_TEXT (node)) { - g_object_unref (range); - return TRUE; - } + if (!(dom_window = webkit_dom_document_get_default_view (document))) + goto out; - node = WEBKIT_DOM_NODE (webkit_dom_range_clone_contents (range, NULL)); - while (node) { - if (WEBKIT_DOM_IS_TEXT (node)) { - g_object_unref (range); - return TRUE; - } + if (!(dom_selection = webkit_dom_dom_window_get_selection (dom_window))) + goto out; - if (webkit_dom_node_has_child_nodes (node)) { - node = webkit_dom_node_get_first_child (node); - } else if (webkit_dom_node_get_next_sibling (node)) { - node = webkit_dom_node_get_next_sibling (node); - } else { - node = webkit_dom_node_get_parent_node (node); - if (node) { - node = webkit_dom_node_get_next_sibling (node); - } - } - } + if (webkit_dom_dom_selection_get_is_collapsed (dom_selection)) + goto out; - if (node) - g_object_unref (node); + if (!(range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL))) + goto out; - g_object_unref (range); + text = webkit_dom_range_get_text (range); + has_text = text && *text; + out: + g_free (text); + g_clear_object (&dom_window); + g_clear_object (&dom_selection); + g_clear_object (&range); - return FALSE; + return has_text; } /** @@ -1071,17 +1064,30 @@ e_html_editor_selection_replace_caret_word (EHTMLEditorSelection *selection, gboolean e_html_editor_selection_is_collapsed (EHTMLEditorSelection *selection) { + EHTMLEditorView *view; gboolean collapsed; - WebKitDOMRange *range; + WebKitDOMDocument *document; + WebKitDOMDOMWindow *dom_window; + WebKitDOMDOMSelection *dom_selection; g_return_val_if_fail (E_IS_HTML_EDITOR_SELECTION (selection), TRUE); - range = html_editor_selection_get_current_range (selection); - if (!range) - return TRUE; + view = e_html_editor_selection_ref_html_editor_view (selection); + g_return_val_if_fail (view != NULL, TRUE); - collapsed = webkit_dom_range_get_collapsed (range, NULL); - g_object_unref (range); + document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view)); + g_object_unref (view); + if (!(dom_window = webkit_dom_document_get_default_view (document))) + return FALSE; + + if (!(dom_selection = webkit_dom_dom_window_get_selection (dom_window))) { + g_object_unref (dom_window); + return FALSE; + } + + collapsed = webkit_dom_dom_selection_get_is_collapsed (dom_selection); + + g_object_unref (dom_selection); return collapsed; }