[PATCH] xmllite/writer: Fix writing prefixed attributes.

Nikolay Sivov nsivov at codeweavers.com
Fri Sep 21 01:24:30 CDT 2018


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/xmllite/tests/writer.c | 27 +++++++++++++++++++++++++++
 dlls/xmllite/writer.c       |  8 +++++---
 2 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/dlls/xmllite/tests/writer.c b/dlls/xmllite/tests/writer.c
index 2cd9cea6cc..5ddb1ef2a7 100644
--- a/dlls/xmllite/tests/writer.c
+++ b/dlls/xmllite/tests/writer.c
@@ -1768,6 +1768,33 @@ todo_wine
         "</p:a>");
 
     IStream_Release(stream);
+
+    /* Define prefix, write attribute with it. */
+    stream = writer_set_output(writer);
+
+    hr = IXmlWriter_WriteStartDocument(writer, XmlStandalone_Omit);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = write_start_element(writer, NULL, "e", NULL);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = write_attribute_string(writer, "xmlns", "prefix", NULL, "uri");
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = write_attribute_string(writer, "prefix", "attr", NULL, "value");
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IXmlWriter_WriteEndDocument(writer);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IXmlWriter_Flush(writer);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    CHECK_OUTPUT(stream,
+        "<e xmlns:prefix=\"uri\" prefix:attr=\"value\" />");
+
+    IStream_Release(stream);
+
     IXmlWriter_Release(writer);
 }
 
diff --git a/dlls/xmllite/writer.c b/dlls/xmllite/writer.c
index bf2a7514ac..8d1fb3a2da 100644
--- a/dlls/xmllite/writer.c
+++ b/dlls/xmllite/writer.c
@@ -843,8 +843,8 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR
     static const WCHAR xmlnsW[] = {'x','m','l','n','s',0};
     static const WCHAR xmlW[] = {'x','m','l',0};
     xmlwriter *This = impl_from_IXmlWriter(iface);
+    BOOL is_xmlns_prefix, is_xmlns_local;
     int prefix_len, local_len;
-    BOOL is_xmlns_prefix;
     struct ns *ns;
     HRESULT hr;
 
@@ -879,6 +879,8 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR
     if (FAILED(hr = is_valid_ncname(local, &local_len)))
         return hr;
 
+    is_xmlns_local = !strcmpW(local, xmlnsW);
+
     /* Trivial case, no prefix. */
     if (prefix_len == 0 && is_empty_string(uri))
     {
@@ -918,9 +920,9 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR
     }
 
     /* Ignore prefix is URI wasn't specified. */
-    if (is_empty_string(uri))
+    if (is_xmlns_local && is_empty_string(uri))
     {
-        write_output_attribute(This, NULL, 0, local, local_len, value);
+        write_output_attribute(This, NULL, 0, xmlnsW, ARRAY_SIZE(xmlnsW) - 1, value);
         return S_OK;
     }
 
-- 
2.18.0




More information about the wine-devel mailing list