]> granicus.if.org Git - php/commitdiff
Fixed bug #41374 (wholetext concats values of wrong nodes).
authorRob Richards <rrichards@php.net>
Mon, 14 May 2007 11:44:50 +0000 (11:44 +0000)
committerRob Richards <rrichards@php.net>
Mon, 14 May 2007 11:44:50 +0000 (11:44 +0000)
add test

ext/dom/tests/bug41374.phpt [new file with mode: 0644]
ext/dom/text.c

diff --git a/ext/dom/tests/bug41374.phpt b/ext/dom/tests/bug41374.phpt
new file mode 100644 (file)
index 0000000..6de5ffb
--- /dev/null
@@ -0,0 +1,32 @@
+--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)
index 73fdd612c4bd9ec00549905a0996466d65e538af..f420271a9281045d01fa8af8d9ca9fd6d6a4bdca 100644 (file)
@@ -87,7 +87,7 @@ Since: DOM Level 3
 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);
 
@@ -96,9 +96,23 @@ int dom_text_whole_text_read(dom_object *obj, zval **retval TSRMLS_DC)
                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);