[PATCH] mshtml: Implement HTMLAnchorElement_get_pathname().

Hans Leidekker hans at codeweavers.com
Tue Nov 2 09:27:03 CDT 2021


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/mshtml/htmlanchor.c | 31 +++++++++++++++++++++++++++++--
 dlls/mshtml/tests/dom.c  | 22 ++++++++++++++++++++--
 2 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/dlls/mshtml/htmlanchor.c b/dlls/mshtml/htmlanchor.c
index a3608abbeb1..a9c5844d440 100644
--- a/dlls/mshtml/htmlanchor.c
+++ b/dlls/mshtml/htmlanchor.c
@@ -476,8 +476,35 @@ static HRESULT WINAPI HTMLAnchorElement_put_pathname(IHTMLAnchorElement *iface,
 static HRESULT WINAPI HTMLAnchorElement_get_pathname(IHTMLAnchorElement *iface, BSTR *p)
 {
     HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+    IUri *uri;
+    HRESULT hres;
+    BSTR path;
+
+    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_GetPath(uri, &path);
+    IUri_Release(uri);
+    if(FAILED(hres))
+        return hres;
+
+    if(path[0] == '/') {
+        BSTR str = SysAllocString(path + 1);
+        SysFreeString(path);
+        if (!str)
+            return E_OUTOFMEMORY;
+        *p = str;
+    }
+    else
+        *p = path;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI HTMLAnchorElement_put_port(IHTMLAnchorElement *iface, BSTR v)
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 03f5c0431ea..2e5fd58cdfb 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -1689,6 +1689,22 @@ static void _test_anchor_port(unsigned line, IUnknown *unk, const WCHAR *port)
     SysFreeString(str);
 }
 
+#define test_anchor_pathname(a,p) _test_anchor_pathname(__LINE__,a,p)
+static void _test_anchor_pathname(unsigned line, IUnknown *unk, const WCHAR *pathname)
+{
+    IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk);
+    BSTR str;
+    HRESULT hres;
+
+    hres = IHTMLAnchorElement_get_pathname(anchor, &str);
+    ok_(__FILE__,line)(hres == S_OK, "get_pathname failed: %08x\n", hres);
+    if(pathname)
+        ok_(__FILE__,line)(!lstrcmpW(str, pathname), "pathname = %s, expected %s\n", wine_dbgstr_w(str), wine_dbgstr_w(pathname));
+    else
+        ok_(__FILE__,line)(str == NULL, "pathname = %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)
 {
@@ -9220,12 +9236,14 @@ static void test_elems(IHTMLDocument2 *doc)
     if(elem) {
         test_anchor_href((IUnknown*)elem, L"http://test/");
         test_anchor_port((IUnknown*)elem, L"80");
+        test_anchor_pathname((IUnknown*)elem, L"");
 
         /* Change the href */
-        test_anchor_put_href((IUnknown*)elem, L"http://test1:8080/");
-        test_anchor_href((IUnknown*)elem, L"http://test1:8080/");
+        test_anchor_put_href((IUnknown*)elem, L"http://test1:8080/path");
+        test_anchor_href((IUnknown*)elem, L"http://test1:8080/path");
         test_anchor_hostname((IUnknown*)elem, L"test1");
         test_anchor_port((IUnknown*)elem, L"8080");
+        test_anchor_pathname((IUnknown*)elem, L"path");
 
         /* Restore the href */
         test_anchor_put_href((IUnknown*)elem, L"http://test/");
-- 
2.30.2




More information about the wine-devel mailing list