Module: wine Branch: master Commit: 47c27742d046f8a5c3da94613c541a17cbedf257 URL: http://source.winehq.org/git/wine.git/?a=commit;h=47c27742d046f8a5c3da94613c...
Author: Jacek Caban jacek@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);