Optimize some of the DOM functions related to selection

Utilize webkit_dom_dom_selection_get_is_collapsed when we don't need the Range
object and don't clone the current range and traverse it when determining if the
current selection has text.
This commit is contained in:
Tomas Popela
2016-04-19 15:17:35 +02:00
parent 29f67b6e5f
commit d83a448319
2 changed files with 48 additions and 46 deletions

View File

@ -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);

View File

@ -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;
}