rrichards Tue Dec 16 12:51:58 2008 UTC Added files: /php-src/ext/dom/tests bug46849.phpt
Modified files: /php-src/ext/dom php_dom.c Log: fix bug #46849 (Cloning DOMDocument doesn't clone the properties) fix some warnings add test http://cvs.php.net/viewvc.cgi/php-src/ext/dom/php_dom.c?r1=1.115&r2=1.116&diff_format=u Index: php-src/ext/dom/php_dom.c diff -u php-src/ext/dom/php_dom.c:1.115 php-src/ext/dom/php_dom.c:1.116 --- php-src/ext/dom/php_dom.c:1.115 Mon Nov 17 11:26:20 2008 +++ php-src/ext/dom/php_dom.c Tue Dec 16 12:51:58 2008 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_dom.c,v 1.115 2008/11/17 11:26:20 felipe Exp $ */ +/* $Id: php_dom.c,v 1.116 2008/12/16 12:51:58 rrichards Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -147,6 +147,31 @@ } } +static void dom_copy_doc_props(php_libxml_ref_obj *source_doc, php_libxml_ref_obj *dest_doc) +{ + dom_doc_propsptr source, dest; + + if (source_doc && dest_doc) { + + source = dom_get_doc_props(source_doc); + dest = dom_get_doc_props(dest_doc); + + dest->formatoutput = source->formatoutput; + dest->validateonparse = source->validateonparse; + dest->resolveexternals = source->resolveexternals; + dest->preservewhitespace = source->preservewhitespace; + dest->substituteentities = source->substituteentities; + dest->stricterror = source->stricterror; + dest->recover = source->recover; + if (source->classmap) { + ALLOC_HASHTABLE(dest->classmap); + zend_u_hash_init(dest->classmap, 0, NULL, NULL, 0, UG(unicode)); + zend_hash_copy(dest->classmap, source->classmap, NULL, NULL, sizeof(zend_class_entry *)); + } + + } +} + int dom_set_doc_classmap(php_libxml_ref_obj *document, zend_class_entry *basece, zend_class_entry *ce TSRMLS_DC) { dom_doc_propsptr doc_props; @@ -1068,6 +1093,9 @@ } php_libxml_increment_doc_ref((php_libxml_node_object *)clone, cloned_node->doc TSRMLS_CC); php_libxml_increment_node_ptr((php_libxml_node_object *)clone, cloned_node, (void *)clone TSRMLS_CC); + if (intern->document != clone->document) { + dom_copy_doc_props(intern->document, clone->document); + } } } @@ -1363,8 +1391,8 @@ while (nodep != NULL && (*cur <= index || index == -1)) { if (nodep->type == XML_ELEMENT_NODE) { - if (xmlStrEqual(nodep->name, local) || xmlStrEqual("*", local)) { - if (ns == NULL || (nodep->ns != NULL && (xmlStrEqual(nodep->ns->href, ns) || xmlStrEqual("*", ns)))) { + if (xmlStrEqual(nodep->name, (xmlChar *)local) || xmlStrEqual((xmlChar *)"*", (xmlChar *)local)) { + if (ns == NULL || (nodep->ns != NULL && (xmlStrEqual(nodep->ns->href, (xmlChar *)ns) || xmlStrEqual((xmlChar *)"*", (xmlChar *)ns)))) { if (*cur == index) { ret = nodep; break; @@ -1469,9 +1497,9 @@ return NAMESPACE_ERR; } - *localname = xmlSplitQName2(qname, (xmlChar **) prefix); + *localname = (char *)xmlSplitQName2((xmlChar *)qname, (xmlChar **) prefix); if (*localname == NULL) { - *localname = xmlStrdup(qname); + *localname = (char *)xmlStrdup(qname); if (*prefix == NULL && uri_len == 0) { return 0; } @@ -1507,10 +1535,10 @@ *errorcode = 0; - if (! ((prefix && !strcmp (prefix, "xml" ) && strcmp(uri, XML_XML_NAMESPACE)) || - (prefix && !strcmp (prefix, "xmlns") && strcmp(uri, DOM_XMLNS_NAMESPACE)) || - (prefix && !strcmp(uri, DOM_XMLNS_NAMESPACE) && strcmp (prefix, "xmlns")))) { - nsptr = xmlNewNs(nodep, uri, prefix); + if (! ((prefix && !strcmp (prefix, "xml") && strcmp(uri, (char *)XML_XML_NAMESPACE)) || + (prefix && !strcmp (prefix, "xmlns") && strcmp(uri, (char *)DOM_XMLNS_NAMESPACE)) || + (prefix && !strcmp(uri, (char *)DOM_XMLNS_NAMESPACE) && strcmp (prefix, "xmlns")))) { + nsptr = xmlNewNs(nodep, (xmlChar *)uri, (xmlChar *)prefix); } if (nsptr == NULL) { @@ -1529,7 +1557,7 @@ if (node == NULL) return NULL; - if (localName == NULL || xmlStrEqual(localName, "")) { + if (localName == NULL || xmlStrEqual(localName, (xmlChar *)"")) { cur = node->nsDef; while (cur != NULL) { if (cur->prefix == NULL && cur->href != NULL) { http://cvs.php.net/viewvc.cgi/php-src/ext/dom/tests/bug46849.phpt?view=markup&rev=1.1 Index: php-src/ext/dom/tests/bug46849.phpt +++ php-src/ext/dom/tests/bug46849.phpt --TEST-- Bug #46849 (Cloning DOMDocument doesn't clone the properties). --SKIPIF-- <?php require_once('skipif.inc'); ?> --FILE-- <?php $dom = new DOMDocument; $dom->formatOutput = 1; var_dump($dom->formatOutput); $dom2 = clone $dom; var_dump($dom2->formatOutput); ?> --EXPECT-- bool(true) bool(true) -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php