summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Richards <rrichards@php.net>2005-02-18 11:47:20 +0000
committerRob Richards <rrichards@php.net>2005-02-18 11:47:20 +0000
commite46e7309f8a6e5487c46700a0c2a0a7daa9b7cb3 (patch)
tree9f1fe4ff93179bd88158cc4c18fd805b089af946
parent3f0f70163965681f0e9d15124f3535dd28f758a8 (diff)
downloadphp-git-e46e7309f8a6e5487c46700a0c2a0a7daa9b7cb3.tar.gz
Fixed bug #32011 (Fragments which replaced Nodes are not globaly useable)
-rw-r--r--ext/dom/node.c51
1 files changed, 48 insertions, 3 deletions
diff --git a/ext/dom/node.c b/ext/dom/node.c
index a529832555..9707b59b8c 100644
--- a/ext/dom/node.c
+++ b/ext/dom/node.c
@@ -1129,9 +1129,55 @@ PHP_FUNCTION(dom_node_replace_child)
}
if (foundoldchild) {
+ xmlNodePtr node;
zval *rv = NULL;
- if (oldchild != newchild) {
- xmlNodePtr node;
+
+ if (newchild->type == XML_DOCUMENT_FRAG_NODE) {
+ xmlNodePtr fragment, prevsib, nextsib;
+ fragment = newchild;
+ prevsib = oldchild->prev;
+ nextsib = oldchild->next;
+
+ newchild = fragment->children;
+
+ xmlUnlinkNode(oldchild);
+
+ if (prevsib == NULL && nextsib == NULL) {
+ nodep->children = newchild;
+ nodep->last = fragment->last;
+ } else {
+ if (newchild) {
+ prevsib->next = newchild;
+ newchild->prev = prevsib;
+
+ fragment->last->next = nextsib;
+ if (nextsib) {
+ nextsib->prev = fragment->last;
+ } else {
+ nodep->last = fragment->last;
+ }
+ }
+ }
+ node = newchild;
+ while (node != NULL) {
+ node->parent = nodep;
+ if (node->doc != nodep->doc) {
+ xmlSetTreeDoc(node, nodep->doc);
+ if (node->_private != NULL) {
+ newchildobj = node->_private;
+ newchildobj->document = intern->document;
+ php_libxml_increment_doc_ref((php_libxml_node_object *)newchildobj, NULL TSRMLS_CC);
+ }
+ }
+ if (node == fragment->last) {
+ break;
+ }
+ node = node->next;
+ }
+
+ fragment->children = NULL;
+ fragment->last = NULL;
+ } else if (oldchild != newchild) {
if (newchild->doc == NULL && nodep->doc != NULL) {
xmlSetTreeDoc(newchild, nodep->doc);
newchildobj->document = intern->document;
@@ -1146,7 +1192,6 @@ PHP_FUNCTION(dom_node_replace_child)
php_dom_throw_error(NOT_FOUND_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
RETURN_FALSE;
}
-
}
/* }}} end dom_node_replace_child */