rrichards               Fri Feb 18 06:47:50 2005 EDT

  Modified files:              (Branch: PHP_5_0)
    /php-src/ext/dom    node.c 
  Log:
  MFH: Fixed bug #32011 (Fragments which replaced Nodes are not globaly useable)
  
http://cvs.php.net/diff.php/php-src/ext/dom/node.c?r1=1.29.2.2&r2=1.29.2.3&ty=u
Index: php-src/ext/dom/node.c
diff -u php-src/ext/dom/node.c:1.29.2.2 php-src/ext/dom/node.c:1.29.2.3
--- php-src/ext/dom/node.c:1.29.2.2     Thu Nov 18 14:55:00 2004
+++ php-src/ext/dom/node.c      Fri Feb 18 06:47:50 2005
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: node.c,v 1.29.2.2 2004/11/18 19:55:00 rrichards Exp $ */
+/* $Id: node.c,v 1.29.2.3 2005/02/18 11:47:50 rrichards Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -1129,9 +1129,55 @@
        }
 
        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_dom_throw_error(NOT_FOUND_ERR, 
dom_get_strict_error(intern->document) TSRMLS_CC);
                RETURN_FALSE;
        }
-
 }
 /* }}} end dom_node_replace_child */
 

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to