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