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