diff options
author | Andrew Nester <andrew.nester.dev@gmail.com> | 2018-05-01 12:04:46 +0000 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2018-08-17 13:01:55 +0200 |
commit | 2072d377d3f0380f1f77768746d196106673db8d (patch) | |
tree | 635f5a8c121824aaf663e5b1a1aa5d60a07f58db | |
parent | 5c1a2d8375c7edcb4716d2de6c51cd3b59f0ae7b (diff) | |
download | php-git-2072d377d3f0380f1f77768746d196106673db8d.tar.gz |
DOMDocument::formatOutput attribute sometimes ignored
(cherry picked from commit ef9ed19ec7f141311feea1d42467f5773cfc09bc)
-rw-r--r-- | ext/dom/document.c | 17 | ||||
-rw-r--r-- | ext/dom/tests/bug76285.phpt | 18 |
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 |