msxml3: Implement IXMLDOMNamedNodeMap::getNamedItem() for a processing instruction node.

Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Dmitry Timoshkov 2021-05-28 13:38:37 +03:00 committed by Alexandre Julliard
parent 769aac0021
commit a39df8bb61
2 changed files with 42 additions and 8 deletions

View File

@ -817,6 +817,27 @@ static const struct IXMLDOMProcessingInstructionVtbl dom_pi_vtbl =
dom_pi_put_data
};
static xmlAttrPtr node_has_prop(const xmlNode *node, const xmlChar *name)
{
xmlAttrPtr prop;
/* xmlHasNsProp accepts only nodes of type XML_ELEMENT_NODE,
* so we have to look for an attribute in the node by hand.
*/
prop = node->properties;
while (prop)
{
if (xmlStrEqual(prop->name, name))
return prop;
prop = prop->next;
}
return NULL;
}
static HRESULT dom_pi_get_qualified_item(const xmlNodePtr node, BSTR name, BSTR uri,
IXMLDOMNode **item)
{
@ -826,10 +847,28 @@ static HRESULT dom_pi_get_qualified_item(const xmlNodePtr node, BSTR name, BSTR
static HRESULT dom_pi_get_named_item(const xmlNodePtr node, BSTR name, IXMLDOMNode **item)
{
FIXME("(%p)->(%s %p): stub\n", node, debugstr_w(name), item );
if (item)
xmlChar *nameA;
xmlAttrPtr attr;
TRACE("(%p)->(%s %p)\n", node, debugstr_w(name), item);
if (!item) return E_POINTER;
nameA = xmlchar_from_wchar(name);
if (!nameA) return E_OUTOFMEMORY;
attr = node_has_prop(node, nameA);
heap_free(nameA);
if (!attr)
{
*item = NULL;
return S_FALSE;
return S_FALSE;
}
*item = create_node((xmlNodePtr)attr);
return S_OK;
}
static HRESULT dom_pi_set_named_item(xmlNodePtr node, IXMLDOMNode *newItem, IXMLDOMNode **namedItem)

View File

@ -8579,13 +8579,9 @@ todo_wine
item = NULL;
hr = IXMLDOMNamedNodeMap_getNamedItem(node_map, _bstr_("encoding"), &item);
todo_wine
ok(hr == S_OK, "got 0x%08x\n", hr);
todo_wine
ok(item != NULL, "got NULL\n");
if (hr == S_OK)
{
hr = IXMLDOMNode_get_nodeName(item, &bstr);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(!lstrcmpW(bstr, L"encoding"), "got %s\n", wine_dbgstr_w(bstr));
@ -8597,7 +8593,6 @@ if (hr == S_OK)
ok(V_VT(&var) == VT_BSTR, "got %u\n", V_VT(&var));
ok(!lstrcmpW(V_BSTR(&var), L"windows-1252"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
VariantClear(&var);
}
IXMLDOMNamedNodeMap_Release(node_map);
IXMLDOMNode_Release(node);