[evolution/webkit-composer] Change the node-traversal helper functions



commit 6218c51b7336034bc8d057104d999509ba0e8d89
Author: Dan VrÃtil <dvratil redhat com>
Date:   Tue Aug 14 22:15:53 2012 +0200

    Change the node-traversal helper functions
    
    Rename e_editor_dom_node_get_parent_element() to
    e_editor_dom_node_find_parent_element() and change both functions
    to search not by GType of the object returned by WebKit, but by
    the actual tag name. Search by GType was broken, because WebKit
    often returns objects wich are of different type then the actual
    DOM element they wrap. Usually individual HTML elements, like
    WebKitDOMHTMLTableElement, are returned as instances of
    WebKitDOMHTMLElement and thus the GType check fails.

 widgets/editor/e-editor-hrule-dialog.c |   11 +++-----
 widgets/editor/e-editor-image-dialog.c |    9 +++---
 widgets/editor/e-editor-link-dialog.c  |   16 ++++-------
 widgets/editor/e-editor-selection.c    |    3 +-
 widgets/editor/e-editor-table-dialog.c |    5 +--
 widgets/editor/e-editor-utils.c        |   44 ++++++++++++++++++++++++++------
 widgets/editor/e-editor-utils.h        |    6 ++--
 widgets/editor/e-editor.c              |   12 ++++----
 8 files changed, 62 insertions(+), 44 deletions(-)
---
diff --git a/widgets/editor/e-editor-hrule-dialog.c b/widgets/editor/e-editor-hrule-dialog.c
index 4c2e5a7..0528c12 100644
--- a/widgets/editor/e-editor-hrule-dialog.c
+++ b/widgets/editor/e-editor-hrule-dialog.c
@@ -223,13 +223,11 @@ editor_hrule_dialog_show (GtkWidget *widget)
 
 	range = webkit_dom_dom_selection_get_range_at (selection, 0, NULL);
 
-	rule = e_editor_dom_node_get_parent_element (
-		webkit_dom_range_get_start_container (range, NULL),
-		WEBKIT_TYPE_DOM_HTMLHR_ELEMENT);
+	rule = e_editor_dom_node_find_parent_element (
+		webkit_dom_range_get_start_container (range, NULL), "HR");
 	if (!rule) {
 		rule = e_editor_dom_node_find_child_element (
-			webkit_dom_range_get_start_container (range, NULL),
-			WEBKIT_TYPE_DOM_HTMLHR_ELEMENT);
+			webkit_dom_range_get_start_container (range, NULL), "HR");
 	}
 
 	if (!rule) {
@@ -237,8 +235,7 @@ editor_hrule_dialog_show (GtkWidget *widget)
 			document, "insertHorizontalRule", FALSE, "");
 
 		rule = e_editor_dom_node_find_child_element (
-			webkit_dom_range_get_start_container (range, NULL),
-			WEBKIT_TYPE_DOM_HTMLHR_ELEMENT);
+			webkit_dom_range_get_start_container (range, NULL), "HR");
 
 		dialog->priv->hr_element = WEBKIT_DOM_HTMLHR_ELEMENT (rule);
 
diff --git a/widgets/editor/e-editor-image-dialog.c b/widgets/editor/e-editor-image-dialog.c
index c55d926..4e636a0 100644
--- a/widgets/editor/e-editor-image-dialog.c
+++ b/widgets/editor/e-editor-image-dialog.c
@@ -273,9 +273,8 @@ editor_image_dialog_set_url (EEditorImageDialog *dialog)
 	const gchar *url;
 
 	url = gtk_entry_get_text (GTK_ENTRY (dialog->priv->url_edit));
-	link = e_editor_dom_node_get_parent_element (
-		(WebKitDOMNode *) dialog->priv->image,
-		WEBKIT_TYPE_DOM_HTML_ANCHOR_ELEMENT);
+	link = e_editor_dom_node_find_parent_element (
+		(WebKitDOMNode *) dialog->priv->image, "A");
 
 	if (link) {
 		if (!url || !*url) {
@@ -377,8 +376,8 @@ editor_image_dialog_show (GtkWidget *gtk_widget)
 		GTK_SPIN_BUTTON (dialog->priv->y_padding_edit), val);
 
 
-	link = e_editor_dom_node_get_parent_element (
-		WEBKIT_DOM_NODE (dialog->priv->image), WEBKIT_TYPE_DOM_HTML_ANCHOR_ELEMENT);
+	link = e_editor_dom_node_find_parent_element (
+			WEBKIT_DOM_NODE (dialog->priv->image), "A");
 	if (link) {
 		tmp = webkit_dom_html_anchor_element_get_href (
 				(WebKitDOMHTMLAnchorElement *) link);
diff --git a/widgets/editor/e-editor-link-dialog.c b/widgets/editor/e-editor-link-dialog.c
index ce68c03..ae7707f 100644
--- a/widgets/editor/e-editor-link-dialog.c
+++ b/widgets/editor/e-editor-link-dialog.c
@@ -99,9 +99,8 @@ editor_link_dialog_ok (EEditorLinkDialog *dialog)
 	}
 
 	range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
-	link = e_editor_dom_node_get_parent_element (
-		webkit_dom_range_get_start_container (range, NULL),
-		WEBKIT_TYPE_DOM_HTML_ANCHOR_ELEMENT);
+	link = e_editor_dom_node_find_parent_element (
+			webkit_dom_range_get_start_container (range, NULL), "A");
 	if (!link) {
 		if ((webkit_dom_range_get_start_container (range, NULL) !=
 			webkit_dom_range_get_end_container (range, NULL)) ||
@@ -111,8 +110,7 @@ editor_link_dialog_ok (EEditorLinkDialog *dialog)
 			WebKitDOMDocumentFragment *fragment;
 			fragment = webkit_dom_range_extract_contents (range, NULL);
 			link = e_editor_dom_node_find_child_element (
-				WEBKIT_DOM_NODE (fragment),
-				WEBKIT_TYPE_DOM_HTML_ANCHOR_ELEMENT);
+				WEBKIT_DOM_NODE (fragment), "A");
 			webkit_dom_range_insert_node (
 				range, WEBKIT_DOM_NODE (fragment), NULL);
 
@@ -195,9 +193,8 @@ editor_link_dialog_show (GtkWidget *widget)
 	}
 
 	range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
-	link = e_editor_dom_node_get_parent_element (
-		webkit_dom_range_get_start_container (range, NULL),
-		WEBKIT_TYPE_DOM_HTML_ANCHOR_ELEMENT);
+	link = e_editor_dom_node_find_parent_element (
+		webkit_dom_range_get_start_container (range, NULL), "A");
 	if (!link) {
 		if ((webkit_dom_range_get_start_container (range, NULL) !=
 			webkit_dom_range_get_end_container (range, NULL)) ||
@@ -207,8 +204,7 @@ editor_link_dialog_show (GtkWidget *widget)
 			WebKitDOMDocumentFragment *fragment;
 			fragment = webkit_dom_range_clone_contents (range, NULL);
 			link = e_editor_dom_node_find_child_element (
-				WEBKIT_DOM_NODE (fragment),
-				WEBKIT_TYPE_DOM_HTML_ANCHOR_ELEMENT);
+					WEBKIT_DOM_NODE (fragment), "A");
 		}
 	}
 
diff --git a/widgets/editor/e-editor-selection.c b/widgets/editor/e-editor-selection.c
index f1818a2..710b914 100644
--- a/widgets/editor/e-editor-selection.c
+++ b/widgets/editor/e-editor-selection.c
@@ -169,8 +169,7 @@ get_font_property (EEditorSelection *selection,
 	}
 
 	node = webkit_dom_range_get_common_ancestor_container (range, NULL);
-	element = e_editor_dom_node_get_parent_element (
-			node, WEBKIT_TYPE_DOM_HTML_FONT_ELEMENT);
+	element = e_editor_dom_node_find_parent_element (node, "FONT");
 	if (!element) {
 		return NULL;
 	}
diff --git a/widgets/editor/e-editor-table-dialog.c b/widgets/editor/e-editor-table-dialog.c
index 5343608..3366a44 100644
--- a/widgets/editor/e-editor-table-dialog.c
+++ b/widgets/editor/e-editor-table-dialog.c
@@ -565,9 +565,8 @@ editor_table_dialog_show (GtkWidget *widget)
 		WebKitDOMRange *range;
 
 		range = webkit_dom_dom_selection_get_range_at (selection, 0, NULL);
-		table = e_editor_dom_node_get_parent_element (
-			webkit_dom_range_get_start_container (range, NULL),
-			WEBKIT_TYPE_DOM_HTML_TABLE_ELEMENT);
+		table = e_editor_dom_node_find_parent_element (
+			webkit_dom_range_get_start_container (range, NULL), "TABLE");
 
 		if (!table) {
 			dialog->priv->table_element = (WebKitDOMHTMLTableElement *)
diff --git a/widgets/editor/e-editor-utils.c b/widgets/editor/e-editor-utils.c
index 29ca04c..5daabff 100644
--- a/widgets/editor/e-editor-utils.c
+++ b/widgets/editor/e-editor-utils.c
@@ -21,16 +21,31 @@
 #endif
 
 #include "e-editor-utils.h"
-
+#include <string.h>
 
 WebKitDOMElement *
-e_editor_dom_node_get_parent_element (WebKitDOMNode *node,
-				      GType parent_type)
+e_editor_dom_node_find_parent_element (WebKitDOMNode *node,
+				       const gchar *tagname)
 {
+	gint taglen = strlen (tagname);
+
 	while (node) {
 
-		if (G_TYPE_CHECK_INSTANCE_TYPE (node, parent_type))
-			return (WebKitDOMElement *) node;
+		if (WEBKIT_DOM_IS_ELEMENT (node)) {
+			gchar *node_tagname;
+
+			node_tagname = webkit_dom_element_get_tag_name (
+						WEBKIT_DOM_ELEMENT (node));
+
+			if (node_tagname &&
+			    (strlen (node_tagname) == taglen) &&
+			    (g_ascii_strncasecmp (node_tagname, tagname, taglen) == 0)) {
+				g_free (node_tagname);
+				return (WebKitDOMElement *) node;
+			}
+
+			g_free (node_tagname);
+		}
 
 		node = (WebKitDOMNode *) webkit_dom_node_get_parent_element (node);
 	}
@@ -40,13 +55,26 @@ e_editor_dom_node_get_parent_element (WebKitDOMNode *node,
 
 WebKitDOMElement *
 e_editor_dom_node_find_child_element (WebKitDOMNode *node,
-				      GType child_type)
+				      const gchar *tagname)
 {
 	WebKitDOMNode *start_node = node;
+	gint taglen = strlen (tagname);
 
 	do {
-		if (G_TYPE_CHECK_INSTANCE_TYPE (node, child_type)) {
-			return WEBKIT_DOM_ELEMENT (node);
+		if (WEBKIT_DOM_IS_ELEMENT (node)) {
+			gchar *node_tagname;
+
+			node_tagname = webkit_dom_element_get_tag_name (
+					WEBKIT_DOM_ELEMENT (node));
+
+			if (node_tagname &&
+			    (strlen (node_tagname) == taglen) &&
+			    (g_ascii_strncasecmp (node_tagname, tagname, taglen) == 0)) {
+				g_free (node_tagname);
+				return (WebKitDOMElement *) node;
+			}
+
+			g_free (node_tagname);
 		}
 
 		if (webkit_dom_node_has_child_nodes (node)) {
diff --git a/widgets/editor/e-editor-utils.h b/widgets/editor/e-editor-utils.h
index dc57b1d..95f1a3b 100644
--- a/widgets/editor/e-editor-utils.h
+++ b/widgets/editor/e-editor-utils.h
@@ -21,12 +21,12 @@
 
 #include <webkit/webkitdom.h>
 
-WebKitDOMElement *	e_editor_dom_node_get_parent_element
+WebKitDOMElement *	e_editor_dom_node_find_parent_element
 							(WebKitDOMNode *node,
-							 GType parent_type);
+							 const gchar *tagname);
 
 WebKitDOMElement *	e_editor_dom_node_find_child_element
 							(WebKitDOMNode *node,
-							 GType child_type);
+							 const gchar *tagname);
 
 #endif /* E_EDITOR_UTILS_H */
diff --git a/widgets/editor/e-editor.c b/widgets/editor/e-editor.c
index fe94236..23ee597 100644
--- a/widgets/editor/e-editor.c
+++ b/widgets/editor/e-editor.c
@@ -96,13 +96,13 @@ editor_update_actions (EEditor *editor,
 	 *   - Cursor is on a link.
 	 *   - Cursor is on an image that has a URL or target.
 	 */
-	visible = (e_editor_dom_node_get_parent_element (
-			node, WEBKIT_TYPE_DOM_HTML_ANCHOR_ELEMENT) != NULL);
+	visible = (WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (node) ||
+		   (e_editor_dom_node_find_parent_element (node, "A") != NULL));
 	gtk_action_set_visible (ACTION (CONTEXT_REMOVE_LINK), visible);
 
 
-	visible = (e_editor_dom_node_get_parent_element (
-			node, WEBKIT_TYPE_DOM_HTML_TABLE_CELL_ELEMENT) != NULL);
+	visible = (WEBKIT_DOM_IS_HTML_TABLE_CELL_ELEMENT (node) ||
+		   (e_editor_dom_node_find_parent_element (node, "TD") != NULL));
 	gtk_action_set_visible (ACTION (CONTEXT_DELETE_CELL), visible);
 	gtk_action_set_visible (ACTION (CONTEXT_DELETE_COLUMN), visible);
 	gtk_action_set_visible (ACTION (CONTEXT_DELETE_ROW), visible);
@@ -115,8 +115,8 @@ editor_update_actions (EEditor *editor,
 	gtk_action_set_visible (ACTION (CONTEXT_PROPERTIES_CELL), visible);
 
 	/* Note the |= (cursor must be in a table cell). */
-	visible |= (e_editor_dom_node_get_parent_element (
-			node, WEBKIT_TYPE_DOM_HTML_TABLE_ELEMENT) != NULL);
+	visible |= (WEBKIT_DOM_IS_HTML_TABLE_ELEMENT (node) ||
+		    (e_editor_dom_node_find_parent_element (node, "TABLE") != NULL));
 	gtk_action_set_visible (ACTION (CONTEXT_PROPERTIES_TABLE), visible);
 
 	/********************** Spell Check Suggestions **********************/



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