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:
parent
27980430a0
commit
4460cb3377
|
@ -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;
|
||||
|
|
|
@ -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++)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue