2 * Copyright 2006-2007 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
23 static const WCHAR emptyW
[] = {0};
26 IBindStatusCallback IBindStatusCallback_iface
;
27 IHttpNegotiate IHttpNegotiate_iface
;
28 IHttpSecurity IHttpSecurity_iface
;
41 static void dump_BINDINFO(BINDINFO
*bi
)
43 static const char * const BINDINFOF_str
[] = {
45 "BINDINFOF_URLENCODESTGMEDDATA",
46 "BINDINFOF_URLENCODEDEXTRAINFO"
49 static const char * const BINDVERB_str
[] = {
69 bi
->cbSize
, debugstr_w(bi
->szExtraInfo
),
70 bi
->stgmedData
.tymed
, bi
->stgmedData
.u
.hGlobal
, bi
->stgmedData
.pUnkForRelease
,
71 bi
->grfBindInfoF
> BINDINFOF_URLENCODEDEXTRAINFO
72 ? "unknown" : BINDINFOF_str
[bi
->grfBindInfoF
],
73 bi
->dwBindVerb
> BINDVERB_CUSTOM
74 ? "unknown" : BINDVERB_str
[bi
->dwBindVerb
],
75 debugstr_w(bi
->szCustomVerb
),
76 bi
->cbstgmedData
, bi
->dwOptions
, bi
->dwOptionsFlags
, bi
->dwCodePage
,
77 bi
->securityAttributes
.nLength
,
78 bi
->securityAttributes
.lpSecurityDescriptor
,
79 bi
->securityAttributes
.bInheritHandle
,
80 debugstr_guid(&bi
->iid
),
81 bi
->pUnk
, bi
->dwReserved
85 static void set_status_text(BindStatusCallback
*This
, ULONG statuscode
, LPCWSTR str
)
88 DISPPARAMS dispparams
= {&arg
, NULL
, 1, 0};
89 WCHAR fmt
[IDS_STATUSFMT_MAXLEN
];
90 WCHAR buffer
[IDS_STATUSFMT_MAXLEN
+ INTERNET_MAX_URL_LENGTH
];
95 TRACE("(%p, %d, %s)\n", This
, statuscode
, debugstr_w(str
));
97 if (statuscode
&& str
&& *str
) {
99 /* the format string must have one "%s" for the str */
100 LoadStringW(ieframe_instance
, IDS_STATUSFMT_FIRST
+ statuscode
, fmt
, IDS_STATUSFMT_MAXLEN
);
101 snprintfW(buffer
, sizeof(buffer
)/sizeof(WCHAR
), fmt
, str
);
104 V_VT(&arg
) = VT_BSTR
;
105 V_BSTR(&arg
) = str
? SysAllocString(buffer
) : NULL
;
106 TRACE("=> %s\n", debugstr_w(V_BSTR(&arg
)));
108 call_sink(This
->doc_host
->cps
.wbe2
, DISPID_STATUSTEXTCHANGE
, &dispparams
);
110 if(This
->doc_host
->frame
)
111 IOleInPlaceFrame_SetStatusText(This
->doc_host
->frame
, buffer
);
117 HRESULT
set_dochost_url(DocHost
*This
, const WCHAR
*url
)
122 new_url
= heap_strdupW(url
);
124 return E_OUTOFMEMORY
;
129 heap_free(This
->url
);
132 This
->container_vtbl
->SetURL(This
, This
->url
);
136 static inline BindStatusCallback
*impl_from_IBindStatusCallback(IBindStatusCallback
*iface
)
138 return CONTAINING_RECORD(iface
, BindStatusCallback
, IBindStatusCallback_iface
);
141 static HRESULT WINAPI
BindStatusCallback_QueryInterface(IBindStatusCallback
*iface
,
142 REFIID riid
, void **ppv
)
144 BindStatusCallback
*This
= impl_from_IBindStatusCallback(iface
);
146 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
147 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
148 *ppv
= &This
->IBindStatusCallback_iface
;
149 }else if(IsEqualGUID(&IID_IBindStatusCallback
, riid
)) {
150 TRACE("(%p)->(IID_IBindStatusCallback %p)\n", This
, ppv
);
151 *ppv
= &This
->IBindStatusCallback_iface
;
152 }else if(IsEqualGUID(&IID_IHttpNegotiate
, riid
)) {
153 TRACE("(%p)->(IID_IHttpNegotiate %p)\n", This
, ppv
);
154 *ppv
= &This
->IHttpNegotiate_iface
;
155 }else if(IsEqualGUID(&IID_IWindowForBindingUI
, riid
)) {
156 TRACE("(%p)->(IID_IWindowForBindingUI %p)\n", This
, ppv
);
157 *ppv
= &This
->IHttpSecurity_iface
;
158 }else if(IsEqualGUID(&IID_IHttpSecurity
, riid
)) {
159 TRACE("(%p)->(IID_IHttpSecurity %p)\n", This
, ppv
);
160 *ppv
= &This
->IHttpSecurity_iface
;
163 WARN("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
164 return E_NOINTERFACE
;
167 IUnknown_AddRef((IUnknown
*)*ppv
);
171 static ULONG WINAPI
BindStatusCallback_AddRef(IBindStatusCallback
*iface
)
173 BindStatusCallback
*This
= impl_from_IBindStatusCallback(iface
);
174 LONG ref
= InterlockedIncrement(&This
->ref
);
176 TRACE("(%p) ref=%d\n", This
, ref
);
181 static ULONG WINAPI
BindStatusCallback_Release(IBindStatusCallback
*iface
)
183 BindStatusCallback
*This
= impl_from_IBindStatusCallback(iface
);
184 LONG ref
= InterlockedDecrement(&This
->ref
);
186 TRACE("(%p) ref=%d\n", This
, ref
);
190 IOleClientSite_Release(&This
->doc_host
->IOleClientSite_iface
);
192 IBinding_Release(This
->binding
);
194 GlobalFree(This
->post_data
);
195 SysFreeString(This
->headers
);
196 SysFreeString(This
->url
);
203 static HRESULT WINAPI
BindStatusCallback_OnStartBinding(IBindStatusCallback
*iface
,
204 DWORD dwReserved
, IBinding
*pbind
)
206 BindStatusCallback
*This
= impl_from_IBindStatusCallback(iface
);
208 TRACE("(%p)->(%d %p)\n", This
, dwReserved
, pbind
);
210 This
->binding
= pbind
;
211 IBinding_AddRef(This
->binding
);
216 static HRESULT WINAPI
BindStatusCallback_GetPriority(IBindStatusCallback
*iface
,
219 BindStatusCallback
*This
= impl_from_IBindStatusCallback(iface
);
220 FIXME("(%p)->(%p)\n", This
, pnPriority
);
224 static HRESULT WINAPI
BindStatusCallback_OnLowResource(IBindStatusCallback
*iface
,
227 BindStatusCallback
*This
= impl_from_IBindStatusCallback(iface
);
228 FIXME("(%p)->(%d)\n", This
, reserved
);
232 static DWORD
get_http_status_code(IBinding
*binding
)
234 IWinInetHttpInfo
*http_info
;
235 DWORD status
, size
= sizeof(DWORD
);
238 hres
= IBinding_QueryInterface(binding
, &IID_IWinInetHttpInfo
, (void**)&http_info
);
240 return HTTP_STATUS_OK
;
242 hres
= IWinInetHttpInfo_QueryInfo(http_info
, HTTP_QUERY_STATUS_CODE
|HTTP_QUERY_FLAG_NUMBER
,
243 &status
, &size
, NULL
, NULL
);
244 IWinInetHttpInfo_Release(http_info
);
247 return HTTP_STATUS_OK
;
251 static HRESULT WINAPI
BindStatusCallback_OnProgress(IBindStatusCallback
*iface
,
252 ULONG ulProgress
, ULONG ulProgressMax
, ULONG ulStatusCode
, LPCWSTR szStatusText
)
254 BindStatusCallback
*This
= impl_from_IBindStatusCallback(iface
);
257 TRACE("(%p)->(%d %d %d %s)\n", This
, ulProgress
, ulProgressMax
, ulStatusCode
,
258 debugstr_w(szStatusText
));
260 switch(ulStatusCode
) {
261 case BINDSTATUS_REDIRECTING
:
262 return set_dochost_url(This
->doc_host
, szStatusText
);
263 case BINDSTATUS_BEGINDOWNLOADDATA
:
264 set_status_text(This
, ulStatusCode
, szStatusText
);
265 status_code
= get_http_status_code(This
->binding
);
266 if(status_code
!= HTTP_STATUS_OK
)
267 handle_navigation_error(This
->doc_host
, status_code
, This
->url
, NULL
);
270 case BINDSTATUS_FINDINGRESOURCE
:
271 case BINDSTATUS_ENDDOWNLOADDATA
:
272 case BINDSTATUS_SENDINGREQUEST
:
273 set_status_text(This
, ulStatusCode
, szStatusText
);
276 case BINDSTATUS_CONNECTING
:
277 case BINDSTATUS_CACHEFILENAMEAVAILABLE
:
278 case BINDSTATUS_CLASSIDAVAILABLE
:
279 case BINDSTATUS_MIMETYPEAVAILABLE
:
280 case BINDSTATUS_BEGINSYNCOPERATION
:
281 case BINDSTATUS_ENDSYNCOPERATION
:
284 FIXME("status code %u\n", ulStatusCode
);
290 void handle_navigation_error(DocHost
* doc_host
, HRESULT hres
, BSTR url
, IHTMLWindow2
*win2
)
292 VARIANT var_status_code
, var_frame_name
, var_url
;
293 DISPPARAMS dispparams
;
294 VARIANTARG params
[5];
295 VARIANT_BOOL cancel
= VARIANT_FALSE
;
297 dispparams
.cArgs
= 5;
298 dispparams
.cNamedArgs
= 0;
299 dispparams
.rgdispidNamedArgs
= NULL
;
300 dispparams
.rgvarg
= params
;
302 V_VT(params
) = VT_BOOL
|VT_BYREF
;
303 V_BOOLREF(params
) = &cancel
;
305 V_VT(params
+1) = VT_VARIANT
|VT_BYREF
;
306 V_VARIANTREF(params
+1) = &var_status_code
;
307 V_VT(&var_status_code
) = VT_I4
;
308 V_I4(&var_status_code
) = hres
;
310 V_VT(params
+2) = VT_VARIANT
|VT_BYREF
;
311 V_VARIANTREF(params
+2) = &var_frame_name
;
312 V_VT(&var_frame_name
) = VT_BSTR
;
314 hres
= IHTMLWindow2_get_name(win2
, &V_BSTR(&var_frame_name
));
316 V_BSTR(&var_frame_name
) = NULL
;
318 V_BSTR(&var_frame_name
) = NULL
;
320 V_VT(params
+3) = VT_VARIANT
|VT_BYREF
;
321 V_VARIANTREF(params
+3) = &var_url
;
322 V_VT(&var_url
) = VT_BSTR
;
323 V_BSTR(&var_url
) = url
;
325 V_VT(params
+4) = VT_DISPATCH
;
326 V_DISPATCH(params
+4) = (IDispatch
*)doc_host
->wb
;
328 call_sink(doc_host
->cps
.wbe2
, DISPID_NAVIGATEERROR
, &dispparams
);
329 SysFreeString(V_BSTR(&var_frame_name
));
332 FIXME("Navigate to error page\n");
335 static HRESULT WINAPI
BindStatusCallback_OnStopBinding(IBindStatusCallback
*iface
,
336 HRESULT hresult
, LPCWSTR szError
)
338 BindStatusCallback
*This
= impl_from_IBindStatusCallback(iface
);
340 TRACE("(%p)->(%08x %s)\n", This
, hresult
, debugstr_w(szError
));
342 set_status_text(This
, 0, emptyW
);
348 handle_navigation_error(This
->doc_host
, hresult
, This
->url
, NULL
);
350 IOleClientSite_Release(&This
->doc_host
->IOleClientSite_iface
);
351 This
->doc_host
= NULL
;
353 IBinding_Release(This
->binding
);
354 This
->binding
= NULL
;
359 static HRESULT WINAPI
BindStatusCallback_GetBindInfo(IBindStatusCallback
*iface
,
360 DWORD
*grfBINDF
, BINDINFO
*pbindinfo
)
362 BindStatusCallback
*This
= impl_from_IBindStatusCallback(iface
);
364 TRACE("(%p)->(%p %p)\n", This
, grfBINDF
, pbindinfo
);
366 *grfBINDF
= BINDF_ASYNCHRONOUS
;
368 if(This
->post_data
) {
369 pbindinfo
->dwBindVerb
= BINDVERB_POST
;
371 pbindinfo
->stgmedData
.tymed
= TYMED_HGLOBAL
;
372 pbindinfo
->stgmedData
.u
.hGlobal
= This
->post_data
;
373 pbindinfo
->cbstgmedData
= This
->post_data_len
;
374 pbindinfo
->stgmedData
.pUnkForRelease
= (IUnknown
*)&This
->IBindStatusCallback_iface
;
375 IBindStatusCallback_AddRef(&This
->IBindStatusCallback_iface
);
381 static HRESULT WINAPI
BindStatusCallback_OnDataAvailable(IBindStatusCallback
*iface
,
382 DWORD grfBSCF
, DWORD dwSize
, FORMATETC
*pformatetc
, STGMEDIUM
*pstgmed
)
384 BindStatusCallback
*This
= impl_from_IBindStatusCallback(iface
);
385 FIXME("(%p)->(%08x %d %p %p)\n", This
, grfBSCF
, dwSize
, pformatetc
, pstgmed
);
389 static HRESULT WINAPI
BindStatusCallback_OnObjectAvailable(IBindStatusCallback
*iface
,
390 REFIID riid
, IUnknown
*punk
)
392 BindStatusCallback
*This
= impl_from_IBindStatusCallback(iface
);
394 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), punk
);
396 return dochost_object_available(This
->doc_host
, punk
);
399 static const IBindStatusCallbackVtbl BindStatusCallbackVtbl
= {
400 BindStatusCallback_QueryInterface
,
401 BindStatusCallback_AddRef
,
402 BindStatusCallback_Release
,
403 BindStatusCallback_OnStartBinding
,
404 BindStatusCallback_GetPriority
,
405 BindStatusCallback_OnLowResource
,
406 BindStatusCallback_OnProgress
,
407 BindStatusCallback_OnStopBinding
,
408 BindStatusCallback_GetBindInfo
,
409 BindStatusCallback_OnDataAvailable
,
410 BindStatusCallback_OnObjectAvailable
413 static inline BindStatusCallback
*impl_from_IHttpNegotiate(IHttpNegotiate
*iface
)
415 return CONTAINING_RECORD(iface
, BindStatusCallback
, IHttpNegotiate_iface
);
418 static HRESULT WINAPI
HttpNegotiate_QueryInterface(IHttpNegotiate
*iface
,
419 REFIID riid
, void **ppv
)
421 BindStatusCallback
*This
= impl_from_IHttpNegotiate(iface
);
422 return IBindStatusCallback_QueryInterface(&This
->IBindStatusCallback_iface
, riid
, ppv
);
425 static ULONG WINAPI
HttpNegotiate_AddRef(IHttpNegotiate
*iface
)
427 BindStatusCallback
*This
= impl_from_IHttpNegotiate(iface
);
428 return IBindStatusCallback_AddRef(&This
->IBindStatusCallback_iface
);
431 static ULONG WINAPI
HttpNegotiate_Release(IHttpNegotiate
*iface
)
433 BindStatusCallback
*This
= impl_from_IHttpNegotiate(iface
);
434 return IBindStatusCallback_Release(&This
->IBindStatusCallback_iface
);
437 static HRESULT WINAPI
HttpNegotiate_BeginningTransaction(IHttpNegotiate
*iface
,
438 LPCWSTR szURL
, LPCWSTR szHeaders
, DWORD dwReserved
, LPWSTR
*pszAdditionalHeaders
)
440 BindStatusCallback
*This
= impl_from_IHttpNegotiate(iface
);
442 TRACE("(%p)->(%s %s %d %p)\n", This
, debugstr_w(szURL
), debugstr_w(szHeaders
),
443 dwReserved
, pszAdditionalHeaders
);
446 int size
= (strlenW(This
->headers
)+1)*sizeof(WCHAR
);
447 *pszAdditionalHeaders
= CoTaskMemAlloc(size
);
448 memcpy(*pszAdditionalHeaders
, This
->headers
, size
);
454 static HRESULT WINAPI
HttpNegotiate_OnResponse(IHttpNegotiate
*iface
,
455 DWORD dwResponseCode
, LPCWSTR szResponseHeaders
, LPCWSTR szRequestHeaders
,
456 LPWSTR
*pszAdditionalRequestHeaders
)
458 BindStatusCallback
*This
= impl_from_IHttpNegotiate(iface
);
459 TRACE("(%p)->(%d %s %s %p)\n", This
, dwResponseCode
, debugstr_w(szResponseHeaders
),
460 debugstr_w(szRequestHeaders
), pszAdditionalRequestHeaders
);
464 static const IHttpNegotiateVtbl HttpNegotiateVtbl
= {
465 HttpNegotiate_QueryInterface
,
466 HttpNegotiate_AddRef
,
467 HttpNegotiate_Release
,
468 HttpNegotiate_BeginningTransaction
,
469 HttpNegotiate_OnResponse
472 static inline BindStatusCallback
*impl_from_IHttpSecurity(IHttpSecurity
*iface
)
474 return CONTAINING_RECORD(iface
, BindStatusCallback
, IHttpSecurity_iface
);
477 static HRESULT WINAPI
HttpSecurity_QueryInterface(IHttpSecurity
*iface
, REFIID riid
, void **ppv
)
479 BindStatusCallback
*This
= impl_from_IHttpSecurity(iface
);
480 return IBindStatusCallback_QueryInterface(&This
->IBindStatusCallback_iface
, riid
, ppv
);
483 static ULONG WINAPI
HttpSecurity_AddRef(IHttpSecurity
*iface
)
485 BindStatusCallback
*This
= impl_from_IHttpSecurity(iface
);
486 return IBindStatusCallback_AddRef(&This
->IBindStatusCallback_iface
);
489 static ULONG WINAPI
HttpSecurity_Release(IHttpSecurity
*iface
)
491 BindStatusCallback
*This
= impl_from_IHttpSecurity(iface
);
492 return IBindStatusCallback_Release(&This
->IBindStatusCallback_iface
);
495 static HRESULT WINAPI
HttpSecurity_GetWindow(IHttpSecurity
*iface
, REFGUID rguidReason
, HWND
*phwnd
)
497 BindStatusCallback
*This
= impl_from_IHttpSecurity(iface
);
499 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(rguidReason
), phwnd
);
504 *phwnd
= This
->doc_host
->frame_hwnd
;
508 static HRESULT WINAPI
HttpSecurity_OnSecurityProblem(IHttpSecurity
*iface
, DWORD dwProblem
)
510 BindStatusCallback
*This
= impl_from_IHttpSecurity(iface
);
511 FIXME("(%p)->(%u)\n", This
, dwProblem
);
515 static const IHttpSecurityVtbl HttpSecurityVtbl
= {
516 HttpSecurity_QueryInterface
,
518 HttpSecurity_Release
,
519 HttpSecurity_GetWindow
,
520 HttpSecurity_OnSecurityProblem
523 static BindStatusCallback
*create_callback(DocHost
*doc_host
, LPCWSTR url
, PBYTE post_data
,
524 ULONG post_data_len
, LPCWSTR headers
)
526 BindStatusCallback
*ret
= heap_alloc(sizeof(BindStatusCallback
));
528 ret
->IBindStatusCallback_iface
.lpVtbl
= &BindStatusCallbackVtbl
;
529 ret
->IHttpNegotiate_iface
.lpVtbl
= &HttpNegotiateVtbl
;
530 ret
->IHttpSecurity_iface
.lpVtbl
= &HttpSecurityVtbl
;
533 ret
->url
= SysAllocString(url
);
534 ret
->post_data
= NULL
;
535 ret
->post_data_len
= post_data_len
;
536 ret
->headers
= headers
? SysAllocString(headers
) : NULL
;
538 ret
->doc_host
= doc_host
;
539 IOleClientSite_AddRef(&doc_host
->IOleClientSite_iface
);
544 ret
->post_data
= GlobalAlloc(0, post_data_len
);
545 memcpy(ret
->post_data
, post_data
, post_data_len
);
551 static void on_before_navigate2(DocHost
*This
, LPCWSTR url
, SAFEARRAY
*post_data
, LPWSTR headers
, VARIANT_BOOL
*cancel
)
553 VARIANT var_url
, var_flags
, var_frame_name
, var_post_data
, var_post_data2
, var_headers
;
554 DISPPARAMS dispparams
;
555 VARIANTARG params
[7];
556 WCHAR file_path
[MAX_PATH
];
557 DWORD file_path_len
= sizeof(file_path
) / sizeof(*file_path
);
559 dispparams
.cArgs
= 7;
560 dispparams
.cNamedArgs
= 0;
561 dispparams
.rgdispidNamedArgs
= NULL
;
562 dispparams
.rgvarg
= params
;
564 This
->busy
= VARIANT_TRUE
;
566 V_VT(params
) = VT_BOOL
|VT_BYREF
;
567 V_BOOLREF(params
) = cancel
;
569 V_VT(params
+1) = (VT_BYREF
|VT_VARIANT
);
570 V_VARIANTREF(params
+1) = &var_headers
;
571 V_VT(&var_headers
) = VT_BSTR
;
572 V_BSTR(&var_headers
) = headers
;
574 V_VT(params
+2) = (VT_BYREF
|VT_VARIANT
);
575 V_VARIANTREF(params
+2) = &var_post_data2
;
576 V_VT(&var_post_data2
) = (VT_BYREF
|VT_VARIANT
);
577 V_VARIANTREF(&var_post_data2
) = &var_post_data
;
580 V_VT(&var_post_data
) = VT_UI1
|VT_ARRAY
;
581 V_ARRAY(&var_post_data
) = post_data
;
583 V_VT(&var_post_data
) = VT_EMPTY
;
586 V_VT(params
+3) = (VT_BYREF
|VT_VARIANT
);
587 V_VARIANTREF(params
+3) = &var_frame_name
;
588 V_VT(&var_frame_name
) = VT_BSTR
;
589 V_BSTR(&var_frame_name
) = NULL
;
591 V_VT(params
+4) = (VT_BYREF
|VT_VARIANT
);
592 V_VARIANTREF(params
+4) = &var_flags
;
593 V_VT(&var_flags
) = VT_I4
;
594 V_I4(&var_flags
) = 0;
596 V_VT(params
+5) = (VT_BYREF
|VT_VARIANT
);
597 V_VARIANTREF(params
+5) = &var_url
;
598 V_VT(&var_url
) = VT_BSTR
;
599 if(PathCreateFromUrlW(url
, file_path
, &file_path_len
, 0) == S_OK
)
600 V_BSTR(&var_url
) = SysAllocString(file_path
);
602 V_BSTR(&var_url
) = SysAllocString(url
);
604 V_VT(params
+6) = (VT_DISPATCH
);
605 V_DISPATCH(params
+6) = (IDispatch
*)This
->wb
;
607 call_sink(This
->cps
.wbe2
, DISPID_BEFORENAVIGATE2
, &dispparams
);
609 SysFreeString(V_BSTR(&var_url
));
612 /* FIXME: urlmon should handle it */
613 static BOOL
try_application_url(LPCWSTR url
)
615 SHELLEXECUTEINFOW exec_info
;
621 static const WCHAR wszURLProtocol
[] = {'U','R','L',' ','P','r','o','t','o','c','o','l',0};
623 hres
= CoInternetParseUrl(url
, PARSE_SCHEMA
, 0, app
, sizeof(app
)/sizeof(WCHAR
), NULL
, 0);
627 res
= RegOpenKeyW(HKEY_CLASSES_ROOT
, app
, &hkey
);
628 if(res
!= ERROR_SUCCESS
)
631 res
= RegQueryValueExW(hkey
, wszURLProtocol
, NULL
, &type
, NULL
, NULL
);
633 if(res
!= ERROR_SUCCESS
|| type
!= REG_SZ
)
636 TRACE("opening application %s\n", debugstr_w(app
));
638 memset(&exec_info
, 0, sizeof(exec_info
));
639 exec_info
.cbSize
= sizeof(exec_info
);
640 exec_info
.lpFile
= url
;
641 exec_info
.nShow
= SW_SHOW
;
643 return ShellExecuteExW(&exec_info
);
646 static HRESULT
create_moniker(LPCWSTR url
, IMoniker
**mon
)
648 WCHAR new_url
[INTERNET_MAX_URL_LENGTH
];
653 return CreateURLMoniker(NULL
, url
, mon
);
655 size
= sizeof(new_url
)/sizeof(WCHAR
);
656 hres
= UrlApplySchemeW(url
, new_url
, &size
, URL_APPLY_GUESSSCHEME
| URL_APPLY_GUESSFILE
| URL_APPLY_DEFAULT
);
657 TRACE("was %s got %s\n", debugstr_w(url
), debugstr_w(new_url
));
659 WARN("UrlApplyScheme failed: %08x\n", hres
);
663 return CreateURLMoniker(NULL
, new_url
, mon
);
666 static HRESULT
bind_to_object(DocHost
*This
, IMoniker
*mon
, LPCWSTR url
, IBindCtx
*bindctx
,
667 IBindStatusCallback
*callback
)
669 IUnknown
*unk
= NULL
;
674 IMoniker_AddRef(mon
);
676 hres
= create_moniker(url
, &mon
);
681 hres
= IMoniker_GetDisplayName(mon
, 0, NULL
, &display_name
);
683 FIXME("GetDisplayName failed: %08x\n", hres
);
687 hres
= set_dochost_url(This
, display_name
);
688 CoTaskMemFree(display_name
);
692 IBindCtx_RegisterObjectParam(bindctx
, (LPOLESTR
)SZ_HTML_CLIENTSITE_OBJECTPARAM
,
693 (IUnknown
*)&This
->IOleClientSite_iface
);
695 hres
= IMoniker_BindToObject(mon
, bindctx
, NULL
, &IID_IUnknown
, (void**)&unk
);
696 if(SUCCEEDED(hres
)) {
699 IUnknown_Release(unk
);
700 }else if(try_application_url(url
)) {
703 FIXME("BindToObject failed: %08x\n", hres
);
706 IMoniker_Release(mon
);
710 static void html_window_navigate(DocHost
*This
, IHTMLPrivateWindow
*window
, BSTR url
, BSTR headers
, SAFEARRAY
*post_data
)
712 VARIANT headers_var
, post_data_var
;
716 hres
= set_dochost_url(This
, url
);
720 empty_str
= SysAllocStringLen(NULL
, 0);
723 V_VT(&headers_var
) = VT_BSTR
;
724 V_BSTR(&headers_var
) = headers
;
726 V_VT(&headers_var
) = VT_EMPTY
;
730 V_VT(&post_data_var
) = VT_UI1
|VT_ARRAY
;
731 V_ARRAY(&post_data_var
) = post_data
;
733 V_VT(&post_data_var
) = VT_EMPTY
;
736 set_doc_state(This
, READYSTATE_LOADING
);
737 hres
= IHTMLPrivateWindow_SuperNavigate(window
, url
, empty_str
, NULL
, NULL
, &post_data_var
, &headers_var
, 0);
738 SysFreeString(empty_str
);
740 WARN("SuprtNavigate failed: %08x\n", hres
);
744 task_header_t header
;
747 SAFEARRAY
*post_data
;
749 } task_doc_navigate_t
;
751 static void doc_navigate_task_destr(task_header_t
*t
)
753 task_doc_navigate_t
*task
= (task_doc_navigate_t
*)t
;
755 SysFreeString(task
->url
);
756 SysFreeString(task
->headers
);
758 SafeArrayDestroy(task
->post_data
);
762 static void doc_navigate_proc(DocHost
*This
, task_header_t
*t
)
764 task_doc_navigate_t
*task
= (task_doc_navigate_t
*)t
;
765 IHTMLPrivateWindow
*priv_window
;
768 if(!This
->doc_navigate
) {
773 if(task
->async_notif
) {
774 VARIANT_BOOL cancel
= VARIANT_FALSE
;
775 on_before_navigate2(This
, task
->url
, task
->post_data
, task
->headers
, &cancel
);
777 TRACE("Navigation canceled\n");
782 hres
= IUnknown_QueryInterface(This
->doc_navigate
, &IID_IHTMLPrivateWindow
, (void**)&priv_window
);
783 if(SUCCEEDED(hres
)) {
784 html_window_navigate(This
, priv_window
, task
->url
, task
->headers
, task
->post_data
);
785 IHTMLPrivateWindow_Release(priv_window
);
787 WARN("Could not get IHTMLPrivateWindow iface: %08x\n", hres
);
791 static HRESULT
async_doc_navigate(DocHost
*This
, LPCWSTR url
, LPCWSTR headers
, PBYTE post_data
, ULONG post_data_size
,
794 task_doc_navigate_t
*task
;
796 TRACE("%s\n", debugstr_w(url
));
798 task
= heap_alloc_zero(sizeof(*task
));
800 return E_OUTOFMEMORY
;
802 task
->url
= SysAllocString(url
);
804 doc_navigate_task_destr(&task
->header
);
805 return E_OUTOFMEMORY
;
809 task
->headers
= SysAllocString(headers
);
811 doc_navigate_task_destr(&task
->header
);
812 return E_OUTOFMEMORY
;
817 task
->post_data
= SafeArrayCreateVector(VT_UI1
, 0, post_data_size
);
818 if(!task
->post_data
) {
819 doc_navigate_task_destr(&task
->header
);
820 return E_OUTOFMEMORY
;
823 memcpy(task
->post_data
->pvData
, post_data
, post_data_size
);
827 VARIANT_BOOL cancel
= VARIANT_FALSE
;
829 on_before_navigate2(This
, task
->url
, task
->post_data
, task
->headers
, &cancel
);
831 TRACE("Navigation canceled\n");
832 doc_navigate_task_destr(&task
->header
);
837 task
->async_notif
= async_notif
;
838 abort_dochost_tasks(This
, doc_navigate_proc
);
839 push_dochost_task(This
, &task
->header
, doc_navigate_proc
, doc_navigate_task_destr
, FALSE
);
843 static HRESULT
navigate_bsc(DocHost
*This
, BindStatusCallback
*bsc
, IMoniker
*mon
)
845 VARIANT_BOOL cancel
= VARIANT_FALSE
;
846 SAFEARRAY
*post_data
= NULL
;
850 set_doc_state(This
, READYSTATE_LOADING
);
853 post_data
= SafeArrayCreateVector(VT_UI1
, 0, bsc
->post_data_len
);
854 memcpy(post_data
->pvData
, post_data
, bsc
->post_data_len
);
857 on_before_navigate2(This
, bsc
->url
, post_data
, bsc
->headers
, &cancel
);
859 SafeArrayDestroy(post_data
);
861 FIXME("Navigation canceled\n");
866 deactivate_document(This
);
868 CreateAsyncBindCtx(0, &bsc
->IBindStatusCallback_iface
, 0, &bindctx
);
871 IOleInPlaceFrame_EnableModeless(This
->frame
, FALSE
);
873 hres
= bind_to_object(This
, mon
, bsc
->url
, bindctx
, &bsc
->IBindStatusCallback_iface
);
876 IOleInPlaceFrame_EnableModeless(This
->frame
, TRUE
);
878 IBindCtx_Release(bindctx
);
884 task_header_t header
;
885 BindStatusCallback
*bsc
;
886 } task_navigate_bsc_t
;
888 static void navigate_bsc_task_destr(task_header_t
*t
)
890 task_navigate_bsc_t
*task
= (task_navigate_bsc_t
*)t
;
892 IBindStatusCallback_Release(&task
->bsc
->IBindStatusCallback_iface
);
896 static void navigate_bsc_proc(DocHost
*This
, task_header_t
*t
)
898 task_navigate_bsc_t
*task
= (task_navigate_bsc_t
*)t
;
901 create_doc_view_hwnd(This
);
903 navigate_bsc(This
, task
->bsc
, NULL
);
907 HRESULT
navigate_url(DocHost
*This
, LPCWSTR url
, const VARIANT
*Flags
,
908 const VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
910 PBYTE post_data
= NULL
;
911 ULONG post_data_len
= 0;
912 LPWSTR headers
= NULL
;
915 TRACE("navigating to %s\n", debugstr_w(url
));
917 if((Flags
&& V_VT(Flags
) != VT_EMPTY
&& V_VT(Flags
) != VT_ERROR
)
918 || (TargetFrameName
&& V_VT(TargetFrameName
) != VT_EMPTY
&& V_VT(TargetFrameName
) != VT_ERROR
))
919 FIXME("Unsupported args (Flags %s; TargetFrameName %s)\n", debugstr_variant(Flags
), debugstr_variant(TargetFrameName
));
921 if(PostData
&& V_VT(PostData
) == (VT_ARRAY
| VT_UI1
) && V_ARRAY(PostData
)) {
922 SafeArrayAccessData(V_ARRAY(PostData
), (void**)&post_data
);
923 post_data_len
= V_ARRAY(PostData
)->rgsabound
[0].cElements
;
926 if(Headers
&& V_VT(Headers
) == VT_BSTR
) {
927 headers
= V_BSTR(Headers
);
928 TRACE("Headers: %s\n", debugstr_w(headers
));
931 set_doc_state(This
, READYSTATE_LOADING
);
932 This
->ready_state
= READYSTATE_LOADING
;
934 if(This
->doc_navigate
) {
935 WCHAR new_url
[INTERNET_MAX_URL_LENGTH
];
937 if(PathIsURLW(url
)) {
942 size
= sizeof(new_url
)/sizeof(WCHAR
);
943 hres
= UrlApplySchemeW(url
, new_url
, &size
,
944 URL_APPLY_GUESSSCHEME
| URL_APPLY_GUESSFILE
| URL_APPLY_DEFAULT
);
946 WARN("UrlApplyScheme failed: %08x\n", hres
);
951 hres
= async_doc_navigate(This
, *new_url
? new_url
: url
, headers
, post_data
,
952 post_data_len
, TRUE
);
954 task_navigate_bsc_t
*task
;
956 task
= heap_alloc(sizeof(*task
));
957 task
->bsc
= create_callback(This
, url
, post_data
, post_data_len
, headers
);
958 push_dochost_task(This
, &task
->header
, navigate_bsc_proc
, navigate_bsc_task_destr
, This
->url
== NULL
);
962 SafeArrayUnaccessData(V_ARRAY(PostData
));
967 static HRESULT
navigate_hlink(DocHost
*This
, IMoniker
*mon
, IBindCtx
*bindctx
,
968 IBindStatusCallback
*callback
)
970 IHttpNegotiate
*http_negotiate
;
971 BindStatusCallback
*bsc
;
972 PBYTE post_data
= NULL
;
973 ULONG post_data_len
= 0;
974 LPWSTR headers
= NULL
, url
;
981 hres
= IMoniker_GetDisplayName(mon
, 0, NULL
, &url
);
983 FIXME("GetDisplayName failed: %08x\n", hres
);
985 hres
= IBindStatusCallback_QueryInterface(callback
, &IID_IHttpNegotiate
,
986 (void**)&http_negotiate
);
987 if(SUCCEEDED(hres
)) {
988 static const WCHAR null_string
[] = {0};
990 IHttpNegotiate_BeginningTransaction(http_negotiate
, null_string
, null_string
, 0,
992 IHttpNegotiate_Release(http_negotiate
);
995 memset(&bindinfo
, 0, sizeof(bindinfo
));
996 bindinfo
.cbSize
= sizeof(bindinfo
);
998 hres
= IBindStatusCallback_GetBindInfo(callback
, &bindf
, &bindinfo
);
999 dump_BINDINFO(&bindinfo
);
1000 if(bindinfo
.dwBindVerb
== BINDVERB_POST
) {
1001 post_data_len
= bindinfo
.cbstgmedData
;
1003 post_data
= bindinfo
.stgmedData
.u
.hGlobal
;
1006 if(This
->doc_navigate
) {
1007 hres
= async_doc_navigate(This
, url
, headers
, post_data
, post_data_len
, FALSE
);
1009 bsc
= create_callback(This
, url
, post_data
, post_data_len
, headers
);
1010 hres
= navigate_bsc(This
, bsc
, mon
);
1011 IBindStatusCallback_Release(&bsc
->IBindStatusCallback_iface
);
1015 CoTaskMemFree(headers
);
1016 ReleaseBindInfo(&bindinfo
);
1021 HRESULT
go_home(DocHost
*This
)
1024 DWORD res
, type
, size
;
1025 WCHAR wszPageName
[MAX_PATH
];
1026 static const WCHAR wszAboutBlank
[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
1027 static const WCHAR wszStartPage
[] = {'S','t','a','r','t',' ','P','a','g','e',0};
1028 static const WCHAR wszSubKey
[] = {'S','o','f','t','w','a','r','e','\\',
1029 'M','i','c','r','o','s','o','f','t','\\',
1030 'I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r','\\',
1033 res
= RegOpenKeyW(HKEY_CURRENT_USER
, wszSubKey
, &hkey
);
1034 if (res
!= ERROR_SUCCESS
)
1035 return navigate_url(This
, wszAboutBlank
, NULL
, NULL
, NULL
, NULL
);
1037 size
= sizeof(wszPageName
);
1038 res
= RegQueryValueExW(hkey
, wszStartPage
, NULL
, &type
, (LPBYTE
)wszPageName
, &size
);
1040 if (res
!= ERROR_SUCCESS
|| type
!= REG_SZ
)
1041 return navigate_url(This
, wszAboutBlank
, NULL
, NULL
, NULL
, NULL
);
1043 return navigate_url(This
, wszPageName
, NULL
, NULL
, NULL
, NULL
);
1046 static HRESULT
navigate_history(DocHost
*This
, unsigned travellog_pos
)
1048 IPersistHistory
*persist_history
;
1049 travellog_entry_t
*entry
;
1053 if(!This
->doc_navigate
) {
1054 FIXME("unsupported doc_navigate FALSE\n");
1058 This
->travellog
.loading_pos
= travellog_pos
;
1059 entry
= This
->travellog
.log
+ This
->travellog
.loading_pos
;
1062 return async_doc_navigate(This
, entry
->url
, NULL
, NULL
, 0, FALSE
);
1064 hres
= IUnknown_QueryInterface(This
->document
, &IID_IPersistHistory
, (void**)&persist_history
);
1069 IStream_Seek(entry
->stream
, li
, STREAM_SEEK_SET
, NULL
);
1071 hres
= IPersistHistory_LoadHistory(persist_history
, entry
->stream
, NULL
);
1072 IPersistHistory_Release(persist_history
);
1076 HRESULT
go_back(DocHost
*This
)
1078 if(!This
->travellog
.position
) {
1079 WARN("No history available\n");
1083 return navigate_history(This
, This
->travellog
.position
-1);
1086 HRESULT
go_forward(DocHost
*This
)
1088 if(This
->travellog
.position
>= This
->travellog
.length
) {
1089 WARN("No history available\n");
1093 return navigate_history(This
, This
->travellog
.position
+1);
1096 HRESULT
get_location_url(DocHost
*This
, BSTR
*ret
)
1098 FIXME("semi-stub\n");
1100 *ret
= This
->url
? SysAllocString(This
->url
) : SysAllocStringLen(NULL
, 0);
1102 return E_OUTOFMEMORY
;
1104 return This
->url
? S_OK
: S_FALSE
;
1107 static inline HlinkFrame
*impl_from_IHlinkFrame(IHlinkFrame
*iface
)
1109 return CONTAINING_RECORD(iface
, HlinkFrame
, IHlinkFrame_iface
);
1112 static HRESULT WINAPI
HlinkFrame_QueryInterface(IHlinkFrame
*iface
, REFIID riid
, void **ppv
)
1114 HlinkFrame
*This
= impl_from_IHlinkFrame(iface
);
1115 return IUnknown_QueryInterface(This
->outer
, riid
, ppv
);
1118 static ULONG WINAPI
HlinkFrame_AddRef(IHlinkFrame
*iface
)
1120 HlinkFrame
*This
= impl_from_IHlinkFrame(iface
);
1121 return IUnknown_AddRef(This
->outer
);
1124 static ULONG WINAPI
HlinkFrame_Release(IHlinkFrame
*iface
)
1126 HlinkFrame
*This
= impl_from_IHlinkFrame(iface
);
1127 return IUnknown_Release(This
->outer
);
1130 static HRESULT WINAPI
HlinkFrame_SetBrowseContext(IHlinkFrame
*iface
,
1131 IHlinkBrowseContext
*pihlbc
)
1133 HlinkFrame
*This
= impl_from_IHlinkFrame(iface
);
1134 FIXME("(%p)->(%p)\n", This
, pihlbc
);
1138 static HRESULT WINAPI
HlinkFrame_GetBrowseContext(IHlinkFrame
*iface
,
1139 IHlinkBrowseContext
**ppihlbc
)
1141 HlinkFrame
*This
= impl_from_IHlinkFrame(iface
);
1142 FIXME("(%p)->(%p)\n", This
, ppihlbc
);
1146 static HRESULT WINAPI
HlinkFrame_Navigate(IHlinkFrame
*iface
, DWORD grfHLNF
, LPBC pbc
,
1147 IBindStatusCallback
*pibsc
, IHlink
*pihlNavigate
)
1149 HlinkFrame
*This
= impl_from_IHlinkFrame(iface
);
1151 LPWSTR location
= NULL
;
1153 TRACE("(%p)->(%08x %p %p %p)\n", This
, grfHLNF
, pbc
, pibsc
, pihlNavigate
);
1156 FIXME("unsupported grfHLNF=%08x\n", grfHLNF
);
1158 /* Windows calls GetTargetFrameName here. */
1160 IHlink_GetMonikerReference(pihlNavigate
, 1, &mon
, &location
);
1163 FIXME("location = %s\n", debugstr_w(location
));
1164 CoTaskMemFree(location
);
1167 /* Windows calls GetHlinkSite here */
1169 if(grfHLNF
& HLNF_OPENINNEWWINDOW
) {
1170 FIXME("Not supported HLNF_OPENINNEWWINDOW\n");
1174 return navigate_hlink(This
->doc_host
, mon
, pbc
, pibsc
);
1177 static HRESULT WINAPI
HlinkFrame_OnNavigate(IHlinkFrame
*iface
, DWORD grfHLNF
,
1178 IMoniker
*pimkTarget
, LPCWSTR pwzLocation
, LPCWSTR pwzFriendlyName
, DWORD dwreserved
)
1180 HlinkFrame
*This
= impl_from_IHlinkFrame(iface
);
1181 FIXME("(%p)->(%08x %p %s %s %d)\n", This
, grfHLNF
, pimkTarget
, debugstr_w(pwzLocation
),
1182 debugstr_w(pwzFriendlyName
), dwreserved
);
1186 static HRESULT WINAPI
HlinkFrame_UpdateHlink(IHlinkFrame
*iface
, ULONG uHLID
,
1187 IMoniker
*pimkTarget
, LPCWSTR pwzLocation
, LPCWSTR pwzFriendlyName
)
1189 HlinkFrame
*This
= impl_from_IHlinkFrame(iface
);
1190 FIXME("(%p)->(%u %p %s %s)\n", This
, uHLID
, pimkTarget
, debugstr_w(pwzLocation
),
1191 debugstr_w(pwzFriendlyName
));
1195 static const IHlinkFrameVtbl HlinkFrameVtbl
= {
1196 HlinkFrame_QueryInterface
,
1199 HlinkFrame_SetBrowseContext
,
1200 HlinkFrame_GetBrowseContext
,
1201 HlinkFrame_Navigate
,
1202 HlinkFrame_OnNavigate
,
1203 HlinkFrame_UpdateHlink
1206 static inline HlinkFrame
*impl_from_ITargetFrame2(ITargetFrame2
*iface
)
1208 return CONTAINING_RECORD(iface
, HlinkFrame
, IHlinkFrame_iface
);
1211 static HRESULT WINAPI
TargetFrame2_QueryInterface(ITargetFrame2
*iface
, REFIID riid
, void **ppv
)
1213 HlinkFrame
*This
= impl_from_ITargetFrame2(iface
);
1214 return IUnknown_QueryInterface(This
->outer
, riid
, ppv
);
1217 static ULONG WINAPI
TargetFrame2_AddRef(ITargetFrame2
*iface
)
1219 HlinkFrame
*This
= impl_from_ITargetFrame2(iface
);
1220 return IUnknown_AddRef(This
->outer
);
1223 static ULONG WINAPI
TargetFrame2_Release(ITargetFrame2
*iface
)
1225 HlinkFrame
*This
= impl_from_ITargetFrame2(iface
);
1226 return IUnknown_Release(This
->outer
);
1229 static HRESULT WINAPI
TargetFrame2_SetFrameName(ITargetFrame2
*iface
, LPCWSTR pszFrameName
)
1231 HlinkFrame
*This
= impl_from_ITargetFrame2(iface
);
1232 FIXME("(%p)->(%s)\n", This
, debugstr_w(pszFrameName
));
1236 static HRESULT WINAPI
TargetFrame2_GetFrameName(ITargetFrame2
*iface
, LPWSTR
*ppszFrameName
)
1238 HlinkFrame
*This
= impl_from_ITargetFrame2(iface
);
1239 FIXME("(%p)->(%p)\n", This
, ppszFrameName
);
1243 static HRESULT WINAPI
TargetFrame2_GetParentFrame(ITargetFrame2
*iface
, IUnknown
**ppunkParent
)
1245 HlinkFrame
*This
= impl_from_ITargetFrame2(iface
);
1246 FIXME("(%p)->(%p)\n", This
, ppunkParent
);
1250 static HRESULT WINAPI
TargetFrame2_SetFrameSrc(ITargetFrame2
*iface
, LPCWSTR pszFrameSrc
)
1252 HlinkFrame
*This
= impl_from_ITargetFrame2(iface
);
1253 FIXME("(%p)->(%s)\n", This
, debugstr_w(pszFrameSrc
));
1257 static HRESULT WINAPI
TargetFrame2_GetFrameSrc(ITargetFrame2
*iface
, LPWSTR
*ppszFrameSrc
)
1259 HlinkFrame
*This
= impl_from_ITargetFrame2(iface
);
1260 FIXME("(%p)->()\n", This
);
1264 static HRESULT WINAPI
TargetFrame2_GetFramesContainer(ITargetFrame2
*iface
, IOleContainer
**ppContainer
)
1266 HlinkFrame
*This
= impl_from_ITargetFrame2(iface
);
1267 FIXME("(%p)->(%p)\n", This
, ppContainer
);
1271 static HRESULT WINAPI
TargetFrame2_SetFrameOptions(ITargetFrame2
*iface
, DWORD dwFlags
)
1273 HlinkFrame
*This
= impl_from_ITargetFrame2(iface
);
1274 FIXME("(%p)->(%x)\n", This
, dwFlags
);
1278 static HRESULT WINAPI
TargetFrame2_GetFrameOptions(ITargetFrame2
*iface
, DWORD
*pdwFlags
)
1280 HlinkFrame
*This
= impl_from_ITargetFrame2(iface
);
1281 FIXME("(%p)->(%p)\n", This
, pdwFlags
);
1285 static HRESULT WINAPI
TargetFrame2_SetFrameMargins(ITargetFrame2
*iface
, DWORD dwWidth
, DWORD dwHeight
)
1287 HlinkFrame
*This
= impl_from_ITargetFrame2(iface
);
1288 FIXME("(%p)->(%d %d)\n", This
, dwWidth
, dwHeight
);
1292 static HRESULT WINAPI
TargetFrame2_GetFrameMargins(ITargetFrame2
*iface
, DWORD
*pdwWidth
, DWORD
*pdwHeight
)
1294 HlinkFrame
*This
= impl_from_ITargetFrame2(iface
);
1295 FIXME("(%p)->(%p %p)\n", This
, pdwWidth
, pdwHeight
);
1299 static HRESULT WINAPI
TargetFrame2_FindFrame(ITargetFrame2
*iface
, LPCWSTR pszTargetName
, DWORD dwFlags
, IUnknown
**ppunkTargetFrame
)
1301 HlinkFrame
*This
= impl_from_ITargetFrame2(iface
);
1302 FIXME("(%p)->(%s %x %p)\n", This
, debugstr_w(pszTargetName
), dwFlags
, ppunkTargetFrame
);
1306 static HRESULT WINAPI
TargetFrame2_GetTargetAlias(ITargetFrame2
*iface
, LPCWSTR pszTargetName
, LPWSTR
*ppszTargetAlias
)
1308 HlinkFrame
*This
= impl_from_ITargetFrame2(iface
);
1309 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(pszTargetName
), ppszTargetAlias
);
1313 static const ITargetFrame2Vtbl TargetFrame2Vtbl
= {
1314 TargetFrame2_QueryInterface
,
1315 TargetFrame2_AddRef
,
1316 TargetFrame2_Release
,
1317 TargetFrame2_SetFrameName
,
1318 TargetFrame2_GetFrameName
,
1319 TargetFrame2_GetParentFrame
,
1320 TargetFrame2_SetFrameSrc
,
1321 TargetFrame2_GetFrameSrc
,
1322 TargetFrame2_GetFramesContainer
,
1323 TargetFrame2_SetFrameOptions
,
1324 TargetFrame2_GetFrameOptions
,
1325 TargetFrame2_SetFrameMargins
,
1326 TargetFrame2_GetFrameMargins
,
1327 TargetFrame2_FindFrame
,
1328 TargetFrame2_GetTargetAlias
1331 static inline HlinkFrame
*impl_from_ITargetFramePriv2(ITargetFramePriv2
*iface
)
1333 return CONTAINING_RECORD(iface
, HlinkFrame
, ITargetFramePriv2_iface
);
1336 static HRESULT WINAPI
TargetFramePriv2_QueryInterface(ITargetFramePriv2
*iface
, REFIID riid
, void **ppv
)
1338 HlinkFrame
*This
= impl_from_ITargetFramePriv2(iface
);
1339 return IUnknown_QueryInterface(This
->outer
, riid
, ppv
);
1342 static ULONG WINAPI
TargetFramePriv2_AddRef(ITargetFramePriv2
*iface
)
1344 HlinkFrame
*This
= impl_from_ITargetFramePriv2(iface
);
1345 return IUnknown_AddRef(This
->outer
);
1348 static ULONG WINAPI
TargetFramePriv2_Release(ITargetFramePriv2
*iface
)
1350 HlinkFrame
*This
= impl_from_ITargetFramePriv2(iface
);
1351 return IUnknown_Release(This
->outer
);
1354 static HRESULT WINAPI
TargetFramePriv2_FindFrameDownwards(ITargetFramePriv2
*iface
,
1355 LPCWSTR pszTargetName
, DWORD dwFlags
, IUnknown
**ppunkTargetFrame
)
1357 HlinkFrame
*This
= impl_from_ITargetFramePriv2(iface
);
1358 FIXME("(%p)->(%s %x %p)\n", This
, debugstr_w(pszTargetName
), dwFlags
, ppunkTargetFrame
);
1362 static HRESULT WINAPI
TargetFramePriv2_FindFrameInContext(ITargetFramePriv2
*iface
,
1363 LPCWSTR pszTargetName
, IUnknown
*punkContextFrame
, DWORD dwFlags
, IUnknown
**ppunkTargetFrame
)
1365 HlinkFrame
*This
= impl_from_ITargetFramePriv2(iface
);
1366 FIXME("(%p)->(%s %p %x %p)\n", This
, debugstr_w(pszTargetName
), punkContextFrame
, dwFlags
, ppunkTargetFrame
);
1370 static HRESULT WINAPI
TargetFramePriv2_OnChildFrameActivate(ITargetFramePriv2
*iface
, IUnknown
*pUnkChildFrame
)
1372 HlinkFrame
*This
= impl_from_ITargetFramePriv2(iface
);
1373 FIXME("(%p)->(%p)\n", This
, pUnkChildFrame
);
1377 static HRESULT WINAPI
TargetFramePriv2_OnChildFrameDeactivate(ITargetFramePriv2
*iface
, IUnknown
*pUnkChildFrame
)
1379 HlinkFrame
*This
= impl_from_ITargetFramePriv2(iface
);
1380 FIXME("(%p)->(%p)\n", This
, pUnkChildFrame
);
1384 static HRESULT WINAPI
TargetFramePriv2_NavigateHack(ITargetFramePriv2
*iface
, DWORD grfHLNF
, LPBC pbc
,
1385 IBindStatusCallback
*pibsc
, LPCWSTR pszTargetName
, LPCWSTR pszUrl
, LPCWSTR pszLocation
)
1387 HlinkFrame
*This
= impl_from_ITargetFramePriv2(iface
);
1388 FIXME("(%p)->(%x %p %p %s %s %s)\n", This
, grfHLNF
, pbc
, pibsc
, debugstr_w(pszTargetName
),
1389 debugstr_w(pszUrl
), debugstr_w(pszLocation
));
1393 static HRESULT WINAPI
TargetFramePriv2_FindBrowserByIndex(ITargetFramePriv2
*iface
, DWORD dwID
, IUnknown
**ppunkBrowser
)
1395 HlinkFrame
*This
= impl_from_ITargetFramePriv2(iface
);
1396 FIXME("(%p)->(%d %p)\n", This
, dwID
, ppunkBrowser
);
1400 static HRESULT WINAPI
TargetFramePriv2_AggregatedNavigation2(ITargetFramePriv2
*iface
, DWORD grfHLNF
, LPBC pbc
,
1401 IBindStatusCallback
*pibsc
, LPCWSTR pszTargetName
, IUri
*pUri
, LPCWSTR pszLocation
)
1403 HlinkFrame
*This
= impl_from_ITargetFramePriv2(iface
);
1407 TRACE("(%p)->(%x %p %p %s %p %s)\n", This
, grfHLNF
, pbc
, pibsc
, debugstr_w(pszTargetName
),
1408 pUri
, debugstr_w(pszLocation
));
1411 * NOTE: This is an undocumented function. It seems to be working the way it's implemented,
1412 * but I couldn't get its tests working. It's used by mshtml to load content in a new
1413 * instance of browser.
1416 hres
= CreateURLMonikerEx2(NULL
, pUri
, &mon
, 0);
1420 hres
= navigate_hlink(This
->doc_host
, mon
, pbc
, pibsc
);
1421 IMoniker_Release(mon
);
1425 static const ITargetFramePriv2Vtbl TargetFramePriv2Vtbl
= {
1426 TargetFramePriv2_QueryInterface
,
1427 TargetFramePriv2_AddRef
,
1428 TargetFramePriv2_Release
,
1429 TargetFramePriv2_FindFrameDownwards
,
1430 TargetFramePriv2_FindFrameInContext
,
1431 TargetFramePriv2_OnChildFrameActivate
,
1432 TargetFramePriv2_OnChildFrameDeactivate
,
1433 TargetFramePriv2_NavigateHack
,
1434 TargetFramePriv2_FindBrowserByIndex
,
1435 TargetFramePriv2_AggregatedNavigation2
1438 static inline HlinkFrame
*impl_from_IWebBrowserPriv2IE9(IWebBrowserPriv2IE9
*iface
)
1440 return CONTAINING_RECORD(iface
, HlinkFrame
, IWebBrowserPriv2IE9_iface
);
1443 static HRESULT WINAPI
WebBrowserPriv2IE9_QueryInterface(IWebBrowserPriv2IE9
*iface
, REFIID riid
, void **ppv
)
1445 HlinkFrame
*This
= impl_from_IWebBrowserPriv2IE9(iface
);
1446 return IUnknown_QueryInterface(This
->outer
, riid
, ppv
);
1449 static ULONG WINAPI
WebBrowserPriv2IE9_AddRef(IWebBrowserPriv2IE9
*iface
)
1451 HlinkFrame
*This
= impl_from_IWebBrowserPriv2IE9(iface
);
1452 return IUnknown_AddRef(This
->outer
);
1455 static ULONG WINAPI
WebBrowserPriv2IE9_Release(IWebBrowserPriv2IE9
*iface
)
1457 HlinkFrame
*This
= impl_from_IWebBrowserPriv2IE9(iface
);
1458 return IUnknown_Release(This
->outer
);
1461 static HRESULT WINAPI
WebBrowserPriv2IE9_NavigateWithBindCtx2(IWebBrowserPriv2IE9
*iface
, IUri
*uri
, VARIANT
*flags
,
1462 VARIANT
*target_frame
, VARIANT
*post_data
, VARIANT
*headers
, IBindCtx
*bind_ctx
, LPOLESTR url_fragment
, DWORD unused
)
1464 HlinkFrame
*This
= impl_from_IWebBrowserPriv2IE9(iface
);
1465 FIXME("(%p)->(%p %s %s %s %s %p %s)\n", This
, uri
, debugstr_variant(flags
), debugstr_variant(target_frame
),
1466 debugstr_variant(post_data
), debugstr_variant(headers
), bind_ctx
, debugstr_w(url_fragment
));
1470 static const IWebBrowserPriv2IE9Vtbl WebBrowserPriv2IE9Vtbl
= {
1471 WebBrowserPriv2IE9_QueryInterface
,
1472 WebBrowserPriv2IE9_AddRef
,
1473 WebBrowserPriv2IE9_Release
,
1474 WebBrowserPriv2IE9_NavigateWithBindCtx2
1477 BOOL
HlinkFrame_QI(HlinkFrame
*This
, REFIID riid
, void **ppv
)
1479 if(IsEqualGUID(&IID_IHlinkFrame
, riid
)) {
1480 TRACE("(%p)->(IID_IHlinkFrame %p)\n", This
, ppv
);
1481 *ppv
= &This
->IHlinkFrame_iface
;
1482 }else if(IsEqualGUID(&IID_ITargetFrame2
, riid
)) {
1483 TRACE("(%p)->(IID_ITargetFrame2 %p)\n", This
, ppv
);
1484 *ppv
= &This
->ITargetFrame2_iface
;
1485 }else if(IsEqualGUID(&IID_ITargetFramePriv
, riid
)) {
1486 TRACE("(%p)->(IID_ITargetFramePriv %p)\n", This
, ppv
);
1487 *ppv
= &This
->ITargetFramePriv2_iface
;
1488 }else if(IsEqualGUID(&IID_ITargetFramePriv2
, riid
)) {
1489 TRACE("(%p)->(IID_ITargetFramePriv2 %p)\n", This
, ppv
);
1490 *ppv
= &This
->ITargetFramePriv2_iface
;
1491 }else if(IsEqualGUID(&IID_IWebBrowserPriv2IE9
, riid
)) {
1492 TRACE("(%p)->(IID_IWebBrowserPriv2IE9 %p)\n", This
, ppv
);
1493 *ppv
= &This
->IWebBrowserPriv2IE9_iface
;
1498 IUnknown_AddRef((IUnknown
*)*ppv
);
1502 void HlinkFrame_Init(HlinkFrame
*This
, IUnknown
*outer
, DocHost
*doc_host
)
1504 This
->IHlinkFrame_iface
.lpVtbl
= &HlinkFrameVtbl
;
1505 This
->ITargetFrame2_iface
.lpVtbl
= &TargetFrame2Vtbl
;
1506 This
->ITargetFramePriv2_iface
.lpVtbl
= &TargetFramePriv2Vtbl
;
1507 This
->IWebBrowserPriv2IE9_iface
.lpVtbl
= &WebBrowserPriv2IE9Vtbl
;
1509 This
->outer
= outer
;
1510 This
->doc_host
= doc_host
;