diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c index 5ba787e60da..ca8602c9752 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 8660bb816ab..82880ae8d8a 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 || 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) + { + 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) { - UINT count = 0; - + count = 0; hr = IXmlReader_GetAttributeCount(reader, &count); ok(hr == S_OK, "got %08x\n", hr);