diff --git a/dlls/mshtml/htmlanchor.c b/dlls/mshtml/htmlanchor.c index 44166246139..a3608abbeb1 100644 --- a/dlls/mshtml/htmlanchor.c +++ b/dlls/mshtml/htmlanchor.c @@ -490,8 +490,35 @@ static HRESULT WINAPI HTMLAnchorElement_put_port(IHTMLAnchorElement *iface, BSTR static HRESULT WINAPI HTMLAnchorElement_get_port(IHTMLAnchorElement *iface, BSTR *p) { HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + IUri *uri; + HRESULT hres; + DWORD port; + WCHAR buf[11]; + int len; + BSTR str; + + TRACE("(%p)->(%p)\n", This, p); + + uri = get_anchor_uri(This); + if(!uri) { + WARN("Could not create IUri\n"); + *p = NULL; + return S_OK; + } + + hres = IUri_GetPort(uri, &port); + IUri_Release(uri); + if(FAILED(hres)) + return hres; + + len = swprintf(buf, ARRAY_SIZE(buf), L"%u", port); + str = SysAllocStringLen(buf, len); + if (str) + *p = str; + else + hres = E_OUTOFMEMORY; + + return hres; } static HRESULT WINAPI HTMLAnchorElement_put_protocol(IHTMLAnchorElement *iface, BSTR v) diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 9daaf9de51d..03f5c0431ea 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -1673,6 +1673,22 @@ static void _test_anchor_hostname(unsigned line, IUnknown *unk, const WCHAR *hos SysFreeString(str); } +#define test_anchor_port(a,p) _test_anchor_port(__LINE__,a,p) +static void _test_anchor_port(unsigned line, IUnknown *unk, const WCHAR *port) +{ + IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk); + BSTR str; + HRESULT hres; + + hres = IHTMLAnchorElement_get_port(anchor, &str); + ok_(__FILE__,line)(hres == S_OK, "get_port failed: %08x\n", hres); + if(port) + ok_(__FILE__,line)(!lstrcmpW(str, port), "port = %s, expected %s\n", wine_dbgstr_w(str), wine_dbgstr_w(port)); + else + ok_(__FILE__,line)(str == NULL, "port = %s, expected NULL\n", wine_dbgstr_w(str)); + SysFreeString(str); +} + #define test_anchor_search(a,h,n) _test_anchor_search(__LINE__,a,h,n) static void _test_anchor_search(unsigned line, IUnknown *elem, const WCHAR *search, BOOL allowbroken) { @@ -9203,11 +9219,13 @@ static void test_elems(IHTMLDocument2 *doc) elem = get_elem_by_id(doc, L"a", TRUE); if(elem) { test_anchor_href((IUnknown*)elem, L"http://test/"); + test_anchor_port((IUnknown*)elem, L"80"); /* Change the href */ - test_anchor_put_href((IUnknown*)elem, L"http://test1/"); - test_anchor_href((IUnknown*)elem, L"http://test1/"); + test_anchor_put_href((IUnknown*)elem, L"http://test1:8080/"); + test_anchor_href((IUnknown*)elem, L"http://test1:8080/"); test_anchor_hostname((IUnknown*)elem, L"test1"); + test_anchor_port((IUnknown*)elem, L"8080"); /* Restore the href */ test_anchor_put_href((IUnknown*)elem, L"http://test/");