Daniel Lehman : msxml3: Treat namespace as attribute in IXMLDOMElement:: getAttribute.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Oct 8 09:20:59 CDT 2015


Module: wine
Branch: master
Commit: a20d152282ece6bd28c407ea02cd3826592581ef
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a20d152282ece6bd28c407ea02cd3826592581ef

Author: Daniel Lehman <dlehman at esri.com>
Date:   Tue Aug 18 15:32:58 2015 -0700

msxml3: Treat namespace as attribute in IXMLDOMElement::getAttribute.

Signed-off-by: Daniel Lehman <dlehman at esri.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msxml3/element.c      | 25 ++++++++++++++++++++++-
 dlls/msxml3/tests/domdoc.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 75 insertions(+), 1 deletion(-)

diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index 38d3b47..6e00aa0 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -1203,7 +1203,9 @@ static HRESULT WINAPI domelem_getAttribute(
     domelem *This = impl_from_IXMLDOMElement( iface );
     xmlNodePtr element;
     xmlChar *xml_name, *xml_value = NULL;
+    xmlChar *local, *prefix;
     HRESULT hr = S_FALSE;
+    xmlNsPtr ns;
 
     TRACE("(%p)->(%s %p)\n", This, debugstr_w(name), value);
 
@@ -1222,7 +1224,28 @@ static HRESULT WINAPI domelem_getAttribute(
     if(!xmlValidateNameValue(xml_name))
         hr = E_FAIL;
     else
-        xml_value = xmlGetNsProp(element, xml_name, NULL);
+    {
+        if ((local = xmlSplitQName2(xml_name, &prefix)))
+        {
+            if (xmlStrEqual(prefix, BAD_CAST "xmlns"))
+            {
+                ns = xmlSearchNs(element->doc, element, local);
+                if (ns)
+                    xml_value = xmlStrdup(ns->href);
+            }
+            else
+            {
+                ns = xmlSearchNs(element->doc, element, prefix);
+                if (ns)
+                    xml_value = xmlGetNsProp(element, local, ns->href);
+            }
+
+            xmlFree(prefix);
+            xmlFree(local);
+        }
+        else
+            xml_value = xmlGetNsProp(element, xml_name, NULL);
+    }
 
     heap_free(xml_name);
     if(xml_value)
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index ff6783b..1afc894 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -10882,6 +10882,56 @@ static void test_getAttributeNode(void)
     free_bstrs();
 }
 
+static void test_getAttribute(void)
+{
+    IXMLDOMDocument *doc;
+    IXMLDOMElement *elem;
+    VARIANT_BOOL v;
+    VARIANT var;
+    HRESULT hr;
+
+    doc = create_document(&IID_IXMLDOMDocument);
+
+    hr = IXMLDOMDocument_loadXML(doc, _bstr_(szExampleXML), &v);
+    EXPECT_HR(hr, S_OK);
+
+    hr = IXMLDOMDocument_get_documentElement(doc, &elem);
+    EXPECT_HR(hr, S_OK);
+
+    VariantInit(&var);
+    hr = IXMLDOMElement_getAttribute( elem, _bstr_("xmlns:foo"), &var );
+    EXPECT_HR(hr, S_OK);
+    ok( V_VT(&var) == VT_BSTR, "vt = %x\n", V_VT(&var));
+    ok( !lstrcmpW(V_BSTR(&var), _bstr_("urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29")), "wrong attr value: %s\n", wine_dbgstr_w(V_BSTR(&var)));
+    VariantClear(&var);
+
+    hr = IXMLDOMElement_getAttribute( elem, _bstr_("a"), &var );
+    EXPECT_HR(hr, S_OK);
+    ok( V_VT(&var) == VT_BSTR, "vt = %x\n", V_VT(&var));
+    ok( !lstrcmpW(V_BSTR(&var), _bstr_("attr a")), "wrong attr value: %s\n", wine_dbgstr_w(V_BSTR(&var)));
+    VariantClear(&var);
+
+    hr = IXMLDOMElement_getAttribute( elem, _bstr_("foo:b"), &var );
+    EXPECT_HR(hr, S_OK);
+    ok( V_VT(&var) == VT_BSTR, "vt = %x\n", V_VT(&var));
+    ok( !lstrcmpW(V_BSTR(&var), _bstr_("attr b")), "wrong attr value: %s\n", wine_dbgstr_w(V_BSTR(&var)));
+    VariantClear(&var);
+
+    hr = IXMLDOMElement_getAttribute( elem, _bstr_("b"), &var );
+    EXPECT_HR(hr, S_FALSE);
+    ok( V_VT(&var) == VT_NULL, "vt = %x\n", V_VT(&var));
+    VariantClear(&var);
+
+    hr = IXMLDOMElement_getAttribute( elem, _bstr_("non-existent"), &var );
+    EXPECT_HR(hr, S_FALSE);
+    ok( V_VT(&var) == VT_NULL, "vt = %x\n", V_VT(&var));
+    VariantClear(&var);
+
+    IXMLDOMElement_Release(elem);
+    IXMLDOMDocument_Release(doc);
+    free_bstrs();
+}
+
 typedef struct {
     DOMNodeType type;
     const char *name;
@@ -12071,6 +12121,7 @@ START_TEST(domdoc)
     test_dispex();
     test_parseerror();
     test_getAttributeNode();
+    test_getAttribute();
     test_supporterrorinfo();
     test_nodeValue();
     test_get_namespaces();




More information about the wine-cvs mailing list