[PATCH] Implement ownerDocument
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Fri Jan 25 03:21:50 CST 2008
---
dlls/msxml3/attribute.c | 4 +-
dlls/msxml3/cdata.c | 4 +-
dlls/msxml3/comment.c | 4 +-
dlls/msxml3/docfrag.c | 4 +-
dlls/msxml3/domdoc.c | 24 ++++++------
dlls/msxml3/element.c | 8 +++--
dlls/msxml3/entityref.c | 4 +-
dlls/msxml3/msxml_private.h | 27 +++++++-------
dlls/msxml3/node.c | 51 +++++++++++++++++++-------
dlls/msxml3/nodelist.c | 8 +++--
dlls/msxml3/nodemap.c | 12 ++++---
dlls/msxml3/pi.c | 4 +-
dlls/msxml3/queryresult.c | 8 +++--
dlls/msxml3/tests/domdoc.c | 83 +++++++++++++++++++++++++++++++++++++++++--
dlls/msxml3/text.c | 4 +-
15 files changed, 179 insertions(+), 70 deletions(-)
diff --git a/dlls/msxml3/attribute.c b/dlls/msxml3/attribute.c
index 805bafe..3327377 100644
--- a/dlls/msxml3/attribute.c
+++ b/dlls/msxml3/attribute.c
@@ -503,7 +503,7 @@ static const struct IXMLDOMAttributeVtbl domattr_vtbl =
domattr_put_value
};
-IUnknown* create_attribute( xmlNodePtr attribute )
+IUnknown* create_attribute( xmlNodePtr attribute, IXMLDOMDocument *pDoc )
{
domattr *This;
HRESULT hr;
@@ -515,7 +515,7 @@ IUnknown* create_attribute( xmlNodePtr attribute )
This->lpVtbl = &domattr_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( attribute, (IUnknown*)&This->lpVtbl );
+ This->node_unk = create_basic_node( attribute, (IUnknown*)&This->lpVtbl, pDoc );
if(!This->node_unk)
{
HeapFree(GetProcessHeap(), 0, This);
diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c
index 186b9e4..90e2c8c 100644
--- a/dlls/msxml3/cdata.c
+++ b/dlls/msxml3/cdata.c
@@ -559,7 +559,7 @@ static const struct IXMLDOMCDATASectionVtbl domcdata_vtbl =
domcdata_splitText
};
-IUnknown* create_cdata( xmlNodePtr text )
+IUnknown* create_cdata( xmlNodePtr text, IXMLDOMDocument *pDoc)
{
domcdata *This;
HRESULT hr;
@@ -571,7 +571,7 @@ IUnknown* create_cdata( xmlNodePtr text )
This->lpVtbl = &domcdata_vtbl;
This->ref = 1;
- This->element_unk = create_element( text, (IUnknown*)&This->lpVtbl );
+ This->element_unk = create_element( text, (IUnknown*)&This->lpVtbl, pDoc );
if(!This->element_unk)
{
HeapFree(GetProcessHeap(), 0, This);
diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c
index 702a339..c23063b 100644
--- a/dlls/msxml3/comment.c
+++ b/dlls/msxml3/comment.c
@@ -548,7 +548,7 @@ static const struct IXMLDOMCommentVtbl domcomment_vtbl =
domcomment_replaceData
};
-IUnknown* create_comment( xmlNodePtr comment )
+IUnknown* create_comment( xmlNodePtr comment, IXMLDOMDocument *pDoc )
{
domcomment *This;
HRESULT hr;
@@ -560,7 +560,7 @@ IUnknown* create_comment( xmlNodePtr comment )
This->lpVtbl = &domcomment_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( comment, (IUnknown*)&This->lpVtbl );
+ This->node_unk = create_basic_node( comment, (IUnknown*)&This->lpVtbl, pDoc );
if(!This->node_unk)
{
HeapFree(GetProcessHeap(), 0, This);
diff --git a/dlls/msxml3/docfrag.c b/dlls/msxml3/docfrag.c
index c741f24..395ec15 100644
--- a/dlls/msxml3/docfrag.c
+++ b/dlls/msxml3/docfrag.c
@@ -476,7 +476,7 @@ static const struct IXMLDOMDocumentFragmentVtbl domfrag_vtbl =
domfrag_transformNodeToObject
};
-IUnknown* create_doc_fragment( xmlNodePtr fragment )
+IUnknown* create_doc_fragment( xmlNodePtr fragment, IXMLDOMDocument *pDoc )
{
domfrag *This;
HRESULT hr;
@@ -488,7 +488,7 @@ IUnknown* create_doc_fragment( xmlNodePtr fragment )
This->lpVtbl = &domfrag_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( fragment, (IUnknown*)&This->lpVtbl );
+ This->node_unk = create_basic_node( fragment, (IUnknown*)&This->lpVtbl, pDoc );
if(!This->node_unk)
{
HeapFree(GetProcessHeap(), 0, This);
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index cb63922..06388c8 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -835,7 +835,7 @@ static HRESULT WINAPI domdoc_get_documentElement(
if ( !root )
return S_FALSE;
- element_node = create_node( root );
+ element_node = create_node( root, (IXMLDOMDocument*)&(This->lpVtbl) );
if(!element_node) return S_FALSE;
hr = IXMLDOMNode_QueryInterface(element_node, &IID_IXMLDOMElement, (LPVOID*)DOMElement);
@@ -871,7 +871,7 @@ static HRESULT WINAPI domdoc_createElement(
xmlnode = xmlNewDocNode(get_doc(This), NULL, xml_name, NULL);
TRACE("created xmlptr %p\n", xmlnode);
- elem_unk = create_element(xmlnode, NULL);
+ elem_unk = create_element(xmlnode, NULL, (IXMLDOMDocument*)&(This->lpVtbl));
HeapFree(GetProcessHeap(), 0, xml_name);
hr = IUnknown_QueryInterface(elem_unk, &IID_IXMLDOMElement, (void **)element);
@@ -902,7 +902,7 @@ static HRESULT WINAPI domdoc_createDocumentFragment(
xmlnode->doc = get_doc( This );
- *docFrag = (IXMLDOMDocumentFragment*)create_doc_fragment(xmlnode);
+ *docFrag = (IXMLDOMDocumentFragment*)create_doc_fragment(xmlnode, (IXMLDOMDocument*)&(This->lpVtbl));
return S_OK;
}
@@ -933,7 +933,7 @@ static HRESULT WINAPI domdoc_createTextNode(
xmlnode->doc = get_doc( This );
- *text = (IXMLDOMText*)create_text(xmlnode);
+ *text = (IXMLDOMText*)create_text(xmlnode, (IXMLDOMDocument*)&(This->lpVtbl));
return S_OK;
}
@@ -964,7 +964,7 @@ static HRESULT WINAPI domdoc_createComment(
xmlnode->doc = get_doc( This );
- *comment = (IXMLDOMComment*)create_comment(xmlnode);
+ *comment = (IXMLDOMComment*)create_comment(xmlnode, (IXMLDOMDocument*)&(This->lpVtbl));
return S_OK;
}
@@ -995,7 +995,7 @@ static HRESULT WINAPI domdoc_createCDATASection(
xmlnode->doc = get_doc( This );
- *cdata = (IXMLDOMCDATASection*)create_cdata(xmlnode);
+ *cdata = (IXMLDOMCDATASection*)create_cdata(xmlnode, (IXMLDOMDocument*)&(This->lpVtbl));
return S_OK;
}
@@ -1025,7 +1025,7 @@ static HRESULT WINAPI domdoc_createProcessingInstruction(
xmlnode = xmlNewDocPI(get_doc(This), xml_target, xml_content);
TRACE("created xmlptr %p\n", xmlnode);
- *pi = (IXMLDOMProcessingInstruction*)create_pi(xmlnode);
+ *pi = (IXMLDOMProcessingInstruction*)create_pi(xmlnode, (IXMLDOMDocument*)&(This->lpVtbl));
HeapFree(GetProcessHeap(), 0, xml_content);
HeapFree(GetProcessHeap(), 0, xml_target);
@@ -1063,7 +1063,7 @@ static HRESULT WINAPI domdoc_createAttribute(
xmlnode->doc = get_doc( This );
- *attribute = (IXMLDOMAttribute*)create_attribute(xmlnode);
+ *attribute = (IXMLDOMAttribute*)create_attribute(xmlnode, (IXMLDOMDocument*)&(This->lpVtbl));
return S_OK;
}
@@ -1094,7 +1094,7 @@ static HRESULT WINAPI domdoc_createEntityReference(
xmlnode->doc = get_doc( This );
- *entityRef = (IXMLDOMEntityReference*)create_doc_entity_ref(xmlnode);
+ *entityRef = (IXMLDOMEntityReference*)create_doc_entity_ref(xmlnode, (IXMLDOMDocument*)&(This->lpVtbl));
return S_OK;
}
@@ -1114,7 +1114,7 @@ static HRESULT WINAPI domdoc_getElementsByTagName(
szPattern[0] = szPattern[1] = '/';
lstrcpyW(szPattern + 2, tagName);
- hr = queryresult_create((xmlNodePtr)get_doc(This), szPattern, resultList);
+ hr = queryresult_create((xmlNodePtr)get_doc(This), szPattern, (IXMLDOMDocument*)&(This->lpVtbl), resultList);
HeapFree(GetProcessHeap(), 0, szPattern);
return hr;
@@ -1152,7 +1152,7 @@ static HRESULT WINAPI domdoc_createNode(
{
case NODE_ELEMENT:
xmlnode = xmlNewDocNode(get_doc(This), NULL, xml_name, NULL);
- *node = create_node(xmlnode);
+ *node = create_node(xmlnode, (IXMLDOMDocument*)&(This->lpVtbl));
TRACE("created %p\n", xmlnode);
break;
@@ -1897,7 +1897,7 @@ HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj)
xmldoc->_private = 0;
- doc->node_unk = create_basic_node( (xmlNodePtr)xmldoc, (IUnknown*)&doc->lpVtbl );
+ doc->node_unk = create_basic_node( (xmlNodePtr)xmldoc, (IUnknown*)&doc->lpVtbl, (IXMLDOMDocument*)doc->lpVtbl);
if(!doc->node_unk)
{
xmlFreeDoc(xmldoc);
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index ba01247..0549d8b 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -46,6 +46,7 @@ typedef struct _domelem
LONG ref;
IUnknown *node_unk;
IXMLDOMNode *node;
+ IXMLDOMDocument *pDocument;
} domelem;
static inline domelem *impl_from_IXMLDOMElement( IXMLDOMElement *iface )
@@ -574,7 +575,7 @@ static HRESULT WINAPI domelem_getElementsByTagName(
lstrcpyW(szPattern+3, bstrName);
TRACE("%s\n", debugstr_w(szPattern));
- hr = queryresult_create(get_element(This), szPattern, resultList);
+ hr = queryresult_create(get_element(This), szPattern, This->pDocument, resultList);
HeapFree(GetProcessHeap(), 0, szPattern);
return hr;
@@ -702,7 +703,7 @@ static const struct IUnknownVtbl internal_unk_vtbl =
Internal_Release
};
-IUnknown* create_element( xmlNodePtr element, IUnknown *pUnkOuter )
+IUnknown* create_element( xmlNodePtr element, IUnknown *pUnkOuter, IXMLDOMDocument *pDoc )
{
domelem *This;
HRESULT hr;
@@ -714,13 +715,14 @@ IUnknown* create_element( xmlNodePtr element, IUnknown *pUnkOuter )
This->lpVtbl = &domelem_vtbl;
This->ref = 1;
This->lpInternalUnkVtbl = &internal_unk_vtbl;
+ This->pDocument = pDoc;
if(pUnkOuter)
This->pUnkOuter = pUnkOuter; /* Don't take a ref on outer Unknown */
else
This->pUnkOuter = (IUnknown *)&This->lpInternalUnkVtbl;
- This->node_unk = create_basic_node( element, (IUnknown*)&This->lpVtbl );
+ This->node_unk = create_basic_node( element, (IUnknown*)&This->lpVtbl, pDoc );
if(!This->node_unk)
{
HeapFree(GetProcessHeap(), 0, This);
diff --git a/dlls/msxml3/entityref.c b/dlls/msxml3/entityref.c
index 8902152..2285ce8 100644
--- a/dlls/msxml3/entityref.c
+++ b/dlls/msxml3/entityref.c
@@ -476,7 +476,7 @@ static const struct IXMLDOMEntityReferenceVtbl entityref_vtbl =
entityref_transformNodeToObject,
};
-IUnknown* create_doc_entity_ref( xmlNodePtr entity )
+IUnknown* create_doc_entity_ref( xmlNodePtr entity, IXMLDOMDocument *pDoc )
{
entityref *This;
HRESULT hr;
@@ -488,7 +488,7 @@ IUnknown* create_doc_entity_ref( xmlNodePtr entity )
This->lpVtbl = &entityref_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( entity, (IUnknown*)&This->lpVtbl );
+ This->node_unk = create_basic_node( entity, (IUnknown*)&This->lpVtbl, pDoc );
if(!This->node_unk)
{
HeapFree(GetProcessHeap(), 0, This);
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 33b2c9e..8d79d2e 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -34,21 +34,21 @@
/* constructors */
extern IUnknown *create_domdoc( void );
extern IUnknown *create_xmldoc( void );
-extern IXMLDOMNode *create_node( xmlNodePtr node );
-extern IUnknown *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter );
-extern IUnknown *create_element( xmlNodePtr element, IUnknown *pUnkOuter );
-extern IUnknown *create_attribute( xmlNodePtr attribute );
-extern IUnknown *create_text( xmlNodePtr text );
-extern IUnknown *create_pi( xmlNodePtr pi );
-extern IUnknown *create_comment( xmlNodePtr comment );
-extern IUnknown *create_cdata( xmlNodePtr text );
-extern IXMLDOMNodeList *create_children_nodelist( xmlNodePtr );
-extern IXMLDOMNamedNodeMap *create_nodemap( IXMLDOMNode *node );
+extern IXMLDOMNode *create_node( xmlNodePtr node, IXMLDOMDocument *pDoc );
+extern IUnknown *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter, IXMLDOMDocument *pDoc );
+extern IUnknown *create_element( xmlNodePtr element, IUnknown *pUnkOuter, IXMLDOMDocument *pDoc );
+extern IUnknown *create_attribute( xmlNodePtr attribute, IXMLDOMDocument *pDoc );
+extern IUnknown *create_text( xmlNodePtr text, IXMLDOMDocument *pDoc );
+extern IUnknown *create_pi( xmlNodePtr pi, IXMLDOMDocument *pDoc );
+extern IUnknown *create_comment( xmlNodePtr comment, IXMLDOMDocument *pDoc );
+extern IUnknown *create_cdata( xmlNodePtr text, IXMLDOMDocument *pDoc );
+extern IXMLDOMNodeList *create_children_nodelist( xmlNodePtr, IXMLDOMDocument *pDoc );
+extern IXMLDOMNamedNodeMap *create_nodemap( IXMLDOMNode *node, IXMLDOMDocument *pDoc );
extern IUnknown *create_doc_Implementation();
-extern IUnknown *create_doc_fragment( xmlNodePtr fragment );
-extern IUnknown *create_doc_entity_ref( xmlNodePtr entity );
+extern IUnknown *create_doc_fragment( xmlNodePtr fragment, IXMLDOMDocument *pDoc );
+extern IUnknown *create_doc_entity_ref( xmlNodePtr entity, IXMLDOMDocument *pDoc );
-extern HRESULT queryresult_create( xmlNodePtr, LPWSTR, IXMLDOMNodeList ** );
+extern HRESULT queryresult_create( xmlNodePtr, LPWSTR, IXMLDOMDocument *pDoc, IXMLDOMNodeList ** );
extern void attach_xmlnode( IXMLDOMNode *node, xmlNodePtr xmlnode );
@@ -75,6 +75,7 @@ typedef struct _xmlnode
IUnknown *pUnkOuter;
LONG ref;
xmlNodePtr node;
+ IXMLDOMDocument *pDocument;
} xmlnode;
static inline xmlnode *impl_from_IXMLDOMNode( IXMLDOMNode *iface )
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 9d43c09..009f5ef 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -289,7 +289,7 @@ static HRESULT get_node(
if ( !out )
return E_INVALIDARG;
- *out = create_node( node );
+ *out = create_node( node, This->pDocument );
if (!*out)
return S_FALSE;
return S_OK;
@@ -314,7 +314,7 @@ static HRESULT WINAPI xmlnode_get_childNodes(
if ( !childList )
return E_INVALIDARG;
- *childList = create_children_nodelist(This->node);
+ *childList = create_children_nodelist(This->node, This->pDocument);
if (*childList == NULL)
return E_OUTOFMEMORY;
@@ -427,7 +427,7 @@ static HRESULT WINAPI xmlnode_get_attributes(
*attributeMap = NULL;
return S_FALSE;
default:
- *attributeMap = create_nodemap( iface );
+ *attributeMap = create_nodemap( iface, This->pDocument );
return S_OK;
}
}
@@ -602,8 +602,30 @@ static HRESULT WINAPI xmlnode_get_ownerDocument(
IXMLDOMNode *iface,
IXMLDOMDocument** DOMDocument)
{
- FIXME("\n");
- return E_NOTIMPL;
+ /*
+ This function returns a 'read-only' reference to an IXMLDOMDocument*,
+ which really means that AddRef isnt called on it.
+ */
+ HRESULT hr = S_OK;
+ xmlnode *This = impl_from_IXMLDOMNode( iface );
+ TRACE("\n");
+
+ if(!DOMDocument)
+ return E_INVALIDARG;
+
+ *DOMDocument = NULL;
+
+ switch( This->node->type )
+ {
+ case XML_DOCUMENT_NODE:
+ hr = S_FALSE;
+ break;
+ default:
+ *DOMDocument = This->pDocument;
+ break;
+ }
+
+ return hr;
}
static HRESULT WINAPI xmlnode_cloneNode(
@@ -625,7 +647,7 @@ static HRESULT WINAPI xmlnode_cloneNode(
{
pClone->doc = This->node->doc;
- pNode = create_node(pClone);
+ pNode = create_node(pClone, This->pDocument);
if(!pNode)
{
ERR("Copy failed\n");
@@ -922,7 +944,7 @@ static HRESULT WINAPI xmlnode_selectNodes(
TRACE("%p %s %p\n", This, debugstr_w(queryString), resultList );
- return queryresult_create( This->node, queryString, resultList );
+ return queryresult_create( This->node, queryString, This->pDocument, resultList );
}
static HRESULT WINAPI xmlnode_selectSingleNode(
@@ -1117,7 +1139,7 @@ static const struct IUnknownVtbl internal_unk_vtbl =
Internal_Release
};
-IUnknown *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter )
+IUnknown *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter, IXMLDOMDocument *pDoc )
{
xmlnode *This;
@@ -1138,11 +1160,12 @@ IUnknown *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter )
This->ref = 1;
This->node = node;
+ This->pDocument = pDoc;
return (IUnknown*)&This->lpInternalUnkVtbl;
}
-IXMLDOMNode *create_node( xmlNodePtr node )
+IXMLDOMNode *create_node( xmlNodePtr node, IXMLDOMDocument *pDoc )
{
IUnknown *pUnk;
IXMLDOMNode *ret;
@@ -1155,23 +1178,23 @@ IXMLDOMNode *create_node( xmlNodePtr node )
switch(node->type)
{
case XML_ELEMENT_NODE:
- pUnk = create_element( node, NULL );
+ pUnk = create_element( node, NULL, pDoc );
break;
case XML_ATTRIBUTE_NODE:
- pUnk = create_attribute( node );
+ pUnk = create_attribute( node, pDoc );
break;
case XML_TEXT_NODE:
- pUnk = create_text( node );
+ pUnk = create_text( node, pDoc );
break;
case XML_COMMENT_NODE:
- pUnk = create_comment( node );
+ pUnk = create_comment( node, pDoc );
break;
case XML_DOCUMENT_NODE:
ERR("shouldn't be here!\n");
return NULL;
default:
FIXME("only creating basic node for type %d\n", node->type);
- pUnk = create_basic_node( node, NULL );
+ pUnk = create_basic_node( node, NULL, pDoc );
}
hr = IUnknown_QueryInterface(pUnk, &IID_IXMLDOMNode, (LPVOID*)&ret);
diff --git a/dlls/msxml3/nodelist.c b/dlls/msxml3/nodelist.c
index 9b1aa90..c5a4b9f 100644
--- a/dlls/msxml3/nodelist.c
+++ b/dlls/msxml3/nodelist.c
@@ -52,6 +52,7 @@ typedef struct _xmlnodelist
LONG ref;
xmlNodePtr parent;
xmlNodePtr current;
+ IXMLDOMDocument *pDocument;
} xmlnodelist;
static inline xmlnodelist *impl_from_IXMLDOMNodeList( IXMLDOMNodeList *iface )
@@ -176,7 +177,7 @@ static HRESULT WINAPI xmlnodelist_get_item(
}
if(!curr) return S_FALSE;
- *listItem = create_node( curr );
+ *listItem = create_node( curr, This->pDocument );
return S_OK;
}
@@ -217,7 +218,7 @@ static HRESULT WINAPI xmlnodelist_nextNode(
if (!This->current)
return S_FALSE;
- *nextItem = create_node( This->current );
+ *nextItem = create_node( This->current, This->pDocument);
This->current = This->current->next;
return S_OK;
}
@@ -257,7 +258,7 @@ static const struct IXMLDOMNodeListVtbl xmlnodelist_vtbl =
xmlnodelist__newEnum,
};
-IXMLDOMNodeList* create_children_nodelist( xmlNodePtr node )
+IXMLDOMNodeList* create_children_nodelist( xmlNodePtr node, IXMLDOMDocument *pDoc)
{
xmlnodelist *nodelist;
@@ -269,6 +270,7 @@ IXMLDOMNodeList* create_children_nodelist( xmlNodePtr node )
nodelist->ref = 1;
nodelist->parent = node;
nodelist->current = node->children;
+ nodelist->pDocument = pDoc;
xmldoc_add_ref( node->doc );
diff --git a/dlls/msxml3/nodemap.c b/dlls/msxml3/nodemap.c
index 1a7d4dc..e7b119f 100644
--- a/dlls/msxml3/nodemap.c
+++ b/dlls/msxml3/nodemap.c
@@ -45,6 +45,7 @@ typedef struct _xmlnodemap
LONG ref;
IXMLDOMNode *node;
long iterator;
+ IXMLDOMDocument *pDocument;
} xmlnodemap;
static inline xmlnodemap *impl_from_IXMLDOMNamedNodeMap( IXMLDOMNamedNodeMap *iface )
@@ -185,7 +186,7 @@ static HRESULT WINAPI xmlnodemap_getNamedItem(
return S_FALSE;
}
- *namedItem = create_node( (xmlNodePtr) attr );
+ *namedItem = create_node( (xmlNodePtr) attr, This->pDocument );
return S_OK;
}
@@ -227,7 +228,7 @@ static HRESULT WINAPI xmlnodemap_setNamedItem(
nodeNew = xmlAddChild(node, ThisNew->node);
if(namedItem)
- *namedItem = create_node( nodeNew );
+ *namedItem = create_node( nodeNew, This->pDocument);
IUnknown_Release(pAttr);
@@ -273,7 +274,7 @@ static HRESULT WINAPI xmlnodemap_get_item(
curr = curr->next;
}
- *listItem = create_node( (xmlNodePtr) curr );
+ *listItem = create_node( (xmlNodePtr) curr, This->pDocument );
return S_OK;
}
@@ -357,7 +358,7 @@ static HRESULT WINAPI xmlnodemap_nextNode(
This->iterator++;
- *nextItem = create_node( (xmlNodePtr) curr );
+ *nextItem = create_node( (xmlNodePtr) curr, This->pDocument );
return S_OK;
}
@@ -443,7 +444,7 @@ static const struct ISupportErrorInfoVtbl support_error_vtbl =
support_error_InterfaceSupportsErrorInfo
};
-IXMLDOMNamedNodeMap *create_nodemap( IXMLDOMNode *node )
+IXMLDOMNamedNodeMap *create_nodemap( IXMLDOMNode *node, IXMLDOMDocument *pDoc )
{
xmlnodemap *nodemap;
@@ -456,6 +457,7 @@ IXMLDOMNamedNodeMap *create_nodemap( IXMLDOMNode *node )
nodemap->node = node;
nodemap->ref = 1;
nodemap->iterator = 0;
+ nodemap->pDocument = pDoc;
IXMLDOMNode_AddRef( node );
/* Since we AddRef a node here, we don't need to call xmldoc_add_ref() */
diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c
index 054d7f8..55d5138 100644
--- a/dlls/msxml3/pi.c
+++ b/dlls/msxml3/pi.c
@@ -504,7 +504,7 @@ static const struct IXMLDOMProcessingInstructionVtbl dom_pi_vtbl =
dom_pi_put_data
};
-IUnknown* create_pi( xmlNodePtr pi )
+IUnknown* create_pi( xmlNodePtr pi, IXMLDOMDocument *pDoc)
{
dom_pi *This;
HRESULT hr;
@@ -516,7 +516,7 @@ IUnknown* create_pi( xmlNodePtr pi )
This->lpVtbl = &dom_pi_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( pi, (IUnknown*)&This->lpVtbl );
+ This->node_unk = create_basic_node( pi, (IUnknown*)&This->lpVtbl, pDoc );
if(!This->node_unk)
{
HeapFree(GetProcessHeap(), 0, This);
diff --git a/dlls/msxml3/queryresult.c b/dlls/msxml3/queryresult.c
index 85d7aca..14bed21 100644
--- a/dlls/msxml3/queryresult.c
+++ b/dlls/msxml3/queryresult.c
@@ -59,6 +59,7 @@ typedef struct _queryresult
xmlNodePtr node;
xmlXPathObjectPtr result;
int resultPos;
+ IXMLDOMDocument *pDocument;
} queryresult;
static inline queryresult *impl_from_IXMLDOMNodeList( IXMLDOMNodeList *iface )
@@ -66,7 +67,7 @@ static inline queryresult *impl_from_IXMLDOMNodeList( IXMLDOMNodeList *iface )
return (queryresult *)((char*)iface - FIELD_OFFSET(queryresult, lpVtbl));
}
-HRESULT queryresult_create(xmlNodePtr node, LPWSTR szQuery, IXMLDOMNodeList **out)
+HRESULT queryresult_create(xmlNodePtr node, LPWSTR szQuery, IXMLDOMDocument *pDoc, IXMLDOMNodeList **out)
{
queryresult *This = CoTaskMemAlloc(sizeof(queryresult));
xmlXPathContextPtr ctxt = xmlXPathNewContext(node->doc);
@@ -87,6 +88,7 @@ HRESULT queryresult_create(xmlNodePtr node, LPWSTR szQuery, IXMLDOMNodeList **ou
This->ref = 1;
This->resultPos = 0;
This->node = node;
+ This->pDocument = pDoc;
xmldoc_add_ref(This->node->doc);
ctxt->node = node;
@@ -219,7 +221,7 @@ static HRESULT WINAPI queryresult_get_item(
if (index < 0 || index >= This->result->nodesetval->nodeNr)
return S_FALSE;
- *listItem = create_node(This->result->nodesetval->nodeTab[index]);
+ *listItem = create_node(This->result->nodesetval->nodeTab[index], This->pDocument);
This->resultPos = index + 1;
return S_OK;
@@ -250,7 +252,7 @@ static HRESULT WINAPI queryresult_nextNode(
if (This->resultPos >= This->result->nodesetval->nodeNr)
return S_FALSE;
- *nextItem = create_node(This->result->nodesetval->nodeTab[This->resultPos]);
+ *nextItem = create_node(This->result->nodesetval->nodeTab[This->resultPos], This->pDocument);
This->resultPos++;
return S_OK;
}
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 4507d08..2309a14 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -687,10 +687,8 @@ static void test_domnode( void )
{
owner = NULL;
r = IXMLDOMNode_get_ownerDocument( element, &owner );
- todo_wine {
ok( r == S_OK, "get_ownerDocument return code\n");
- }
- ok( owner != doc, "get_ownerDocument return\n");
+ ok( owner == doc, "get_ownerDocument return\n");
type = NODE_INVALID;
r = IXMLDOMNode_get_nodeType( element, &type);
@@ -1870,6 +1868,7 @@ static void test_xmlTypes(void)
{
IXMLDOMDocument *doc = NULL;
IXMLDOMElement *pRoot;
+ IXMLDOMDocument *docOwner = NULL;
HRESULT hr;
IXMLDOMComment *pComment;
IXMLDOMElement *pElement;
@@ -1923,6 +1922,14 @@ static void test_xmlTypes(void)
ok(hr == S_OK, "ret %08x\n", hr );
ok( !lstrcmpW( str, _bstr_("document") ), "incorrect nodeTypeString string\n");
SysFreeString(str);
+
+ /* test ownerDocument */
+ hr = IXMLDOMDocument_get_ownerDocument(doc, NULL);
+ ok(hr == E_INVALIDARG, "ret %08x\n", hr );
+
+ hr = IXMLDOMDocument_get_ownerDocument(doc, &docOwner);
+ ok(hr == S_FALSE, "ret %08x\n", hr );
+ ok(docOwner == NULL, "ownerDocument return a value\n");
/* test implementation */
hr = IXMLDOMDocument_get_implementation(doc, NULL);
@@ -2024,6 +2031,20 @@ static void test_xmlTypes(void)
ok(hr == S_FALSE, "ret %08x\n", hr );
ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n");
VariantClear(&v);
+
+ /* Test ownderDocument */
+ hr = IXMLDOMComment_get_ownerDocument(pComment, &docOwner);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ ok(docOwner == doc, "wrong ownerDocument returned\n");
+ if(hr == S_OK)
+ {
+ str = NULL;
+ hr = IXMLDOMDocument_get_nodeName( docOwner, &str );
+ ok ( hr == S_OK, "get_nodeName wrong code\n");
+ ok ( str != NULL, "str is null\n");
+ ok( !lstrcmpW( str, szDocument ), "incorrect nodeName\n");
+ SysFreeString( str );
+ }
IXMLDOMComment_Release(pComment);
}
@@ -2124,6 +2145,20 @@ static void test_xmlTypes(void)
ok(hr == S_FALSE, "ret %08x\n", hr );
ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n");
VariantClear(&v);
+
+ /* Test ownderDocument */
+ hr = IXMLDOMAttribute_get_ownerDocument(pAttrubute, &docOwner);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ ok(docOwner == doc, "wrong ownerDocument returned\n");
+ if(hr == S_OK)
+ {
+ str = NULL;
+ hr = IXMLDOMDocument_get_nodeName( docOwner, &str );
+ ok ( hr == S_OK, "get_nodeName wrong code\n");
+ ok ( str != NULL, "str is null\n");
+ ok( !lstrcmpW( str, szDocument ), "incorrect nodeName\n");
+ SysFreeString( str );
+ }
IXMLDOMAttribute_Release(pAttrubute);
@@ -2196,6 +2231,20 @@ static void test_xmlTypes(void)
ok(hr == S_OK, "ret %08x\n", hr );
ok( !lstrcmpW( str, _bstr_("cdatasection") ), "incorrect nodeTypeString string\n");
SysFreeString(str);
+
+ /* Test ownderDocument */
+ hr = IXMLDOMCDATASection_get_ownerDocument(pCDataSec, &docOwner);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ ok(docOwner == doc, "wrong ownerDocument returned\n");
+ if(hr == S_OK)
+ {
+ str = NULL;
+ hr = IXMLDOMDocument_get_nodeName( docOwner, &str );
+ ok ( hr == S_OK, "get_nodeName wrong code\n");
+ ok ( str != NULL, "str is null\n");
+ ok( !lstrcmpW( str, szDocument ), "incorrect nodeName\n");
+ SysFreeString( str );
+ }
IXMLDOMCDATASection_Release(pCDataSec);
}
@@ -2259,6 +2308,20 @@ static void test_xmlTypes(void)
ok(hr == S_OK, "ret %08x\n", hr );
ok( !lstrcmpW( str, _bstr_("documentfragment") ), "incorrect nodeTypeString string\n");
SysFreeString(str);
+
+ /* Test ownderDocument */
+ hr = IXMLDOMDocumentFragment_get_ownerDocument(pDocFrag, &docOwner);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ ok(docOwner == doc, "wrong ownerDocument returned\n");
+ if(hr == S_OK)
+ {
+ str = NULL;
+ hr = IXMLDOMDocument_get_nodeName( docOwner, &str );
+ ok ( hr == S_OK, "get_nodeName wrong code\n");
+ ok ( str != NULL, "str is null\n");
+ ok( !lstrcmpW( str, szDocument ), "incorrect nodeName\n");
+ SysFreeString( str );
+ }
IXMLDOMDocumentFragment_Release(pCDataSec);
}
@@ -2300,6 +2363,20 @@ static void test_xmlTypes(void)
ok(hr == S_OK, "ret %08x\n", hr );
todo_wine ok( !lstrcmpW( str, szEntityRefXML ), "incorrect xml string\n");
SysFreeString(str);
+
+ /* Test ownderDocument */
+ hr = IXMLDOMEntityReference_get_ownerDocument(pEntityRef, &docOwner);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ ok(docOwner == doc, "wrong ownerDocument returned\n");
+ if(hr == S_OK)
+ {
+ str = NULL;
+ hr = IXMLDOMDocument_get_nodeName( docOwner, &str );
+ ok ( hr == S_OK, "get_nodeName wrong code\n");
+ ok ( str != NULL, "str is null\n");
+ ok( !lstrcmpW( str, szDocument ), "incorrect nodeName\n");
+ SysFreeString( str );
+ }
IXMLDOMEntityReference_Release(pEntityRef);
}
diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index 0d402a4..611e8b4 100644
--- a/dlls/msxml3/text.c
+++ b/dlls/msxml3/text.c
@@ -559,7 +559,7 @@ static const struct IXMLDOMTextVtbl domtext_vtbl =
domtext_splitText
};
-IUnknown* create_text( xmlNodePtr text )
+IUnknown* create_text( xmlNodePtr text, IXMLDOMDocument *pDoc )
{
domtext *This;
HRESULT hr;
@@ -571,7 +571,7 @@ IUnknown* create_text( xmlNodePtr text )
This->lpVtbl = &domtext_vtbl;
This->ref = 1;
- This->element_unk = create_element( text, (IUnknown*)&This->lpVtbl );
+ This->element_unk = create_element( text, (IUnknown*)&This->lpVtbl, pDoc );
if(!This->element_unk)
{
HeapFree(GetProcessHeap(), 0, This);
--
1.5.3.7
--------------090902080704010002030303--
More information about the wine-patches
mailing list