Module: wine Branch: master Commit: 8f976c5d5350c46a7b52e9096fb1b6dc849e82e0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8f976c5d5350c46a7b52e9096f...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Nov 4 18:35:58 2010 +0300
msxml3: Encode special characters while setting attribute content.
---
dlls/msxml3/attribute.c | 2 +- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 41 +++++++++++++++++++++++++++++++++++++++++ dlls/msxml3/tests/domdoc.c | 25 +++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 1 deletions(-)
diff --git a/dlls/msxml3/attribute.c b/dlls/msxml3/attribute.c index 34cc007..e7e8f48 100644 --- a/dlls/msxml3/attribute.c +++ b/dlls/msxml3/attribute.c @@ -207,7 +207,7 @@ static HRESULT WINAPI domattr_put_nodeValue(
TRACE("(%p)->(v%d)\n", This, V_VT(&value));
- return node_put_value(&This->node, &value); + return node_put_value_escaped(&This->node, &value); }
static HRESULT WINAPI domattr_get_nodeType( diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 4be8c1d..4af9bca 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -184,6 +184,7 @@ extern HRESULT node_get_nodeName(xmlnode*,BSTR*); extern HRESULT node_get_content(xmlnode*,VARIANT*); extern HRESULT node_set_content(xmlnode*,LPCWSTR); extern HRESULT node_put_value(xmlnode*,VARIANT*); +extern HRESULT node_put_value_escaped(xmlnode*,VARIANT*); extern HRESULT node_get_parent(xmlnode*,IXMLDOMNode**); extern HRESULT node_get_child_nodes(xmlnode*,IXMLDOMNodeList**); extern HRESULT node_get_first_child(xmlnode*,IXMLDOMNode**); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 3220800..9aafa83 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -151,6 +151,29 @@ HRESULT node_set_content(xmlnode *This, LPCWSTR value) return S_OK; }
+static HRESULT node_set_content_escaped(xmlnode *This, LPCWSTR value) +{ + xmlChar *str, *escaped; + + str = xmlChar_from_wchar(value); + if(!str) + return E_OUTOFMEMORY; + + escaped = xmlEncodeSpecialChars(NULL, str); + if(!escaped) + { + heap_free(str); + return E_OUTOFMEMORY; + } + + xmlNodeSetContent(This->node, escaped); + + heap_free(str); + xmlFree(escaped); + + return S_OK; +} + HRESULT node_put_value(xmlnode *This, VARIANT *value) { VARIANT string_value; @@ -169,6 +192,24 @@ HRESULT node_put_value(xmlnode *This, VARIANT *value) return S_OK; }
+HRESULT node_put_value_escaped(xmlnode *This, VARIANT *value) +{ + VARIANT string_value; + HRESULT hr; + + VariantInit(&string_value); + hr = VariantChangeType(&string_value, value, 0, VT_BSTR); + if(FAILED(hr)) { + WARN("Couldn't convert to VT_BSTR\n"); + return hr; + } + + hr = node_set_content_escaped(This, V_BSTR(&string_value)); + VariantClear(&string_value); + + return S_OK; +} + static HRESULT get_node( xmlnode *This, const char *name, diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 9a6d202..e8f0102 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -6056,8 +6056,11 @@ static void test_TransformWithLoadingLocalFile(void)
static void test_put_nodeValue(void) { + static const WCHAR jeevesW[] = {'J','e','e','v','e','s',' ','&',' ','W','o','o','s','t','e','r',0}; IXMLDOMDocument *doc; + IXMLDOMText *text; IXMLDOMEntityReference *entityref; + IXMLDOMAttribute *attr; IXMLDOMNode *node; HRESULT hr; VARIANT data, type; @@ -6115,6 +6118,28 @@ static void test_put_nodeValue(void) IXMLDOMNode_Release(node); IXMLDOMEntityReference_Release(entityref);
+ /* supported types */ + hr = IXMLDOMDocument_createTextNode(doc, _bstr_(""), &text); + ok(hr == S_OK, "ret %08x\n", hr ); + V_VT(&data) = VT_BSTR; + V_BSTR(&data) = _bstr_("Jeeves & Wooster"); + hr = IXMLDOMText_put_nodeValue(text, data); + ok(hr == S_OK, "ret %08x\n", hr ); + IXMLDOMText_Release(text); + + hr = IXMLDOMDocument_createAttribute(doc, _bstr_("attr"), &attr); + ok(hr == S_OK, "ret %08x\n", hr ); + V_VT(&data) = VT_BSTR; + V_BSTR(&data) = _bstr_("Jeeves & Wooster"); + hr = IXMLDOMAttribute_put_nodeValue(attr, data); + ok(hr == S_OK, "ret %08x\n", hr ); + hr = IXMLDOMAttribute_get_nodeValue(attr, &data); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(memcmp(V_BSTR(&data), jeevesW, sizeof(jeevesW)) == 0, "got %s\n", + wine_dbgstr_w(V_BSTR(&data))); + VariantClear(&data); + IXMLDOMAttribute_Release(attr); + free_bstrs();
IXMLDOMDocument_Release(doc);