crypt32: Add additional path for Solaris 11 Express.
[wine] / dlls / shdocvw / tests / webbrowser.c
1 /*
2  * Copyright 2006 Jacek Caban for CodeWeavers
3  *
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.
8  *
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.
13  *
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
17  */
18
19 #define COBJMACROS
20 #define CONST_VTABLE
21
22 #include <wine/test.h>
23 #include <stdarg.h>
24 #include <stdio.h>
25
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 "mshtmhst.h"
33 #include "mshtmcid.h"
34 #include "mshtml.h"
35 #include "idispids.h"
36 #include "olectl.h"
37 #include "mshtmdid.h"
38 #include "shobjidl.h"
39 #include "shdeprecated.h"
40 #include "shlguid.h"
41 #include "exdispid.h"
42 #include "mimeinfo.h"
43 #include "hlink.h"
44 #include "docobjectservice.h"
45
46 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
47 DEFINE_OLEGUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0);
48
49 #define DEFINE_EXPECT(func) \
50     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
51
52 #define SET_EXPECT(func) \
53     expect_ ## func = TRUE
54
55 #define CHECK_EXPECT2(func) \
56     do { \
57         ok(expect_ ##func, "unexpected call " #func "\n"); \
58         called_ ## func = TRUE; \
59     }while(0)
60
61 #define CHECK_EXPECT(func) \
62     do { \
63         CHECK_EXPECT2(func); \
64         expect_ ## func = FALSE; \
65     }while(0)
66
67 #define CHECK_CALLED(func) \
68     do { \
69         ok(called_ ## func, "expected " #func "\n"); \
70         expect_ ## func = called_ ## func = FALSE; \
71     }while(0)
72
73 #define CLEAR_CALLED(func) \
74     expect_ ## func = called_ ## func = FALSE
75
76 DEFINE_EXPECT(GetContainer);
77 DEFINE_EXPECT(Site_GetWindow);
78 DEFINE_EXPECT(ShowObject);
79 DEFINE_EXPECT(CanInPlaceActivate);
80 DEFINE_EXPECT(OnInPlaceActivate);
81 DEFINE_EXPECT(OnUIActivate);
82 DEFINE_EXPECT(GetWindowContext);
83 DEFINE_EXPECT(Frame_GetWindow);
84 DEFINE_EXPECT(Frame_SetActiveObject);
85 DEFINE_EXPECT(UIWindow_SetActiveObject);
86 DEFINE_EXPECT(SetMenu);
87 DEFINE_EXPECT(Invoke_AMBIENT_USERMODE);
88 DEFINE_EXPECT(Invoke_AMBIENT_DLCONTROL);
89 DEFINE_EXPECT(Invoke_AMBIENT_USERAGENT);
90 DEFINE_EXPECT(Invoke_AMBIENT_PALETTE);
91 DEFINE_EXPECT(Invoke_AMBIENT_SILENT);
92 DEFINE_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
93 DEFINE_EXPECT(Invoke_STATUSTEXTCHANGE);
94 DEFINE_EXPECT(Invoke_PROPERTYCHANGE);
95 DEFINE_EXPECT(Invoke_DOWNLOADBEGIN);
96 DEFINE_EXPECT(Invoke_BEFORENAVIGATE2);
97 DEFINE_EXPECT(Invoke_SETSECURELOCKICON);
98 DEFINE_EXPECT(Invoke_FILEDOWNLOAD);
99 DEFINE_EXPECT(Invoke_COMMANDSTATECHANGE);
100 DEFINE_EXPECT(Invoke_DOWNLOADCOMPLETE);
101 DEFINE_EXPECT(Invoke_ONMENUBAR);
102 DEFINE_EXPECT(Invoke_ONADDRESSBAR);
103 DEFINE_EXPECT(Invoke_ONSTATUSBAR);
104 DEFINE_EXPECT(Invoke_ONTOOLBAR);
105 DEFINE_EXPECT(Invoke_ONFULLSCREEN);
106 DEFINE_EXPECT(Invoke_ONTHEATERMODE);
107 DEFINE_EXPECT(Invoke_WINDOWSETRESIZABLE);
108 DEFINE_EXPECT(Invoke_TITLECHANGE);
109 DEFINE_EXPECT(Invoke_NAVIGATECOMPLETE2);
110 DEFINE_EXPECT(Invoke_PROGRESSCHANGE);
111 DEFINE_EXPECT(Invoke_DOCUMENTCOMPLETE);
112 DEFINE_EXPECT(Invoke_282);
113 DEFINE_EXPECT(EnableModeless_TRUE);
114 DEFINE_EXPECT(EnableModeless_FALSE);
115 DEFINE_EXPECT(GetHostInfo);
116 DEFINE_EXPECT(GetOptionKeyPath);
117 DEFINE_EXPECT(GetOverridesKeyPath);
118 DEFINE_EXPECT(SetStatusText);
119 DEFINE_EXPECT(UpdateUI);
120 DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_0);
121 DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_1);
122 DEFINE_EXPECT(Exec_SETPROGRESSMAX);
123 DEFINE_EXPECT(Exec_SETPROGRESSPOS);
124 DEFINE_EXPECT(Exec_UPDATECOMMANDS);
125 DEFINE_EXPECT(Exec_SETTITLE);
126 DEFINE_EXPECT(QueryStatus_SETPROGRESSTEXT);
127 DEFINE_EXPECT(Exec_STOP);
128 DEFINE_EXPECT(Exec_IDM_STOP);
129 DEFINE_EXPECT(QueryStatus_STOP);
130 DEFINE_EXPECT(QueryStatus_IDM_STOP);
131 DEFINE_EXPECT(DocHost_EnableModeless_TRUE);
132 DEFINE_EXPECT(DocHost_EnableModeless_FALSE);
133 DEFINE_EXPECT(DocHost_TranslateAccelerator);
134 DEFINE_EXPECT(GetDropTarget);
135 DEFINE_EXPECT(TranslateUrl);
136 DEFINE_EXPECT(ShowUI);
137 DEFINE_EXPECT(HideUI);
138 DEFINE_EXPECT(RequestUIActivate);
139 DEFINE_EXPECT(ControlSite_TranslateAccelerator);
140 DEFINE_EXPECT(OnFocus);
141
142 static const WCHAR wszItem[] = {'i','t','e','m',0};
143 static const WCHAR emptyW[] = {0};
144
145 static VARIANT_BOOL exvb;
146
147 static IWebBrowser2 *wb;
148
149 static HWND container_hwnd, shell_embedding_hwnd;
150 static BOOL is_downloading, is_first_load, use_container_olecmd;
151 static HRESULT hr_dochost_TranslateAccelerator = E_NOTIMPL;
152 static HRESULT hr_site_TranslateAccelerator = E_NOTIMPL;
153 static const char *current_url;
154
155 #define DWL_EXPECT_BEFORE_NAVIGATE  0x01
156 #define DWL_FROM_PUT_HREF           0x02
157
158 static DWORD dwl_flags;
159
160 static int strcmp_wa(LPCWSTR strw, const char *stra)
161 {
162     CHAR buf[512];
163     WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL);
164     return lstrcmpA(stra, buf);
165 }
166
167 static BOOL iface_cmp(IUnknown *iface1, IUnknown *iface2)
168 {
169     IUnknown *unk1, *unk2;
170
171     if(iface1 == iface2)
172         return TRUE;
173
174     IUnknown_QueryInterface(iface1, &IID_IUnknown, (void**)&unk1);
175     IUnknown_Release(unk1);
176     IUnknown_QueryInterface(iface2, &IID_IUnknown, (void**)&unk2);
177     IUnknown_Release(unk2);
178
179     return unk1 == unk2;
180 }
181
182 static const char *debugstr_guid(REFIID riid)
183 {
184     static char buf[50];
185
186     sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
187             riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
188             riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
189             riid->Data4[5], riid->Data4[6], riid->Data4[7]);
190
191     return buf;
192 }
193
194 static BSTR a2bstr(const char *str)
195 {
196     BSTR ret;
197     int len;
198
199     len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
200     ret = SysAllocStringLen(NULL, len);
201     MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
202
203     return ret;
204 }
205
206 #define create_WebBrowser(a) _create_WebBrowser(__LINE__,a)
207 static HRESULT _create_WebBrowser(unsigned line, IUnknown **unk)
208 {
209     HRESULT hres;
210
211     hres = CoCreateInstance(&CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
212             &IID_IUnknown, (void**)unk);
213     ok_(__FILE__,line)(hres == S_OK, "Creating WebBrowser object failed: %08x\n", hres);
214     return hres;
215 }
216
217 #define test_LocationURL(a,b) _test_LocationURL(__LINE__,a,b)
218 static void _test_LocationURL(unsigned line, IUnknown *unk, const char *exurl)
219 {
220     IWebBrowser2 *wb;
221     BSTR url = (void*)0xdeadbeef;
222     HRESULT hres;
223
224     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
225     ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
226     if(FAILED(hres))
227         return;
228
229     hres = IWebBrowser2_get_LocationURL(wb, &url);
230     ok_(__FILE__,line) (hres == (*exurl ? S_OK : S_FALSE), "get_LocationURL failed: %08x\n", hres);
231     ok_(__FILE__,line) (!strcmp_wa(url, exurl), "unexpected URL: %s\n", wine_dbgstr_w(url));
232
233     SysFreeString(url);
234     IWebBrowser2_Release(wb);
235 }
236
237 #define test_ready_state(ex) _test_ready_state(__LINE__,ex);
238 static void _test_ready_state(unsigned line, READYSTATE exstate)
239 {
240     READYSTATE state;
241     HRESULT hres;
242
243     hres = IWebBrowser2_get_ReadyState(wb, &state);
244     ok_(__FILE__,line)(hres == S_OK, "get_ReadyState failed: %08x\n", hres);
245     ok_(__FILE__,line)(state == exstate, "ReadyState = %d, expected %d\n", state, exstate);
246 }
247
248 #define get_document(u) _get_document(__LINE__,u)
249 static IDispatch *_get_document(unsigned line, IUnknown *unk)
250 {
251     IHTMLDocument2 *html_doc;
252     IWebBrowser2 *wb;
253     IDispatch *disp;
254     HRESULT hres;
255
256     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
257     ok_(__FILE__,line)(hres == S_OK, "QueryInterface(IID_IWebBrowser2) failed: %08x\n", hres);
258
259     disp = NULL;
260     hres = IWebBrowser2_get_Document(wb, &disp);
261     IWebBrowser2_Release(wb);
262     ok_(__FILE__,line)(hres == S_OK, "get_Document failed: %08x\n", hres);
263     ok_(__FILE__,line)(disp != NULL, "doc_disp == NULL\n");
264
265     hres = IDispatch_QueryInterface(disp, &IID_IHTMLDocument2, (void**)&html_doc);
266     ok_(__FILE__,line)(hres == S_OK, "Could not get IHTMLDocument iface: %08x\n", hres);
267     ok(disp == (IDispatch*)html_doc, "disp != html_doc\n");
268     IHTMLDocument_Release(html_doc);
269
270     return disp;
271 }
272
273 #define get_dochost(u) _get_dochost(__LINE__,u)
274 static IOleClientSite *_get_dochost(unsigned line, IUnknown *unk)
275 {
276     IOleClientSite *client_site;
277     IOleObject *oleobj;
278     IDispatch *doc;
279     HRESULT hres;
280
281     doc = _get_document(line, unk);
282     hres = IDispatch_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
283     IDispatch_Release(doc);
284     ok_(__FILE__,line)(hres == S_OK, "Got 0x%08x\n", hres);
285
286     hres = IOleObject_GetClientSite(oleobj, &client_site);
287     IOleObject_Release(oleobj);
288     ok_(__FILE__,line)(hres == S_OK, "Got 0x%08x\n", hres);
289
290     return client_site;
291 }
292
293 static HRESULT QueryInterface(REFIID,void**);
294
295 static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface,
296         REFIID riid, void **ppv)
297 {
298     ok(0, "unexpected call\n");
299     return E_NOINTERFACE;
300 }
301
302 static ULONG WINAPI OleCommandTarget_AddRef(IOleCommandTarget *iface)
303 {
304     return 2;
305 }
306
307 static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface)
308 {
309     return 1;
310 }
311
312 static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
313         ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
314 {
315     ok(!pguidCmdGroup, "pguidCmdGroup != MULL\n");
316     ok(cCmds == 1, "cCmds=%d, expected 1\n", cCmds);
317     ok(!pCmdText, "pCmdText != NULL\n");
318
319     switch(prgCmds[0].cmdID) {
320     case OLECMDID_STOP:
321         CHECK_EXPECT2(QueryStatus_STOP);
322         prgCmds[0].cmdf = OLECMDF_SUPPORTED;
323         return S_OK;
324     case OLECMDID_SETPROGRESSTEXT:
325         CHECK_EXPECT(QueryStatus_SETPROGRESSTEXT);
326         prgCmds[0].cmdf = OLECMDF_ENABLED;
327         return S_OK;
328     case IDM_STOP:
329         /* Note:
330          *  IDM_STOP is a command specific to CGID_MSHTML (not an OLECMDID command).
331          *  This command appears here for the ExecWB and QueryStatusWB tests in order
332          *  to help demonstrate that these routines use a NULL pguidCmdGroup.
333          */
334         CHECK_EXPECT(QueryStatus_IDM_STOP);
335         prgCmds[0].cmdf = 0;
336         return S_OK;
337     default:
338         ok(0, "unexpected command %d\n", prgCmds[0].cmdID);
339     }
340
341     return E_FAIL;
342 }
343
344 static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
345         DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
346 {
347     if(!pguidCmdGroup) {
348         switch(nCmdID) {
349         case OLECMDID_SETPROGRESSMAX:
350             CHECK_EXPECT2(Exec_SETPROGRESSMAX);
351             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
352             ok(pvaIn != NULL, "pvaIn == NULL\n");
353             if(pvaIn)
354                 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
355             ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
356             return S_OK;
357         case OLECMDID_SETPROGRESSPOS:
358             CHECK_EXPECT2(Exec_SETPROGRESSPOS);
359             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
360             ok(pvaIn != NULL, "pvaIn == NULL\n");
361             if(pvaIn)
362                 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
363             ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
364             return S_OK;
365         case OLECMDID_SETDOWNLOADSTATE:
366             if(is_downloading)
367                 ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER || !nCmdexecopt,
368                    "nCmdexecopts=%08x\n", nCmdexecopt);
369             else
370                 ok(!nCmdexecopt, "nCmdexecopts=%08x\n", nCmdexecopt);
371             ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut);
372             ok(pvaIn != NULL, "pvaIn == NULL\n");
373             ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d\n", V_VT(pvaIn));
374             switch(V_I4(pvaIn)) {
375             case 0:
376                 CHECK_EXPECT2(Exec_SETDOWNLOADSTATE_0);
377                 break;
378             case 1:
379                 CHECK_EXPECT2(Exec_SETDOWNLOADSTATE_1);
380                 break;
381             default:
382                 ok(0, "unexpevted V_I4(pvaIn)=%d\n", V_I4(pvaIn));
383             }
384             return S_OK;
385         case OLECMDID_UPDATECOMMANDS:
386             CHECK_EXPECT(Exec_UPDATECOMMANDS);
387             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
388             ok(!pvaIn, "pvaIn != NULL\n");
389             ok(!pvaOut, "pvaOut=%p, expected NULL\n", pvaOut);
390             return S_OK;
391         case OLECMDID_SETTITLE:
392             CHECK_EXPECT(Exec_SETTITLE);
393             /* TODO: test args */
394             return S_OK;
395         case OLECMDID_STOP:
396             CHECK_EXPECT(Exec_STOP);
397             return S_OK;
398         case IDM_STOP:
399             /* Note:
400              *  IDM_STOP is a command specific to CGID_MSHTML (not an OLECMDID command).
401              *  This command appears here for the ExecWB and QueryStatusWB tests in order
402              *  to help demonstrate that these routines use a NULL pguidCmdGroup.
403              */
404             CHECK_EXPECT(Exec_IDM_STOP);
405             return OLECMDERR_E_NOTSUPPORTED;
406         default:
407             ok(0, "unexpected nsCmdID %d\n", nCmdID);
408         }
409     }else if(IsEqualGUID(&CGID_Explorer, pguidCmdGroup)) {
410         switch(nCmdID) {
411         case 24: /* TODO */
412         case 25: /* IE5 */
413         case 37: /* TODO */
414         case 39: /* TODO */
415         case 66: /* TODO */
416         case 67: /* TODO */
417         case 69: /* TODO */
418         case 101: /* TODO (IE8) */
419             return E_FAIL;
420         default:
421             ok(0, "unexpected nCmdID %d\n", nCmdID);
422         }
423     }else if(IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup)) {
424         switch(nCmdID) {
425         case 105: /* TODO */
426         case 140: /* TODO (Win7) */
427             return E_FAIL;
428         default:
429             ok(0, "unexpected nCmdID %d\n", nCmdID);
430         }
431     }else if(IsEqualGUID(&CGID_DocHostCmdPriv, pguidCmdGroup)) {
432         switch(nCmdID) {
433         case 11: /* TODO */
434             break;
435         default:
436             ok(0, "unexpected nCmdID %d of CGID_DocHostCmdPriv\n", nCmdID);
437         }
438     }else if(IsEqualGUID(&CGID_DocHostCommandHandler, pguidCmdGroup)) {
439         switch(nCmdID) {
440         case 6041: /* TODO */
441             break;
442         default:
443             ok(0, "unexpected nCmdID %d of CGID_DocHostCommandHandler\n", nCmdID);
444         }
445     }else {
446         ok(0, "unexpected pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
447     }
448
449     return E_FAIL;
450 }
451
452 static IOleCommandTargetVtbl OleCommandTargetVtbl = {
453     OleCommandTarget_QueryInterface,
454     OleCommandTarget_AddRef,
455     OleCommandTarget_Release,
456     OleCommandTarget_QueryStatus,
457     OleCommandTarget_Exec
458 };
459
460 static IOleCommandTarget OleCommandTarget = { &OleCommandTargetVtbl };
461
462 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
463 {
464     if(IsEqualGUID(&IID_ITargetContainer, riid))
465         return E_NOINTERFACE; /* TODO */
466
467     if(IsEqualGUID(&IID_IOleCommandTarget, riid)) {
468         if(use_container_olecmd)
469         {
470             *ppv = &OleCommandTarget;
471             return S_OK;
472         }
473         else
474             return E_NOINTERFACE;
475     }
476
477     ok(0, "unexpected call\n");
478     return E_NOINTERFACE;
479 }
480
481 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
482 {
483     return 2;
484 }
485
486 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
487 {
488     return 1;
489 }
490
491 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
492         LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut)
493 {
494     ok(0, "unexpected call\n");
495     return E_NOTIMPL;
496 }
497
498 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
499         IEnumUnknown **ppenum)
500 {
501     ok(0, "unexpected call\n");
502     return E_NOTIMPL;
503 }
504
505 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
506 {
507     ok(0, "unexpected call\n");
508     return E_NOTIMPL;
509 }
510
511 static const IOleContainerVtbl OleContainerVtbl = {
512     OleContainer_QueryInterface,
513     OleContainer_AddRef,
514     OleContainer_Release,
515     OleContainer_ParseDisplayName,
516     OleContainer_EnumObjects,
517     OleContainer_LockContainer
518 };
519
520 static IOleContainer OleContainer = { &OleContainerVtbl };
521
522 static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
523 {
524     return QueryInterface(riid, ppv);
525 }
526
527 static ULONG WINAPI Dispatch_AddRef(IDispatch *iface)
528 {
529     return 2;
530 }
531
532 static ULONG WINAPI Dispatch_Release(IDispatch *iface)
533 {
534     return 1;
535 }
536
537 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
538 {
539     ok(0, "unexpected call\n");
540     return E_NOTIMPL;
541 }
542
543 static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
544         ITypeInfo **ppTInfo)
545 {
546     ok(0, "unexpected call\n");
547     return E_NOTIMPL;
548 }
549
550 static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
551         UINT cNames, LCID lcid, DISPID *rgDispId)
552 {
553     ok(0, "unexpected call\n");
554     return E_NOTIMPL;
555 }
556
557 static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
558         LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
559         EXCEPINFO *pExcepInfo, UINT *puArgErr)
560 {
561     ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
562     ok(pDispParams != NULL, "pDispParams == NULL\n");
563     ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
564     ok(V_VT(pVarResult) == VT_EMPTY, "V_VT(pVarResult)=%d\n", V_VT(pVarResult));
565     ok(wFlags == DISPATCH_PROPERTYGET, "wFlags=%08x, expected DISPATCH_PROPERTYGET\n", wFlags);
566     ok(pDispParams->rgvarg == NULL, "pDispParams->rgvarg = %p\n", pDispParams->rgvarg);
567     ok(pDispParams->rgdispidNamedArgs == NULL,
568        "pDispParams->rgdispidNamedArgs = %p\n", pDispParams->rgdispidNamedArgs);
569     ok(pDispParams->cArgs == 0, "pDispParams->cArgs = %d\n", pDispParams->cArgs);
570     ok(pDispParams->cNamedArgs == 0, "pDispParams->cNamedArgs = %d\n", pDispParams->cNamedArgs);
571
572     switch(dispIdMember) {
573     case DISPID_AMBIENT_USERMODE:
574         CHECK_EXPECT2(Invoke_AMBIENT_USERMODE);
575         return E_FAIL;
576     case DISPID_AMBIENT_DLCONTROL:
577         CHECK_EXPECT(Invoke_AMBIENT_DLCONTROL);
578         ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
579         return E_FAIL;
580     case DISPID_AMBIENT_USERAGENT:
581        CHECK_EXPECT(Invoke_AMBIENT_USERAGENT);
582         ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
583         return E_FAIL;
584     case DISPID_AMBIENT_PALETTE:
585         CHECK_EXPECT(Invoke_AMBIENT_PALETTE);
586         ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
587         return E_FAIL;
588     case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
589         CHECK_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
590         ok(puArgErr == NULL, "puArgErr=%p\n", puArgErr);
591         V_VT(pVarResult) = VT_BOOL;
592         V_BOOL(pVarResult) = VARIANT_FALSE;
593         return S_OK;
594     case DISPID_AMBIENT_SILENT:
595         CHECK_EXPECT(Invoke_AMBIENT_SILENT);
596         ok(puArgErr == NULL, "puArgErr=%p\n", puArgErr);
597         V_VT(pVarResult) = VT_BOOL;
598         V_BOOL(pVarResult) = VARIANT_FALSE;
599         return S_OK;
600     }
601
602     ok(0, "unexpected dispIdMember %d\n", dispIdMember);
603     return E_NOTIMPL;
604 }
605
606 static IDispatchVtbl DispatchVtbl = {
607     Dispatch_QueryInterface,
608     Dispatch_AddRef,
609     Dispatch_Release,
610     Dispatch_GetTypeInfoCount,
611     Dispatch_GetTypeInfo,
612     Dispatch_GetIDsOfNames,
613     Dispatch_Invoke
614 };
615
616 static IDispatch Dispatch = { &DispatchVtbl };
617
618 static HRESULT WINAPI WebBrowserEvents2_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
619 {
620     *ppv = NULL;
621
622     if(IsEqualGUID(&DIID_DWebBrowserEvents2, riid)) {
623         *ppv = iface;
624         return S_OK;
625     }
626
627     ok(0, "unexpected riid %s\n", debugstr_guid(riid));
628     return E_NOINTERFACE;
629 }
630
631 #define test_invoke_bool(p,s) _test_invoke_bool(__LINE__,p,s)
632 static void _test_invoke_bool(unsigned line, const DISPPARAMS *params, BOOL strict)
633 {
634     ok_(__FILE__,line) (params->rgvarg != NULL, "rgvarg == NULL\n");
635     ok_(__FILE__,line) (params->cArgs == 1, "cArgs=%d, expected 1\n", params->cArgs);
636     ok_(__FILE__,line) (V_VT(params->rgvarg) == VT_BOOL, "V_VT(arg)=%d\n", V_VT(params->rgvarg));
637     if(strict)
638         ok_(__FILE__,line) (V_BOOL(params->rgvarg) == exvb, "V_VT(arg)=%x, expected %x\n",
639                             V_BOOL(params->rgvarg), exvb);
640     else
641         ok_(__FILE__,line) (!V_BOOL(params->rgvarg) == !exvb, "V_VT(arg)=%x, expected %x\n",
642                             V_BOOL(params->rgvarg), exvb);
643 }
644
645 static void test_OnBeforeNavigate(const VARIANT *disp, const VARIANT *url, const VARIANT *flags,
646         const VARIANT *frame, const VARIANT *post_data, const VARIANT *headers, const VARIANT *cancel)
647 {
648     ok(V_VT(disp) == VT_DISPATCH, "V_VT(disp)=%d, expected VT_DISPATCH\n", V_VT(disp));
649     ok(V_DISPATCH(disp) != NULL, "V_DISPATCH(disp) == NULL\n");
650     ok(V_DISPATCH(disp) == (IDispatch*)wb, "V_DISPATCH(disp)=%p, wb=%p\n", V_DISPATCH(disp), wb);
651
652     ok(V_VT(url) == (VT_BYREF|VT_VARIANT), "V_VT(url)=%x, expected VT_BYREF|VT_VARIANT\n", V_VT(url));
653     ok(V_VARIANTREF(url) != NULL, "V_VARIANTREF(url) == NULL)\n");
654     if(V_VARIANTREF(url)) {
655         ok(V_VT(V_VARIANTREF(url)) == VT_BSTR, "V_VT(V_VARIANTREF(url))=%d, expected VT_BSTR\n",
656            V_VT(V_VARIANTREF(url)));
657         ok(V_BSTR(V_VARIANTREF(url)) != NULL, "V_BSTR(V_VARIANTREF(url)) == NULL\n");
658         ok(!strcmp_wa(V_BSTR(V_VARIANTREF(url)), current_url), "unexpected url %s, expected %s\n",
659            wine_dbgstr_w(V_BSTR(V_VARIANTREF(url))), current_url);
660     }
661
662     ok(V_VT(flags) == (VT_BYREF|VT_VARIANT), "V_VT(flags)=%x, expected VT_BYREF|VT_VARIANT\n",
663        V_VT(flags));
664     ok(V_VT(flags) == (VT_BYREF|VT_VARIANT), "V_VT(flags)=%x, expected VT_BYREF|VT_VARIANT\n",
665        V_VT(flags));
666     ok(V_VARIANTREF(flags) != NULL, "V_VARIANTREF(flags) == NULL)\n");
667     if(V_VARIANTREF(flags)) {
668         ok(V_VT(V_VARIANTREF(flags)) == VT_I4, "V_VT(V_VARIANTREF(flags))=%d, expected VT_I4\n",
669            V_VT(V_VARIANTREF(flags)));
670         if(is_first_load) {
671             ok(V_I4(V_VARIANTREF(flags)) == 0, "V_I4(V_VARIANTREF(flags)) = %x, expected 0\n",
672                V_I4(V_VARIANTREF(flags)));
673         }else {
674             ok((V_I4(V_VARIANTREF(flags)) & ~0x40) == 0, "V_I4(V_VARIANTREF(flags)) = %x, expected 0x40 or 0\n",
675                V_I4(V_VARIANTREF(flags)));
676         }
677     }
678
679     ok(V_VT(frame) == (VT_BYREF|VT_VARIANT), "V_VT(frame)=%x, expected VT_BYREF|VT_VARIANT\n",
680        V_VT(frame));
681     ok(V_VT(frame) == (VT_BYREF|VT_VARIANT), "V_VT(frame)=%x, expected VT_BYREF|VT_VARIANT\n",
682        V_VT(frame));
683     ok(V_VARIANTREF(frame) != NULL, "V_VARIANTREF(frame) == NULL)\n");
684     if(V_VARIANTREF(frame)) {
685         ok(V_VT(V_VARIANTREF(frame)) == VT_BSTR, "V_VT(V_VARIANTREF(frame))=%d, expected VT_BSTR\n",
686            V_VT(V_VARIANTREF(frame)));
687         ok(V_BSTR(V_VARIANTREF(frame)) == NULL, "V_BSTR(V_VARIANTREF(frame)) = %p, expected NULL\n",
688            V_BSTR(V_VARIANTREF(frame)));
689     }
690
691     ok(V_VT(post_data) == (VT_BYREF|VT_VARIANT), "V_VT(post_data)=%x, expected VT_BYREF|VT_VARIANT\n",
692        V_VT(post_data));
693     ok(V_VT(post_data) == (VT_BYREF|VT_VARIANT), "V_VT(post_data)=%x, expected VT_BYREF|VT_VARIANT\n",
694        V_VT(post_data));
695     ok(V_VARIANTREF(post_data) != NULL, "V_VARIANTREF(post_data) == NULL)\n");
696     if(V_VARIANTREF(post_data)) {
697         ok(V_VT(V_VARIANTREF(post_data)) == (VT_VARIANT|VT_BYREF),
698            "V_VT(V_VARIANTREF(post_data))=%d, expected VT_VARIANT|VT_BYREF\n",
699            V_VT(V_VARIANTREF(post_data)));
700         ok(V_VARIANTREF(V_VARIANTREF(post_data)) != NULL,
701            "V_VARIANTREF(V_VARIANTREF(post_data)) == NULL\n");
702         if(V_VARIANTREF(V_VARIANTREF(post_data))) {
703             ok(V_VT(V_VARIANTREF(V_VARIANTREF(post_data))) == VT_EMPTY,
704                "V_VT(V_VARIANTREF(V_VARIANTREF(post_data))) = %d, expected VT_EMPTY\n",
705                V_VT(V_VARIANTREF(V_VARIANTREF(post_data))));
706
707             if(V_VT(V_VARIANTREF(V_VARIANTREF(post_data))) == (VT_UI1|VT_ARRAY)) {
708                 const SAFEARRAY *sa = V_ARRAY(V_VARIANTREF(V_VARIANTREF(post_data)));
709
710                 ok(sa->cDims == 1, "sa->cDims = %d, expected 1\n", sa->cDims);
711                 ok(sa->fFeatures == 0, "sa->fFeatures = %d, expected 0\n", sa->fFeatures);
712             }
713         }
714     }
715
716     ok(V_VT(headers) == (VT_BYREF|VT_VARIANT), "V_VT(headers)=%x, expected VT_BYREF|VT_VARIANT\n",
717        V_VT(headers));
718     ok(V_VARIANTREF(headers) != NULL, "V_VARIANTREF(headers) == NULL)\n");
719     if(V_VARIANTREF(headers)) {
720         ok(V_VT(V_VARIANTREF(headers)) == VT_BSTR, "V_VT(V_VARIANTREF(headers))=%d, expected VT_BSTR\n",
721            V_VT(V_VARIANTREF(headers)));
722         ok(V_BSTR(V_VARIANTREF(headers)) == NULL, "V_BSTR(V_VARIANTREF(heders)) = %p, expected NULL\n",
723            V_BSTR(V_VARIANTREF(headers)));
724     }
725
726     ok(V_VT(cancel) == (VT_BYREF|VT_BOOL), "V_VT(cancel)=%x, expected VT_BYREF|VT_BOOL\n",
727        V_VT(cancel));
728     ok(V_BOOLREF(cancel) != NULL, "V_BOOLREF(pDispParams->rgvarg[0] == NULL)\n");
729     if(V_BOOLREF(cancel))
730         ok(*V_BOOLREF(cancel) == VARIANT_FALSE, "*V_BOOLREF(calcel) = %x, expected VARIANT_FALSE\n",
731            *V_BOOLREF(cancel));
732 }
733
734 static HRESULT WINAPI WebBrowserEvents2_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
735         LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
736         EXCEPINFO *pExcepInfo, UINT *puArgErr)
737 {
738     ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
739     ok(pDispParams != NULL, "pDispParams == NULL\n");
740     ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
741     ok(pVarResult == NULL, "pVarResult=%p\n", pVarResult);
742     ok(wFlags == DISPATCH_METHOD, "wFlags=%08x, expected DISPATCH_METHOD\n", wFlags);
743     ok(pDispParams->rgdispidNamedArgs == NULL,
744        "pDispParams->rgdispidNamedArgs = %p\n", pDispParams->rgdispidNamedArgs);
745     ok(pDispParams->cNamedArgs == 0, "pDispParams->cNamedArgs = %d\n", pDispParams->cNamedArgs);
746
747     switch(dispIdMember) {
748     case DISPID_STATUSTEXTCHANGE:
749         CHECK_EXPECT2(Invoke_STATUSTEXTCHANGE);
750
751         ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
752         ok(pDispParams->cArgs == 1, "cArgs=%d, expected 1\n", pDispParams->cArgs);
753         ok(V_VT(pDispParams->rgvarg) == VT_BSTR, "V_VT(pDispParams->rgvarg)=%d, expected VT_BSTR\n",
754            V_VT(pDispParams->rgvarg));
755         /* TODO: Check text */
756         break;
757
758     case DISPID_PROPERTYCHANGE:
759         CHECK_EXPECT2(Invoke_PROPERTYCHANGE);
760
761         ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
762         ok(pDispParams->cArgs == 1, "cArgs=%d, expected 1\n", pDispParams->cArgs);
763         /* TODO: Check args */
764         break;
765
766     case DISPID_DOWNLOADBEGIN:
767         CHECK_EXPECT(Invoke_DOWNLOADBEGIN);
768
769         ok(pDispParams->rgvarg == NULL, "rgvarg=%p, expected NULL\n", pDispParams->rgvarg);
770         ok(pDispParams->cArgs == 0, "cArgs=%d, expected 0\n", pDispParams->cArgs);
771         test_ready_state(READYSTATE_LOADING);
772         break;
773
774     case DISPID_BEFORENAVIGATE2:
775         CHECK_EXPECT(Invoke_BEFORENAVIGATE2);
776
777         ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
778         ok(pDispParams->cArgs == 7, "cArgs=%d, expected 7\n", pDispParams->cArgs);
779         test_OnBeforeNavigate(pDispParams->rgvarg+6, pDispParams->rgvarg+5, pDispParams->rgvarg+4,
780                               pDispParams->rgvarg+3, pDispParams->rgvarg+2, pDispParams->rgvarg+1,
781                               pDispParams->rgvarg);
782         test_ready_state((dwl_flags & DWL_FROM_PUT_HREF) ? READYSTATE_COMPLETE : READYSTATE_LOADING);
783         break;
784
785     case DISPID_SETSECURELOCKICON:
786         CHECK_EXPECT2(Invoke_SETSECURELOCKICON);
787
788         ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
789         ok(pDispParams->cArgs == 1, "cArgs=%d, expected 1\n", pDispParams->cArgs);
790         /* TODO: Check args */
791         break;
792
793     case DISPID_FILEDOWNLOAD:
794         CHECK_EXPECT(Invoke_FILEDOWNLOAD);
795
796         ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
797         ok(pDispParams->cArgs == 2, "cArgs=%d, expected 2\n", pDispParams->cArgs);
798         /* TODO: Check args */
799         break;
800
801     case DISPID_COMMANDSTATECHANGE:
802         CHECK_EXPECT2(Invoke_COMMANDSTATECHANGE);
803
804         ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
805         ok(pDispParams->cArgs == 2, "cArgs=%d, expected 2\n", pDispParams->cArgs);
806         /* TODO: Check args */
807         break;
808
809     case DISPID_DOWNLOADCOMPLETE:
810         CHECK_EXPECT(Invoke_DOWNLOADCOMPLETE);
811
812         ok(pDispParams->rgvarg == NULL, "rgvarg=%p, expected NULL\n", pDispParams->rgvarg);
813         ok(pDispParams->cArgs == 0, "cArgs=%d, expected 0\n", pDispParams->cArgs);
814         test_ready_state(READYSTATE_LOADING);
815         break;
816
817     case DISPID_ONMENUBAR:
818         CHECK_EXPECT(Invoke_ONMENUBAR);
819         test_invoke_bool(pDispParams, TRUE);
820         break;
821
822     case DISPID_ONADDRESSBAR:
823         CHECK_EXPECT(Invoke_ONADDRESSBAR);
824         test_invoke_bool(pDispParams, TRUE);
825         break;
826
827     case DISPID_ONSTATUSBAR:
828         CHECK_EXPECT(Invoke_ONSTATUSBAR);
829         test_invoke_bool(pDispParams, TRUE);
830         break;
831
832     case DISPID_ONTOOLBAR:
833         CHECK_EXPECT(Invoke_ONTOOLBAR);
834         test_invoke_bool(pDispParams, FALSE);
835         break;
836
837     case DISPID_ONFULLSCREEN:
838         CHECK_EXPECT(Invoke_ONFULLSCREEN);
839         test_invoke_bool(pDispParams, TRUE);
840         break;
841
842     case DISPID_ONTHEATERMODE:
843         CHECK_EXPECT(Invoke_ONTHEATERMODE);
844         test_invoke_bool(pDispParams, TRUE);
845         break;
846
847     case DISPID_WINDOWSETRESIZABLE:
848         CHECK_EXPECT(Invoke_WINDOWSETRESIZABLE);
849         test_invoke_bool(pDispParams, TRUE);
850         break;
851
852     case DISPID_TITLECHANGE:
853         CHECK_EXPECT2(Invoke_TITLECHANGE);
854         /* FIXME */
855         break;
856
857     case DISPID_NAVIGATECOMPLETE2:
858         CHECK_EXPECT(Invoke_NAVIGATECOMPLETE2);
859         /* FIXME */
860         test_ready_state((dwl_flags & DWL_FROM_PUT_HREF) ? READYSTATE_COMPLETE : READYSTATE_LOADING);
861         break;
862
863     case DISPID_PROGRESSCHANGE:
864         CHECK_EXPECT(Invoke_PROGRESSCHANGE);
865         /* FIXME */
866         break;
867
868     case DISPID_DOCUMENTCOMPLETE:
869         CHECK_EXPECT(Invoke_DOCUMENTCOMPLETE);
870         /* FIXME */
871         test_ready_state(READYSTATE_COMPLETE);
872         break;
873
874     case 282: /* FIXME */
875         CHECK_EXPECT2(Invoke_282);
876         break;
877
878     default:
879         ok(0, "unexpected dispIdMember %d\n", dispIdMember);
880     }
881
882     return S_OK;
883 }
884
885 static IDispatchVtbl WebBrowserEvents2Vtbl = {
886     WebBrowserEvents2_QueryInterface,
887     Dispatch_AddRef,
888     Dispatch_Release,
889     Dispatch_GetTypeInfoCount,
890     Dispatch_GetTypeInfo,
891     Dispatch_GetIDsOfNames,
892     WebBrowserEvents2_Invoke
893 };
894
895 static IDispatch WebBrowserEvents2 = { &WebBrowserEvents2Vtbl };
896
897 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
898 {
899     return QueryInterface(riid, ppv);
900 }
901
902 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
903 {
904     return 2;
905 }
906
907 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
908 {
909     return 1;
910 }
911
912 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
913 {
914     ok(0, "unexpected call\n");
915     return E_NOTIMPL;
916 }
917
918 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker,
919         IMoniker **ppmon)
920 {
921     ok(0, "unexpected call\n");
922     return E_NOTIMPL;
923 }
924
925 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
926 {
927     CHECK_EXPECT(GetContainer);
928
929     ok(ppContainer != NULL, "ppContainer == NULL\n");
930     if(ppContainer)
931         *ppContainer = &OleContainer;
932
933     return S_OK;
934 }
935
936 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
937 {
938     CHECK_EXPECT(ShowObject);
939     return S_OK;
940 }
941
942 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
943 {
944     ok(0, "unexpected call\n");
945     return E_NOTIMPL;
946 }
947
948 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
949 {
950     ok(0, "unexpected call\n");
951     return E_NOTIMPL;
952 }
953
954 static const IOleClientSiteVtbl ClientSiteVtbl = {
955     ClientSite_QueryInterface,
956     ClientSite_AddRef,
957     ClientSite_Release,
958     ClientSite_SaveObject,
959     ClientSite_GetMoniker,
960     ClientSite_GetContainer,
961     ClientSite_ShowObject,
962     ClientSite_OnShowWindow,
963     ClientSite_RequestNewObjectLayout
964 };
965
966 static IOleClientSite ClientSite = { &ClientSiteVtbl };
967
968 static HRESULT WINAPI IOleControlSite_fnQueryInterface(IOleControlSite *iface, REFIID riid, void **ppv)
969 {
970     *ppv = NULL;
971     return E_NOINTERFACE;
972 }
973
974 static ULONG WINAPI IOleControlSite_fnAddRef(IOleControlSite *iface)
975 {
976     return 2;
977 }
978
979 static ULONG WINAPI IOleControlSite_fnRelease(IOleControlSite *iface)
980 {
981     return 1;
982 }
983
984 static HRESULT WINAPI IOleControlSite_fnOnControlInfoChanged(IOleControlSite* This)
985 {
986     ok(0, "unexpected call\n");
987     return E_NOTIMPL;
988 }
989
990 static HRESULT WINAPI IOleControlSite_fnLockInPlaceActive(IOleControlSite* This,
991                                                           BOOL fLock)
992 {
993     ok(0, "unexpected call\n");
994     return E_NOTIMPL;
995 }
996
997 static HRESULT WINAPI IOleControlSite_fnGetExtendedControl(IOleControlSite* This,
998                                                            IDispatch **ppDisp)
999 {
1000     ok(0, "unexpected call\n");
1001     return E_NOTIMPL;
1002 }
1003
1004 static HRESULT WINAPI IOleControlSite_fnTransformCoords(IOleControlSite* This,
1005                                                         POINTL *pPtlHimetric,
1006                                                         POINTF *pPtfContainer,
1007                                                         DWORD dwFlags)
1008 {
1009     ok(0, "unexpected call\n");
1010     return E_NOTIMPL;
1011 }
1012
1013 static HRESULT WINAPI IOleControlSite_fnTranslateAccelerator(IOleControlSite* This, MSG *pMsg,
1014                                                              DWORD grfModifiers)
1015 {
1016     CHECK_EXPECT(ControlSite_TranslateAccelerator);
1017     return hr_site_TranslateAccelerator;
1018 }
1019
1020 static HRESULT WINAPI IOleControlSite_fnOnFocus(IOleControlSite* This, BOOL fGotFocus)
1021 {
1022     CHECK_EXPECT2(OnFocus);
1023     return E_NOTIMPL;
1024 }
1025
1026 static HRESULT WINAPI IOleControlSite_fnShowPropertyFrame(IOleControlSite* This)
1027 {
1028     ok(0, "unexpected call\n");
1029     return E_NOTIMPL;
1030 }
1031
1032 static IOleControlSiteVtbl ControlSiteVtbl = {
1033     IOleControlSite_fnQueryInterface,
1034     IOleControlSite_fnAddRef,
1035     IOleControlSite_fnRelease,
1036     IOleControlSite_fnOnControlInfoChanged,
1037     IOleControlSite_fnLockInPlaceActive,
1038     IOleControlSite_fnGetExtendedControl,
1039     IOleControlSite_fnTransformCoords,
1040     IOleControlSite_fnTranslateAccelerator,
1041     IOleControlSite_fnOnFocus,
1042     IOleControlSite_fnShowPropertyFrame
1043 };
1044
1045 static IOleControlSite ControlSite = { &ControlSiteVtbl };
1046
1047 static HRESULT WINAPI InPlaceUIWindow_QueryInterface(IOleInPlaceFrame *iface,
1048                                                      REFIID riid, void **ppv)
1049 {
1050     ok(0, "unexpected call\n");
1051     return E_NOINTERFACE;
1052 }
1053
1054 static ULONG WINAPI InPlaceUIWindow_AddRef(IOleInPlaceFrame *iface)
1055 {
1056     return 2;
1057 }
1058
1059 static ULONG WINAPI InPlaceUIWindow_Release(IOleInPlaceFrame *iface)
1060 {
1061     return 1;
1062 }
1063
1064 static HRESULT WINAPI InPlaceUIWindow_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
1065 {
1066     ok(0, "unexpected call\n");
1067     return E_NOTIMPL;
1068 }
1069
1070 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
1071 {
1072     CHECK_EXPECT(Frame_GetWindow);
1073     ok(phwnd != NULL, "phwnd == NULL\n");
1074     if(phwnd)
1075         *phwnd = container_hwnd;
1076     return S_OK;
1077 }
1078
1079 static HRESULT WINAPI InPlaceUIWindow_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
1080 {
1081     ok(0, "unexpected call\n");
1082     return E_NOTIMPL;
1083 }
1084
1085 static HRESULT WINAPI InPlaceUIWindow_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
1086 {
1087     ok(0, "unexpected call\n");
1088     return E_NOTIMPL;
1089 }
1090
1091 static HRESULT WINAPI InPlaceUIWindow_RequestBorderSpace(IOleInPlaceFrame *iface,
1092         LPCBORDERWIDTHS pborderwidths)
1093 {
1094     ok(0, "unexpected call\n");
1095     return E_NOTIMPL;
1096 }
1097
1098 static HRESULT WINAPI InPlaceUIWindow_SetBorderSpace(IOleInPlaceFrame *iface,
1099         LPCBORDERWIDTHS pborderwidths)
1100 {
1101     ok(0, "unexpected call\n");
1102     return E_NOTIMPL;
1103 }
1104
1105 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
1106         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
1107 {
1108     CHECK_EXPECT(UIWindow_SetActiveObject);
1109     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
1110     ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
1111     return S_OK;
1112 }
1113
1114 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
1115         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
1116 {
1117     CHECK_EXPECT(Frame_SetActiveObject);
1118     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
1119     ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
1120     return S_OK;
1121 }
1122
1123 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
1124         LPOLEMENUGROUPWIDTHS lpMenuWidths)
1125 {
1126     ok(0, "unexpected call\n");
1127     return E_NOTIMPL;
1128 }
1129
1130 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
1131         HOLEMENU holemenu, HWND hwndActiveObject)
1132 {
1133     CHECK_EXPECT(SetMenu);
1134     ok(hmenuShared == NULL, "hmenuShared=%p\n", hmenuShared);
1135     ok(holemenu == NULL, "holemenu=%p\n", holemenu);
1136     ok(hwndActiveObject == shell_embedding_hwnd, "hwndActiveObject=%p, expected %p\n",
1137        hwndActiveObject, shell_embedding_hwnd);
1138     return S_OK;
1139 }
1140
1141 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
1142 {
1143     ok(0, "unexpected call\n");
1144     return E_NOTIMPL;
1145 }
1146
1147 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
1148 {
1149     CHECK_EXPECT2(SetStatusText);
1150     /* FIXME: Check pszStatusText */
1151     return S_OK;
1152 }
1153
1154 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
1155 {
1156     if(fEnable)
1157         CHECK_EXPECT2(EnableModeless_TRUE);
1158     else
1159         CHECK_EXPECT2(EnableModeless_FALSE);
1160     return S_OK;
1161 }
1162
1163 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
1164 {
1165     ok(0, "unexpected call\n");
1166     return E_NOTIMPL;
1167 }
1168
1169 static const IOleInPlaceFrameVtbl InPlaceUIWindowVtbl = {
1170     InPlaceUIWindow_QueryInterface,
1171     InPlaceUIWindow_AddRef,
1172     InPlaceUIWindow_Release,
1173     InPlaceUIWindow_GetWindow,
1174     InPlaceUIWindow_ContextSensitiveHelp,
1175     InPlaceUIWindow_GetBorder,
1176     InPlaceUIWindow_RequestBorderSpace,
1177     InPlaceUIWindow_SetBorderSpace,
1178     InPlaceUIWindow_SetActiveObject,
1179 };
1180
1181 static IOleInPlaceUIWindow InPlaceUIWindow = { (IOleInPlaceUIWindowVtbl*)&InPlaceUIWindowVtbl };
1182
1183 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = {
1184     InPlaceUIWindow_QueryInterface,
1185     InPlaceUIWindow_AddRef,
1186     InPlaceUIWindow_Release,
1187     InPlaceFrame_GetWindow,
1188     InPlaceUIWindow_ContextSensitiveHelp,
1189     InPlaceUIWindow_GetBorder,
1190     InPlaceUIWindow_RequestBorderSpace,
1191     InPlaceUIWindow_SetBorderSpace,
1192     InPlaceFrame_SetActiveObject,
1193     InPlaceFrame_InsertMenus,
1194     InPlaceFrame_SetMenu,
1195     InPlaceFrame_RemoveMenus,
1196     InPlaceFrame_SetStatusText,
1197     InPlaceFrame_EnableModeless,
1198     InPlaceFrame_TranslateAccelerator
1199 };
1200
1201 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
1202
1203 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
1204 {
1205     return QueryInterface(riid, ppv);
1206 }
1207
1208 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
1209 {
1210     return 2;
1211 }
1212
1213 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSiteEx *iface)
1214 {
1215     return 1;
1216 }
1217
1218 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
1219 {
1220     CHECK_EXPECT(Site_GetWindow);
1221     ok(phwnd != NULL, "phwnd == NULL\n");
1222     if(phwnd)
1223         *phwnd = container_hwnd;
1224     return S_OK;
1225 }
1226
1227 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
1228 {
1229     ok(0, "unexpected call\n");
1230     return E_NOTIMPL;
1231 }
1232
1233 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
1234 {
1235     CHECK_EXPECT(CanInPlaceActivate);
1236     return S_OK;
1237 }
1238
1239 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
1240 {
1241     CHECK_EXPECT(OnInPlaceActivate);
1242     return S_OK;
1243 }
1244
1245 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
1246 {
1247     CHECK_EXPECT(OnUIActivate);
1248     return S_OK;
1249 }
1250
1251 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
1252         IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
1253         LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
1254 {
1255     static const RECT pos_rect = {2,1,1002,901};
1256     static const RECT clip_rect = {10,10,990,890};
1257
1258     CHECK_EXPECT(GetWindowContext);
1259
1260     ok(ppFrame != NULL, "ppFrame = NULL\n");
1261     if(ppFrame)
1262         *ppFrame = &InPlaceFrame;
1263
1264     ok(ppDoc != NULL, "ppDoc = NULL\n");
1265     if(ppDoc)
1266         *ppDoc = &InPlaceUIWindow;
1267
1268     ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
1269     if(lprcPosRect)
1270         memcpy(lprcPosRect, &pos_rect, sizeof(RECT));
1271
1272     ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
1273     if(lprcClipRect)
1274         memcpy(lprcClipRect, &clip_rect, sizeof(RECT));
1275
1276     ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n");
1277     if(lpFrameInfo) {
1278         ok(lpFrameInfo->cb == sizeof(*lpFrameInfo), "lpFrameInfo->cb = %u, expected %u\n", lpFrameInfo->cb, (unsigned)sizeof(*lpFrameInfo));
1279         lpFrameInfo->fMDIApp = FALSE;
1280         lpFrameInfo->hwndFrame = container_hwnd;
1281         lpFrameInfo->haccel = NULL;
1282         lpFrameInfo->cAccelEntries = 0;
1283     }
1284
1285     return S_OK;
1286 }
1287
1288 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtant)
1289 {
1290     ok(0, "unexpected call\n");
1291     return E_NOTIMPL;
1292 }
1293
1294 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
1295 {
1296     ok(0, "unexpected call\n");
1297     return E_NOTIMPL;
1298 }
1299
1300 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
1301 {
1302     ok(0, "unexpected call\n");
1303     return E_NOTIMPL;
1304 }
1305
1306 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
1307 {
1308     ok(0, "unexpected call\n");
1309     return E_NOTIMPL;
1310 }
1311
1312 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
1313 {
1314     ok(0, "unexpected call\n");
1315     return E_NOTIMPL;
1316 }
1317
1318 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
1319 {
1320     ok(0, "unexpected call\n");
1321     return E_NOTIMPL;
1322 }
1323
1324 static HRESULT WINAPI InPlaceSite_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface,
1325                                                       BOOL *pNoRedraw, DWORD dwFlags)
1326 {
1327     ok(0, "unexpected call\n");
1328     return E_NOTIMPL;
1329 }
1330
1331 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface,
1332                                                         BOOL fNoRedraw)
1333 {
1334     ok(0, "unexpected call\n");
1335     return E_NOTIMPL;
1336 }
1337
1338 static HRESULT WINAPI InPlaceSite_RequestUIActivate(IOleInPlaceSiteEx *iface)
1339 {
1340     CHECK_EXPECT2(RequestUIActivate);
1341     return S_OK;
1342 }
1343
1344 static const IOleInPlaceSiteExVtbl InPlaceSiteExVtbl = {
1345     InPlaceSite_QueryInterface,
1346     InPlaceSite_AddRef,
1347     InPlaceSite_Release,
1348     InPlaceSite_GetWindow,
1349     InPlaceSite_ContextSensitiveHelp,
1350     InPlaceSite_CanInPlaceActivate,
1351     InPlaceSite_OnInPlaceActivate,
1352     InPlaceSite_OnUIActivate,
1353     InPlaceSite_GetWindowContext,
1354     InPlaceSite_Scroll,
1355     InPlaceSite_OnUIDeactivate,
1356     InPlaceSite_OnInPlaceDeactivate,
1357     InPlaceSite_DiscardUndoState,
1358     InPlaceSite_DeactivateAndUndo,
1359     InPlaceSite_OnPosRectChange,
1360     InPlaceSite_OnInPlaceActivateEx,
1361     InPlaceSite_OnInPlaceDeactivateEx,
1362     InPlaceSite_RequestUIActivate
1363 };
1364
1365 static IOleInPlaceSiteEx InPlaceSite = { &InPlaceSiteExVtbl };
1366
1367 static HRESULT WINAPI DocHostUIHandler_QueryInterface(IDocHostUIHandler2 *iface, REFIID riid, void **ppv)
1368 {
1369     return QueryInterface(riid, ppv);
1370 }
1371
1372 static ULONG WINAPI DocHostUIHandler_AddRef(IDocHostUIHandler2 *iface)
1373 {
1374     return 2;
1375 }
1376
1377 static ULONG WINAPI DocHostUIHandler_Release(IDocHostUIHandler2 *iface)
1378 {
1379     return 1;
1380 }
1381
1382 static HRESULT WINAPI DocHostUIHandler_ShowContextMenu(IDocHostUIHandler2 *iface, DWORD dwID, POINT *ppt,
1383         IUnknown *pcmdtReserved, IDispatch *pdicpReserved)
1384 {
1385     ok(0, "unexpected call %d %p %p %p\n", dwID, ppt, pcmdtReserved, pdicpReserved);
1386     return S_FALSE;
1387 }
1388
1389 static HRESULT WINAPI DocHostUIHandler_GetHostInfo(IDocHostUIHandler2 *iface, DOCHOSTUIINFO *pInfo)
1390 {
1391     CHECK_EXPECT2(GetHostInfo);
1392     ok(pInfo != NULL, "pInfo=NULL\n");
1393     if(pInfo) {
1394         ok(pInfo->cbSize == sizeof(DOCHOSTUIINFO) || broken(!pInfo->cbSize), "pInfo->cbSize=%u\n", pInfo->cbSize);
1395         ok(!pInfo->dwFlags, "pInfo->dwFlags=%08x, expected 0\n", pInfo->dwFlags);
1396         ok(!pInfo->dwDoubleClick, "pInfo->dwDoubleClick=%08x, expected 0\n", pInfo->dwDoubleClick);
1397         ok(!pInfo->pchHostCss, "pInfo->pchHostCss=%p, expected NULL\n", pInfo->pchHostCss);
1398         ok(!pInfo->pchHostNS, "pInfo->pchhostNS=%p, expected NULL\n", pInfo->pchHostNS);
1399     }
1400     return E_FAIL;
1401 }
1402
1403 static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD dwID,
1404         IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget,
1405         IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
1406 {
1407     CHECK_EXPECT(ShowUI);
1408     return E_NOTIMPL;
1409 }
1410
1411 static HRESULT WINAPI DocHostUIHandler_HideUI(IDocHostUIHandler2 *iface)
1412 {
1413     CHECK_EXPECT(HideUI);
1414     return E_NOTIMPL;
1415 }
1416
1417 static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface)
1418 {
1419     CHECK_EXPECT(UpdateUI);
1420     return E_NOTIMPL;
1421 }
1422
1423 static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable)
1424 {
1425     if(fEnable)
1426         CHECK_EXPECT(DocHost_EnableModeless_TRUE);
1427     else
1428         CHECK_EXPECT(DocHost_EnableModeless_FALSE);
1429
1430     return S_OK;
1431 }
1432
1433 static HRESULT WINAPI DocHostUIHandler_OnDocWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
1434 {
1435     ok(0, "unexpected call\n");
1436     return E_NOTIMPL;
1437 }
1438
1439 static HRESULT WINAPI DocHostUIHandler_OnFrameWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
1440 {
1441     ok(0, "unexpected call\n");
1442     return E_NOTIMPL;
1443 }
1444
1445 static HRESULT WINAPI DocHostUIHandler_ResizeBorder(IDocHostUIHandler2 *iface, LPCRECT prcBorder,
1446         IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
1447 {
1448     ok(0, "unexpected call\n");
1449     return E_NOTIMPL;
1450 }
1451
1452 static HRESULT WINAPI DocHostUIHandler_TranslateAccelerator(IDocHostUIHandler2 *iface, LPMSG lpMsg,
1453         const GUID *pguidCmdGroup, DWORD nCmdID)
1454 {
1455     CHECK_EXPECT(DocHost_TranslateAccelerator);
1456     ok(pguidCmdGroup != NULL, "Got NULL pguidCmdGroup.\n");
1457     if(pguidCmdGroup)
1458         ok(IsEqualGUID(pguidCmdGroup, &CGID_MSHTML), "Unexpected pguidCmdGroup\n");
1459     ok(lpMsg != NULL, "Got NULL lpMsg.\n");
1460     return hr_dochost_TranslateAccelerator;
1461 }
1462
1463 static HRESULT WINAPI DocHostUIHandler_GetOptionKeyPath(IDocHostUIHandler2 *iface,
1464         LPOLESTR *pchKey, DWORD dw)
1465 {
1466     CHECK_EXPECT(GetOptionKeyPath);
1467     ok(pchKey != NULL, "pchKey==NULL\n");
1468     if(pchKey)
1469         ok(*pchKey == NULL, "*pchKey=%p\n", *pchKey);
1470     ok(!dw, "dw=%x\n", dw);
1471     return E_NOTIMPL;
1472 }
1473
1474 static HRESULT WINAPI DocHostUIHandler_GetDropTarget(IDocHostUIHandler2 *iface,
1475         IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
1476 {
1477     CHECK_EXPECT(GetDropTarget);
1478     return E_NOTIMPL;
1479 }
1480
1481 static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, IDispatch **ppDispatch)
1482 {
1483     ok(0, "unexpected call\n");
1484     return E_NOTIMPL;
1485 }
1486
1487 static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate,
1488         OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
1489 {
1490     if(is_downloading && !(dwl_flags & DWL_EXPECT_BEFORE_NAVIGATE))
1491         todo_wine CHECK_EXPECT(TranslateUrl);
1492     else
1493         CHECK_EXPECT(TranslateUrl);
1494     return E_NOTIMPL;
1495 }
1496
1497 static HRESULT WINAPI DocHostUIHandler_FilterDataObject(IDocHostUIHandler2 *iface, IDataObject *pDO,
1498         IDataObject **ppPORet)
1499 {
1500     ok(0, "unexpected call\n");
1501     return E_NOTIMPL;
1502 }
1503
1504 static HRESULT WINAPI DocHostUIHandler_GetOverrideKeyPath(IDocHostUIHandler2 *iface,
1505         LPOLESTR *pchKey, DWORD dw)
1506 {
1507     CHECK_EXPECT(GetOverridesKeyPath);
1508     ok(pchKey != NULL, "pchKey==NULL\n");
1509     if(pchKey)
1510         ok(*pchKey == NULL, "*pchKey=%p\n", *pchKey);
1511     ok(!dw, "dw=%x\n", dw);
1512     return E_NOTIMPL;
1513 }
1514
1515 static const IDocHostUIHandler2Vtbl DocHostUIHandlerVtbl = {
1516     DocHostUIHandler_QueryInterface,
1517     DocHostUIHandler_AddRef,
1518     DocHostUIHandler_Release,
1519     DocHostUIHandler_ShowContextMenu,
1520     DocHostUIHandler_GetHostInfo,
1521     DocHostUIHandler_ShowUI,
1522     DocHostUIHandler_HideUI,
1523     DocHostUIHandler_UpdateUI,
1524     DocHostUIHandler_EnableModeless,
1525     DocHostUIHandler_OnDocWindowActivate,
1526     DocHostUIHandler_OnFrameWindowActivate,
1527     DocHostUIHandler_ResizeBorder,
1528     DocHostUIHandler_TranslateAccelerator,
1529     DocHostUIHandler_GetOptionKeyPath,
1530     DocHostUIHandler_GetDropTarget,
1531     DocHostUIHandler_GetExternal,
1532     DocHostUIHandler_TranslateUrl,
1533     DocHostUIHandler_FilterDataObject,
1534     DocHostUIHandler_GetOverrideKeyPath
1535 };
1536
1537 static IDocHostUIHandler2 DocHostUIHandler = { &DocHostUIHandlerVtbl };
1538
1539
1540 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
1541 {
1542     return QueryInterface(riid, ppv);
1543 }
1544
1545 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
1546 {
1547     return 2;
1548 }
1549
1550 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
1551 {
1552     return 1;
1553 }
1554
1555 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface,
1556                                     REFGUID guidService, REFIID riid, void **ppv)
1557 {
1558     *ppv = NULL;
1559
1560     if(!winetest_interactive)
1561         return E_NOINTERFACE;
1562
1563     if (IsEqualGUID(&SID_STopLevelBrowser, guidService))
1564         trace("Service SID_STopLevelBrowser\n");
1565     else if (IsEqualGUID(&SID_SEditCommandTarget, guidService))
1566         trace("Service SID_SEditCommandTarget\n");
1567     else if (IsEqualGUID(&IID_ITargetFrame2, guidService))
1568         trace("Service IID_ITargetFrame2\n");
1569     else if (IsEqualGUID(&SID_SInternetSecurityManager, guidService))
1570         trace("Service SID_SInternetSecurityManager\n");
1571     else if (IsEqualGUID(&SID_SOleUndoManager, guidService))
1572         trace("Service SID_SOleUndoManager\n");
1573     else if (IsEqualGUID(&SID_IMimeInfo, guidService))
1574         trace("Service SID_IMimeInfo\n");
1575     else if (IsEqualGUID(&SID_STopWindow, guidService))
1576         trace("Service SID_STopWindow\n");
1577
1578     /* 30D02401-6A81-11D0-8274-00C04FD5AE38 Explorer Bar: Search */
1579     /* D1E7AFEC-6A2E-11D0-8C78-00C04FD918B4 no info */
1580     /* A9227C3C-7F8E-11D0-8CB0-00A0C92DBFE8 no info */
1581     /* 371EA634-DC5C-11D1-BA57-00C04FC2040E one reference to IVersionHost */
1582     /* 3050F429-98B5-11CF-BB82-00AA00BDCE0B IID_IElementBehaviorFactory */
1583     /* 6D12FE80-7911-11CF-9534-0000C05BAE0B SID_DefView */
1584     /* AD7F6C62-F6BD-11D2-959B-006097C553C8 no info */
1585     /* 53A2D5B1-D2FC-11D0-84E0-006097C9987D no info */
1586     /* 3050F312-98B5-11CF-BB82-00AA00BDCE0B HTMLFrameBaseClass */
1587     /* 639447BD-B2D3-44B9-9FB0-510F23CB45E4 no info */
1588     /* 20C46561-8491-11CF-960C-0080C7F4EE85 no info */
1589
1590     else
1591         trace("Service %s not supported\n", debugstr_guid(guidService));
1592
1593     return E_NOINTERFACE;
1594 }
1595
1596
1597 static const IServiceProviderVtbl ServiceProviderVtbl = {
1598     ServiceProvider_QueryInterface,
1599     ServiceProvider_AddRef,
1600     ServiceProvider_Release,
1601     ServiceProvider_QueryService
1602 };
1603
1604 static IServiceProvider ServiceProvider = { &ServiceProviderVtbl };
1605
1606
1607 static HRESULT QueryInterface(REFIID riid, void **ppv)
1608 {
1609     *ppv = NULL;
1610
1611     if(IsEqualGUID(&IID_IUnknown, riid)
1612             || IsEqualGUID(&IID_IOleClientSite, riid))
1613         *ppv = &ClientSite;
1614     else if(IsEqualGUID(&IID_IOleWindow, riid)
1615             || IsEqualGUID(&IID_IOleInPlaceSite, riid)
1616             || IsEqualGUID(&IID_IOleInPlaceSiteEx, riid))
1617         *ppv = &InPlaceSite;
1618     else if(IsEqualGUID(&IID_IDocHostUIHandler, riid)
1619             || IsEqualGUID(&IID_IDocHostUIHandler2, riid))
1620         *ppv = &DocHostUIHandler;
1621     else if(IsEqualGUID(&IID_IDispatch, riid))
1622         *ppv = &Dispatch;
1623     else if(IsEqualGUID(&IID_IServiceProvider, riid))
1624         *ppv = &ServiceProvider;
1625     else if(IsEqualGUID(&IID_IDocHostShowUI, riid))
1626         trace("interface IID_IDocHostShowUI\n");
1627     else if(IsEqualGUID(&IID_IOleControlSite, riid))
1628         *ppv = &ControlSite;
1629     else if(IsEqualGUID(&IID_IOleCommandTarget, riid))
1630         trace("interface IID_IOleCommandTarget\n");
1631
1632     /* B6EA2050-048A-11D1-82B9-00C04FB9942E IAxWinHostWindow */
1633
1634     else
1635     {
1636         /* are there more interfaces, that a host can support? */
1637         trace("%s: interface not supported\n", debugstr_guid(riid));
1638     }
1639
1640     return (*ppv) ? S_OK : E_NOINTERFACE;
1641 }
1642
1643 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
1644 {
1645     return DefWindowProcW(hwnd, msg, wParam, lParam);
1646 }
1647
1648 static HWND create_container_window(void)
1649 {
1650     static const WCHAR wszWebBrowserContainer[] =
1651         {'W','e','b','B','r','o','w','s','e','r','C','o','n','t','a','i','n','e','r',0};
1652     static WNDCLASSEXW wndclass = {
1653         sizeof(WNDCLASSEXW),
1654         0,
1655         wnd_proc,
1656         0, 0, NULL, NULL, NULL, NULL, NULL,
1657         wszWebBrowserContainer,
1658         NULL
1659     };
1660
1661     RegisterClassExW(&wndclass);
1662     return CreateWindowW(wszWebBrowserContainer, wszWebBrowserContainer,
1663             WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
1664             CW_USEDEFAULT, NULL, NULL, NULL, NULL);
1665 }
1666
1667 static void test_DoVerb(IUnknown *unk)
1668 {
1669     IOleObject *oleobj;
1670     RECT rect = {0,0,1000,1000};
1671     HRESULT hres;
1672
1673     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1674     ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
1675     if(FAILED(hres))
1676         return;
1677
1678     SET_EXPECT(CanInPlaceActivate);
1679     SET_EXPECT(Site_GetWindow);
1680     SET_EXPECT(OnInPlaceActivate);
1681     SET_EXPECT(GetWindowContext);
1682     SET_EXPECT(ShowObject);
1683     SET_EXPECT(GetContainer);
1684     SET_EXPECT(Frame_GetWindow);
1685     SET_EXPECT(OnUIActivate);
1686     SET_EXPECT(Frame_SetActiveObject);
1687     SET_EXPECT(UIWindow_SetActiveObject);
1688     SET_EXPECT(SetMenu);
1689     SET_EXPECT(OnFocus);
1690
1691     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
1692                              0, (HWND)0xdeadbeef, &rect);
1693     ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
1694
1695     CHECK_CALLED(CanInPlaceActivate);
1696     CHECK_CALLED(Site_GetWindow);
1697     CHECK_CALLED(OnInPlaceActivate);
1698     CHECK_CALLED(GetWindowContext);
1699     CHECK_CALLED(ShowObject);
1700     CHECK_CALLED(GetContainer);
1701     CHECK_CALLED(Frame_GetWindow);
1702     CHECK_CALLED(OnUIActivate);
1703     CHECK_CALLED(Frame_SetActiveObject);
1704     CHECK_CALLED(UIWindow_SetActiveObject);
1705     CHECK_CALLED(SetMenu);
1706     todo_wine CHECK_CALLED(OnFocus);
1707
1708     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
1709                            0, (HWND)0xdeadbeef, &rect);
1710     ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
1711
1712     IOleObject_Release(oleobj);
1713 }
1714
1715 static void test_GetMiscStatus(IOleObject *oleobj)
1716 {
1717     DWORD st, i;
1718     HRESULT hres;
1719
1720     for(i=0; i<10; i++) {
1721         st = 0xdeadbeef;
1722         hres = IOleObject_GetMiscStatus(oleobj, i, &st);
1723         ok(hres == S_OK, "GetMiscStatus failed: %08x\n", hres);
1724         ok(st == (OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT
1725                   |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE),
1726            "st=%08x, expected OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|"
1727            "OLEMISC_INSIDEOUT|OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE)\n", st);
1728     }
1729 }
1730
1731 static void test_SetHostNames(IOleObject *oleobj)
1732 {
1733     HRESULT hres;
1734
1735     static const WCHAR test_appW[] =  {'t','e','s','t',' ','a','p','p',0};
1736
1737     hres = IOleObject_SetHostNames(oleobj, test_appW, (void*)0xdeadbeef);
1738     ok(hres == S_OK, "SetHostNames failed: %08x\n", hres);
1739 }
1740
1741 static void test_ClientSite(IUnknown *unk, IOleClientSite *client, BOOL stop_download)
1742 {
1743     IOleObject *oleobj;
1744     IOleInPlaceObject *inplace;
1745     HWND hwnd;
1746     HRESULT hres;
1747
1748     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1749     ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
1750     if(FAILED(hres))
1751         return;
1752
1753     test_GetMiscStatus(oleobj);
1754     test_SetHostNames(oleobj);
1755
1756     hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceObject, (void**)&inplace);
1757     ok(hres == S_OK, "QueryInterface(IID_OleInPlaceObject) failed: %08x\n", hres);
1758     if(FAILED(hres)) {
1759         IOleObject_Release(oleobj);
1760         return;
1761     }
1762
1763     hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
1764     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
1765     ok((hwnd == NULL) ^ (client == NULL), "unexpected hwnd %p\n", hwnd);
1766
1767     if(client) {
1768         SET_EXPECT(GetContainer);
1769         SET_EXPECT(Site_GetWindow);
1770         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1771         SET_EXPECT(Invoke_AMBIENT_SILENT);
1772     }else if(stop_download) {
1773         SET_EXPECT(Invoke_DOWNLOADCOMPLETE);
1774         if (use_container_olecmd) SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
1775         SET_EXPECT(Invoke_COMMANDSTATECHANGE);
1776     }
1777
1778     hres = IOleObject_SetClientSite(oleobj, client);
1779     ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
1780
1781     if(client) {
1782         CHECK_CALLED(GetContainer);
1783         CHECK_CALLED(Site_GetWindow);
1784         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1785         CHECK_CALLED(Invoke_AMBIENT_SILENT);
1786     }else if(stop_download) {
1787         todo_wine CHECK_CALLED(Invoke_DOWNLOADCOMPLETE);
1788         if (use_container_olecmd) todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
1789         todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE);
1790    }
1791
1792     hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
1793     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
1794     ok((hwnd == NULL) == (client == NULL), "unexpected hwnd %p\n", hwnd);
1795
1796     shell_embedding_hwnd = hwnd;
1797
1798     test_SetHostNames(oleobj);
1799
1800     IOleInPlaceObject_Release(inplace);
1801     IOleObject_Release(oleobj);
1802 }
1803
1804 static void test_ClassInfo(IUnknown *unk)
1805 {
1806     IProvideClassInfo2 *class_info;
1807     GUID guid;
1808     HRESULT hres;
1809
1810     hres = IUnknown_QueryInterface(unk, &IID_IProvideClassInfo2, (void**)&class_info);
1811     ok(hres == S_OK, "QueryInterface(IID_IProvideClassInfo)  failed: %08x\n", hres);
1812     if(FAILED(hres))
1813         return;
1814
1815     hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, &guid);
1816     ok(hres == S_OK, "GetGUID failed: %08x\n", hres);
1817     ok(IsEqualGUID(&DIID_DWebBrowserEvents2, &guid), "wrong guid\n");
1818
1819     hres = IProvideClassInfo2_GetGUID(class_info, 0, &guid);
1820     ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres);
1821     ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
1822
1823     hres = IProvideClassInfo2_GetGUID(class_info, 2, &guid);
1824     ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres);
1825     ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
1826
1827     hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, NULL);
1828     ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
1829
1830     hres = IProvideClassInfo2_GetGUID(class_info, 0, NULL);
1831     ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
1832
1833     IProvideClassInfo2_Release(class_info);
1834 }
1835
1836 static void test_ie_funcs(IUnknown *unk)
1837 {
1838     IWebBrowser2 *wb;
1839     IDispatch *disp;
1840     VARIANT_BOOL b;
1841     int i;
1842     LONG hwnd;
1843     HRESULT hres;
1844     BSTR sName;
1845
1846     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
1847     ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
1848     if(FAILED(hres))
1849         return;
1850
1851     /* HWND */
1852
1853     hwnd = 0xdeadbeef;
1854     hres = IWebBrowser2_get_HWND(wb, &hwnd);
1855     ok(hres == E_FAIL, "get_HWND failed: %08x, expected E_FAIL\n", hres);
1856     ok(hwnd == 0, "unexpected hwnd %x\n", hwnd);
1857
1858     /* MenuBar */
1859
1860     hres = IWebBrowser2_get_MenuBar(wb, &b);
1861     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1862     ok(b == VARIANT_TRUE, "b=%x\n", b);
1863
1864     SET_EXPECT(Invoke_ONMENUBAR);
1865     hres = IWebBrowser2_put_MenuBar(wb, (exvb = VARIANT_FALSE));
1866     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1867     CHECK_CALLED(Invoke_ONMENUBAR);
1868
1869     hres = IWebBrowser2_get_MenuBar(wb, &b);
1870     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1871     ok(b == VARIANT_FALSE, "b=%x\n", b);
1872
1873     SET_EXPECT(Invoke_ONMENUBAR);
1874     hres = IWebBrowser2_put_MenuBar(wb, (exvb = 100));
1875     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1876     CHECK_CALLED(Invoke_ONMENUBAR);
1877
1878     hres = IWebBrowser2_get_MenuBar(wb, &b);
1879     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1880     ok(b == VARIANT_TRUE, "b=%x\n", b);
1881
1882     /* AddressBar */
1883
1884     hres = IWebBrowser2_get_AddressBar(wb, &b);
1885     ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres);
1886     ok(b == VARIANT_TRUE, "b=%x\n", b);
1887
1888     SET_EXPECT(Invoke_ONADDRESSBAR);
1889     hres = IWebBrowser2_put_AddressBar(wb, (exvb = VARIANT_FALSE));
1890     ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
1891     CHECK_CALLED(Invoke_ONADDRESSBAR);
1892
1893     hres = IWebBrowser2_get_AddressBar(wb, &b);
1894     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1895     ok(b == VARIANT_FALSE, "b=%x\n", b);
1896
1897     SET_EXPECT(Invoke_ONADDRESSBAR);
1898     hres = IWebBrowser2_put_AddressBar(wb, (exvb = 100));
1899     ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
1900     CHECK_CALLED(Invoke_ONADDRESSBAR);
1901
1902     hres = IWebBrowser2_get_AddressBar(wb, &b);
1903     ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres);
1904     ok(b == VARIANT_TRUE, "b=%x\n", b);
1905
1906     SET_EXPECT(Invoke_ONADDRESSBAR);
1907     hres = IWebBrowser2_put_AddressBar(wb, (exvb = VARIANT_TRUE));
1908     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1909     CHECK_CALLED(Invoke_ONADDRESSBAR);
1910
1911     /* StatusBar */
1912
1913     hres = IWebBrowser2_get_StatusBar(wb, &b);
1914     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1915     ok(b == VARIANT_TRUE, "b=%x\n", b);
1916
1917     SET_EXPECT(Invoke_ONSTATUSBAR);
1918     hres = IWebBrowser2_put_StatusBar(wb, (exvb = VARIANT_TRUE));
1919     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1920     CHECK_CALLED(Invoke_ONSTATUSBAR);
1921
1922     hres = IWebBrowser2_get_StatusBar(wb, &b);
1923     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1924     ok(b == VARIANT_TRUE, "b=%x\n", b);
1925
1926     SET_EXPECT(Invoke_ONSTATUSBAR);
1927     hres = IWebBrowser2_put_StatusBar(wb, (exvb = VARIANT_FALSE));
1928     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1929     CHECK_CALLED(Invoke_ONSTATUSBAR);
1930
1931     hres = IWebBrowser2_get_StatusBar(wb, &b);
1932     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1933     ok(b == VARIANT_FALSE, "b=%x\n", b);
1934
1935     SET_EXPECT(Invoke_ONSTATUSBAR);
1936     hres = IWebBrowser2_put_StatusBar(wb, (exvb = 100));
1937     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1938     CHECK_CALLED(Invoke_ONSTATUSBAR);
1939
1940     hres = IWebBrowser2_get_StatusBar(wb, &b);
1941     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1942     ok(b == VARIANT_TRUE, "b=%x\n", b);
1943
1944     /* ToolBar */
1945
1946     hres = IWebBrowser2_get_ToolBar(wb, &i);
1947     ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1948     ok(i, "i=%x\n", i);
1949
1950     SET_EXPECT(Invoke_ONTOOLBAR);
1951     hres = IWebBrowser2_put_ToolBar(wb, (exvb = VARIANT_FALSE));
1952     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1953     CHECK_CALLED(Invoke_ONTOOLBAR);
1954
1955     hres = IWebBrowser2_get_ToolBar(wb, &i);
1956     ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1957     ok(i == VARIANT_FALSE, "b=%x\n", i);
1958
1959     SET_EXPECT(Invoke_ONTOOLBAR);
1960     hres = IWebBrowser2_put_ToolBar(wb, (exvb = 100));
1961     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1962     CHECK_CALLED(Invoke_ONTOOLBAR);
1963
1964     hres = IWebBrowser2_get_ToolBar(wb, &i);
1965     ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1966     ok(i, "i=%x\n", i);
1967
1968     SET_EXPECT(Invoke_ONTOOLBAR);
1969     hres = IWebBrowser2_put_ToolBar(wb, (exvb = VARIANT_TRUE));
1970     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1971     CHECK_CALLED(Invoke_ONTOOLBAR);
1972
1973     /* FullScreen */
1974
1975     hres = IWebBrowser2_get_FullScreen(wb, &b);
1976     ok(hres == S_OK, "get_FullScreen failed: %08x\n", hres);
1977     ok(b == VARIANT_FALSE, "b=%x\n", b);
1978
1979     SET_EXPECT(Invoke_ONFULLSCREEN);
1980     hres = IWebBrowser2_put_FullScreen(wb, (exvb = VARIANT_TRUE));
1981     ok(hres == S_OK, "put_FullScreen failed: %08x\n", hres);
1982     CHECK_CALLED(Invoke_ONFULLSCREEN);
1983
1984     hres = IWebBrowser2_get_FullScreen(wb, &b);
1985     ok(hres == S_OK, "get_FullScreen failed: %08x\n", hres);
1986     ok(b == VARIANT_TRUE, "b=%x\n", b);
1987
1988     SET_EXPECT(Invoke_ONFULLSCREEN);
1989     hres = IWebBrowser2_put_FullScreen(wb, (exvb = 100));
1990     ok(hres == S_OK, "put_FullScreen failed: %08x\n", hres);
1991     CHECK_CALLED(Invoke_ONFULLSCREEN);
1992
1993     hres = IWebBrowser2_get_FullScreen(wb, &b);
1994     ok(hres == S_OK, "get_FullScreen failed: %08x\n", hres);
1995     ok(b == VARIANT_TRUE, "b=%x\n", b);
1996
1997     SET_EXPECT(Invoke_ONFULLSCREEN);
1998     hres = IWebBrowser2_put_FullScreen(wb, (exvb = VARIANT_FALSE));
1999     ok(hres == S_OK, "put_FullScreen failed: %08x\n", hres);
2000     CHECK_CALLED(Invoke_ONFULLSCREEN);
2001
2002     /* TheaterMode */
2003
2004     hres = IWebBrowser2_get_TheaterMode(wb, &b);
2005     ok(hres == S_OK, "get_TheaterMode failed: %08x\n", hres);
2006     ok(b == VARIANT_FALSE, "b=%x\n", b);
2007
2008     SET_EXPECT(Invoke_ONTHEATERMODE);
2009     hres = IWebBrowser2_put_TheaterMode(wb, (exvb = VARIANT_TRUE));
2010     ok(hres == S_OK, "put_TheaterMode failed: %08x\n", hres);
2011     CHECK_CALLED(Invoke_ONTHEATERMODE);
2012
2013     hres = IWebBrowser2_get_TheaterMode(wb, &b);
2014     ok(hres == S_OK, "get_TheaterMode failed: %08x\n", hres);
2015     ok(b == VARIANT_TRUE, "b=%x\n", b);
2016
2017     SET_EXPECT(Invoke_ONTHEATERMODE);
2018     hres = IWebBrowser2_put_TheaterMode(wb, (exvb = 100));
2019     ok(hres == S_OK, "put_TheaterMode failed: %08x\n", hres);
2020     CHECK_CALLED(Invoke_ONTHEATERMODE);
2021
2022     hres = IWebBrowser2_get_TheaterMode(wb, &b);
2023     ok(hres == S_OK, "get_TheaterMode failed: %08x\n", hres);
2024     ok(b == VARIANT_TRUE, "b=%x\n", b);
2025
2026     SET_EXPECT(Invoke_ONTHEATERMODE);
2027     hres = IWebBrowser2_put_TheaterMode(wb, (exvb = VARIANT_FALSE));
2028     ok(hres == S_OK, "put_TheaterMode failed: %08x\n", hres);
2029     CHECK_CALLED(Invoke_ONTHEATERMODE);
2030
2031     /* Resizable */
2032
2033     b = 0x100;
2034     hres = IWebBrowser2_get_Resizable(wb, &b);
2035     ok(hres == E_NOTIMPL, "get_Resizable failed: %08x\n", hres);
2036     ok(b == 0x100, "b=%x\n", b);
2037
2038     SET_EXPECT(Invoke_WINDOWSETRESIZABLE);
2039     hres = IWebBrowser2_put_Resizable(wb, (exvb = VARIANT_TRUE));
2040     ok(hres == S_OK, "put_Resizable failed: %08x\n", hres);
2041     CHECK_CALLED(Invoke_WINDOWSETRESIZABLE);
2042
2043     SET_EXPECT(Invoke_WINDOWSETRESIZABLE);
2044     hres = IWebBrowser2_put_Resizable(wb, (exvb = VARIANT_FALSE));
2045     ok(hres == S_OK, "put_Resizable failed: %08x\n", hres);
2046     CHECK_CALLED(Invoke_WINDOWSETRESIZABLE);
2047
2048     hres = IWebBrowser2_get_Resizable(wb, &b);
2049     ok(hres == E_NOTIMPL, "get_Resizable failed: %08x\n", hres);
2050     ok(b == 0x100, "b=%x\n", b);
2051
2052     /* Application */
2053
2054     disp = NULL;
2055     hres = IWebBrowser2_get_Application(wb, &disp);
2056     ok(hres == S_OK, "get_Application failed: %08x\n", hres);
2057     ok(disp == (void*)wb, "disp=%p, expected %p\n", disp, wb);
2058     if(disp)
2059         IDispatch_Release(disp);
2060
2061     hres = IWebBrowser2_get_Application(wb, NULL);
2062     ok(hres == E_POINTER, "get_Application failed: %08x, expected E_POINTER\n", hres);
2063
2064     /* Name */
2065     hres = IWebBrowser2_get_Name(wb, &sName);
2066     ok(hres == S_OK, "getName failed: %08x, expected S_OK\n", hres);
2067     if (PRIMARYLANGID(LANGIDFROMLCID(GetThreadLocale())) == LANG_ENGLISH)
2068         ok(!strcmp_wa(sName, "Microsoft Web Browser Control"), "got '%s', expected 'Microsoft Web Browser Control'\n", wine_dbgstr_w(sName));
2069     else /* Non-English cannot be blank. */
2070         ok(sName!=NULL, "get_Name return a NULL string.\n");
2071     SysFreeString(sName);
2072
2073     /* Quit */
2074
2075     hres = IWebBrowser2_Quit(wb);
2076     ok(hres == E_FAIL, "Quit failed: %08x, expected E_FAIL\n", hres);
2077
2078     IWebBrowser2_Release(wb);
2079 }
2080
2081 static void test_Silent(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
2082 {
2083     VARIANT_BOOL b;
2084     HRESULT hres;
2085
2086     b = 100;
2087     hres = IWebBrowser2_get_Silent(wb, &b);
2088     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
2089     ok(b == VARIANT_FALSE, "b=%x\n", b);
2090
2091     hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
2092     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
2093
2094     b = 100;
2095     hres = IWebBrowser2_get_Silent(wb, &b);
2096     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
2097     ok(b == VARIANT_TRUE, "b=%x\n", b);
2098
2099     hres = IWebBrowser2_put_Silent(wb, 100);
2100     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
2101
2102     b = 100;
2103     hres = IWebBrowser2_get_Silent(wb, &b);
2104     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
2105     ok(b == VARIANT_TRUE, "b=%x\n", b);
2106
2107     hres = IWebBrowser2_put_Silent(wb, VARIANT_FALSE);
2108     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
2109
2110     b = 100;
2111     hres = IWebBrowser2_get_Silent(wb, &b);
2112     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
2113     ok(b == VARIANT_FALSE, "b=%x\n", b);
2114
2115     if(is_clientsite) {
2116         hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
2117         ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
2118
2119         SET_EXPECT(Invoke_AMBIENT_SILENT);
2120     }
2121
2122     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_SILENT);
2123     ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
2124
2125     if(is_clientsite)
2126         CHECK_CALLED(Invoke_AMBIENT_SILENT);
2127
2128     b = 100;
2129     hres = IWebBrowser2_get_Silent(wb, &b);
2130     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
2131     ok(b == VARIANT_FALSE, "b=%x\n", b);
2132 }
2133
2134 static void test_Offline(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
2135 {
2136     VARIANT_BOOL b;
2137     HRESULT hres;
2138
2139     b = 100;
2140     hres = IWebBrowser2_get_Offline(wb, &b);
2141     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
2142     ok(b == VARIANT_FALSE, "b=%x\n", b);
2143
2144     hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
2145     ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
2146
2147     b = 100;
2148     hres = IWebBrowser2_get_Offline(wb, &b);
2149     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
2150     ok(b == VARIANT_TRUE, "b=%x\n", b);
2151
2152     hres = IWebBrowser2_put_Offline(wb, 100);
2153     ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
2154
2155     b = 100;
2156     hres = IWebBrowser2_get_Offline(wb, &b);
2157     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
2158     ok(b == VARIANT_TRUE, "b=%x\n", b);
2159
2160     hres = IWebBrowser2_put_Offline(wb, VARIANT_FALSE);
2161     ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
2162
2163     b = 100;
2164     hres = IWebBrowser2_get_Offline(wb, &b);
2165     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
2166     ok(b == VARIANT_FALSE, "b=%x\n", b);
2167
2168     if(is_clientsite) {
2169         hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
2170         ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
2171
2172         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2173     }
2174
2175     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
2176     ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
2177
2178     if(is_clientsite)
2179         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2180
2181     b = 100;
2182     hres = IWebBrowser2_get_Offline(wb, &b);
2183     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
2184     ok(b == VARIANT_FALSE, "b=%x\n", b);
2185 }
2186
2187 static void test_ambient_unknown(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
2188 {
2189     HRESULT hres;
2190
2191     SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2192     SET_EXPECT(Invoke_AMBIENT_SILENT);
2193     SET_EXPECT(Invoke_AMBIENT_USERMODE);
2194     SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
2195     SET_EXPECT(Invoke_AMBIENT_USERAGENT);
2196     SET_EXPECT(Invoke_AMBIENT_PALETTE);
2197
2198     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_UNKNOWN);
2199     ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
2200
2201     CHECK_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2202     CHECK_EXPECT(Invoke_AMBIENT_SILENT);
2203     CHECK_EXPECT(Invoke_AMBIENT_USERMODE);
2204     CHECK_EXPECT(Invoke_AMBIENT_DLCONTROL);
2205     CHECK_EXPECT(Invoke_AMBIENT_USERAGENT);
2206     CHECK_EXPECT(Invoke_AMBIENT_PALETTE);
2207
2208     CLEAR_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2209     CLEAR_CALLED(Invoke_AMBIENT_SILENT);
2210     CLEAR_CALLED(Invoke_AMBIENT_USERMODE);
2211     CLEAR_CALLED(Invoke_AMBIENT_DLCONTROL);
2212     CLEAR_CALLED(Invoke_AMBIENT_USERAGENT);
2213     CLEAR_CALLED(Invoke_AMBIENT_PALETTE);
2214 }
2215
2216 static void test_wb_funcs(IUnknown *unk, BOOL is_clientsite)
2217 {
2218     IWebBrowser2 *wb;
2219     IOleControl *control;
2220     HRESULT hres;
2221
2222     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
2223     ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
2224
2225     hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
2226     ok(hres == S_OK, "Could not get IOleControl interface: %08x\n", hres);
2227
2228     test_Silent(wb, control, is_clientsite);
2229     test_Offline(wb, control, is_clientsite);
2230     test_ambient_unknown(wb, control, is_clientsite);
2231
2232     IWebBrowser_Release(wb);
2233     IOleControl_Release(control);
2234 }
2235
2236 static void test_GetControlInfo(IUnknown *unk)
2237 {
2238     IOleControl *control;
2239     CONTROLINFO info;
2240     HRESULT hres;
2241
2242     hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
2243     ok(hres == S_OK, "Could not get IOleControl: %08x\n", hres);
2244     if(FAILED(hres))
2245         return;
2246
2247     hres = IOleControl_GetControlInfo(control, &info);
2248     ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, exxpected E_NOTIMPL\n", hres);
2249     hres = IOleControl_GetControlInfo(control, NULL);
2250     ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, exxpected E_NOTIMPL\n", hres);
2251
2252     IOleControl_Release(control);
2253 }
2254
2255 static void test_Extent(IUnknown *unk)
2256 {
2257     IOleObject *oleobj;
2258     SIZE size, expected;
2259     HRESULT hres;
2260     DWORD dpi_x;
2261     DWORD dpi_y;
2262     HDC hdc;
2263
2264     /* default aspect ratio is 96dpi / 96dpi */
2265     hdc = GetDC(0);
2266     dpi_x = GetDeviceCaps(hdc, LOGPIXELSX);
2267     dpi_y = GetDeviceCaps(hdc, LOGPIXELSY);
2268     ReleaseDC(0, hdc);
2269     if (dpi_x != 96 || dpi_y != 96)
2270         trace("dpi: %d / %d\n", dpi_y, dpi_y);
2271
2272     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
2273     ok(hres == S_OK, "Could not get IOleObkect: %08x\n", hres);
2274     if(FAILED(hres))
2275         return;
2276
2277     size.cx = size.cy = 0xdeadbeef;
2278     hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
2279     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
2280     /* Default size is 50x20 pixels, in himetric units */
2281     expected.cx = MulDiv( 50, 2540, dpi_x );
2282     expected.cy = MulDiv( 20, 2540, dpi_y );
2283     ok(size.cx == expected.cx && size.cy == expected.cy, "size = {%d %d} (expected %d %d)\n",
2284        size.cx, size.cy, expected.cx, expected.cy );
2285
2286     size.cx = 800;
2287     size.cy = 700;
2288     hres = IOleObject_SetExtent(oleobj, DVASPECT_CONTENT, &size);
2289     ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
2290
2291     size.cx = size.cy = 0xdeadbeef;
2292     hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
2293     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
2294     ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy);
2295
2296     size.cx = size.cy = 0xdeadbeef;
2297     hres = IOleObject_GetExtent(oleobj, 0, &size);
2298     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
2299     ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy);
2300
2301     size.cx = 900;
2302     size.cy = 800;
2303     hres = IOleObject_SetExtent(oleobj, 0, &size);
2304     ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
2305
2306     size.cx = size.cy = 0xdeadbeef;
2307     hres = IOleObject_GetExtent(oleobj, 0, &size);
2308     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
2309     ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy);
2310
2311     size.cx = size.cy = 0xdeadbeef;
2312     hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
2313     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
2314     ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy);
2315
2316     size.cx = 1000;
2317     size.cy = 900;
2318     hres = IOleObject_SetExtent(oleobj, 0xdeadbeef, &size);
2319     ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
2320
2321     size.cx = size.cy = 0xdeadbeef;
2322     hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
2323     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
2324     ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy);
2325
2326     size.cx = size.cy = 0xdeadbeef;
2327     hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
2328     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
2329     ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy);
2330
2331     IOleObject_Release(oleobj);
2332 }
2333
2334 static void test_ConnectionPoint(IUnknown *unk, BOOL init)
2335 {
2336     IConnectionPointContainer *container;
2337     IConnectionPoint *point;
2338     HRESULT hres;
2339
2340     static DWORD dw = 100;
2341
2342     hres = IUnknown_QueryInterface(unk, &IID_IConnectionPointContainer, (void**)&container);
2343     ok(hres == S_OK, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres);
2344     if(FAILED(hres))
2345         return;
2346
2347     hres = IConnectionPointContainer_FindConnectionPoint(container, &DIID_DWebBrowserEvents2, &point);
2348     IConnectionPointContainer_Release(container);
2349     ok(hres == S_OK, "FindConnectionPoint failed: %08x\n", hres);
2350     if(FAILED(hres))
2351         return;
2352
2353     if(init) {
2354         hres = IConnectionPoint_Advise(point, (IUnknown*)&WebBrowserEvents2, &dw);
2355         ok(hres == S_OK, "Advise failed: %08x\n", hres);
2356         ok(dw == 1, "dw=%d, expected 1\n", dw);
2357     }else {
2358         hres = IConnectionPoint_Unadvise(point, dw);
2359         ok(hres == S_OK, "Unadvise failed: %08x\n", hres);
2360     }
2361
2362     IConnectionPoint_Release(point);
2363 }
2364
2365 static void test_Navigate2(IUnknown *unk)
2366 {
2367     IWebBrowser2 *webbrowser;
2368     VARIANT url;
2369     HRESULT hres;
2370
2371     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&webbrowser);
2372     ok(hres == S_OK, "QueryInterface(IID_IWebBrowser) failed: %08x\n", hres);
2373     if(FAILED(hres))
2374         return;
2375
2376     test_LocationURL(unk, is_first_load ? "" : current_url);
2377     test_ready_state(is_first_load ? READYSTATE_UNINITIALIZED : READYSTATE_COMPLETE);
2378
2379     V_VT(&url) = VT_BSTR;
2380     V_BSTR(&url) = a2bstr("about:blank");
2381     current_url = "about:blank";
2382
2383     if(is_first_load) {
2384         SET_EXPECT(Invoke_AMBIENT_USERMODE);
2385         SET_EXPECT(Invoke_PROPERTYCHANGE);
2386         SET_EXPECT(Invoke_BEFORENAVIGATE2);
2387         SET_EXPECT(Invoke_DOWNLOADBEGIN);
2388         if (use_container_olecmd) SET_EXPECT(Exec_SETDOWNLOADSTATE_1);
2389         SET_EXPECT(EnableModeless_FALSE);
2390         SET_EXPECT(Invoke_STATUSTEXTCHANGE);
2391         SET_EXPECT(SetStatusText);
2392         SET_EXPECT(GetHostInfo);
2393         SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
2394         SET_EXPECT(Invoke_AMBIENT_USERAGENT);
2395         SET_EXPECT(Invoke_AMBIENT_PALETTE);
2396         SET_EXPECT(GetOptionKeyPath);
2397         SET_EXPECT(GetOverridesKeyPath);
2398         if (use_container_olecmd) SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
2399         if (use_container_olecmd) SET_EXPECT(Exec_SETPROGRESSMAX);
2400         if (use_container_olecmd) SET_EXPECT(Exec_SETPROGRESSPOS);
2401         SET_EXPECT(Invoke_SETSECURELOCKICON);
2402         SET_EXPECT(Invoke_FILEDOWNLOAD);
2403         if (use_container_olecmd) SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
2404         SET_EXPECT(Invoke_COMMANDSTATECHANGE);
2405         SET_EXPECT(EnableModeless_TRUE);
2406         if (!use_container_olecmd) SET_EXPECT(Invoke_DOWNLOADCOMPLETE);
2407     }
2408
2409     hres = IWebBrowser2_Navigate2(webbrowser, &url, NULL, NULL, NULL, NULL);
2410     ok(hres == S_OK, "Navigate2 failed: %08x\n", hres);
2411
2412     if(is_first_load) {
2413         CHECK_CALLED(Invoke_AMBIENT_USERMODE);
2414         todo_wine CHECK_CALLED(Invoke_PROPERTYCHANGE);
2415         CHECK_CALLED(Invoke_BEFORENAVIGATE2);
2416         todo_wine CHECK_CALLED(Invoke_DOWNLOADBEGIN);
2417         if (use_container_olecmd) todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_1);
2418         CHECK_CALLED(EnableModeless_FALSE);
2419         CHECK_CALLED(Invoke_STATUSTEXTCHANGE);
2420         CHECK_CALLED(SetStatusText);
2421         CHECK_CALLED(GetHostInfo);
2422         CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
2423         CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
2424         CHECK_CALLED(Invoke_AMBIENT_PALETTE);
2425         CHECK_CALLED(GetOptionKeyPath);
2426         CHECK_CALLED(GetOverridesKeyPath);
2427         if (use_container_olecmd) todo_wine CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
2428         if (use_container_olecmd) todo_wine CHECK_CALLED(Exec_SETPROGRESSMAX);
2429         if (use_container_olecmd) todo_wine CHECK_CALLED(Exec_SETPROGRESSPOS);
2430         todo_wine CHECK_CALLED(Invoke_SETSECURELOCKICON);
2431         todo_wine CHECK_CALLED(Invoke_FILEDOWNLOAD);
2432         todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE);
2433         if (use_container_olecmd) todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
2434         CHECK_CALLED(EnableModeless_TRUE);
2435     }
2436
2437     VariantClear(&url);
2438     IWebBrowser2_Release(webbrowser);
2439
2440     test_ready_state(READYSTATE_LOADING);
2441 }
2442
2443 static void test_QueryStatusWB(IWebBrowser2 *webbrowser, BOOL use_custom_target, BOOL has_document)
2444 {
2445     HRESULT hres, success_state;
2446     OLECMDF success_flags;
2447     enum OLECMDF status;
2448
2449     /*
2450      * We can tell the difference between the custom container target and the built-in target
2451      * since the custom target returns OLECMDF_SUPPORTED instead of OLECMDF_ENABLED.
2452      */
2453     if (use_custom_target)
2454         success_flags = OLECMDF_SUPPORTED;
2455     else
2456         success_flags = OLECMDF_ENABLED;
2457
2458     /* When no target is available (no document or custom target) an error is returned */
2459     if (has_document)
2460         success_state = S_OK;
2461     else
2462         success_state = E_UNEXPECTED;
2463
2464     /*
2465      * Test a safe operation that exists as both a high-numbered MSHTML id and an OLECMDID.
2466      * These tests show that QueryStatusWB uses a NULL pguidCmdGroup, since OLECMDID_STOP
2467      * is enabled and IDM_STOP is not.
2468      */
2469     status = 0xdeadbeef;
2470     if (use_custom_target) SET_EXPECT(QueryStatus_STOP);
2471     hres = IWebBrowser2_QueryStatusWB(webbrowser, OLECMDID_STOP, &status);
2472     ok(hres == success_state, "QueryStatusWB failed: %08x %08x\n", hres, success_state);
2473     if (!use_custom_target && has_document)
2474         todo_wine ok((has_document && status == success_flags) || (!has_document && status == 0xdeadbeef),
2475                      "OLECMDID_STOP not enabled/supported: %08x %08x\n", status, success_flags);
2476     else
2477         ok((has_document && status == success_flags) || (!has_document && status == 0xdeadbeef),
2478            "OLECMDID_STOP not enabled/supported: %08x %08x\n", status, success_flags);
2479     status = 0xdeadbeef;
2480     if (use_custom_target) SET_EXPECT(QueryStatus_IDM_STOP);
2481     hres = IWebBrowser2_QueryStatusWB(webbrowser, IDM_STOP, &status);
2482     ok(hres == success_state, "QueryStatusWB failed: %08x %08x\n", hres, success_state);
2483     ok((has_document && status == 0) || (!has_document && status == 0xdeadbeef),
2484        "IDM_STOP is enabled/supported: %08x %d\n", status, has_document);
2485 }
2486
2487 static void test_ExecWB(IWebBrowser2 *webbrowser, BOOL use_custom_target, BOOL has_document)
2488 {
2489     HRESULT hres, olecmdid_state, idm_state;
2490
2491     /* When no target is available (no document or custom target) an error is returned */
2492     if (has_document)
2493     {
2494         olecmdid_state = S_OK;
2495         idm_state = OLECMDERR_E_NOTSUPPORTED;
2496     }
2497     else
2498     {
2499         olecmdid_state = E_UNEXPECTED;
2500         idm_state = E_UNEXPECTED;
2501     }
2502
2503     /*
2504      * Test a safe operation that exists as both a high-numbered MSHTML id and an OLECMDID.
2505      * These tests show that QueryStatusWB uses a NULL pguidCmdGroup, since OLECMDID_STOP
2506      * succeeds (S_OK) and IDM_STOP does not (OLECMDERR_E_NOTSUPPORTED).
2507      */
2508     if (use_custom_target)
2509         SET_EXPECT(Exec_STOP);
2510     hres = IWebBrowser2_ExecWB(webbrowser, OLECMDID_STOP, OLECMDEXECOPT_DONTPROMPTUSER, 0, 0);
2511     if (!use_custom_target && has_document)
2512         todo_wine ok(hres == olecmdid_state, "ExecWB failed: %08x %08x\n", hres, olecmdid_state);
2513     else
2514         ok(hres == olecmdid_state, "ExecWB failed: %08x %08x\n", hres, olecmdid_state);
2515     if (use_custom_target)
2516         SET_EXPECT(Exec_IDM_STOP);
2517     hres = IWebBrowser2_ExecWB(webbrowser, IDM_STOP, OLECMDEXECOPT_DONTPROMPTUSER, 0, 0);
2518     ok(hres == idm_state, "ExecWB failed: %08x %08x\n", hres, idm_state);
2519 }
2520
2521 static void test_download(DWORD flags)
2522 {
2523     MSG msg;
2524
2525     is_downloading = TRUE;
2526     dwl_flags = flags;
2527
2528     test_ready_state((flags & DWL_FROM_PUT_HREF) ? READYSTATE_COMPLETE : READYSTATE_LOADING);
2529
2530     if(flags & DWL_EXPECT_BEFORE_NAVIGATE) {
2531         SET_EXPECT(Invoke_PROPERTYCHANGE);
2532         SET_EXPECT(Invoke_BEFORENAVIGATE2);
2533         SET_EXPECT(TranslateUrl);
2534     }
2535     SET_EXPECT(Exec_SETPROGRESSMAX);
2536     SET_EXPECT(Exec_SETPROGRESSPOS);
2537     SET_EXPECT(Exec_SETDOWNLOADSTATE_1);
2538     SET_EXPECT(DocHost_EnableModeless_FALSE);
2539     SET_EXPECT(DocHost_EnableModeless_TRUE);
2540     SET_EXPECT(Invoke_SETSECURELOCKICON);
2541     SET_EXPECT(Invoke_282);
2542     SET_EXPECT(EnableModeless_FALSE);
2543     SET_EXPECT(Invoke_COMMANDSTATECHANGE);
2544     SET_EXPECT(Invoke_STATUSTEXTCHANGE);
2545     SET_EXPECT(SetStatusText);
2546     SET_EXPECT(EnableModeless_TRUE);
2547     if(!is_first_load)
2548         SET_EXPECT(GetHostInfo);
2549     SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
2550     SET_EXPECT(Invoke_TITLECHANGE);
2551     SET_EXPECT(Invoke_NAVIGATECOMPLETE2);
2552     if(is_first_load)
2553         SET_EXPECT(GetDropTarget);
2554     SET_EXPECT(Invoke_PROGRESSCHANGE);
2555     SET_EXPECT(Invoke_DOCUMENTCOMPLETE);
2556
2557     SET_EXPECT(UpdateUI);
2558     SET_EXPECT(Exec_UPDATECOMMANDS);
2559     SET_EXPECT(QueryStatus_STOP);
2560
2561     while(!called_Invoke_DOCUMENTCOMPLETE && GetMessage(&msg, NULL, 0, 0)) {
2562         TranslateMessage(&msg);
2563         DispatchMessage(&msg);
2564     }
2565
2566     if(flags & DWL_EXPECT_BEFORE_NAVIGATE) {
2567         todo_wine CHECK_CALLED(Invoke_PROPERTYCHANGE);
2568         CHECK_CALLED(Invoke_BEFORENAVIGATE2);
2569         CHECK_CALLED(TranslateUrl);
2570     }
2571     todo_wine CHECK_CALLED(Exec_SETPROGRESSMAX);
2572     todo_wine CHECK_CALLED(Exec_SETPROGRESSPOS);
2573     todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_1);
2574     CLEAR_CALLED(DocHost_EnableModeless_FALSE); /* IE 7 */
2575     CLEAR_CALLED(DocHost_EnableModeless_TRUE); /* IE 7 */
2576     todo_wine CHECK_CALLED(Invoke_SETSECURELOCKICON);
2577     CLEAR_CALLED(Invoke_282); /* IE 7 */
2578     if(is_first_load)
2579         todo_wine CHECK_CALLED(EnableModeless_FALSE);
2580     else
2581         CLEAR_CALLED(EnableModeless_FALSE); /* IE 8 */
2582     CLEAR_CALLED(Invoke_COMMANDSTATECHANGE);
2583     todo_wine CHECK_CALLED(Invoke_STATUSTEXTCHANGE);
2584     todo_wine CHECK_CALLED(SetStatusText);
2585     if(is_first_load)
2586         todo_wine CHECK_CALLED(EnableModeless_TRUE);
2587     else
2588         CLEAR_CALLED(EnableModeless_FALSE); /* IE 8 */
2589     if(!is_first_load)
2590         todo_wine CHECK_CALLED(GetHostInfo);
2591     todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
2592     todo_wine CHECK_CALLED(Invoke_TITLECHANGE);
2593     CHECK_CALLED(Invoke_NAVIGATECOMPLETE2);
2594     if(is_first_load)
2595         todo_wine CHECK_CALLED(GetDropTarget);
2596     todo_wine CHECK_CALLED(Invoke_PROGRESSCHANGE);
2597     CHECK_CALLED(Invoke_DOCUMENTCOMPLETE);
2598
2599     is_downloading = FALSE;
2600
2601     test_ready_state(READYSTATE_COMPLETE);
2602
2603     while(!called_Exec_UPDATECOMMANDS && GetMessage(&msg, NULL, 0, 0)) {
2604         TranslateMessage(&msg);
2605         DispatchMessage(&msg);
2606     }
2607
2608     CHECK_CALLED(UpdateUI);
2609     CHECK_CALLED(Exec_UPDATECOMMANDS);
2610     CLEAR_CALLED(QueryStatus_STOP);
2611 }
2612
2613 static void test_olecmd(IUnknown *unk, BOOL loaded)
2614 {
2615     IOleCommandTarget *cmdtrg;
2616     OLECMD cmds[3];
2617     HRESULT hres;
2618
2619     hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
2620     ok(hres == S_OK, "Could not get IOleCommandTarget iface: %08x\n", hres);
2621     if(FAILED(hres))
2622         return;
2623
2624     cmds[0].cmdID = OLECMDID_SPELL;
2625     cmds[0].cmdf = 0xdeadbeef;
2626     cmds[1].cmdID = OLECMDID_REFRESH;
2627     cmds[1].cmdf = 0xdeadbeef;
2628     hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 2, cmds, NULL);
2629     if(loaded) {
2630         ok(hres == S_OK, "QueryStatus failed: %08x\n", hres);
2631         ok(cmds[0].cmdf == OLECMDF_SUPPORTED, "OLECMDID_SPELL cmdf = %x\n", cmds[0].cmdf);
2632         ok(cmds[1].cmdf == (OLECMDF_ENABLED|OLECMDF_SUPPORTED),
2633            "OLECMDID_REFRESH cmdf = %x\n", cmds[1].cmdf);
2634     }else {
2635         ok(hres == 0x80040104, "QueryStatus failed: %08x\n", hres);
2636         ok(cmds[0].cmdf == 0xdeadbeef, "OLECMDID_SPELL cmdf = %x\n", cmds[0].cmdf);
2637         ok(cmds[1].cmdf == 0xdeadbeef, "OLECMDID_REFRESH cmdf = %x\n", cmds[0].cmdf);
2638     }
2639
2640     IOleCommandTarget_Release(cmdtrg);
2641 }
2642
2643 static void test_IServiceProvider(IUnknown *unk)
2644 {
2645     IServiceProvider *servprov = (void*)0xdeadbeef;
2646     HRESULT hres;
2647     IUnknown *ret = NULL;
2648
2649     hres = IUnknown_QueryInterface(unk, &IID_IServiceProvider, (void**)&servprov);
2650     ok(hres == S_OK, "QueryInterface returned %08x, expected S_OK\n", hres);
2651     if(FAILED(hres))
2652         return;
2653
2654     hres = IServiceProvider_QueryService(servprov, &SID_STopLevelBrowser, &IID_IBrowserService2, (LPVOID*)&ret);
2655     ok(hres == E_FAIL, "QueryService returned %08x, expected E_FAIL\n", hres);
2656     ok(ret == NULL, "ret returned %p, expected NULL\n", ret);
2657     if(hres == S_OK)
2658     {
2659         IUnknown_Release(ret);
2660     }
2661
2662     IServiceProvider_Release(servprov);
2663 }
2664
2665 static void test_put_href(IUnknown *unk)
2666 {
2667     IHTMLLocation *location;
2668     IHTMLDocument2 *doc;
2669     IDispatch *doc_disp;
2670     BSTR str;
2671     HRESULT hres;
2672
2673     doc_disp = get_document(unk);
2674
2675     hres = IDispatch_QueryInterface(doc_disp, &IID_IHTMLDocument2, (void**)&doc);
2676     IDispatch_Release(doc_disp);
2677     ok(hres == S_OK, "QueryInterface(IID_IHTMLDocument2 failed: %08x\n", hres);
2678
2679     location = NULL;
2680     hres = IHTMLDocument2_get_location(doc, &location);
2681     IHTMLDocument2_Release(doc);
2682     ok(hres == S_OK, "get_location failed: %08x\n", hres);
2683     ok(location != NULL, "location == NULL\n");
2684
2685     SET_EXPECT(TranslateUrl);
2686     SET_EXPECT(Invoke_BEFORENAVIGATE2);
2687     SET_EXPECT(Invoke_PROPERTYCHANGE);
2688
2689     dwl_flags = DWL_FROM_PUT_HREF;
2690
2691     str = a2bstr("about:test");
2692     current_url = "about:test";
2693     is_first_load = FALSE;
2694     hres = IHTMLLocation_put_href(location, str);
2695
2696     CHECK_CALLED(TranslateUrl);
2697     CHECK_CALLED(Invoke_BEFORENAVIGATE2);
2698     todo_wine CHECK_CALLED(Invoke_PROPERTYCHANGE);
2699
2700     IHTMLLocation_Release(location);
2701     SysFreeString(str);
2702     ok(hres == S_OK, "put_href failed: %08x\n", hres);
2703
2704     test_ready_state(READYSTATE_COMPLETE);
2705 }
2706
2707 static void test_QueryInterface(IUnknown *unk)
2708 {
2709     IQuickActivate *qa = (IQuickActivate*)0xdeadbeef;
2710     IRunnableObject *runnable = (IRunnableObject*)0xdeadbeef;
2711     IPerPropertyBrowsing *propbrowse = (void*)0xdeadbeef;
2712     IOleInPlaceSite *inplace = (void*)0xdeadbeef;
2713     IOleCache *cache = (void*)0xdeadbeef;
2714     IObjectWithSite *site = (void*)0xdeadbeef;
2715     IViewObjectEx *viewex = (void*)0xdeadbeef;
2716     IOleLink *link = (void*)0xdeadbeef;
2717     IMarshal *marshal = (void*)0xdeadbeef;
2718     IStdMarshalInfo *marshalinfo = (void*)0xdeadbeef;
2719     HRESULT hres;
2720
2721     hres = IUnknown_QueryInterface(unk, &IID_IQuickActivate, (void**)&qa);
2722     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2723     ok(qa == NULL, "qa=%p, expected NULL\n", qa);
2724
2725     hres = IUnknown_QueryInterface(unk, &IID_IRunnableObject, (void**)&runnable);
2726     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2727     ok(runnable == NULL, "runnable=%p, expected NULL\n", runnable);
2728
2729     hres = IUnknown_QueryInterface(unk, &IID_IPerPropertyBrowsing, (void**)&propbrowse);
2730     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2731     ok(propbrowse == NULL, "propbrowse=%p, expected NULL\n", propbrowse);
2732
2733     hres = IUnknown_QueryInterface(unk, &IID_IOleCache, (void**)&cache);
2734     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2735     ok(cache == NULL, "cache=%p, expected NULL\n", cache);
2736
2737     hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceSite, (void**)&inplace);
2738     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2739     ok(inplace == NULL, "inplace=%p, expected NULL\n", inplace);
2740
2741     hres = IUnknown_QueryInterface(unk, &IID_IObjectWithSite, (void**)&site);
2742     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2743     ok(site == NULL, "site=%p, expected NULL\n", site);
2744
2745     hres = IUnknown_QueryInterface(unk, &IID_IViewObjectEx, (void**)&viewex);
2746     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2747     ok(viewex == NULL, "viewex=%p, expected NULL\n", viewex);
2748
2749     hres = IUnknown_QueryInterface(unk, &IID_IOleLink, (void**)&link);
2750     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2751     ok(link == NULL, "link=%p, expected NULL\n", link);
2752
2753     hres = IUnknown_QueryInterface(unk, &IID_IMarshal, (void**)&marshal);
2754     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2755     ok(marshal == NULL, "marshal=%p, expected NULL\n", marshal);
2756
2757     hres = IUnknown_QueryInterface(unk, &IID_IStdMarshalInfo, (void**)&marshalinfo);
2758     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2759     ok(marshalinfo == NULL, "marshalinfo=%p, expected NULL\n", marshalinfo);
2760
2761 }
2762
2763 static void test_UIActivate(IUnknown *unk, BOOL activate)
2764 {
2765     IOleDocumentView *docview;
2766     IDispatch *disp;
2767     HRESULT hres;
2768
2769     disp = get_document(unk);
2770
2771     hres = IDispatch_QueryInterface(disp, &IID_IOleDocumentView, (void**)&docview);
2772     ok(hres == S_OK, "Got 0x%08x\n", hres);
2773     if(SUCCEEDED(hres)) {
2774         if(activate) {
2775             SET_EXPECT(RequestUIActivate);
2776             SET_EXPECT(ShowUI);
2777             SET_EXPECT(HideUI);
2778             SET_EXPECT(OnFocus);
2779         }
2780
2781         hres = IOleDocumentView_UIActivate(docview, activate);
2782         if(activate)
2783             todo_wine ok(hres == S_OK, "Got 0x%08x\n", hres);
2784         else
2785             ok(hres == S_OK, "Got 0x%08x\n", hres);
2786
2787         if(activate) {
2788             todo_wine {
2789                 CHECK_CALLED(RequestUIActivate);
2790                 CHECK_CALLED(ShowUI);
2791                 CHECK_CALLED(HideUI);
2792                 CHECK_CALLED(OnFocus);
2793             }
2794         }
2795
2796         IOleDocumentView_Release(docview);
2797     }
2798
2799     IDispatch_Release(disp);
2800 }
2801
2802 static void test_TranslateAccelerator(IUnknown *unk)
2803 {
2804     IOleClientSite *doc_clientsite;
2805     IOleInPlaceActiveObject *pao;
2806     HRESULT hres;
2807     DWORD keycode;
2808     MSG msg_a = {
2809         container_hwnd,
2810         0, 0, 0,
2811         GetTickCount(),
2812         {5, 5}
2813     };
2814
2815     test_Navigate2(unk);
2816
2817     hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceActiveObject, (void**)&pao);
2818     ok(hres == S_OK, "Got 0x%08x\n", hres);
2819     if(SUCCEEDED(hres)) {
2820         /* One accelerator that should be handled by mshtml */
2821         msg_a.message = WM_KEYDOWN;
2822         msg_a.wParam = VK_F1;
2823         hres = IOleInPlaceActiveObject_TranslateAccelerator(pao, &msg_a);
2824         ok(hres == S_FALSE, "Got 0x%08x (%04x::%02lx)\n", hres, msg_a.message, msg_a.wParam);
2825
2826         /* And one that should not */
2827         msg_a.message = WM_KEYDOWN;
2828         msg_a.wParam = VK_F5;
2829         hres = IOleInPlaceActiveObject_TranslateAccelerator(pao, &msg_a);
2830         ok(hres == S_FALSE, "Got 0x%08x (%04x::%02lx)\n", hres, msg_a.message, msg_a.wParam);
2831
2832         IOleInPlaceActiveObject_Release(pao);
2833     }
2834
2835     test_UIActivate(unk, TRUE);
2836
2837     /* Test again after UIActivate */
2838     hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceActiveObject, (void**)&pao);
2839     ok(hres == S_OK, "Got 0x%08x\n", hres);
2840     if(SUCCEEDED(hres)) {
2841         /* One accelerator that should be handled by mshtml */
2842         msg_a.message = WM_KEYDOWN;
2843         msg_a.wParam = VK_F1;
2844         SET_EXPECT(DocHost_TranslateAccelerator);
2845         SET_EXPECT(ControlSite_TranslateAccelerator);
2846         hres = IOleInPlaceActiveObject_TranslateAccelerator(pao, &msg_a);
2847         ok(hres == S_FALSE, "Got 0x%08x (%04x::%02lx)\n", hres, msg_a.message, msg_a.wParam);
2848         todo_wine CHECK_CALLED(DocHost_TranslateAccelerator);
2849         todo_wine CHECK_CALLED(ControlSite_TranslateAccelerator);
2850
2851         /* And one that should not */
2852         msg_a.message = WM_KEYDOWN;
2853         msg_a.wParam = VK_F5;
2854         SET_EXPECT(DocHost_TranslateAccelerator);
2855         hres = IOleInPlaceActiveObject_TranslateAccelerator(pao, &msg_a);
2856         todo_wine ok(hres == S_OK, "Got 0x%08x (%04x::%02lx)\n", hres, msg_a.message, msg_a.wParam);
2857         todo_wine CHECK_CALLED(DocHost_TranslateAccelerator);
2858
2859         IOleInPlaceActiveObject_Release(pao);
2860     }
2861
2862     doc_clientsite = get_dochost(unk);
2863     if(doc_clientsite) {
2864         IDocHostUIHandler2 *dochost;
2865         IOleControlSite *doc_controlsite;
2866         IUnknown *unk_test;
2867
2868         hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IOleInPlaceFrame, (void**)&unk_test);
2869         ok(hres == E_NOINTERFACE, "Got 0x%08x\n", hres);
2870         if(SUCCEEDED(hres)) IUnknown_Release(unk_test);
2871
2872         hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IDocHostShowUI, (void**)&unk_test);
2873         todo_wine ok(hres == S_OK, "Got 0x%08x\n", hres);
2874         if(SUCCEEDED(hres)) IUnknown_Release(unk_test);
2875
2876         hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IDocHostUIHandler, (void**)&unk_test);
2877         ok(hres == S_OK, "Got 0x%08x\n", hres);
2878         if(SUCCEEDED(hres)) IUnknown_Release(unk_test);
2879
2880         hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IDocHostUIHandler2, (void**)&dochost);
2881         ok(hres == S_OK, "Got 0x%08x\n", hres);
2882         if(SUCCEEDED(hres)) {
2883             msg_a.message = WM_KEYDOWN;
2884             hr_dochost_TranslateAccelerator = 0xdeadbeef;
2885             for(keycode = 0; keycode <= 0x100; keycode++) {
2886                 msg_a.wParam = keycode;
2887                 SET_EXPECT(DocHost_TranslateAccelerator);
2888                 hres = IDocHostUIHandler_TranslateAccelerator(dochost, &msg_a, &CGID_MSHTML, 1234);
2889                 ok(hres == 0xdeadbeef, "Got 0x%08x\n", hres);
2890                 CHECK_CALLED(DocHost_TranslateAccelerator);
2891             }
2892             hr_dochost_TranslateAccelerator = E_NOTIMPL;
2893
2894             SET_EXPECT(DocHost_TranslateAccelerator);
2895             hres = IDocHostUIHandler_TranslateAccelerator(dochost, &msg_a, &CGID_MSHTML, 1234);
2896             ok(hres == E_NOTIMPL, "Got 0x%08x\n", hres);
2897             CHECK_CALLED(DocHost_TranslateAccelerator);
2898
2899             IDocHostUIHandler2_Release(dochost);
2900         }
2901
2902         hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IOleControlSite, (void**)&doc_controlsite);
2903         ok(hres == S_OK, "Got 0x%08x\n", hres);
2904         if(SUCCEEDED(hres)) {
2905             msg_a.message = WM_KEYDOWN;
2906             hr_site_TranslateAccelerator = 0xdeadbeef;
2907             for(keycode = 0; keycode < 0x100; keycode++) {
2908                 msg_a.wParam = keycode;
2909                 SET_EXPECT(ControlSite_TranslateAccelerator);
2910                 hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0);
2911                 if(keycode == 0x9 || keycode == 0x75)
2912                     todo_wine ok(hres == S_OK, "Got 0x%08x (keycode: %04x)\n", hres, keycode);
2913                 else
2914                     ok(hres == S_FALSE, "Got 0x%08x (keycode: %04x)\n", hres, keycode);
2915
2916                 CHECK_CALLED(ControlSite_TranslateAccelerator);
2917             }
2918             msg_a.wParam = VK_LEFT;
2919             SET_EXPECT(ControlSite_TranslateAccelerator);
2920             hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0);
2921             ok(hres == S_FALSE, "Got 0x%08x (keycode: %04x)\n", hres, keycode);
2922             CHECK_CALLED(ControlSite_TranslateAccelerator);
2923
2924             hr_site_TranslateAccelerator = S_OK;
2925             SET_EXPECT(ControlSite_TranslateAccelerator);
2926             hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0);
2927             ok(hres == S_OK, "Got 0x%08x (keycode: %04x)\n", hres, keycode);
2928             CHECK_CALLED(ControlSite_TranslateAccelerator);
2929
2930             hr_site_TranslateAccelerator = E_NOTIMPL;
2931             SET_EXPECT(ControlSite_TranslateAccelerator);
2932             hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0);
2933             ok(hres == S_FALSE, "Got 0x%08x (keycode: %04x)\n", hres, keycode);
2934             CHECK_CALLED(ControlSite_TranslateAccelerator);
2935
2936             IOleControlSite_Release(doc_controlsite);
2937         }
2938
2939         IOleClientSite_Release(doc_clientsite);
2940     }
2941
2942     test_UIActivate(unk, FALSE);
2943 }
2944
2945 static void test_dochost_qs(IUnknown *unk)
2946 {
2947     IOleClientSite *client_site;
2948     IServiceProvider *serv_prov;
2949     IUnknown *service;
2950     HRESULT hres;
2951
2952     client_site = get_dochost(unk);
2953     hres = IOleClientSite_QueryInterface(client_site, &IID_IServiceProvider, (void**)&serv_prov);
2954     IOleClientSite_Release(client_site);
2955     ok(hres == S_OK, "Could not get IServiceProvider iface: %08x\n", hres);
2956
2957     hres = IServiceProvider_QueryService(serv_prov, &IID_IHlinkFrame, &IID_IHlinkFrame, (void**)&service);
2958     ok(hres == S_OK, "QueryService failed: %08x\n", hres);
2959     ok(iface_cmp(service, unk), "service != unk\n");
2960     IUnknown_Release(service);
2961
2962     hres = IServiceProvider_QueryService(serv_prov, &IID_IWebBrowserApp, &IID_IHlinkFrame, (void**)&service);
2963     ok(hres == S_OK, "QueryService failed: %08x\n", hres);
2964     ok(iface_cmp(service, unk), "service != unk\n");
2965     IUnknown_Release(service);
2966
2967     hres = IServiceProvider_QueryService(serv_prov, &IID_IShellBrowser, &IID_IShellBrowser, (void**)&service);
2968     ok(hres == S_OK, "QueryService failed: %08x\n", hres);
2969     IUnknown_Release(service);
2970
2971     hres = IServiceProvider_QueryService(serv_prov, &IID_IShellBrowser, &IID_IBrowserService, (void**)&service);
2972     ok(hres == S_OK, "QueryService failed: %08x\n", hres);
2973     IUnknown_Release(service);
2974
2975     hres = IServiceProvider_QueryService(serv_prov, &IID_IShellBrowser, &IID_IDocObjectService, (void**)&service);
2976     ok(hres == S_OK, "QueryService failed: %08x\n", hres);
2977     IUnknown_Release(service);
2978
2979     IServiceProvider_Release(serv_prov);
2980 }
2981
2982 static void test_WebBrowser(BOOL do_download)
2983 {
2984     IUnknown *unk = NULL;
2985     ULONG ref;
2986     HRESULT hres;
2987
2988     if (FAILED(create_WebBrowser(&unk)))
2989         return;
2990
2991     is_downloading = FALSE;
2992     is_first_load = TRUE;
2993     use_container_olecmd = TRUE;
2994
2995     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
2996     ok(hres == S_OK, "Could not get IWebBrowser2 iface: %08x\n", hres);
2997
2998     test_QueryStatusWB(wb, FALSE, FALSE);
2999     test_ExecWB(wb, FALSE, FALSE);
3000     test_QueryInterface(unk);
3001     test_ready_state(READYSTATE_UNINITIALIZED);
3002     test_ClassInfo(unk);
3003     test_LocationURL(unk, "");
3004     test_ConnectionPoint(unk, TRUE);
3005     test_ClientSite(unk, &ClientSite, !do_download);
3006     test_Extent(unk);
3007     test_wb_funcs(unk, TRUE);
3008     test_DoVerb(unk);
3009     test_olecmd(unk, FALSE);
3010     test_Navigate2(unk);
3011     test_QueryStatusWB(wb, TRUE, TRUE);
3012     test_ExecWB(wb, TRUE, TRUE);
3013
3014     if(do_download) {
3015         IDispatch *doc, *doc2;
3016
3017         test_download(0);
3018         test_olecmd(unk, TRUE);
3019         doc = get_document(unk);
3020
3021         test_put_href(unk);
3022         test_download(DWL_FROM_PUT_HREF);
3023         doc2 = get_document(unk);
3024         ok(doc == doc2, "doc != doc2\n");
3025         IDispatch_Release(doc2);
3026
3027         test_Navigate2(unk);
3028         test_download(DWL_EXPECT_BEFORE_NAVIGATE);
3029         test_TranslateAccelerator(unk);
3030         doc2 = get_document(unk);
3031         ok(doc == doc2, "doc != doc2\n");
3032         IDispatch_Release(doc2);
3033         IDispatch_Release(doc2);
3034
3035         test_dochost_qs(unk);
3036     }
3037
3038     test_ClientSite(unk, NULL, !do_download);
3039     test_ie_funcs(unk);
3040     test_GetControlInfo(unk);
3041     test_wb_funcs(unk, FALSE);
3042     test_ConnectionPoint(unk, FALSE);
3043     test_IServiceProvider(unk);
3044
3045     IWebBrowser2_Release(wb);
3046     ref = IUnknown_Release(unk);
3047     ok(ref == 0, "ref=%d, expected 0\n", ref);
3048 }
3049
3050 static void test_WebBrowser_NoContainerOlecmd(void)
3051 {
3052     IUnknown *unk = NULL;
3053     HRESULT hres;
3054     ULONG ref;
3055
3056     is_downloading = FALSE;
3057     is_first_load = TRUE;
3058     use_container_olecmd = FALSE;
3059
3060     /* Setup stage */
3061     if (FAILED(create_WebBrowser(&unk)))
3062         return;
3063     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
3064     ok(hres == S_OK, "QueryInterface(IID_IWebBrowser) failed: %08x\n", hres);
3065     if(FAILED(hres))
3066         return;
3067     test_ConnectionPoint(unk, TRUE);
3068     test_ClientSite(unk, &ClientSite, TRUE);
3069     test_DoVerb(unk);
3070     test_Navigate2(unk);
3071
3072     /* Tests of interest */
3073     test_QueryStatusWB(wb, FALSE, TRUE);
3074     test_ExecWB(wb, FALSE, TRUE);
3075
3076     /* Cleanup stage */
3077     IWebBrowser2_Release(wb);
3078     test_ClientSite(unk, NULL, TRUE);
3079     test_ConnectionPoint(unk, FALSE);
3080     ref = IUnknown_Release(unk);
3081     ok(ref == 0, "ref=%d, expected 0\n", ref);
3082 }
3083
3084 static BOOL check_ie(void)
3085 {
3086     IHTMLDocument5 *doc;
3087     HRESULT hres;
3088
3089     hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
3090             &IID_IHTMLDocument5, (void**)&doc);
3091     if(FAILED(hres))
3092       return FALSE;
3093
3094     IHTMLDocument5_Release(doc);
3095     return TRUE;
3096 }
3097
3098 START_TEST(webbrowser)
3099 {
3100     OleInitialize(NULL);
3101
3102     if(check_ie()) {
3103       container_hwnd = create_container_window();
3104
3105       trace("Testing WebBrowser (no download)...\n");
3106       test_WebBrowser(FALSE);
3107       trace("Testing WebBrowser...\n");
3108       test_WebBrowser(TRUE);
3109       trace("Testing WebBrowser w/o container-based olecmd...\n");
3110       test_WebBrowser_NoContainerOlecmd();
3111     }else {
3112       win_skip("Skipping tests on too old IE\n");
3113     }
3114
3115     OleUninitialize();
3116 }