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); dom_selection = webkit_dom_dom_window_get_selection (dom_window);
g_object_unref (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); g_object_unref (dom_selection);
return; return;
} }
range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL); 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); 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 gboolean
e_html_editor_selection_has_text (EHTMLEditorSelection *selection) e_html_editor_selection_has_text (EHTMLEditorSelection *selection)
{ {
WebKitDOMRange *range; EHTMLEditorView *view;
WebKitDOMNode *node; 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); 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); document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
if (WEBKIT_DOM_IS_TEXT (node)) { g_object_unref (view);
g_object_unref (range);
return TRUE;
}
node = webkit_dom_range_get_end_container (range, NULL); if (!(dom_window = webkit_dom_document_get_default_view (document)))
if (WEBKIT_DOM_IS_TEXT (node)) { goto out;
g_object_unref (range);
return TRUE;
}
node = WEBKIT_DOM_NODE (webkit_dom_range_clone_contents (range, NULL)); if (!(dom_selection = webkit_dom_dom_window_get_selection (dom_window)))
while (node) { goto out;
if (WEBKIT_DOM_IS_TEXT (node)) {
g_object_unref (range);
return TRUE;
}
if (webkit_dom_node_has_child_nodes (node)) { if (webkit_dom_dom_selection_get_is_collapsed (dom_selection))
node = webkit_dom_node_get_first_child (node); goto out;
} 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 (node) if (!(range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL)))
g_object_unref (node); 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 gboolean
e_html_editor_selection_is_collapsed (EHTMLEditorSelection *selection) e_html_editor_selection_is_collapsed (EHTMLEditorSelection *selection)
{ {
EHTMLEditorView *view;
gboolean collapsed; gboolean collapsed;
WebKitDOMRange *range; WebKitDOMDocument *document;
WebKitDOMDOMWindow *dom_window;
WebKitDOMDOMSelection *dom_selection;
g_return_val_if_fail (E_IS_HTML_EDITOR_SELECTION (selection), TRUE); g_return_val_if_fail (E_IS_HTML_EDITOR_SELECTION (selection), TRUE);
range = html_editor_selection_get_current_range (selection); view = e_html_editor_selection_ref_html_editor_view (selection);
if (!range) g_return_val_if_fail (view != NULL, TRUE);
return TRUE;
collapsed = webkit_dom_range_get_collapsed (range, NULL); document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
g_object_unref (range); 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; return collapsed;
} }