[lasem] dom_node: check documents are the same when adding a child to a node.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [lasem] dom_node: check documents are the same when adding a child to a node.
- Date: Tue, 2 Apr 2013 20:27:05 +0000 (UTC)
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]