From: Reinhold Gschweicher pyro4hell+winehq@gmail.com
Check if the given attribute has the element as parent. If so remove it just like `domelem_remove_qualified_item` does. --- dlls/msxml3/element.c | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-)
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c index 41ba2493709..c311e327212 100644 --- a/dlls/msxml3/element.c +++ b/dlls/msxml3/element.c @@ -1491,35 +1491,30 @@ static HRESULT WINAPI domelem_removeAttributeNode( IXMLDOMAttribute** attributeNode) { domelem *This = impl_from_IXMLDOMElement( iface ); - DOMNodeType type; - HRESULT hr; - BSTR attr_name; - IXMLDOMNamedNodeMap* attr_map; + xmlnode *attr_node;
TRACE("(%p)->(%p %p)\n", This, domAttribute, attributeNode);
if (!domAttribute) { return E_INVALIDARG; } - - /* check given node type to be an attribute */ - hr = IXMLDOMNode_get_nodeType((IXMLDOMNode *)domAttribute, &type); - if (hr != S_OK) return hr; - if (type != NODE_ATTRIBUTE) { + attr_node = get_node_obj((IXMLDOMNode*)domAttribute); + if (This->node.node != attr_node->node->parent) { return E_INVALIDARG; }
- /* get attribute node name and reuse removeNamedItem function */ - hr = IXMLDOMAttribute_get_nodeName(domAttribute, &attr_name); - if (hr != S_OK) return hr; - hr = domelem_get_attributes(iface, &attr_map); - if (hr != S_OK) return hr; - hr = IXMLDOMNamedNodeMap_removeNamedItem(attr_map, attr_name, (IXMLDOMNode **)attributeNode); - IXMLDOMNamedNodeMap_Release(attr_map); - /* removeNameItem returns S_FALSE if not found, - * removeAttributeNode is expected to return E_INVALIDARG */ - if (hr == S_FALSE) return E_INVALIDARG; - return hr; + if (attributeNode) + { + xmlUnlinkNode(attr_node->node ); + xmldoc_add_orphan(attr_node->node->doc, attr_node->node); + *attributeNode = (IXMLDOMAttribute*)create_node(attr_node->node); + } + else { + if (xmlRemoveProp((xmlAttrPtr)attr_node->node) == -1) { + return E_INVALIDARG; + } + } + return S_OK; }
static HRESULT WINAPI domelem_getElementsByTagName(