[lasem] dom_node: check documents are the same when adding a child to a node.



commit 6c9073d58c56473acea3bba851c3c260b017e2dd
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Tue Apr 2 22:26:35 2013 +0200

    dom_node: check documents are the same when adding a child to a node.

 src/lsmdomnode.c |   19 +++++++++++++++++++
 tests/dom.c      |   41 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 60 insertions(+), 0 deletions(-)
---
diff --git a/src/lsmdomnode.c b/src/lsmdomnode.c
index 082742c..75b2b83 100644
--- a/src/lsmdomnode.c
+++ b/src/lsmdomnode.c
@@ -384,6 +384,12 @@ lsm_dom_node_insert_before (LsmDomNode* self, LsmDomNode* new_child, LsmDomNode*
                return NULL;
        }
 
+       if (self->owner_document != new_child->owner_document &&
+           self->owner_document != NULL) {
+               g_object_unref (new_child);
+               return NULL;
+       }
+
        if (!LSM_IS_DOM_NODE (ref_child)) {
                g_critical ("%s: ref_child is not a LsmDomNode", G_STRFUNC);
                g_object_unref (new_child);
@@ -482,6 +488,13 @@ lsm_dom_node_replace_child (LsmDomNode* self, LsmDomNode* new_child, LsmDomNode*
                return NULL;
        }
 
+       if (self->owner_document != new_child->owner_document &&
+           self->owner_document != NULL) {
+               g_object_unref (new_child);
+               g_object_unref (old_child);
+               return NULL;
+       }
+
        if (old_child->parent_node != self) {
                g_object_unref (new_child);
                g_object_unref (old_child);
@@ -586,6 +599,12 @@ lsm_dom_node_append_child (LsmDomNode* self, LsmDomNode* new_child)
                return NULL;
        }
 
+       if (self->owner_document != new_child->owner_document &&
+           self->owner_document != NULL) {
+               g_object_unref (new_child);
+               return NULL;
+       }
+
        if (new_child->parent_node != NULL)
                lsm_dom_node_remove_child (self, new_child);
 
diff --git a/tests/dom.c b/tests/dom.c
index 82c4a30..1ed9e9b 100644
--- a/tests/dom.c
+++ b/tests/dom.c
@@ -72,6 +72,46 @@ owner_document_test (void)
        g_assert_cmpint (counter, ==, 4);
 }
 
+static void
+owner_mismatch_test (void)
+{
+       LsmDomDocument *document_a;
+       LsmDomDocument *document_b;
+       LsmDomElement *element_a;
+       LsmDomElement *element_b;
+       LsmDomElement *element_c;
+       int counter = 0;
+
+       document_a = lsm_dom_implementation_create_document (NULL, "svg");
+       g_assert (LSM_IS_DOM_DOCUMENT (document_a));
+       g_assert (lsm_dom_node_get_owner_document (LSM_DOM_NODE (document_a)) == NULL);
+
+       element_a = lsm_dom_document_create_element (document_a, "svg");
+       element_b = lsm_dom_document_create_element (document_a, "text");
+
+       document_b = lsm_dom_implementation_create_document (NULL, "svg");
+       g_assert (LSM_IS_DOM_DOCUMENT (document_b));
+       g_assert (lsm_dom_node_get_owner_document (LSM_DOM_NODE (document_b)) == NULL);
+
+       element_c = lsm_dom_document_create_element (document_b, "text");
+
+       g_assert (lsm_dom_node_append_child (LSM_DOM_NODE (document_a), LSM_DOM_NODE (element_a)) == 
LSM_DOM_NODE (element_a));
+       g_assert (lsm_dom_node_append_child (LSM_DOM_NODE (element_a), LSM_DOM_NODE (element_b)) == 
LSM_DOM_NODE (element_b));
+
+       g_object_weak_ref (G_OBJECT (document_a), _weak_ref_cb, &counter);
+       g_object_weak_ref (G_OBJECT (document_b), _weak_ref_cb, &counter);
+       g_object_weak_ref (G_OBJECT (element_a), _weak_ref_cb, &counter);
+       g_object_weak_ref (G_OBJECT (element_c), _weak_ref_cb, &counter);
+       g_object_weak_ref (G_OBJECT (element_b), _weak_ref_cb, &counter);
+
+       g_assert (lsm_dom_node_append_child (LSM_DOM_NODE (element_a), LSM_DOM_NODE (element_c)) == NULL);
+
+       g_object_unref (document_a);
+       g_object_unref (document_b);
+
+       g_assert_cmpint (counter,  ==, 5);
+}
+
 #if 0 /* Unused code - remove? */
 static void
 create_element_test (void)
@@ -216,6 +256,7 @@ main (int argc, char *argv[])
 
        g_test_add_func ("/dom/create-document", create_document_test);
        g_test_add_func ("/dom/owner-document", owner_document_test);
+       g_test_add_func ("/dom/owner-mismatch", owner_mismatch_test);
        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);


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