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