Jacek Caban : mshtml: Added IHTMLLocation::put_href implementation.

Alexandre Julliard julliard at winehq.org
Mon Oct 12 11:19:41 CDT 2009


Module: wine
Branch: master
Commit: 47c27742d046f8a5c3da94613c541a17cbedf257
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=47c27742d046f8a5c3da94613c541a17cbedf257

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sun Oct 11 21:11:35 2009 +0200

mshtml: Added IHTMLLocation::put_href implementation.

---

 dlls/mshtml/htmllocation.c   |   11 +++++++++--
 dlls/mshtml/mshtml_private.h |    1 +
 dlls/mshtml/navigate.c       |   25 +++++++++++++++++++++++++
 dlls/mshtml/tests/htmldoc.c  |   42 ++++++++++++++++++++++++++++++++++++++++--
 4 files changed, 75 insertions(+), 4 deletions(-)

diff --git a/dlls/mshtml/htmllocation.c b/dlls/mshtml/htmllocation.c
index 45899b4..891e7b8 100644
--- a/dlls/mshtml/htmllocation.c
+++ b/dlls/mshtml/htmllocation.c
@@ -134,8 +134,15 @@ static HRESULT WINAPI HTMLLocation_Invoke(IHTMLLocation *iface, DISPID dispIdMem
 static HRESULT WINAPI HTMLLocation_put_href(IHTMLLocation *iface, BSTR v)
 {
     HTMLLocation *This = HTMLLOCATION_THIS(iface);
-    FIXME("(%p)->(%s)\n", This, debugstr_w(v));
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%s)\n", This, debugstr_w(v));
+
+    if(!This->window || !This->window->doc) {
+        FIXME("No document available\n");
+        return E_FAIL;
+    }
+
+    return navigate_url(This->window->doc, v);
 }
 
 static HRESULT WINAPI HTMLLocation_get_href(IHTMLLocation *iface, BSTR *p)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 4a10fea..44a816e 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -608,6 +608,7 @@ BOOL install_wine_gecko(BOOL);
 HRESULT nsuri_to_url(LPCWSTR,BOOL,BSTR*);
 
 HRESULT hlink_frame_navigate(HTMLDocument*,LPCWSTR,nsIInputStream*,DWORD);
+HRESULT navigate_url(HTMLDocumentNode*,OLECHAR*);
 
 void call_property_onchanged(ConnectionPoint*,DISPID);
 HRESULT call_set_active_object(IOleInPlaceUIWindow*,IOleInPlaceActiveObject*);
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index 7c7376d..92d95fc 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -41,6 +41,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 #define CONTENT_LENGTH "Content-Length"
 #define UTF16_STR "utf-16"
 
+static WCHAR emptyW[] = {0};
+
 typedef struct {
     const nsIInputStreamVtbl *lpInputStreamVtbl;
 
@@ -1217,3 +1219,26 @@ HRESULT hlink_frame_navigate(HTMLDocument *doc, LPCWSTR url,
     IBindStatusCallback_Release(STATUSCLB(callback));
     return hres;
 }
+
+HRESULT navigate_url(HTMLDocumentNode *doc, OLECHAR *url)
+{
+    OLECHAR *translated_url = NULL;
+    HRESULT hres;
+
+    if(!url)
+        url = emptyW;
+
+    if(doc->basedoc.doc_obj->hostui) {
+        hres = IDocHostUIHandler_TranslateUrl(doc->basedoc.doc_obj->hostui, 0, url,
+                &translated_url);
+        if(hres == S_OK)
+            url = translated_url;
+    }
+
+    hres = hlink_frame_navigate(&doc->basedoc, url, NULL, 0);
+    if(FAILED(hres))
+        FIXME("hlink_frame_navigate failed: %08x\n", hres);
+
+    CoTaskMemFree(translated_url);
+    return hres;
+}
diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c
index e02951f..79d7786 100644
--- a/dlls/mshtml/tests/htmldoc.c
+++ b/dlls/mshtml/tests/htmldoc.c
@@ -148,6 +148,7 @@ DEFINE_EXPECT(EnableModeless_FALSE);
 DEFINE_EXPECT(Frame_EnableModeless_TRUE);
 DEFINE_EXPECT(Frame_EnableModeless_FALSE);
 DEFINE_EXPECT(Frame_GetWindow);
+DEFINE_EXPECT(TranslateUrl);
 
 static IUnknown *doc_unk;
 static IMoniker *doc_mon;
@@ -665,6 +666,7 @@ static HRESULT WINAPI HlinkFrame_Navigate(IHlinkFrame *iface, DWORD grfHLNF, LPB
         DWORD site_data = 0xdeadbeef;
 
         hres = IHlink_GetTargetFrameName(pihlNavigate, &frame_name);
+        todo_wine
         ok(hres == S_FALSE, "GetTargetFrameName failed: %08x\n", hres);
         ok(frame_name == NULL, "frame_name = %p\n", frame_name);
 
@@ -676,6 +678,7 @@ static HRESULT WINAPI HlinkFrame_Navigate(IHlinkFrame *iface, DWORD grfHLNF, LPB
         hres = IHlink_GetHlinkSite(pihlNavigate, &site, &site_data);
         ok(hres == S_OK, "GetHlinkSite failed: %08x\n", hres);
         ok(site == NULL, "site = %p\n, expected NULL\n", site);
+        todo_wine
         ok(site_data == 0xdeadbeef, "site_data = %x\n", site_data);
     }
 
@@ -2107,8 +2110,13 @@ static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, ID
 static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate,
         OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
 {
-    ok(0, "unexpected call\n");
-    return E_NOTIMPL;
+    CHECK_EXPECT(TranslateUrl);
+    ok(!dwTranslate, "dwTranslate = %x\n", dwTranslate);
+    ok(!strcmp_wa(pchURLIn, "about:blank"), "pchURLIn = %s\n", wine_dbgstr_w(pchURLIn));
+    ok(ppchURLOut != NULL, "ppchURLOut == NULL\n");
+    ok(!*ppchURLOut, "*ppchURLOut = %p\n", *ppchURLOut);
+
+    return S_FALSE;
 }
 
 static HRESULT WINAPI DocHostUIHandler_FilterDataObject(IDocHostUIHandler2 *iface, IDataObject *pDO,
@@ -2997,6 +3005,34 @@ static void test_Persist(IUnknown *unk, IMoniker *mon)
     }
 }
 
+static void test_put_href(IUnknown *unk)
+{
+    IHTMLLocation *location;
+    IHTMLDocument2 *doc;
+    BSTR str;
+    HRESULT hres;
+
+    hres = IUnknown_QueryInterface(unk, &IID_IHTMLDocument2, (void**)&doc);
+    ok(hres == S_OK, "Could not get IHTMLDocument2 iface: %08x\n", hres);
+
+    location = NULL;
+    hres = IHTMLDocument2_get_location(doc, &location);
+    IHTMLDocument2_Release(doc);
+    ok(hres == S_OK, "get_location failed: %08x\n", hres);
+    ok(location != NULL, "location == NULL\n");
+
+    SET_EXPECT(TranslateUrl);
+    SET_EXPECT(Navigate);
+    str = a2bstr("about:blank");
+    hres = IHTMLLocation_put_href(location, str);
+    SysFreeString(str);
+    ok(hres == S_OK, "put_href failed: %08x\n", hres);
+    CHECK_CALLED(TranslateUrl);
+    CHECK_CALLED(Navigate);
+
+    IHTMLLocation_Release(location);
+}
+
 static const OLECMDF expect_cmds[OLECMDID_GETPRINTTEMPLATE+1] = {
     0,
     OLECMDF_SUPPORTED,                  /* OLECMDID_OPEN */
@@ -4118,6 +4154,8 @@ static void test_HTMLDocument_http(void)
     test_IsDirty(unk, S_FALSE);
     test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
 
+    test_put_href(unk);
+
     test_InPlaceDeactivate(unk, TRUE);
     test_Close(unk, FALSE);
     test_IsDirty(unk, S_FALSE);




More information about the wine-cvs mailing list