[PATCH 2/2] Reject xmlns attribute to be added to element

Nikolay Sivov nsivov at codeweavers.com
Sun Feb 27 17:27:30 CST 2011


---
 dlls/msxml3/element.c      |   12 +++-
 dlls/msxml3/tests/domdoc.c |  138 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 148 insertions(+), 2 deletions(-)

diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index b7b623c..9573de9 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -1178,6 +1178,7 @@ static HRESULT WINAPI domelem_setAttributeNode(
     IXMLDOMAttribute** old)
 {
     domelem *This = impl_from_IXMLDOMElement( iface );
+    static const WCHAR xmlnsW[] = {'x','m','l','n','s',0};
     xmlChar *name, *value;
     BSTR nameW, prefix;
     xmlAttrPtr attr;
@@ -1188,11 +1189,16 @@ static HRESULT WINAPI domelem_setAttributeNode(
 
     if (!attribute) return E_INVALIDARG;
 
-    if (old) *old = NULL;
-
     hr = IXMLDOMAttribute_get_nodeName(attribute, &nameW);
     if (hr != S_OK) return hr;
 
+    /* adding xmlns attribute doesn't change a tree or existing namespace definition */
+    if (!strcmpW(nameW, xmlnsW))
+    {
+        SysFreeString(nameW);
+        return DISP_E_UNKNOWNNAME;
+    }
+
     hr = IXMLDOMAttribute_get_nodeValue(attribute, &valueW);
     if (hr != S_OK)
     {
@@ -1200,6 +1206,8 @@ static HRESULT WINAPI domelem_setAttributeNode(
         return hr;
     }
 
+    if (old) *old = NULL;
+
     TRACE("attribute: %s=%s\n", debugstr_w(nameW), debugstr_w(V_BSTR(&valueW)));
 
     hr = IXMLDOMAttribute_get_prefix(attribute, &prefix);
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index abd1f4b..552e52b 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -7213,6 +7213,7 @@ static void test_setAttributeNode(void)
     IXMLDOMAttribute *attr, *attr2, *ret_attr;
     VARIANT_BOOL b;
     HRESULT hr;
+    VARIANT v;
     BSTR str;
 
     doc = create_document(&IID_IXMLDOMDocument);
@@ -7240,6 +7241,11 @@ static void test_setAttributeNode(void)
     ok( hr == S_OK, "got 0x%08x\n", hr);
     ok( ret_attr == NULL, "got %p\n", ret_attr);
 
+    b = VARIANT_FALSE;
+    hr = IXMLDOMElement_hasChildNodes(elem, &b);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+    ok(b == VARIANT_TRUE, "got %d\n", b);
+
     attr2 = NULL;
     hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("attr"), &attr2);
     ok( hr == S_OK, "got 0x%08x\n", hr);
@@ -7278,8 +7284,134 @@ static void test_setAttributeNode(void)
     IXMLDOMElement_Release(elem);
 
     IXMLDOMDocument_Release(doc2);
+    IXMLDOMAttribute_Release(attr);
+    IXMLDOMDocument_Release(doc);
+
+    hr = CoCreateInstance( &CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc );
+    if (hr != S_OK)
+    {
+        win_skip("DOMDocument40 is not available (0x%08x)\n", hr);
+        return;
+    }
+
+    /* try attribute with xmlns name */
+    V_VT(&v) = VT_I4;
+    V_I4(&v) = NODE_ELEMENT;
+
+    hr = IXMLDOMDocument_createNode(doc, v, _bstr_("test"), _bstr_("http://winehq.org/default"), (IXMLDOMNode**)&elem);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
 
+    V_VT(&v) = VT_I4;
+    V_I4(&v) = NODE_ATTRIBUTE;
+
+    attr = NULL;
+    hr = IXMLDOMDocument_createNode(doc, v, _bstr_("xmlns"), NULL, (IXMLDOMNode**)&attr);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(attr != NULL, "got %p\n", attr);
+
+    V_VT(&v) = VT_BSTR;
+    V_BSTR(&v) = _bstr_("http://winehq.org/default");
+    hr = IXMLDOMAttribute_put_nodeValue(attr, v);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+
+    ret_attr = (void*)0xdeadbeef;
+    hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr);
+    ok(hr == DISP_E_UNKNOWNNAME, "got 0x%08x\n", hr);
+    ok(ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr);
+
+    /* no child node added actually */
+    b = VARIANT_TRUE;
+    hr = IXMLDOMElement_hasChildNodes(elem, &b);
+    ok( hr == S_FALSE, "got 0x%08x\n", hr);
+    ok(b == VARIANT_FALSE, "got %d\n", b);
+
+    /* a single namespace definition as output */
+    hr = IXMLDOMElement_get_xml(elem, &str);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+    ok( lstrcmpW(str, _bstr_("<test xmlns=\"http://winehq.org/default\"/>")) == 0,
+        "got %s\n", wine_dbgstr_w(str));
+    SysFreeString(str);
+
+    /* alter value isn't possible after creation? */
+    V_VT(&v) = VT_BSTR;
+    V_BSTR(&v) = _bstr_("http://winehq.org/default1");
+    hr = IXMLDOMAttribute_put_nodeValue(attr, v);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+
+    IXMLDOMElement_Release(elem);
     IXMLDOMAttribute_Release(attr);
+
+    /* try to alter it with different attribute value */
+    V_VT(&v) = VT_I4;
+    V_I4(&v) = NODE_ELEMENT;
+
+    hr = IXMLDOMDocument_createNode(doc, v, _bstr_("test"), _bstr_("http://winehq.org/default"), (IXMLDOMNode**)&elem);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+
+    V_VT(&v) = VT_I4;
+    V_I4(&v) = NODE_ATTRIBUTE;
+
+    hr = IXMLDOMDocument_createNode(doc, v, _bstr_("xmlns"), NULL, (IXMLDOMNode**)&attr);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+
+    V_VT(&v) = VT_BSTR;
+    V_BSTR(&v) = _bstr_("http://winehq.org/default1");
+    hr = IXMLDOMAttribute_put_nodeValue(attr, v);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+
+    ret_attr = (void*)0xdeadbeef;
+    hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr);
+    ok( hr == DISP_E_UNKNOWNNAME, "got 0x%08x\n", hr);
+    ok(ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr);
+
+    /* no child node added actually */
+    b = VARIANT_TRUE;
+    hr = IXMLDOMElement_hasChildNodes(elem, &b);
+    ok( hr == S_FALSE, "got 0x%08x\n", hr);
+    ok(b == VARIANT_FALSE, "got %d\n", b);
+
+    /* initial value preserved */
+    hr = IXMLDOMElement_get_xml(elem, &str);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+    ok( lstrcmpW(str, _bstr_("<test xmlns=\"http://winehq.org/default\"/>")) == 0,
+        "got %s\n", wine_dbgstr_w(str));
+    SysFreeString(str);
+
+    IXMLDOMElement_Release(elem);
+    IXMLDOMAttribute_Release(attr);
+
+    /* now create without default namespace and add it as attribute */
+    V_VT(&v) = VT_I4;
+    V_I4(&v) = NODE_ELEMENT;
+
+    hr = IXMLDOMDocument_createNode(doc, v, _bstr_("test"), NULL, (IXMLDOMNode**)&elem);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+
+    V_VT(&v) = VT_I4;
+    V_I4(&v) = NODE_ATTRIBUTE;
+
+    hr = IXMLDOMDocument_createNode(doc, v, _bstr_("xmlns"), NULL, (IXMLDOMNode**)&attr);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+
+    V_VT(&v) = VT_BSTR;
+    V_BSTR(&v) = _bstr_("http://winehq.org/default");
+    hr = IXMLDOMAttribute_put_nodeValue(attr, v);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+
+    ret_attr = (void*)0xdeadbeef;
+    hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr);
+    ok(hr == DISP_E_UNKNOWNNAME, "got 0x%08x\n", hr);
+    ok(ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr);
+
+    /* no child node added */
+    b = VARIANT_TRUE;
+    hr = IXMLDOMElement_hasChildNodes(elem, &b);
+    ok( hr == S_FALSE, "got 0x%08x\n", hr);
+    ok(b == VARIANT_FALSE, "got %d\n", b);
+
+    IXMLDOMElement_Release(elem);
+    IXMLDOMAttribute_Release(attr);
+
     IXMLDOMDocument_Release(doc);
     free_bstrs();
 }
@@ -7346,6 +7478,12 @@ static void test_createNode(void)
     hr = IXMLDOMNode_get_prefix(node, &prefix);
     ok( hr == S_FALSE, "got 0x%08x\n", hr);
     ok(prefix == 0, "expected empty prefix, got %p\n", prefix);
+    /* check dump */
+    hr = IXMLDOMNode_get_xml(node, &str);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+    ok( lstrcmpW(str, _bstr_("<test xmlns=\"http://winehq.org/default\"/>")) == 0,
+        "got %s\n", wine_dbgstr_w(str));
+    SysFreeString(str);
 
     hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMElement, (void**)&elem);
     ok( hr == S_OK, "got 0x%08x\n", hr);
-- 
1.5.6.5



--------------070103020709010107090203--



More information about the wine-patches mailing list