msxml3: Properly handle qualified names in getAttributeNode().
This commit is contained in:
parent
6d4c1931f9
commit
f87aee778d
|
@ -1171,40 +1171,61 @@ static HRESULT WINAPI domelem_getAttributeNode(
|
||||||
BSTR p, IXMLDOMAttribute** attributeNode )
|
BSTR p, IXMLDOMAttribute** attributeNode )
|
||||||
{
|
{
|
||||||
domelem *This = impl_from_IXMLDOMElement( iface );
|
domelem *This = impl_from_IXMLDOMElement( iface );
|
||||||
xmlChar *xml_name;
|
xmlChar *local, *prefix, *nameA;
|
||||||
|
HRESULT hr = S_FALSE;
|
||||||
xmlNodePtr element;
|
xmlNodePtr element;
|
||||||
xmlAttrPtr attr;
|
xmlAttrPtr attr;
|
||||||
IUnknown *unk;
|
|
||||||
HRESULT hr = S_FALSE;
|
|
||||||
|
|
||||||
TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), attributeNode);
|
TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), attributeNode);
|
||||||
|
|
||||||
if(!attributeNode)
|
element = get_element( This );
|
||||||
|
if (!element) return E_FAIL;
|
||||||
|
|
||||||
|
if (attributeNode) *attributeNode = NULL;
|
||||||
|
|
||||||
|
nameA = xmlchar_from_wchar(p);
|
||||||
|
if (!xmlValidateNameValue(nameA))
|
||||||
|
{
|
||||||
|
heap_free(nameA);
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!attributeNode)
|
||||||
|
{
|
||||||
|
heap_free(nameA);
|
||||||
|
return S_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
*attributeNode = NULL;
|
*attributeNode = NULL;
|
||||||
|
|
||||||
element = get_element( This );
|
local = xmlSplitQName2(nameA, &prefix);
|
||||||
if ( !element )
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
xml_name = xmlchar_from_wchar(p);
|
if (local)
|
||||||
|
|
||||||
if(!xmlValidateNameValue(xml_name))
|
|
||||||
{
|
{
|
||||||
heap_free(xml_name);
|
/* try to get namespace for supplied qualified name */
|
||||||
return E_FAIL;
|
xmlNsPtr ns = xmlSearchNs(element->doc, element, prefix);
|
||||||
|
xmlFree(prefix);
|
||||||
|
|
||||||
|
attr = xmlHasNsProp(element, local, ns ? ns->href : NULL);
|
||||||
|
xmlFree(local);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
attr = xmlHasProp(element, nameA);
|
||||||
|
/* attribute has attached namespace and we requested non-qualified
|
||||||
|
name - it's a failure case */
|
||||||
|
if (attr && attr->ns) attr = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
attr = xmlHasProp(element, xml_name);
|
heap_free(nameA);
|
||||||
if(attr) {
|
|
||||||
unk = create_attribute((xmlNodePtr)attr);
|
if (attr)
|
||||||
|
{
|
||||||
|
IUnknown *unk = create_attribute((xmlNodePtr)attr);
|
||||||
hr = IUnknown_QueryInterface(unk, &IID_IXMLDOMAttribute, (void**)attributeNode);
|
hr = IUnknown_QueryInterface(unk, &IID_IXMLDOMAttribute, (void**)attributeNode);
|
||||||
IUnknown_Release(unk);
|
IUnknown_Release(unk);
|
||||||
}
|
}
|
||||||
|
|
||||||
heap_free(xml_name);
|
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1393,9 +1393,9 @@ static const CHAR szNonUnicodeXML[] =
|
||||||
"<?xml version='1.0' encoding='Windows-1252'?>\n"
|
"<?xml version='1.0' encoding='Windows-1252'?>\n"
|
||||||
"<open></open>\n";
|
"<open></open>\n";
|
||||||
|
|
||||||
static const CHAR szExampleXML[] =
|
static const char szExampleXML[] =
|
||||||
"<?xml version='1.0' encoding='utf-8'?>\n"
|
"<?xml version='1.0' encoding='utf-8'?>\n"
|
||||||
"<root xmlns:foo='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'>\n"
|
"<root xmlns:foo='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' a=\"attr a\" foo:b=\"attr b\" >\n"
|
||||||
" <elem>\n"
|
" <elem>\n"
|
||||||
" <a>A1 field</a>\n"
|
" <a>A1 field</a>\n"
|
||||||
" <b>B1 field</b>\n"
|
" <b>B1 field</b>\n"
|
||||||
|
@ -1752,10 +1752,10 @@ static const char default_ns_doc[] = {
|
||||||
" d=\"d attr\" />"
|
" d=\"d attr\" />"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const WCHAR szNonExistentFile[] = {
|
static const WCHAR nonexistent_fileW[] = {
|
||||||
'c', ':', '\\', 'N', 'o', 'n', 'e', 'x', 'i', 's', 't', 'e', 'n', 't', '.', 'x', 'm', 'l', 0
|
'c', ':', '\\', 'N', 'o', 'n', 'e', 'x', 'i', 's', 't', 'e', 'n', 't', '.', 'x', 'm', 'l', 0
|
||||||
};
|
};
|
||||||
static const WCHAR szNonExistentAttribute[] = {
|
static const WCHAR nonexistent_attrW[] = {
|
||||||
'n','o','n','E','x','i','s','i','t','i','n','g','A','t','t','r','i','b','u','t','e',0
|
'n','o','n','E','x','i','s','i','t','i','n','g','A','t','t','r','i','b','u','t','e',0
|
||||||
};
|
};
|
||||||
static const WCHAR szDocument[] = {
|
static const WCHAR szDocument[] = {
|
||||||
|
@ -2066,7 +2066,7 @@ if (0)
|
||||||
|
|
||||||
/* try to load a document from a nonexistent file */
|
/* try to load a document from a nonexistent file */
|
||||||
b = VARIANT_TRUE;
|
b = VARIANT_TRUE;
|
||||||
str = SysAllocString( szNonExistentFile );
|
str = SysAllocString( nonexistent_fileW );
|
||||||
VariantInit(&var);
|
VariantInit(&var);
|
||||||
V_VT(&var) = VT_BSTR;
|
V_VT(&var) = VT_BSTR;
|
||||||
V_BSTR(&var) = str;
|
V_BSTR(&var) = str;
|
||||||
|
@ -2776,7 +2776,7 @@ static void test_domnode( void )
|
||||||
ok( !lstrcmpW( str, szlc ), "incorrect nodeName\n");
|
ok( !lstrcmpW( str, szlc ), "incorrect nodeName\n");
|
||||||
SysFreeString( str );
|
SysFreeString( str );
|
||||||
|
|
||||||
str = SysAllocString( szNonExistentFile );
|
str = SysAllocString( nonexistent_fileW );
|
||||||
V_VT(&var) = VT_I4;
|
V_VT(&var) = VT_I4;
|
||||||
V_I4(&var) = 0x1234;
|
V_I4(&var) = 0x1234;
|
||||||
r = IXMLDOMElement_getAttribute( element, str, &var );
|
r = IXMLDOMElement_getAttribute( element, str, &var );
|
||||||
|
@ -2784,22 +2784,6 @@ static void test_domnode( void )
|
||||||
ok( V_VT(&var) == VT_NULL || V_VT(&var) == VT_EMPTY, "vt = %x\n", V_VT(&var));
|
ok( V_VT(&var) == VT_NULL || V_VT(&var) == VT_EMPTY, "vt = %x\n", V_VT(&var));
|
||||||
VariantClear(&var);
|
VariantClear(&var);
|
||||||
|
|
||||||
r = IXMLDOMElement_getAttributeNode( element, str, NULL);
|
|
||||||
ok( r == E_FAIL, "getAttributeNode ret %08x\n", r );
|
|
||||||
|
|
||||||
attr = (IXMLDOMAttribute*)0xdeadbeef;
|
|
||||||
r = IXMLDOMElement_getAttributeNode( element, str, &attr);
|
|
||||||
ok( r == E_FAIL, "getAttributeNode ret %08x\n", r );
|
|
||||||
ok( attr == NULL, "getAttributeNode ret %p, expected NULL\n", attr );
|
|
||||||
SysFreeString( str );
|
|
||||||
|
|
||||||
attr = (IXMLDOMAttribute*)0xdeadbeef;
|
|
||||||
str = SysAllocString( szNonExistentAttribute );
|
|
||||||
r = IXMLDOMElement_getAttributeNode( element, str, &attr);
|
|
||||||
ok( r == S_FALSE, "getAttributeNode ret %08x\n", r );
|
|
||||||
ok( attr == NULL, "getAttributeNode ret %p, expected NULL\n", attr );
|
|
||||||
SysFreeString( str );
|
|
||||||
|
|
||||||
str = SysAllocString( szdl );
|
str = SysAllocString( szdl );
|
||||||
V_VT(&var) = VT_I4;
|
V_VT(&var) = VT_I4;
|
||||||
V_I4(&var) = 0x1234;
|
V_I4(&var) = 0x1234;
|
||||||
|
@ -10662,6 +10646,59 @@ static void test_parseerror(void)
|
||||||
IXMLDOMDocument_Release(doc);
|
IXMLDOMDocument_Release(doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_getAttributeNode(void)
|
||||||
|
{
|
||||||
|
IXMLDOMAttribute *attr;
|
||||||
|
IXMLDOMDocument *doc;
|
||||||
|
IXMLDOMElement *elem;
|
||||||
|
VARIANT_BOOL v;
|
||||||
|
HRESULT hr;
|
||||||
|
BSTR str;
|
||||||
|
|
||||||
|
doc = create_document(&IID_IXMLDOMDocument);
|
||||||
|
|
||||||
|
hr = IXMLDOMDocument_loadXML(doc, _bstr_(szExampleXML), &v);
|
||||||
|
EXPECT_HR(hr, S_OK);
|
||||||
|
|
||||||
|
hr = IXMLDOMDocument_get_documentElement(doc, &elem);
|
||||||
|
EXPECT_HR(hr, S_OK);
|
||||||
|
|
||||||
|
str = SysAllocString(nonexistent_fileW);
|
||||||
|
hr = IXMLDOMElement_getAttributeNode(elem, str, NULL);
|
||||||
|
EXPECT_HR(hr, E_FAIL);
|
||||||
|
|
||||||
|
attr = (IXMLDOMAttribute*)0xdeadbeef;
|
||||||
|
hr = IXMLDOMElement_getAttributeNode(elem, str, &attr);
|
||||||
|
EXPECT_HR(hr, E_FAIL);
|
||||||
|
ok(attr == NULL, "got %p\n", attr);
|
||||||
|
SysFreeString(str);
|
||||||
|
|
||||||
|
str = SysAllocString(nonexistent_attrW);
|
||||||
|
hr = IXMLDOMElement_getAttributeNode(elem, str, NULL);
|
||||||
|
EXPECT_HR(hr, S_FALSE);
|
||||||
|
|
||||||
|
attr = (IXMLDOMAttribute*)0xdeadbeef;
|
||||||
|
hr = IXMLDOMElement_getAttributeNode(elem, str, &attr);
|
||||||
|
EXPECT_HR(hr, S_FALSE);
|
||||||
|
ok(attr == NULL, "got %p\n", attr);
|
||||||
|
SysFreeString(str);
|
||||||
|
|
||||||
|
hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("foo:b"), &attr);
|
||||||
|
EXPECT_HR(hr, S_OK);
|
||||||
|
IXMLDOMAttribute_Release(attr);
|
||||||
|
|
||||||
|
hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("b"), &attr);
|
||||||
|
EXPECT_HR(hr, S_FALSE);
|
||||||
|
|
||||||
|
hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("a"), &attr);
|
||||||
|
EXPECT_HR(hr, S_OK);
|
||||||
|
IXMLDOMAttribute_Release(attr);
|
||||||
|
|
||||||
|
IXMLDOMElement_Release(elem);
|
||||||
|
IXMLDOMDocument_Release(doc);
|
||||||
|
free_bstrs();
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(domdoc)
|
START_TEST(domdoc)
|
||||||
{
|
{
|
||||||
IXMLDOMDocument *doc;
|
IXMLDOMDocument *doc;
|
||||||
|
@ -10735,6 +10772,7 @@ START_TEST(domdoc)
|
||||||
test_load();
|
test_load();
|
||||||
test_dispex();
|
test_dispex();
|
||||||
test_parseerror();
|
test_parseerror();
|
||||||
|
test_getAttributeNode();
|
||||||
|
|
||||||
test_xsltemplate();
|
test_xsltemplate();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue