--- /dev/null
+--TEST--
+Bug # 41374: (wholetext concats values of wrong nodes)
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+$xml = (binary)<<<EOXML
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<root>foo<child />baz</root>
+EOXML;
+
+$doc = new DOMDocument();
+$doc->loadXML($xml);
+
+$root = $doc->documentElement;
+$foo = $root->firstChild;
+
+var_dump($foo->wholeText == "foo");
+
+$bar = $root->insertBefore($doc->createTextNode("bar"), $foo->nextSibling);
+
+var_dump($foo->wholeText == "foobar");
+var_dump($foo->wholeText == $bar->wholeText);
+$baz = $bar->nextSibling->nextSibling;
+
+var_dump($baz->wholeText === $foo->wholeText);
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(false)
int dom_text_whole_text_read(dom_object *obj, zval **retval TSRMLS_DC)
{
xmlNodePtr node;
- xmlChar *wholetext;
+ xmlChar *wholetext = NULL;
node = dom_object_get_node(obj);
return FAILURE;
}
+ /* Find starting text node */
+ while (node->prev && ((node->prev->type == XML_TEXT_NODE) || (node->prev->type == XML_CDATA_SECTION_NODE))) {
+ node = node->prev;
+ }
+
+ /* concatenate all adjacent text and cdata nodes */
+ while (node && ((node->type == XML_TEXT_NODE) || (node->type == XML_CDATA_SECTION_NODE))) {
+ wholetext = xmlStrcat(wholetext, node->content);
+ node = node->next;
+ }
+
ALLOC_ZVAL(*retval);
- wholetext = xmlNodeListGetString(node->doc, node, 1);
- ZVAL_XML_STRING(*retval, wholetext, ZSTR_DUPLICATE);
+ if (wholetext != NULL) {
+ ZVAL_XML_STRING(*retval, wholetext, ZSTR_DUPLICATE);
+ } else {
+ ZVAL_EMPTY_STRING(*retval);
+ }
xmlFree(wholetext);