From d921526312e7f2da54c53a8d4f91ba330db7e761 Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Fri, 8 Jul 2016 10:20:31 +0200 Subject: [PATCH] webservices: Inherit the prefix only if parent and child namespaces match. Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard --- dlls/webservices/tests/writer.c | 29 ++++++++++++++++++++++++----- dlls/webservices/writer.c | 7 +++++-- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/dlls/webservices/tests/writer.c b/dlls/webservices/tests/writer.c index d230cddab55..6be47b504fc 100644 --- a/dlls/webservices/tests/writer.c +++ b/dlls/webservices/tests/writer.c @@ -364,7 +364,7 @@ static void test_WsWriteStartElement(void) { HRESULT hr; WS_XML_WRITER *writer; - WS_XML_STRING prefix = {1, (BYTE *)"p"}, ns = {2, (BYTE *)"ns"}; + WS_XML_STRING prefix = {1, (BYTE *)"p"}, ns = {2, (BYTE *)"ns"}, ns2 = {3, (BYTE *)"ns2"}; WS_XML_STRING localname = {1, (BYTE *)"a"}, localname2 = {1, (BYTE *)"b"}; hr = WsCreateWriter( NULL, 0, &writer, NULL ) ; @@ -404,21 +404,40 @@ static void test_WsWriteStartElement(void) hr = set_output( writer ); ok( hr == S_OK, "got %08x\n", hr ); - hr = WsWriteStartElement( writer, NULL, &localname, &ns, NULL ); + hr = WsWriteStartElement( writer, &prefix, &localname, &ns, NULL ); ok( hr == S_OK, "got %08x\n", hr ); check_output( writer, "", __LINE__ ); hr = WsWriteStartElement( writer, NULL, &localname2, &ns, NULL ); ok( hr == S_OK, "got %08x\n", hr ); - check_output( writer, "", __LINE__ ); + check_output( writer, "", __LINE__ ); hr = WsWriteEndElement( writer, NULL ); ok( hr == S_OK, "got %08x\n", hr ); - check_output( writer, "", __LINE__ ); + check_output( writer, "", __LINE__ ); hr = WsWriteEndElement( writer, NULL ); ok( hr == S_OK, "got %08x\n", hr ); - check_output( writer, "", __LINE__ ); + check_output( writer, "", __LINE__ ); + + hr = set_output( writer ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = WsWriteStartElement( writer, &prefix, &localname, &ns, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + check_output( writer, "", __LINE__ ); + + hr = WsWriteStartElement( writer, NULL, &localname2, &ns2, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + check_output( writer, "", __LINE__ ); + + hr = WsWriteEndElement( writer, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + check_output( writer, "", __LINE__ ); + + hr = WsWriteEndElement( writer, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + check_output( writer, "", __LINE__ ); WsFreeWriter( writer ); } diff --git a/dlls/webservices/writer.c b/dlls/webservices/writer.c index 48c738225fe..f8512dc44e5 100644 --- a/dlls/webservices/writer.c +++ b/dlls/webservices/writer.c @@ -929,8 +929,11 @@ static HRESULT write_add_element_node( struct writer *writer, const WS_XML_STRIN if (!(parent = find_parent( writer->current ))) return WS_E_INVALID_FORMAT; - if (!prefix && node_type( writer->current ) == WS_XML_NODE_TYPE_ELEMENT) - prefix = writer->current->hdr.prefix; + if (!prefix && node_type( parent ) == WS_XML_NODE_TYPE_ELEMENT) + { + elem = &parent->hdr; + if (WsXmlStringEquals( ns, elem->ns, NULL ) == S_OK) prefix = elem->prefix; + } if (!(node = alloc_node( WS_XML_NODE_TYPE_ELEMENT ))) return E_OUTOFMEMORY; elem = &node->hdr;