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

Nikolay Sivov nsivov at codeweavers.com
Sun Feb 27 14:39:28 CST 2011


---
 dlls/msxml3/element.c      |    8 +++
 dlls/msxml3/tests/domdoc.c |  136 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 144 insertions(+), 0 deletions(-)

diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index b7b623c..b8277c4 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;
@@ -1193,6 +1194,13 @@ static HRESULT WINAPI domelem_setAttributeNode(
     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 S_OK;
+    }
+
     hr = IXMLDOMAttribute_get_nodeValue(attribute, &valueW);
     if (hr != S_OK)
     {
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index abd1f4b..97e8586 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,132 @@ static void test_setAttributeNode(void)
     IXMLDOMElement_Release(elem);
 
     IXMLDOMDocument_Release(doc2);
+    IXMLDOMAttribute_Release(attr);
+
+    /* 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;
+
+    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);
+
+    hr = IXMLDOMElement_setAttributeNode(elem, attr, NULL);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+
+    /* 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);
+    todo_wine ok( hr == TYPE_E_ELEMENTNOTFOUND, "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);
+
+    hr = IXMLDOMElement_setAttributeNode(elem, attr, NULL);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+
+    /* 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);
+
+    hr = IXMLDOMElement_setAttributeNode(elem, attr, NULL);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+
+    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);
+
+    hr = IXMLDOMElement_setAttributeNode(elem, attr, NULL);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+
+    /* 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);
+
+    /* no namespace definition as output */
+    hr = IXMLDOMElement_get_xml(elem, &str);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+    ok( lstrcmpW(str, _bstr_("<test/>")) == 0, "got %s\n", wine_dbgstr_w(str));
+    SysFreeString(str);
+
+    IXMLDOMElement_Release(elem);
+    IXMLDOMAttribute_Release(attr);
+
     IXMLDOMDocument_Release(doc);
     free_bstrs();
 }
@@ -7346,6 +7476,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



--------------040404080702040004090301--



More information about the wine-patches mailing list