Huw Davies : msxml3: Fix for empty node lists.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Feb 24 04:47:59 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 4eb389bbdf479ed762ab76015f5b0a5bdcd6f7f5
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=4eb389bbdf479ed762ab76015f5b0a5bdcd6f7f5

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Feb 23 14:10:06 2006 +0000

msxml3: Fix for empty node lists.

---

 dlls/msxml3/nodelist.c     |    9 +++----
 dlls/msxml3/tests/domdoc.c |   58 ++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 60 insertions(+), 7 deletions(-)

diff --git a/dlls/msxml3/nodelist.c b/dlls/msxml3/nodelist.c
index 407c5f7..7543b75 100644
--- a/dlls/msxml3/nodelist.c
+++ b/dlls/msxml3/nodelist.c
@@ -61,6 +61,8 @@ static void xslt_info_init( struct xslt_
 
 static int create_xslt_parser( struct xslt_info *info, xmlNodePtr node, const xmlChar *str )
 {
+    if(!node) return 1;
+
     info->sheet = xsltNewStylesheet();
     if (!info->sheet)
         return 0;
@@ -220,7 +222,7 @@ static ULONG WINAPI xmlnodelist_Release(
     if ( ref == 0 )
     {
         free_xslt_info( &This->xinfo );
-        xmldoc_release( This->node->doc );
+        if(This->node) xmldoc_release( This->node->doc );
         HeapFree( GetProcessHeap(), 0, This );
     }
 
@@ -424,7 +426,7 @@ static xmlnodelist *new_nodelist( xmlNod
     nodelist->enum_children = FALSE;
     xslt_info_init( &nodelist->xinfo );
 
-    xmldoc_add_ref( node->doc );
+    if(node) xmldoc_add_ref( node->doc );
 
     return nodelist;
 }
@@ -432,15 +434,12 @@ static xmlnodelist *new_nodelist( xmlNod
 IXMLDOMNodeList* create_nodelist( xmlNodePtr node )
 {
     xmlnodelist *nodelist = new_nodelist( node );
-    if (!node)
-        return NULL;
     return (IXMLDOMNodeList*) &nodelist->lpVtbl;
 }
 
 IXMLDOMNodeList* create_filtered_nodelist( xmlNodePtr node, const xmlChar *str, BOOL enum_children )
 {
     xmlnodelist *This = new_nodelist( node );
-
     if (create_xslt_parser( &This->xinfo, node, str ))
     {
         This->enum_children = enum_children;
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 1b5eb23..6de17e2 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -58,6 +58,7 @@ static const WCHAR szComplete4[] = {
                     'p','n','=','\'','w','i','n','e',' ','2','0','0','5','0','8','0','4','\'','>','\n',
             'f','n','2','.','t','x','t','\n',
         '<','/','p','r','>','\n',
+        '<','e','m','p','t','y','>','<','/','e','m','p','t','y','>','\n',
     '<','/','l','c','>','\n',0
 };
 static const WCHAR szNonExistentFile[] = {
@@ -494,7 +495,7 @@ todo_wine
     {
         r = IXMLDOMNodeList_get_length( list, &count );
         ok( r == S_OK, "get_length returns %08lx\n", r );
-        ok( count == 2, "get_length got %ld\n", count );
+        ok( count == 3, "get_length got %ld\n", count );
 
         r = IXMLDOMNodeList_nextNode( list, &node );
         ok( r == S_OK, "nextNode returned wrong code\n");
@@ -803,7 +804,7 @@ static void test_getElementsByTagName(vo
     ok( r == S_OK, "ret %08lx\n", r );
     r = IXMLDOMNodeList_get_length( node_list, &len );
     ok( r == S_OK, "ret %08lx\n", r );
-    ok( len == 3, "len %ld\n", len );
+    ok( len == 4, "len %ld\n", len );
     IXMLDOMNodeList_Release( node_list );
     SysFreeString( str );
 
@@ -904,6 +905,58 @@ todo_wine {
     IXMLDOMDocument_Release( doc );
 }
 
+static void test_get_childNodes(void)
+{
+    HRESULT r;
+    BSTR str;
+    VARIANT_BOOL b;
+    IXMLDOMDocument *doc;
+    IXMLDOMElement *element;
+    IXMLDOMNode *node, *node2;
+    IXMLDOMNodeList *node_list, *node_list2;
+    long len;
+
+    r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
+        CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
+    if( r != S_OK )
+        return;
+
+    str = SysAllocString( szComplete4 );
+    r = IXMLDOMDocument_loadXML( doc, str, &b );
+    ok( r == S_OK, "loadXML failed\n");
+    ok( b == VARIANT_TRUE, "failed to load XML string\n");
+    SysFreeString( str );
+
+    r = IXMLDOMDocument_get_documentElement( doc, &element );
+    ok( r == S_OK, "ret %08lx\n", r);
+
+    r = IXMLDOMElement_get_childNodes( element, &node_list );
+    ok( r == S_OK, "ret %08lx\n", r);
+
+    r = IXMLDOMNodeList_get_length( node_list, &len );
+    ok( r == S_OK, "ret %08lx\n", r);
+    ok( len == 3, "len %ld\n", len);
+
+    r = IXMLDOMNodeList_get_item( node_list, 2, &node );
+    ok( r == S_OK, "ret %08lx\n", r);
+
+    r = IXMLDOMNode_get_childNodes( node, &node_list2 );
+    ok( r == S_OK, "ret %08lx\n", r);
+
+    r = IXMLDOMNodeList_get_length( node_list2, &len );
+    ok( r == S_OK, "ret %08lx\n", r);
+    ok( len == 0, "len %ld\n", len);
+
+    r = IXMLDOMNodeList_get_item( node_list2, 0, &node2);
+    ok( r == S_FALSE, "ret %08lx\n", r);
+
+    IXMLDOMNodeList_Release( node_list2 );
+    IXMLDOMNode_Release( node );
+    IXMLDOMNodeList_Release( node_list );
+    IXMLDOMElement_Release( element );
+    IXMLDOMDocument_Release( doc );
+}
+    
 START_TEST(domdoc)
 {
     HRESULT r;
@@ -917,6 +970,7 @@ START_TEST(domdoc)
     test_create();
     test_getElementsByTagName();
     test_get_text();
+    test_get_childNodes();
 
     CoUninitialize();
 }




More information about the wine-cvs mailing list