-- v2: msxml: IXMLDOMNamedNodeMap::getNamedItem to handle global namespace.
From: Alistair Leslie-Hughes leslie_alistair@hotmail.com
--- dlls/msxml3/element.c | 35 ++++++++++++++++++++++++++++++++++- dlls/msxml3/tests/domdoc.c | 25 ++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-)
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c index 3e3c2d06169..c9a94c7a8a6 100644 --- a/dlls/msxml3/element.c +++ b/dlls/msxml3/element.c @@ -1641,7 +1641,40 @@ static HRESULT domelem_get_named_item(const xmlNodePtr node, BSTR name, IXMLDOMN return domelem_get_qualified_item(node, name, NULL, item);
/* try to get namespace uri for supplied qualified name */ - ns = xmlSearchNs(node->doc, node, prefix); + if (xmlStrEqual(prefix, BAD_CAST "xmlns") ) + { + IUnknown *unk; + xmlAttrPtr curr; + + xmlFree(prefix); + + ns = xmlSearchNs(node->doc, node, local); + xmlFree(local); + if (!ns) + { + if (item) *item = NULL; + return item ? S_FALSE : E_INVALIDARG; + } + + curr = xmlNewNsProp(NULL, NULL, ns->prefix, ns->href); + if (!curr) + { + return E_OUTOFMEMORY; + } + curr->doc = node->doc; + + unk = create_attribute((xmlNodePtr)curr, FALSE); + if (!unk) + { + xmlFreeProp(curr); + return E_OUTOFMEMORY; + } + hr = IUnknown_QueryInterface(unk, &IID_IXMLDOMNode, (void**)item); + IUnknown_Release(unk); + return hr; + } + else + ns = xmlSearchNs(node->doc, node, prefix);
xmlFree(prefix);
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index dcda4821125..476106c0fbd 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -10247,6 +10247,7 @@ static void test_get_attributes(void) IXMLDOMDocument *doc, *doc2; IXMLDOMNode *node, *node2; IXMLDOMElement *elem; + DOMNodeType type; VARIANT_BOOL b; HRESULT hr; VARIANT v; @@ -10286,7 +10287,6 @@ static void test_get_attributes(void) if (hr == S_OK && length == 1) { IXMLDOMAttribute *attr; - DOMNodeType type; VARIANT v;
node2 = NULL; @@ -10562,6 +10562,29 @@ static void test_get_attributes(void) IXMLDOMNode_Release(node2); }
+ hr = IXMLDOMNamedNodeMap_getNamedItem(map, _bstr_("xmlns:foaf"), &node2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + { + type = -1; + hr = IXMLDOMNode_get_nodeType(node2, &type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(type == NODE_ATTRIBUTE, "Unexpected type %d.\n", type); + IXMLDOMNode_Release(node2); + } + + hr = IXMLDOMNamedNodeMap_getNamedItem(map, _bstr_("dcterms:created"), &node2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + { + type = -1; + hr = IXMLDOMNode_get_nodeType(node2, &type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(type == NODE_ATTRIBUTE, "Unexpected type %d.\n", type); + IXMLDOMNode_Release(node2); + } + + IXMLDOMNamedNodeMap_Release(map); IXMLDOMElement_Release(elem);
Nikolay Sivov (@nsivov) commented about dlls/msxml3/element.c:
ns = xmlSearchNs(node->doc, node, local);
xmlFree(local);
if (!ns)
{
if (item) *item = NULL;
return item ? S_FALSE : E_INVALIDARG;
}
curr = xmlNewNsProp(NULL, NULL, ns->prefix, ns->href);
if (!curr)
{
return E_OUTOFMEMORY;
}
curr->doc = node->doc;
unk = create_attribute((xmlNodePtr)curr, FALSE);
Why do we need to create a new node at libxml level?