From: Daniel Lehman dlehman25@gmail.com
--- dlls/msxml3/node.c | 22 ++++++++++++++++++---- dlls/msxml3/tests/domdoc.c | 3 --- 2 files changed, 18 insertions(+), 7 deletions(-)
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 8f560d9a6ce..e081b132bea 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -186,6 +186,13 @@ HRESULT node_get_nodeName(xmlnode *This, BSTR *name) hr = node_get_base_name(This, &base); if (hr != S_OK) return hr;
+ if (!base[0] && xmldoc_version(This->node->doc) != MSXML6) + { + SysFreeString(base); + *name = SysAllocString(L"xmlns"); + return S_OK; + } + hr = node_get_prefix(This, &prefix); if (hr == S_OK) { @@ -194,10 +201,17 @@ HRESULT node_get_nodeName(xmlnode *This, BSTR *name)
/* +1 for ':' */ ptr = *name = SysAllocStringLen(NULL, SysStringLen(base) + SysStringLen(prefix) + 1); - memcpy(ptr, prefix, SysStringByteLen(prefix)); - ptr += SysStringLen(prefix); - memcpy(ptr++, &colW, sizeof(WCHAR)); - memcpy(ptr, base, SysStringByteLen(base)); + if (SysStringByteLen(prefix)) + { + memcpy(ptr, prefix, SysStringByteLen(prefix)); + ptr += SysStringLen(prefix); + } + if (SysStringByteLen(base)) + { + if (SysStringByteLen(prefix)) + memcpy(ptr++, &colW, sizeof(WCHAR)); + memcpy(ptr, base, SysStringByteLen(base)); + }
SysFreeString(base); SysFreeString(prefix); diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 53584c2758d..526941b0620 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -13735,7 +13735,6 @@ static void test_namespaces_as_attributes(void) const char *xmls[3]; MSXML_VERSION versions; BOOL todo; - BOOL todo2; }; static const struct test tests[] = { { @@ -13778,7 +13777,6 @@ static void test_namespaces_as_attributes(void) { "xmlns="nshref"" }, /* xml */ ~MSXML6, /* versions */ TRUE, /* todo */ - TRUE, /* todo2 */ }, { "<a xmlns="nshref" />", 1, @@ -13855,7 +13853,6 @@ static void test_namespaces_as_attributes(void) str = NULL; hr = IXMLDOMNode_get_nodeName(item, &str); ok(SUCCEEDED(hr), "Failed to get node name, hr %#lx.\n", hr); - todo_wine_if(test->todo2) ok(!lstrcmpW(str, _bstr_(test->names[i])), "got %s\n", wine_dbgstr_w(str)); SysFreeString(str);