Nikolay Sivov : msxml3: Link dom attribute with parent interface pointer.

Alexandre Julliard julliard at winehq.org
Thu Mar 3 11:46:21 CST 2011


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Mar  3 03:57:01 2011 +0300

msxml3: Link dom attribute with parent interface pointer.

---

 dlls/msxml3/element.c       |   16 ++++++++++++++++
 dlls/msxml3/msxml_private.h |    5 +++--
 dlls/msxml3/node.c          |    1 +
 dlls/msxml3/tests/domdoc.c  |   23 +++++++++++++++++------
 4 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index b1de8df..f2c5bbb 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -1182,6 +1182,7 @@ static HRESULT WINAPI domelem_setAttributeNode(
     static const WCHAR xmlnsW[] = {'x','m','l','n','s',0};
     xmlChar *name, *value;
     BSTR nameW, prefix;
+    xmlnode *attr_node;
     xmlAttrPtr attr;
     VARIANT valueW;
     HRESULT hr;
@@ -1190,6 +1191,19 @@ static HRESULT WINAPI domelem_setAttributeNode(
 
     if (!attribute) return E_INVALIDARG;
 
+    attr_node = get_node_obj((IXMLDOMNode*)attribute);
+    if (!attr_node)
+    {
+        FIXME("att_node is not our node implementation\n");
+        return E_FAIL;
+    }
+
+    if (attr_node->parent)
+    {
+        WARN("attempt to add already used attribute\n");
+        return E_FAIL;
+    }
+
     hr = IXMLDOMAttribute_get_nodeName(attribute, &nameW);
     if (hr != S_OK) return hr;
 
@@ -1231,6 +1245,8 @@ static HRESULT WINAPI domelem_setAttributeNode(
     }
 
     attr = xmlSetNsProp(get_element(This), NULL, name, value);
+    if (attr)
+        attr_node->parent = (IXMLDOMNode*)iface;
 
     SysFreeString(nameW);
     VariantClear(&valueW);
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index ab7820f..72de7ba 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -233,9 +233,10 @@ extern void set_xpathmode(xmlDocPtr doc, BOOL xpath);
 /* IXMLDOMNode Internal Structure */
 typedef struct _xmlnode
 {
-    DispatchEx dispex;
+    DispatchEx   dispex;
     IXMLDOMNode *iface;
-    xmlNodePtr node;
+    IXMLDOMNode *parent;
+    xmlNodePtr   node;
 } xmlnode;
 
 extern void init_xmlnode(xmlnode*,xmlNodePtr,IXMLDOMNode*,dispex_static_data_t*);
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index a952ac0..71b95a8 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -1106,6 +1106,7 @@ void init_xmlnode(xmlnode *This, xmlNodePtr node, IXMLDOMNode *node_iface, dispe
 
     This->node = node;
     This->iface = node_iface;
+    This->parent = NULL;
 
     if(dispex_data)
         init_dispex(&This->dispex, (IUnknown*)This->iface, dispex_data);
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index c154860..82961f0 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -7213,7 +7213,7 @@ static void test_get_ownerDocument(void)
 static void test_setAttributeNode(void)
 {
     IXMLDOMDocument *doc, *doc2;
-    IXMLDOMElement *elem;
+    IXMLDOMElement *elem, *elem2;
     IXMLDOMAttribute *attr, *attr2, *ret_attr;
     VARIANT_BOOL b;
     HRESULT hr;
@@ -7233,6 +7233,10 @@ static void test_setAttributeNode(void)
     hr = IXMLDOMDocument_get_documentElement(doc, &elem);
     ok( hr == S_OK, "got 0x%08x\n", hr);
 
+    hr = IXMLDOMDocument_get_documentElement(doc, &elem2);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+    ok( elem2 != elem, "got same instance\n");
+
     ret_attr = (void*)0xdeadbeef;
     hr = IXMLDOMElement_setAttributeNode(elem, NULL, &ret_attr);
     ok( hr == E_INVALIDARG, "got 0x%08x\n", hr);
@@ -7259,16 +7263,23 @@ static void test_setAttributeNode(void)
     ok( hr == S_OK, "got 0x%08x\n", hr);
     ok(b == VARIANT_TRUE, "got %d\n", b);
 
+    b = VARIANT_FALSE;
+    hr = IXMLDOMElement_hasChildNodes(elem2, &b);
+    ok( hr == S_OK, "got 0x%08x\n", hr);
+    ok(b == VARIANT_TRUE, "got %d\n", b);
+    IXMLDOMElement_Release(elem2);
+
     attr2 = NULL;
     hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("attr"), &attr2);
     ok( hr == S_OK, "got 0x%08x\n", hr);
+    ok( attr2 != attr, "got same instance %p\n", attr2);
     IXMLDOMAttribute_Release(attr2);
 
     /* try to add it another time */
     ret_attr = (void*)0xdeadbeef;
     hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr);
-    todo_wine ok( hr == E_FAIL, "got 0x%08x\n", hr);
-    todo_wine ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr);
+    ok( hr == E_FAIL, "got 0x%08x\n", hr);
+    ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr);
 
     IXMLDOMElement_Release(elem);
 
@@ -7277,8 +7288,8 @@ static void test_setAttributeNode(void)
     ok( hr == S_OK, "got 0x%08x\n", hr);
     ret_attr = (void*)0xdeadbeef;
     hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr);
-    todo_wine ok( hr == E_FAIL, "got 0x%08x\n", hr);
-    todo_wine ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr);
+    ok( hr == E_FAIL, "got 0x%08x\n", hr);
+    ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr);
     IXMLDOMElement_Release(elem);
 
     /* add attribute already attached to another document */
@@ -7293,7 +7304,7 @@ static void test_setAttributeNode(void)
     hr = IXMLDOMDocument_get_documentElement(doc2, &elem);
     ok( hr == S_OK, "got 0x%08x\n", hr);
     hr = IXMLDOMElement_setAttributeNode(elem, attr, NULL);
-    todo_wine ok( hr == E_FAIL, "got 0x%08x\n", hr);
+    ok( hr == E_FAIL, "got 0x%08x\n", hr);
     IXMLDOMElement_Release(elem);
 
     IXMLDOMAttribute_Release(attr);




More information about the wine-cvs mailing list