dbghelp: Properly fail on PDB files generated by MSVC compiler version 14.31.
[wine.git] / dlls / ieframe / tests / webbrowser.c
blob584da6e9022f7fd4b7bda7ccde072a4f9fa29f76
1 /*
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 COBJMACROS
20 #define CONST_VTABLE
22 #include <wine/test.h>
23 #include <stdarg.h>
24 #include <stdio.h>
26 #include "windef.h"
27 #include "winbase.h"
28 #include "initguid.h"
29 #include "ole2.h"
30 #include "exdisp.h"
31 #include "htiframe.h"
32 #include "htiface.h"
33 #include "mshtmhst.h"
34 #include "mshtmcid.h"
35 #include "mshtml.h"
36 #include "idispids.h"
37 #include "olectl.h"
38 #include "mshtmdid.h"
39 #include "shobjidl.h"
40 #include "shdeprecated.h"
41 #include "shlguid.h"
42 #include "exdispid.h"
43 #include "mimeinfo.h"
44 #include "hlink.h"
45 #include "docobjectservice.h"
47 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
48 DEFINE_GUID(outer_test_iid,0x06d4cd6c,0x18dd,0x11ea,0x8e,0x76,0xfc,0xaa,0x14,0x72,0x2d,0xac);
49 DEFINE_OLEGUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0);
50 DEFINE_GUID(IID_IProxyManager,0x00000008,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
52 #define DEFINE_EXPECT(func) \
53 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
55 #define SET_EXPECT(func) \
56 do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0)
58 #define CHECK_EXPECT2(func) \
59 do { \
60 ok(expect_ ##func, "unexpected call " #func "\n"); \
61 called_ ## func = TRUE; \
62 }while(0)
64 #define CHECK_EXPECT(func) \
65 do { \
66 CHECK_EXPECT2(func); \
67 expect_ ## func = FALSE; \
68 }while(0)
70 #define CHECK_CALLED(func) \
71 do { \
72 ok(called_ ## func, "expected " #func "\n"); \
73 expect_ ## func = called_ ## func = FALSE; \
74 }while(0)
76 #define CHECK_NOT_CALLED(func) \
77 do { \
78 ok(!called_ ## func, "unexpected " #func "\n"); \
79 expect_ ## func = called_ ## func = FALSE; \
80 }while(0)
82 #define CLEAR_CALLED(func) \
83 expect_ ## func = called_ ## func = FALSE
85 DEFINE_EXPECT(GetContainer);
86 DEFINE_EXPECT(Site_GetWindow);
87 DEFINE_EXPECT(ShowObject);
88 DEFINE_EXPECT(CanInPlaceActivate);
89 DEFINE_EXPECT(OnInPlaceActivate);
90 DEFINE_EXPECT(OnUIActivate);
91 DEFINE_EXPECT(GetWindowContext);
92 DEFINE_EXPECT(Frame_GetWindow);
93 DEFINE_EXPECT(Frame_SetActiveObject);
94 DEFINE_EXPECT(UIWindow_SetActiveObject);
95 DEFINE_EXPECT(SetMenu);
96 DEFINE_EXPECT(Invoke_AMBIENT_USERMODE);
97 DEFINE_EXPECT(Invoke_AMBIENT_DLCONTROL);
98 DEFINE_EXPECT(Invoke_AMBIENT_USERAGENT);
99 DEFINE_EXPECT(Invoke_AMBIENT_PALETTE);
100 DEFINE_EXPECT(Invoke_AMBIENT_SILENT);
101 DEFINE_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
102 DEFINE_EXPECT(Invoke_STATUSTEXTCHANGE);
103 DEFINE_EXPECT(Invoke_PROPERTYCHANGE);
104 DEFINE_EXPECT(Invoke_DOWNLOADBEGIN);
105 DEFINE_EXPECT(Invoke_BEFORENAVIGATE2);
106 DEFINE_EXPECT(Invoke_SETSECURELOCKICON);
107 DEFINE_EXPECT(Invoke_FILEDOWNLOAD);
108 DEFINE_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
109 DEFINE_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE);
110 DEFINE_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
111 DEFINE_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE);
112 DEFINE_EXPECT(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS);
113 DEFINE_EXPECT(Invoke_DOWNLOADCOMPLETE);
114 DEFINE_EXPECT(Invoke_ONMENUBAR);
115 DEFINE_EXPECT(Invoke_ONADDRESSBAR);
116 DEFINE_EXPECT(Invoke_ONSTATUSBAR);
117 DEFINE_EXPECT(Invoke_ONTOOLBAR);
118 DEFINE_EXPECT(Invoke_ONFULLSCREEN);
119 DEFINE_EXPECT(Invoke_ONTHEATERMODE);
120 DEFINE_EXPECT(Invoke_WINDOWSETRESIZABLE);
121 DEFINE_EXPECT(Invoke_TITLECHANGE);
122 DEFINE_EXPECT(Invoke_NAVIGATECOMPLETE2);
123 DEFINE_EXPECT(Invoke_PROGRESSCHANGE);
124 DEFINE_EXPECT(Invoke_DOCUMENTCOMPLETE);
125 DEFINE_EXPECT(Invoke_WINDOWCLOSING);
126 DEFINE_EXPECT(Invoke_SETPHISHINGFILTERSTATUS);
127 DEFINE_EXPECT(EnableModeless_TRUE);
128 DEFINE_EXPECT(EnableModeless_FALSE);
129 DEFINE_EXPECT(GetHostInfo);
130 DEFINE_EXPECT(GetOptionKeyPath);
131 DEFINE_EXPECT(GetOverridesKeyPath);
132 DEFINE_EXPECT(SetStatusText);
133 DEFINE_EXPECT(UpdateUI);
134 DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_0);
135 DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_1);
136 DEFINE_EXPECT(Exec_SETPROGRESSMAX);
137 DEFINE_EXPECT(Exec_SETPROGRESSPOS);
138 DEFINE_EXPECT(Exec_UPDATECOMMANDS);
139 DEFINE_EXPECT(Exec_SETTITLE);
140 DEFINE_EXPECT(QueryStatus_SETPROGRESSTEXT);
141 DEFINE_EXPECT(Exec_STOP);
142 DEFINE_EXPECT(Exec_IDM_STOP);
143 DEFINE_EXPECT(Exec_DocHostCommandHandler_2300);
144 DEFINE_EXPECT(QueryStatus_STOP);
145 DEFINE_EXPECT(QueryStatus_IDM_STOP);
146 DEFINE_EXPECT(DocHost_EnableModeless_TRUE);
147 DEFINE_EXPECT(DocHost_EnableModeless_FALSE);
148 DEFINE_EXPECT(DocHost_TranslateAccelerator);
149 DEFINE_EXPECT(GetDropTarget);
150 DEFINE_EXPECT(TranslateUrl);
151 DEFINE_EXPECT(ShowUI);
152 DEFINE_EXPECT(HideUI);
153 DEFINE_EXPECT(OnUIDeactivate);
154 DEFINE_EXPECT(OnInPlaceDeactivate);
155 DEFINE_EXPECT(RequestUIActivate);
156 DEFINE_EXPECT(ControlSite_TranslateAccelerator);
157 DEFINE_EXPECT(OnFocus_TRUE);
158 DEFINE_EXPECT(OnFocus_FALSE);
159 DEFINE_EXPECT(GetExternal);
160 DEFINE_EXPECT(outer_QI_test);
161 DEFINE_EXPECT(Advise_OnClose);
163 static VARIANT_BOOL exvb;
165 static IWebBrowser2 *wb;
167 static HWND container_hwnd, shell_embedding_hwnd;
168 static BOOL is_downloading, do_download, is_first_load, use_container_olecmd;
169 static BOOL test_close, test_hide, is_http, use_container_dochostui;
170 static HRESULT hr_dochost_TranslateAccelerator = E_NOTIMPL;
171 static HRESULT hr_site_TranslateAccelerator = E_NOTIMPL;
172 static const WCHAR *current_url;
173 static int wb_version, expect_update_commands_enable, set_update_commands_enable;
174 static BOOL nav_back_todo, nav_forward_todo; /* FIXME */
176 enum SessionOp
178 SESSION_QUERY,
179 SESSION_INCREMENT,
180 SESSION_DECREMENT
183 static LONG (WINAPI *pSetQueryNetSessionCount)(DWORD);
185 #define BUSY_FAIL 2
187 #define DWL_EXPECT_BEFORE_NAVIGATE 0x01
188 #define DWL_FROM_PUT_HREF 0x02
189 #define DWL_FROM_GOBACK 0x04
190 #define DWL_FROM_GOFORWARD 0x08
191 #define DWL_HTTP 0x10
192 #define DWL_REFRESH 0x20
193 #define DWL_BACK_ENABLE 0x40
195 static DWORD dwl_flags;
197 static IAdviseSink test_sink;
199 /* Returns true if the user interface is in English. Note that this does not
200 * presume of the formatting of dates, numbers, etc.
202 static BOOL is_lang_english(void)
204 static HMODULE hkernel32 = NULL;
205 static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL;
206 static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL;
208 if (!hkernel32)
210 hkernel32 = GetModuleHandleA("kernel32.dll");
211 pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage");
212 pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage");
214 if (pGetThreadUILanguage)
215 return PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH;
216 if (pGetUserDefaultUILanguage)
217 return PRIMARYLANGID(pGetUserDefaultUILanguage()) == LANG_ENGLISH;
219 return PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
222 static BOOL iface_cmp(IUnknown *iface1, IUnknown *iface2)
224 IUnknown *unk1, *unk2;
226 if(iface1 == iface2)
227 return TRUE;
229 IUnknown_QueryInterface(iface1, &IID_IUnknown, (void**)&unk1);
230 IUnknown_Release(unk1);
231 IUnknown_QueryInterface(iface2, &IID_IUnknown, (void**)&unk2);
232 IUnknown_Release(unk2);
234 return unk1 == unk2;
237 #define create_webbrowser() _create_webbrowser(__LINE__)
238 static IWebBrowser2 *_create_webbrowser(unsigned line)
240 IWebBrowser2 *ret;
241 HRESULT hres;
243 wb_version = 2;
245 hres = CoCreateInstance(&CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
246 &IID_IWebBrowser2, (void**)&ret);
247 ok_(__FILE__,line)(hres == S_OK, "Creating WebBrowser object failed: %08lx\n", hres);
248 return ret;
251 #define test_LocationURL(a,b) _test_LocationURL(__LINE__,a,b)
252 static void _test_LocationURL(unsigned line, IWebBrowser2 *wb, const WCHAR *exurl)
254 BSTR url = (void*)0xdeadbeef;
255 HRESULT hres;
257 hres = IWebBrowser2_get_LocationURL(wb, &url);
258 ok_(__FILE__,line) (hres == (*exurl ? S_OK : S_FALSE), "get_LocationURL failed: %08lx\n", hres);
259 if (SUCCEEDED(hres))
261 ok_(__FILE__,line) (!lstrcmpW(url, exurl), "unexpected URL: %s\n", wine_dbgstr_w(url));
262 SysFreeString(url);
266 #define test_LocationName(a,b) _test_LocationName(__LINE__,a,b)
267 static void _test_LocationName(unsigned line, IWebBrowser2 *wb, const WCHAR *exname)
269 BSTR name = (void*)0xdeadbeef;
270 HRESULT hres;
272 hres = IWebBrowser2_get_LocationName(wb, &name);
273 ok_(__FILE__,line) (hres == (*exname ? S_OK : S_FALSE), "get_LocationName failed: %08lx\n", hres);
274 ok_(__FILE__,line) (!lstrcmpW(name, exname) || broken(is_http && !lstrcmpW(name, current_url)) /* Win10 2004 */,
275 "expected %s, got %s\n", wine_dbgstr_w(exname), wine_dbgstr_w(name));
276 SysFreeString(name);
279 #define test_ready_state(a,b) _test_ready_state(__LINE__,a,b)
280 static void _test_ready_state(unsigned line, READYSTATE exstate, VARIANT_BOOL expect_busy)
282 READYSTATE state;
283 VARIANT_BOOL busy;
284 HRESULT hres;
286 hres = IWebBrowser2_get_ReadyState(wb, &state);
287 ok_(__FILE__,line)(hres == S_OK, "get_ReadyState failed: %08lx\n", hres);
288 ok_(__FILE__,line)(state == exstate, "ReadyState = %d, expected %d\n", state, exstate);
290 hres = IWebBrowser2_get_Busy(wb, &busy);
291 if(expect_busy != BUSY_FAIL) {
292 ok_(__FILE__,line)(hres == S_OK, "get_ReadyState failed: %08lx\n", hres);
293 ok_(__FILE__,line)(busy == expect_busy, "Busy = %x, expected %x for ready state %d\n",
294 busy, expect_busy, state);
295 }else {
296 todo_wine
297 ok_(__FILE__,line)(hres == E_FAIL, "get_ReadyState returned: %08lx\n", hres);
301 #define get_document(u) _get_document(__LINE__,u)
302 static IHTMLDocument2 *_get_document(unsigned line, IWebBrowser2 *wb)
304 IHTMLDocument2 *html_doc;
305 IDispatch *disp;
306 HRESULT hres;
308 disp = NULL;
309 hres = IWebBrowser2_get_Document(wb, &disp);
310 ok_(__FILE__,line)(hres == S_OK, "get_Document failed: %08lx\n", hres);
311 ok_(__FILE__,line)(disp != NULL, "doc_disp == NULL\n");
313 hres = IDispatch_QueryInterface(disp, &IID_IHTMLDocument2, (void**)&html_doc);
314 ok_(__FILE__,line)(hres == S_OK, "Could not get IHTMLDocument iface: %08lx\n", hres);
315 ok(disp == (IDispatch*)html_doc, "disp != html_doc\n");
316 IDispatch_Release(disp);
318 return html_doc;
321 #define get_dochost(u) _get_dochost(__LINE__,u)
322 static IOleClientSite *_get_dochost(unsigned line, IWebBrowser2 *unk)
324 IOleClientSite *client_site;
325 IHTMLDocument2 *doc;
326 IOleObject *oleobj;
327 HRESULT hres;
329 doc = _get_document(line, unk);
330 hres = IHTMLDocument2_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
331 IHTMLDocument2_Release(doc);
332 ok_(__FILE__,line)(hres == S_OK, "Got 0x%08lx\n", hres);
334 hres = IOleObject_GetClientSite(oleobj, &client_site);
335 IOleObject_Release(oleobj);
336 ok_(__FILE__,line)(hres == S_OK, "Got 0x%08lx\n", hres);
338 return client_site;
341 static HRESULT QueryInterface(REFIID,void**);
343 static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface,
344 REFIID riid, void **ppv)
346 ok(0, "unexpected call\n");
347 return E_NOINTERFACE;
350 static ULONG WINAPI OleCommandTarget_AddRef(IOleCommandTarget *iface)
352 return 2;
355 static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface)
357 return 1;
360 static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
361 ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
363 ok(!pguidCmdGroup, "pguidCmdGroup != MULL\n");
364 ok(cCmds == 1, "cCmds=%ld, expected 1\n", cCmds);
365 ok(!pCmdText, "pCmdText != NULL\n");
367 switch(prgCmds[0].cmdID) {
368 case OLECMDID_STOP:
369 CHECK_EXPECT2(QueryStatus_STOP);
370 prgCmds[0].cmdf = OLECMDF_SUPPORTED;
371 return S_OK;
372 case OLECMDID_SETPROGRESSTEXT:
373 CHECK_EXPECT(QueryStatus_SETPROGRESSTEXT);
374 prgCmds[0].cmdf = OLECMDF_ENABLED;
375 return S_OK;
376 case IDM_STOP:
377 /* Note:
378 * IDM_STOP is a command specific to CGID_MSHTML (not an OLECMDID command).
379 * This command appears here for the ExecWB and QueryStatusWB tests in order
380 * to help demonstrate that these routines use a NULL pguidCmdGroup.
382 CHECK_EXPECT(QueryStatus_IDM_STOP);
383 prgCmds[0].cmdf = 0;
384 return S_OK;
385 default:
386 ok(0, "unexpected command %ld\n", prgCmds[0].cmdID);
389 return E_FAIL;
392 static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
393 DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
395 if(!pguidCmdGroup) {
396 switch(nCmdID) {
397 case OLECMDID_SETPROGRESSMAX:
398 CHECK_EXPECT2(Exec_SETPROGRESSMAX);
399 ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08lx\n", nCmdexecopt);
400 ok(pvaIn != NULL, "pvaIn == NULL\n");
401 if(pvaIn)
402 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
403 ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
404 return S_OK;
405 case OLECMDID_SETPROGRESSPOS:
406 CHECK_EXPECT2(Exec_SETPROGRESSPOS);
407 ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08lx\n", nCmdexecopt);
408 ok(pvaIn != NULL, "pvaIn == NULL\n");
409 if(pvaIn)
410 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
411 ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
412 return S_OK;
413 case OLECMDID_SETDOWNLOADSTATE:
414 if(is_downloading)
415 ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER || !nCmdexecopt,
416 "nCmdexecopts=%08lx\n", nCmdexecopt);
417 else
418 ok(!nCmdexecopt, "nCmdexecopts=%08lx\n", nCmdexecopt);
419 ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut);
420 ok(pvaIn != NULL, "pvaIn == NULL\n");
421 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d\n", V_VT(pvaIn));
422 switch(V_I4(pvaIn)) {
423 case 0:
424 CHECK_EXPECT2(Exec_SETDOWNLOADSTATE_0);
425 break;
426 case 1:
427 CHECK_EXPECT2(Exec_SETDOWNLOADSTATE_1);
428 break;
429 default:
430 ok(0, "unexpected V_I4(pvaIn)=%ld\n", V_I4(pvaIn));
432 return S_OK;
433 case OLECMDID_UPDATECOMMANDS:
434 CHECK_EXPECT2(Exec_UPDATECOMMANDS);
435 ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08lx\n", nCmdexecopt);
436 ok(!pvaIn, "pvaIn != NULL\n");
437 ok(!pvaOut, "pvaOut=%p, expected NULL\n", pvaOut);
438 return S_OK;
439 case OLECMDID_SETTITLE:
440 CHECK_EXPECT(Exec_SETTITLE);
441 /* TODO: test args */
442 return S_OK;
443 case OLECMDID_STOP:
444 CHECK_EXPECT(Exec_STOP);
445 return S_OK;
446 case IDM_STOP:
447 /* Note:
448 * IDM_STOP is a command specific to CGID_MSHTML (not an OLECMDID command).
449 * This command appears here for the ExecWB and QueryStatusWB tests in order
450 * to help demonstrate that these routines use a NULL pguidCmdGroup.
452 CHECK_EXPECT(Exec_IDM_STOP);
453 return OLECMDERR_E_NOTSUPPORTED;
454 case OLECMDID_UPDATETRAVELENTRY_DATARECOVERY:
455 case OLECMDID_PAGEAVAILABLE: /* TODO (IE11) */
456 return E_NOTIMPL;
457 case 6058: /* TODO */
458 return E_NOTIMPL;
459 default:
460 ok(0, "unexpected nCmdID %ld\n", nCmdID);
462 }else if(IsEqualGUID(&CGID_Explorer, pguidCmdGroup)) {
463 switch(nCmdID) {
464 case 20: /* TODO */
465 case 24: /* TODO */
466 case 25: /* IE5 */
467 case 37: /* TODO */
468 case 39: /* TODO */
469 case 66: /* TODO */
470 case 67: /* TODO */
471 case 69: /* TODO */
472 case 101: /* TODO (IE8) */
473 case 109: /* TODO (IE9) */
474 case 113: /* TODO (IE10) */
475 case 119: /* IE11 */
476 return E_FAIL;
477 default:
478 ok(0, "unexpected nCmdID %ld\n", nCmdID);
480 }else if(IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup)) {
481 switch(nCmdID) {
482 case 63: /* win10 */
483 case 105: /* TODO */
484 case 132: /* win10 */
485 case 133: /* IE11 */
486 case 134: /* TODO (IE10) */
487 case 135: /* IE11 */
488 case 136: /* TODO (IE10) */
489 case 137: /* win10 */
490 case 138: /* TODO */
491 case 140: /* TODO (Win7) */
492 case 144: /* TODO */
493 case 178: /* IE11 */
494 case 179: /* IE11 */
495 case 180: /* IE11 */
496 case 181: /* IE11 */
497 case 182: /* win10 */
498 return E_FAIL;
499 default:
500 ok(0, "unexpected nCmdID %ld\n", nCmdID);
502 }else if(IsEqualGUID(&CGID_DocHostCmdPriv, pguidCmdGroup)) {
503 switch(nCmdID) {
504 case 11: /* TODO */
505 break;
506 default:
507 ok(0, "unexpected nCmdID %ld of CGID_DocHostCmdPriv\n", nCmdID);
509 }else if(IsEqualGUID(&CGID_DocHostCommandHandler, pguidCmdGroup)) {
510 switch(nCmdID) {
511 case 6041: /* TODO */
512 break;
513 case 2300:
514 CHECK_EXPECT(Exec_DocHostCommandHandler_2300);
515 return E_NOTIMPL;
516 default:
517 ok(0, "unexpected nCmdID %ld of CGID_DocHostCommandHandler\n", nCmdID);
519 }else {
520 ok(0, "unexpected pguidCmdGroup %s\n", wine_dbgstr_guid(pguidCmdGroup));
523 return E_FAIL;
526 static IOleCommandTargetVtbl OleCommandTargetVtbl = {
527 OleCommandTarget_QueryInterface,
528 OleCommandTarget_AddRef,
529 OleCommandTarget_Release,
530 OleCommandTarget_QueryStatus,
531 OleCommandTarget_Exec
534 static IOleCommandTarget OleCommandTarget = { &OleCommandTargetVtbl };
536 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
538 if(IsEqualGUID(&IID_ITargetContainer, riid))
539 return E_NOINTERFACE; /* TODO */
541 if(IsEqualGUID(&IID_IOleCommandTarget, riid)) {
542 if(use_container_olecmd)
544 *ppv = &OleCommandTarget;
545 return S_OK;
547 else
548 return E_NOINTERFACE;
551 ok(0, "unexpected call\n");
552 return E_NOINTERFACE;
555 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
557 return 2;
560 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
562 return 1;
565 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
566 LPOLESTR pszDisplayName, ULONG *pchEaten, IMoniker **ppmkOut)
568 ok(0, "unexpected call\n");
569 return E_NOTIMPL;
572 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
573 IEnumUnknown **ppenum)
575 ok(0, "unexpected call\n");
576 return E_NOTIMPL;
579 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
581 ok(0, "unexpected call\n");
582 return E_NOTIMPL;
585 static const IOleContainerVtbl OleContainerVtbl = {
586 OleContainer_QueryInterface,
587 OleContainer_AddRef,
588 OleContainer_Release,
589 OleContainer_ParseDisplayName,
590 OleContainer_EnumObjects,
591 OleContainer_LockContainer
594 static IOleContainer OleContainer = { &OleContainerVtbl };
596 static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
598 return QueryInterface(riid, ppv);
601 static ULONG WINAPI Dispatch_AddRef(IDispatch *iface)
603 return 2;
606 static ULONG WINAPI Dispatch_Release(IDispatch *iface)
608 return 1;
611 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
613 ok(0, "unexpected call\n");
614 return E_NOTIMPL;
617 static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
618 ITypeInfo **ppTInfo)
620 ok(0, "unexpected call\n");
621 return E_NOTIMPL;
624 static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
625 UINT cNames, LCID lcid, DISPID *rgDispId)
627 ok(0, "unexpected call\n");
628 return E_NOTIMPL;
631 static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
632 LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
633 EXCEPINFO *pExcepInfo, UINT *puArgErr)
635 ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
636 ok(pDispParams != NULL, "pDispParams == NULL\n");
637 ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
638 ok(V_VT(pVarResult) == VT_EMPTY, "V_VT(pVarResult)=%d\n", V_VT(pVarResult));
639 ok(wFlags == DISPATCH_PROPERTYGET, "wFlags=%08x, expected DISPATCH_PROPERTYGET\n", wFlags);
640 ok(pDispParams->rgvarg == NULL, "pDispParams->rgvarg = %p\n", pDispParams->rgvarg);
641 ok(pDispParams->rgdispidNamedArgs == NULL,
642 "pDispParams->rgdispidNamedArgs = %p\n", pDispParams->rgdispidNamedArgs);
643 ok(pDispParams->cArgs == 0, "pDispParams->cArgs = %d\n", pDispParams->cArgs);
644 ok(pDispParams->cNamedArgs == 0, "pDispParams->cNamedArgs = %d\n", pDispParams->cNamedArgs);
646 switch(dispIdMember) {
647 case DISPID_AMBIENT_USERMODE:
648 CHECK_EXPECT2(Invoke_AMBIENT_USERMODE);
649 return E_FAIL;
650 case DISPID_AMBIENT_DLCONTROL:
651 CHECK_EXPECT(Invoke_AMBIENT_DLCONTROL);
652 ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
653 return E_FAIL;
654 case DISPID_AMBIENT_USERAGENT:
655 CHECK_EXPECT(Invoke_AMBIENT_USERAGENT);
656 ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
657 return E_FAIL;
658 case DISPID_AMBIENT_PALETTE:
659 CHECK_EXPECT(Invoke_AMBIENT_PALETTE);
660 ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
661 return E_FAIL;
662 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
663 CHECK_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
664 ok(puArgErr == NULL, "puArgErr=%p\n", puArgErr);
665 V_VT(pVarResult) = VT_BOOL;
666 V_BOOL(pVarResult) = VARIANT_FALSE;
667 return S_OK;
668 case DISPID_AMBIENT_SILENT:
669 CHECK_EXPECT(Invoke_AMBIENT_SILENT);
670 ok(puArgErr == NULL, "puArgErr=%p\n", puArgErr);
671 V_VT(pVarResult) = VT_BOOL;
672 V_BOOL(pVarResult) = VARIANT_FALSE;
673 return S_OK;
676 ok(0, "unexpected dispIdMember %ld\n", dispIdMember);
677 return E_NOTIMPL;
680 static IDispatchVtbl DispatchVtbl = {
681 Dispatch_QueryInterface,
682 Dispatch_AddRef,
683 Dispatch_Release,
684 Dispatch_GetTypeInfoCount,
685 Dispatch_GetTypeInfo,
686 Dispatch_GetIDsOfNames,
687 Dispatch_Invoke
690 static IDispatch Dispatch = { &DispatchVtbl };
692 static HRESULT WINAPI WebBrowserEvents2_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
694 *ppv = NULL;
696 if(IsEqualGUID(&DIID_DWebBrowserEvents2, riid) || IsEqualGUID(&IID_IDispatch, riid)) {
697 *ppv = iface;
698 return S_OK;
701 ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid));
702 return E_NOINTERFACE;
705 #define test_invoke_bool(p,s) _test_invoke_bool(__LINE__,p,s)
706 static void _test_invoke_bool(unsigned line, const DISPPARAMS *params, BOOL strict)
708 ok_(__FILE__,line) (params->rgvarg != NULL, "rgvarg == NULL\n");
709 ok_(__FILE__,line) (params->cArgs == 1, "cArgs=%d, expected 1\n", params->cArgs);
710 ok_(__FILE__,line) (V_VT(params->rgvarg) == VT_BOOL, "V_VT(arg)=%d\n", V_VT(params->rgvarg));
711 if(strict)
712 ok_(__FILE__,line) (V_BOOL(params->rgvarg) == exvb, "V_VT(arg)=%x, expected %x\n",
713 V_BOOL(params->rgvarg), exvb);
714 else
715 ok_(__FILE__,line) (!V_BOOL(params->rgvarg) == !exvb, "V_VT(arg)=%x, expected %x\n",
716 V_BOOL(params->rgvarg), exvb);
719 static void test_OnBeforeNavigate(const VARIANT *disp, const VARIANT *url, const VARIANT *flags,
720 const VARIANT *frame, const VARIANT *post_data, const VARIANT *headers, const VARIANT *cancel)
722 BSTR str;
724 ok(V_VT(disp) == VT_DISPATCH, "V_VT(disp)=%d, expected VT_DISPATCH\n", V_VT(disp));
725 ok(V_DISPATCH(disp) != NULL, "V_DISPATCH(disp) == NULL\n");
726 ok(V_DISPATCH(disp) == (IDispatch*)wb, "V_DISPATCH(disp)=%p, wb=%p\n", V_DISPATCH(disp), wb);
728 ok(V_VT(url) == (VT_BYREF|VT_VARIANT), "V_VT(url)=%x, expected VT_BYREF|VT_VARIANT\n", V_VT(url));
729 ok(V_VARIANTREF(url) != NULL, "V_VARIANTREF(url) == NULL)\n");
730 if(V_VARIANTREF(url)) {
731 ok(V_VT(V_VARIANTREF(url)) == VT_BSTR, "V_VT(V_VARIANTREF(url))=%d, expected VT_BSTR\n",
732 V_VT(V_VARIANTREF(url)));
733 ok(V_BSTR(V_VARIANTREF(url)) != NULL, "V_BSTR(V_VARIANTREF(url)) == NULL\n");
734 ok(!lstrcmpW(V_BSTR(V_VARIANTREF(url)), current_url), "unexpected url %s, expected %s\n",
735 wine_dbgstr_w(V_BSTR(V_VARIANTREF(url))), wine_dbgstr_w(current_url));
738 ok(V_VT(flags) == (VT_BYREF|VT_VARIANT), "V_VT(flags)=%x, expected VT_BYREF|VT_VARIANT\n",
739 V_VT(flags));
740 ok(V_VT(flags) == (VT_BYREF|VT_VARIANT), "V_VT(flags)=%x, expected VT_BYREF|VT_VARIANT\n",
741 V_VT(flags));
742 ok(V_VARIANTREF(flags) != NULL, "V_VARIANTREF(flags) == NULL)\n");
743 if(V_VARIANTREF(flags)) {
744 int f;
746 ok(V_VT(V_VARIANTREF(flags)) == VT_I4, "V_VT(V_VARIANTREF(flags))=%d, expected VT_I4\n",
747 V_VT(V_VARIANTREF(flags)));
748 f = V_I4(V_VARIANTREF(flags));
749 f &= ~0x100; /* IE11 sets this flag */
750 if(is_first_load)
751 ok(!f, "flags = %lx, expected 0\n", V_I4(V_VARIANTREF(flags)));
752 else
753 ok(!(f & ~0x40), "flags = %lx, expected 0x40 or 0\n", V_I4(V_VARIANTREF(flags)));
756 ok(V_VT(frame) == (VT_BYREF|VT_VARIANT), "V_VT(frame)=%x, expected VT_BYREF|VT_VARIANT\n",
757 V_VT(frame));
758 ok(V_VT(frame) == (VT_BYREF|VT_VARIANT), "V_VT(frame)=%x, expected VT_BYREF|VT_VARIANT\n",
759 V_VT(frame));
760 ok(V_VARIANTREF(frame) != NULL, "V_VARIANTREF(frame) == NULL)\n");
761 if(V_VARIANTREF(frame)) {
762 ok(V_VT(V_VARIANTREF(frame)) == VT_BSTR, "V_VT(V_VARIANTREF(frame))=%d, expected VT_BSTR\n",
763 V_VT(V_VARIANTREF(frame)));
764 ok(V_BSTR(V_VARIANTREF(frame)) == NULL, "V_BSTR(V_VARIANTREF(frame)) = %p, expected NULL\n",
765 V_BSTR(V_VARIANTREF(frame)));
768 ok(V_VT(post_data) == (VT_BYREF|VT_VARIANT), "V_VT(post_data)=%x, expected VT_BYREF|VT_VARIANT\n",
769 V_VT(post_data));
770 ok(V_VT(post_data) == (VT_BYREF|VT_VARIANT), "V_VT(post_data)=%x, expected VT_BYREF|VT_VARIANT\n",
771 V_VT(post_data));
772 ok(V_VARIANTREF(post_data) != NULL, "V_VARIANTREF(post_data) == NULL)\n");
773 if(V_VARIANTREF(post_data)) {
774 ok(V_VT(V_VARIANTREF(post_data)) == (VT_VARIANT|VT_BYREF),
775 "V_VT(V_VARIANTREF(post_data))=%d, expected VT_VARIANT|VT_BYREF\n",
776 V_VT(V_VARIANTREF(post_data)));
777 ok(V_VARIANTREF(V_VARIANTREF(post_data)) != NULL,
778 "V_VARIANTREF(V_VARIANTREF(post_data)) == NULL\n");
779 if(V_VARIANTREF(V_VARIANTREF(post_data))) {
780 ok(V_VT(V_VARIANTREF(V_VARIANTREF(post_data))) == VT_EMPTY,
781 "V_VT(V_VARIANTREF(V_VARIANTREF(post_data))) = %d, expected VT_EMPTY\n",
782 V_VT(V_VARIANTREF(V_VARIANTREF(post_data))));
784 if(V_VT(V_VARIANTREF(V_VARIANTREF(post_data))) == (VT_UI1|VT_ARRAY)) {
785 const SAFEARRAY *sa = V_ARRAY(V_VARIANTREF(V_VARIANTREF(post_data)));
787 ok(sa->cDims == 1, "sa->cDims = %d, expected 1\n", sa->cDims);
788 ok(sa->fFeatures == 0, "sa->fFeatures = %d, expected 0\n", sa->fFeatures);
793 ok(V_VT(headers) == (VT_BYREF|VT_VARIANT), "V_VT(headers)=%x, expected VT_BYREF|VT_VARIANT\n",
794 V_VT(headers));
795 ok(V_VARIANTREF(headers) != NULL, "V_VARIANTREF(headers) == NULL)\n");
796 if(V_VARIANTREF(headers)) {
797 ok(V_VT(V_VARIANTREF(headers)) == VT_BSTR, "V_VT(V_VARIANTREF(headers))=%d, expected VT_BSTR\n",
798 V_VT(V_VARIANTREF(headers)));
799 str = V_BSTR(V_VARIANTREF(headers));
800 ok(!str || !lstrcmpW(str, L"Referer: http://test.winehq.org/tests/hello.html\r\n"),
801 "V_BSTR(V_VARIANTREF(headers)) = %s, expected NULL\n", wine_dbgstr_w(str));
804 ok(V_VT(cancel) == (VT_BYREF|VT_BOOL), "V_VT(cancel)=%x, expected VT_BYREF|VT_BOOL\n",
805 V_VT(cancel));
806 ok(V_BOOLREF(cancel) != NULL, "V_BOOLREF(pDispParams->rgvarg[0] == NULL)\n");
807 if(V_BOOLREF(cancel))
808 ok(*V_BOOLREF(cancel) == VARIANT_FALSE, "*V_BOOLREF(cancel) = %x, expected VARIANT_FALSE\n",
809 *V_BOOLREF(cancel));
812 static void test_navigatecomplete2(DISPPARAMS *dp)
814 VARIANT *v;
816 CHECK_EXPECT(Invoke_NAVIGATECOMPLETE2);
818 ok(dp->rgvarg != NULL, "rgvarg == NULL\n");
819 ok(dp->cArgs == 2, "cArgs=%d, expected 2\n", dp->cArgs);
821 ok(V_VT(dp->rgvarg) == (VT_BYREF|VT_VARIANT), "V_VT(dp->rgvarg) = %d\n", V_VT(dp->rgvarg));
822 v = V_VARIANTREF(dp->rgvarg);
823 ok(V_VT(v) == VT_BSTR, "V_VT(url) = %d\n", V_VT(v));
824 ok(!lstrcmpW(V_BSTR(v), current_url), "url=%s, expected %s\n", wine_dbgstr_w(V_BSTR(v)),
825 wine_dbgstr_w(current_url));
827 ok(V_VT(dp->rgvarg+1) == VT_DISPATCH, "V_VT(dp->rgvarg+1) = %d\n", V_VT(dp->rgvarg+1));
828 ok(V_DISPATCH(dp->rgvarg+1) == (IDispatch*)wb, "V_DISPATCH=%p, wb=%p\n", V_DISPATCH(dp->rgvarg+1), wb);
830 if(dwl_flags & (DWL_FROM_PUT_HREF|DWL_FROM_GOBACK|DWL_FROM_GOFORWARD))
831 test_ready_state(READYSTATE_COMPLETE, VARIANT_TRUE);
832 else
833 test_ready_state(READYSTATE_LOADING, VARIANT_TRUE);
836 static void test_documentcomplete(DISPPARAMS *dp)
838 VARIANT *v;
840 CHECK_EXPECT(Invoke_DOCUMENTCOMPLETE);
842 ok(dp->rgvarg != NULL, "rgvarg == NULL\n");
843 ok(dp->cArgs == 2, "cArgs=%d, expected 2\n", dp->cArgs);
845 ok(V_VT(dp->rgvarg) == (VT_BYREF|VT_VARIANT), "V_VT(dp->rgvarg) = %d\n", V_VT(dp->rgvarg));
846 v = V_VARIANTREF(dp->rgvarg);
847 ok(V_VT(v) == VT_BSTR, "V_VT(url) = %d\n", V_VT(v));
848 ok(!lstrcmpW(V_BSTR(v), current_url), "url=%s, expected %s\n", wine_dbgstr_w(V_BSTR(v)),
849 wine_dbgstr_w(current_url));
851 ok(V_VT(dp->rgvarg+1) == VT_DISPATCH, "V_VT(dp->rgvarg+1) = %d\n", V_VT(dp->rgvarg+1));
852 ok(V_DISPATCH(dp->rgvarg+1) == (IDispatch*)wb, "V_DISPATCH=%p, wb=%p\n", V_DISPATCH(dp->rgvarg+1), wb);
854 test_ready_state(READYSTATE_COMPLETE, VARIANT_FALSE);
857 static HRESULT WINAPI WebBrowserEvents2_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
858 LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
859 EXCEPINFO *pExcepInfo, UINT *puArgErr)
861 ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
862 ok(pDispParams != NULL, "pDispParams == NULL\n");
863 ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
864 ok(pVarResult == NULL, "pVarResult=%p\n", pVarResult);
865 ok(wFlags == DISPATCH_METHOD, "wFlags=%08x, expected DISPATCH_METHOD\n", wFlags);
866 ok(pDispParams->rgdispidNamedArgs == NULL,
867 "pDispParams->rgdispidNamedArgs = %p\n", pDispParams->rgdispidNamedArgs);
868 ok(pDispParams->cNamedArgs == 0, "pDispParams->cNamedArgs = %d\n", pDispParams->cNamedArgs);
870 switch(dispIdMember) {
871 case DISPID_STATUSTEXTCHANGE:
872 CHECK_EXPECT2(Invoke_STATUSTEXTCHANGE);
874 ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
875 ok(pDispParams->cArgs == 1, "cArgs=%d, expected 1\n", pDispParams->cArgs);
876 ok(V_VT(pDispParams->rgvarg) == VT_BSTR, "V_VT(pDispParams->rgvarg)=%d, expected VT_BSTR\n",
877 V_VT(pDispParams->rgvarg));
878 ok(V_BSTR(pDispParams->rgvarg) != NULL, "V_BSTR(pDispParams->rgvarg) is NULL\n");
879 /* TODO: Check text */
880 break;
882 case DISPID_PROPERTYCHANGE:
883 CHECK_EXPECT2(Invoke_PROPERTYCHANGE);
885 ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
886 ok(pDispParams->cArgs == 1, "cArgs=%d, expected 1\n", pDispParams->cArgs);
887 /* TODO: Check args */
888 break;
890 case DISPID_DOWNLOADBEGIN:
891 CHECK_EXPECT2(Invoke_DOWNLOADBEGIN);
893 ok(pDispParams->rgvarg == NULL, "rgvarg=%p, expected NULL\n", pDispParams->rgvarg);
894 ok(pDispParams->cArgs == 0, "cArgs=%d, expected 0\n", pDispParams->cArgs);
895 if(dwl_flags & (DWL_FROM_PUT_HREF|DWL_FROM_GOFORWARD|DWL_FROM_GOBACK))
896 test_ready_state(READYSTATE_COMPLETE, VARIANT_TRUE);
897 else if(!(dwl_flags & DWL_REFRESH)) /* todo_wine */
898 test_ready_state(READYSTATE_LOADING, VARIANT_TRUE);
899 break;
901 case DISPID_BEFORENAVIGATE2:
902 CHECK_EXPECT(Invoke_BEFORENAVIGATE2);
904 ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
905 ok(pDispParams->cArgs == 7, "cArgs=%d, expected 7\n", pDispParams->cArgs);
906 test_OnBeforeNavigate(pDispParams->rgvarg+6, pDispParams->rgvarg+5, pDispParams->rgvarg+4,
907 pDispParams->rgvarg+3, pDispParams->rgvarg+2, pDispParams->rgvarg+1,
908 pDispParams->rgvarg);
909 if(dwl_flags & (DWL_FROM_PUT_HREF|DWL_FROM_GOFORWARD))
910 test_ready_state(READYSTATE_COMPLETE, VARIANT_FALSE);
911 else
912 test_ready_state(READYSTATE_LOADING, VARIANT_FALSE);
913 break;
915 case DISPID_SETSECURELOCKICON:
916 CHECK_EXPECT2(Invoke_SETSECURELOCKICON);
918 ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
919 ok(pDispParams->cArgs == 1, "cArgs=%d, expected 1\n", pDispParams->cArgs);
920 /* TODO: Check args */
921 break;
923 case DISPID_FILEDOWNLOAD:
924 CHECK_EXPECT(Invoke_FILEDOWNLOAD);
926 ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
927 ok(pDispParams->cArgs == 2, "cArgs=%d, expected 2\n", pDispParams->cArgs);
928 /* TODO: Check args */
929 break;
931 case DISPID_COMMANDSTATECHANGE:
932 ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
933 ok(pDispParams->cArgs == 2, "cArgs=%d, expected 2\n", pDispParams->cArgs);
935 ok(V_VT(pDispParams->rgvarg) == VT_BOOL, "V_VT(pDispParams->rgvarg) = %d\n", V_VT(pDispParams->rgvarg));
936 ok(V_VT(pDispParams->rgvarg+1) == VT_I4, "V_VT(pDispParams->rgvarg+1) = %d\n", V_VT(pDispParams->rgvarg+1));
937 ok(V_I4(pDispParams->rgvarg+1) == CSC_NAVIGATEFORWARD ||
938 V_I4(pDispParams->rgvarg+1) == CSC_NAVIGATEBACK ||
939 V_I4(pDispParams->rgvarg+1) == CSC_UPDATECOMMANDS,
940 "V_I4(pDispParams->rgvarg+1) = %lx\n", V_I4(pDispParams->rgvarg+1));
942 if (V_I4(pDispParams->rgvarg+1) == CSC_NAVIGATEFORWARD)
944 todo_wine_if(nav_forward_todo) {
945 if(V_BOOL(pDispParams->rgvarg))
946 CHECK_EXPECT2(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE);
947 else
948 CHECK_EXPECT2(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
951 else if (V_I4(pDispParams->rgvarg+1) == CSC_NAVIGATEBACK)
953 todo_wine_if(nav_back_todo) {
954 if(V_BOOL(pDispParams->rgvarg))
955 CHECK_EXPECT2(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE);
956 else
957 CHECK_EXPECT2(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
960 else if (V_I4(pDispParams->rgvarg+1) == CSC_UPDATECOMMANDS)
962 todo_wine CHECK_EXPECT2(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS);
963 set_update_commands_enable = V_BOOL(pDispParams->rgvarg);
965 break;
967 case DISPID_DOWNLOADCOMPLETE:
968 CHECK_EXPECT2(Invoke_DOWNLOADCOMPLETE);
970 ok(pDispParams->rgvarg == NULL, "rgvarg=%p, expected NULL\n", pDispParams->rgvarg);
971 ok(pDispParams->cArgs == 0, "cArgs=%d, expected 0\n", pDispParams->cArgs);
972 if(use_container_olecmd)
973 test_ready_state(READYSTATE_LOADING, VARIANT_FALSE);
974 break;
976 case DISPID_ONMENUBAR:
977 CHECK_EXPECT(Invoke_ONMENUBAR);
978 test_invoke_bool(pDispParams, TRUE);
979 break;
981 case DISPID_ONADDRESSBAR:
982 CHECK_EXPECT(Invoke_ONADDRESSBAR);
983 test_invoke_bool(pDispParams, TRUE);
984 break;
986 case DISPID_ONSTATUSBAR:
987 CHECK_EXPECT(Invoke_ONSTATUSBAR);
988 test_invoke_bool(pDispParams, TRUE);
989 break;
991 case DISPID_ONTOOLBAR:
992 CHECK_EXPECT(Invoke_ONTOOLBAR);
993 test_invoke_bool(pDispParams, FALSE);
994 break;
996 case DISPID_ONFULLSCREEN:
997 CHECK_EXPECT(Invoke_ONFULLSCREEN);
998 test_invoke_bool(pDispParams, TRUE);
999 break;
1001 case DISPID_ONTHEATERMODE:
1002 CHECK_EXPECT(Invoke_ONTHEATERMODE);
1003 test_invoke_bool(pDispParams, TRUE);
1004 break;
1006 case DISPID_WINDOWSETRESIZABLE:
1007 CHECK_EXPECT(Invoke_WINDOWSETRESIZABLE);
1008 test_invoke_bool(pDispParams, TRUE);
1009 break;
1011 case DISPID_TITLECHANGE:
1012 CHECK_EXPECT2(Invoke_TITLECHANGE);
1013 /* FIXME */
1014 break;
1016 case DISPID_NAVIGATECOMPLETE2:
1017 test_navigatecomplete2(pDispParams);
1018 break;
1020 case DISPID_PROGRESSCHANGE:
1021 CHECK_EXPECT2(Invoke_PROGRESSCHANGE);
1022 /* FIXME */
1023 break;
1025 case DISPID_DOCUMENTCOMPLETE:
1026 test_documentcomplete(pDispParams);
1027 break;
1029 case DISPID_WINDOWCLOSING: {
1030 VARIANT *is_child = pDispParams->rgvarg+1, *cancel = pDispParams->rgvarg;
1032 CHECK_EXPECT(Invoke_WINDOWCLOSING);
1034 ok(pDispParams->cArgs == 2, "pdp->cArgs = %d\n", pDispParams->cArgs);
1035 ok(V_VT(is_child) == VT_BOOL, "V_VT(is_child) = %d\n", V_VT(is_child));
1036 ok(!V_BOOL(is_child), "V_BOOL(is_child) = %x\n", V_BOOL(is_child));
1037 ok(V_VT(cancel) == (VT_BYREF|VT_BOOL), "V_VT(cancel) = %d\n", V_VT(cancel));
1038 ok(!*V_BOOLREF(cancel), "*V_BOOLREF(cancel) = %x\n", *V_BOOLREF(cancel));
1040 *V_BOOLREF(cancel) = VARIANT_TRUE;
1041 return S_OK;
1044 case DISPID_SETPHISHINGFILTERSTATUS: /* FIXME */
1045 CHECK_EXPECT2(Invoke_SETPHISHINGFILTERSTATUS);
1046 break;
1048 case DISPID_BEFORESCRIPTEXECUTE: /* FIXME: IE10 */
1049 break;
1051 case DISPID_PRIVACYIMPACTEDSTATECHANGE:
1052 break;
1054 default:
1055 ok(0, "unexpected dispIdMember %ld\n", dispIdMember);
1058 return S_OK;
1061 static IDispatchVtbl WebBrowserEvents2Vtbl = {
1062 WebBrowserEvents2_QueryInterface,
1063 Dispatch_AddRef,
1064 Dispatch_Release,
1065 Dispatch_GetTypeInfoCount,
1066 Dispatch_GetTypeInfo,
1067 Dispatch_GetIDsOfNames,
1068 WebBrowserEvents2_Invoke
1071 static IDispatch WebBrowserEvents2 = { &WebBrowserEvents2Vtbl };
1073 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
1075 return QueryInterface(riid, ppv);
1078 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
1080 return 2;
1083 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
1085 return 1;
1088 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
1090 ok(0, "unexpected call\n");
1091 return E_NOTIMPL;
1094 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker,
1095 IMoniker **ppmon)
1097 ok(0, "unexpected call\n");
1098 return E_NOTIMPL;
1101 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
1103 CHECK_EXPECT(GetContainer);
1105 ok(ppContainer != NULL, "ppContainer == NULL\n");
1106 if(ppContainer)
1107 *ppContainer = &OleContainer;
1109 return S_OK;
1112 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
1114 CHECK_EXPECT(ShowObject);
1115 return S_OK;
1118 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
1120 ok(0, "unexpected call\n");
1121 return E_NOTIMPL;
1124 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
1126 ok(0, "unexpected call\n");
1127 return E_NOTIMPL;
1130 static const IOleClientSiteVtbl ClientSiteVtbl = {
1131 ClientSite_QueryInterface,
1132 ClientSite_AddRef,
1133 ClientSite_Release,
1134 ClientSite_SaveObject,
1135 ClientSite_GetMoniker,
1136 ClientSite_GetContainer,
1137 ClientSite_ShowObject,
1138 ClientSite_OnShowWindow,
1139 ClientSite_RequestNewObjectLayout
1142 static IOleClientSite ClientSite = { &ClientSiteVtbl };
1143 static IOleClientSite ClientSite2 = { &ClientSiteVtbl };
1145 static HRESULT WINAPI IOleControlSite_fnQueryInterface(IOleControlSite *iface, REFIID riid, void **ppv)
1147 *ppv = NULL;
1148 return E_NOINTERFACE;
1151 static ULONG WINAPI IOleControlSite_fnAddRef(IOleControlSite *iface)
1153 return 2;
1156 static ULONG WINAPI IOleControlSite_fnRelease(IOleControlSite *iface)
1158 return 1;
1161 static HRESULT WINAPI IOleControlSite_fnOnControlInfoChanged(IOleControlSite* This)
1163 ok(0, "unexpected call\n");
1164 return E_NOTIMPL;
1167 static HRESULT WINAPI IOleControlSite_fnLockInPlaceActive(IOleControlSite* This,
1168 BOOL fLock)
1170 ok(0, "unexpected call\n");
1171 return E_NOTIMPL;
1174 static HRESULT WINAPI IOleControlSite_fnGetExtendedControl(IOleControlSite* This,
1175 IDispatch **ppDisp)
1177 ok(0, "unexpected call\n");
1178 return E_NOTIMPL;
1181 static HRESULT WINAPI IOleControlSite_fnTransformCoords(IOleControlSite* This,
1182 POINTL *pPtlHimetric,
1183 POINTF *pPtfContainer,
1184 DWORD dwFlags)
1186 ok(0, "unexpected call\n");
1187 return E_NOTIMPL;
1190 static HRESULT WINAPI IOleControlSite_fnTranslateAccelerator(IOleControlSite* This, MSG *pMsg,
1191 DWORD grfModifiers)
1193 CHECK_EXPECT(ControlSite_TranslateAccelerator);
1194 return hr_site_TranslateAccelerator;
1197 static HRESULT WINAPI IOleControlSite_fnOnFocus(IOleControlSite* This, BOOL fGotFocus)
1199 if(fGotFocus)
1200 CHECK_EXPECT2(OnFocus_TRUE);
1201 else
1202 CHECK_EXPECT2(OnFocus_FALSE);
1203 return E_NOTIMPL;
1206 static HRESULT WINAPI IOleControlSite_fnShowPropertyFrame(IOleControlSite* This)
1208 ok(0, "unexpected call\n");
1209 return E_NOTIMPL;
1212 static IOleControlSiteVtbl ControlSiteVtbl = {
1213 IOleControlSite_fnQueryInterface,
1214 IOleControlSite_fnAddRef,
1215 IOleControlSite_fnRelease,
1216 IOleControlSite_fnOnControlInfoChanged,
1217 IOleControlSite_fnLockInPlaceActive,
1218 IOleControlSite_fnGetExtendedControl,
1219 IOleControlSite_fnTransformCoords,
1220 IOleControlSite_fnTranslateAccelerator,
1221 IOleControlSite_fnOnFocus,
1222 IOleControlSite_fnShowPropertyFrame
1225 static IOleControlSite ControlSite = { &ControlSiteVtbl };
1227 static HRESULT WINAPI InPlaceUIWindow_QueryInterface(IOleInPlaceFrame *iface,
1228 REFIID riid, void **ppv)
1230 ok(0, "unexpected call\n");
1231 return E_NOINTERFACE;
1234 static ULONG WINAPI InPlaceUIWindow_AddRef(IOleInPlaceFrame *iface)
1236 return 2;
1239 static ULONG WINAPI InPlaceUIWindow_Release(IOleInPlaceFrame *iface)
1241 return 1;
1244 static HRESULT WINAPI InPlaceUIWindow_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
1246 ok(0, "unexpected call\n");
1247 return E_NOTIMPL;
1250 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
1252 CHECK_EXPECT(Frame_GetWindow);
1253 ok(phwnd != NULL, "phwnd == NULL\n");
1254 if(phwnd)
1255 *phwnd = container_hwnd;
1256 return S_OK;
1259 static HRESULT WINAPI InPlaceUIWindow_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
1261 ok(0, "unexpected call\n");
1262 return E_NOTIMPL;
1265 static HRESULT WINAPI InPlaceUIWindow_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
1267 ok(0, "unexpected call\n");
1268 return E_NOTIMPL;
1271 static HRESULT WINAPI InPlaceUIWindow_RequestBorderSpace(IOleInPlaceFrame *iface,
1272 LPCBORDERWIDTHS pborderwidths)
1274 ok(0, "unexpected call\n");
1275 return E_NOTIMPL;
1278 static HRESULT WINAPI InPlaceUIWindow_SetBorderSpace(IOleInPlaceFrame *iface,
1279 LPCBORDERWIDTHS pborderwidths)
1281 ok(0, "unexpected call\n");
1282 return E_NOTIMPL;
1285 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
1286 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
1288 CHECK_EXPECT(UIWindow_SetActiveObject);
1289 if(!test_close && !test_hide) {
1290 ok(pActiveObject != NULL, "pActiveObject = NULL\n");
1291 ok(!lstrcmpW(pszObjName, L"item"), "unexpected pszObjName\n");
1292 } else {
1293 ok(!pActiveObject, "pActiveObject != NULL\n");
1294 ok(!pszObjName, "pszObjName != NULL\n");
1296 return S_OK;
1299 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
1300 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
1302 CHECK_EXPECT(Frame_SetActiveObject);
1303 if(!test_close && !test_hide) {
1304 ok(pActiveObject != NULL, "pActiveObject = NULL\n");
1305 ok(!lstrcmpW(pszObjName, L"item"), "unexpected pszObjName\n");
1306 } else {
1307 ok(!pActiveObject, "pActiveObject != NULL\n");
1308 ok(!pszObjName, "pszObjName != NULL\n");
1310 return S_OK;
1313 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
1314 LPOLEMENUGROUPWIDTHS lpMenuWidths)
1316 ok(0, "unexpected call\n");
1317 return E_NOTIMPL;
1320 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
1321 HOLEMENU holemenu, HWND hwndActiveObject)
1323 CHECK_EXPECT(SetMenu);
1324 ok(hmenuShared == NULL, "hmenuShared=%p\n", hmenuShared);
1325 ok(holemenu == NULL, "holemenu=%p\n", holemenu);
1326 ok(hwndActiveObject == shell_embedding_hwnd, "hwndActiveObject=%p, expected %p\n",
1327 hwndActiveObject, shell_embedding_hwnd);
1328 return S_OK;
1331 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
1333 ok(0, "unexpected call\n");
1334 return E_NOTIMPL;
1337 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
1339 CHECK_EXPECT2(SetStatusText);
1340 /* FIXME: Check pszStatusText */
1341 return S_OK;
1344 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
1346 if(fEnable)
1347 CHECK_EXPECT2(EnableModeless_TRUE);
1348 else
1349 CHECK_EXPECT2(EnableModeless_FALSE);
1350 return S_OK;
1353 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
1355 ok(0, "unexpected call\n");
1356 return E_NOTIMPL;
1359 static const IOleInPlaceFrameVtbl InPlaceUIWindowVtbl = {
1360 InPlaceUIWindow_QueryInterface,
1361 InPlaceUIWindow_AddRef,
1362 InPlaceUIWindow_Release,
1363 InPlaceUIWindow_GetWindow,
1364 InPlaceUIWindow_ContextSensitiveHelp,
1365 InPlaceUIWindow_GetBorder,
1366 InPlaceUIWindow_RequestBorderSpace,
1367 InPlaceUIWindow_SetBorderSpace,
1368 InPlaceUIWindow_SetActiveObject,
1371 static IOleInPlaceUIWindow InPlaceUIWindow = { (IOleInPlaceUIWindowVtbl*)&InPlaceUIWindowVtbl };
1373 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = {
1374 InPlaceUIWindow_QueryInterface,
1375 InPlaceUIWindow_AddRef,
1376 InPlaceUIWindow_Release,
1377 InPlaceFrame_GetWindow,
1378 InPlaceUIWindow_ContextSensitiveHelp,
1379 InPlaceUIWindow_GetBorder,
1380 InPlaceUIWindow_RequestBorderSpace,
1381 InPlaceUIWindow_SetBorderSpace,
1382 InPlaceFrame_SetActiveObject,
1383 InPlaceFrame_InsertMenus,
1384 InPlaceFrame_SetMenu,
1385 InPlaceFrame_RemoveMenus,
1386 InPlaceFrame_SetStatusText,
1387 InPlaceFrame_EnableModeless,
1388 InPlaceFrame_TranslateAccelerator
1391 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
1393 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
1395 return QueryInterface(riid, ppv);
1398 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
1400 return 2;
1403 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSiteEx *iface)
1405 return 1;
1408 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
1410 CHECK_EXPECT(Site_GetWindow);
1411 ok(phwnd != NULL, "phwnd == NULL\n");
1412 if(phwnd)
1413 *phwnd = container_hwnd;
1414 return S_OK;
1417 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
1419 ok(0, "unexpected call\n");
1420 return E_NOTIMPL;
1423 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
1425 CHECK_EXPECT(CanInPlaceActivate);
1426 return S_OK;
1429 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
1431 CHECK_EXPECT(OnInPlaceActivate);
1432 return S_OK;
1435 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
1437 CHECK_EXPECT(OnUIActivate);
1438 return S_OK;
1441 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
1442 IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
1443 LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
1445 static const RECT pos_rect = {2,1,1002,901};
1446 static const RECT clip_rect = {10,10,990,890};
1448 CHECK_EXPECT(GetWindowContext);
1450 ok(ppFrame != NULL, "ppFrame = NULL\n");
1451 if(ppFrame)
1452 *ppFrame = &InPlaceFrame;
1454 ok(ppDoc != NULL, "ppDoc = NULL\n");
1455 if(ppDoc)
1456 *ppDoc = &InPlaceUIWindow;
1458 ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
1459 if(lprcPosRect)
1460 memcpy(lprcPosRect, &pos_rect, sizeof(RECT));
1462 ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
1463 if(lprcClipRect)
1464 memcpy(lprcClipRect, &clip_rect, sizeof(RECT));
1466 ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n");
1467 if(lpFrameInfo) {
1468 ok(lpFrameInfo->cb == sizeof(*lpFrameInfo), "lpFrameInfo->cb = %u, expected %u\n", lpFrameInfo->cb, (unsigned)sizeof(*lpFrameInfo));
1469 lpFrameInfo->fMDIApp = FALSE;
1470 lpFrameInfo->hwndFrame = container_hwnd;
1471 lpFrameInfo->haccel = NULL;
1472 lpFrameInfo->cAccelEntries = 0;
1475 return S_OK;
1478 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtant)
1480 ok(0, "unexpected call\n");
1481 return E_NOTIMPL;
1484 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
1486 CHECK_EXPECT(OnUIDeactivate);
1487 ok(!fUndoable, "fUndoable should be FALSE\n");
1488 return S_OK;
1491 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
1493 CHECK_EXPECT(OnInPlaceDeactivate);
1494 return S_OK;
1497 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
1499 ok(0, "unexpected call\n");
1500 return E_NOTIMPL;
1503 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
1505 ok(0, "unexpected call\n");
1506 return E_NOTIMPL;
1509 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
1511 ok(0, "unexpected call\n");
1512 return E_NOTIMPL;
1515 static HRESULT WINAPI InPlaceSite_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface,
1516 BOOL *pNoRedraw, DWORD dwFlags)
1518 ok(0, "unexpected call\n");
1519 return E_NOTIMPL;
1522 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface,
1523 BOOL fNoRedraw)
1525 ok(0, "unexpected call\n");
1526 return E_NOTIMPL;
1529 static HRESULT WINAPI InPlaceSite_RequestUIActivate(IOleInPlaceSiteEx *iface)
1531 CHECK_EXPECT2(RequestUIActivate);
1532 return S_OK;
1535 static const IOleInPlaceSiteExVtbl InPlaceSiteExVtbl = {
1536 InPlaceSite_QueryInterface,
1537 InPlaceSite_AddRef,
1538 InPlaceSite_Release,
1539 InPlaceSite_GetWindow,
1540 InPlaceSite_ContextSensitiveHelp,
1541 InPlaceSite_CanInPlaceActivate,
1542 InPlaceSite_OnInPlaceActivate,
1543 InPlaceSite_OnUIActivate,
1544 InPlaceSite_GetWindowContext,
1545 InPlaceSite_Scroll,
1546 InPlaceSite_OnUIDeactivate,
1547 InPlaceSite_OnInPlaceDeactivate,
1548 InPlaceSite_DiscardUndoState,
1549 InPlaceSite_DeactivateAndUndo,
1550 InPlaceSite_OnPosRectChange,
1551 InPlaceSite_OnInPlaceActivateEx,
1552 InPlaceSite_OnInPlaceDeactivateEx,
1553 InPlaceSite_RequestUIActivate
1556 static IOleInPlaceSiteEx InPlaceSite = { &InPlaceSiteExVtbl };
1558 static HRESULT WINAPI DocHostUIHandler_QueryInterface(IDocHostUIHandler2 *iface, REFIID riid, void **ppv)
1560 return QueryInterface(riid, ppv);
1563 static ULONG WINAPI DocHostUIHandler_AddRef(IDocHostUIHandler2 *iface)
1565 return 2;
1568 static ULONG WINAPI DocHostUIHandler_Release(IDocHostUIHandler2 *iface)
1570 return 1;
1573 static HRESULT WINAPI DocHostUIHandler_ShowContextMenu(IDocHostUIHandler2 *iface, DWORD dwID, POINT *ppt,
1574 IUnknown *pcmdtReserved, IDispatch *pdicpReserved)
1576 ok(0, "unexpected call %ld %p %p %p\n", dwID, ppt, pcmdtReserved, pdicpReserved);
1577 return S_FALSE;
1580 static HRESULT WINAPI DocHostUIHandler_GetHostInfo(IDocHostUIHandler2 *iface, DOCHOSTUIINFO *pInfo)
1582 CHECK_EXPECT2(GetHostInfo);
1583 ok(pInfo != NULL, "pInfo=NULL\n");
1584 if(pInfo) {
1585 ok(pInfo->cbSize == sizeof(DOCHOSTUIINFO) || broken(!pInfo->cbSize), "pInfo->cbSize=%lu\n", pInfo->cbSize);
1586 ok(!pInfo->dwFlags, "pInfo->dwFlags=%08lx, expected 0\n", pInfo->dwFlags);
1587 ok(!pInfo->dwDoubleClick, "pInfo->dwDoubleClick=%08lx, expected 0\n", pInfo->dwDoubleClick);
1588 ok(!pInfo->pchHostCss, "pInfo->pchHostCss=%p, expected NULL\n", pInfo->pchHostCss);
1589 ok(!pInfo->pchHostNS, "pInfo->pchhostNS=%p, expected NULL\n", pInfo->pchHostNS);
1591 return E_FAIL;
1594 static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD dwID,
1595 IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget,
1596 IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
1598 CHECK_EXPECT(ShowUI);
1599 return E_NOTIMPL;
1602 static HRESULT WINAPI DocHostUIHandler_HideUI(IDocHostUIHandler2 *iface)
1604 CHECK_EXPECT(HideUI);
1605 return E_NOTIMPL;
1608 static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface)
1610 CHECK_EXPECT2(UpdateUI);
1611 return E_NOTIMPL;
1614 static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable)
1616 if(fEnable)
1617 CHECK_EXPECT(DocHost_EnableModeless_TRUE);
1618 else
1619 CHECK_EXPECT(DocHost_EnableModeless_FALSE);
1621 return S_OK;
1624 static HRESULT WINAPI DocHostUIHandler_OnDocWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
1626 ok(0, "unexpected call\n");
1627 return E_NOTIMPL;
1630 static HRESULT WINAPI DocHostUIHandler_OnFrameWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
1632 ok(0, "unexpected call\n");
1633 return E_NOTIMPL;
1636 static HRESULT WINAPI DocHostUIHandler_ResizeBorder(IDocHostUIHandler2 *iface, LPCRECT prcBorder,
1637 IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
1639 ok(0, "unexpected call\n");
1640 return E_NOTIMPL;
1643 static HRESULT WINAPI DocHostUIHandler_TranslateAccelerator(IDocHostUIHandler2 *iface, LPMSG lpMsg,
1644 const GUID *pguidCmdGroup, DWORD nCmdID)
1646 CHECK_EXPECT(DocHost_TranslateAccelerator);
1647 ok(pguidCmdGroup != NULL, "Got NULL pguidCmdGroup.\n");
1648 if(pguidCmdGroup)
1649 ok(IsEqualGUID(pguidCmdGroup, &CGID_MSHTML), "Unexpected pguidCmdGroup\n");
1650 ok(lpMsg != NULL, "Got NULL lpMsg.\n");
1651 return hr_dochost_TranslateAccelerator;
1654 static HRESULT WINAPI DocHostUIHandler_GetOptionKeyPath(IDocHostUIHandler2 *iface,
1655 LPOLESTR *pchKey, DWORD dw)
1657 CHECK_EXPECT(GetOptionKeyPath);
1658 ok(pchKey != NULL, "pchKey==NULL\n");
1659 if(pchKey)
1660 ok(*pchKey == NULL, "*pchKey=%p\n", *pchKey);
1661 ok(!dw, "dw=%lx\n", dw);
1662 return E_NOTIMPL;
1665 static HRESULT WINAPI DocHostUIHandler_GetDropTarget(IDocHostUIHandler2 *iface,
1666 IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
1668 CHECK_EXPECT(GetDropTarget);
1669 return E_NOTIMPL;
1672 static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, IDispatch **ppDispatch)
1674 CHECK_EXPECT(GetExternal);
1675 *ppDispatch = NULL;
1676 return S_FALSE;
1679 static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate,
1680 OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
1682 todo_wine_if(is_downloading && !(dwl_flags & DWL_EXPECT_BEFORE_NAVIGATE))
1683 CHECK_EXPECT(TranslateUrl);
1684 return E_NOTIMPL;
1687 static HRESULT WINAPI DocHostUIHandler_FilterDataObject(IDocHostUIHandler2 *iface, IDataObject *pDO,
1688 IDataObject **ppPORet)
1690 ok(0, "unexpected call\n");
1691 return E_NOTIMPL;
1694 static HRESULT WINAPI DocHostUIHandler_GetOverrideKeyPath(IDocHostUIHandler2 *iface,
1695 LPOLESTR *pchKey, DWORD dw)
1697 CHECK_EXPECT(GetOverridesKeyPath);
1698 ok(pchKey != NULL, "pchKey==NULL\n");
1699 if(pchKey)
1700 ok(*pchKey == NULL, "*pchKey=%p\n", *pchKey);
1701 ok(!dw, "dw=%lx\n", dw);
1702 return E_NOTIMPL;
1705 static const IDocHostUIHandler2Vtbl DocHostUIHandlerVtbl = {
1706 DocHostUIHandler_QueryInterface,
1707 DocHostUIHandler_AddRef,
1708 DocHostUIHandler_Release,
1709 DocHostUIHandler_ShowContextMenu,
1710 DocHostUIHandler_GetHostInfo,
1711 DocHostUIHandler_ShowUI,
1712 DocHostUIHandler_HideUI,
1713 DocHostUIHandler_UpdateUI,
1714 DocHostUIHandler_EnableModeless,
1715 DocHostUIHandler_OnDocWindowActivate,
1716 DocHostUIHandler_OnFrameWindowActivate,
1717 DocHostUIHandler_ResizeBorder,
1718 DocHostUIHandler_TranslateAccelerator,
1719 DocHostUIHandler_GetOptionKeyPath,
1720 DocHostUIHandler_GetDropTarget,
1721 DocHostUIHandler_GetExternal,
1722 DocHostUIHandler_TranslateUrl,
1723 DocHostUIHandler_FilterDataObject,
1724 DocHostUIHandler_GetOverrideKeyPath
1727 static IDocHostUIHandler2 DocHostUIHandler = { &DocHostUIHandlerVtbl };
1730 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
1732 return QueryInterface(riid, ppv);
1735 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
1737 return 2;
1740 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
1742 return 1;
1745 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface,
1746 REFGUID guidService, REFIID riid, void **ppv)
1748 *ppv = NULL;
1750 if(!winetest_interactive)
1751 return E_NOINTERFACE;
1753 if (IsEqualGUID(&SID_STopLevelBrowser, guidService))
1754 trace("Service SID_STopLevelBrowser\n");
1755 else if (IsEqualGUID(&SID_SEditCommandTarget, guidService))
1756 trace("Service SID_SEditCommandTarget\n");
1757 else if (IsEqualGUID(&IID_ITargetFrame2, guidService))
1758 trace("Service IID_ITargetFrame2\n");
1759 else if (IsEqualGUID(&SID_SInternetSecurityManager, guidService))
1760 trace("Service SID_SInternetSecurityManager\n");
1761 else if (IsEqualGUID(&SID_SOleUndoManager, guidService))
1762 trace("Service SID_SOleUndoManager\n");
1763 else if (IsEqualGUID(&SID_IMimeInfo, guidService))
1764 trace("Service SID_IMimeInfo\n");
1765 else if (IsEqualGUID(&SID_STopWindow, guidService))
1766 trace("Service SID_STopWindow\n");
1768 /* 30D02401-6A81-11D0-8274-00C04FD5AE38 Explorer Bar: Search */
1769 /* D1E7AFEC-6A2E-11D0-8C78-00C04FD918B4 no info */
1770 /* A9227C3C-7F8E-11D0-8CB0-00A0C92DBFE8 no info */
1771 /* 371EA634-DC5C-11D1-BA57-00C04FC2040E one reference to IVersionHost */
1772 /* 3050F429-98B5-11CF-BB82-00AA00BDCE0B IID_IElementBehaviorFactory */
1773 /* 6D12FE80-7911-11CF-9534-0000C05BAE0B SID_DefView */
1774 /* AD7F6C62-F6BD-11D2-959B-006097C553C8 no info */
1775 /* 53A2D5B1-D2FC-11D0-84E0-006097C9987D no info */
1776 /* 3050F312-98B5-11CF-BB82-00AA00BDCE0B HTMLFrameBaseClass */
1777 /* 639447BD-B2D3-44B9-9FB0-510F23CB45E4 no info */
1778 /* 20C46561-8491-11CF-960C-0080C7F4EE85 no info */
1780 else
1781 trace("Service %s not supported\n", wine_dbgstr_guid(guidService));
1783 return E_NOINTERFACE;
1787 static const IServiceProviderVtbl ServiceProviderVtbl = {
1788 ServiceProvider_QueryInterface,
1789 ServiceProvider_AddRef,
1790 ServiceProvider_Release,
1791 ServiceProvider_QueryService
1794 static IServiceProvider ServiceProvider = { &ServiceProviderVtbl };
1797 static HRESULT QueryInterface(REFIID riid, void **ppv)
1799 *ppv = NULL;
1801 if(IsEqualGUID(&IID_IUnknown, riid)
1802 || IsEqualGUID(&IID_IOleClientSite, riid))
1803 *ppv = &ClientSite;
1804 else if(IsEqualGUID(&IID_IOleWindow, riid)
1805 || IsEqualGUID(&IID_IOleInPlaceSite, riid)
1806 || IsEqualGUID(&IID_IOleInPlaceSiteEx, riid))
1807 *ppv = &InPlaceSite;
1808 else if(IsEqualGUID(&IID_IDocHostUIHandler, riid)
1809 || IsEqualGUID(&IID_IDocHostUIHandler2, riid))
1810 *ppv = use_container_dochostui ? &DocHostUIHandler : NULL;
1811 else if(IsEqualGUID(&IID_IDispatch, riid))
1812 *ppv = &Dispatch;
1813 else if(IsEqualGUID(&IID_IServiceProvider, riid))
1814 *ppv = &ServiceProvider;
1815 else if(IsEqualGUID(&IID_IDocHostShowUI, riid))
1816 trace("interface IID_IDocHostShowUI\n");
1817 else if(IsEqualGUID(&IID_IOleControlSite, riid))
1818 *ppv = &ControlSite;
1819 else if(IsEqualGUID(&IID_IOleCommandTarget, riid))
1820 trace("interface IID_IOleCommandTarget\n");
1822 /* B6EA2050-048A-11D1-82B9-00C04FB9942E IAxWinHostWindow */
1824 else
1826 /* are there more interfaces, that a host can support? */
1827 trace("%s: interface not supported\n", wine_dbgstr_guid(riid));
1830 return (*ppv) ? S_OK : E_NOINTERFACE;
1833 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
1835 return DefWindowProcW(hwnd, msg, wParam, lParam);
1838 static HWND create_container_window(void)
1840 static WNDCLASSEXW wndclass = {
1841 sizeof(WNDCLASSEXW),
1843 wnd_proc,
1844 0, 0, NULL, NULL, NULL, NULL, NULL,
1845 L"WebBrowserContainer",
1846 NULL
1849 RegisterClassExW(&wndclass);
1850 return CreateWindowW(L"WebBrowserContainer", L"WebBrowserContainer",
1851 WS_OVERLAPPEDWINDOW, 10, 10, 600, 600, NULL, NULL, NULL, NULL);
1854 static void test_DoVerb(IWebBrowser2 *unk)
1856 IOleObject *oleobj;
1857 RECT rect = {0,0,1000,1000};
1858 HRESULT hres;
1859 DWORD connection;
1861 hres = IWebBrowser2_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1862 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08lx\n", hres);
1863 if(FAILED(hres))
1864 return;
1866 hres = IOleObject_Advise(oleobj, &test_sink, &connection);
1867 ok(hres == S_OK, "Advise failed: %08lx\n", hres);
1869 SET_EXPECT(CanInPlaceActivate);
1870 SET_EXPECT(Site_GetWindow);
1871 SET_EXPECT(OnInPlaceActivate);
1872 SET_EXPECT(GetWindowContext);
1873 SET_EXPECT(ShowObject);
1874 SET_EXPECT(GetContainer);
1875 SET_EXPECT(Frame_GetWindow);
1876 SET_EXPECT(OnUIActivate);
1877 SET_EXPECT(Frame_SetActiveObject);
1878 SET_EXPECT(UIWindow_SetActiveObject);
1879 SET_EXPECT(SetMenu);
1880 SET_EXPECT(OnFocus_TRUE);
1882 hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
1883 0, (HWND)0xdeadbeef, &rect);
1884 ok(hres == S_OK, "DoVerb failed: %08lx\n", hres);
1886 CHECK_CALLED(CanInPlaceActivate);
1887 CHECK_CALLED(Site_GetWindow);
1888 CHECK_CALLED(OnInPlaceActivate);
1889 CHECK_CALLED(GetWindowContext);
1890 CHECK_CALLED(ShowObject);
1891 CHECK_CALLED(GetContainer);
1892 CHECK_CALLED(Frame_GetWindow);
1893 CHECK_CALLED(OnUIActivate);
1894 CHECK_CALLED(Frame_SetActiveObject);
1895 CHECK_CALLED(UIWindow_SetActiveObject);
1896 CHECK_CALLED(SetMenu);
1897 CHECK_CALLED(OnFocus_TRUE);
1899 hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
1900 0, (HWND)0xdeadbeef, &rect);
1901 ok(hres == S_OK, "DoVerb failed: %08lx\n", hres);
1903 hres = IOleObject_Unadvise(oleobj, connection);
1904 ok(hres == S_OK, "Unadvise failed: %08lx\n", hres);
1906 IOleObject_Release(oleobj);
1909 static void call_DoVerb(IWebBrowser2 *unk, LONG verb)
1911 IOleObject *oleobj;
1912 RECT rect = {60,60,600,600};
1913 HRESULT hres;
1915 hres = IWebBrowser2_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1916 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08lx\n", hres);
1917 if(FAILED(hres))
1918 return;
1920 hres = IOleObject_DoVerb(oleobj, verb, NULL, &ClientSite,
1921 -1, container_hwnd, &rect);
1922 ok(hres == S_OK, "DoVerb failed: %08lx\n", hres);
1924 IOleObject_Release(oleobj);
1927 static HWND get_hwnd(IWebBrowser2 *unk)
1929 IOleInPlaceObject *inplace;
1930 HWND hwnd;
1931 HRESULT hres;
1933 hres = IWebBrowser2_QueryInterface(unk, &IID_IOleInPlaceObject, (void**)&inplace);
1934 ok(hres == S_OK, "QueryInterface(IID_OleInPlaceObject) failed: %08lx\n", hres);
1936 hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
1937 ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
1939 IOleInPlaceObject_Release(inplace);
1940 return hwnd;
1943 static void test_GetMiscStatus(IOleObject *oleobj)
1945 DWORD st, i;
1946 HRESULT hres;
1948 for(i=0; i<10; i++) {
1949 st = 0xdeadbeef;
1950 hres = IOleObject_GetMiscStatus(oleobj, i, &st);
1951 ok(hres == S_OK, "GetMiscStatus failed: %08lx\n", hres);
1952 ok(st == (OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT
1953 |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE),
1954 "st=%08lx, expected OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|"
1955 "OLEMISC_INSIDEOUT|OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE)\n", st);
1959 static void test_SetHostNames(IOleObject *oleobj)
1961 HRESULT hres;
1963 hres = IOleObject_SetHostNames(oleobj, L"test app", (void*)0xdeadbeef);
1964 ok(hres == S_OK, "SetHostNames failed: %08lx\n", hres);
1967 static void test_ClientSite(IWebBrowser2 *unk, IOleClientSite *client, BOOL stop_download)
1969 IOleObject *oleobj;
1970 IOleInPlaceObject *inplace;
1971 DWORD session_count;
1972 HWND hwnd;
1973 HRESULT hres;
1975 hres = IWebBrowser2_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1976 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08lx\n", hres);
1977 if(FAILED(hres))
1978 return;
1980 test_GetMiscStatus(oleobj);
1981 test_SetHostNames(oleobj);
1983 hres = IWebBrowser2_QueryInterface(unk, &IID_IOleInPlaceObject, (void**)&inplace);
1984 ok(hres == S_OK, "QueryInterface(IID_OleInPlaceObject) failed: %08lx\n", hres);
1985 if(FAILED(hres)) {
1986 IOleObject_Release(oleobj);
1987 return;
1990 hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
1991 ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
1992 ok((hwnd == NULL) ^ (client == NULL), "unexpected hwnd %p\n", hwnd);
1994 if(client) {
1995 session_count = pSetQueryNetSessionCount(SESSION_QUERY);
1997 SET_EXPECT(GetContainer);
1998 SET_EXPECT(Site_GetWindow);
1999 SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2000 SET_EXPECT(Invoke_AMBIENT_SILENT);
2001 }else if(stop_download) {
2002 if (use_container_olecmd) {
2003 SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
2004 SET_EXPECT(Invoke_DOWNLOADCOMPLETE);
2007 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
2008 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
2010 expect_update_commands_enable = 0;
2011 set_update_commands_enable = 0xdead;
2012 SET_EXPECT(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS);
2013 }else {
2014 SET_EXPECT(Invoke_STATUSTEXTCHANGE);
2015 SET_EXPECT(Invoke_PROGRESSCHANGE);
2016 nav_back_todo = nav_forward_todo = TRUE;
2019 hres = IOleObject_SetClientSite(oleobj, client);
2020 ok(hres == S_OK, "SetClientSite failed: %08lx\n", hres);
2022 if(client) {
2023 DWORD count = pSetQueryNetSessionCount(SESSION_QUERY);
2024 ok(count == session_count + 1, "count = %lu expected %lu\n", count, session_count + 1);
2026 CHECK_CALLED(GetContainer);
2027 CHECK_CALLED(Site_GetWindow);
2028 CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2029 CHECK_CALLED(Invoke_AMBIENT_SILENT);
2030 }else if(stop_download) {
2031 if (use_container_olecmd) {
2032 todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
2033 todo_wine CHECK_CALLED(Invoke_DOWNLOADCOMPLETE);
2036 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
2037 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
2039 todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS);
2040 todo_wine ok(expect_update_commands_enable == set_update_commands_enable,
2041 "got %d\n", set_update_commands_enable);
2042 }else {
2043 CLEAR_CALLED(Invoke_STATUSTEXTCHANGE); /* Called by IE9 */
2044 CLEAR_CALLED(Invoke_PROGRESSCHANGE);
2045 nav_back_todo = nav_forward_todo = FALSE;
2048 hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
2049 ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
2050 ok((hwnd == NULL) == (client == NULL), "unexpected hwnd %p\n", hwnd);
2052 shell_embedding_hwnd = hwnd;
2054 test_SetHostNames(oleobj);
2056 IOleInPlaceObject_Release(inplace);
2057 IOleObject_Release(oleobj);
2060 static void test_change_ClientSite(IWebBrowser2 *unk)
2062 BOOL old_use_container_olecmd = use_container_olecmd;
2063 IOleClientSite *doc_clientsite;
2064 IOleInPlaceObject *inplace;
2065 IOleCommandTarget *olecmd;
2066 IOleObject *oleobj;
2067 HRESULT hres;
2068 HWND hwnd;
2070 hres = IWebBrowser2_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
2071 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08lx\n", hres);
2072 if(FAILED(hres))
2073 return;
2075 use_container_olecmd = FALSE;
2077 SET_EXPECT(Site_GetWindow);
2078 SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2079 SET_EXPECT(Invoke_AMBIENT_SILENT);
2081 hres = IOleObject_SetClientSite(oleobj, &ClientSite2);
2082 ok(hres == S_OK, "SetClientSite failed: %08lx\n", hres);
2083 IOleObject_Release(oleobj);
2085 CHECK_CALLED(Site_GetWindow);
2086 CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2087 CHECK_CALLED(Invoke_AMBIENT_SILENT);
2089 doc_clientsite = get_dochost(unk);
2090 hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IOleCommandTarget, (void**)&olecmd);
2091 ok(hres == S_OK, "QueryInterface(IOleCommandTarget) failed: %08lx\n", hres);
2092 IOleClientSite_Release(doc_clientsite);
2094 hres = IWebBrowser2_QueryInterface(unk, &IID_IOleInPlaceObject, (void**)&inplace);
2095 ok(hres == S_OK, "QueryInterface(OleInPlaceObject) failed: %08lx\n", hres);
2096 hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
2097 ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
2098 ok(hwnd == shell_embedding_hwnd, "unexpected hwnd %p\n", hwnd);
2099 IOleInPlaceObject_Release(inplace);
2101 if(old_use_container_olecmd) {
2102 SET_EXPECT(Exec_UPDATECOMMANDS);
2104 hres = IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_UPDATECOMMANDS,
2105 OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);
2106 ok(hres == S_OK, "Exec(OLECMDID_UPDATECOMMAND) failed: %08lx\n", hres);
2108 CHECK_CALLED(Exec_UPDATECOMMANDS);
2109 use_container_olecmd = TRUE;
2112 IOleCommandTarget_Release(olecmd);
2115 static void test_ClassInfo(IWebBrowser2 *unk)
2117 IProvideClassInfo2 *class_info;
2118 TYPEATTR *type_attr;
2119 ITypeInfo *typeinfo;
2120 GUID guid;
2121 HRESULT hres;
2123 hres = IWebBrowser2_QueryInterface(unk, &IID_IProvideClassInfo2, (void**)&class_info);
2124 ok(hres == S_OK, "QueryInterface(IID_IProvideClassInfo) failed: %08lx\n", hres);
2125 if(FAILED(hres))
2126 return;
2128 hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, &guid);
2129 ok(hres == S_OK, "GetGUID failed: %08lx\n", hres);
2130 ok(IsEqualGUID(wb_version > 1 ? &DIID_DWebBrowserEvents2 : &DIID_DWebBrowserEvents, &guid), "wrong guid\n");
2132 hres = IProvideClassInfo2_GetGUID(class_info, 0, &guid);
2133 ok(hres == E_FAIL, "GetGUID failed: %08lx, expected E_FAIL\n", hres);
2134 ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
2136 hres = IProvideClassInfo2_GetGUID(class_info, 2, &guid);
2137 ok(hres == E_FAIL, "GetGUID failed: %08lx, expected E_FAIL\n", hres);
2138 ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
2140 hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, NULL);
2141 ok(hres == E_POINTER, "GetGUID failed: %08lx, expected E_POINTER\n", hres);
2143 hres = IProvideClassInfo2_GetGUID(class_info, 0, NULL);
2144 ok(hres == E_POINTER, "GetGUID failed: %08lx, expected E_POINTER\n", hres);
2146 typeinfo = NULL;
2147 hres = IProvideClassInfo2_GetClassInfo(class_info, &typeinfo);
2148 ok(hres == S_OK, "GetClassInfo failed: %08lx\n", hres);
2149 ok(typeinfo != NULL, "typeinfo == NULL\n");
2151 hres = ITypeInfo_GetTypeAttr(typeinfo, &type_attr);
2152 ok(hres == S_OK, "GetTypeAtr failed: %08lx\n", hres);
2154 ok(IsEqualGUID(&type_attr->guid, wb_version > 1 ? &CLSID_WebBrowser : &CLSID_WebBrowser_V1),
2155 "guid = %s\n", wine_dbgstr_guid(&type_attr->guid));
2157 ITypeInfo_ReleaseTypeAttr(typeinfo, type_attr);
2158 ITypeInfo_Release(typeinfo);
2160 IProvideClassInfo2_Release(class_info);
2163 #define expect_oleverb(a,b) _expect_oleverb(__LINE__,a,b)
2164 static void _expect_oleverb(unsigned line, const OLEVERB *verb, LONG exverb)
2166 ok_(__FILE__,line)(verb->lVerb == exverb, "verb->lVerb = %ld, expected %ld\n", verb->lVerb, exverb);
2167 ok_(__FILE__,line)(!verb->lpszVerbName, "verb->lpszVerbName = %s\n", wine_dbgstr_w(verb->lpszVerbName));
2168 ok_(__FILE__,line)(!verb->fuFlags, "verb->fuFlags = %lx\n", verb->fuFlags);
2169 ok_(__FILE__,line)(!verb->grfAttribs, "verb->grfAttribs = %lx\n", verb->grfAttribs);
2172 #define test_next_oleverb(a,b) _test_next_oleverb(__LINE__,a,b)
2173 static void _test_next_oleverb(unsigned line, IEnumOLEVERB *enum_verbs, LONG exverb)
2175 ULONG fetched = 0xdeadbeef;
2176 OLEVERB verb;
2177 HRESULT hres;
2179 fetched = 0xdeadbeef;
2180 memset(&verb, 0xa, sizeof(verb));
2181 hres = IEnumOLEVERB_Next(enum_verbs, 1, &verb, &fetched);
2182 ok_(__FILE__,line)(hres == S_OK, "Next failed: %08lx\n", hres);
2183 ok_(__FILE__,line)(!fetched, "fetched = %ld\n", fetched);
2184 _expect_oleverb(line, &verb, exverb);
2187 static void test_EnumVerbs(IWebBrowser2 *wb)
2189 IEnumOLEVERB *enum_verbs;
2190 IOleObject *oleobj;
2191 OLEVERB verbs[20];
2192 ULONG fetched;
2193 HRESULT hres;
2195 hres = IWebBrowser2_QueryInterface(wb, &IID_IOleObject, (void**)&oleobj);
2196 ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08lx\n", hres);
2198 hres = IOleObject_EnumVerbs(oleobj, &enum_verbs);
2199 IOleObject_Release(oleobj);
2200 ok(hres == S_OK, "EnumVerbs failed: %08lx\n", hres);
2201 ok(enum_verbs != NULL, "enum_verbs == NULL\n");
2203 fetched = 0xdeadbeef;
2204 memset(verbs, 0xa, sizeof(verbs));
2205 verbs[1].lVerb = 0xdeadbeef;
2206 hres = IEnumOLEVERB_Next(enum_verbs, ARRAY_SIZE(verbs), verbs, &fetched);
2207 ok(hres == S_OK, "Next failed: %08lx\n", hres);
2208 ok(!fetched, "fetched = %ld\n", fetched);
2209 /* Although fetched==0, an element is returned. */
2210 expect_oleverb(verbs, OLEIVERB_PRIMARY);
2211 /* The first argument is ignored and always one element is returned. */
2212 ok(verbs[1].lVerb == 0xdeadbeef, "verbs[1].lVerb = %lx\n", verbs[1].lVerb);
2214 test_next_oleverb(enum_verbs, OLEIVERB_INPLACEACTIVATE);
2215 test_next_oleverb(enum_verbs, OLEIVERB_UIACTIVATE);
2216 test_next_oleverb(enum_verbs, OLEIVERB_SHOW);
2217 test_next_oleverb(enum_verbs, OLEIVERB_HIDE);
2219 /* There is anouther verb, returned correctly. */
2220 fetched = 0xdeadbeef;
2221 memset(verbs, 0xa, sizeof(verbs));
2222 verbs[0].lVerb = 0xdeadbeef;
2223 hres = IEnumOLEVERB_Next(enum_verbs, ARRAY_SIZE(verbs), verbs, &fetched);
2224 todo_wine ok(hres == S_OK, "Next failed: %08lx\n", hres);
2225 todo_wine ok(fetched == 1, "fetched = %ld\n", fetched);
2226 todo_wine ok(verbs[0].lVerb != 0xdeadbeef, "verbs[0].lVerb = %lx\n", verbs[0].lVerb);
2228 hres = IEnumOLEVERB_Next(enum_verbs, ARRAY_SIZE(verbs), verbs, &fetched);
2229 ok(hres == S_FALSE, "Next failed: %08lx\n", hres);
2230 ok(!fetched, "fetched = %ld\n", fetched);
2232 hres = IEnumOLEVERB_Reset(enum_verbs);
2233 ok(hres == S_OK, "Reset failed: %08lx\n", hres);
2235 fetched = 0xdeadbeef;
2236 hres = IEnumOLEVERB_Next(enum_verbs, 1, verbs, &fetched);
2237 ok(hres == S_OK, "Next failed: %08lx\n", hres);
2238 ok(!fetched, "fetched = %ld\n", fetched);
2240 hres = IEnumOLEVERB_Next(enum_verbs, 1, verbs, NULL);
2241 ok(hres == S_OK, "Next failed: %08lx\n", hres);
2243 hres = IEnumOLEVERB_Skip(enum_verbs, 20);
2244 ok(hres == S_OK, "Reset failed: %08lx\n", hres);
2246 fetched = 0xdeadbeef;
2247 hres = IEnumOLEVERB_Next(enum_verbs, 1, verbs, &fetched);
2248 ok(hres == S_OK, "Next failed: %08lx\n", hres);
2249 ok(!fetched, "fetched = %ld\n", fetched);
2251 test_next_oleverb(enum_verbs, OLEIVERB_SHOW);
2253 IEnumOLEVERB_Release(enum_verbs);
2256 static void test_Persist(IWebBrowser2 *wb, int version)
2258 IPersist *persist;
2259 GUID guid;
2260 HRESULT hr;
2262 hr = IWebBrowser2_QueryInterface(wb, &IID_IPersist, (void **)&persist);
2263 ok(hr == S_OK, "QueryInterface(IID_IPersist) failed: %08lx\n", hr);
2265 hr = IPersist_GetClassID(persist, &guid);
2266 ok(hr == S_OK, "GetClassID failed: %08lx\n", hr);
2267 if (version == 1)
2268 ok(IsEqualGUID(&guid, &CLSID_WebBrowser_V1), "got wrong CLSID: %s\n", wine_dbgstr_guid(&guid));
2269 else
2270 ok(IsEqualGUID(&guid, &CLSID_WebBrowser), "got wrong CLSID: %s\n", wine_dbgstr_guid(&guid));
2272 IPersist_Release(persist);
2275 static void test_OleObject(IWebBrowser2 *wb, int version)
2277 IOleObject *oleobj;
2278 CLSID clsid;
2279 HRESULT hr;
2281 hr = IWebBrowser2_QueryInterface(wb, &IID_IOleObject, (void **)&oleobj);
2282 ok(hr == S_OK, "QueryInterface(IID_IOleObject) failed: %08lx\n", hr);
2284 hr = IOleObject_GetUserClassID(oleobj, &clsid);
2285 ok(hr == S_OK, "GetUserClassID failed: %08lx\n", hr);
2286 if (version == 1)
2287 ok(IsEqualGUID(&clsid, &CLSID_WebBrowser_V1), "got wrong CLSID: %s\n", wine_dbgstr_guid(&clsid));
2288 else
2289 ok(IsEqualGUID(&clsid, &CLSID_WebBrowser), "got wrong CLSID: %s\n", wine_dbgstr_guid(&clsid));
2291 IOleObject_Release(oleobj);
2294 static void test_ie_funcs(IWebBrowser2 *wb)
2296 IDispatch *disp;
2297 VARIANT_BOOL b;
2298 int i;
2299 SHANDLE_PTR hwnd;
2300 HRESULT hres;
2301 BSTR sName;
2303 /* HWND */
2305 hwnd = 0xdeadbeef;
2306 hres = IWebBrowser2_get_HWND(wb, &hwnd);
2307 ok(hres == E_FAIL, "get_HWND failed: %08lx, expected E_FAIL\n", hres);
2308 ok(hwnd == 0, "unexpected hwnd %p\n", (PVOID)hwnd);
2310 /* MenuBar */
2312 hres = IWebBrowser2_get_MenuBar(wb, &b);
2313 ok(hres == S_OK, "get_MenuBar failed: %08lx\n", hres);
2314 ok(b == VARIANT_TRUE, "b=%x\n", b);
2316 SET_EXPECT(Invoke_ONMENUBAR);
2317 hres = IWebBrowser2_put_MenuBar(wb, (exvb = VARIANT_FALSE));
2318 ok(hres == S_OK, "put_MenuBar failed: %08lx\n", hres);
2319 CHECK_CALLED(Invoke_ONMENUBAR);
2321 hres = IWebBrowser2_get_MenuBar(wb, &b);
2322 ok(hres == S_OK, "get_MenuBar failed: %08lx\n", hres);
2323 ok(b == VARIANT_FALSE, "b=%x\n", b);
2325 SET_EXPECT(Invoke_ONMENUBAR);
2326 hres = IWebBrowser2_put_MenuBar(wb, (exvb = 100));
2327 ok(hres == S_OK, "put_MenuBar failed: %08lx\n", hres);
2328 CHECK_CALLED(Invoke_ONMENUBAR);
2330 hres = IWebBrowser2_get_MenuBar(wb, &b);
2331 ok(hres == S_OK, "get_MenuBar failed: %08lx\n", hres);
2332 ok(b == VARIANT_TRUE, "b=%x\n", b);
2334 /* AddressBar */
2336 hres = IWebBrowser2_get_AddressBar(wb, &b);
2337 ok(hres == S_OK, "get_AddressBar failed: %08lx\n", hres);
2338 ok(b == VARIANT_TRUE, "b=%x\n", b);
2340 SET_EXPECT(Invoke_ONADDRESSBAR);
2341 hres = IWebBrowser2_put_AddressBar(wb, (exvb = VARIANT_FALSE));
2342 ok(hres == S_OK, "put_AddressBar failed: %08lx\n", hres);
2343 CHECK_CALLED(Invoke_ONADDRESSBAR);
2345 hres = IWebBrowser2_get_AddressBar(wb, &b);
2346 ok(hres == S_OK, "get_MenuBar failed: %08lx\n", hres);
2347 ok(b == VARIANT_FALSE, "b=%x\n", b);
2349 SET_EXPECT(Invoke_ONADDRESSBAR);
2350 hres = IWebBrowser2_put_AddressBar(wb, (exvb = 100));
2351 ok(hres == S_OK, "put_AddressBar failed: %08lx\n", hres);
2352 CHECK_CALLED(Invoke_ONADDRESSBAR);
2354 hres = IWebBrowser2_get_AddressBar(wb, &b);
2355 ok(hres == S_OK, "get_AddressBar failed: %08lx\n", hres);
2356 ok(b == VARIANT_TRUE, "b=%x\n", b);
2358 SET_EXPECT(Invoke_ONADDRESSBAR);
2359 hres = IWebBrowser2_put_AddressBar(wb, (exvb = VARIANT_TRUE));
2360 ok(hres == S_OK, "put_MenuBar failed: %08lx\n", hres);
2361 CHECK_CALLED(Invoke_ONADDRESSBAR);
2363 /* StatusBar */
2365 hres = IWebBrowser2_get_StatusBar(wb, &b);
2366 ok(hres == S_OK, "get_StatusBar failed: %08lx\n", hres);
2367 ok(b == VARIANT_TRUE, "b=%x\n", b);
2369 SET_EXPECT(Invoke_ONSTATUSBAR);
2370 hres = IWebBrowser2_put_StatusBar(wb, (exvb = VARIANT_TRUE));
2371 ok(hres == S_OK, "put_StatusBar failed: %08lx\n", hres);
2372 CHECK_CALLED(Invoke_ONSTATUSBAR);
2374 hres = IWebBrowser2_get_StatusBar(wb, &b);
2375 ok(hres == S_OK, "get_StatusBar failed: %08lx\n", hres);
2376 ok(b == VARIANT_TRUE, "b=%x\n", b);
2378 SET_EXPECT(Invoke_ONSTATUSBAR);
2379 hres = IWebBrowser2_put_StatusBar(wb, (exvb = VARIANT_FALSE));
2380 ok(hres == S_OK, "put_StatusBar failed: %08lx\n", hres);
2381 CHECK_CALLED(Invoke_ONSTATUSBAR);
2383 hres = IWebBrowser2_get_StatusBar(wb, &b);
2384 ok(hres == S_OK, "get_StatusBar failed: %08lx\n", hres);
2385 ok(b == VARIANT_FALSE, "b=%x\n", b);
2387 SET_EXPECT(Invoke_ONSTATUSBAR);
2388 hres = IWebBrowser2_put_StatusBar(wb, (exvb = 100));
2389 ok(hres == S_OK, "put_StatusBar failed: %08lx\n", hres);
2390 CHECK_CALLED(Invoke_ONSTATUSBAR);
2392 hres = IWebBrowser2_get_StatusBar(wb, &b);
2393 ok(hres == S_OK, "get_StatusBar failed: %08lx\n", hres);
2394 ok(b == VARIANT_TRUE, "b=%x\n", b);
2396 /* ToolBar */
2398 hres = IWebBrowser2_get_ToolBar(wb, &i);
2399 ok(hres == S_OK, "get_ToolBar failed: %08lx\n", hres);
2400 ok(i, "i=%x\n", i);
2402 SET_EXPECT(Invoke_ONTOOLBAR);
2403 hres = IWebBrowser2_put_ToolBar(wb, (exvb = VARIANT_FALSE));
2404 ok(hres == S_OK, "put_ToolBar failed: %08lx\n", hres);
2405 CHECK_CALLED(Invoke_ONTOOLBAR);
2407 hres = IWebBrowser2_get_ToolBar(wb, &i);
2408 ok(hres == S_OK, "get_ToolBar failed: %08lx\n", hres);
2409 ok(i == VARIANT_FALSE, "b=%x\n", i);
2411 SET_EXPECT(Invoke_ONTOOLBAR);
2412 hres = IWebBrowser2_put_ToolBar(wb, (exvb = 100));
2413 ok(hres == S_OK, "put_ToolBar failed: %08lx\n", hres);
2414 CHECK_CALLED(Invoke_ONTOOLBAR);
2416 hres = IWebBrowser2_get_ToolBar(wb, &i);
2417 ok(hres == S_OK, "get_ToolBar failed: %08lx\n", hres);
2418 ok(i, "i=%x\n", i);
2420 SET_EXPECT(Invoke_ONTOOLBAR);
2421 hres = IWebBrowser2_put_ToolBar(wb, (exvb = VARIANT_TRUE));
2422 ok(hres == S_OK, "put_ToolBar failed: %08lx\n", hres);
2423 CHECK_CALLED(Invoke_ONTOOLBAR);
2425 /* FullScreen */
2427 hres = IWebBrowser2_get_FullScreen(wb, &b);
2428 ok(hres == S_OK, "get_FullScreen failed: %08lx\n", hres);
2429 ok(b == VARIANT_FALSE, "b=%x\n", b);
2431 SET_EXPECT(Invoke_ONFULLSCREEN);
2432 hres = IWebBrowser2_put_FullScreen(wb, (exvb = VARIANT_TRUE));
2433 ok(hres == S_OK, "put_FullScreen failed: %08lx\n", hres);
2434 CHECK_CALLED(Invoke_ONFULLSCREEN);
2436 hres = IWebBrowser2_get_FullScreen(wb, &b);
2437 ok(hres == S_OK, "get_FullScreen failed: %08lx\n", hres);
2438 ok(b == VARIANT_TRUE, "b=%x\n", b);
2440 SET_EXPECT(Invoke_ONFULLSCREEN);
2441 hres = IWebBrowser2_put_FullScreen(wb, (exvb = 100));
2442 ok(hres == S_OK, "put_FullScreen failed: %08lx\n", hres);
2443 CHECK_CALLED(Invoke_ONFULLSCREEN);
2445 hres = IWebBrowser2_get_FullScreen(wb, &b);
2446 ok(hres == S_OK, "get_FullScreen failed: %08lx\n", hres);
2447 ok(b == VARIANT_TRUE, "b=%x\n", b);
2449 SET_EXPECT(Invoke_ONFULLSCREEN);
2450 hres = IWebBrowser2_put_FullScreen(wb, (exvb = VARIANT_FALSE));
2451 ok(hres == S_OK, "put_FullScreen failed: %08lx\n", hres);
2452 CHECK_CALLED(Invoke_ONFULLSCREEN);
2454 /* TheaterMode */
2456 hres = IWebBrowser2_get_TheaterMode(wb, &b);
2457 ok(hres == S_OK, "get_TheaterMode failed: %08lx\n", hres);
2458 ok(b == VARIANT_FALSE, "b=%x\n", b);
2460 SET_EXPECT(Invoke_ONTHEATERMODE);
2461 hres = IWebBrowser2_put_TheaterMode(wb, (exvb = VARIANT_TRUE));
2462 ok(hres == S_OK, "put_TheaterMode failed: %08lx\n", hres);
2463 CHECK_CALLED(Invoke_ONTHEATERMODE);
2465 hres = IWebBrowser2_get_TheaterMode(wb, &b);
2466 ok(hres == S_OK, "get_TheaterMode failed: %08lx\n", hres);
2467 ok(b == VARIANT_TRUE, "b=%x\n", b);
2469 SET_EXPECT(Invoke_ONTHEATERMODE);
2470 hres = IWebBrowser2_put_TheaterMode(wb, (exvb = 100));
2471 ok(hres == S_OK, "put_TheaterMode failed: %08lx\n", hres);
2472 CHECK_CALLED(Invoke_ONTHEATERMODE);
2474 hres = IWebBrowser2_get_TheaterMode(wb, &b);
2475 ok(hres == S_OK, "get_TheaterMode failed: %08lx\n", hres);
2476 ok(b == VARIANT_TRUE, "b=%x\n", b);
2478 SET_EXPECT(Invoke_ONTHEATERMODE);
2479 hres = IWebBrowser2_put_TheaterMode(wb, (exvb = VARIANT_FALSE));
2480 ok(hres == S_OK, "put_TheaterMode failed: %08lx\n", hres);
2481 CHECK_CALLED(Invoke_ONTHEATERMODE);
2483 /* Resizable */
2485 b = 0x100;
2486 hres = IWebBrowser2_get_Resizable(wb, &b);
2487 ok(hres == E_NOTIMPL, "get_Resizable failed: %08lx\n", hres);
2488 ok(b == 0x100, "b=%x\n", b);
2490 SET_EXPECT(Invoke_WINDOWSETRESIZABLE);
2491 hres = IWebBrowser2_put_Resizable(wb, (exvb = VARIANT_TRUE));
2492 ok(hres == S_OK, "put_Resizable failed: %08lx\n", hres);
2493 CHECK_CALLED(Invoke_WINDOWSETRESIZABLE);
2495 SET_EXPECT(Invoke_WINDOWSETRESIZABLE);
2496 hres = IWebBrowser2_put_Resizable(wb, (exvb = VARIANT_FALSE));
2497 ok(hres == S_OK, "put_Resizable failed: %08lx\n", hres);
2498 CHECK_CALLED(Invoke_WINDOWSETRESIZABLE);
2500 hres = IWebBrowser2_get_Resizable(wb, &b);
2501 ok(hres == E_NOTIMPL, "get_Resizable failed: %08lx\n", hres);
2502 ok(b == 0x100, "b=%x\n", b);
2504 /* Application */
2506 disp = NULL;
2507 hres = IWebBrowser2_get_Application(wb, &disp);
2508 ok(hres == S_OK, "get_Application failed: %08lx\n", hres);
2509 ok(disp == (void*)wb, "disp=%p, expected %p\n", disp, wb);
2510 if(disp)
2511 IDispatch_Release(disp);
2513 hres = IWebBrowser2_get_Application(wb, NULL);
2514 ok(hres == E_POINTER, "get_Application failed: %08lx, expected E_POINTER\n", hres);
2516 /* Name */
2517 hres = IWebBrowser2_get_Name(wb, &sName);
2518 ok(hres == S_OK, "getName failed: %08lx, expected S_OK\n", hres);
2519 if (is_lang_english())
2520 ok(!lstrcmpW(sName, L"Microsoft Web Browser Control"), "got '%s', expected 'Microsoft Web Browser Control'\n", wine_dbgstr_w(sName));
2521 else /* Non-English cannot be blank. */
2522 ok(sName!=NULL, "get_Name return a NULL string.\n");
2523 SysFreeString(sName);
2525 /* RegisterAsDropTarget */
2526 hres = IWebBrowser2_get_RegisterAsDropTarget(wb, NULL);
2527 ok(hres == E_INVALIDARG, "get_RegisterAsDropTarget returned: %08lx\n", hres);
2529 /* Quit */
2531 hres = IWebBrowser2_Quit(wb);
2532 ok(hres == E_FAIL, "Quit failed: %08lx, expected E_FAIL\n", hres);
2535 static void test_Silent(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
2537 VARIANT_BOOL b;
2538 HRESULT hres;
2540 b = 100;
2541 hres = IWebBrowser2_get_Silent(wb, &b);
2542 ok(hres == S_OK, "get_Silent failed: %08lx\n", hres);
2543 ok(b == VARIANT_FALSE, "b=%x\n", b);
2545 hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
2546 ok(hres == S_OK, "set_Silent failed: %08lx\n", hres);
2548 b = 100;
2549 hres = IWebBrowser2_get_Silent(wb, &b);
2550 ok(hres == S_OK, "get_Silent failed: %08lx\n", hres);
2551 ok(b == VARIANT_TRUE, "b=%x\n", b);
2553 hres = IWebBrowser2_put_Silent(wb, 100);
2554 ok(hres == S_OK, "set_Silent failed: %08lx\n", hres);
2556 b = 100;
2557 hres = IWebBrowser2_get_Silent(wb, &b);
2558 ok(hres == S_OK, "get_Silent failed: %08lx\n", hres);
2559 ok(b == VARIANT_TRUE, "b=%x\n", b);
2561 hres = IWebBrowser2_put_Silent(wb, VARIANT_FALSE);
2562 ok(hres == S_OK, "set_Silent failed: %08lx\n", hres);
2564 b = 100;
2565 hres = IWebBrowser2_get_Silent(wb, &b);
2566 ok(hres == S_OK, "get_Silent failed: %08lx\n", hres);
2567 ok(b == VARIANT_FALSE, "b=%x\n", b);
2569 if(is_clientsite) {
2570 hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
2571 ok(hres == S_OK, "set_Silent failed: %08lx\n", hres);
2573 SET_EXPECT(Invoke_AMBIENT_SILENT);
2576 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_SILENT);
2577 ok(hres == S_OK, "OnAmbientPropertyChange failed %08lx\n", hres);
2579 if(is_clientsite)
2580 CHECK_CALLED(Invoke_AMBIENT_SILENT);
2582 b = 100;
2583 hres = IWebBrowser2_get_Silent(wb, &b);
2584 ok(hres == S_OK, "get_Silent failed: %08lx\n", hres);
2585 ok(b == VARIANT_FALSE, "b=%x\n", b);
2588 static void test_Offline(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
2590 VARIANT_BOOL b;
2591 HRESULT hres;
2593 b = 100;
2594 hres = IWebBrowser2_get_Offline(wb, &b);
2595 ok(hres == S_OK, "get_Offline failed: %08lx\n", hres);
2596 ok(b == VARIANT_FALSE, "b=%x\n", b);
2598 hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
2599 ok(hres == S_OK, "set_Offline failed: %08lx\n", hres);
2601 b = 100;
2602 hres = IWebBrowser2_get_Offline(wb, &b);
2603 ok(hres == S_OK, "get_Offline failed: %08lx\n", hres);
2604 ok(b == VARIANT_TRUE, "b=%x\n", b);
2606 hres = IWebBrowser2_put_Offline(wb, 100);
2607 ok(hres == S_OK, "set_Offline failed: %08lx\n", hres);
2609 b = 100;
2610 hres = IWebBrowser2_get_Offline(wb, &b);
2611 ok(hres == S_OK, "get_Offline failed: %08lx\n", hres);
2612 ok(b == VARIANT_TRUE, "b=%x\n", b);
2614 hres = IWebBrowser2_put_Offline(wb, VARIANT_FALSE);
2615 ok(hres == S_OK, "set_Offline failed: %08lx\n", hres);
2617 b = 100;
2618 hres = IWebBrowser2_get_Offline(wb, &b);
2619 ok(hres == S_OK, "get_Offline failed: %08lx\n", hres);
2620 ok(b == VARIANT_FALSE, "b=%x\n", b);
2622 if(is_clientsite) {
2623 hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
2624 ok(hres == S_OK, "set_Offline failed: %08lx\n", hres);
2626 SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2629 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
2630 ok(hres == S_OK, "OnAmbientPropertyChange failed %08lx\n", hres);
2632 if(is_clientsite)
2633 CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2635 b = 100;
2636 hres = IWebBrowser2_get_Offline(wb, &b);
2637 ok(hres == S_OK, "get_Offline failed: %08lx\n", hres);
2638 ok(b == VARIANT_FALSE, "b=%x\n", b);
2641 static void test_ambient_unknown(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
2643 HRESULT hres;
2645 SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2646 SET_EXPECT(Invoke_AMBIENT_SILENT);
2647 SET_EXPECT(Invoke_AMBIENT_USERMODE);
2648 SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
2649 SET_EXPECT(Invoke_AMBIENT_USERAGENT);
2650 SET_EXPECT(Invoke_AMBIENT_PALETTE);
2652 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_UNKNOWN);
2653 ok(hres == S_OK, "OnAmbientPropertyChange failed %08lx\n", hres);
2655 CHECK_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2656 CHECK_EXPECT(Invoke_AMBIENT_SILENT);
2657 CHECK_EXPECT(Invoke_AMBIENT_USERMODE);
2658 CHECK_EXPECT(Invoke_AMBIENT_DLCONTROL);
2659 CHECK_EXPECT(Invoke_AMBIENT_USERAGENT);
2660 CHECK_EXPECT(Invoke_AMBIENT_PALETTE);
2662 CLEAR_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2663 CLEAR_CALLED(Invoke_AMBIENT_SILENT);
2664 CLEAR_CALLED(Invoke_AMBIENT_USERMODE);
2665 CLEAR_CALLED(Invoke_AMBIENT_DLCONTROL);
2666 CLEAR_CALLED(Invoke_AMBIENT_USERAGENT);
2667 CLEAR_CALLED(Invoke_AMBIENT_PALETTE);
2670 static void test_wb_funcs(IWebBrowser2 *wb, BOOL is_clientsite)
2672 IOleControl *control;
2673 HRESULT hres;
2675 hres = IWebBrowser2_QueryInterface(wb, &IID_IOleControl, (void**)&control);
2676 ok(hres == S_OK, "Could not get IOleControl interface: %08lx\n", hres);
2678 test_Silent(wb, control, is_clientsite);
2679 test_Offline(wb, control, is_clientsite);
2680 test_ambient_unknown(wb, control, is_clientsite);
2682 IOleControl_Release(control);
2685 static void test_GetControlInfo(IWebBrowser2 *unk)
2687 IOleControl *control;
2688 CONTROLINFO info;
2689 HRESULT hres;
2691 hres = IWebBrowser2_QueryInterface(unk, &IID_IOleControl, (void**)&control);
2692 ok(hres == S_OK, "Could not get IOleControl: %08lx\n", hres);
2693 if(FAILED(hres))
2694 return;
2696 hres = IOleControl_GetControlInfo(control, &info);
2697 ok(hres == E_NOTIMPL, "GetControlInfo failed: %08lx, expected E_NOTIMPL\n", hres);
2698 hres = IOleControl_GetControlInfo(control, NULL);
2699 ok(hres == E_NOTIMPL, "GetControlInfo failed: %08lx, expected E_NOTIMPL\n", hres);
2701 IOleControl_Release(control);
2704 static void test_Extent(IWebBrowser2 *unk)
2706 IOleObject *oleobj;
2707 SIZE size, expected;
2708 HRESULT hres;
2709 DWORD dpi_x;
2710 DWORD dpi_y;
2711 HDC hdc;
2713 /* default aspect ratio is 96dpi / 96dpi */
2714 hdc = GetDC(0);
2715 dpi_x = GetDeviceCaps(hdc, LOGPIXELSX);
2716 dpi_y = GetDeviceCaps(hdc, LOGPIXELSY);
2717 ReleaseDC(0, hdc);
2718 if (dpi_x != 96 || dpi_y != 96)
2719 trace("dpi: %ld / %ld\n", dpi_y, dpi_y);
2721 hres = IWebBrowser2_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
2722 ok(hres == S_OK, "Could not get IOleObject: %08lx\n", hres);
2723 if(FAILED(hres))
2724 return;
2726 size.cx = size.cy = 0xdeadbeef;
2727 hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
2728 ok(hres == S_OK, "GetExtent failed: %08lx\n", hres);
2729 /* Default size is 50x20 pixels, in himetric units */
2730 expected.cx = MulDiv( 50, 2540, dpi_x );
2731 expected.cy = MulDiv( 20, 2540, dpi_y );
2732 ok(size.cx == expected.cx && size.cy == expected.cy, "size = {%ld %ld} (expected %ld %ld)\n",
2733 size.cx, size.cy, expected.cx, expected.cy );
2735 size.cx = 800;
2736 size.cy = 700;
2737 hres = IOleObject_SetExtent(oleobj, DVASPECT_CONTENT, &size);
2738 ok(hres == S_OK, "SetExtent failed: %08lx\n", hres);
2740 size.cx = size.cy = 0xdeadbeef;
2741 hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
2742 ok(hres == S_OK, "GetExtent failed: %08lx\n", hres);
2743 ok(size.cx == 800 && size.cy == 700, "size = {%ld %ld}\n", size.cx, size.cy);
2745 size.cx = size.cy = 0xdeadbeef;
2746 hres = IOleObject_GetExtent(oleobj, 0, &size);
2747 ok(hres == S_OK, "GetExtent failed: %08lx\n", hres);
2748 ok(size.cx == 800 && size.cy == 700, "size = {%ld %ld}\n", size.cx, size.cy);
2750 size.cx = 900;
2751 size.cy = 800;
2752 hres = IOleObject_SetExtent(oleobj, 0, &size);
2753 ok(hres == S_OK, "SetExtent failed: %08lx\n", hres);
2755 size.cx = size.cy = 0xdeadbeef;
2756 hres = IOleObject_GetExtent(oleobj, 0, &size);
2757 ok(hres == S_OK, "GetExtent failed: %08lx\n", hres);
2758 ok(size.cx == 900 && size.cy == 800, "size = {%ld %ld}\n", size.cx, size.cy);
2760 size.cx = size.cy = 0xdeadbeef;
2761 hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
2762 ok(hres == S_OK, "GetExtent failed: %08lx\n", hres);
2763 ok(size.cx == 900 && size.cy == 800, "size = {%ld %ld}\n", size.cx, size.cy);
2765 size.cx = 1000;
2766 size.cy = 900;
2767 hres = IOleObject_SetExtent(oleobj, 0xdeadbeef, &size);
2768 ok(hres == S_OK, "SetExtent failed: %08lx\n", hres);
2770 size.cx = size.cy = 0xdeadbeef;
2771 hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
2772 ok(hres == S_OK, "GetExtent failed: %08lx\n", hres);
2773 ok(size.cx == 1000 && size.cy == 900, "size = {%ld %ld}\n", size.cx, size.cy);
2775 size.cx = size.cy = 0xdeadbeef;
2776 hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
2777 ok(hres == S_OK, "GetExtent failed: %08lx\n", hres);
2778 ok(size.cx == 1000 && size.cy == 900, "size = {%ld %ld}\n", size.cx, size.cy);
2780 IOleObject_Release(oleobj);
2783 static void test_ConnectionPoint(IWebBrowser2 *unk, BOOL init)
2785 IConnectionPointContainer *container;
2786 IConnectionPoint *point;
2787 HRESULT hres;
2789 static DWORD dw = 100;
2791 hres = IWebBrowser2_QueryInterface(unk, &IID_IConnectionPointContainer, (void**)&container);
2792 ok(hres == S_OK, "QueryInterface(IID_IConnectionPointContainer) failed: %08lx\n", hres);
2793 if(FAILED(hres))
2794 return;
2796 hres = IConnectionPointContainer_FindConnectionPoint(container, &DIID_DWebBrowserEvents2, &point);
2797 IConnectionPointContainer_Release(container);
2798 ok(hres == S_OK, "FindConnectionPoint failed: %08lx\n", hres);
2799 if(FAILED(hres))
2800 return;
2802 if(init) {
2803 hres = IConnectionPoint_Advise(point, (IUnknown*)&WebBrowserEvents2, &dw);
2804 ok(hres == S_OK, "Advise failed: %08lx\n", hres);
2805 ok(dw == 1, "dw=%ld, expected 1\n", dw);
2806 }else {
2807 hres = IConnectionPoint_Unadvise(point, dw);
2808 ok(hres == S_OK, "Unadvise failed: %08lx\n", hres);
2811 IConnectionPoint_Release(point);
2814 static void test_Navigate2(IWebBrowser2 *webbrowser, const WCHAR *nav_url)
2816 const WCHAR *title = L"WineHQ - Run Windows applications on Linux, BSD, Solaris and Mac OS X";
2817 VARIANT url;
2818 BOOL is_file;
2819 HRESULT hres;
2821 test_LocationURL(webbrowser, is_first_load ? L"" : current_url);
2822 test_LocationName(webbrowser, is_first_load ? L"" : (is_http ? title : current_url));
2823 test_ready_state(is_first_load ? READYSTATE_UNINITIALIZED : READYSTATE_COMPLETE, VARIANT_FALSE);
2825 is_http = !memcmp(nav_url, "http:", 5);
2826 V_VT(&url) = VT_BSTR;
2827 V_BSTR(&url) = SysAllocString(current_url = nav_url);
2829 if((is_file = !wcsnicmp(nav_url, L"file://", 7)))
2830 current_url = nav_url + 7;
2832 if(is_first_load) {
2833 SET_EXPECT(Invoke_AMBIENT_USERMODE);
2834 SET_EXPECT(Invoke_PROPERTYCHANGE);
2835 SET_EXPECT(Invoke_BEFORENAVIGATE2);
2836 SET_EXPECT(Invoke_DOWNLOADBEGIN);
2837 if (use_container_olecmd) SET_EXPECT(Exec_SETDOWNLOADSTATE_1);
2838 SET_EXPECT(EnableModeless_FALSE);
2839 SET_EXPECT(Invoke_STATUSTEXTCHANGE);
2840 SET_EXPECT(SetStatusText);
2841 if(use_container_dochostui)
2842 SET_EXPECT(GetHostInfo);
2843 SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
2844 SET_EXPECT(Invoke_AMBIENT_USERAGENT);
2845 SET_EXPECT(Invoke_AMBIENT_PALETTE);
2846 if(use_container_dochostui) {
2847 SET_EXPECT(GetOptionKeyPath);
2848 SET_EXPECT(GetOverridesKeyPath);
2850 if (use_container_olecmd) {
2851 SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
2852 SET_EXPECT(Exec_SETPROGRESSMAX);
2853 SET_EXPECT(Exec_SETPROGRESSPOS);
2855 SET_EXPECT(Invoke_SETSECURELOCKICON);
2856 SET_EXPECT(Invoke_FILEDOWNLOAD);
2857 if (use_container_olecmd) SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
2858 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
2859 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
2860 SET_EXPECT(EnableModeless_TRUE);
2861 if (!use_container_olecmd) SET_EXPECT(Invoke_DOWNLOADCOMPLETE);
2862 if (is_file) SET_EXPECT(Invoke_PROGRESSCHANGE);
2865 hres = IWebBrowser2_Navigate2(webbrowser, &url, NULL, NULL, NULL, NULL);
2866 ok(hres == S_OK, "Navigate2 failed: %08lx\n", hres);
2868 if(is_first_load) {
2869 CHECK_CALLED(Invoke_AMBIENT_USERMODE);
2870 todo_wine CHECK_CALLED(Invoke_PROPERTYCHANGE);
2871 CHECK_CALLED(Invoke_BEFORENAVIGATE2);
2872 CHECK_CALLED(Invoke_DOWNLOADBEGIN);
2873 if (use_container_olecmd) todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_1);
2874 CHECK_CALLED(EnableModeless_FALSE);
2875 CHECK_CALLED(Invoke_STATUSTEXTCHANGE);
2876 CHECK_CALLED(SetStatusText);
2877 if(use_container_dochostui)
2878 CHECK_CALLED(GetHostInfo);
2879 CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
2880 CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
2881 CLEAR_CALLED(Invoke_AMBIENT_PALETTE); /* Not called by IE9 */
2882 if(use_container_dochostui) {
2883 CLEAR_CALLED(GetOptionKeyPath);
2884 CHECK_CALLED(GetOverridesKeyPath);
2886 if (use_container_olecmd) {
2887 todo_wine CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
2888 todo_wine CHECK_CALLED(Exec_SETPROGRESSMAX);
2889 todo_wine CHECK_CALLED(Exec_SETPROGRESSPOS);
2891 todo_wine CHECK_CALLED(Invoke_SETSECURELOCKICON);
2892 todo_wine CHECK_CALLED(Invoke_FILEDOWNLOAD);
2893 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
2894 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
2895 if (use_container_olecmd) todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
2896 CHECK_CALLED(EnableModeless_TRUE);
2897 if (!use_container_olecmd) CHECK_CALLED(Invoke_DOWNLOADCOMPLETE);
2898 if (is_file) todo_wine CHECK_CALLED(Invoke_PROGRESSCHANGE);
2901 VariantClear(&url);
2903 test_ready_state(READYSTATE_LOADING, VARIANT_FALSE);
2906 static void test_QueryStatusWB(IWebBrowser2 *webbrowser, BOOL has_document)
2908 HRESULT hres, success_state;
2909 OLECMDF success_flags;
2910 enum OLECMDF status;
2913 * We can tell the difference between the custom container target and the built-in target
2914 * since the custom target returns OLECMDF_SUPPORTED instead of OLECMDF_ENABLED.
2916 if (use_container_olecmd)
2917 success_flags = OLECMDF_SUPPORTED;
2918 else
2919 success_flags = OLECMDF_ENABLED;
2921 /* When no target is available (no document or custom target) an error is returned */
2922 if (has_document)
2923 success_state = S_OK;
2924 else
2925 success_state = E_UNEXPECTED;
2928 * Test a safe operation that exists as both a high-numbered MSHTML id and an OLECMDID.
2929 * These tests show that QueryStatusWB uses a NULL pguidCmdGroup, since OLECMDID_STOP
2930 * is enabled and IDM_STOP is not.
2932 status = 0xdeadbeef;
2933 if (use_container_olecmd) SET_EXPECT(QueryStatus_STOP);
2934 hres = IWebBrowser2_QueryStatusWB(webbrowser, OLECMDID_STOP, &status);
2935 ok(hres == success_state, "QueryStatusWB failed: %08lx %08lx\n", hres, success_state);
2936 todo_wine_if (!use_container_olecmd && has_document)
2937 ok((has_document && status == success_flags) || (!has_document && status == 0xdeadbeef),
2938 "OLECMDID_STOP not enabled/supported: %08x %08x\n", status, success_flags);
2939 status = 0xdeadbeef;
2940 if (use_container_olecmd) SET_EXPECT(QueryStatus_IDM_STOP);
2941 hres = IWebBrowser2_QueryStatusWB(webbrowser, IDM_STOP, &status);
2942 ok(hres == success_state, "QueryStatusWB failed: %08lx %08lx\n", hres, success_state);
2943 ok((has_document && status == 0) || (!has_document && status == 0xdeadbeef),
2944 "IDM_STOP is enabled/supported: %08x %d\n", status, has_document);
2947 static void test_ExecWB(IWebBrowser2 *webbrowser, BOOL has_document)
2949 HRESULT hres, olecmdid_state, idm_state;
2951 /* When no target is available (no document or custom target) an error is returned */
2952 if (has_document)
2954 olecmdid_state = S_OK;
2955 idm_state = OLECMDERR_E_NOTSUPPORTED;
2957 else
2959 olecmdid_state = E_UNEXPECTED;
2960 idm_state = E_UNEXPECTED;
2964 * Test a safe operation that exists as both a high-numbered MSHTML id and an OLECMDID.
2965 * These tests show that QueryStatusWB uses a NULL pguidCmdGroup, since OLECMDID_STOP
2966 * succeeds (S_OK) and IDM_STOP does not (OLECMDERR_E_NOTSUPPORTED).
2968 if(use_container_olecmd) {
2969 SET_EXPECT(Exec_STOP);
2970 }else if(has_document) {
2971 SET_EXPECT(Invoke_STATUSTEXTCHANGE);
2972 SET_EXPECT(SetStatusText);
2974 hres = IWebBrowser2_ExecWB(webbrowser, OLECMDID_STOP, OLECMDEXECOPT_DONTPROMPTUSER, 0, 0);
2975 if(!use_container_olecmd && has_document) {
2976 todo_wine ok(hres == olecmdid_state, "ExecWB failed: %08lx %08lx\n", hres, olecmdid_state);
2977 CLEAR_CALLED(Invoke_STATUSTEXTCHANGE); /* Called by IE9 */
2978 CLEAR_CALLED(SetStatusText); /* Called by IE9 */
2979 }else {
2980 ok(hres == olecmdid_state, "ExecWB failed: %08lx %08lx\n", hres, olecmdid_state);
2982 if (use_container_olecmd)
2983 SET_EXPECT(Exec_IDM_STOP);
2984 hres = IWebBrowser2_ExecWB(webbrowser, IDM_STOP, OLECMDEXECOPT_DONTPROMPTUSER, 0, 0);
2985 ok(hres == idm_state, "ExecWB failed: %08lx %08lx\n", hres, idm_state);
2988 static void test_download(DWORD flags)
2990 BOOL *b = &called_Invoke_DOCUMENTCOMPLETE;
2991 MSG msg;
2993 if(flags & DWL_REFRESH)
2994 b = use_container_olecmd ? &called_Exec_SETDOWNLOADSTATE_0 : &called_Invoke_DOWNLOADCOMPLETE;
2995 else if((flags & DWL_FROM_PUT_HREF) && !use_container_olecmd && 0)
2996 b = &called_Invoke_DOWNLOADCOMPLETE;
2998 is_downloading = TRUE;
2999 dwl_flags = flags;
3001 if(flags & (DWL_FROM_PUT_HREF|DWL_FROM_GOBACK|DWL_FROM_GOFORWARD|DWL_REFRESH))
3002 test_ready_state(READYSTATE_COMPLETE, VARIANT_FALSE);
3003 else
3004 test_ready_state(READYSTATE_LOADING, VARIANT_FALSE);
3006 if(flags & (DWL_EXPECT_BEFORE_NAVIGATE|(is_http ? DWL_FROM_PUT_HREF : 0)|DWL_FROM_GOFORWARD|DWL_REFRESH))
3007 SET_EXPECT(Invoke_PROPERTYCHANGE);
3009 if(flags & DWL_EXPECT_BEFORE_NAVIGATE) {
3010 SET_EXPECT(Invoke_BEFORENAVIGATE2);
3011 SET_EXPECT(TranslateUrl);
3013 if(use_container_olecmd) {
3014 SET_EXPECT(Exec_SETPROGRESSMAX);
3015 SET_EXPECT(Exec_SETPROGRESSPOS);
3016 SET_EXPECT(Exec_SETDOWNLOADSTATE_1);
3017 }else {
3018 SET_EXPECT(Invoke_DOWNLOADBEGIN);
3020 SET_EXPECT(DocHost_EnableModeless_FALSE);
3021 SET_EXPECT(DocHost_EnableModeless_TRUE);
3022 SET_EXPECT(Invoke_SETSECURELOCKICON);
3023 SET_EXPECT(Invoke_SETPHISHINGFILTERSTATUS);
3024 SET_EXPECT(EnableModeless_FALSE);
3026 if(!(flags & DWL_REFRESH)) {
3027 if(flags & (DWL_FROM_GOFORWARD|DWL_BACK_ENABLE))
3028 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE);
3029 else
3030 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
3031 if(flags & DWL_FROM_GOBACK)
3032 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE);
3033 else
3034 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
3037 expect_update_commands_enable = 0;
3038 set_update_commands_enable = 0xdead;
3039 SET_EXPECT(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS);
3041 SET_EXPECT(Invoke_STATUSTEXTCHANGE);
3042 SET_EXPECT(SetStatusText);
3043 SET_EXPECT(EnableModeless_TRUE);
3044 if(!is_first_load)
3045 SET_EXPECT(GetHostInfo);
3046 if(use_container_olecmd)
3047 SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
3048 else
3049 SET_EXPECT(Invoke_DOWNLOADCOMPLETE);
3050 SET_EXPECT(Invoke_TITLECHANGE);
3051 if(!(flags & DWL_REFRESH))
3052 SET_EXPECT(Invoke_NAVIGATECOMPLETE2);
3053 if(is_first_load)
3054 SET_EXPECT(GetDropTarget);
3055 SET_EXPECT(Invoke_PROGRESSCHANGE);
3056 if(!(flags & DWL_REFRESH))
3057 SET_EXPECT(Invoke_DOCUMENTCOMPLETE);
3059 if(flags & DWL_HTTP)
3060 SET_EXPECT(Exec_SETTITLE);
3061 SET_EXPECT(UpdateUI);
3062 if(use_container_olecmd)
3063 SET_EXPECT(Exec_UPDATECOMMANDS);
3064 SET_EXPECT(QueryStatus_STOP);
3065 SET_EXPECT(GetOverridesKeyPath); /* Called randomly on some VMs. */
3067 trace("Downloading...\n");
3068 while(!*b && GetMessageW(&msg, NULL, 0, 0)) {
3069 TranslateMessage(&msg);
3070 DispatchMessageW(&msg);
3073 if(flags & (DWL_EXPECT_BEFORE_NAVIGATE|(is_http ? DWL_FROM_PUT_HREF : 0)))
3074 todo_wine CHECK_CALLED(Invoke_PROPERTYCHANGE);
3075 else if(flags & (DWL_FROM_GOFORWARD|DWL_REFRESH))
3076 CLEAR_CALLED(Invoke_PROPERTYCHANGE); /* called by IE11 */
3078 if(flags & DWL_EXPECT_BEFORE_NAVIGATE) {
3079 CHECK_CALLED(Invoke_BEFORENAVIGATE2);
3080 CHECK_CALLED(TranslateUrl);
3082 if(use_container_olecmd) {
3083 todo_wine CHECK_CALLED(Exec_SETPROGRESSMAX);
3084 todo_wine CHECK_CALLED(Exec_SETPROGRESSPOS);
3085 CHECK_CALLED(Exec_SETDOWNLOADSTATE_1);
3086 }else {
3087 SET_EXPECT(Invoke_DOWNLOADBEGIN);
3089 CLEAR_CALLED(DocHost_EnableModeless_FALSE); /* IE 7 */
3090 CLEAR_CALLED(DocHost_EnableModeless_TRUE); /* IE 7 */
3091 todo_wine CHECK_CALLED(Invoke_SETSECURELOCKICON);
3092 CLEAR_CALLED(Invoke_SETPHISHINGFILTERSTATUS); /* IE 7 */
3093 if(is_first_load)
3094 todo_wine CHECK_CALLED(EnableModeless_FALSE);
3095 else
3096 CLEAR_CALLED(EnableModeless_FALSE); /* IE 8 */
3098 if(!(flags & DWL_REFRESH)) {
3099 todo_wine_if(nav_back_todo) {
3100 if(flags & (DWL_FROM_GOFORWARD|DWL_BACK_ENABLE))
3101 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE);
3102 else
3103 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
3105 if(flags & DWL_FROM_GOBACK)
3106 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE);
3107 else
3108 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
3110 CLEAR_CALLED(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS);
3111 todo_wine CHECK_CALLED(Invoke_STATUSTEXTCHANGE);
3112 todo_wine CHECK_CALLED(SetStatusText);
3113 if(is_first_load)
3114 todo_wine CHECK_CALLED(EnableModeless_TRUE);
3115 else
3116 CLEAR_CALLED(EnableModeless_FALSE); /* IE 8 */
3117 if(!is_first_load)
3118 todo_wine CHECK_CALLED(GetHostInfo);
3119 if(use_container_olecmd)
3120 CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
3121 else
3122 CHECK_CALLED(Invoke_DOWNLOADCOMPLETE);
3123 todo_wine CHECK_CALLED(Invoke_TITLECHANGE);
3124 if(!(flags & DWL_REFRESH))
3125 CHECK_CALLED(Invoke_NAVIGATECOMPLETE2);
3126 if(is_first_load)
3127 todo_wine CHECK_CALLED(GetDropTarget);
3128 if(!(flags & DWL_REFRESH))
3129 CHECK_CALLED(Invoke_DOCUMENTCOMPLETE);
3131 is_downloading = FALSE;
3133 test_ready_state(READYSTATE_COMPLETE, VARIANT_FALSE);
3135 while(use_container_olecmd && !called_Exec_UPDATECOMMANDS && GetMessageA(&msg, NULL, 0, 0)) {
3136 TranslateMessage(&msg);
3137 DispatchMessageA(&msg);
3140 todo_wine CHECK_CALLED(Invoke_PROGRESSCHANGE);
3141 if(flags & DWL_HTTP)
3142 CLEAR_CALLED(Exec_SETTITLE); /* FIXME: make it more strict */
3143 if(use_container_olecmd)
3144 CHECK_CALLED(UpdateUI);
3145 else
3146 CLEAR_CALLED(UpdateUI);
3147 if(use_container_olecmd)
3148 CHECK_CALLED(Exec_UPDATECOMMANDS);
3149 CLEAR_CALLED(QueryStatus_STOP);
3150 CLEAR_CALLED(GetOverridesKeyPath);
3153 static void test_Refresh(IWebBrowser2 *webbrowser, BOOL use_refresh2)
3155 HRESULT hres;
3157 trace("Refresh...\n");
3159 if(use_container_olecmd)
3160 SET_EXPECT(Exec_DocHostCommandHandler_2300);
3162 if(use_refresh2) {
3163 VARIANT v;
3165 V_VT(&v) = VT_I4;
3166 V_I4(&v) = REFRESH_NORMAL;
3168 hres = IWebBrowser2_Refresh2(webbrowser, &v);
3169 ok(hres == S_OK, "Refresh failed: %08lx\n", hres);
3170 }else {
3171 hres = IWebBrowser2_Refresh(webbrowser);
3172 ok(hres == S_OK, "Refresh failed: %08lx\n", hres);
3175 if(use_container_olecmd)
3176 CHECK_CALLED(Exec_DocHostCommandHandler_2300);
3178 test_download(DWL_REFRESH);
3181 static void test_olecmd(IWebBrowser2 *unk, BOOL loaded)
3183 IOleCommandTarget *cmdtrg;
3184 OLECMD cmds[3];
3185 HRESULT hres;
3187 hres = IWebBrowser2_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
3188 ok(hres == S_OK, "Could not get IOleCommandTarget iface: %08lx\n", hres);
3189 if(FAILED(hres))
3190 return;
3192 cmds[0].cmdID = OLECMDID_SPELL;
3193 cmds[0].cmdf = 0xdeadbeef;
3194 cmds[1].cmdID = OLECMDID_REFRESH;
3195 cmds[1].cmdf = 0xdeadbeef;
3196 hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 2, cmds, NULL);
3197 if(loaded) {
3198 ok(hres == S_OK, "QueryStatus failed: %08lx\n", hres);
3199 ok(cmds[0].cmdf == OLECMDF_SUPPORTED, "OLECMDID_SPELL cmdf = %lx\n", cmds[0].cmdf);
3200 ok(cmds[1].cmdf == (OLECMDF_ENABLED|OLECMDF_SUPPORTED),
3201 "OLECMDID_REFRESH cmdf = %lx\n", cmds[1].cmdf);
3202 }else {
3203 ok(hres == 0x80040104, "QueryStatus failed: %08lx\n", hres);
3204 ok(cmds[0].cmdf == 0xdeadbeef, "OLECMDID_SPELL cmdf = %lx\n", cmds[0].cmdf);
3205 ok(cmds[1].cmdf == 0xdeadbeef, "OLECMDID_REFRESH cmdf = %lx\n", cmds[0].cmdf);
3208 IOleCommandTarget_Release(cmdtrg);
3211 static void test_IServiceProvider(IWebBrowser2 *unk)
3213 IServiceProvider *servprov = (void*)0xdeadbeef;
3214 IUnknown *iface;
3215 HRESULT hres;
3217 hres = IWebBrowser2_QueryInterface(unk, &IID_IServiceProvider, (void**)&servprov);
3218 ok(hres == S_OK, "QueryInterface returned %08lx, expected S_OK\n", hres);
3219 if(FAILED(hres))
3220 return;
3222 hres = IServiceProvider_QueryService(servprov, &SID_STopLevelBrowser, &IID_IBrowserService2, (LPVOID*)&iface);
3223 ok(hres == E_FAIL, "QueryService returned %08lx, expected E_FAIL\n", hres);
3224 ok(!iface, "QueryService returned %p, expected NULL\n", iface);
3225 if(hres == S_OK)
3226 IUnknown_Release(iface);
3228 hres = IServiceProvider_QueryService(servprov, &SID_SHTMLWindow, &IID_IHTMLWindow2, (LPVOID*)&iface);
3229 ok(hres == S_OK, "QueryService returned %08lx, expected S_OK\n", hres);
3230 ok(iface != NULL, "QueryService returned NULL\n");
3231 if(hres == S_OK)
3232 IUnknown_Release(iface);
3234 IServiceProvider_Release(servprov);
3237 static void test_put_href(IWebBrowser2 *unk, const WCHAR *url)
3239 IHTMLLocation *location;
3240 IHTMLDocument2 *doc;
3241 BSTR str;
3242 HRESULT hres;
3244 trace("put_href(%s)...\n", wine_dbgstr_w(url));
3246 doc = get_document(unk);
3248 location = NULL;
3249 hres = IHTMLDocument2_get_location(doc, &location);
3250 IHTMLDocument2_Release(doc);
3251 ok(hres == S_OK, "get_location failed: %08lx\n", hres);
3252 ok(location != NULL, "location == NULL\n");
3254 is_http = !wcsncmp(url, L"http:", 5);
3256 SET_EXPECT(TranslateUrl);
3257 SET_EXPECT(Invoke_BEFORENAVIGATE2);
3258 if(!is_http)
3259 SET_EXPECT(Invoke_PROPERTYCHANGE);
3261 dwl_flags = DWL_FROM_PUT_HREF;
3263 str = SysAllocString(current_url = url);
3264 is_first_load = FALSE;
3265 hres = IHTMLLocation_put_href(location, str);
3267 CHECK_CALLED(TranslateUrl);
3268 CHECK_CALLED(Invoke_BEFORENAVIGATE2);
3269 if(!is_http)
3270 todo_wine CHECK_CALLED(Invoke_PROPERTYCHANGE);
3272 IHTMLLocation_Release(location);
3273 SysFreeString(str);
3274 ok(hres == S_OK, "put_href failed: %08lx\n", hres);
3276 test_ready_state(READYSTATE_COMPLETE, VARIANT_FALSE);
3279 static void test_go_back(IWebBrowser2 *wb, const WCHAR *back_url, int back_enable, int forward_enable, int forward_todo)
3281 HRESULT hres;
3283 current_url = back_url;
3285 SET_EXPECT(Invoke_BEFORENAVIGATE2);
3287 if(back_enable)
3288 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE);
3289 else
3290 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
3292 if(forward_enable)
3293 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE);
3294 else
3295 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
3297 nav_forward_todo = forward_todo;
3298 SET_EXPECT(Invoke_PROPERTYCHANGE);
3299 hres = IWebBrowser2_GoBack(wb);
3300 ok(hres == S_OK, "GoBack failed: %08lx\n", hres);
3301 CHECK_CALLED(Invoke_BEFORENAVIGATE2);
3302 nav_forward_todo = FALSE;
3304 todo_wine_if(nav_back_todo) {
3305 if(back_enable)
3306 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE);
3307 else
3308 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
3311 todo_wine_if(forward_todo) {
3312 if(forward_enable)
3313 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE);
3314 else
3315 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
3318 CLEAR_CALLED(Invoke_PROPERTYCHANGE); /* called by IE11 */
3321 static void test_go_forward(IWebBrowser2 *wb, const WCHAR *forward_url, int back_enable, int forward_enable)
3323 HRESULT hres;
3325 current_url = forward_url;
3326 dwl_flags |= DWL_FROM_GOFORWARD;
3328 SET_EXPECT(Invoke_BEFORENAVIGATE2);
3330 if(back_enable)
3331 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE);
3332 else
3333 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
3335 if(forward_enable)
3336 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE);
3337 else
3338 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
3340 hres = IWebBrowser2_GoForward(wb);
3341 ok(hres == S_OK, "GoForward failed: %08lx\n", hres);
3342 CHECK_CALLED(Invoke_BEFORENAVIGATE2);
3344 if(back_enable)
3345 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE);
3346 else
3347 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
3349 if(forward_enable)
3350 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE);
3351 else
3352 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
3355 static void test_QueryInterface(IWebBrowser2 *wb)
3357 IQuickActivate *qa = (IQuickActivate*)0xdeadbeef;
3358 IRunnableObject *runnable = (IRunnableObject*)0xdeadbeef;
3359 IPerPropertyBrowsing *propbrowse = (void*)0xdeadbeef;
3360 IOleInPlaceSite *inplace = (void*)0xdeadbeef;
3361 IOleCache *cache = (void*)0xdeadbeef;
3362 IObjectWithSite *site = (void*)0xdeadbeef;
3363 IViewObjectEx *viewex = (void*)0xdeadbeef;
3364 IOleLink *link = (void*)0xdeadbeef;
3365 IMarshal *marshal = (void*)0xdeadbeef;
3366 IUnknown *unk = (IUnknown*)wb;
3367 HRESULT hres;
3369 hres = IUnknown_QueryInterface(unk, &IID_IQuickActivate, (void**)&qa);
3370 ok(hres == E_NOINTERFACE, "QueryInterface returned %08lx, expected E_NOINTERFACE\n", hres);
3371 ok(qa == NULL, "qa=%p, expected NULL\n", qa);
3373 hres = IUnknown_QueryInterface(unk, &IID_IRunnableObject, (void**)&runnable);
3374 ok(hres == E_NOINTERFACE, "QueryInterface returned %08lx, expected E_NOINTERFACE\n", hres);
3375 ok(runnable == NULL, "runnable=%p, expected NULL\n", runnable);
3377 hres = IUnknown_QueryInterface(unk, &IID_IPerPropertyBrowsing, (void**)&propbrowse);
3378 ok(hres == E_NOINTERFACE, "QueryInterface returned %08lx, expected E_NOINTERFACE\n", hres);
3379 ok(propbrowse == NULL, "propbrowse=%p, expected NULL\n", propbrowse);
3381 hres = IUnknown_QueryInterface(unk, &IID_IOleCache, (void**)&cache);
3382 ok(hres == E_NOINTERFACE, "QueryInterface returned %08lx, expected E_NOINTERFACE\n", hres);
3383 ok(cache == NULL, "cache=%p, expected NULL\n", cache);
3385 hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceSite, (void**)&inplace);
3386 ok(hres == E_NOINTERFACE, "QueryInterface returned %08lx, expected E_NOINTERFACE\n", hres);
3387 ok(inplace == NULL, "inplace=%p, expected NULL\n", inplace);
3389 hres = IUnknown_QueryInterface(unk, &IID_IObjectWithSite, (void**)&site);
3390 ok(hres == E_NOINTERFACE, "QueryInterface returned %08lx, expected E_NOINTERFACE\n", hres);
3391 ok(site == NULL, "site=%p, expected NULL\n", site);
3393 hres = IUnknown_QueryInterface(unk, &IID_IViewObjectEx, (void**)&viewex);
3394 ok(hres == E_NOINTERFACE, "QueryInterface returned %08lx, expected E_NOINTERFACE\n", hres);
3395 ok(viewex == NULL, "viewex=%p, expected NULL\n", viewex);
3397 hres = IUnknown_QueryInterface(unk, &IID_IOleLink, (void**)&link);
3398 ok(hres == E_NOINTERFACE, "QueryInterface returned %08lx, expected E_NOINTERFACE\n", hres);
3399 ok(link == NULL, "link=%p, expected NULL\n", link);
3401 hres = IUnknown_QueryInterface(unk, &IID_IMarshal, (void**)&marshal);
3402 ok(hres == E_NOINTERFACE, "QueryInterface returned %08lx, expected E_NOINTERFACE\n", hres);
3403 ok(marshal == NULL, "marshal=%p, expected NULL\n", marshal);
3407 static void test_UIActivate(IWebBrowser2 *unk, BOOL activate)
3409 IOleDocumentView *docview;
3410 IHTMLDocument2 *doc;
3411 HRESULT hres;
3413 doc = get_document(unk);
3415 hres = IHTMLDocument2_QueryInterface(doc, &IID_IOleDocumentView, (void**)&docview);
3416 ok(hres == S_OK, "Got 0x%08lx\n", hres);
3417 if(SUCCEEDED(hres)) {
3418 if(activate) {
3419 SET_EXPECT(RequestUIActivate);
3420 SET_EXPECT(ShowUI);
3421 SET_EXPECT(HideUI);
3422 SET_EXPECT(OnFocus_FALSE);
3425 hres = IOleDocumentView_UIActivate(docview, activate);
3426 todo_wine_if(activate)
3427 ok(hres == S_OK, "Got 0x%08lx\n", hres);
3429 if(activate) {
3430 todo_wine {
3431 CHECK_CALLED(RequestUIActivate);
3432 CHECK_CALLED(ShowUI);
3433 CHECK_CALLED(HideUI);
3434 CHECK_CALLED(OnFocus_FALSE);
3438 IOleDocumentView_Release(docview);
3441 IHTMLDocument2_Release(doc);
3444 static void test_external(IWebBrowser2 *unk)
3446 IDocHostUIHandler2 *dochost;
3447 IOleClientSite *client;
3448 IDispatch *disp;
3449 HRESULT hres;
3451 client = get_dochost(unk);
3453 hres = IOleClientSite_QueryInterface(client, &IID_IDocHostUIHandler2, (void**)&dochost);
3454 ok(hres == S_OK, "Could not get IDocHostUIHandler2 iface: %08lx\n", hres);
3455 IOleClientSite_Release(client);
3457 if(use_container_dochostui)
3458 SET_EXPECT(GetExternal);
3459 disp = (void*)0xdeadbeef;
3460 hres = IDocHostUIHandler2_GetExternal(dochost, &disp);
3461 if(use_container_dochostui) {
3462 CHECK_CALLED(GetExternal);
3463 ok(hres == S_FALSE, "GetExternal failed: %08lx\n", hres);
3464 ok(!disp, "disp = %p\n", disp);
3465 }else {
3466 IShellUIHelper *uihelper;
3468 ok(hres == S_OK, "GetExternal failed: %08lx\n", hres);
3469 ok(disp != NULL, "disp == NULL\n");
3471 hres = IDispatch_QueryInterface(disp, &IID_IShellUIHelper, (void**)&uihelper);
3472 ok(hres == S_OK, "Could not get IShellUIHelper iface: %08lx\n", hres);
3473 IShellUIHelper_Release(uihelper);
3474 IDispatch_Release(disp);
3477 IDocHostUIHandler2_Release(dochost);
3480 static void test_htmlwindow_close(IWebBrowser2 *wb)
3482 IHTMLWindow2 *window;
3483 IHTMLDocument2 *doc;
3484 HRESULT hres;
3486 doc = get_document(wb);
3488 hres = IHTMLDocument2_get_parentWindow(doc, &window);
3489 ok(hres == S_OK, "get_parentWindow failed: %08lx\n", hres);
3490 IHTMLDocument2_Release(doc);
3492 SET_EXPECT(Invoke_WINDOWCLOSING);
3494 hres = IHTMLWindow2_close(window);
3495 ok(hres == S_OK, "close failed: %08lx\n", hres);
3497 CHECK_CALLED(Invoke_WINDOWCLOSING);
3499 IHTMLWindow2_Release(window);
3502 static void test_TranslateAccelerator(IWebBrowser2 *unk)
3504 IOleClientSite *doc_clientsite;
3505 IOleInPlaceActiveObject *pao;
3506 HRESULT hres;
3507 DWORD keycode;
3508 MSG msg_a = {
3509 container_hwnd,
3510 0, 0, 0,
3511 GetTickCount(),
3512 {5, 5}
3515 test_Navigate2(unk, L"about:blank");
3517 hres = IWebBrowser2_QueryInterface(unk, &IID_IOleInPlaceActiveObject, (void**)&pao);
3518 ok(hres == S_OK, "Got 0x%08lx\n", hres);
3519 if(SUCCEEDED(hres)) {
3520 /* One accelerator that should be handled by mshtml */
3521 msg_a.message = WM_KEYDOWN;
3522 msg_a.wParam = VK_F1;
3523 hres = IOleInPlaceActiveObject_TranslateAccelerator(pao, &msg_a);
3524 ok(hres == S_FALSE, "Got 0x%08lx (%04x::%02Ix)\n", hres, msg_a.message, msg_a.wParam);
3526 /* And one that should not */
3527 msg_a.message = WM_KEYDOWN;
3528 msg_a.wParam = VK_F5;
3529 hres = IOleInPlaceActiveObject_TranslateAccelerator(pao, &msg_a);
3530 ok(hres == S_FALSE, "Got 0x%08lx (%04x::%02Ix)\n", hres, msg_a.message, msg_a.wParam);
3532 IOleInPlaceActiveObject_Release(pao);
3535 test_UIActivate(unk, TRUE);
3537 /* Test again after UIActivate */
3538 hres = IWebBrowser2_QueryInterface(unk, &IID_IOleInPlaceActiveObject, (void**)&pao);
3539 ok(hres == S_OK, "Got 0x%08lx\n", hres);
3540 if(SUCCEEDED(hres)) {
3541 /* One accelerator that should be handled by mshtml */
3542 msg_a.message = WM_KEYDOWN;
3543 msg_a.wParam = VK_F1;
3544 SET_EXPECT(DocHost_TranslateAccelerator);
3545 SET_EXPECT(ControlSite_TranslateAccelerator);
3546 hres = IOleInPlaceActiveObject_TranslateAccelerator(pao, &msg_a);
3547 ok(hres == S_FALSE, "Got 0x%08lx (%04x::%02Ix)\n", hres, msg_a.message, msg_a.wParam);
3548 todo_wine CHECK_CALLED(DocHost_TranslateAccelerator);
3549 todo_wine CHECK_CALLED(ControlSite_TranslateAccelerator);
3551 /* And one that should not */
3552 msg_a.message = WM_KEYDOWN;
3553 msg_a.wParam = VK_F5;
3554 SET_EXPECT(DocHost_TranslateAccelerator);
3555 hres = IOleInPlaceActiveObject_TranslateAccelerator(pao, &msg_a);
3556 todo_wine ok(hres == S_OK, "Got 0x%08lx (%04x::%02Ix)\n", hres, msg_a.message, msg_a.wParam);
3557 todo_wine CHECK_CALLED(DocHost_TranslateAccelerator);
3559 IOleInPlaceActiveObject_Release(pao);
3562 doc_clientsite = get_dochost(unk);
3563 if(doc_clientsite) {
3564 IDocHostUIHandler2 *dochost;
3565 IOleControlSite *doc_controlsite;
3566 IUnknown *unk_test;
3568 hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IOleInPlaceFrame, (void**)&unk_test);
3569 ok(hres == E_NOINTERFACE, "Got 0x%08lx\n", hres);
3570 if(SUCCEEDED(hres)) IUnknown_Release(unk_test);
3572 hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IDocHostShowUI, (void**)&unk_test);
3573 todo_wine ok(hres == S_OK, "Got 0x%08lx\n", hres);
3574 if(SUCCEEDED(hres)) IUnknown_Release(unk_test);
3576 hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IDocHostUIHandler, (void**)&unk_test);
3577 ok(hres == S_OK, "Got 0x%08lx\n", hres);
3578 if(SUCCEEDED(hres)) IUnknown_Release(unk_test);
3580 hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IDocHostUIHandler2, (void**)&dochost);
3581 ok(hres == S_OK, "Got 0x%08lx\n", hres);
3582 if(SUCCEEDED(hres)) {
3583 msg_a.message = WM_KEYDOWN;
3584 hr_dochost_TranslateAccelerator = 0xdeadbeef;
3585 for(keycode = 0; keycode <= 0x100; keycode++) {
3586 msg_a.wParam = keycode;
3587 SET_EXPECT(DocHost_TranslateAccelerator);
3588 hres = IDocHostUIHandler2_TranslateAccelerator(dochost, &msg_a, &CGID_MSHTML, 1234);
3589 ok(hres == 0xdeadbeef, "Got 0x%08lx\n", hres);
3590 CHECK_CALLED(DocHost_TranslateAccelerator);
3592 hr_dochost_TranslateAccelerator = E_NOTIMPL;
3594 SET_EXPECT(DocHost_TranslateAccelerator);
3595 hres = IDocHostUIHandler2_TranslateAccelerator(dochost, &msg_a, &CGID_MSHTML, 1234);
3596 ok(hres == E_NOTIMPL, "Got 0x%08lx\n", hres);
3597 CHECK_CALLED(DocHost_TranslateAccelerator);
3599 IDocHostUIHandler2_Release(dochost);
3602 hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IOleControlSite, (void**)&doc_controlsite);
3603 ok(hres == S_OK, "Got 0x%08lx\n", hres);
3604 if(SUCCEEDED(hres)) {
3605 msg_a.message = WM_KEYDOWN;
3606 hr_site_TranslateAccelerator = 0xdeadbeef;
3607 for(keycode = 0; keycode < 0x100; keycode++) {
3608 msg_a.wParam = keycode;
3609 SET_EXPECT(ControlSite_TranslateAccelerator);
3610 hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0);
3611 if(keycode == 0x9 || keycode == 0x75)
3612 todo_wine ok(hres == S_OK, "Got 0x%08lx (keycode: %04lx)\n", hres, keycode);
3613 else
3614 ok(hres == S_FALSE, "Got 0x%08lx (keycode: %04lx)\n", hres, keycode);
3616 CHECK_CALLED(ControlSite_TranslateAccelerator);
3618 msg_a.wParam = VK_LEFT;
3619 SET_EXPECT(ControlSite_TranslateAccelerator);
3620 hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0);
3621 ok(hres == S_FALSE, "Got 0x%08lx (keycode: %04lx)\n", hres, keycode);
3622 CHECK_CALLED(ControlSite_TranslateAccelerator);
3624 hr_site_TranslateAccelerator = S_OK;
3625 SET_EXPECT(ControlSite_TranslateAccelerator);
3626 hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0);
3627 ok(hres == S_OK, "Got 0x%08lx (keycode: %04lx)\n", hres, keycode);
3628 CHECK_CALLED(ControlSite_TranslateAccelerator);
3630 hr_site_TranslateAccelerator = E_NOTIMPL;
3631 SET_EXPECT(ControlSite_TranslateAccelerator);
3632 hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0);
3633 ok(hres == S_FALSE, "Got 0x%08lx (keycode: %04lx)\n", hres, keycode);
3634 CHECK_CALLED(ControlSite_TranslateAccelerator);
3636 IOleControlSite_Release(doc_controlsite);
3639 IOleClientSite_Release(doc_clientsite);
3642 test_UIActivate(unk, FALSE);
3645 static void test_dochost_qs(IWebBrowser2 *webbrowser)
3647 IOleClientSite *client_site;
3648 IServiceProvider *serv_prov;
3649 IUnknown *service;
3650 HRESULT hres;
3652 client_site = get_dochost(webbrowser);
3653 hres = IOleClientSite_QueryInterface(client_site, &IID_IServiceProvider, (void**)&serv_prov);
3654 IOleClientSite_Release(client_site);
3655 ok(hres == S_OK, "Could not get IServiceProvider iface: %08lx\n", hres);
3657 hres = IServiceProvider_QueryService(serv_prov, &IID_IHlinkFrame, &IID_IHlinkFrame, (void**)&service);
3658 ok(hres == S_OK, "QueryService failed: %08lx\n", hres);
3659 ok(iface_cmp(service, (IUnknown*)webbrowser), "service != unk\n");
3660 IUnknown_Release(service);
3662 hres = IServiceProvider_QueryService(serv_prov, &IID_IWebBrowserApp, &IID_IHlinkFrame, (void**)&service);
3663 ok(hres == S_OK, "QueryService failed: %08lx\n", hres);
3664 ok(iface_cmp(service, (IUnknown*)webbrowser), "service != unk\n");
3665 IUnknown_Release(service);
3667 hres = IServiceProvider_QueryService(serv_prov, &IID_ITargetFrame, &IID_ITargetFrame, (void**)&service);
3668 ok(hres == S_OK, "QueryService failed: %08lx\n", hres);
3669 ok(iface_cmp(service, (IUnknown*)webbrowser), "service != unk\n");
3670 IUnknown_Release(service);
3672 hres = IServiceProvider_QueryService(serv_prov, &IID_IShellBrowser, &IID_IShellBrowser, (void**)&service);
3673 ok(hres == S_OK, "QueryService failed: %08lx\n", hres);
3674 IUnknown_Release(service);
3676 hres = IServiceProvider_QueryService(serv_prov, &IID_IShellBrowser, &IID_IBrowserService, (void**)&service);
3677 ok(hres == S_OK, "QueryService failed: %08lx\n", hres);
3678 IUnknown_Release(service);
3680 hres = IServiceProvider_QueryService(serv_prov, &IID_IShellBrowser, &IID_IDocObjectService, (void**)&service);
3681 ok(hres == S_OK, "QueryService failed: %08lx\n", hres);
3682 IUnknown_Release(service);
3684 IServiceProvider_Release(serv_prov);
3687 static void test_Close(IWebBrowser2 *wb, BOOL do_download)
3689 IOleObject *oo;
3690 IOleClientSite *ocs;
3691 HRESULT hres;
3693 hres = IWebBrowser2_QueryInterface(wb, &IID_IOleObject, (void**)&oo);
3694 ok(hres == S_OK, "QueryInterface failed: %08lx\n", hres);
3695 if(hres != S_OK)
3696 return;
3698 test_close = TRUE;
3700 SET_EXPECT(Frame_SetActiveObject);
3701 SET_EXPECT(UIWindow_SetActiveObject);
3702 SET_EXPECT(OnUIDeactivate);
3703 SET_EXPECT(OnFocus_FALSE);
3704 SET_EXPECT(OnInPlaceDeactivate);
3705 SET_EXPECT(Invoke_STATUSTEXTCHANGE);
3706 if(!do_download) {
3707 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
3708 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
3710 expect_update_commands_enable = 0;
3711 set_update_commands_enable = 0xdead;
3712 SET_EXPECT(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS);
3714 if(use_container_olecmd)
3715 SET_EXPECT(Invoke_DOWNLOADCOMPLETE);
3716 }else {
3717 nav_back_todo = nav_forward_todo = TRUE;
3719 SET_EXPECT(Advise_OnClose);
3720 hres = IOleObject_Close(oo, OLECLOSE_NOSAVE);
3721 ok(hres == S_OK, "OleObject_Close failed: %lx\n", hres);
3722 CHECK_CALLED(Frame_SetActiveObject);
3723 CHECK_CALLED(UIWindow_SetActiveObject);
3724 CHECK_CALLED(OnUIDeactivate);
3725 CHECK_CALLED(OnFocus_FALSE);
3726 CHECK_CALLED(OnInPlaceDeactivate);
3727 CLEAR_CALLED(Invoke_STATUSTEXTCHANGE); /* Called by IE9 */
3728 if(!do_download) {
3729 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
3730 CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
3732 todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS);
3733 todo_wine ok(expect_update_commands_enable == set_update_commands_enable,
3734 "got %d\n", set_update_commands_enable);
3736 if(use_container_olecmd)
3737 todo_wine CHECK_CALLED(Invoke_DOWNLOADCOMPLETE);
3738 }else {
3739 nav_back_todo = nav_forward_todo = FALSE;
3741 CHECK_CALLED(Advise_OnClose);
3743 hres = IOleObject_GetClientSite(oo, &ocs);
3744 ok(hres == S_OK, "hres = %lx\n", hres);
3745 ok(!ocs, "ocs != NULL\n");
3747 SET_EXPECT(GetContainer);
3748 SET_EXPECT(Site_GetWindow);
3749 SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3750 SET_EXPECT(Invoke_AMBIENT_SILENT);
3751 hres = IOleObject_DoVerb(oo, OLEIVERB_HIDE, NULL, (IOleClientSite*)0xdeadbeef,
3752 0, (HWND)0xdeadbeef, NULL);
3753 ok(hres == S_OK, "DoVerb failed: %08lx\n", hres);
3754 CHECK_CALLED(GetContainer);
3755 CHECK_CALLED(Site_GetWindow);
3756 CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3757 CHECK_CALLED(Invoke_AMBIENT_SILENT);
3759 hres = IOleObject_GetClientSite(oo, &ocs);
3760 ok(hres == S_OK, "hres = %lx\n", hres);
3761 ok(ocs == &ClientSite, "ocs != &ClientSite\n");
3762 if(ocs)
3763 IOleClientSite_Release(ocs);
3765 SET_EXPECT(OnFocus_FALSE);
3766 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
3767 SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
3768 SET_EXPECT(Advise_OnClose);
3769 hres = IOleObject_Close(oo, OLECLOSE_NOSAVE);
3770 ok(hres == S_OK, "OleObject_Close failed: %lx\n", hres);
3771 CHECK_NOT_CALLED(OnFocus_FALSE);
3772 todo_wine CHECK_NOT_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
3773 todo_wine CHECK_NOT_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
3774 CHECK_CALLED(Advise_OnClose);
3776 test_close = FALSE;
3777 IOleObject_Release(oo);
3780 static void test_Advise(IWebBrowser2 *wb)
3782 IOleObject *oleobj;
3783 IEnumSTATDATA *data;
3784 DWORD connection[2];
3785 HRESULT hres;
3787 hres = IWebBrowser2_QueryInterface(wb, &IID_IOleObject, (void **)&oleobj);
3788 ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08lx\n", hres);
3790 hres = IOleObject_Unadvise(oleobj, 0);
3791 ok(hres == OLE_E_NOCONNECTION, "Unadvise returned: %08lx\n", hres);
3793 data = (void *)0xdeadbeef;
3794 hres = IOleObject_EnumAdvise(oleobj, &data);
3795 ok(hres == E_NOTIMPL, "EnumAdvise returned: %08lx\n", hres);
3796 ok(data == NULL, "got data %p\n", data);
3798 connection[0] = 0xdeadbeef;
3799 hres = IOleObject_Advise(oleobj, NULL, &connection[0]);
3800 ok(hres == E_INVALIDARG, "Advise returned: %08lx\n", hres);
3801 ok(connection[0] == 0, "got connection %lu\n", connection[0]);
3803 hres = IOleObject_Advise(oleobj, &test_sink, NULL);
3804 ok(hres == E_INVALIDARG, "Advise returned: %08lx\n", hres);
3806 connection[0] = 0xdeadbeef;
3807 hres = IOleObject_Advise(oleobj, &test_sink, &connection[0]);
3808 ok(hres == S_OK, "Advise returned: %08lx\n", hres);
3809 ok(connection[0] != 0xdeadbeef, "got connection %lu\n", connection[0]);
3811 connection[1] = 0xdeadbeef;
3812 hres = IOleObject_Advise(oleobj, &test_sink, &connection[1]);
3813 ok(hres == S_OK, "Advise returned: %08lx\n", hres);
3814 ok(connection[1] == connection[0] + 1, "got connection %lu\n", connection[1]);
3816 hres = IOleObject_Unadvise(oleobj, connection[1]);
3817 ok(hres == S_OK, "Unadvise returned: %08lx\n", hres);
3819 hres = IOleObject_Unadvise(oleobj, connection[1]);
3820 ok(hres == OLE_E_NOCONNECTION, "Unadvise returned: %08lx\n", hres);
3822 hres = IOleObject_Unadvise(oleobj, connection[0]);
3823 ok(hres == S_OK, "Unadvise returned: %08lx\n", hres);
3825 IOleObject_Release(oleobj);
3828 #define TEST_DOWNLOAD 0x0001
3829 #define TEST_NOOLECMD 0x0002
3830 #define TEST_NODOCHOST 0x0004
3832 static void init_test(IWebBrowser2 *webbrowser, DWORD flags)
3834 wb = webbrowser;
3836 do_download = is_downloading = (flags & TEST_DOWNLOAD) != 0;
3837 is_first_load = TRUE;
3838 dwl_flags = 0;
3839 use_container_olecmd = !(flags & TEST_NOOLECMD);
3840 use_container_dochostui = !(flags & TEST_NODOCHOST);
3843 static void test_WebBrowser(DWORD flags, BOOL do_close)
3845 IWebBrowser2 *webbrowser;
3846 IOleObject *oleobj;
3847 HRESULT hres;
3848 ULONG ref, connection;
3850 webbrowser = create_webbrowser();
3851 if(!webbrowser)
3852 return;
3854 init_test(webbrowser, flags);
3856 hres = IWebBrowser2_QueryInterface(webbrowser, &IID_IOleObject, (void **)&oleobj);
3857 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08lx\n", hres);
3859 hres = IOleObject_Advise(oleobj, &test_sink, &connection);
3860 ok(hres == S_OK, "Advise failed: %08lx\n", hres);
3862 test_QueryStatusWB(webbrowser, FALSE);
3863 test_ExecWB(webbrowser, FALSE);
3864 test_QueryInterface(webbrowser);
3865 test_ready_state(READYSTATE_UNINITIALIZED, BUSY_FAIL);
3866 test_ClassInfo(webbrowser);
3867 test_EnumVerbs(webbrowser);
3868 test_LocationURL(webbrowser, L"");
3869 test_ConnectionPoint(webbrowser, TRUE);
3871 test_ClientSite(webbrowser, &ClientSite, !do_download);
3872 test_Extent(webbrowser);
3873 test_wb_funcs(webbrowser, TRUE);
3874 test_DoVerb(webbrowser);
3875 test_olecmd(webbrowser, FALSE);
3876 test_Navigate2(webbrowser, L"about:blank");
3877 test_QueryStatusWB(webbrowser, TRUE);
3878 test_Persist(webbrowser, 2);
3879 test_OleObject(webbrowser, 2);
3880 test_Advise(webbrowser);
3882 if(do_download) {
3883 IHTMLDocument2 *doc, *doc2;
3885 test_download(0);
3886 test_olecmd(webbrowser, TRUE);
3887 doc = get_document(webbrowser);
3889 test_put_href(webbrowser, L"about:test");
3890 test_download(DWL_FROM_PUT_HREF);
3891 doc2 = get_document(webbrowser);
3892 ok(doc == doc2, "doc != doc2\n");
3893 IHTMLDocument2_Release(doc2);
3895 trace("Navigate2 repeated...\n");
3896 test_Navigate2(webbrowser, L"about:blank");
3897 test_download(DWL_EXPECT_BEFORE_NAVIGATE);
3898 doc2 = get_document(webbrowser);
3899 ok(doc == doc2, "doc != doc2\n");
3900 IHTMLDocument2_Release(doc2);
3901 IHTMLDocument2_Release(doc);
3903 if(!do_close) {
3904 trace("Navigate2 http URL...\n");
3905 test_ready_state(READYSTATE_COMPLETE, VARIANT_FALSE);
3906 test_Navigate2(webbrowser, L"http://test.winehq.org/tests/hello.html");
3907 nav_back_todo = TRUE;
3908 test_download(DWL_EXPECT_BEFORE_NAVIGATE|DWL_HTTP);
3909 nav_back_todo = FALSE;
3911 test_Refresh(webbrowser, FALSE);
3912 test_Refresh(webbrowser, TRUE);
3914 trace("put_href http URL...\n");
3915 test_put_href(webbrowser, L"http://test.winehq.org/tests/winehq_snapshot/");
3916 test_download(DWL_FROM_PUT_HREF|DWL_HTTP|DWL_BACK_ENABLE);
3918 trace("GoBack...\n");
3919 nav_back_todo = TRUE;
3920 test_go_back(webbrowser, L"http://test.winehq.org/tests/hello.html", 0, 0, 1);
3921 test_download(DWL_FROM_GOBACK|DWL_HTTP);
3922 nav_back_todo = FALSE;
3924 trace("GoForward...\n");
3925 test_go_forward(webbrowser, L"http://test.winehq.org/tests/winehq_snapshot/", -1, 0);
3926 test_download(DWL_FROM_GOFORWARD|DWL_HTTP);
3928 trace("GoBack...\n");
3929 nav_back_todo = TRUE;
3930 test_go_back(webbrowser, L"http://test.winehq.org/tests/hello.html", 0, -1, 0);
3931 test_download(DWL_FROM_GOBACK|DWL_HTTP);
3932 nav_back_todo = FALSE;
3934 trace("GoForward...\n");
3935 test_go_forward(webbrowser, L"http://test.winehq.org/tests/winehq_snapshot/", -1, 0);
3936 test_download(DWL_FROM_GOFORWARD|DWL_HTTP);
3937 }else {
3938 trace("Navigate2 repeated with the same URL...\n");
3939 test_Navigate2(webbrowser, L"about:blank");
3940 test_download(DWL_EXPECT_BEFORE_NAVIGATE);
3943 test_EnumVerbs(webbrowser);
3944 test_TranslateAccelerator(webbrowser);
3946 test_dochost_qs(webbrowser);
3947 }else {
3948 test_ExecWB(webbrowser, TRUE);
3951 test_external(webbrowser);
3952 test_htmlwindow_close(webbrowser);
3954 if(do_close) {
3955 test_Close(webbrowser, do_download);
3956 }else {
3957 test_change_ClientSite(webbrowser);
3958 test_ClientSite(webbrowser, NULL, !do_download);
3960 test_ie_funcs(webbrowser);
3961 test_GetControlInfo(webbrowser);
3962 test_wb_funcs(webbrowser, FALSE);
3963 test_ConnectionPoint(webbrowser, FALSE);
3964 test_IServiceProvider(webbrowser);
3966 hres = IOleObject_Unadvise(oleobj, connection);
3967 ok(hres == S_OK, "Unadvise failed: %08lx\n", hres);
3969 IOleObject_Release(oleobj);
3971 ref = IWebBrowser2_Release(webbrowser);
3972 ok(ref == 0 || broken(do_download && !do_close), "ref=%ld, expected 0\n", ref);
3975 static void test_WebBrowserV1(void)
3977 IWebBrowser2 *wb;
3978 IOleObject *oleobj;
3979 ULONG ref, connection;
3980 HRESULT hres;
3982 hres = CoCreateInstance(&CLSID_WebBrowser_V1, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
3983 &IID_IWebBrowser2, (void**)&wb);
3984 ok(hres == S_OK, "Could not get WebBrowserV1 instance: %08lx\n", hres);
3986 init_test(wb, 0);
3987 wb_version = 1;
3989 hres = IWebBrowser2_QueryInterface(wb, &IID_IOleObject, (void **)&oleobj);
3990 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08lx\n", hres);
3992 hres = IOleObject_Advise(oleobj, &test_sink, &connection);
3993 ok(hres == S_OK, "Advise failed: %08lx\n", hres);
3995 test_QueryStatusWB(wb, FALSE);
3996 test_ExecWB(wb, FALSE);
3997 test_QueryInterface(wb);
3998 test_ready_state(READYSTATE_UNINITIALIZED, BUSY_FAIL);
3999 test_ClassInfo(wb);
4000 test_EnumVerbs(wb);
4001 test_Persist(wb, 1);
4002 test_OleObject(wb, 1);
4003 test_Advise(wb);
4005 hres = IOleObject_Unadvise(oleobj, connection);
4006 ok(hres == S_OK, "Unadvise failed: %08lx\n", hres);
4008 IOleObject_Release(oleobj);
4010 ref = IWebBrowser2_Release(wb);
4011 ok(ref == 0, "ref=%ld, expected 0\n", ref);
4014 static void test_WebBrowser_slim_container(void)
4016 IWebBrowser2 *webbrowser;
4017 ULONG ref;
4019 webbrowser = create_webbrowser();
4020 init_test(webbrowser, TEST_NOOLECMD|TEST_NODOCHOST);
4022 test_ConnectionPoint(webbrowser, TRUE);
4023 test_ClientSite(webbrowser, &ClientSite, TRUE);
4024 test_DoVerb(webbrowser);
4025 test_Navigate2(webbrowser, L"about:blank");
4027 /* Tests of interest */
4028 test_QueryStatusWB(webbrowser, TRUE);
4029 test_ExecWB(webbrowser, TRUE);
4030 test_external(webbrowser);
4032 /* Cleanup stage */
4033 test_ClientSite(webbrowser, NULL, TRUE);
4034 test_ConnectionPoint(webbrowser, FALSE);
4036 ref = IWebBrowser2_Release(webbrowser);
4037 ok(ref == 0, "ref=%ld, expected 0\n", ref);
4040 static void test_WebBrowser_DoVerb(void)
4042 IWebBrowser2 *webbrowser;
4043 RECT rect;
4044 HWND hwnd;
4045 ULONG ref;
4046 BOOL res;
4047 HRESULT hres;
4048 VARIANT_BOOL b;
4050 webbrowser = create_webbrowser();
4051 init_test(webbrowser, 0);
4053 test_ClientSite(webbrowser, &ClientSite, FALSE);
4055 SET_EXPECT(CanInPlaceActivate);
4056 SET_EXPECT(Site_GetWindow);
4057 SET_EXPECT(OnInPlaceActivate);
4058 SET_EXPECT(GetWindowContext);
4059 SET_EXPECT(ShowObject);
4060 SET_EXPECT(GetContainer);
4061 SET_EXPECT(Frame_GetWindow);
4062 call_DoVerb(webbrowser, OLEIVERB_INPLACEACTIVATE);
4063 CHECK_CALLED(CanInPlaceActivate);
4064 CHECK_CALLED(Site_GetWindow);
4065 CHECK_CALLED(OnInPlaceActivate);
4066 CHECK_CALLED(GetWindowContext);
4067 CHECK_CALLED(ShowObject);
4068 CHECK_CALLED(GetContainer);
4069 CHECK_CALLED(Frame_GetWindow);
4071 hwnd = get_hwnd(webbrowser);
4073 memset(&rect, 0xa, sizeof(rect));
4074 res = GetWindowRect(hwnd, &rect);
4075 ok(res, "GetWindowRect failed: %lu\n", GetLastError());
4077 SET_EXPECT(OnInPlaceDeactivate);
4078 call_DoVerb(webbrowser, OLEIVERB_HIDE);
4079 CHECK_CALLED(OnInPlaceDeactivate);
4081 b = 0x100;
4082 hres = IWebBrowser2_get_Visible(webbrowser, &b);
4083 ok(hres == S_OK, "get_Visible failed: %08lx\n", hres);
4084 ok(b == VARIANT_TRUE, "Visible = %x\n", b);
4086 SET_EXPECT(CanInPlaceActivate);
4087 SET_EXPECT(Site_GetWindow);
4088 SET_EXPECT(OnInPlaceActivate);
4089 SET_EXPECT(GetWindowContext);
4090 SET_EXPECT(ShowObject);
4091 SET_EXPECT(GetContainer);
4092 SET_EXPECT(Frame_GetWindow);
4093 SET_EXPECT(OnUIActivate);
4094 SET_EXPECT(Frame_SetActiveObject);
4095 SET_EXPECT(UIWindow_SetActiveObject);
4096 SET_EXPECT(SetMenu);
4097 SET_EXPECT(OnFocus_TRUE);
4098 call_DoVerb(webbrowser, OLEIVERB_SHOW);
4099 CHECK_CALLED(CanInPlaceActivate);
4100 CHECK_CALLED(Site_GetWindow);
4101 CHECK_CALLED(OnInPlaceActivate);
4102 CHECK_CALLED(GetWindowContext);
4103 CHECK_CALLED(ShowObject);
4104 CHECK_CALLED(GetContainer);
4105 CHECK_CALLED(Frame_GetWindow);
4106 CHECK_CALLED(OnUIActivate);
4107 CHECK_CALLED(Frame_SetActiveObject);
4108 CHECK_CALLED(UIWindow_SetActiveObject);
4109 CHECK_CALLED(SetMenu);
4110 CHECK_CALLED(OnFocus_TRUE);
4112 b = 0x100;
4113 hres = IWebBrowser2_get_Visible(webbrowser, &b);
4114 ok(hres == S_OK, "get_Visible failed: %08lx\n", hres);
4115 ok(b == VARIANT_TRUE, "Visible = %x\n", b);
4117 call_DoVerb(webbrowser, OLEIVERB_SHOW);
4118 call_DoVerb(webbrowser, OLEIVERB_UIACTIVATE);
4120 SET_EXPECT(Frame_SetActiveObject);
4121 SET_EXPECT(UIWindow_SetActiveObject);
4122 SET_EXPECT(OnUIDeactivate);
4123 SET_EXPECT(OnFocus_FALSE);
4124 SET_EXPECT(OnInPlaceDeactivate);
4125 test_hide = TRUE;
4126 call_DoVerb(webbrowser, OLEIVERB_HIDE);
4127 test_hide = FALSE;
4128 CHECK_CALLED(Frame_SetActiveObject);
4129 CHECK_CALLED(UIWindow_SetActiveObject);
4130 CHECK_CALLED(OnUIDeactivate);
4131 CHECK_CALLED(OnFocus_FALSE);
4132 CHECK_CALLED(OnInPlaceDeactivate);
4134 b = 0x100;
4135 hres = IWebBrowser2_get_Visible(webbrowser, &b);
4136 ok(hres == S_OK, "get_Visible failed: %08lx\n", hres);
4137 ok(b == VARIANT_TRUE, "Visible = %x\n", b);
4139 SET_EXPECT(CanInPlaceActivate);
4140 SET_EXPECT(Site_GetWindow);
4141 SET_EXPECT(OnInPlaceActivate);
4142 SET_EXPECT(GetWindowContext);
4143 SET_EXPECT(ShowObject);
4144 SET_EXPECT(GetContainer);
4145 SET_EXPECT(Frame_GetWindow);
4146 SET_EXPECT(OnUIActivate);
4147 SET_EXPECT(Frame_SetActiveObject);
4148 SET_EXPECT(UIWindow_SetActiveObject);
4149 SET_EXPECT(SetMenu);
4150 SET_EXPECT(OnFocus_TRUE);
4151 call_DoVerb(webbrowser, OLEIVERB_SHOW);
4152 CHECK_CALLED(CanInPlaceActivate);
4153 CHECK_CALLED(Site_GetWindow);
4154 CHECK_CALLED(OnInPlaceActivate);
4155 CHECK_CALLED(GetWindowContext);
4156 CHECK_CALLED(ShowObject);
4157 CHECK_CALLED(GetContainer);
4158 CHECK_CALLED(Frame_GetWindow);
4159 CHECK_CALLED(OnUIActivate);
4160 CHECK_CALLED(Frame_SetActiveObject);
4161 CHECK_CALLED(UIWindow_SetActiveObject);
4162 CHECK_CALLED(SetMenu);
4163 CHECK_CALLED(OnFocus_TRUE);
4165 b = 0x100;
4166 hres = IWebBrowser2_get_Visible(webbrowser, &b);
4167 ok(hres == S_OK, "get_Visible failed: %08lx\n", hres);
4168 ok(b == VARIANT_TRUE, "Visible = %x\n", b);
4170 SET_EXPECT(Frame_SetActiveObject);
4171 SET_EXPECT(UIWindow_SetActiveObject);
4172 SET_EXPECT(OnUIDeactivate);
4173 SET_EXPECT(OnFocus_FALSE);
4174 SET_EXPECT(OnInPlaceDeactivate);
4175 test_hide = TRUE;
4176 call_DoVerb(webbrowser, OLEIVERB_HIDE);
4177 CHECK_CALLED(Frame_SetActiveObject);
4178 CHECK_CALLED(UIWindow_SetActiveObject);
4179 CHECK_CALLED(OnUIDeactivate);
4180 CHECK_CALLED(OnFocus_FALSE);
4181 CHECK_CALLED(OnInPlaceDeactivate);
4183 call_DoVerb(webbrowser, OLEIVERB_HIDE);
4184 test_hide = FALSE;
4186 b = 0x100;
4187 hres = IWebBrowser2_get_Visible(webbrowser, &b);
4188 ok(hres == S_OK, "get_Visible failed: %08lx\n", hres);
4189 ok(b == VARIANT_TRUE, "Visible = %x\n", b);
4191 SET_EXPECT(CanInPlaceActivate);
4192 SET_EXPECT(Site_GetWindow);
4193 SET_EXPECT(OnInPlaceActivate);
4194 SET_EXPECT(GetWindowContext);
4195 SET_EXPECT(ShowObject);
4196 SET_EXPECT(GetContainer);
4197 SET_EXPECT(Frame_GetWindow);
4198 SET_EXPECT(OnUIActivate);
4199 SET_EXPECT(Frame_SetActiveObject);
4200 SET_EXPECT(UIWindow_SetActiveObject);
4201 SET_EXPECT(SetMenu);
4202 SET_EXPECT(OnFocus_TRUE);
4203 call_DoVerb(webbrowser, OLEIVERB_UIACTIVATE);
4204 CHECK_CALLED(CanInPlaceActivate);
4205 CHECK_CALLED(Site_GetWindow);
4206 CHECK_CALLED(OnInPlaceActivate);
4207 CHECK_CALLED(GetWindowContext);
4208 CHECK_CALLED(ShowObject);
4209 CHECK_CALLED(GetContainer);
4210 CHECK_CALLED(Frame_GetWindow);
4211 CHECK_CALLED(OnUIActivate);
4212 CHECK_CALLED(Frame_SetActiveObject);
4213 CHECK_CALLED(UIWindow_SetActiveObject);
4214 CHECK_CALLED(SetMenu);
4215 CHECK_CALLED(OnFocus_TRUE);
4217 b = 0x100;
4218 hres = IWebBrowser2_get_Visible(webbrowser, &b);
4219 ok(hres == S_OK, "get_Visible failed: %08lx\n", hres);
4220 ok(b == VARIANT_TRUE, "Visible = %x\n", b);
4222 call_DoVerb(webbrowser, OLEIVERB_SHOW);
4224 test_ClientSite(webbrowser, NULL, FALSE);
4226 ref = IWebBrowser2_Release(webbrowser);
4227 ok(ref == 0, "ref=%ld, expected 0\n", ref);
4231 /* Check if Internet Explorer is configured to run in "Enhanced Security Configuration" (aka hardened mode) */
4232 /* Note: this code is duplicated in dlls/mshtml/tests/mshtml_test.h and dlls/urlmon/tests/sec_mgr.c */
4233 static BOOL is_ie_hardened(void)
4235 HKEY zone_map;
4236 DWORD ie_harden, type, size;
4238 ie_harden = 0;
4239 if(RegOpenKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap",
4240 0, KEY_QUERY_VALUE, &zone_map) == ERROR_SUCCESS) {
4241 size = sizeof(DWORD);
4242 if (RegQueryValueExA(zone_map, "IEHarden", NULL, &type, (LPBYTE) &ie_harden, &size) != ERROR_SUCCESS ||
4243 type != REG_DWORD) {
4244 ie_harden = 0;
4246 RegCloseKey(zone_map);
4249 return ie_harden != 0;
4252 static void test_FileProtocol(void)
4254 IWebBrowser2 *webbrowser;
4255 HANDLE file;
4256 ULONG ref;
4257 WCHAR file_path[MAX_PATH];
4258 WCHAR file_url[MAX_PATH] = L"File://";
4260 static const WCHAR test_file[] = L"wine_test.html";
4262 GetTempPathW(MAX_PATH, file_path);
4263 lstrcatW(file_path, test_file);
4265 webbrowser = create_webbrowser();
4266 if(!webbrowser)
4267 return;
4269 init_test(webbrowser, 0);
4271 file = CreateFileW(file_path, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
4272 if(file == INVALID_HANDLE_VALUE && GetLastError() != ERROR_FILE_EXISTS){
4273 ok(0, "CreateFile failed\n");
4274 return;
4276 CloseHandle(file);
4278 GetLongPathNameW(file_path, file_path, ARRAY_SIZE(file_path));
4279 lstrcatW(file_url, file_path);
4281 test_ConnectionPoint(webbrowser, TRUE);
4282 test_ClientSite(webbrowser, &ClientSite, TRUE);
4283 test_DoVerb(webbrowser);
4284 test_Navigate2(webbrowser, file_url);
4285 test_ClientSite(webbrowser, NULL, TRUE);
4287 ref = IWebBrowser2_Release(webbrowser);
4288 ok(ref == 0, "ref=%lu, expected 0\n", ref);
4290 if(file != INVALID_HANDLE_VALUE)
4291 DeleteFileW(file_path);
4294 static HRESULT WINAPI sink_QueryInterface( IAdviseSink *iface, REFIID riid, void **obj)
4296 if (IsEqualGUID(riid, &IID_IAdviseSink) || IsEqualGUID(riid, &IID_IUnknown)) {
4297 *obj = iface;
4298 return S_OK;
4301 if (IsEqualGUID(riid, &IID_IProxyManager))
4302 return E_NOINTERFACE;
4304 ok(0, "unexpected call QI(%s)\n", wine_dbgstr_guid(riid));
4305 return E_NOINTERFACE;
4308 static ULONG WINAPI sink_AddRef(IAdviseSink *iface)
4310 return 2;
4313 static ULONG WINAPI sink_Release(IAdviseSink *iface)
4315 return 1;
4318 static void WINAPI sink_OnDataChange(IAdviseSink *iface, FORMATETC *format, STGMEDIUM *medium)
4320 trace("OnDataChange(%p, %p, %p)\n", iface, format, medium);
4323 static void WINAPI sink_OnViewChange(IAdviseSink *iface, DWORD aspect, LONG index)
4325 trace("OnViewChange(%p, %08lx, %ld)\n", iface, aspect, index);
4328 static void WINAPI sink_OnRename(IAdviseSink *iface, IMoniker *moniker)
4330 trace("OnRename(%p, %p) \n", iface, moniker);
4333 static void WINAPI sink_OnSave(IAdviseSink *iface)
4335 trace("OnSave(%p)\n", iface);
4338 static void WINAPI sink_OnClose(IAdviseSink *iface)
4340 trace("OnClose(%p)\n", iface);
4341 CHECK_EXPECT(Advise_OnClose);
4344 static const IAdviseSinkVtbl sink_vtbl =
4346 sink_QueryInterface,
4347 sink_AddRef,
4348 sink_Release,
4349 sink_OnDataChange,
4350 sink_OnViewChange,
4351 sink_OnRename,
4352 sink_OnSave,
4353 sink_OnClose
4356 static IAdviseSink test_sink = { &sink_vtbl };
4358 static void test_SetAdvise(void)
4360 HRESULT hr;
4361 IWebBrowser2 *browser;
4362 IViewObject2 *view;
4363 IAdviseSink *sink;
4364 IOleObject *oleobj;
4365 IDispatch *doc;
4366 DWORD aspects, flags;
4368 if (!(browser = create_webbrowser())) return;
4369 init_test(browser, 0);
4371 hr = IWebBrowser2_QueryInterface(browser, &IID_IViewObject2, (void **)&view);
4372 ok(hr == S_OK, "got %08lx\n", hr);
4373 if (FAILED(hr)) return;
4375 aspects = flags = 0xdeadbeef;
4376 sink = (IAdviseSink *)0xdeadbeef;
4377 hr = IViewObject2_GetAdvise(view, &aspects, &flags, &sink);
4378 ok(hr == S_OK, "got %08lx\n", hr);
4379 ok(!aspects, "got %08lx\n", aspects);
4380 ok(!flags, "got %08lx\n", aspects);
4381 ok(sink == NULL, "got %p\n", sink);
4383 hr = IViewObject2_SetAdvise(view, DVASPECT_CONTENT, 0, &test_sink);
4384 ok(hr == S_OK, "got %08lx\n", hr);
4386 aspects = flags = 0xdeadbeef;
4387 sink = (IAdviseSink *)0xdeadbeef;
4388 hr = IViewObject2_GetAdvise(view, &aspects, &flags, &sink);
4389 ok(hr == S_OK, "got %08lx\n", hr);
4390 ok(aspects == DVASPECT_CONTENT, "got %08lx\n", aspects);
4391 ok(!flags, "got %08lx\n", aspects);
4392 ok(sink == &test_sink, "got %p\n", sink);
4394 hr = IWebBrowser2_QueryInterface(browser, &IID_IOleObject, (void **)&oleobj);
4395 ok(hr == S_OK, "got %08lx\n", hr);
4397 SET_EXPECT(GetContainer);
4398 SET_EXPECT(Site_GetWindow);
4399 SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
4400 SET_EXPECT(Invoke_AMBIENT_SILENT);
4401 hr = IOleObject_SetClientSite(oleobj, &ClientSite);
4402 ok(hr == S_OK, "got %08lx\n", hr);
4403 CHECK_CALLED(GetContainer);
4404 CHECK_CALLED(Site_GetWindow);
4405 CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
4406 CHECK_CALLED(Invoke_AMBIENT_SILENT);
4408 sink = (IAdviseSink *)0xdeadbeef;
4409 hr = IViewObject2_GetAdvise(view, &aspects, &flags, &sink);
4410 ok(hr == S_OK, "got %08lx\n", hr);
4411 ok(sink == &test_sink, "got %p\n", sink);
4413 hr = IOleObject_SetClientSite(oleobj, NULL);
4414 ok(hr == S_OK, "got %08lx\n", hr);
4416 aspects = flags = 0xdeadbeef;
4417 sink = (IAdviseSink *)0xdeadbeef;
4418 hr = IViewObject2_GetAdvise(view, &aspects, &flags, &sink);
4419 ok(hr == S_OK, "got %08lx\n", hr);
4420 ok(sink == &test_sink, "got %p\n", sink);
4422 hr = IViewObject2_SetAdvise(view, 0, 0, NULL);
4423 ok(hr == S_OK, "got %08lx\n", hr);
4425 doc = (void*)0xdeadbeef;
4426 hr = IWebBrowser2_get_Document(browser, &doc);
4427 ok(hr == S_FALSE, "get_Document failed: %08lx\n", hr);
4428 ok(!doc, "doc = %p\n", doc);
4430 IOleObject_Release(oleobj);
4431 IViewObject2_Release(view);
4432 IWebBrowser2_Release(browser);
4435 static void test_SetQueryNetSessionCount(void)
4437 LONG count, init_count;
4439 init_count = pSetQueryNetSessionCount(SESSION_QUERY);
4440 trace("init_count %ld\n", init_count);
4442 count = pSetQueryNetSessionCount(SESSION_INCREMENT);
4443 ok(count == init_count + 1, "count = %ld\n", count);
4445 count = pSetQueryNetSessionCount(SESSION_QUERY);
4446 ok(count == init_count + 1, "count = %ld\n", count);
4448 count = pSetQueryNetSessionCount(SESSION_DECREMENT);
4449 ok(count == init_count, "count = %ld\n", count);
4451 count = pSetQueryNetSessionCount(SESSION_QUERY);
4452 ok(count == init_count, "count = %ld\n", count);
4455 static HRESULT WINAPI outer_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
4457 if(IsEqualGUID(riid, &outer_test_iid)) {
4458 CHECK_EXPECT(outer_QI_test);
4459 *ppv = (IUnknown*)0xdeadbeef;
4460 return S_OK;
4462 ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid));
4463 return E_NOINTERFACE;
4466 static ULONG WINAPI outer_AddRef(IUnknown *iface)
4468 return 2;
4471 static ULONG WINAPI outer_Release(IUnknown *iface)
4473 return 1;
4476 static IUnknownVtbl outer_vtbl = {
4477 outer_QueryInterface,
4478 outer_AddRef,
4479 outer_Release
4482 static void test_com_aggregation(void)
4484 HRESULT hr;
4485 IClassFactory *class_factory;
4486 IUnknown outer = { &outer_vtbl };
4487 IUnknown *unk = NULL;
4488 IWebBrowser *web_browser = NULL;
4489 IUnknown *unk2 = NULL;
4491 hr = CoGetClassObject(&CLSID_WebBrowser, CLSCTX_INPROC_SERVER, NULL, &IID_IClassFactory, (void**)&class_factory);
4492 ok(hr == S_OK, "CoGetClassObject failed: %08lx\n", hr);
4494 hr = IClassFactory_CreateInstance(class_factory, &outer, &IID_IUnknown, (void**)&unk);
4495 ok(hr == S_OK, "CreateInstance returned hr = %08lx\n", hr);
4496 ok(unk != NULL, "result NULL, hr = %08lx\n", hr);
4498 hr = IUnknown_QueryInterface(unk, &IID_IWebBrowser, (void**)&web_browser);
4499 ok(hr == S_OK, "QI to IWebBrowser failed, hr=%08lx\n", hr);
4501 SET_EXPECT(outer_QI_test);
4502 hr = IWebBrowser_QueryInterface(web_browser, &outer_test_iid, (void**)&unk2);
4503 CHECK_CALLED(outer_QI_test);
4504 ok(hr == S_OK, "Could not get test iface: %08lx\n", hr);
4505 ok(unk2 == (IUnknown*)0xdeadbeef, "unexpected unk2\n");
4507 IWebBrowser_Release(web_browser);
4508 IUnknown_Release(unk);
4509 IClassFactory_Release(class_factory);
4512 START_TEST(webbrowser)
4514 HMODULE ieframe = LoadLibraryW(L"ieframe.dll");
4516 pSetQueryNetSessionCount = (void*)GetProcAddress(ieframe, "SetQueryNetSessionCount");
4518 OleInitialize(NULL);
4520 test_SetQueryNetSessionCount();
4522 container_hwnd = create_container_window();
4524 trace("Testing WebBrowser (no download)...\n");
4525 test_WebBrowser(0, FALSE);
4526 test_WebBrowser(0, TRUE);
4528 if(!is_ie_hardened()) {
4529 trace("Testing WebBrowser...\n");
4530 test_WebBrowser(TEST_DOWNLOAD, FALSE);
4531 trace("Testing WebBrowser(no olecmd)...\n");
4532 test_WebBrowser(TEST_DOWNLOAD|TEST_NOOLECMD, FALSE);
4533 }else {
4534 win_skip("Skipping http tests in hardened mode\n");
4537 trace("Testing WebBrowser DoVerb\n");
4538 test_WebBrowser_DoVerb();
4539 trace("Testing WebBrowser (with close)...\n");
4540 test_WebBrowser(TEST_DOWNLOAD, TRUE);
4541 trace("Testing WebBrowser w/o container-based olecmd...\n");
4542 test_WebBrowser_slim_container();
4543 trace("Testing WebBrowserV1...\n");
4544 test_WebBrowserV1();
4545 trace("Testing file protocol...\n");
4546 test_FileProtocol();
4547 trace("Testing SetAdvise...\n");
4548 test_SetAdvise();
4549 test_com_aggregation();
4551 OleUninitialize();