2 * Copyright 2006 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #define NONAMELESSUNION
20 #define NONAMELESSSTRUCT
22 #include "wine/debug.h"
23 #include "wine/unicode.h"
31 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw
);
34 const IBindStatusCallbackVtbl
*lpBindStatusCallbackVtbl
;
35 const IHttpNegotiateVtbl
*lpHttpNegotiateVtbl
;
44 #define BINDSC(x) ((IBindStatusCallback*) &(x)->lpBindStatusCallbackVtbl)
45 #define HTTPNEG(x) ((IHttpNegotiate*) &(x)->lpHttpNegotiateVtbl)
47 static void dump_BINDINFO(BINDINFO
*bi
)
49 static const char * const BINDINFOF_str
[] = {
51 "BINDINFOF_URLENCODESTGMEDDATA",
52 "BINDINFOF_URLENCODEDEXTRAINFO"
55 static const char * const BINDVERB_str
[] = {
75 bi
->cbSize
, debugstr_w(bi
->szExtraInfo
),
76 bi
->stgmedData
.tymed
, bi
->stgmedData
.u
.hGlobal
, bi
->stgmedData
.pUnkForRelease
,
77 bi
->grfBindInfoF
> BINDINFOF_URLENCODEDEXTRAINFO
78 ? "unknown" : BINDINFOF_str
[bi
->grfBindInfoF
],
79 bi
->dwBindVerb
> BINDVERB_CUSTOM
80 ? "unknown" : BINDVERB_str
[bi
->dwBindVerb
],
81 debugstr_w(bi
->szCustomVerb
),
82 bi
->cbstgmedData
, bi
->dwOptions
, bi
->dwOptionsFlags
, bi
->dwCodePage
,
83 bi
->securityAttributes
.nLength
,
84 bi
->securityAttributes
.lpSecurityDescriptor
,
85 bi
->securityAttributes
.bInheritHandle
,
86 debugstr_guid(&bi
->iid
),
87 bi
->pUnk
, bi
->dwReserved
91 #define BINDSC_THIS(iface) DEFINE_THIS(BindStatusCallback, BindStatusCallback, iface)
93 static HRESULT WINAPI
BindStatusCallback_QueryInterface(IBindStatusCallback
*iface
,
94 REFIID riid
, void **ppv
)
96 BindStatusCallback
*This
= BINDSC_THIS(iface
);
100 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
101 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
103 }else if(IsEqualGUID(&IID_IBindStatusCallback
, riid
)) {
104 TRACE("(%p)->(IID_IBindStatusCallback %p)\n", This
, ppv
);
106 }else if(IsEqualGUID(&IID_IHttpNegotiate
, riid
)) {
107 TRACE("(%p)->(IID_IHttpNegotiate %p)\n", This
, ppv
);
108 *ppv
= HTTPNEG(This
);
112 IBindStatusCallback_AddRef(BINDSC(This
));
116 WARN("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
117 return E_NOINTERFACE
;
120 static ULONG WINAPI
BindStatusCallback_AddRef(IBindStatusCallback
*iface
)
122 BindStatusCallback
*This
= BINDSC_THIS(iface
);
123 LONG ref
= InterlockedIncrement(&This
->ref
);
125 TRACE("(%p) ref=%d\n", This
, ref
);
130 static ULONG WINAPI
BindStatusCallback_Release(IBindStatusCallback
*iface
)
132 BindStatusCallback
*This
= BINDSC_THIS(iface
);
133 LONG ref
= InterlockedDecrement(&This
->ref
);
135 TRACE("(%p) ref=%d\n", This
, ref
);
139 GlobalFree(This
->post_data
);
140 heap_free(This
->headers
);
147 static HRESULT WINAPI
BindStatusCallback_OnStartBinding(IBindStatusCallback
*iface
,
148 DWORD dwReserved
, IBinding
*pbind
)
150 BindStatusCallback
*This
= BINDSC_THIS(iface
);
151 FIXME("(%p)->(%d %p)\n", This
, dwReserved
, pbind
);
155 static HRESULT WINAPI
BindStatusCallback_GetPriority(IBindStatusCallback
*iface
,
158 BindStatusCallback
*This
= BINDSC_THIS(iface
);
159 FIXME("(%p)->(%p)\n", This
, pnPriority
);
163 static HRESULT WINAPI
BindStatusCallback_OnLowResource(IBindStatusCallback
*iface
,
166 BindStatusCallback
*This
= BINDSC_THIS(iface
);
167 FIXME("(%p)->(%d)\n", This
, reserved
);
171 static HRESULT WINAPI
BindStatusCallback_OnProgress(IBindStatusCallback
*iface
,
172 ULONG ulProgress
, ULONG ulProgressMax
, ULONG ulStatusCode
, LPCWSTR szStatusText
)
174 BindStatusCallback
*This
= BINDSC_THIS(iface
);
175 FIXME("(%p)->(%d %d %d %s)\n", This
, ulProgress
, ulProgressMax
, ulStatusCode
,
176 debugstr_w(szStatusText
));
180 static HRESULT WINAPI
BindStatusCallback_OnStopBinding(IBindStatusCallback
*iface
,
181 HRESULT hresult
, LPCWSTR szError
)
183 BindStatusCallback
*This
= BINDSC_THIS(iface
);
184 FIXME("(%p)->(%08x %s)\n", This
, hresult
, debugstr_w(szError
));
188 static HRESULT WINAPI
BindStatusCallback_GetBindInfo(IBindStatusCallback
*iface
,
189 DWORD
*grfBINDF
, BINDINFO
*pbindinfo
)
191 BindStatusCallback
*This
= BINDSC_THIS(iface
);
193 FIXME("(%p)->(%p %p)\n", This
, grfBINDF
, pbindinfo
);
195 memset(pbindinfo
, 0, sizeof(BINDINFO
));
196 pbindinfo
->cbSize
= sizeof(BINDINFO
);
198 pbindinfo
->cbstgmedData
= This
->post_data_len
;
200 if(This
->post_data
) {
201 pbindinfo
->dwBindVerb
= BINDVERB_POST
;
203 pbindinfo
->stgmedData
.tymed
= TYMED_HGLOBAL
;
204 pbindinfo
->stgmedData
.u
.hGlobal
= This
->post_data
;
205 pbindinfo
->stgmedData
.pUnkForRelease
= (IUnknown
*)BINDSC(This
);
206 IBindStatusCallback_AddRef(BINDSC(This
));
212 static HRESULT WINAPI
BindStatusCallback_OnDataAvailable(IBindStatusCallback
*iface
,
213 DWORD grfBSCF
, DWORD dwSize
, FORMATETC
*pformatetc
, STGMEDIUM
*pstgmed
)
215 BindStatusCallback
*This
= BINDSC_THIS(iface
);
216 FIXME("(%p)->(%08x %d %p %p)\n", This
, grfBSCF
, dwSize
, pformatetc
, pstgmed
);
222 static const IBindStatusCallbackVtbl BindStatusCallbackVtbl
= {
223 BindStatusCallback_QueryInterface
,
224 BindStatusCallback_AddRef
,
225 BindStatusCallback_Release
,
226 BindStatusCallback_OnStartBinding
,
227 BindStatusCallback_GetPriority
,
228 BindStatusCallback_OnLowResource
,
229 BindStatusCallback_OnProgress
,
230 BindStatusCallback_OnStopBinding
,
231 BindStatusCallback_GetBindInfo
,
232 BindStatusCallback_OnDataAvailable
235 #define HTTPNEG_THIS(iface) DEFINE_THIS(BindStatusCallback, HttpNegotiate, iface)
237 static HRESULT WINAPI
HttpNegotiate_QueryInterface(IHttpNegotiate
*iface
,
238 REFIID riid
, void **ppv
)
240 BindStatusCallback
*This
= HTTPNEG_THIS(iface
);
241 return IBindStatusCallback_QueryInterface(BINDSC(This
), riid
, ppv
);
244 static ULONG WINAPI
HttpNegotiate_AddRef(IHttpNegotiate
*iface
)
246 BindStatusCallback
*This
= HTTPNEG_THIS(iface
);
247 return IBindStatusCallback_AddRef(BINDSC(This
));
250 static ULONG WINAPI
HttpNegotiate_Release(IHttpNegotiate
*iface
)
252 BindStatusCallback
*This
= HTTPNEG_THIS(iface
);
253 return IBindStatusCallback_Release(BINDSC(This
));
256 static HRESULT WINAPI
HttpNegotiate_BeginningTransaction(IHttpNegotiate
*iface
,
257 LPCWSTR szURL
, LPCWSTR szHeaders
, DWORD dwReserved
, LPWSTR
*pszAdditionalHeaders
)
259 BindStatusCallback
*This
= HTTPNEG_THIS(iface
);
261 FIXME("(%p)->(%s %s %d %p)\n", This
, debugstr_w(szURL
), debugstr_w(szHeaders
),
262 dwReserved
, pszAdditionalHeaders
);
265 int size
= (strlenW(This
->headers
)+1)*sizeof(WCHAR
);
266 *pszAdditionalHeaders
= CoTaskMemAlloc(size
);
267 memcpy(*pszAdditionalHeaders
, This
->headers
, size
);
273 static HRESULT WINAPI
HttpNegotiate_OnResponse(IHttpNegotiate
*iface
,
274 DWORD dwResponseCode
, LPCWSTR szResponseHeaders
, LPCWSTR szRequestHeaders
,
275 LPWSTR
*pszAdditionalRequestHeaders
)
277 BindStatusCallback
*This
= HTTPNEG_THIS(iface
);
278 FIXME("(%p)->(%d %s %s %p)\n", This
, dwResponseCode
, debugstr_w(szResponseHeaders
),
279 debugstr_w(szRequestHeaders
), pszAdditionalRequestHeaders
);
285 static const IHttpNegotiateVtbl HttpNegotiateVtbl
= {
286 HttpNegotiate_QueryInterface
,
287 HttpNegotiate_AddRef
,
288 HttpNegotiate_Release
,
289 HttpNegotiate_BeginningTransaction
,
290 HttpNegotiate_OnResponse
293 static IBindStatusCallback
*create_callback(DocHost
*This
, PBYTE post_data
,
294 ULONG post_data_len
, LPWSTR headers
, VARIANT_BOOL
*cancel
)
296 BindStatusCallback
*ret
= heap_alloc(sizeof(BindStatusCallback
));
298 ret
->lpBindStatusCallbackVtbl
= &BindStatusCallbackVtbl
;
299 ret
->lpHttpNegotiateVtbl
= &HttpNegotiateVtbl
;
302 ret
->post_data
= NULL
;
303 ret
->post_data_len
= post_data_len
;
307 ret
->post_data
= GlobalAlloc(0, post_data_len
);
308 memcpy(ret
->post_data
, post_data
, post_data_len
);
312 int size
= (strlenW(headers
)+1)*sizeof(WCHAR
);
313 ret
->headers
= heap_alloc(size
);
314 memcpy(ret
->headers
, headers
, size
);
320 static void on_before_navigate2(DocHost
*This
, LPCWSTR url
, const BYTE
*post_data
,
321 ULONG post_data_len
, LPWSTR headers
, VARIANT_BOOL
*cancel
)
323 VARIANT var_url
, var_flags
, var_frame_name
, var_post_data
, var_post_data2
, var_headers
;
324 DISPPARAMS dispparams
;
325 VARIANTARG params
[7];
327 dispparams
.cArgs
= 7;
328 dispparams
.cNamedArgs
= 0;
329 dispparams
.rgdispidNamedArgs
= NULL
;
330 dispparams
.rgvarg
= params
;
332 V_VT(params
) = VT_BOOL
|VT_BYREF
;
333 V_BOOLREF(params
) = cancel
;
335 V_VT(params
+1) = (VT_BYREF
|VT_VARIANT
);
336 V_VARIANTREF(params
+1) = &var_headers
;
337 V_VT(&var_headers
) = VT_BSTR
;
338 V_BSTR(&var_headers
) = headers
;
340 V_VT(params
+2) = (VT_BYREF
|VT_VARIANT
);
341 V_VARIANTREF(params
+2) = &var_post_data2
;
342 V_VT(&var_post_data2
) = (VT_BYREF
|VT_VARIANT
);
343 V_VARIANTREF(&var_post_data2
) = &var_post_data
;
344 VariantInit(&var_post_data
);
347 SAFEARRAYBOUND bound
= {post_data_len
, 0};
350 V_VT(&var_post_data
) = VT_UI1
|VT_ARRAY
;
351 V_ARRAY(&var_post_data
) = SafeArrayCreate(VT_UI1
, 1, &bound
);
353 SafeArrayAccessData(V_ARRAY(&var_post_data
), &data
);
354 memcpy(data
, post_data
, post_data_len
);
355 SafeArrayUnaccessData(V_ARRAY(&var_post_data
));
358 V_VT(params
+3) = (VT_BYREF
|VT_VARIANT
);
359 V_VARIANTREF(params
+3) = &var_frame_name
;
360 V_VT(&var_frame_name
) = VT_BSTR
;
361 V_BSTR(&var_frame_name
) = NULL
;
363 V_VT(params
+4) = (VT_BYREF
|VT_VARIANT
);
364 V_VARIANTREF(params
+4) = &var_flags
;
365 V_VT(&var_flags
) = VT_I4
;
366 V_I4(&var_flags
) = 0;
368 V_VT(params
+5) = (VT_BYREF
|VT_VARIANT
);
369 V_VARIANTREF(params
+5) = &var_url
;
370 V_VT(&var_url
) = VT_BSTR
;
371 V_BSTR(&var_url
) = SysAllocString(url
);
373 V_VT(params
+6) = (VT_DISPATCH
);
374 V_DISPATCH(params
+6) = This
->disp
;
376 call_sink(This
->cps
.wbe2
, DISPID_BEFORENAVIGATE2
, &dispparams
);
378 SysFreeString(V_BSTR(&var_url
));
380 SafeArrayDestroy(V_ARRAY(&var_post_data
));
383 static BOOL
try_application_url(LPCWSTR url
)
385 SHELLEXECUTEINFOW exec_info
;
391 static const WCHAR wszURLProtocol
[] = {'U','R','L',' ','P','r','o','t','o','c','o','l',0};
393 hres
= CoInternetParseUrl(url
, PARSE_SCHEMA
, 0, app
, sizeof(app
)/sizeof(WCHAR
), NULL
, 0);
397 res
= RegOpenKeyW(HKEY_CLASSES_ROOT
, app
, &hkey
);
398 if(res
!= ERROR_SUCCESS
)
401 res
= RegQueryValueExW(hkey
, wszURLProtocol
, NULL
, &type
, NULL
, NULL
);
403 if(res
!= ERROR_SUCCESS
|| type
!= REG_SZ
)
406 TRACE("openning application %s\n", debugstr_w(app
));
408 memset(&exec_info
, 0, sizeof(exec_info
));
409 exec_info
.cbSize
= sizeof(exec_info
);
410 exec_info
.lpFile
= url
;
411 exec_info
.nShow
= SW_SHOW
;
413 return ShellExecuteExW(&exec_info
);
416 static HRESULT
navigate(DocHost
*This
, IMoniker
*mon
, IBindCtx
*bindctx
)
419 IPersistMoniker
*persist
;
420 VARIANT_BOOL cancel
= VARIANT_FALSE
;
428 IBindCtx_RegisterObjectParam(bindctx
, (LPOLESTR
)SZ_HTML_CLIENTSITE_OBJECTPARAM
,
429 (IUnknown
*)CLIENTSITE(This
));
433 * We should use URLMoniker's BindToObject instead creating HTMLDocument here.
434 * This should be fixed when mshtml.dll and urlmon.dll will be good enough.
438 deactivate_document(This
);
440 hres
= CoCreateInstance(&CLSID_HTMLDocument
, NULL
,
441 CLSCTX_INPROC_SERVER
|CLSCTX_INPROC_HANDLER
,
442 &IID_IUnknown
, (void**)&This
->document
);
445 ERR("Could not create HTMLDocument: %08x\n", hres
);
449 hres
= IUnknown_QueryInterface(This
->document
, &IID_IPersistMoniker
, (void**)&persist
);
454 IOleInPlaceFrame_EnableModeless(This
->frame
, FALSE
); /* FIXME */
456 hres
= IPersistMoniker_Load(persist
, FALSE
, mon
, bindctx
, 0);
457 IPersistMoniker_Release(persist
);
460 static const WCHAR empty
[] = {0};
462 IOleInPlaceFrame_SetStatusText(This
->frame
, empty
); /* FIXME */
463 IOleInPlaceFrame_EnableModeless(This
->frame
, TRUE
); /* FIXME */
467 WARN("Load failed: %08x\n", hres
);
471 hres
= IUnknown_QueryInterface(This
->document
, &IID_IOleObject
, (void**)&oleobj
);
475 hres
= IOleObject_SetClientSite(oleobj
, CLIENTSITE(This
));
476 IOleObject_Release(oleobj
);
478 PostMessageW(This
->hwnd
, WB_WM_NAVIGATE2
, 0, 0);
484 static HRESULT
bind_url_to_object(DocHost
*This
, LPCWSTR url
, PBYTE post_data
, ULONG post_data_len
,
487 IBindStatusCallback
*callback
;
490 VARIANT_BOOL cancel
= VARIANT_FALSE
;
494 create_doc_view_hwnd(This
);
496 hres
= CreateURLMoniker(NULL
, url
, &mon
);
498 WARN("CreateURLMoniker failed: %08x\n", hres
);
502 IMoniker_GetDisplayName(mon
, NULL
, NULL
, &This
->url
);
503 TRACE("navigating to %s\n", debugstr_w(This
->url
));
505 callback
= create_callback(This
, post_data
, post_data_len
, (LPWSTR
)headers
, &cancel
);
506 CreateAsyncBindCtx(0, callback
, 0, &bindctx
);
507 IBindStatusCallback_Release(callback
);
509 hres
= navigate(This
, mon
, bindctx
);
511 IBindCtx_Release(bindctx
);
512 IMoniker_Release(mon
);
517 HRESULT
navigate_url(DocHost
*This
, LPCWSTR url
, const VARIANT
*Flags
,
518 const VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
520 PBYTE post_data
= NULL
;
521 ULONG post_data_len
= 0;
522 LPWSTR headers
= NULL
;
525 TRACE("navigating to %s\n", debugstr_w(url
));
527 if((Flags
&& V_VT(Flags
) != VT_EMPTY
)
528 || (TargetFrameName
&& V_VT(TargetFrameName
) != VT_EMPTY
))
529 FIXME("Unsupported args (Flags %p:%d; TargetFrameName %p:%d)\n",
530 Flags
, Flags
? V_VT(Flags
) : -1, TargetFrameName
,
531 TargetFrameName
? V_VT(TargetFrameName
) : -1);
534 TRACE("PostData vt=%d\n", V_VT(PostData
));
536 if(V_VT(PostData
) == (VT_ARRAY
| VT_UI1
)) {
537 SafeArrayAccessData(V_ARRAY(PostData
), (void**)&post_data
);
538 post_data_len
= V_ARRAY(PostData
)->rgsabound
[0].cElements
;
542 if(Headers
&& V_VT(Headers
) != VT_EMPTY
&& V_VT(Headers
) != VT_ERROR
) {
543 if(V_VT(Headers
) != VT_BSTR
)
546 headers
= V_BSTR(Headers
);
547 TRACE("Headers: %s\n", debugstr_w(headers
));
550 hres
= bind_url_to_object(This
, url
, post_data
, post_data_len
, headers
);
553 SafeArrayUnaccessData(V_ARRAY(PostData
));
558 static HRESULT
navigate_hlink(DocHost
*This
, IMoniker
*mon
, IBindCtx
*bindctx
,
559 IBindStatusCallback
*callback
)
561 IHttpNegotiate
*http_negotiate
;
563 PBYTE post_data
= NULL
;
564 ULONG post_data_len
= 0;
565 LPWSTR headers
= NULL
;
566 VARIANT_BOOL cancel
= VARIANT_FALSE
;
571 IMoniker_GetDisplayName(mon
, NULL
, NULL
, &url
);
572 TRACE("navigating to %s\n", debugstr_w(url
));
574 hres
= IBindStatusCallback_QueryInterface(callback
, &IID_IHttpNegotiate
,
575 (void**)&http_negotiate
);
576 if(SUCCEEDED(hres
)) {
577 static const WCHAR null_string
[] = {0};
579 IHttpNegotiate_BeginningTransaction(http_negotiate
, null_string
, null_string
, 0,
581 IHttpNegotiate_Release(http_negotiate
);
584 memset(&bindinfo
, 0, sizeof(bindinfo
));
585 bindinfo
.cbSize
= sizeof(bindinfo
);
587 hres
= IBindStatusCallback_GetBindInfo(callback
, &bindf
, &bindinfo
);
588 dump_BINDINFO(&bindinfo
);
589 if(bindinfo
.dwBindVerb
== BINDVERB_POST
) {
590 post_data_len
= bindinfo
.cbstgmedData
;
592 post_data
= bindinfo
.stgmedData
.u
.hGlobal
;
595 on_before_navigate2(This
, url
, post_data
, post_data_len
, headers
, &cancel
);
597 CoTaskMemFree(headers
);
598 ReleaseBindInfo(&bindinfo
);
601 FIXME("navigation canceled\n");
606 /* FIXME: We should do it after BindToObject call */
607 if(try_application_url(url
))
612 return navigate(This
, mon
, bindctx
);
615 HRESULT
go_home(DocHost
*This
)
617 static const WCHAR wszAboutBlank
[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
621 return navigate_url(This
, wszAboutBlank
, NULL
, NULL
, NULL
, NULL
);
624 #define HLINKFRAME_THIS(iface) DEFINE_THIS(WebBrowser, HlinkFrame, iface)
626 static HRESULT WINAPI
HlinkFrame_QueryInterface(IHlinkFrame
*iface
, REFIID riid
, void **ppv
)
628 WebBrowser
*This
= HLINKFRAME_THIS(iface
);
629 return IWebBrowser2_QueryInterface(WEBBROWSER2(This
), riid
, ppv
);
632 static ULONG WINAPI
HlinkFrame_AddRef(IHlinkFrame
*iface
)
634 WebBrowser
*This
= HLINKFRAME_THIS(iface
);
635 return IWebBrowser2_AddRef(WEBBROWSER2(This
));
638 static ULONG WINAPI
HlinkFrame_Release(IHlinkFrame
*iface
)
640 WebBrowser
*This
= HLINKFRAME_THIS(iface
);
641 return IWebBrowser2_Release(WEBBROWSER2(This
));
644 static HRESULT WINAPI
HlinkFrame_SetBrowseContext(IHlinkFrame
*iface
,
645 IHlinkBrowseContext
*pihlbc
)
647 WebBrowser
*This
= HLINKFRAME_THIS(iface
);
648 FIXME("(%p)->(%p)\n", This
, pihlbc
);
652 static HRESULT WINAPI
HlinkFrame_GetBrowseContext(IHlinkFrame
*iface
,
653 IHlinkBrowseContext
**ppihlbc
)
655 WebBrowser
*This
= HLINKFRAME_THIS(iface
);
656 FIXME("(%p)->(%p)\n", This
, ppihlbc
);
660 static HRESULT WINAPI
HlinkFrame_Navigate(IHlinkFrame
*iface
, DWORD grfHLNF
, LPBC pbc
,
661 IBindStatusCallback
*pibsc
, IHlink
*pihlNavigate
)
663 WebBrowser
*This
= HLINKFRAME_THIS(iface
);
665 LPWSTR location
= NULL
;
667 TRACE("(%p)->(%08x %p %p %p)\n", This
, grfHLNF
, pbc
, pibsc
, pihlNavigate
);
670 FIXME("unsupported grfHLNF=%08x\n", grfHLNF
);
672 /* Windows calls GetTargetFrameName here. */
674 IHlink_GetMonikerReference(pihlNavigate
, 1, &mon
, &location
);
677 FIXME("location = %s\n", debugstr_w(location
));
678 CoTaskMemFree(location
);
681 /* Windows calls GetHlinkSite here */
683 if(grfHLNF
& HLNF_OPENINNEWWINDOW
) {
684 FIXME("Not supported HLNF_OPENINNEWWINDOW\n");
688 return navigate_hlink(&This
->doc_host
, mon
, pbc
, pibsc
);
691 static HRESULT WINAPI
HlinkFrame_OnNavigate(IHlinkFrame
*iface
, DWORD grfHLNF
,
692 IMoniker
*pimkTarget
, LPCWSTR pwzLocation
, LPCWSTR pwzFriendlyName
, DWORD dwreserved
)
694 WebBrowser
*This
= HLINKFRAME_THIS(iface
);
695 FIXME("(%p)->(%08x %p %s %s %d)\n", This
, grfHLNF
, pimkTarget
, debugstr_w(pwzLocation
),
696 debugstr_w(pwzFriendlyName
), dwreserved
);
700 static HRESULT WINAPI
HlinkFrame_UpdateHlink(IHlinkFrame
*iface
, ULONG uHLID
,
701 IMoniker
*pimkTarget
, LPCWSTR pwzLocation
, LPCWSTR pwzFriendlyName
)
703 WebBrowser
*This
= HLINKFRAME_THIS(iface
);
704 FIXME("(%p)->(%u %p %s %s)\n", This
, uHLID
, pimkTarget
, debugstr_w(pwzLocation
),
705 debugstr_w(pwzFriendlyName
));
709 #undef HLINKFRAME_THIS
711 static const IHlinkFrameVtbl HlinkFrameVtbl
= {
712 HlinkFrame_QueryInterface
,
715 HlinkFrame_SetBrowseContext
,
716 HlinkFrame_GetBrowseContext
,
718 HlinkFrame_OnNavigate
,
719 HlinkFrame_UpdateHlink
722 void WebBrowser_HlinkFrame_Init(WebBrowser
*This
)
724 This
->lpHlinkFrameVtbl
= &HlinkFrameVtbl
;