Paul Gofman : msxml3: Use node_get_text() in domelem_get_nodeTypedValue() if no type is present.
Alexandre Julliard
julliard at winehq.org
Wed Jul 27 16:15:58 CDT 2022
Module: wine
Branch: master
Commit: 89bbd1327e42e62f7ebd1a2efaeee6dfbdfe20a0
URL: https://gitlab.winehq.org/wine/wine/-/commit/89bbd1327e42e62f7ebd1a2efaeee6dfbdfe20a0
Author: Paul Gofman <pgofman at codeweavers.com>
Date: Mon Jul 25 15:02:08 2022 -0500
msxml3: Use node_get_text() in domelem_get_nodeTypedValue() if no type is present.
---
dlls/msxml3/element.c | 8 ++++-
dlls/msxml3/tests/domdoc.c | 75 ++++++++++++++++++++++++++++++++++++++++++----
2 files changed, 77 insertions(+), 6 deletions(-)
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index 7f5b91b0f39..302849aced6 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -454,7 +454,6 @@ static inline HRESULT variant_from_dt(XDR_DT dt, xmlChar* str, VARIANT* v)
switch (dt)
{
- case DT_INVALID:
case DT_STRING:
case DT_NMTOKEN:
case DT_NMTOKENS:
@@ -736,6 +735,13 @@ static HRESULT WINAPI domelem_get_nodeTypedValue(
V_VT(v) = VT_NULL;
dt = element_get_dt(get_element(This));
+
+ if (dt == DT_INVALID)
+ {
+ if (SUCCEEDED(hr = node_get_text(&This->node, &V_BSTR(v))))
+ V_VT(v) = VT_BSTR;
+ return hr;
+ }
content = xmlNodeGetContent(get_element(This));
hr = variant_from_dt(dt, content, v);
xmlFree(content);
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 0643ea5350f..cf9fb62a65e 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -906,7 +906,11 @@ static const CHAR szTypeValueXML[] =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
"<root xmlns:dt=\"urn:schemas-microsoft-com:datatypes\">\n"
" <string>Wine</string>\n"
-" <string2 dt:dt=\"string\">String</string2>\n"
+" <string2 dt:dt=\"string\">String </string2>\n"
+" <string3> Wine Wine </string3>\n"
+" <string4>\nWine Wine\t</string4>\n"
+" <string5> </string5>\n"
+" <nested><s1> s1 </s1><s2>\ns2 s2\t</s2></nested>\n"
" <number dt:dt=\"number\">12.44</number>\n"
" <number2 dt:dt=\"NUMbEr\">-3.71e3</number2>\n"
" <int dt:dt=\"int\">-13</int>\n"
@@ -6994,11 +6998,16 @@ typedef struct _nodetypedvalue_t {
const char *name;
VARTYPE type;
const char *value; /* value in string format */
+ BOOL no_type;
} nodetypedvalue_t;
static const nodetypedvalue_t get_nodetypedvalue[] = {
- { "root/string", VT_BSTR, "Wine" },
- { "root/string2", VT_BSTR, "String" },
+ { "root/string", VT_BSTR, "Wine", TRUE },
+ { "root/string2", VT_BSTR, "String " },
+ { "root/string3", VT_BSTR, " Wine Wine ", TRUE },
+ { "root/string4", VT_BSTR, "\nWine Wine\t", TRUE },
+ { "root/string5", VT_BSTR, "", TRUE },
+ { "root/nested", VT_BSTR, " s1 \ns2 s2\t", TRUE },
{ "root/number", VT_BSTR, "12.44" },
{ "root/number2", VT_BSTR, "-3.71e3" },
{ "root/int", VT_I4, "-13" },
@@ -7025,6 +7034,24 @@ static const nodetypedvalue_t get_nodetypedvalue[] = {
{ 0 }
};
+static const char *strip_spaces(const char *str)
+{
+ static char buf[256];
+ const char *p;
+
+ while (isspace(*str))
+ ++str;
+
+ p = str + strlen(str);
+ while (p != str && isspace(p[-1]))
+ --p;
+
+ memcpy(buf, str, p - str);
+ buf[p - str] = 0;
+
+ return buf;
+}
+
static void test_nodeTypedValue(void)
{
const nodetypedvalue_t *entry = get_nodetypedvalue;
@@ -7220,8 +7247,46 @@ static void test_nodeTypedValue(void)
"expected %s, got %s\n", entry->value, wine_dbgstr_w(V_BSTR(&value)));
}
else
- ok(lstrcmpW( V_BSTR(&value), _bstr_(entry->value)) == 0,
- "expected %s, got %s\n", entry->value, wine_dbgstr_w(V_BSTR(&value)));
+ {
+ BSTR bstr, expected;
+
+ expected = entry->no_type ? _bstr_(strip_spaces(entry->value)) : _bstr_(entry->value);
+ ok(!wcscmp( V_BSTR(&value), expected ), "expected %s, got %s\n",
+ debugstr_w(expected), wine_dbgstr_w(V_BSTR(&value)));
+ if (entry->no_type)
+ {
+ VariantClear( &value );
+
+ hr = IXMLDOMDocument_get_preserveWhiteSpace(doc, &b);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
+ ok(b == VARIANT_FALSE, "got %d\n", b);
+
+ hr = IXMLDOMNode_get_text(node, &bstr);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!wcscmp( bstr, expected ), "expected %s, got %s\n",
+ debugstr_w(expected), wine_dbgstr_w(bstr));
+ SysFreeString(bstr);
+
+ hr = IXMLDOMDocument_put_preserveWhiteSpace(doc, VARIANT_TRUE);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
+
+ expected = _bstr_(entry->value);
+ hr = IXMLDOMNode_get_text(node, &bstr);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!wcscmp( bstr, expected ), "expected %s, got %s\n",
+ debugstr_w(expected), wine_dbgstr_w(bstr));
+ SysFreeString(bstr);
+
+ hr = IXMLDOMNode_get_nodeTypedValue(node, &value);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
+ ok(V_VT(&value) == entry->type, "incorrect type, expected %d, got %d\n", entry->type, V_VT(&value));
+ ok(!wcscmp( V_BSTR(&value), expected ), "expected %s, got %s\n",
+ debugstr_w(expected), wine_dbgstr_w(V_BSTR(&value)));
+
+ hr = IXMLDOMDocument_put_preserveWhiteSpace(doc, VARIANT_FALSE);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr );
+ }
+ }
VariantClear( &value );
IXMLDOMNode_Release(node);
More information about the wine-cvs
mailing list