]> git.saurik.com Git - wxWidgets.git/commitdiff
Don't append text following CDATA section to its node itself.
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 24 Aug 2009 21:42:27 +0000 (21:42 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 24 Aug 2009 21:42:27 +0000 (21:42 +0000)
Reset wxXmlParsingContext::lastAsText flag when CDATA section ends to avoid
appending the text following it to its node. Instead new text nodes should be
created for it.

Also update the unit test to not work around the bug any more.

Closes #10552.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61759 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/xml/xml.cpp
tests/xml/xmltest.cpp

index a37225c3dd7c7af074c02f35b69d5b1af23bca45..1917c27ba81e9a4c104c1e67f3a12ba9deee2adf 100644 (file)
@@ -618,6 +618,17 @@ static void StartCdataHnd(void *userData)
     ctx->lastChild= ctx->lastAsText = textnode;
 }
 
     ctx->lastChild= ctx->lastAsText = textnode;
 }
 
+static void EndCdataHnd(void *userData)
+{
+    wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData;
+
+    // we need to reset this pointer so that subsequent text nodes don't append
+    // their contents to this one but create new wxXML_TEXT_NODE objects (or
+    // not create anything at all if only white space follows the CDATA section
+    // and wxXMLDOC_KEEP_WHITESPACE_NODES is not used as is commonly the case)
+    ctx->lastAsText = NULL;
+}
+
 static void CommentHnd(void *userData, const char *data)
 {
     wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData;
 static void CommentHnd(void *userData, const char *data)
 {
     wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData;
@@ -717,7 +728,7 @@ bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding, int fl
     XML_SetUserData(parser, (void*)&ctx);
     XML_SetElementHandler(parser, StartElementHnd, EndElementHnd);
     XML_SetCharacterDataHandler(parser, TextHnd);
     XML_SetUserData(parser, (void*)&ctx);
     XML_SetElementHandler(parser, StartElementHnd, EndElementHnd);
     XML_SetCharacterDataHandler(parser, TextHnd);
-    XML_SetStartCdataSectionHandler(parser, StartCdataHnd);
+    XML_SetCdataSectionHandler(parser, StartCdataHnd, EndCdataHnd);;
     XML_SetCommentHandler(parser, CommentHnd);
     XML_SetDefaultHandler(parser, DefaultHnd);
     XML_SetUnknownEncodingHandler(parser, UnknownEncodingHnd, NULL);
     XML_SetCommentHandler(parser, CommentHnd);
     XML_SetDefaultHandler(parser, DefaultHnd);
     XML_SetUnknownEncodingHandler(parser, UnknownEncodingHnd, NULL);
index d8cda12b03896d59a834f54a31a79654e9c9e835..9f3d6056a51c9d1a8afac2493f7801a22142d5f2 100644 (file)
@@ -210,7 +210,8 @@ void XmlTestCase::CDATA()
     n = n->GetChildren();
     CPPUNIT_ASSERT( n );
 
     n = n->GetChildren();
     CPPUNIT_ASSERT( n );
 
-    // currently leading white space is stripped by trailing is preserved (see
-    // #10552)
-    CPPUNIT_ASSERT_EQUAL( "Giovanni Mittone\n", n->GetContent() );
+    // check that both leading ("  ") and trailing white space is not part of
+    // the node contents when CDATA is used and wxXMLDOC_KEEP_WHITESPACE_NODES
+    // is not
+    CPPUNIT_ASSERT_EQUAL( "Giovanni Mittone", n->GetContent() );
 }
 }