[PATCH 2/4] Fix IXMLDOMNode::get_prefix() for empty prefix

Nikolay Sivov nsivov at codeweavers.com
Tue Sep 14 00:00:02 CDT 2010


---
 dlls/msxml3/node.c         |   16 ++++++-------
 dlls/msxml3/tests/domdoc.c |   51 ++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 56 insertions(+), 11 deletions(-)

diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index e059d77..7e91292 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -1429,8 +1429,7 @@ static HRESULT WINAPI xmlnode_get_prefix(
     BSTR* prefixString)
 {
     xmlnode *This = impl_from_IXMLDOMNode( iface );
-    HRESULT hr = S_FALSE;
-    xmlNsPtr *pNSList;
+    xmlNsPtr *ns;
 
     TRACE("(%p)->(%p)\n", This, prefixString );
 
@@ -1439,16 +1438,15 @@ static HRESULT WINAPI xmlnode_get_prefix(
 
     *prefixString = NULL;
 
-    pNSList = xmlGetNsList(This->node->doc, This->node);
-    if(pNSList)
+    if ((ns = xmlGetNsList(This->node->doc, This->node)))
     {
-        *prefixString = bstr_from_xmlChar( pNSList[0]->prefix );
-
-        xmlFree(pNSList);
-        hr = S_OK;
+        if (ns[0]->prefix) *prefixString = bstr_from_xmlChar( ns[0]->prefix );
+        xmlFree(ns);
     }
 
-    return hr;
+    TRACE("prefix %s\n", debugstr_w(*prefixString));
+
+    return *prefixString ? S_OK : S_FALSE;
 }
 
 static HRESULT WINAPI xmlnode_get_baseName(
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index f65eff7..176ff36 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -6103,8 +6103,8 @@ static void test_createNode(void)
     ok( hr == S_OK, "got 0x%08x\n", hr);
     prefix = (void*)0xdeadbeef;
     hr = IXMLDOMNode_get_prefix(node, &prefix);
-    todo_wine ok( hr == S_FALSE, "got 0x%08x\n", hr);
-    todo_wine ok(prefix == 0, "expected empty prefix, got %p\n", prefix);
+    ok( hr == S_FALSE, "got 0x%08x\n", hr);
+    ok(prefix == 0, "expected empty prefix, got %p\n", prefix);
 
     hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMElement, (void**)&elem);
     ok( hr == S_OK, "got 0x%08x\n", hr);
@@ -6118,6 +6118,7 @@ static void test_createNode(void)
     hr = IXMLDOMElement_get_namespaceURI(elem, &str);
     ok( hr == S_OK, "got 0x%08x\n", hr);
     ok( lstrcmpW(str, _bstr_("http://winehq.org/default")) == 0, "expected default namespace\n");
+    SysFreeString(str);
 
     IXMLDOMElement_Release(elem);
     IXMLDOMNode_Release(node);
@@ -6126,6 +6127,51 @@ static void test_createNode(void)
     free_bstrs();
 }
 
+static void test_get_prefix(void)
+{
+    IXMLDOMDocument *doc;
+    IXMLDOMElement *element;
+    HRESULT hr;
+    BSTR str;
+
+    doc = create_document(&IID_IXMLDOMDocument);
+    if (!doc) return;
+
+    /* no prefix */
+    hr = IXMLDOMDocument_createElement(doc, _bstr_("elem"), &element);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IXMLDOMElement_get_prefix(element, NULL);
+    ok( hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+    str = (void*)0xdeadbeef;
+    hr = IXMLDOMElement_get_prefix(element, &str);
+    ok( hr == S_FALSE, "got 0x%08x\n", hr);
+    ok( str == 0, "got %p\n", str);
+
+    IXMLDOMElement_Release(element);
+
+    /* with prefix */
+    hr = IXMLDOMDocument_createElement(doc, _bstr_("a:elem"), &element);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+
+    str = (void*)0xdeadbeef;
+    hr = IXMLDOMElement_get_prefix(element, &str);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+    ok( lstrcmpW(str, _bstr_("a")) == 0, "expected prefix \"a\"\n");
+    SysFreeString(str);
+
+    str = (void*)0xdeadbeef;
+    hr = IXMLDOMElement_get_namespaceURI(element, &str);
+    todo_wine ok( hr == S_FALSE, "got 0x%08x\n", hr);
+    todo_wine ok( str == 0, "got %p\n", str);
+
+    IXMLDOMElement_Release(element);
+
+    IXMLDOMDocument_Release(doc);
+    free_bstrs();
+}
+
 START_TEST(domdoc)
 {
     IXMLDOMDocument *doc;
@@ -6182,6 +6228,7 @@ START_TEST(domdoc)
     test_setAttributeNode();
     test_put_dataType();
     test_createNode();
+    test_get_prefix();
 
     CoUninitialize();
 }
-- 
1.5.6.5



--------------080400000702000603020905--



More information about the wine-patches mailing list