[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