[PATCH 2/3] xmllite/reader: For elements without a prefix return same string for both local and qualified names
Nikolay Sivov
nsivov at codeweavers.com
Fri Mar 17 08:46:12 CDT 2017
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/xmllite/reader.c | 17 ++++++++++++-----
dlls/xmllite/tests/reader.c | 40 ++++++++++++++++++++++++++++++++++++++--
2 files changed, 50 insertions(+), 7 deletions(-)
diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 5ba787e60d..ca8602c975 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -490,6 +490,7 @@ static void reader_clear_elements(xmlreader *reader)
}
list_init(&reader->elements);
reader_free_strvalued(reader, &reader->empty_element.localname);
+ reader_free_strvalued(reader, &reader->empty_element.qname);
reader->is_empty_element = FALSE;
}
@@ -2227,10 +2228,11 @@ static HRESULT reader_parse_stag(xmlreader *reader, strval *prefix, strval *loca
/* skip '/>' */
reader_skipn(reader, 2);
+ reader_free_strvalued(reader, &element->qname);
reader_free_strvalued(reader, &element->localname);
element->prefix = *prefix;
- element->qname = *qname;
+ reader_strvaldup(reader, qname, &element->qname);
reader_strvaldup(reader, local, &element->localname);
element->position = position;
reader_mark_ns_nodes(reader, element);
@@ -2980,6 +2982,7 @@ static HRESULT WINAPI xmlreader_MoveToElement(IXmlReader* iface)
static HRESULT WINAPI xmlreader_GetQualifiedName(IXmlReader* iface, LPCWSTR *name, UINT *len)
{
xmlreader *This = impl_from_IXmlReader(iface);
+ struct element *element;
UINT length;
TRACE("(%p)->(%p %p)\n", This, name, len);
@@ -2998,14 +3001,18 @@ static HRESULT WINAPI xmlreader_GetQualifiedName(IXmlReader* iface, LPCWSTR *nam
break;
case XmlNodeType_Element:
case XmlNodeType_EndElement:
- if (!This->is_empty_element)
+ element = reader_get_element(This);
+ if (element->prefix.len)
{
- struct element *element = reader_get_element(This);
*name = element->qname.str;
*len = element->qname.len;
- break;
}
- /* fallthrough */
+ else
+ {
+ *name = element->localname.str;
+ *len = element->localname.len;
+ }
+ break;
default:
*name = This->strvalues[StringValue_QualifiedName].str;
*len = This->strvalues[StringValue_QualifiedName].len;
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index 8660bb816a..82880ae8d8 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -1494,6 +1494,8 @@ static void test_read_element(void)
i = 0;
while (IXmlReader_Read(reader, &type) == S_OK)
{
+ UINT count;
+
ok(type == XmlNodeType_Element || type == XmlNodeType_EndElement ||
type == XmlNodeType_Text, "Unexpected node type %d\n", type);
@@ -1502,10 +1504,44 @@ static void test_read_element(void)
ok(hr == S_OK, "got %08x\n", hr);
ok(depth == depths[i], "%u: got depth %u, expected %u\n", i, depth, depths[i]);
- if (type == XmlNodeType_Element)
+ if (type == XmlNodeType_Element || type == XmlNodeType_EndElement)
+ {
+ const WCHAR *prefix;
+
+ prefix = NULL;
+ hr = IXmlReader_GetPrefix(reader, &prefix, NULL);
+ ok(hr == S_OK, "got %08x\n", hr);
+ ok(prefix != NULL, "got %p\n", prefix);
+
+ if (!*prefix)
+ {
+ const WCHAR *local, *qname;
+
+ local = NULL;
+ hr = IXmlReader_GetLocalName(reader, &local, NULL);
+ ok(hr == S_OK, "got %08x\n", hr);
+ ok(local != NULL, "got %p\n", local);
+
+ qname = NULL;
+ hr = IXmlReader_GetQualifiedName(reader, &qname, NULL);
+ ok(hr == S_OK, "got %08x\n", hr);
+ ok(qname != NULL, "got %p\n", qname);
+
+ ok(local == qname, "expected same pointer\n");
+ }
+ }
+
+ if (type == XmlNodeType_EndElement)
{
- UINT count = 0;
+ count = 1;
+ hr = IXmlReader_GetAttributeCount(reader, &count);
+ ok(hr == S_OK, "got %08x\n", hr);
+ ok(count == 0, "got %u\n", count);
+ }
+ if (type == XmlNodeType_Element)
+ {
+ count = 0;
hr = IXmlReader_GetAttributeCount(reader, &count);
ok(hr == S_OK, "got %08x\n", hr);
--
2.11.0
More information about the wine-patches
mailing list