|
20 | 20 | #endif
|
21 | 21 |
|
22 | 22 | #include "php.h"
|
| 23 | + |
23 | 24 | #if defined(HAVE_LIBXML) && defined(HAVE_DOM)
|
24 | 25 | #include "php_dom.h"
|
25 | 26 |
|
@@ -1001,6 +1002,7 @@ PHP_METHOD(DOMNode, replaceChild)
|
1001 | 1002 | xmlNodePtr children, newchild, oldchild, nodep;
|
1002 | 1003 | dom_object *intern, *newchildobj, *oldchildobj;
|
1003 | 1004 | int foundoldchild = 0, stricterror;
|
| 1005 | + bool replacedoctype = false; |
1004 | 1006 |
|
1005 | 1007 | int ret;
|
1006 | 1008 |
|
@@ -1063,13 +1065,21 @@ PHP_METHOD(DOMNode, replaceChild)
|
1063 | 1065 | dom_reconcile_ns(nodep->doc, newchild);
|
1064 | 1066 | }
|
1065 | 1067 | } else if (oldchild != newchild) {
|
| 1068 | + xmlDtdPtr intSubset = xmlGetIntSubset(nodep->doc); |
| 1069 | + replacedoctype = (intSubset == (xmlDtd *) oldchild); |
| 1070 | + |
1066 | 1071 | if (newchild->doc == NULL && nodep->doc != NULL) {
|
1067 | 1072 | xmlSetTreeDoc(newchild, nodep->doc);
|
1068 | 1073 | newchildobj->document = intern->document;
|
1069 | 1074 | php_libxml_increment_doc_ref((php_libxml_node_object *)newchildobj, NULL);
|
1070 | 1075 | }
|
| 1076 | + |
1071 | 1077 | xmlReplaceNode(oldchild, newchild);
|
1072 | 1078 | dom_reconcile_ns(nodep->doc, newchild);
|
| 1079 | + |
| 1080 | + if (replacedoctype) { |
| 1081 | + nodep->doc->intSubset = (xmlDtd *) newchild; |
| 1082 | + } |
1073 | 1083 | }
|
1074 | 1084 | DOM_RET_OBJ(oldchild, &ret, intern);
|
1075 | 1085 | return;
|
|
0 commit comments