From 3d0c66277a0776700c766bc2bd8350a9e477d4fe Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Sat, 5 Nov 2005 10:42:45 +0000 Subject: [PATCH] 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. --- dlls/msxml3/node.c | 17 ++++++++++++++++- dlls/msxml3/nodelist.c | 29 +++++++++++++++++------------ dlls/msxml3/tests/domdoc.c | 22 +++++++++++++--------- 3 files changed, 46 insertions(+), 22 deletions(-) diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index c957d4eb105..e781bd60574 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -319,7 +319,22 @@ static HRESULT WINAPI xmlnode_get_childNodes( if ( !childList ) 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) return S_FALSE; return S_OK; diff --git a/dlls/msxml3/nodelist.c b/dlls/msxml3/nodelist.c index 7630f05126d..fd4b8e3dad8 100644 --- a/dlls/msxml3/nodelist.c +++ b/dlls/msxml3/nodelist.c @@ -254,6 +254,7 @@ static HRESULT WINAPI xmlnodelist_get_item( xmlnodelist *This = impl_from_IXMLDOMNodeList( iface ); xmlNodePtr curr; long nodeIndex = 0; + HRESULT r; TRACE("%p %ld\n", This, index); @@ -263,14 +264,16 @@ static HRESULT WINAPI xmlnodelist_get_item( return S_FALSE; curr = This->node; - - for (nodeIndex = 0; nodeIndex < index; nodeIndex++) { - if (curr->next == NULL) - return S_FALSE; - else - curr = curr->next; + + while(curr) + { + r = xslt_next_match( &This->xinfo, &curr ); + if(FAILED(r) || !curr) return S_FALSE; + if(nodeIndex++ == index) break; + curr = curr->next; } - + if(!curr) return S_FALSE; + *listItem = create_node( curr ); return S_OK; @@ -283,6 +286,7 @@ static HRESULT WINAPI xmlnodelist_get_length( xmlNodePtr curr; long nodeCount = 0; + HRESULT r; xmlnodelist *This = impl_from_IXMLDOMNodeList( iface ); @@ -293,13 +297,14 @@ static HRESULT WINAPI xmlnodelist_get_length( return S_OK; } - curr = This->node; - nodeCount = 1; - while (curr->next != NULL) { + for(curr = This->node; curr; curr = curr->next) + { + r = xslt_next_match( &This->xinfo, &curr ); + if(FAILED(r) || !curr) break; nodeCount++; - curr = curr->next; } - *listLength = nodeCount; + + *listLength = nodeCount; return S_OK; } diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 71919de6502..c00bcce052d 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -50,15 +50,15 @@ static const WCHAR szComplete3[] = { '<','a','>','<','/','a','>','\n',0 }; static const WCHAR szComplete4[] = { - '<','?','x','m','l',' ', - 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>', - '<','l','c',' ','d','l','=','\'','s','t','r','1','\'','>', - '<','b','s',' ','v','r','=','\'','s','t','r','2','\'',' ', - 's','z','=','\'','1','2','3','4','\'','>','f','n','1','.','t','x','t','<','/','b','s','>', - '<','p','r',' ','i','d','=','\'','s','t','r','3','\'',' ', - 'v','r','=','\'','1','.','2','.','3','\'',' ', - 'p','n','=','\'','w','i','n','e',' ','2','0','0','5','0','8','0','4','\'','>', - 'f','n','2','.','t','x','t','<','/','p','r','>', + '<','?','x','m','l',' ','v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n', + '<','l','c',' ','d','l','=','\'','s','t','r','1','\'','>','\n', + '<','b','s',' ','v','r','=','\'','s','t','r','2','\'',' ','s','z','=','\'','1','2','3','4','\'','>', + 'f','n','1','.','t','x','t','\n', + '<','/','b','s','>','\n', + '<','p','r',' ','i','d','=','\'','s','t','r','3','\'',' ','v','r','=','\'','1','.','2','.','3','\'',' ', + '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', '<','/','l','c','>','\n',0 }; static const WCHAR szNonExistentFile[] = { @@ -439,6 +439,10 @@ void test_domnode( void ) 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 ); ok( r == S_OK, "nextNode returned wrong code\n"); }