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