Nikolay Sivov : msxml3: Implement empty tagname case of getElementsByTagName() for document.
Alexandre Julliard
julliard at winehq.org
Tue May 13 14:23:46 CDT 2014
Module: wine
Branch: master
Commit: 82bb4f51c160fe0aabe25765478757481ee5ed81
URL: http://source.winehq.org/git/wine.git/?a=commit;h=82bb4f51c160fe0aabe25765478757481ee5ed81
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue May 13 12:49:05 2014 +0400
msxml3: Implement empty tagname case of getElementsByTagName() for document.
---
dlls/msxml3/domdoc.c | 6 +++++
dlls/msxml3/tests/domdoc.c | 63 ++++++++++++++++++++------------------------
2 files changed, 34 insertions(+), 35 deletions(-)
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index e981b94..2244172 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1846,12 +1846,18 @@ static HRESULT WINAPI domdoc_createEntityReference(
xmlChar* tagName_to_XPath(const BSTR tagName)
{
xmlChar *query, *tmp;
+ static const xmlChar everything[] = "/descendant::node()";
static const xmlChar mod_pre[] = "*[local-name()='";
static const xmlChar mod_post[] = "']";
static const xmlChar prefix[] = "descendant::";
const WCHAR *tokBegin, *tokEnd;
int len;
+ /* Special case - empty tagname - means select all nodes,
+ except document itself. */
+ if (!*tagName)
+ return xmlStrdup(everything);
+
query = xmlStrdup(prefix);
tokBegin = tagName;
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index b028996..2b877a7 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -3013,8 +3013,24 @@ static void test_create(void)
IXMLDOMDocument_Release( doc );
}
+struct queryresult_t {
+ const char *query;
+ const char *result;
+ int len;
+};
+
+static const struct queryresult_t elementsbytagname[] = {
+ { "", "P1.D1 E2.D1 E1.E2.D1 T1.E1.E2.D1 E2.E2.D1 T1.E2.E2.D1 E3.E2.D1 E4.E2.D1 E1.E4.E2.D1 T1.E1.E4.E2.D1", 10 },
+ { "*", "E2.D1 E1.E2.D1 E2.E2.D1 E3.E2.D1 E4.E2.D1 E1.E4.E2.D1", 6 },
+ { "bs", "E1.E2.D1", 1 },
+ { "dl", "", 0 },
+ { "str1","", 0 },
+ { NULL }
+};
+
static void test_getElementsByTagName(void)
{
+ const struct queryresult_t *ptr = elementsbytagname;
IXMLDOMNodeList *node_list;
IXMLDOMDocument *doc;
IXMLDOMElement *elem;
@@ -3035,17 +3051,21 @@ static void test_getElementsByTagName(void)
/* null arguments cases */
r = IXMLDOMDocument_getElementsByTagName(doc, NULL, &node_list);
ok( r == E_INVALIDARG, "ret %08x\n", r );
- r = IXMLDOMDocument_getElementsByTagName(doc, str, NULL);
+ r = IXMLDOMDocument_getElementsByTagName(doc, _bstr_("*"), NULL);
ok( r == E_INVALIDARG, "ret %08x\n", r );
- r = IXMLDOMDocument_getElementsByTagName(doc, str, &node_list);
- ok( r == S_OK, "ret %08x\n", r );
- r = IXMLDOMNodeList_get_length( node_list, &len );
- ok( r == S_OK, "ret %08x\n", r );
- ok( len == 6, "len %d\n", len );
+ while (ptr->query)
+ {
+ r = IXMLDOMDocument_getElementsByTagName(doc, _bstr_(ptr->query), &node_list);
+ ok(r == S_OK, "ret %08x\n", r);
+ r = IXMLDOMNodeList_get_length(node_list, &len);
+ ok(r == S_OK, "ret %08x\n", r);
+ ok(len == ptr->len, "%s: got len %d, expected %d\n", ptr->query, len, ptr->len);
+ expect_list_and_release(node_list, ptr->result);
- IXMLDOMNodeList_Release( node_list );
- SysFreeString( str );
+ free_bstrs();
+ ptr++;
+ }
/* broken query BSTR */
memcpy(&buff[2], szstar, sizeof(szstar));
@@ -3058,33 +3078,6 @@ static void test_getElementsByTagName(void)
ok( len == 6, "len %d\n", len );
IXMLDOMNodeList_Release( node_list );
- str = SysAllocString( szbs );
- r = IXMLDOMDocument_getElementsByTagName(doc, str, &node_list);
- ok( r == S_OK, "ret %08x\n", r );
- r = IXMLDOMNodeList_get_length( node_list, &len );
- ok( r == S_OK, "ret %08x\n", r );
- ok( len == 1, "len %d\n", len );
- IXMLDOMNodeList_Release( node_list );
- SysFreeString( str );
-
- str = SysAllocString( szdl );
- r = IXMLDOMDocument_getElementsByTagName(doc, str, &node_list);
- ok( r == S_OK, "ret %08x\n", r );
- r = IXMLDOMNodeList_get_length( node_list, &len );
- ok( r == S_OK, "ret %08x\n", r );
- ok( len == 0, "len %d\n", len );
- IXMLDOMNodeList_Release( node_list );
- SysFreeString( str );
-
- str = SysAllocString( szstr1 );
- r = IXMLDOMDocument_getElementsByTagName(doc, str, &node_list);
- ok( r == S_OK, "ret %08x\n", r );
- r = IXMLDOMNodeList_get_length( node_list, &len );
- ok( r == S_OK, "ret %08x\n", r );
- ok( len == 0, "len %d\n", len );
- IXMLDOMNodeList_Release( node_list );
- SysFreeString( str );
-
/* test for element */
r = IXMLDOMDocument_get_documentElement(doc, &elem);
ok( r == S_OK, "ret %08x\n", r );
More information about the wine-cvs
mailing list