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