diff options
author | Rob Richards <rrichards@php.net> | 2005-02-18 11:47:20 +0000 |
---|---|---|
committer | Rob Richards <rrichards@php.net> | 2005-02-18 11:47:20 +0000 |
commit | e46e7309f8a6e5487c46700a0c2a0a7daa9b7cb3 (patch) | |
tree | 9f1fe4ff93179bd88158cc4c18fd805b089af946 | |
parent | 3f0f70163965681f0e9d15124f3535dd28f758a8 (diff) | |
download | php-git-e46e7309f8a6e5487c46700a0c2a0a7daa9b7cb3.tar.gz |
Fixed bug #32011 (Fragments which replaced Nodes are not globaly useable)
-rw-r--r-- | ext/dom/node.c | 51 |
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 */ |