diff --git a/dlls/msxml3/attribute.c b/dlls/msxml3/attribute.c index 76c690e1ad0..a6cd8a12abc 100644 --- a/dlls/msxml3/attribute.c +++ b/dlls/msxml3/attribute.c @@ -543,10 +543,11 @@ static HRESULT WINAPI domattr_get_namespaceURI( IXMLDOMAttribute *iface, BSTR* p) { - static const WCHAR w3xmlns[] = { 'h','t','t','p',':','/','/', 'w','w','w','.','w','3','.', - 'o','r','g','/','2','0','0','0','/','x','m','l','n','s','/',0 }; domattr *This = impl_from_IXMLDOMAttribute( iface ); xmlNsPtr ns = This->node.node->ns; + BSTR nodename, pfx; + BOOL is6, isdefault; + HRESULT hr; TRACE("(%p)->(%p)\n", This, p); @@ -554,23 +555,36 @@ static HRESULT WINAPI domattr_get_namespaceURI( return E_INVALIDARG; *p = NULL; + nodename = NULL; + hr = IXMLDOMAttribute_get_nodeName(iface, &nodename); + if (FAILED(hr)) + return hr; - if (ns) + pfx = NULL; + hr = IXMLDOMAttribute_get_prefix(iface, &pfx); + if (FAILED(hr)) { - /* special case for default namespace definition */ - if (xmlStrEqual(This->node.node->name, xmlns)) - *p = bstr_from_xmlChar(xmlns); - else if (xmlStrEqual(ns->prefix, xmlns)) - { - if (xmldoc_version(This->node.node->doc) == MSXML6) - *p = SysAllocString(w3xmlns); - else - *p = SysAllocStringLen(NULL, 0); - } - else if (ns->href) - *p = bstr_from_xmlChar(ns->href); + SysFreeString(nodename); + return hr; } + is6 = xmldoc_version(This->node.node->doc) == MSXML6; + isdefault = !wcscmp(nodename, L"xmlns"); + if (isdefault || (pfx && !wcscmp(L"xmlns", pfx))) + { + if (is6) + *p = SysAllocString(L"http://www.w3.org/2000/xmlns/"); + else if (!ns || !isdefault) + *p = SysAllocStringLen(NULL, 0); + else + *p = SysAllocString(L"xmlns"); + } + else if (ns && ns->href) + *p = bstr_from_xmlChar(ns->href); + + SysFreeString(nodename); + SysFreeString(pfx); + TRACE("uri: %s\n", debugstr_w(*p)); return *p ? S_OK : S_FALSE; diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 7997106bbd0..ce2e7e655eb 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -13677,7 +13677,6 @@ static void test_namespaces_as_attributes(void) const char *uris[3]; const char *texts[3]; const char *xmls[3]; - BOOL todo; }; static const struct test tests[] = { { @@ -13718,7 +13717,6 @@ static void test_namespaces_as_attributes(void) { "" }, /* namespaceURI */ { "nshref" }, /* text */ { "xmlns=\"nshref\"" }, /* xml */ - TRUE, /* todo */ }, /* no properties or namespaces */ { @@ -13802,7 +13800,6 @@ static void test_namespaces_as_attributes(void) hr = IXMLDOMNode_get_namespaceURI(item, &str); if (test->uris[i]) { - todo_wine_if(test->todo) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); if (test->prefixes[i] && !strcmp(test->prefixes[i], "xmlns")) ok(!SysStringLen(str), "got %s\n", wine_dbgstr_w(str)); diff --git a/dlls/msxml4/tests/domdoc.c b/dlls/msxml4/tests/domdoc.c index 3c5c34f3cb7..1a3a663d359 100644 --- a/dlls/msxml4/tests/domdoc.c +++ b/dlls/msxml4/tests/domdoc.c @@ -166,7 +166,6 @@ static void test_namespaces_as_attributes(void) const WCHAR *uris[3]; const WCHAR *texts[3]; const WCHAR *xmls[3]; - BOOL todo; }; static const struct test tests[] = { @@ -208,7 +207,6 @@ static void test_namespaces_as_attributes(void) { L"" }, /* namespaceURI */ { L"nshref" }, /* text */ { L"xmlns=\"nshref\"" }, /* xml */ - TRUE, /* todo */ }, /* no properties or namespaces */ { @@ -289,13 +287,11 @@ static void test_namespaces_as_attributes(void) hr = IXMLDOMNode_get_namespaceURI(item, &str); if (test->uris[i]) { - todo_wine_if(test->todo) { ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); if (test->prefixes[i] && !lstrcmpW(test->prefixes[i], L"xmlns")) ok(!lstrcmpW(str, L""), "got %s\n", wine_dbgstr_w(str)); else ok(!lstrcmpW(str, test->uris[i]), "got %s\n", wine_dbgstr_w(str)); - } SysFreeString(str); } else diff --git a/dlls/msxml6/tests/domdoc.c b/dlls/msxml6/tests/domdoc.c index b36b8e6510a..d451d0dd50c 100644 --- a/dlls/msxml6/tests/domdoc.c +++ b/dlls/msxml6/tests/domdoc.c @@ -59,12 +59,11 @@ struct attrtest_t { const WCHAR *uri; const WCHAR *prefix; const WCHAR *href; - BOOL todo; }; static struct attrtest_t attrtests[] = { - { L"xmlns", L"http://www.w3.org/2000/xmlns/", NULL, L"http://www.w3.org/2000/xmlns/", TRUE }, - { L"xmlns", L"nondefaulturi", NULL, L"http://www.w3.org/2000/xmlns/", TRUE }, + { L"xmlns", L"http://www.w3.org/2000/xmlns/", NULL, L"http://www.w3.org/2000/xmlns/" }, + { L"xmlns", L"nondefaulturi", NULL, L"http://www.w3.org/2000/xmlns/" }, { L"c", L"http://www.w3.org/2000/xmlns/", NULL, L"http://www.w3.org/2000/xmlns/" }, { L"c", L"nsref1", NULL, L"nsref1" }, { L"ns:c", L"nsref1", L"ns", L"nsref1" }, @@ -113,7 +112,6 @@ static void test_create_attribute(void) str = NULL; hr = IXMLDOMNode_get_namespaceURI(node, &str); ok(hr == S_OK, "%d: unexpected hr %#lx\n", i, hr); - todo_wine_if(ptr->todo) ok(!lstrcmpW(str, _bstr_(ptr->href)) || broken(!ptr->prefix && !lstrcmpW(str, L"xmlns")), /* win7 msxml6 */ "%d: got uri %s, expected %s\n", i, wine_dbgstr_w(str), wine_dbgstr_w(ptr->href)); @@ -171,7 +169,6 @@ static void test_namespaces_as_attributes(void) const WCHAR *uris[3]; const WCHAR *texts[3]; const WCHAR *xmls[3]; - BOOL todo; }; static const struct test tests[] = { @@ -213,7 +210,6 @@ static void test_namespaces_as_attributes(void) { L"http://www.w3.org/2000/xmlns/" }, /* namespaceURI */ { L"nshref" }, /* text */ { L"xmlns=\"nshref\"" }, /* xml */ - TRUE, /* todo */ }, /* no properties or namespaces */ { @@ -273,10 +269,8 @@ static void test_namespaces_as_attributes(void) hr = IXMLDOMNode_get_prefix(item, &str); if (test->prefixes[i]) { - todo_wine_if(test->todo) { ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(!lstrcmpW(str, test->prefixes[i]), "got %s\n", wine_dbgstr_w(str)); - } SysFreeString(str); } else @@ -292,14 +286,12 @@ static void test_namespaces_as_attributes(void) hr = IXMLDOMNode_get_namespaceURI(item, &str); if (test->uris[i]) { - todo_wine_if(test->todo) { ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); if (test->prefixes[i] && !lstrcmpW(test->prefixes[i], L"xmlns")) ok(!lstrcmpW(str, L"http://www.w3.org/2000/xmlns/"), "got %s\n", wine_dbgstr_w(str)); else ok(!lstrcmpW(str, test->uris[i]), "got %s\n", wine_dbgstr_w(str)); - } SysFreeString(str); } else