[lasem] dom_node: fix chained list of childs when using insert_before.



commit 22c1bab793ed69d857cecae7b7e8f1d710bbb18d
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Sun Nov 14 22:14:37 2010 +0100

    dom_node: fix chained list of childs when using insert_before.

 src/lsmdomnode.c |   32 +++++++++++++++++++++++++++-----
 tests/dom.c      |   47 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 74 insertions(+), 5 deletions(-)
---
diff --git a/src/lsmdomnode.c b/src/lsmdomnode.c
index 9f3eee4..7fbbcd9 100644
--- a/src/lsmdomnode.c
+++ b/src/lsmdomnode.c
@@ -115,7 +115,18 @@ lsm_dom_node_get_parent_node (LsmDomNode* self)
 LsmDomNodeList*
 lsm_dom_node_get_child_nodes (LsmDomNode* self)
 {
-	return lsm_dom_node_list_new (self);
+	LsmDomNodeList *list;
+
+	g_return_val_if_fail (LSM_IS_DOM_NODE (self), NULL);
+
+	list = g_object_get_data (G_OBJECT (self), "child-nodes");
+
+	if (list == NULL) {
+		list = lsm_dom_node_list_new (self);
+		g_object_set_data_full (G_OBJECT (self), "child-nodes", list, g_object_unref);
+	}
+
+	return list;
 }
 
 LsmDomNode*
@@ -180,8 +191,12 @@ lsm_dom_node_insert_before (LsmDomNode* self, LsmDomNode* new_child, LsmDomNode*
 	g_return_val_if_fail (LSM_IS_DOM_NODE (new_child), NULL);
 	g_return_val_if_fail (LSM_IS_DOM_NODE (ref_child), NULL);
 
-	if (ref_child->parent_node != self)
+	if (ref_child->parent_node != self) {
+		lsm_debug ("dom", "[LsmDomNode::insert_before] Ref child '%s' doesn't belong to '%s'",
+			   lsm_dom_node_get_node_name (ref_child),
+			   lsm_dom_node_get_node_name (self));
 		return NULL;
+	}
 
 	if (!LSM_DOM_NODE_GET_CLASS (self)->can_append_child (self, new_child)) {
 		lsm_debug ("dom", "[LsmDomNode::insert_before] Can't append '%s' to '%s'",
@@ -199,6 +214,8 @@ lsm_dom_node_insert_before (LsmDomNode* self, LsmDomNode* new_child, LsmDomNode*
 	else
 		ref_child->previous_sibling->next_sibling = new_child;
 
+	ref_child->previous_sibling = new_child;
+
 	node_class = LSM_DOM_NODE_GET_CLASS (self);
 
 	if (node_class->post_new_child)
@@ -213,6 +230,7 @@ LsmDomNode*
 lsm_dom_node_replace_child (LsmDomNode* self, LsmDomNode* new_child, LsmDomNode* old_child)
 {
 	LsmDomNode *next_sibling;
+	LsmDomNode *node;
 
 	g_return_val_if_fail (LSM_IS_DOM_NODE (self), NULL);
 	g_return_val_if_fail (LSM_IS_DOM_NODE (old_child), NULL);
@@ -222,7 +240,9 @@ lsm_dom_node_replace_child (LsmDomNode* self, LsmDomNode* new_child, LsmDomNode*
 
 	next_sibling = old_child->next_sibling;
 
-	lsm_dom_node_remove_child (self, old_child);
+	node = lsm_dom_node_remove_child (self, old_child);
+	if (node != old_child)
+		return NULL;
 
 	if (new_child == NULL)
 		return NULL;
@@ -230,9 +250,11 @@ lsm_dom_node_replace_child (LsmDomNode* self, LsmDomNode* new_child, LsmDomNode*
 	g_return_val_if_fail (LSM_IS_DOM_NODE (new_child), NULL);
 
 	if (next_sibling == NULL)
-		return lsm_dom_node_append_child (self, new_child);
+		lsm_dom_node_append_child (self, new_child);
 	else
-		return lsm_dom_node_insert_before (self, new_child, next_sibling);
+		lsm_dom_node_insert_before (self, new_child, next_sibling);
+
+	return old_child;
 }
 
 LsmDomNode*
diff --git a/tests/dom.c b/tests/dom.c
index 9a50ebb..33fe0d9 100644
--- a/tests/dom.c
+++ b/tests/dom.c
@@ -95,6 +95,7 @@ node_list_test (void)
 	g_assert (lsm_dom_node_list_get_item (childs, 0) == LSM_DOM_NODE (element));
 	g_assert (lsm_dom_node_list_get_item (childs, 1) == NULL);
 
+	g_object_ref (childs);
 	g_object_unref (document);
 
 	g_assert (lsm_dom_node_list_get_length (childs) == 0);
@@ -102,6 +103,51 @@ node_list_test (void)
 	g_object_unref (childs);
 }
 
+static void
+insert_before_test (void)
+{
+	LsmDomDocument *document;
+	LsmDomNode *node;
+	LsmDomNodeList *childs;
+	LsmDomElement *math;
+	LsmDomElement *mn1;
+	LsmDomElement *mn2;
+	LsmDomElement *mo1;
+	LsmDomElement *mo2;
+
+	document = lsm_dom_implementation_create_document ("math");
+	math = lsm_dom_document_create_element (document, "math");
+	lsm_dom_node_append_child (LSM_DOM_NODE (document), LSM_DOM_NODE (math));
+	mn1 = lsm_dom_document_create_element (document, "mn");
+	mn2 = lsm_dom_document_create_element (document, "mn");
+	mo1 = lsm_dom_document_create_element (document, "mo");
+
+	node = lsm_dom_node_append_child (LSM_DOM_NODE (math), LSM_DOM_NODE (mn2));
+	g_assert (node == LSM_DOM_NODE (mn2));
+	node = lsm_dom_node_insert_before (LSM_DOM_NODE (math), LSM_DOM_NODE (mn1), LSM_DOM_NODE (mn2));
+	g_assert (node == LSM_DOM_NODE (mn1));
+	node = lsm_dom_node_insert_before (LSM_DOM_NODE (math), LSM_DOM_NODE (mo1), LSM_DOM_NODE (mn2));
+	g_assert (node == LSM_DOM_NODE (mo1));
+
+	childs = lsm_dom_node_get_child_nodes (LSM_DOM_NODE (math));
+	g_assert (LSM_IS_DOM_NODE_LIST (childs));
+
+	g_assert (lsm_dom_node_list_get_item (childs, 0) == LSM_DOM_NODE (mn1));
+	g_assert (lsm_dom_node_list_get_item (childs, 1) == LSM_DOM_NODE (mo1));
+	g_assert (lsm_dom_node_list_get_item (childs, 2) == LSM_DOM_NODE (mn2));
+	g_assert (lsm_dom_node_list_get_length (childs) == 3);
+
+	mo2 = lsm_dom_document_create_element (document, "mo");
+	node = lsm_dom_node_replace_child (LSM_DOM_NODE (math), LSM_DOM_NODE (mo2), LSM_DOM_NODE (mo1));
+	g_assert (node == LSM_DOM_NODE (mo1));
+
+	g_assert (lsm_dom_node_list_get_item (childs, 1) == LSM_DOM_NODE (mo2));
+	g_assert (lsm_dom_node_list_get_length (childs) == 3);
+
+	g_object_unref (mo1);
+	g_object_unref (document);
+}
+
 int
 main (int argc, char *argv[])
 {
@@ -113,6 +159,7 @@ main (int argc, char *argv[])
 	g_test_add_func ("/dom/create-element", create_document_test);
 	g_test_add_func ("/dom/add-remove-element", create_document_test);
 	g_test_add_func ("/dom/node-list", node_list_test);
+	g_test_add_func ("/dom/insert-before", insert_before_test);
 
 	g_type_init ();
 



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