]> granicus.if.org Git - php/commitdiff
MFH: fix bug #46849 (Cloning DOMDocument doesn't clone the properties)
authorRob Richards <rrichards@php.net>
Tue, 16 Dec 2008 12:53:29 +0000 (12:53 +0000)
committerRob Richards <rrichards@php.net>
Tue, 16 Dec 2008 12:53:29 +0000 (12:53 +0000)
fix some warnings
add test

ext/dom/php_dom.c
ext/dom/tests/bug46849.phpt [new file with mode: 0644]

index 3e9ebdd0f8a1eedd8d255123fd6c7586f6780ca4..4873f1a7e4348a0e9f88bbf29139ee35e582e078 100644 (file)
@@ -172,6 +172,31 @@ dom_doc_propsptr dom_get_doc_props(php_libxml_ref_obj *document)
        }
 }
 
+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_hash_init(dest->classmap, 0, NULL, NULL, 0);
+                       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;
@@ -1078,6 +1103,9 @@ void dom_objects_clone(void *object, void **object_clone TSRMLS_DC)
                                }
                                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);
+                               }
                        }
 
                }
@@ -1371,8 +1399,8 @@ xmlNode *dom_get_elements_by_tag_name_ns_raw(xmlNodePtr nodep, char *ns, char *l
 
        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;
@@ -1479,9 +1507,9 @@ int dom_check_qname(char *qname, char **localname, char **prefix, int uri_len, i
                return NAMESPACE_ERR;
        }
        
-       *localname = xmlSplitQName2(qname, (xmlChar **) prefix);
+       *localname = (char *)xmlSplitQName2((xmlChar *)qname, (xmlChar **) prefix);
        if (*localname == NULL) {
-               *localname = xmlStrdup(qname);
+               *localname = (char *)xmlStrdup((xmlChar *)qname);
                if (*prefix == NULL && uri_len == 0) {
                        return 0;
                }
@@ -1517,10 +1545,10 @@ xmlNsPtr dom_get_ns(xmlNodePtr nodep, char *uri, int *errorcode, char *prefix) {
 
        *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) {
@@ -1539,7 +1567,7 @@ xmlNsPtr dom_get_nsdecl(xmlNode *node, xmlChar *localName) {
        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) {
diff --git a/ext/dom/tests/bug46849.phpt b/ext/dom/tests/bug46849.phpt
new file mode 100644 (file)
index 0000000..c51c96e
--- /dev/null
@@ -0,0 +1,16 @@
+--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)