Skip to content

Commit 22fa3fb

Browse files
committed
Fix bug #65196
Passing DOMDocumentFragment to DOMDocument::saveHTML() produces invalid markup, because a DocumentFragment is just a container for child nodes and not a real node itself.
1 parent 6408a1a commit 22fa3fb

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ PHP NEWS
1111
1600). (Derick, T. Carter)
1212
. Fixed bug #61599 (Wrong Day of Week). (Derick, T. Carter)
1313

14+
- DOM:
15+
. Fixed bug #65196 (Passing DOMDocumentFragment to DOMDocument::saveHTML()
16+
Produces invalid Markup). (Mike)
17+
1418
- XSL
1519
. Fixed bug #49634 (Segfault throwing an exception in a XSL registered
1620
function). (Mike)

ext/dom/document.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2324,7 +2324,22 @@ PHP_FUNCTION(dom_document_save_html)
23242324
RETURN_FALSE;
23252325
}
23262326

2327-
size = htmlNodeDump(buf, docp, node);
2327+
if (node->type == XML_DOCUMENT_FRAG_NODE) {
2328+
int one_size;
2329+
2330+
for (node = node->children; node; node = node->next) {
2331+
one_size = htmlNodeDump(buf, docp, node);
2332+
2333+
if (one_size >= 0) {
2334+
size += one_size;
2335+
} else {
2336+
size = -1;
2337+
break;
2338+
}
2339+
}
2340+
} else {
2341+
size = htmlNodeDump(buf, docp, node);
2342+
}
23282343
if (size >= 0) {
23292344
mem = (xmlChar*) xmlBufferContent(buf);
23302345
if (!mem) {

ext/dom/tests/bug65196.phpt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
bug #65196 (Passing DOMDocumentFragment to DOMDocument::saveHTML() Produces invalid Markup)
3+
--SKIPIF--
4+
<?php
5+
extension_loaded("dom") or die("skip need ext/dom");
6+
?>
7+
--FILE--
8+
<?php
9+
$dom = new DOMDocument();
10+
11+
$frag1 = $dom->createDocumentFragment();
12+
var_dump($dom->saveHTML($frag1));
13+
14+
$frag2 = $dom->createDocumentFragment();
15+
$div = $dom->createElement('div');
16+
$div->appendChild($dom->createElement('span'));
17+
$frag2->appendChild($div);
18+
$frag2->appendChild($dom->createElement('div'));
19+
$frag2->appendChild($dom->createElement('div'));
20+
var_dump($dom->saveHTML($frag2));
21+
?>
22+
===DONE===
23+
--EXPECT--
24+
string(0) ""
25+
string(46) "<div><span></span></div><div></div><div></div>"
26+
===DONE===

0 commit comments

Comments
 (0)