msxml3: Treat namespaces as floating attributes.

Signed-off-by: Daniel Lehman <dlehman25@gmail.com>
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Daniel Lehman 2018-10-15 21:14:34 -07:00 committed by Alexandre Julliard
parent 27980430a0
commit 4460cb3377
2 changed files with 54 additions and 18 deletions

View File

@ -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;

View File

@ -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++)
{