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