summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Nester <andrew.nester.dev@gmail.com>2018-05-01 12:04:46 +0000
committerChristoph M. Becker <cmbecker69@gmx.de>2018-08-17 13:01:55 +0200
commit2072d377d3f0380f1f77768746d196106673db8d (patch)
tree635f5a8c121824aaf663e5b1a1aa5d60a07f58db
parent5c1a2d8375c7edcb4716d2de6c51cd3b59f0ae7b (diff)
downloadphp-git-2072d377d3f0380f1f77768746d196106673db8d.tar.gz
DOMDocument::formatOutput attribute sometimes ignored
(cherry picked from commit ef9ed19ec7f141311feea1d42467f5773cfc09bc)
-rw-r--r--ext/dom/document.c17
-rw-r--r--ext/dom/tests/bug76285.phpt18
2 files changed, 28 insertions, 7 deletions
diff --git a/ext/dom/document.c b/ext/dom/document.c
index 2b029dc403..9c3ece5ac3 100644
--- a/ext/dom/document.c
+++ b/ext/dom/document.c
@@ -2148,6 +2148,7 @@ PHP_FUNCTION(dom_document_save_html)
zval *id, *nodep = NULL;
xmlDoc *docp;
xmlNode *node;
+ xmlOutputBufferPtr outBuf;
xmlBufferPtr buf;
dom_object *intern, *nodeobj;
xmlChar *mem = NULL;
@@ -2174,7 +2175,8 @@ PHP_FUNCTION(dom_document_save_html)
}
buf = xmlBufferCreate();
- if (!buf) {
+ outBuf = xmlOutputBufferCreateBuffer(buf, NULL);
+ if (!outBuf || !buf) {
php_error_docref(NULL, E_WARNING, "Could not fetch buffer");
RETURN_FALSE;
}
@@ -2183,20 +2185,21 @@ PHP_FUNCTION(dom_document_save_html)
int one_size;
for (node = node->children; node; node = node->next) {
- one_size = htmlNodeDump(buf, docp, node);
-
+ htmlNodeDumpFormatOutput(outBuf, docp, node, NULL, format);
+ one_size = !outBuf->error ? xmlOutputBufferGetSize(outBuf) : -1;
if (one_size >= 0) {
- size += one_size;
+ size = one_size;
} else {
size = -1;
break;
}
}
} else {
- size = htmlNodeDump(buf, docp, node);
+ htmlNodeDumpFormatOutput(outBuf, docp, node, NULL, format);
+ size = !outBuf->error ? xmlOutputBufferGetSize(outBuf): -1;
}
if (size >= 0) {
- mem = (xmlChar*) xmlBufferContent(buf);
+ mem = (xmlChar*) xmlOutputBufferGetContent(outBuf);
if (!mem) {
RETVAL_FALSE;
} else {
@@ -2206,7 +2209,7 @@ PHP_FUNCTION(dom_document_save_html)
php_error_docref(NULL, E_WARNING, "Error dumping HTML node");
RETVAL_FALSE;
}
- xmlBufferFree(buf);
+ xmlOutputBufferClose(outBuf);
} else {
#if LIBXML_VERSION >= 20623
htmlDocDumpMemoryFormat(docp, &mem, &size, format);
diff --git a/ext/dom/tests/bug76285.phpt b/ext/dom/tests/bug76285.phpt
new file mode 100644
index 0000000000..e6668b10d9
--- /dev/null
+++ b/ext/dom/tests/bug76285.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Bug #76285 DOMDocument::formatOutput attribute sometimes ignored
+--FILE--
+<?php
+
+$dom = new DOMDocument();
+$dom->formatOutput = false;
+$html = '<div><div><a>test</a></div><div><a>test2</a></div></div>';
+$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
+$rootNode = $dom->documentElement;
+var_dump($dom->saveHTML($rootNode));
+var_dump($dom->saveHTML());
+
+?>
+--EXPECT--
+string(56) "<div><div><a>test</a></div><div><a>test2</a></div></div>"
+string(57) "<div><div><a>test</a></div><div><a>test2</a></div></div>
+" \ No newline at end of file