[PATCH v2 0/1] MR8914: msxml: IXMLDOMNamedNodeMap::getNamedItem to handle global namespace.
-- v2: msxml: IXMLDOMNamedNodeMap::getNamedItem to handle global namespace. https://gitlab.winehq.org/wine/wine/-/merge_requests/8914
From: Alistair Leslie-Hughes <leslie_alistair(a)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); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8914
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?
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/8914#note_117410
participants (3)
-
Alistair Leslie-Hughes -
Alistair Leslie-Hughes (@alesliehughes) -
Nikolay Sivov (@nsivov)