[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