msxml3: IXMLDOMText_get_text return trimmed text when XML_TEXT_NODE

Alexandre Goujon ale.goujon at gmail.com
Mon Aug 30 07:10:21 CDT 2010


---
 dlls/msxml3/msxml_private.h |   24 ++++++++++++++++++++++++
 dlls/msxml3/node.c          |    3 +++
 dlls/msxml3/tests/domdoc.c  |    6 +++---
 3 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 5fbedf9..54e9923 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -181,6 +181,30 @@ static inline BSTR bstr_from_xmlChar(const xmlChar *str)
     return ret;
 }
 
+static inline BSTR bstr_trim(const BSTR str)
+{
+    UINT i, j, len = SysStringLen(str);
+    BSTR new_str = NULL;
+
+    /* str empty or NULL */
+    if(!len)
+        goto err;
+
+    for(i=0; isspaceW(str[i]) && i<len; i++);
+    for(j=len-1; isspaceW(str[j]) && j>=i; j--);
+
+    new_str = SysAllocStringLen(str+i, j-i+1);
+    if(!new_str)
+        goto err;
+
+    SysFreeString(str);
+    return new_str;
+
+    err:
+        SysFreeString(str);
+        return SysAllocStringLen(NULL, 0);
+}
+
 #endif
 
 void* libxslt_handle;
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index bbdcb5d..4b0f97f 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -892,6 +892,9 @@ static HRESULT WINAPI xmlnode_get_text(
         xmlFree(pContent);
     }
 
+    if( This->node->type ==  XML_TEXT_NODE )
+        str = bstr_trim(str);
+
     /* Always return a string. */
     if (!str) str = SysAllocStringLen( NULL, 0 );
 
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index aa16a03..7bd94a6 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -948,7 +948,7 @@ if (0)
         r = IXMLDOMText_get_text(nodetext, &str);
         ok(r == S_OK, "ret %08x\n", r );
         /* whitespace preserving needs to be handled here */
-        todo_wine ok( !lstrcmpW( str, _bstr_("This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n");
+        ok( !lstrcmpW( str, _bstr_("This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n");
         SysFreeString(str);
 
         /* delete from end */
@@ -961,7 +961,7 @@ if (0)
 
         r = IXMLDOMText_get_text(nodetext, &str);
         ok(r == S_OK, "ret %08x\n", r );
-        todo_wine ok( !lstrcmpW( str, _bstr_("This &is a Middle; test <>\\Append") ), "incorrect get_text string\n");
+        ok( !lstrcmpW( str, _bstr_("This &is a Middle; test <>\\Append") ), "incorrect get_text string\n");
         SysFreeString(str);
 
         /* delete from inside */
@@ -974,7 +974,7 @@ if (0)
 
         r = IXMLDOMText_get_text(nodetext, &str);
         ok(r == S_OK, "ret %08x\n", r );
-        todo_wine ok( !lstrcmpW( str, _bstr_("") ), "incorrect get_text string\n");
+        ok( !lstrcmpW( str, _bstr_("") ), "incorrect get_text string\n");
         SysFreeString(str);
 
         /* delete whole data ... */
-- 
1.7.0.4




More information about the wine-patches mailing list