Module: wine Branch: master Commit: d7057a34b3e6e8a89e489eee9fdbf6fbe9289fae URL: http://source.winehq.org/git/wine.git/?a=commit;h=d7057a34b3e6e8a89e489eee9f...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Fri Mar 17 16:46:12 2017 +0300
xmllite/reader: For elements without a prefix return same string for both local and qualified names.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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 5ba787e..ca8602c 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 8660bb8..82880ae 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);