Allows the Adobe Photoshop Elements installer to get slightly further than before
The `E_FAIL` check for switching to int while there's a non-integer string isn't needed for the installer and is just something I hit accidentally when trying to write the test cases. Should I leave it in?
From: Evan Tang etang@codeweavers.com
Breaks Adobe Photoshop Elements installer --- dlls/msxml3/tests/domdoc.c | 49 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+)
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index cf9fb62a65e..7183dbdaa05 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -8986,8 +8986,11 @@ static void test_put_nodeTypedValue(void) { static const BYTE binhexdata[16] = {0,1,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf}; + static const char special_characters_escaped[] = "<Element><>&"'/\</Element>"; + BSTR special_characters = _bstr_("<>&"'/\"); IXMLDOMDocument *doc; IXMLDOMElement *elem; + IStream *stream; VARIANT type, value; LONG ubound, lbound; IXMLDOMNode *node; @@ -8995,6 +8998,8 @@ static void test_put_nodeTypedValue(void) HRESULT hr; BYTE *ptr; BSTR str; + HGLOBAL global; + char *p;
doc = create_document(&IID_IXMLDOMDocument);
@@ -9026,6 +9031,50 @@ static void test_put_nodeTypedValue(void) "got %s, expected "1"\n", wine_dbgstr_w(V_BSTR(&type))); VariantClear(&type);
+ /* Test weird characters in strings */ + V_VT(&value) = VT_BSTR; + V_BSTR(&value) = special_characters; + hr = IXMLDOMElement_put_nodeTypedValue(elem, value); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&value) = VT_EMPTY; + hr = IXMLDOMElement_get_nodeTypedValue(elem, &value); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_VT(&value) == VT_BSTR, "got %d, expected VT_BSTR\n", V_VT(&value)); + todo_wine ok(memcmp(V_BSTR(&value), special_characters, 2*SysStringLen(special_characters)) == 0, + "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value)), wine_dbgstr_w(special_characters)); + VariantClear(&value); + + hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode *)elem, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&value) = VT_UNKNOWN; + V_UNKNOWN(&value) = (IUnknown*)stream; + hr = IXMLDOMDocument_save(doc, value); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = GetHGlobalFromStream(stream, &global); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + p = GlobalLock(global); + todo_wine ok(!memcmp(p, special_characters_escaped, sizeof(special_characters_escaped) - 1), "got %s\n", wine_dbgstr_a(p)); + GlobalUnlock(global); + + IStream_Release(stream); + hr = IXMLDOMDocument_removeChild(doc, (IXMLDOMNode *)elem, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMElement_put_dataType(elem, _bstr_("int")); + todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + + V_VT(&type) = VT_I1; + V_I1(&type) = 1; + hr = IXMLDOMElement_put_nodeTypedValue(elem, type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + /* int */ hr = IXMLDOMElement_put_dataType(elem, _bstr_("int")); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
From: Evan Tang etang@codeweavers.com
--- dlls/msxml3/element.c | 4 ++-- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 2 +- dlls/msxml3/tests/domdoc.c | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c index 302849aced6..22bf669e1cd 100644 --- a/dlls/msxml3/element.c +++ b/dlls/msxml3/element.c @@ -856,12 +856,12 @@ static HRESULT WINAPI domelem_put_nodeTypedValue( hr = VariantChangeType(&content, &value, 0, VT_BSTR); if (hr == S_OK) { - hr = node_set_content(&This->node, V_BSTR(&content)); + hr = node_set_content_escaped(&This->node, V_BSTR(&content)); VariantClear(&content); } } else - hr = node_set_content(&This->node, V_BSTR(&value)); + hr = node_set_content_escaped(&This->node, V_BSTR(&value)); break; case DT_BIN_BASE64: if (V_VT(&value) == VT_BSTR) diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 8003c1a9650..019252b8cfa 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -217,6 +217,7 @@ extern HRESULT node_append_child(xmlnode*,IXMLDOMNode*,IXMLDOMNode**) DECLSPEC_H extern HRESULT node_get_nodeName(xmlnode*,BSTR*) DECLSPEC_HIDDEN; extern HRESULT node_get_content(xmlnode*,VARIANT*) DECLSPEC_HIDDEN; extern HRESULT node_set_content(xmlnode*,LPCWSTR) DECLSPEC_HIDDEN; +extern HRESULT node_set_content_escaped(xmlnode*,LPCWSTR) DECLSPEC_HIDDEN; extern HRESULT node_put_value(xmlnode*,VARIANT*) DECLSPEC_HIDDEN; extern HRESULT node_put_value_escaped(xmlnode*,VARIANT*) DECLSPEC_HIDDEN; extern HRESULT node_get_parent(xmlnode*,IXMLDOMNode**) DECLSPEC_HIDDEN; diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 339504477ac..6c63abba22e 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -238,7 +238,7 @@ HRESULT node_set_content(xmlnode *This, LPCWSTR value) return S_OK; }
-static HRESULT node_set_content_escaped(xmlnode *This, LPCWSTR value) +HRESULT node_set_content_escaped(xmlnode *This, LPCWSTR value) { xmlChar *str, *escaped;
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 7183dbdaa05..9f24b5678dd 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -9041,7 +9041,7 @@ static void test_put_nodeTypedValue(void) hr = IXMLDOMElement_get_nodeTypedValue(elem, &value); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(V_VT(&value) == VT_BSTR, "got %d, expected VT_BSTR\n", V_VT(&value)); - todo_wine ok(memcmp(V_BSTR(&value), special_characters, 2*SysStringLen(special_characters)) == 0, + ok(memcmp(V_BSTR(&value), special_characters, 2*SysStringLen(special_characters)) == 0, "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value)), wine_dbgstr_w(special_characters)); VariantClear(&value);
@@ -9060,7 +9060,7 @@ static void test_put_nodeTypedValue(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
p = GlobalLock(global); - todo_wine ok(!memcmp(p, special_characters_escaped, sizeof(special_characters_escaped) - 1), "got %s\n", wine_dbgstr_a(p)); + ok(!memcmp(p, special_characters_escaped, sizeof(special_characters_escaped) - 1), "got %s\n", wine_dbgstr_a(p)); GlobalUnlock(global);
IStream_Release(stream);