[lasem] dom_node: fix chained list of childs when using insert_before.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [lasem] dom_node: fix chained list of childs when using insert_before.
- Date: Sun, 14 Nov 2010 21:15:12 +0000 (UTC)
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]