Commit 3d0c6627 authored by Huw Davies's avatar Huw Davies Committed by Alexandre Julliard

Filter out CTEXT nodes when building element child lists.

get_item and get_length should honour the filter. Add some '\n's to the tests so that libxml2 lists CTEXT nodes.
parent cd1b13fb
...@@ -319,7 +319,22 @@ static HRESULT WINAPI xmlnode_get_childNodes( ...@@ -319,7 +319,22 @@ static HRESULT WINAPI xmlnode_get_childNodes(
if ( !childList ) if ( !childList )
return E_INVALIDARG; return E_INVALIDARG;
*childList = create_nodelist( This->node->children );
switch(This->node->type)
{
case XML_ELEMENT_NODE:
*childList = create_filtered_nodelist( This->node->children, (const xmlChar *)"*" );
break;
case XML_ATTRIBUTE_NODE:
*childList = create_filtered_nodelist( This->node->children, (const xmlChar *)"node()" );
break;
default:
FIXME("unhandled node type %d\n", This->node->type);
break;
}
if (!*childList) if (!*childList)
return S_FALSE; return S_FALSE;
return S_OK; return S_OK;
......
...@@ -254,6 +254,7 @@ static HRESULT WINAPI xmlnodelist_get_item( ...@@ -254,6 +254,7 @@ static HRESULT WINAPI xmlnodelist_get_item(
xmlnodelist *This = impl_from_IXMLDOMNodeList( iface ); xmlnodelist *This = impl_from_IXMLDOMNodeList( iface );
xmlNodePtr curr; xmlNodePtr curr;
long nodeIndex = 0; long nodeIndex = 0;
HRESULT r;
TRACE("%p %ld\n", This, index); TRACE("%p %ld\n", This, index);
...@@ -263,14 +264,16 @@ static HRESULT WINAPI xmlnodelist_get_item( ...@@ -263,14 +264,16 @@ static HRESULT WINAPI xmlnodelist_get_item(
return S_FALSE; return S_FALSE;
curr = This->node; curr = This->node;
for (nodeIndex = 0; nodeIndex < index; nodeIndex++) { while(curr)
if (curr->next == NULL) {
return S_FALSE; r = xslt_next_match( &This->xinfo, &curr );
else if(FAILED(r) || !curr) return S_FALSE;
curr = curr->next; if(nodeIndex++ == index) break;
curr = curr->next;
} }
if(!curr) return S_FALSE;
*listItem = create_node( curr ); *listItem = create_node( curr );
return S_OK; return S_OK;
...@@ -283,6 +286,7 @@ static HRESULT WINAPI xmlnodelist_get_length( ...@@ -283,6 +286,7 @@ static HRESULT WINAPI xmlnodelist_get_length(
xmlNodePtr curr; xmlNodePtr curr;
long nodeCount = 0; long nodeCount = 0;
HRESULT r;
xmlnodelist *This = impl_from_IXMLDOMNodeList( iface ); xmlnodelist *This = impl_from_IXMLDOMNodeList( iface );
...@@ -293,13 +297,14 @@ static HRESULT WINAPI xmlnodelist_get_length( ...@@ -293,13 +297,14 @@ static HRESULT WINAPI xmlnodelist_get_length(
return S_OK; return S_OK;
} }
curr = This->node; for(curr = This->node; curr; curr = curr->next)
nodeCount = 1; {
while (curr->next != NULL) { r = xslt_next_match( &This->xinfo, &curr );
if(FAILED(r) || !curr) break;
nodeCount++; nodeCount++;
curr = curr->next;
} }
*listLength = nodeCount;
*listLength = nodeCount;
return S_OK; return S_OK;
} }
......
...@@ -50,15 +50,15 @@ static const WCHAR szComplete3[] = { ...@@ -50,15 +50,15 @@ static const WCHAR szComplete3[] = {
'<','a','>','<','/','a','>','\n',0 '<','a','>','<','/','a','>','\n',0
}; };
static const WCHAR szComplete4[] = { static const WCHAR szComplete4[] = {
'<','?','x','m','l',' ', '<','?','x','m','l',' ','v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>', '<','l','c',' ','d','l','=','\'','s','t','r','1','\'','>','\n',
'<','l','c',' ','d','l','=','\'','s','t','r','1','\'','>', '<','b','s',' ','v','r','=','\'','s','t','r','2','\'',' ','s','z','=','\'','1','2','3','4','\'','>',
'<','b','s',' ','v','r','=','\'','s','t','r','2','\'',' ', 'f','n','1','.','t','x','t','\n',
's','z','=','\'','1','2','3','4','\'','>','f','n','1','.','t','x','t','<','/','b','s','>', '<','/','b','s','>','\n',
'<','p','r',' ','i','d','=','\'','s','t','r','3','\'',' ', '<','p','r',' ','i','d','=','\'','s','t','r','3','\'',' ','v','r','=','\'','1','.','2','.','3','\'',' ',
'v','r','=','\'','1','.','2','.','3','\'',' ', 'p','n','=','\'','w','i','n','e',' ','2','0','0','5','0','8','0','4','\'','>','\n',
'p','n','=','\'','w','i','n','e',' ','2','0','0','5','0','8','0','4','\'','>', 'f','n','2','.','t','x','t','\n',
'f','n','2','.','t','x','t','<','/','p','r','>', '<','/','p','r','>','\n',
'<','/','l','c','>','\n',0 '<','/','l','c','>','\n',0
}; };
static const WCHAR szNonExistentFile[] = { static const WCHAR szNonExistentFile[] = {
...@@ -439,6 +439,10 @@ void test_domnode( void ) ...@@ -439,6 +439,10 @@ void test_domnode( void )
if (list) if (list)
{ {
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 );
r = IXMLDOMNodeList_nextNode( list, &node ); r = IXMLDOMNodeList_nextNode( list, &node );
ok( r == S_OK, "nextNode returned wrong code\n"); ok( r == S_OK, "nextNode returned wrong code\n");
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment