diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c index 4faeed400cb..0ff26e4fb70 100644 --- a/dlls/msxml3/element.c +++ b/dlls/msxml3/element.c @@ -1754,8 +1754,11 @@ static HRESULT domelem_remove_named_item(xmlNodePtr node, BSTR name, IXMLDOMNode static HRESULT domelem_get_item(const xmlNodePtr node, LONG index, IXMLDOMNode **item) { + xmlNsPtr ns, xmlns; xmlAttrPtr curr; LONG attrIndex; + IUnknown *unk; + HRESULT hr; TRACE("(%p)->(%d %p)\n", node, index, item); @@ -1764,43 +1767,76 @@ static HRESULT domelem_get_item(const xmlNodePtr node, LONG index, IXMLDOMNode * if (index < 0) return S_FALSE; + attrIndex = 0; curr = node->properties; - - for (attrIndex = 0; attrIndex < index; attrIndex++) { - if (curr->next == NULL) - return S_FALSE; - else + if (curr) { + for (; attrIndex < index && curr->next != NULL; attrIndex++) curr = curr->next; + + if (attrIndex == index) { + *item = create_node( (xmlNodePtr) curr ); + return S_OK; + } } - *item = create_node( (xmlNodePtr) curr ); + if (!node->nsDef) + return S_FALSE; - return S_OK; + attrIndex++; + ns = node->nsDef; + for (; attrIndex < index && ns->next != NULL; attrIndex++) + ns = ns->next; + + if (attrIndex < index) + return S_FALSE; + + xmlns = xmlNewNs(NULL, BAD_CAST "http://www.w3.org/2000/xmlns/", BAD_CAST "xmlns"); + if (!xmlns) + return E_OUTOFMEMORY; + + curr = xmlNewNsProp(NULL, xmlns, ns->prefix, ns->href); + if (!curr) { + xmlFreeNs(xmlns); + return E_OUTOFMEMORY; + } + curr->doc = node->doc; + + unk = create_attribute((xmlNodePtr)curr, TRUE); + if (!unk) { + xmlFreeNs(xmlns); + xmlFreeProp(curr); + return E_OUTOFMEMORY; + } + + hr = IUnknown_QueryInterface(unk, &IID_IXMLDOMNode, (void**)item); + IUnknown_Release(unk); + + return hr; } static HRESULT domelem_get_length(const xmlNodePtr node, LONG *length) { - xmlAttrPtr first; xmlAttrPtr curr; LONG attrCount; + xmlNsPtr ns; TRACE("(%p)->(%p)\n", node, length); if( !length ) return E_INVALIDARG; - first = node->properties; - if (first == NULL) { - *length = 0; - return S_OK; - } - - curr = first; - attrCount = 1; - while (curr->next) { + attrCount = 0; + curr = node->properties; + while (curr) { attrCount++; curr = curr->next; } + + ns = node->nsDef; + while (ns) { + attrCount++; + ns = ns->next; + } *length = attrCount; return S_OK; diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index b7b29e332d0..79118769830 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -12891,7 +12891,7 @@ static void test_namespaces_as_attributes(void) len = -1; hr = IXMLDOMNamedNodeMap_get_length(map, &len); ok(SUCCEEDED(hr), "Failed to get map length, hr %#x.\n", hr); - todo_wine ok(len == 3, "got %d\n", len); + ok(len == 3, "got %d\n", len); for (i = 0; i < len; i++) {