Nikolay Sivov : msxml3: Disable text data escaping for format nodes set with put_data().

Alexandre Julliard julliard at winehq.org
Mon Nov 12 14:14:40 CST 2012


Module: wine
Branch: master
Commit: 47d2f3caf56eb6c06b1d8f6d0f07b9815da685e6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=47d2f3caf56eb6c06b1d8f6d0f07b9815da685e6

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Nov 12 09:29:30 2012 -0500

msxml3: Disable text data escaping for format nodes set with put_data().

---

 dlls/msxml3/tests/domdoc.c |   34 +++++++++++++++++++++++++++++-----
 dlls/msxml3/text.c         |   15 +++++++++++++++
 2 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 85d2bc4..4b894b0 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -12185,6 +12185,9 @@ static void test_put_data(void)
     WCHAR buff[100], *data;
     IXMLDOMDocument *doc;
     DOMNodeType *type;
+    IXMLDOMText *text;
+    IXMLDOMNode *node;
+    VARIANT v;
     BSTR get_data;
     HRESULT hr;
 
@@ -12199,9 +12202,6 @@ static void test_put_data(void)
     type = put_data_types;
     while (*type != NODE_INVALID)
     {
-       IXMLDOMNode *node;
-       VARIANT v;
-
        V_VT(&v) = VT_I2;
        V_I2(&v) = *type;
 
@@ -12213,8 +12213,6 @@ static void test_put_data(void)
        {
            case NODE_TEXT:
            {
-              IXMLDOMText *text;
-
               hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMText, (void**)&text);
               EXPECT_HR(hr, S_OK);
               hr = IXMLDOMText_put_data(text, data);
@@ -12284,6 +12282,32 @@ static void test_put_data(void)
        type++;
     }
 
+    /* \r\n sequence is never escaped */
+    V_VT(&v) = VT_I2;
+    V_I2(&v) = NODE_TEXT;
+
+    hr = IXMLDOMDocument_createNode(doc, v, _bstr_("name"), NULL, &node);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMText, (void**)&text);
+
+    hr = IXMLDOMText_put_data(text, _bstr_("\r\n"));
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IXMLDOMText_get_data(text, &get_data);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+todo_wine
+    ok(!lstrcmpW(get_data, _bstr_("\n")), "got %s\n", wine_dbgstr_w(get_data));
+    SysFreeString(get_data);
+
+    hr = IXMLDOMText_get_xml(text, &get_data);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(!lstrcmpW(get_data, _bstr_("\r\n")), "got %s\n", wine_dbgstr_w(get_data));
+    SysFreeString(get_data);
+
+    IXMLDOMText_Release(text);
+    IXMLDOMNode_Release(node);
+
     IXMLDOMDocument_Release(doc);
     free_bstrs();
 }
diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index 6fb29f9..e9c64c1 100644
--- a/dlls/msxml3/text.c
+++ b/dlls/msxml3/text.c
@@ -26,6 +26,7 @@
 #include <stdarg.h>
 #ifdef HAVE_LIBXML2
 # include <libxml/parser.h>
+# include <libxml/parserInternals.h>
 # include <libxml/xmlerror.h>
 #endif
 
@@ -55,6 +56,11 @@ static inline domtext *impl_from_IXMLDOMText( IXMLDOMText *iface )
     return CONTAINING_RECORD(iface, domtext, IXMLDOMText_iface);
 }
 
+static void domtext_reset_noenc(domtext *This)
+{
+    This->node.node->name = NULL;
+}
+
 static HRESULT WINAPI domtext_QueryInterface(
     IXMLDOMText *iface,
     REFIID riid,
@@ -182,6 +188,7 @@ static HRESULT WINAPI domtext_put_nodeValue(
 
     TRACE("(%p)->(%s)\n", This, debugstr_variant(&value));
 
+    domtext_reset_noenc(This);
     return node_put_value(&This->node, &value);
 }
 
@@ -371,6 +378,7 @@ static HRESULT WINAPI domtext_put_text(
 {
     domtext *This = impl_from_IXMLDOMText( iface );
     TRACE("(%p)->(%s)\n", This, debugstr_w(p));
+    domtext_reset_noenc(This);
     return node_put_text( &This->node, p );
 }
 
@@ -608,7 +616,14 @@ static HRESULT WINAPI domtext_put_data(
     BSTR data)
 {
     domtext *This = impl_from_IXMLDOMText( iface );
+    static WCHAR rnW[] = {'\r','\n',0};
+
     TRACE("(%p)->(%s)\n", This, debugstr_w(data));
+
+    if (data && !strcmpW(rnW, data))
+        This->node.node->name = xmlStringTextNoenc;
+    else
+        domtext_reset_noenc(This);
     return node_set_content(&This->node, data);
 }
 




More information about the wine-cvs mailing list