shell32: Remove superfluous pointer casts.
[wine] / dlls / shdocvw / tests / webbrowser.c
1 /*
2  * Copyright 2006 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #define COBJMACROS
20 #define CONST_VTABLE
21
22 #include <wine/test.h>
23 #include <stdarg.h>
24 #include <stdio.h>
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "initguid.h"
29 #include "ole2.h"
30 #include "exdisp.h"
31 #include "htiframe.h"
32 #include "mshtmhst.h"
33 #include "idispids.h"
34 #include "olectl.h"
35 #include "mshtmdid.h"
36 #include "shobjidl.h"
37 #include "shlguid.h"
38 #include "exdispid.h"
39
40 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
41
42 #define DEFINE_EXPECT(func) \
43     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
44
45 #define SET_EXPECT(func) \
46     expect_ ## func = TRUE
47
48 #define CHECK_EXPECT2(func) \
49     do { \
50         ok(expect_ ##func, "unexpected call " #func "\n"); \
51         called_ ## func = TRUE; \
52     }while(0)
53
54 #define CHECK_EXPECT(func) \
55     do { \
56         CHECK_EXPECT2(func); \
57         expect_ ## func = FALSE; \
58     }while(0)
59
60 #define CHECK_CALLED(func) \
61     do { \
62         ok(called_ ## func, "expected " #func "\n"); \
63         expect_ ## func = called_ ## func = FALSE; \
64     }while(0)
65
66 #define CHECK_CALLED_BROKEN(func) \
67     do { \
68         ok(called_ ## func || broken(!called_ ## func), "expected " #func "\n"); \
69         expect_ ## func = called_ ## func = FALSE; \
70     }while(0)
71
72 #define CLEAR_CALLED(func) \
73     expect_ ## func = called_ ## func = FALSE
74
75 DEFINE_EXPECT(GetContainer);
76 DEFINE_EXPECT(Site_GetWindow);
77 DEFINE_EXPECT(ShowObject);
78 DEFINE_EXPECT(CanInPlaceActivate);
79 DEFINE_EXPECT(OnInPlaceActivate);
80 DEFINE_EXPECT(OnUIActivate);
81 DEFINE_EXPECT(GetWindowContext);
82 DEFINE_EXPECT(Frame_GetWindow);
83 DEFINE_EXPECT(Frame_SetActiveObject);
84 DEFINE_EXPECT(UIWindow_SetActiveObject);
85 DEFINE_EXPECT(SetMenu);
86 DEFINE_EXPECT(Invoke_AMBIENT_USERMODE);
87 DEFINE_EXPECT(Invoke_AMBIENT_DLCONTROL);
88 DEFINE_EXPECT(Invoke_AMBIENT_USERAGENT);
89 DEFINE_EXPECT(Invoke_AMBIENT_PALETTE);
90 DEFINE_EXPECT(Invoke_AMBIENT_SILENT);
91 DEFINE_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
92 DEFINE_EXPECT(Invoke_STATUSTEXTCHANGE);
93 DEFINE_EXPECT(Invoke_PROPERTYCHANGE);
94 DEFINE_EXPECT(Invoke_DOWNLOADBEGIN);
95 DEFINE_EXPECT(Invoke_BEFORENAVIGATE2);
96 DEFINE_EXPECT(Invoke_SETSECURELOCKICON);
97 DEFINE_EXPECT(Invoke_FILEDOWNLOAD);
98 DEFINE_EXPECT(Invoke_COMMANDSTATECHANGE);
99 DEFINE_EXPECT(Invoke_DOWNLOADCOMPLETE);
100 DEFINE_EXPECT(Invoke_ONMENUBAR);
101 DEFINE_EXPECT(Invoke_ONADDRESSBAR);
102 DEFINE_EXPECT(Invoke_ONSTATUSBAR);
103 DEFINE_EXPECT(Invoke_ONTOOLBAR);
104 DEFINE_EXPECT(Invoke_ONFULLSCREEN);
105 DEFINE_EXPECT(Invoke_ONTHEATERMODE);
106 DEFINE_EXPECT(Invoke_WINDOWSETRESIZABLE);
107 DEFINE_EXPECT(EnableModeless_TRUE);
108 DEFINE_EXPECT(EnableModeless_FALSE);
109 DEFINE_EXPECT(GetHostInfo);
110 DEFINE_EXPECT(GetOptionKeyPath);
111 DEFINE_EXPECT(GetOverridesKeyPath);
112 DEFINE_EXPECT(SetStatusText);
113 DEFINE_EXPECT(UpdateUI);
114 DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_0);
115 DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_1);
116 DEFINE_EXPECT(Exec_SETPROGRESSMAX);
117 DEFINE_EXPECT(Exec_SETPROGRESSPOS);
118 DEFINE_EXPECT(QueryStatus_SETPROGRESSTEXT);
119
120 static const WCHAR wszItem[] = {'i','t','e','m',0};
121 static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
122 static const WCHAR emptyW[] = {0};
123
124 static VARIANT_BOOL exvb;
125 static IWebBrowser2 *wb;
126
127 static HWND container_hwnd, shell_embedding_hwnd;
128
129 static const char *debugstr_w(LPCWSTR str)
130 {
131     static char buf[1024];
132     if(!str)
133         return "(null)";
134     WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL);
135     return buf;
136 }
137
138 static const char *debugstr_guid(REFIID riid)
139 {
140     static char buf[50];
141
142     sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
143             riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
144             riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
145             riid->Data4[5], riid->Data4[6], riid->Data4[7]);
146
147     return buf;
148 }
149
150 #define test_LocationURL(a,b) _test_LocationURL(__LINE__,a,b)
151 static void _test_LocationURL(unsigned line, IUnknown *unk, LPCWSTR exurl)
152 {
153     IWebBrowser2 *wb;
154     BSTR url = (void*)0xdeadbeef;
155     HRESULT hres;
156
157     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
158     ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
159     if(FAILED(hres))
160         return;
161
162     hres = IWebBrowser2_get_LocationURL(wb, &url);
163     ok_(__FILE__,line) (hres == (*exurl ? S_OK : S_FALSE), "get_LocationURL failed: %08x\n", hres);
164     ok_(__FILE__,line) (!lstrcmpW(url, exurl), "unexpected URL: %s\n", debugstr_w(url));
165
166     SysFreeString(url);
167     IWebBrowser2_Release(wb);
168 }
169
170 static HRESULT QueryInterface(REFIID,void**);
171
172 static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface,
173         REFIID riid, void **ppv)
174 {
175     ok(0, "unexpected call\n");
176     return E_NOINTERFACE;
177 }
178
179 static ULONG WINAPI OleCommandTarget_AddRef(IOleCommandTarget *iface)
180 {
181     return 2;
182 }
183
184 static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface)
185 {
186     return 1;
187 }
188
189 static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
190         ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
191 {
192     ok(!pguidCmdGroup, "pguidCmdGroup != MULL\n");
193     ok(cCmds == 1, "cCmds=%d, expected 1\n", cCmds);
194     ok(!pCmdText, "pCmdText != NULL\n");
195
196     switch(prgCmds[0].cmdID) {
197     case OLECMDID_SETPROGRESSTEXT:
198         CHECK_EXPECT(QueryStatus_SETPROGRESSTEXT);
199         prgCmds[0].cmdf = OLECMDF_ENABLED;
200         return S_OK;
201     default:
202         ok(0, "unexpected command %d\n", prgCmds[0].cmdID);
203     }
204
205     return E_FAIL;
206 }
207
208 static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
209         DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
210 {
211     if(!pguidCmdGroup) {
212         switch(nCmdID) {
213         case OLECMDID_SETPROGRESSMAX:
214             CHECK_EXPECT(Exec_SETPROGRESSMAX);
215             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
216             ok(pvaIn != NULL, "pvaIn == NULL\n");
217             if(pvaIn)
218                 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
219             ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
220             return S_OK;
221         case OLECMDID_SETPROGRESSPOS:
222             CHECK_EXPECT(Exec_SETPROGRESSPOS);
223             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
224             ok(pvaIn != NULL, "pvaIn == NULL\n");
225             if(pvaIn)
226                 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
227             ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
228             return S_OK;
229         case OLECMDID_SETDOWNLOADSTATE:
230             ok(!nCmdexecopt, "nCmdexecopts=%08x\n", nCmdexecopt);
231             ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut);
232             ok(pvaIn != NULL, "pvaIn == NULL\n");
233             ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d\n", V_VT(pvaIn));
234             switch(V_I4(pvaIn)) {
235             case 0:
236                 CHECK_EXPECT(Exec_SETDOWNLOADSTATE_0);
237                 break;
238             case 1:
239                 CHECK_EXPECT2(Exec_SETDOWNLOADSTATE_1);
240                 break;
241             default:
242                 ok(0, "unexpevted V_I4(pvaIn)=%d\n", V_I4(pvaIn));
243             }
244             return S_OK;
245         default:
246             ok(0, "unexpected nsCmdID %d\n", nCmdID);
247         }
248     }else if(IsEqualGUID(&CGID_Explorer, pguidCmdGroup)) {
249         switch(nCmdID) {
250         case 24:
251             return E_FAIL; /* TODO */
252         case 25:
253             return E_FAIL; /* IE5 */
254         case 66:
255             return E_FAIL; /* TODO */
256         default:
257             ok(0, "unexpected nCmdID %d\n", nCmdID);
258         }
259     }else {
260         ok(0, "unepected pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
261     }
262
263     return E_FAIL;
264 }
265
266 static IOleCommandTargetVtbl OleCommandTargetVtbl = {
267     OleCommandTarget_QueryInterface,
268     OleCommandTarget_AddRef,
269     OleCommandTarget_Release,
270     OleCommandTarget_QueryStatus,
271     OleCommandTarget_Exec
272 };
273
274 static IOleCommandTarget OleCommandTarget = { &OleCommandTargetVtbl };
275
276 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
277 {
278     if(IsEqualGUID(&IID_ITargetContainer, riid))
279         return E_NOINTERFACE; /* TODO */
280
281     if(IsEqualGUID(&IID_IOleCommandTarget, riid)) {
282         *ppv = &OleCommandTarget;
283         return S_OK;
284     }
285
286     ok(0, "unexpected call\n");
287     return E_NOINTERFACE;
288 }
289
290 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
291 {
292     return 2;
293 }
294
295 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
296 {
297     return 1;
298 }
299
300 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
301         LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut)
302 {
303     ok(0, "unexpected call\n");
304     return E_NOTIMPL;
305 }
306
307 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
308         IEnumUnknown **ppenum)
309 {
310     ok(0, "unexpected call\n");
311     return E_NOTIMPL;
312 }
313
314 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
315 {
316     ok(0, "unexpected call\n");
317     return E_NOTIMPL;
318 }
319
320 static const IOleContainerVtbl OleContainerVtbl = {
321     OleContainer_QueryInterface,
322     OleContainer_AddRef,
323     OleContainer_Release,
324     OleContainer_ParseDisplayName,
325     OleContainer_EnumObjects,
326     OleContainer_LockContainer
327 };
328
329 static IOleContainer OleContainer = { &OleContainerVtbl };
330
331 static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
332 {
333     return QueryInterface(riid, ppv);
334 }
335
336 static ULONG WINAPI Dispatch_AddRef(IDispatch *iface)
337 {
338     return 2;
339 }
340
341 static ULONG WINAPI Dispatch_Release(IDispatch *iface)
342 {
343     return 1;
344 }
345
346 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
347 {
348     ok(0, "unexpected call\n");
349     return E_NOTIMPL;
350 }
351
352 static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
353         ITypeInfo **ppTInfo)
354 {
355     ok(0, "unexpected call\n");
356     return E_NOTIMPL;
357 }
358
359 static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
360         UINT cNames, LCID lcid, DISPID *rgDispId)
361 {
362     ok(0, "unexpected call\n");
363     return E_NOTIMPL;
364 }
365
366 static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
367         LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
368         EXCEPINFO *pExcepInfo, UINT *puArgErr)
369 {
370     ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
371     ok(pDispParams != NULL, "pDispParams == NULL\n");
372     ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
373     ok(V_VT(pVarResult) == VT_EMPTY, "V_VT(pVarResult)=%d\n", V_VT(pVarResult));
374     ok(wFlags == DISPATCH_PROPERTYGET, "wFlags=%08x, expected DISPATCH_PROPERTYGET\n", wFlags);
375     ok(pDispParams->rgvarg == NULL, "pDispParams->rgvarg = %p\n", pDispParams->rgvarg);
376     ok(pDispParams->rgdispidNamedArgs == NULL,
377        "pDispParams->rgdispidNamedArgs = %p\n", pDispParams->rgdispidNamedArgs);
378     ok(pDispParams->cArgs == 0, "pDispParams->cArgs = %d\n", pDispParams->cArgs);
379     ok(pDispParams->cNamedArgs == 0, "pDispParams->cNamedArgs = %d\n", pDispParams->cNamedArgs);
380
381     switch(dispIdMember) {
382     case DISPID_AMBIENT_USERMODE:
383         CHECK_EXPECT2(Invoke_AMBIENT_USERMODE);
384         return E_FAIL;
385     case DISPID_AMBIENT_DLCONTROL:
386         CHECK_EXPECT(Invoke_AMBIENT_DLCONTROL);
387         ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
388         return E_FAIL;
389     case DISPID_AMBIENT_USERAGENT:
390        CHECK_EXPECT(Invoke_AMBIENT_USERAGENT);
391         ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
392         return E_FAIL;
393     case DISPID_AMBIENT_PALETTE:
394         CHECK_EXPECT(Invoke_AMBIENT_PALETTE);
395         ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
396         return E_FAIL;
397     case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
398         CHECK_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
399         ok(puArgErr == NULL, "puArgErr=%p\n", puArgErr);
400         V_VT(pVarResult) = VT_BOOL;
401         V_BOOL(pVarResult) = VARIANT_FALSE;
402         return S_OK;
403     case DISPID_AMBIENT_SILENT:
404         CHECK_EXPECT(Invoke_AMBIENT_SILENT);
405         ok(puArgErr == NULL, "puArgErr=%p\n", puArgErr);
406         V_VT(pVarResult) = VT_BOOL;
407         V_BOOL(pVarResult) = VARIANT_FALSE;
408         return S_OK;
409     }
410
411     ok(0, "unexpected dispIdMember %d\n", dispIdMember);
412     return E_NOTIMPL;
413 }
414
415 static IDispatchVtbl DispatchVtbl = {
416     Dispatch_QueryInterface,
417     Dispatch_AddRef,
418     Dispatch_Release,
419     Dispatch_GetTypeInfoCount,
420     Dispatch_GetTypeInfo,
421     Dispatch_GetIDsOfNames,
422     Dispatch_Invoke
423 };
424
425 static IDispatch Dispatch = { &DispatchVtbl };
426
427 static HRESULT WINAPI WebBrowserEvents2_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
428 {
429     *ppv = NULL;
430
431     if(IsEqualGUID(&DIID_DWebBrowserEvents2, riid)) {
432         *ppv = iface;
433         return S_OK;
434     }
435
436     ok(0, "unexpected riid %s\n", debugstr_guid(riid));
437     return E_NOINTERFACE;
438 }
439
440 #define test_invoke_bool(p,s) _test_invoke_bool(__LINE__,p,s)
441 static void _test_invoke_bool(unsigned line, const DISPPARAMS *params, BOOL strict)
442 {
443     ok_(__FILE__,line) (params->rgvarg != NULL, "rgvarg == NULL\n");
444     ok_(__FILE__,line) (params->cArgs == 1, "cArgs=%d, expected 1\n", params->cArgs);
445     ok_(__FILE__,line) (V_VT(params->rgvarg) == VT_BOOL, "V_VT(arg)=%d\n", V_VT(params->rgvarg));
446     if(strict)
447         ok_(__FILE__,line) (V_BOOL(params->rgvarg) == exvb, "V_VT(arg)=%x, expected %x\n",
448                             V_BOOL(params->rgvarg), exvb);
449     else
450         ok_(__FILE__,line) (!V_BOOL(params->rgvarg) == !exvb, "V_VT(arg)=%x, expected %x\n",
451                             V_BOOL(params->rgvarg), exvb);
452 }
453
454 static void test_OnBeforeNavigate(const VARIANT *disp, const VARIANT *url, const VARIANT *flags,
455         const VARIANT *frame, const VARIANT *post_data, const VARIANT *headers, const VARIANT *cancel)
456 {
457     ok(V_VT(disp) == VT_DISPATCH, "V_VT(disp)=%d, expected VT_DISPATCH\n", V_VT(disp));
458     ok(V_DISPATCH(disp) != NULL, "V_DISPATCH(disp) == NULL\n");
459     ok(V_DISPATCH(disp) == (IDispatch*)wb, "V_DISPATCH(disp)=%p, wb=%p\n", V_DISPATCH(disp), wb);
460
461     ok(V_VT(url) == (VT_BYREF|VT_VARIANT), "V_VT(url)=%x, expected VT_BYREF|VT_VARIANT\n", V_VT(url));
462     ok(V_VARIANTREF(url) != NULL, "V_VARIANTREF(url) == NULL)\n");
463     if(V_VARIANTREF(url)) {
464         ok(V_VT(V_VARIANTREF(url)) == VT_BSTR, "V_VT(V_VARIANTREF(url))=%d, expected VT_BSTR\n",
465            V_VT(V_VARIANTREF(url)));
466         ok(V_BSTR(V_VARIANTREF(url)) != NULL, "V_BSTR(V_VARIANTREF(url)) == NULL\n");
467         ok(!lstrcmpW(V_BSTR(V_VARIANTREF(url)), about_blankW), "unexpected url %s\n",
468            debugstr_w(V_BSTR(V_VARIANTREF(url))));
469     }
470
471     ok(V_VT(flags) == (VT_BYREF|VT_VARIANT), "V_VT(flags)=%x, expected VT_BYREF|VT_VARIANT\n",
472        V_VT(flags));
473     ok(V_VT(flags) == (VT_BYREF|VT_VARIANT), "V_VT(flags)=%x, expected VT_BYREF|VT_VARIANT\n",
474        V_VT(flags));
475     ok(V_VARIANTREF(flags) != NULL, "V_VARIANTREF(flags) == NULL)\n");
476     if(V_VARIANTREF(flags)) {
477         ok(V_VT(V_VARIANTREF(flags)) == VT_I4, "V_VT(V_VARIANTREF(flags))=%d, expected VT_I4\n",
478            V_VT(V_VARIANTREF(flags)));
479         ok(V_I4(V_VARIANTREF(flags)) == 0, "V_I4(V_VARIANTREF(flags)) = %d, expected 0\n",
480            V_I4(V_VARIANTREF(flags)));
481     }
482
483     ok(V_VT(frame) == (VT_BYREF|VT_VARIANT), "V_VT(frame)=%x, expected VT_BYREF|VT_VARIANT\n",
484        V_VT(frame));
485     ok(V_VT(frame) == (VT_BYREF|VT_VARIANT), "V_VT(frame)=%x, expected VT_BYREF|VT_VARIANT\n",
486        V_VT(frame));
487     ok(V_VARIANTREF(frame) != NULL, "V_VARIANTREF(frame) == NULL)\n");
488     if(V_VARIANTREF(frame)) {
489         ok(V_VT(V_VARIANTREF(frame)) == VT_BSTR, "V_VT(V_VARIANTREF(frame))=%d, expected VT_BSTR\n",
490            V_VT(V_VARIANTREF(frame)));
491         ok(V_BSTR(V_VARIANTREF(frame)) == NULL, "V_BSTR(V_VARIANTREF(frame)) = %p, expected NULL\n",
492            V_BSTR(V_VARIANTREF(frame)));
493     }
494
495     ok(V_VT(post_data) == (VT_BYREF|VT_VARIANT), "V_VT(post_data)=%x, expected VT_BYREF|VT_VARIANT\n",
496        V_VT(post_data));
497     ok(V_VT(post_data) == (VT_BYREF|VT_VARIANT), "V_VT(post_data)=%x, expected VT_BYREF|VT_VARIANT\n",
498        V_VT(post_data));
499     ok(V_VARIANTREF(post_data) != NULL, "V_VARIANTREF(post_data) == NULL)\n");
500     if(V_VARIANTREF(post_data)) {
501         ok(V_VT(V_VARIANTREF(post_data)) == (VT_VARIANT|VT_BYREF),
502            "V_VT(V_VARIANTREF(post_data))=%d, expected VT_VARIANT|VT_BYREF\n",
503            V_VT(V_VARIANTREF(post_data)));
504         ok(V_VARIANTREF(V_VARIANTREF(post_data)) != NULL,
505            "V_VARIANTREF(V_VARIANTREF(post_data)) == NULL\n");
506         if(V_VARIANTREF(V_VARIANTREF(post_data))) {
507             ok(V_VT(V_VARIANTREF(V_VARIANTREF(post_data))) == VT_EMPTY,
508                "V_VT(V_VARIANTREF(V_VARIANTREF(post_data))) = %d, expected VT_EMPTY\n",
509                V_VT(V_VARIANTREF(V_VARIANTREF(post_data))));
510
511             if(V_VT(V_VARIANTREF(V_VARIANTREF(post_data))) == (VT_UI1|VT_ARRAY)) {
512                 const SAFEARRAY *sa = V_ARRAY(V_VARIANTREF(V_VARIANTREF(post_data)));
513
514                 ok(sa->cDims == 1, "sa->cDims = %d, expected 1\n", sa->cDims);
515                 ok(sa->fFeatures == 0, "sa->fFeatures = %d, expected 0\n", sa->fFeatures);
516             }
517         }
518     }
519
520     ok(V_VT(headers) == (VT_BYREF|VT_VARIANT), "V_VT(headers)=%x, expected VT_BYREF|VT_VARIANT\n",
521        V_VT(headers));
522     ok(V_VARIANTREF(headers) != NULL, "V_VARIANTREF(headers) == NULL)\n");
523     if(V_VARIANTREF(headers)) {
524         ok(V_VT(V_VARIANTREF(headers)) == VT_BSTR, "V_VT(V_VARIANTREF(headers))=%d, expected VT_BSTR\n",
525            V_VT(V_VARIANTREF(headers)));
526         ok(V_BSTR(V_VARIANTREF(headers)) == NULL, "V_BSTR(V_VARIANTREF(heders)) = %p, expected NULL\n",
527            V_BSTR(V_VARIANTREF(headers)));
528     }
529
530     ok(V_VT(cancel) == (VT_BYREF|VT_BOOL), "V_VT(cancel)=%x, expected VT_BYREF|VT_BOOL\n",
531        V_VT(cancel));
532     ok(V_BOOLREF(cancel) != NULL, "V_BOOLREF(pDispParams->rgvarg[0] == NULL)\n");
533     if(V_BOOLREF(cancel))
534         ok(*V_BOOLREF(cancel) == VARIANT_FALSE, "*V_BOOLREF(calcel) = %x, expected VARIANT_FALSE\n",
535            *V_BOOLREF(cancel));
536 }
537
538 static HRESULT WINAPI WebBrowserEvents2_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
539         LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
540         EXCEPINFO *pExcepInfo, UINT *puArgErr)
541 {
542     ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
543     ok(pDispParams != NULL, "pDispParams == NULL\n");
544     ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
545     ok(pVarResult == NULL, "pVarResult=%p\n", pVarResult);
546     ok(wFlags == DISPATCH_METHOD, "wFlags=%08x, expected DISPATCH_METHOD\n", wFlags);
547     ok(pDispParams->rgdispidNamedArgs == NULL,
548        "pDispParams->rgdispidNamedArgs = %p\n", pDispParams->rgdispidNamedArgs);
549     ok(pDispParams->cNamedArgs == 0, "pDispParams->cNamedArgs = %d\n", pDispParams->cNamedArgs);
550
551     switch(dispIdMember) {
552     case DISPID_STATUSTEXTCHANGE:
553         CHECK_EXPECT2(Invoke_STATUSTEXTCHANGE);
554
555         ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
556         ok(pDispParams->cArgs == 1, "cArgs=%d, expected 1\n", pDispParams->cArgs);
557         ok(V_VT(pDispParams->rgvarg) == VT_BSTR, "V_VT(pDispParams->rgvarg)=%d, expected VT_BSTR\n",
558            V_VT(pDispParams->rgvarg));
559         /* TODO: Check text */
560         break;
561
562     case DISPID_PROPERTYCHANGE:
563         CHECK_EXPECT2(Invoke_PROPERTYCHANGE);
564
565         ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
566         ok(pDispParams->cArgs == 1, "cArgs=%d, expected 1\n", pDispParams->cArgs);
567         /* TODO: Check args */
568         break;
569
570     case DISPID_DOWNLOADBEGIN:
571         CHECK_EXPECT(Invoke_DOWNLOADBEGIN);
572
573         ok(pDispParams->rgvarg == NULL, "rgvarg=%p, expected NULL\n", pDispParams->rgvarg);
574         ok(pDispParams->cArgs == 0, "cArgs=%d, expected 0\n", pDispParams->cArgs);
575         break;
576
577     case DISPID_BEFORENAVIGATE2:
578         CHECK_EXPECT(Invoke_BEFORENAVIGATE2);
579
580         ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
581         ok(pDispParams->cArgs == 7, "cArgs=%d, expected 7\n", pDispParams->cArgs);
582         test_OnBeforeNavigate(pDispParams->rgvarg+6, pDispParams->rgvarg+5, pDispParams->rgvarg+4,
583                               pDispParams->rgvarg+3, pDispParams->rgvarg+2, pDispParams->rgvarg+1,
584                               pDispParams->rgvarg);
585         break;
586
587     case DISPID_SETSECURELOCKICON:
588         CHECK_EXPECT2(Invoke_SETSECURELOCKICON);
589
590         ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
591         ok(pDispParams->cArgs == 1, "cArgs=%d, expected 1\n", pDispParams->cArgs);
592         /* TODO: Check args */
593         break;
594
595     case DISPID_FILEDOWNLOAD:
596         CHECK_EXPECT(Invoke_FILEDOWNLOAD);
597
598         ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
599         ok(pDispParams->cArgs == 2, "cArgs=%d, expected 2\n", pDispParams->cArgs);
600         /* TODO: Check args */
601         break;
602
603     case DISPID_COMMANDSTATECHANGE:
604         CHECK_EXPECT2(Invoke_COMMANDSTATECHANGE);
605
606         ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
607         ok(pDispParams->cArgs == 2, "cArgs=%d, expected 2\n", pDispParams->cArgs);
608         /* TODO: Check args */
609         break;
610
611     case DISPID_DOWNLOADCOMPLETE:
612         CHECK_EXPECT(Invoke_DOWNLOADCOMPLETE);
613
614         ok(pDispParams->rgvarg == NULL, "rgvarg=%p, expected NULL\n", pDispParams->rgvarg);
615         ok(pDispParams->cArgs == 0, "cArgs=%d, expected 0\n", pDispParams->cArgs);
616         break;
617
618     case DISPID_ONMENUBAR:
619         CHECK_EXPECT(Invoke_ONMENUBAR);
620         test_invoke_bool(pDispParams, TRUE);
621         break;
622
623     case DISPID_ONADDRESSBAR:
624         CHECK_EXPECT(Invoke_ONADDRESSBAR);
625         test_invoke_bool(pDispParams, TRUE);
626         break;
627
628     case DISPID_ONSTATUSBAR:
629         CHECK_EXPECT(Invoke_ONSTATUSBAR);
630         test_invoke_bool(pDispParams, TRUE);
631         break;
632
633     case DISPID_ONTOOLBAR:
634         CHECK_EXPECT(Invoke_ONTOOLBAR);
635         test_invoke_bool(pDispParams, FALSE);
636         break;
637
638     case DISPID_ONFULLSCREEN:
639         CHECK_EXPECT(Invoke_ONFULLSCREEN);
640         test_invoke_bool(pDispParams, TRUE);
641         break;
642
643     case DISPID_ONTHEATERMODE:
644         CHECK_EXPECT(Invoke_ONTHEATERMODE);
645         test_invoke_bool(pDispParams, TRUE);
646         break;
647
648     case DISPID_WINDOWSETRESIZABLE:
649         CHECK_EXPECT(Invoke_WINDOWSETRESIZABLE);
650         test_invoke_bool(pDispParams, TRUE);
651         break;
652
653     default:
654         ok(0, "unexpected dispIdMember %d\n", dispIdMember);
655     }
656
657     return S_OK;
658 }
659
660 static IDispatchVtbl WebBrowserEvents2Vtbl = {
661     WebBrowserEvents2_QueryInterface,
662     Dispatch_AddRef,
663     Dispatch_Release,
664     Dispatch_GetTypeInfoCount,
665     Dispatch_GetTypeInfo,
666     Dispatch_GetIDsOfNames,
667     WebBrowserEvents2_Invoke
668 };
669
670 static IDispatch WebBrowserEvents2 = { &WebBrowserEvents2Vtbl };
671
672 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
673 {
674     return QueryInterface(riid, ppv);
675 }
676
677 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
678 {
679     return 2;
680 }
681
682 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
683 {
684     return 1;
685 }
686
687 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
688 {
689     ok(0, "unexpected call\n");
690     return E_NOTIMPL;
691 }
692
693 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker,
694         IMoniker **ppmon)
695 {
696     ok(0, "unexpected call\n");
697     return E_NOTIMPL;
698 }
699
700 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
701 {
702     CHECK_EXPECT(GetContainer);
703
704     ok(ppContainer != NULL, "ppContainer == NULL\n");
705     if(ppContainer)
706         *ppContainer = &OleContainer;
707
708     return S_OK;
709 }
710
711 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
712 {
713     CHECK_EXPECT(ShowObject);
714     return S_OK;
715 }
716
717 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
718 {
719     ok(0, "unexpected call\n");
720     return E_NOTIMPL;
721 }
722
723 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
724 {
725     ok(0, "unexpected call\n");
726     return E_NOTIMPL;
727 }
728
729 static const IOleClientSiteVtbl ClientSiteVtbl = {
730     ClientSite_QueryInterface,
731     ClientSite_AddRef,
732     ClientSite_Release,
733     ClientSite_SaveObject,
734     ClientSite_GetMoniker,
735     ClientSite_GetContainer,
736     ClientSite_ShowObject,
737     ClientSite_OnShowWindow,
738     ClientSite_RequestNewObjectLayout
739 };
740
741 static IOleClientSite ClientSite = { &ClientSiteVtbl };
742
743 static HRESULT WINAPI InPlaceUIWindow_QueryInterface(IOleInPlaceFrame *iface,
744                                                      REFIID riid, void **ppv)
745 {
746     ok(0, "unexpected call\n");
747     return E_NOINTERFACE;
748 }
749
750 static ULONG WINAPI InPlaceUIWindow_AddRef(IOleInPlaceFrame *iface)
751 {
752     return 2;
753 }
754
755 static ULONG WINAPI InPlaceUIWindow_Release(IOleInPlaceFrame *iface)
756 {
757     return 1;
758 }
759
760 static HRESULT WINAPI InPlaceUIWindow_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
761 {
762     ok(0, "unexpected call\n");
763     return E_NOTIMPL;
764 }
765
766 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
767 {
768     CHECK_EXPECT(Frame_GetWindow);
769     ok(phwnd != NULL, "phwnd == NULL\n");
770     if(phwnd)
771         *phwnd = container_hwnd;
772     return S_OK;
773 }
774
775 static HRESULT WINAPI InPlaceUIWindow_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
776 {
777     ok(0, "unexpected call\n");
778     return E_NOTIMPL;
779 }
780
781 static HRESULT WINAPI InPlaceUIWindow_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
782 {
783     ok(0, "unexpected call\n");
784     return E_NOTIMPL;
785 }
786
787 static HRESULT WINAPI InPlaceUIWindow_RequestBorderSpace(IOleInPlaceFrame *iface,
788         LPCBORDERWIDTHS pborderwidths)
789 {
790     ok(0, "unexpected call\n");
791     return E_NOTIMPL;
792 }
793
794 static HRESULT WINAPI InPlaceUIWindow_SetBorderSpace(IOleInPlaceFrame *iface,
795         LPCBORDERWIDTHS pborderwidths)
796 {
797     ok(0, "unexpected call\n");
798     return E_NOTIMPL;
799 }
800
801 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
802         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
803 {
804     CHECK_EXPECT(UIWindow_SetActiveObject);
805     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
806     ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
807     return S_OK;
808 }
809
810 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
811         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
812 {
813     CHECK_EXPECT(Frame_SetActiveObject);
814     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
815     ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
816     return S_OK;
817 }
818
819 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
820         LPOLEMENUGROUPWIDTHS lpMenuWidths)
821 {
822     ok(0, "unexpected call\n");
823     return E_NOTIMPL;
824 }
825
826 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
827         HOLEMENU holemenu, HWND hwndActiveObject)
828 {
829     CHECK_EXPECT(SetMenu);
830     ok(hmenuShared == NULL, "hmenuShared=%p\n", hmenuShared);
831     ok(holemenu == NULL, "holemenu=%p\n", holemenu);
832     ok(hwndActiveObject == shell_embedding_hwnd, "hwndActiveObject=%p, expected %p\n",
833        hwndActiveObject, shell_embedding_hwnd);
834     return S_OK;
835 }
836
837 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
838 {
839     ok(0, "unexpected call\n");
840     return E_NOTIMPL;
841 }
842
843 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
844 {
845     CHECK_EXPECT2(SetStatusText);
846     /* FIXME: Check pszStatusText */
847     return S_OK;
848 }
849
850 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
851 {
852     if(fEnable)
853         CHECK_EXPECT(EnableModeless_TRUE);
854     else
855         CHECK_EXPECT(EnableModeless_FALSE);
856     return S_OK;
857 }
858
859 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
860 {
861     ok(0, "unexpected call\n");
862     return E_NOTIMPL;
863 }
864
865 static const IOleInPlaceFrameVtbl InPlaceUIWindowVtbl = {
866     InPlaceUIWindow_QueryInterface,
867     InPlaceUIWindow_AddRef,
868     InPlaceUIWindow_Release,
869     InPlaceUIWindow_GetWindow,
870     InPlaceUIWindow_ContextSensitiveHelp,
871     InPlaceUIWindow_GetBorder,
872     InPlaceUIWindow_RequestBorderSpace,
873     InPlaceUIWindow_SetBorderSpace,
874     InPlaceUIWindow_SetActiveObject,
875 };
876
877 static IOleInPlaceUIWindow InPlaceUIWindow = { (IOleInPlaceUIWindowVtbl*)&InPlaceUIWindowVtbl };
878
879 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = {
880     InPlaceUIWindow_QueryInterface,
881     InPlaceUIWindow_AddRef,
882     InPlaceUIWindow_Release,
883     InPlaceFrame_GetWindow,
884     InPlaceUIWindow_ContextSensitiveHelp,
885     InPlaceUIWindow_GetBorder,
886     InPlaceUIWindow_RequestBorderSpace,
887     InPlaceUIWindow_SetBorderSpace,
888     InPlaceFrame_SetActiveObject,
889     InPlaceFrame_InsertMenus,
890     InPlaceFrame_SetMenu,
891     InPlaceFrame_RemoveMenus,
892     InPlaceFrame_SetStatusText,
893     InPlaceFrame_EnableModeless,
894     InPlaceFrame_TranslateAccelerator
895 };
896
897 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
898
899 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
900 {
901     return QueryInterface(riid, ppv);
902 }
903
904 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
905 {
906     return 2;
907 }
908
909 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSiteEx *iface)
910 {
911     return 1;
912 }
913
914 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
915 {
916     CHECK_EXPECT(Site_GetWindow);
917     ok(phwnd != NULL, "phwnd == NULL\n");
918     if(phwnd)
919         *phwnd = container_hwnd;
920     return S_OK;
921 }
922
923 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
924 {
925     ok(0, "unexpected call\n");
926     return E_NOTIMPL;
927 }
928
929 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
930 {
931     CHECK_EXPECT(CanInPlaceActivate);
932     return S_OK;
933 }
934
935 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
936 {
937     CHECK_EXPECT(OnInPlaceActivate);
938     return S_OK;
939 }
940
941 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
942 {
943     CHECK_EXPECT(OnUIActivate);
944     return S_OK;
945 }
946
947 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
948         IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
949         LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
950 {
951     static const RECT pos_rect = {2,1,1002,901};
952     static const RECT clip_rect = {10,10,990,890};
953
954     CHECK_EXPECT(GetWindowContext);
955
956     ok(ppFrame != NULL, "ppFrame = NULL\n");
957     if(ppFrame)
958         *ppFrame = &InPlaceFrame;
959
960     ok(ppDoc != NULL, "ppDoc = NULL\n");
961     if(ppDoc)
962         *ppDoc = &InPlaceUIWindow;
963
964     ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
965     if(lprcPosRect)
966         memcpy(lprcPosRect, &pos_rect, sizeof(RECT));
967
968     ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
969     if(lprcClipRect)
970         memcpy(lprcClipRect, &clip_rect, sizeof(RECT));
971
972     ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n");
973     if(lpFrameInfo) {
974         lpFrameInfo->cb = sizeof(*lpFrameInfo);
975         lpFrameInfo->fMDIApp = FALSE;
976         lpFrameInfo->hwndFrame = container_hwnd;
977         lpFrameInfo->haccel = NULL;
978         lpFrameInfo->cAccelEntries = 0;
979     }
980
981     return S_OK;
982 }
983
984 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtant)
985 {
986     ok(0, "unexpected call\n");
987     return E_NOTIMPL;
988 }
989
990 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
991 {
992     ok(0, "unexpected call\n");
993     return E_NOTIMPL;
994 }
995
996 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
997 {
998     ok(0, "unexpected call\n");
999     return E_NOTIMPL;
1000 }
1001
1002 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
1003 {
1004     ok(0, "unexpected call\n");
1005     return E_NOTIMPL;
1006 }
1007
1008 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
1009 {
1010     ok(0, "unexpected call\n");
1011     return E_NOTIMPL;
1012 }
1013
1014 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
1015 {
1016     ok(0, "unexpected call\n");
1017     return E_NOTIMPL;
1018 }
1019
1020 static HRESULT WINAPI InPlaceSite_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface,
1021                                                       BOOL *pNoRedraw, DWORD dwFlags)
1022 {
1023     ok(0, "unexpected call\n");
1024     return E_NOTIMPL;
1025 }
1026
1027 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface,
1028                                                         BOOL fNoRedraw)
1029 {
1030     ok(0, "unexpected call\n");
1031     return E_NOTIMPL;
1032 }
1033
1034 static HRESULT WINAPI InPlaceSite_RequestUIActivate(IOleInPlaceSiteEx *iface)
1035 {
1036     ok(0, "unexpected call\n");
1037     return S_OK;
1038 }
1039
1040 static const IOleInPlaceSiteExVtbl InPlaceSiteExVtbl = {
1041     InPlaceSite_QueryInterface,
1042     InPlaceSite_AddRef,
1043     InPlaceSite_Release,
1044     InPlaceSite_GetWindow,
1045     InPlaceSite_ContextSensitiveHelp,
1046     InPlaceSite_CanInPlaceActivate,
1047     InPlaceSite_OnInPlaceActivate,
1048     InPlaceSite_OnUIActivate,
1049     InPlaceSite_GetWindowContext,
1050     InPlaceSite_Scroll,
1051     InPlaceSite_OnUIDeactivate,
1052     InPlaceSite_OnInPlaceDeactivate,
1053     InPlaceSite_DiscardUndoState,
1054     InPlaceSite_DeactivateAndUndo,
1055     InPlaceSite_OnPosRectChange,
1056     InPlaceSite_OnInPlaceActivateEx,
1057     InPlaceSite_OnInPlaceDeactivateEx,
1058     InPlaceSite_RequestUIActivate
1059 };
1060
1061 static IOleInPlaceSiteEx InPlaceSite = { &InPlaceSiteExVtbl };
1062
1063 static HRESULT WINAPI DocHostUIHandler_QueryInterface(IDocHostUIHandler2 *iface, REFIID riid, void **ppv)
1064 {
1065     return QueryInterface(riid, ppv);
1066 }
1067
1068 static ULONG WINAPI DocHostUIHandler_AddRef(IDocHostUIHandler2 *iface)
1069 {
1070     return 2;
1071 }
1072
1073 static ULONG WINAPI DocHostUIHandler_Release(IDocHostUIHandler2 *iface)
1074 {
1075     return 1;
1076 }
1077
1078 static HRESULT WINAPI DocHostUIHandler_ShowContextMenu(IDocHostUIHandler2 *iface, DWORD dwID, POINT *ppt,
1079         IUnknown *pcmdtReserved, IDispatch *pdicpReserved)
1080 {
1081     ok(0, "unexpected call %d %p %p %p\n", dwID, ppt, pcmdtReserved, pdicpReserved);
1082     return S_FALSE;
1083 }
1084
1085 static HRESULT WINAPI DocHostUIHandler_GetHostInfo(IDocHostUIHandler2 *iface, DOCHOSTUIINFO *pInfo)
1086 {
1087     CHECK_EXPECT2(GetHostInfo);
1088     ok(pInfo != NULL, "pInfo=NULL\n");
1089     if(pInfo) {
1090         ok(pInfo->cbSize == sizeof(DOCHOSTUIINFO) || broken(!pInfo->cbSize), "pInfo->cbSize=%u\n", pInfo->cbSize);
1091         ok(!pInfo->dwFlags, "pInfo->dwFlags=%08x, expected 0\n", pInfo->dwFlags);
1092         ok(!pInfo->dwDoubleClick, "pInfo->dwDoubleClick=%08x, expected 0\n", pInfo->dwDoubleClick);
1093         ok(!pInfo->pchHostCss, "pInfo->pchHostCss=%p, expected NULL\n", pInfo->pchHostCss);
1094         ok(!pInfo->pchHostNS, "pInfo->pchhostNS=%p, expected NULL\n", pInfo->pchHostNS);
1095     }
1096     return E_FAIL;
1097 }
1098
1099 static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD dwID,
1100         IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget,
1101         IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
1102 {
1103     ok(0, "unexpected call\n");
1104     return E_NOTIMPL;
1105 }
1106
1107 static HRESULT WINAPI DocHostUIHandler_HideUI(IDocHostUIHandler2 *iface)
1108 {
1109     ok(0, "unexpected call\n");
1110     return E_NOTIMPL;
1111 }
1112
1113 static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface)
1114 {
1115     CHECK_EXPECT(UpdateUI);
1116     return E_NOTIMPL;
1117 }
1118
1119 static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable)
1120 {
1121     ok(0, "unexpected call\n");
1122     return E_NOTIMPL;
1123 }
1124
1125 static HRESULT WINAPI DocHostUIHandler_OnDocWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
1126 {
1127     ok(0, "unexpected call\n");
1128     return E_NOTIMPL;
1129 }
1130
1131 static HRESULT WINAPI DocHostUIHandler_OnFrameWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
1132 {
1133     ok(0, "unexpected call\n");
1134     return E_NOTIMPL;
1135 }
1136
1137 static HRESULT WINAPI DocHostUIHandler_ResizeBorder(IDocHostUIHandler2 *iface, LPCRECT prcBorder,
1138         IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
1139 {
1140     ok(0, "unexpected call\n");
1141     return E_NOTIMPL;
1142 }
1143
1144 static HRESULT WINAPI DocHostUIHandler_TranslateAccelerator(IDocHostUIHandler2 *iface, LPMSG lpMsg,
1145         const GUID *pguidCmdGroup, DWORD nCmdID)
1146 {
1147     ok(0, "unexpected call\n");
1148     return E_NOTIMPL;
1149 }
1150
1151 static HRESULT WINAPI DocHostUIHandler_GetOptionKeyPath(IDocHostUIHandler2 *iface,
1152         LPOLESTR *pchKey, DWORD dw)
1153 {
1154     CHECK_EXPECT(GetOptionKeyPath);
1155     ok(pchKey != NULL, "pchKey==NULL\n");
1156     if(pchKey)
1157         ok(*pchKey == NULL, "*pchKey=%p\n", *pchKey);
1158     ok(!dw, "dw=%x\n", dw);
1159     return E_NOTIMPL;
1160 }
1161
1162 static HRESULT WINAPI DocHostUIHandler_GetDropTarget(IDocHostUIHandler2 *iface,
1163         IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
1164 {
1165     ok(0, "unexpected call\n");
1166     return E_NOTIMPL;
1167 }
1168
1169 static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, IDispatch **ppDispatch)
1170 {
1171     ok(0, "unexpected call\n");
1172     return E_NOTIMPL;
1173 }
1174
1175 static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate,
1176         OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
1177 {
1178     ok(0, "unexpected call\n");
1179     return E_NOTIMPL;
1180 }
1181
1182 static HRESULT WINAPI DocHostUIHandler_FilterDataObject(IDocHostUIHandler2 *iface, IDataObject *pDO,
1183         IDataObject **ppPORet)
1184 {
1185     ok(0, "unexpected call\n");
1186     return E_NOTIMPL;
1187 }
1188
1189 static HRESULT WINAPI DocHostUIHandler_GetOverrideKeyPath(IDocHostUIHandler2 *iface,
1190         LPOLESTR *pchKey, DWORD dw)
1191 {
1192     CHECK_EXPECT(GetOverridesKeyPath);
1193     ok(pchKey != NULL, "pchKey==NULL\n");
1194     if(pchKey)
1195         ok(*pchKey == NULL, "*pchKey=%p\n", *pchKey);
1196     ok(!dw, "dw=%x\n", dw);
1197     return E_NOTIMPL;
1198 }
1199
1200 static const IDocHostUIHandler2Vtbl DocHostUIHandlerVtbl = {
1201     DocHostUIHandler_QueryInterface,
1202     DocHostUIHandler_AddRef,
1203     DocHostUIHandler_Release,
1204     DocHostUIHandler_ShowContextMenu,
1205     DocHostUIHandler_GetHostInfo,
1206     DocHostUIHandler_ShowUI,
1207     DocHostUIHandler_HideUI,
1208     DocHostUIHandler_UpdateUI,
1209     DocHostUIHandler_EnableModeless,
1210     DocHostUIHandler_OnDocWindowActivate,
1211     DocHostUIHandler_OnFrameWindowActivate,
1212     DocHostUIHandler_ResizeBorder,
1213     DocHostUIHandler_TranslateAccelerator,
1214     DocHostUIHandler_GetOptionKeyPath,
1215     DocHostUIHandler_GetDropTarget,
1216     DocHostUIHandler_GetExternal,
1217     DocHostUIHandler_TranslateUrl,
1218     DocHostUIHandler_FilterDataObject,
1219     DocHostUIHandler_GetOverrideKeyPath
1220 };
1221
1222 static IDocHostUIHandler2 DocHostUIHandler = { &DocHostUIHandlerVtbl };
1223
1224 static HRESULT QueryInterface(REFIID riid, void **ppv)
1225 {
1226     *ppv = NULL;
1227
1228     if(IsEqualGUID(&IID_IUnknown, riid)
1229             || IsEqualGUID(&IID_IOleClientSite, riid))
1230         *ppv = &ClientSite;
1231     else if(IsEqualGUID(&IID_IOleWindow, riid)
1232             || IsEqualGUID(&IID_IOleInPlaceSite, riid)
1233             || IsEqualGUID(&IID_IOleInPlaceSiteEx, riid))
1234         *ppv = &InPlaceSite;
1235     else if(IsEqualGUID(&IID_IDocHostUIHandler, riid)
1236             || IsEqualGUID(&IID_IDocHostUIHandler2, riid))
1237         *ppv = &DocHostUIHandler;
1238     else if(IsEqualGUID(&IID_IDispatch, riid))
1239         *ppv = &Dispatch;
1240
1241     if(*ppv)
1242         return S_OK;
1243
1244     return E_NOINTERFACE;
1245 }
1246
1247 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
1248 {
1249     return DefWindowProcW(hwnd, msg, wParam, lParam);
1250 }
1251
1252 static HWND create_container_window(void)
1253 {
1254     static const WCHAR wszWebBrowserContainer[] =
1255         {'W','e','b','B','r','o','w','s','e','r','C','o','n','t','a','i','n','e','r',0};
1256     static WNDCLASSEXW wndclass = {
1257         sizeof(WNDCLASSEXW),
1258         0,
1259         wnd_proc,
1260         0, 0, NULL, NULL, NULL, NULL, NULL,
1261         wszWebBrowserContainer,
1262         NULL
1263     };
1264
1265     RegisterClassExW(&wndclass);
1266     return CreateWindowW(wszWebBrowserContainer, wszWebBrowserContainer,
1267             WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
1268             CW_USEDEFAULT, NULL, NULL, NULL, NULL);
1269 }
1270
1271 static void test_DoVerb(IUnknown *unk)
1272 {
1273     IOleObject *oleobj;
1274     RECT rect = {0,0,1000,1000};
1275     HRESULT hres;
1276
1277     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1278     ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
1279     if(FAILED(hres))
1280         return;
1281
1282     SET_EXPECT(CanInPlaceActivate);
1283     SET_EXPECT(Site_GetWindow);
1284     SET_EXPECT(OnInPlaceActivate);
1285     SET_EXPECT(GetWindowContext);
1286     SET_EXPECT(ShowObject);
1287     SET_EXPECT(GetContainer);
1288     SET_EXPECT(Frame_GetWindow);
1289     SET_EXPECT(OnUIActivate);
1290     SET_EXPECT(Frame_SetActiveObject);
1291     SET_EXPECT(UIWindow_SetActiveObject);
1292     SET_EXPECT(SetMenu);
1293
1294     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
1295                              0, (HWND)0xdeadbeef, &rect);
1296     ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
1297
1298     CHECK_CALLED(CanInPlaceActivate);
1299     CHECK_CALLED(Site_GetWindow);
1300     CHECK_CALLED(OnInPlaceActivate);
1301     CHECK_CALLED(GetWindowContext);
1302     CHECK_CALLED(ShowObject);
1303     CHECK_CALLED(GetContainer);
1304     CHECK_CALLED(Frame_GetWindow);
1305     CHECK_CALLED(OnUIActivate);
1306     CHECK_CALLED(Frame_SetActiveObject);
1307     CHECK_CALLED(UIWindow_SetActiveObject);
1308     CHECK_CALLED(SetMenu);
1309
1310     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
1311                            0, (HWND)0xdeadbeef, &rect);
1312     ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
1313
1314     IOleObject_Release(oleobj);
1315 }
1316
1317 static void test_GetMiscStatus(IOleObject *oleobj)
1318 {
1319     DWORD st, i;
1320     HRESULT hres;
1321
1322     for(i=0; i<10; i++) {
1323         st = 0xdeadbeef;
1324         hres = IOleObject_GetMiscStatus(oleobj, i, &st);
1325         ok(hres == S_OK, "GetMiscStatus failed: %08x\n", hres);
1326         ok(st == (OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT
1327                   |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE),
1328            "st=%08x, expected OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|"
1329            "OLEMISC_INSIDEOUT|OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE)\n", st);
1330     }
1331 }
1332
1333 static void test_SetHostNames(IOleObject *oleobj)
1334 {
1335     HRESULT hres;
1336
1337     static const WCHAR test_appW[] =  {'t','e','s','t',' ','a','p','p',0};
1338
1339     hres = IOleObject_SetHostNames(oleobj, test_appW, (void*)0xdeadbeef);
1340     ok(hres == S_OK, "SetHostNames failed: %08x\n", hres);
1341 }
1342
1343 static void test_ClientSite(IUnknown *unk, IOleClientSite *client)
1344 {
1345     IOleObject *oleobj;
1346     IOleInPlaceObject *inplace;
1347     HWND hwnd;
1348     HRESULT hres;
1349
1350     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1351     ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
1352     if(FAILED(hres))
1353         return;
1354
1355     test_GetMiscStatus(oleobj);
1356     test_SetHostNames(oleobj);
1357
1358     hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceObject, (void**)&inplace);
1359     ok(hres == S_OK, "QueryInterface(IID_OleInPlaceObject) failed: %08x\n", hres);
1360     if(FAILED(hres)) {
1361         IOleObject_Release(oleobj);
1362         return;
1363     }
1364
1365     hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
1366     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
1367     ok((hwnd == NULL) ^ (client == NULL), "unexpected hwnd %p\n", hwnd);
1368
1369     if(client) {
1370         SET_EXPECT(GetContainer);
1371         SET_EXPECT(Site_GetWindow);
1372         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1373         SET_EXPECT(Invoke_AMBIENT_SILENT);
1374     }else {
1375         SET_EXPECT(Invoke_DOWNLOADCOMPLETE);
1376         SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
1377         SET_EXPECT(Invoke_COMMANDSTATECHANGE);
1378     }
1379
1380     hres = IOleObject_SetClientSite(oleobj, client);
1381     ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
1382
1383     if(client) {
1384         CHECK_CALLED(GetContainer);
1385         CHECK_CALLED(Site_GetWindow);
1386         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1387         CHECK_CALLED(Invoke_AMBIENT_SILENT);
1388     }else {
1389         todo_wine CHECK_CALLED(Invoke_DOWNLOADCOMPLETE);
1390         todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
1391         todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE);
1392    }
1393
1394     hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
1395     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
1396     ok((hwnd == NULL) == (client == NULL), "unexpected hwnd %p\n", hwnd);
1397
1398     shell_embedding_hwnd = hwnd;
1399
1400     test_SetHostNames(oleobj);
1401
1402     IOleInPlaceObject_Release(inplace);
1403     IOleObject_Release(oleobj);
1404 }
1405
1406 static void test_ClassInfo(IUnknown *unk)
1407 {
1408     IProvideClassInfo2 *class_info;
1409     GUID guid;
1410     HRESULT hres;
1411
1412     hres = IUnknown_QueryInterface(unk, &IID_IProvideClassInfo2, (void**)&class_info);
1413     ok(hres == S_OK, "QueryInterface(IID_IProvideClassInfo)  failed: %08x\n", hres);
1414     if(FAILED(hres))
1415         return;
1416
1417     hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, &guid);
1418     ok(hres == S_OK, "GetGUID failed: %08x\n", hres);
1419     ok(IsEqualGUID(&DIID_DWebBrowserEvents2, &guid), "wrong guid\n");
1420
1421     hres = IProvideClassInfo2_GetGUID(class_info, 0, &guid);
1422     ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres);
1423     ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
1424
1425     hres = IProvideClassInfo2_GetGUID(class_info, 2, &guid);
1426     ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres);
1427     ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
1428
1429     hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, NULL);
1430     ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
1431
1432     hres = IProvideClassInfo2_GetGUID(class_info, 0, NULL);
1433     ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
1434
1435     IProvideClassInfo2_Release(class_info);
1436 }
1437
1438 static void test_ie_funcs(IUnknown *unk)
1439 {
1440     IWebBrowser2 *wb;
1441     IDispatch *disp;
1442     VARIANT_BOOL b;
1443     int i;
1444     long hwnd;
1445     HRESULT hres;
1446
1447     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
1448     ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
1449     if(FAILED(hres))
1450         return;
1451
1452     /* HWND */
1453
1454     hwnd = 0xdeadbeef;
1455     hres = IWebBrowser2_get_HWND(wb, &hwnd);
1456     ok(hres == E_FAIL, "get_HWND failed: %08x, expected E_FAIL\n", hres);
1457     ok(hwnd == 0, "unexpected hwnd %lx\n", hwnd);
1458
1459     /* MenuBar */
1460
1461     hres = IWebBrowser2_get_MenuBar(wb, &b);
1462     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1463     ok(b == VARIANT_TRUE, "b=%x\n", b);
1464
1465     SET_EXPECT(Invoke_ONMENUBAR);
1466     hres = IWebBrowser2_put_MenuBar(wb, (exvb = VARIANT_FALSE));
1467     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1468     CHECK_CALLED(Invoke_ONMENUBAR);
1469
1470     hres = IWebBrowser2_get_MenuBar(wb, &b);
1471     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1472     ok(b == VARIANT_FALSE, "b=%x\n", b);
1473
1474     SET_EXPECT(Invoke_ONMENUBAR);
1475     hres = IWebBrowser2_put_MenuBar(wb, (exvb = 100));
1476     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1477     CHECK_CALLED(Invoke_ONMENUBAR);
1478
1479     hres = IWebBrowser2_get_MenuBar(wb, &b);
1480     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1481     ok(b == VARIANT_TRUE, "b=%x\n", b);
1482
1483     /* AddressBar */
1484
1485     hres = IWebBrowser2_get_AddressBar(wb, &b);
1486     ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres);
1487     ok(b == VARIANT_TRUE, "b=%x\n", b);
1488
1489     SET_EXPECT(Invoke_ONADDRESSBAR);
1490     hres = IWebBrowser2_put_AddressBar(wb, (exvb = VARIANT_FALSE));
1491     ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
1492     CHECK_CALLED(Invoke_ONADDRESSBAR);
1493
1494     hres = IWebBrowser2_get_AddressBar(wb, &b);
1495     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1496     ok(b == VARIANT_FALSE, "b=%x\n", b);
1497
1498     SET_EXPECT(Invoke_ONADDRESSBAR);
1499     hres = IWebBrowser2_put_AddressBar(wb, (exvb = 100));
1500     ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
1501     CHECK_CALLED(Invoke_ONADDRESSBAR);
1502
1503     hres = IWebBrowser2_get_AddressBar(wb, &b);
1504     ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres);
1505     ok(b == VARIANT_TRUE, "b=%x\n", b);
1506
1507     SET_EXPECT(Invoke_ONADDRESSBAR);
1508     hres = IWebBrowser2_put_AddressBar(wb, (exvb = VARIANT_TRUE));
1509     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1510     CHECK_CALLED(Invoke_ONADDRESSBAR);
1511
1512     /* StatusBar */
1513
1514     hres = IWebBrowser2_get_StatusBar(wb, &b);
1515     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1516     ok(b == VARIANT_TRUE, "b=%x\n", b);
1517
1518     SET_EXPECT(Invoke_ONSTATUSBAR);
1519     hres = IWebBrowser2_put_StatusBar(wb, (exvb = VARIANT_TRUE));
1520     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1521     CHECK_CALLED(Invoke_ONSTATUSBAR);
1522
1523     hres = IWebBrowser2_get_StatusBar(wb, &b);
1524     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1525     ok(b == VARIANT_TRUE, "b=%x\n", b);
1526
1527     SET_EXPECT(Invoke_ONSTATUSBAR);
1528     hres = IWebBrowser2_put_StatusBar(wb, (exvb = VARIANT_FALSE));
1529     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1530     CHECK_CALLED(Invoke_ONSTATUSBAR);
1531
1532     hres = IWebBrowser2_get_StatusBar(wb, &b);
1533     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1534     ok(b == VARIANT_FALSE, "b=%x\n", b);
1535
1536     SET_EXPECT(Invoke_ONSTATUSBAR);
1537     hres = IWebBrowser2_put_StatusBar(wb, (exvb = 100));
1538     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1539     CHECK_CALLED(Invoke_ONSTATUSBAR);
1540
1541     hres = IWebBrowser2_get_StatusBar(wb, &b);
1542     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1543     ok(b == VARIANT_TRUE, "b=%x\n", b);
1544
1545     /* ToolBar */
1546
1547     hres = IWebBrowser2_get_ToolBar(wb, &i);
1548     ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1549     ok(i, "i=%x\n", i);
1550
1551     SET_EXPECT(Invoke_ONTOOLBAR);
1552     hres = IWebBrowser2_put_ToolBar(wb, (exvb = VARIANT_FALSE));
1553     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1554     CHECK_CALLED(Invoke_ONTOOLBAR);
1555
1556     hres = IWebBrowser2_get_ToolBar(wb, &i);
1557     ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1558     ok(i == VARIANT_FALSE, "b=%x\n", i);
1559
1560     SET_EXPECT(Invoke_ONTOOLBAR);
1561     hres = IWebBrowser2_put_ToolBar(wb, (exvb = 100));
1562     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1563     CHECK_CALLED(Invoke_ONTOOLBAR);
1564
1565     hres = IWebBrowser2_get_ToolBar(wb, &i);
1566     ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1567     ok(i, "i=%x\n", i);
1568
1569     SET_EXPECT(Invoke_ONTOOLBAR);
1570     hres = IWebBrowser2_put_ToolBar(wb, (exvb = VARIANT_TRUE));
1571     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1572     CHECK_CALLED(Invoke_ONTOOLBAR);
1573
1574     /* FullScreen */
1575
1576     hres = IWebBrowser2_get_FullScreen(wb, &b);
1577     ok(hres == S_OK, "get_FullScreen failed: %08x\n", hres);
1578     ok(b == VARIANT_FALSE, "b=%x\n", b);
1579
1580     SET_EXPECT(Invoke_ONFULLSCREEN);
1581     hres = IWebBrowser2_put_FullScreen(wb, (exvb = VARIANT_TRUE));
1582     ok(hres == S_OK, "put_FullScreen failed: %08x\n", hres);
1583     CHECK_CALLED(Invoke_ONFULLSCREEN);
1584
1585     hres = IWebBrowser2_get_FullScreen(wb, &b);
1586     ok(hres == S_OK, "get_FullScreen failed: %08x\n", hres);
1587     ok(b == VARIANT_TRUE, "b=%x\n", b);
1588
1589     SET_EXPECT(Invoke_ONFULLSCREEN);
1590     hres = IWebBrowser2_put_FullScreen(wb, (exvb = 100));
1591     ok(hres == S_OK, "put_FullScreen failed: %08x\n", hres);
1592     CHECK_CALLED(Invoke_ONFULLSCREEN);
1593
1594     hres = IWebBrowser2_get_FullScreen(wb, &b);
1595     ok(hres == S_OK, "get_FullScreen failed: %08x\n", hres);
1596     ok(b == VARIANT_TRUE, "b=%x\n", b);
1597
1598     SET_EXPECT(Invoke_ONFULLSCREEN);
1599     hres = IWebBrowser2_put_FullScreen(wb, (exvb = VARIANT_FALSE));
1600     ok(hres == S_OK, "put_FullScreen failed: %08x\n", hres);
1601     CHECK_CALLED(Invoke_ONFULLSCREEN);
1602
1603     /* TheaterMode */
1604
1605     hres = IWebBrowser2_get_TheaterMode(wb, &b);
1606     ok(hres == S_OK, "get_TheaterMode failed: %08x\n", hres);
1607     ok(b == VARIANT_FALSE, "b=%x\n", b);
1608
1609     SET_EXPECT(Invoke_ONTHEATERMODE);
1610     hres = IWebBrowser2_put_TheaterMode(wb, (exvb = VARIANT_TRUE));
1611     ok(hres == S_OK, "put_TheaterMode failed: %08x\n", hres);
1612     CHECK_CALLED(Invoke_ONTHEATERMODE);
1613
1614     hres = IWebBrowser2_get_TheaterMode(wb, &b);
1615     ok(hres == S_OK, "get_TheaterMode failed: %08x\n", hres);
1616     ok(b == VARIANT_TRUE, "b=%x\n", b);
1617
1618     SET_EXPECT(Invoke_ONTHEATERMODE);
1619     hres = IWebBrowser2_put_TheaterMode(wb, (exvb = 100));
1620     ok(hres == S_OK, "put_TheaterMode failed: %08x\n", hres);
1621     CHECK_CALLED(Invoke_ONTHEATERMODE);
1622
1623     hres = IWebBrowser2_get_TheaterMode(wb, &b);
1624     ok(hres == S_OK, "get_TheaterMode failed: %08x\n", hres);
1625     ok(b == VARIANT_TRUE, "b=%x\n", b);
1626
1627     SET_EXPECT(Invoke_ONTHEATERMODE);
1628     hres = IWebBrowser2_put_TheaterMode(wb, (exvb = VARIANT_FALSE));
1629     ok(hres == S_OK, "put_TheaterMode failed: %08x\n", hres);
1630     CHECK_CALLED(Invoke_ONTHEATERMODE);
1631
1632     /* Resizable */
1633
1634     b = 0x100;
1635     hres = IWebBrowser2_get_Resizable(wb, &b);
1636     ok(hres == E_NOTIMPL, "get_Resizable failed: %08x\n", hres);
1637     ok(b == 0x100, "b=%x\n", b);
1638
1639     SET_EXPECT(Invoke_WINDOWSETRESIZABLE);
1640     hres = IWebBrowser2_put_Resizable(wb, (exvb = VARIANT_TRUE));
1641     ok(hres == S_OK || broken(hres == E_NOTIMPL), "put_Resizable failed: %08x\n", hres);
1642     CHECK_CALLED_BROKEN(Invoke_WINDOWSETRESIZABLE);
1643
1644     SET_EXPECT(Invoke_WINDOWSETRESIZABLE);
1645     hres = IWebBrowser2_put_Resizable(wb, (exvb = VARIANT_FALSE));
1646     ok(hres == S_OK || broken(hres == E_NOTIMPL), "put_Resizable failed: %08x\n", hres);
1647     CHECK_CALLED_BROKEN(Invoke_WINDOWSETRESIZABLE);
1648
1649     hres = IWebBrowser2_get_Resizable(wb, &b);
1650     ok(hres == E_NOTIMPL, "get_Resizable failed: %08x\n", hres);
1651     ok(b == 0x100, "b=%x\n", b);
1652
1653     /* Application */
1654
1655     disp = NULL;
1656     hres = IWebBrowser2_get_Application(wb, &disp);
1657     ok(hres == S_OK, "get_Application failed: %08x\n", hres);
1658     ok(disp == (void*)wb, "disp=%p, expected %p\n", disp, wb);
1659     if(disp)
1660         IDispatch_Release(disp);
1661
1662     hres = IWebBrowser2_get_Application(wb, NULL);
1663     ok(hres == E_POINTER, "get_Application failed: %08x, expected E_POINTER\n", hres);
1664
1665     /* Quit */
1666
1667     hres = IWebBrowser2_Quit(wb);
1668     ok(hres == E_FAIL, "Quit failed: %08x, expected E_FAIL\n", hres);
1669
1670     IWebBrowser2_Release(wb);
1671 }
1672
1673 static void test_Silent(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
1674 {
1675     VARIANT_BOOL b;
1676     HRESULT hres;
1677
1678     b = 100;
1679     hres = IWebBrowser2_get_Silent(wb, &b);
1680     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1681     ok(b == VARIANT_FALSE, "b=%x\n", b);
1682
1683     hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
1684     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1685
1686     b = 100;
1687     hres = IWebBrowser2_get_Silent(wb, &b);
1688     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1689     ok(b == VARIANT_TRUE, "b=%x\n", b);
1690
1691     hres = IWebBrowser2_put_Silent(wb, 100);
1692     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1693
1694     b = 100;
1695     hres = IWebBrowser2_get_Silent(wb, &b);
1696     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1697     ok(b == VARIANT_TRUE, "b=%x\n", b);
1698
1699     hres = IWebBrowser2_put_Silent(wb, VARIANT_FALSE);
1700     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1701
1702     b = 100;
1703     hres = IWebBrowser2_get_Silent(wb, &b);
1704     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1705     ok(b == VARIANT_FALSE, "b=%x\n", b);
1706
1707     if(is_clientsite) {
1708         hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
1709         ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1710
1711         SET_EXPECT(Invoke_AMBIENT_SILENT);
1712     }
1713
1714     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_SILENT);
1715     ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
1716
1717     if(is_clientsite)
1718         CHECK_CALLED(Invoke_AMBIENT_SILENT);
1719
1720     b = 100;
1721     hres = IWebBrowser2_get_Silent(wb, &b);
1722     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1723     ok(b == VARIANT_FALSE, "b=%x\n", b);
1724 }
1725
1726 static void test_Offline(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
1727 {
1728     VARIANT_BOOL b;
1729     HRESULT hres;
1730
1731     b = 100;
1732     hres = IWebBrowser2_get_Offline(wb, &b);
1733     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1734     ok(b == VARIANT_FALSE, "b=%x\n", b);
1735
1736     hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
1737     ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1738
1739     b = 100;
1740     hres = IWebBrowser2_get_Offline(wb, &b);
1741     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1742     ok(b == VARIANT_TRUE, "b=%x\n", b);
1743
1744     hres = IWebBrowser2_put_Offline(wb, 100);
1745     ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1746
1747     b = 100;
1748     hres = IWebBrowser2_get_Offline(wb, &b);
1749     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1750     ok(b == VARIANT_TRUE, "b=%x\n", b);
1751
1752     hres = IWebBrowser2_put_Offline(wb, VARIANT_FALSE);
1753     ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1754
1755     b = 100;
1756     hres = IWebBrowser2_get_Offline(wb, &b);
1757     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1758     ok(b == VARIANT_FALSE, "b=%x\n", b);
1759
1760     if(is_clientsite) {
1761         hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
1762         ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1763
1764         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1765     }
1766
1767     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
1768     ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
1769
1770     if(is_clientsite)
1771         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1772
1773     b = 100;
1774     hres = IWebBrowser2_get_Offline(wb, &b);
1775     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1776     ok(b == VARIANT_FALSE, "b=%x\n", b);
1777 }
1778
1779 static void test_ambient_unknown(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
1780 {
1781     HRESULT hres;
1782
1783     SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1784     SET_EXPECT(Invoke_AMBIENT_SILENT);
1785     SET_EXPECT(Invoke_AMBIENT_USERMODE);
1786     SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
1787     SET_EXPECT(Invoke_AMBIENT_USERAGENT);
1788     SET_EXPECT(Invoke_AMBIENT_PALETTE);
1789
1790     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_UNKNOWN);
1791     ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
1792
1793     CHECK_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1794     CHECK_EXPECT(Invoke_AMBIENT_SILENT);
1795     CHECK_EXPECT(Invoke_AMBIENT_USERMODE);
1796     CHECK_EXPECT(Invoke_AMBIENT_DLCONTROL);
1797     CHECK_EXPECT(Invoke_AMBIENT_USERAGENT);
1798     CHECK_EXPECT(Invoke_AMBIENT_PALETTE);
1799
1800     CLEAR_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1801     CLEAR_CALLED(Invoke_AMBIENT_SILENT);
1802     CLEAR_CALLED(Invoke_AMBIENT_USERMODE);
1803     CLEAR_CALLED(Invoke_AMBIENT_DLCONTROL);
1804     CLEAR_CALLED(Invoke_AMBIENT_USERAGENT);
1805     CLEAR_CALLED(Invoke_AMBIENT_PALETTE);
1806 }
1807
1808 static void test_wb_funcs(IUnknown *unk, BOOL is_clientsite)
1809 {
1810     IWebBrowser2 *wb;
1811     IOleControl *control;
1812     HRESULT hres;
1813
1814     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
1815     ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
1816
1817     hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1818     ok(hres == S_OK, "Could not get IOleControl interface: %08x\n", hres);
1819
1820     test_Silent(wb, control, is_clientsite);
1821     test_Offline(wb, control, is_clientsite);
1822     test_ambient_unknown(wb, control, is_clientsite);
1823
1824     IWebBrowser_Release(wb);
1825     IOleControl_Release(control);
1826 }
1827
1828 static void test_GetControlInfo(IUnknown *unk)
1829 {
1830     IOleControl *control;
1831     CONTROLINFO info;
1832     HRESULT hres;
1833
1834     hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1835     ok(hres == S_OK, "Could not get IOleControl: %08x\n", hres);
1836     if(FAILED(hres))
1837         return;
1838
1839     hres = IOleControl_GetControlInfo(control, &info);
1840     ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, exxpected E_NOTIMPL\n", hres);
1841     hres = IOleControl_GetControlInfo(control, NULL);
1842     ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, exxpected E_NOTIMPL\n", hres);
1843
1844     IOleControl_Release(control);
1845 }
1846
1847 static void test_Extent(IUnknown *unk)
1848 {
1849     IOleObject *oleobj;
1850     SIZE size, expected;
1851     HRESULT hres;
1852     DWORD dpi_x;
1853     DWORD dpi_y;
1854     HDC hdc;
1855
1856     /* default aspect ratio is 96dpi / 96dpi */
1857     hdc = GetDC(0);
1858     dpi_x = GetDeviceCaps(hdc, LOGPIXELSX);
1859     dpi_y = GetDeviceCaps(hdc, LOGPIXELSY);
1860     ReleaseDC(0, hdc);
1861     if (dpi_x != 96 || dpi_y != 96)
1862         trace("dpi: %d / %d\n", dpi_y, dpi_y);
1863
1864     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1865     ok(hres == S_OK, "Could not get IOleObkect: %08x\n", hres);
1866     if(FAILED(hres))
1867         return;
1868
1869     size.cx = size.cy = 0xdeadbeef;
1870     hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
1871     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1872     /* Default size is 50x20 pixels, in himetric units */
1873     expected.cx = MulDiv( 50, 2540, dpi_x );
1874     expected.cy = MulDiv( 20, 2540, dpi_y );
1875     ok(size.cx == expected.cx && size.cy == expected.cy, "size = {%d %d} (expected %d %d)\n",
1876        size.cx, size.cy, expected.cx, expected.cy );
1877
1878     size.cx = 800;
1879     size.cy = 700;
1880     hres = IOleObject_SetExtent(oleobj, DVASPECT_CONTENT, &size);
1881     ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
1882
1883     size.cx = size.cy = 0xdeadbeef;
1884     hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
1885     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1886     ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy);
1887
1888     size.cx = size.cy = 0xdeadbeef;
1889     hres = IOleObject_GetExtent(oleobj, 0, &size);
1890     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1891     ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy);
1892
1893     size.cx = 900;
1894     size.cy = 800;
1895     hres = IOleObject_SetExtent(oleobj, 0, &size);
1896     ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
1897
1898     size.cx = size.cy = 0xdeadbeef;
1899     hres = IOleObject_GetExtent(oleobj, 0, &size);
1900     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1901     ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy);
1902
1903     size.cx = size.cy = 0xdeadbeef;
1904     hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
1905     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1906     ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy);
1907
1908     size.cx = 1000;
1909     size.cy = 900;
1910     hres = IOleObject_SetExtent(oleobj, 0xdeadbeef, &size);
1911     ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
1912
1913     size.cx = size.cy = 0xdeadbeef;
1914     hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
1915     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1916     ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy);
1917
1918     size.cx = size.cy = 0xdeadbeef;
1919     hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
1920     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1921     ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy);
1922
1923     IOleObject_Release(oleobj);
1924 }
1925
1926 static void test_ConnectionPoint(IUnknown *unk, BOOL init)
1927 {
1928     IConnectionPointContainer *container;
1929     IConnectionPoint *point;
1930     HRESULT hres;
1931
1932     static DWORD dw = 100;
1933
1934     hres = IUnknown_QueryInterface(unk, &IID_IConnectionPointContainer, (void**)&container);
1935     ok(hres == S_OK, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres);
1936     if(FAILED(hres))
1937         return;
1938
1939     hres = IConnectionPointContainer_FindConnectionPoint(container, &DIID_DWebBrowserEvents2, &point);
1940     IConnectionPointContainer_Release(container);
1941     ok(hres == S_OK, "FindConnectionPoint failed: %08x\n", hres);
1942     if(FAILED(hres))
1943         return;
1944
1945     if(init) {
1946         hres = IConnectionPoint_Advise(point, (IUnknown*)&WebBrowserEvents2, &dw);
1947         ok(hres == S_OK, "Advise failed: %08x\n", hres);
1948         ok(dw == 1, "dw=%d, expected 1\n", dw);
1949     }else {
1950         hres = IConnectionPoint_Unadvise(point, dw);
1951         ok(hres == S_OK, "Unadvise failed: %08x\n", hres);
1952     }
1953
1954     IConnectionPoint_Release(point);
1955 }
1956
1957 static void test_Navigate2(IUnknown *unk)
1958 {
1959     IWebBrowser2 *webbrowser;
1960     VARIANT url;
1961     HRESULT hres;
1962
1963     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&webbrowser);
1964     ok(hres == S_OK, "QueryInterface(IID_IWebBrowser) failed: %08x\n", hres);
1965     if(FAILED(hres))
1966         return;
1967
1968     test_LocationURL(unk, emptyW);
1969
1970     V_VT(&url) = VT_BSTR;
1971     V_BSTR(&url) = SysAllocString(about_blankW);
1972
1973     SET_EXPECT(Invoke_AMBIENT_USERMODE);
1974     SET_EXPECT(Invoke_PROPERTYCHANGE);
1975     SET_EXPECT(Invoke_BEFORENAVIGATE2);
1976     SET_EXPECT(Invoke_DOWNLOADBEGIN);
1977     SET_EXPECT(Exec_SETDOWNLOADSTATE_1);
1978     SET_EXPECT(EnableModeless_FALSE);
1979     SET_EXPECT(Invoke_STATUSTEXTCHANGE);
1980     SET_EXPECT(SetStatusText);
1981     SET_EXPECT(GetHostInfo);
1982     SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
1983     SET_EXPECT(Invoke_AMBIENT_USERAGENT);
1984     SET_EXPECT(Invoke_AMBIENT_PALETTE);
1985     SET_EXPECT(GetOptionKeyPath);
1986     SET_EXPECT(GetOverridesKeyPath);
1987     SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
1988     SET_EXPECT(Exec_SETPROGRESSMAX);
1989     SET_EXPECT(Exec_SETPROGRESSPOS);
1990     SET_EXPECT(Invoke_SETSECURELOCKICON);
1991     SET_EXPECT(Invoke_FILEDOWNLOAD);
1992     SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
1993     SET_EXPECT(Invoke_COMMANDSTATECHANGE);
1994     SET_EXPECT(EnableModeless_TRUE);
1995
1996     hres = IWebBrowser2_Navigate2(webbrowser, &url, NULL, NULL, NULL, NULL);
1997     ok(hres == S_OK, "Navigate2 failed: %08x\n", hres);
1998
1999     CHECK_CALLED(Invoke_AMBIENT_USERMODE);
2000     todo_wine CHECK_CALLED(Invoke_PROPERTYCHANGE);
2001     CHECK_CALLED(Invoke_BEFORENAVIGATE2);
2002     todo_wine CHECK_CALLED(Invoke_DOWNLOADBEGIN);
2003     todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_1);
2004     CHECK_CALLED(EnableModeless_FALSE);
2005     CHECK_CALLED(Invoke_STATUSTEXTCHANGE);
2006     CHECK_CALLED(SetStatusText);
2007     CHECK_CALLED(GetHostInfo);
2008     CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
2009     CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
2010     CHECK_CALLED(Invoke_AMBIENT_PALETTE);
2011     CHECK_CALLED(GetOptionKeyPath);
2012     CHECK_CALLED_BROKEN(GetOverridesKeyPath);
2013     todo_wine CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
2014     todo_wine CHECK_CALLED(Exec_SETPROGRESSMAX);
2015     todo_wine CHECK_CALLED(Exec_SETPROGRESSPOS);
2016     todo_wine CHECK_CALLED_BROKEN(Invoke_SETSECURELOCKICON);
2017     todo_wine CHECK_CALLED_BROKEN(Invoke_FILEDOWNLOAD);
2018     todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE);
2019     todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
2020     CHECK_CALLED(EnableModeless_TRUE);
2021
2022     VariantClear(&url);
2023     IWebBrowser2_Release(webbrowser);
2024 }
2025
2026 static void test_IServiceProvider(IUnknown *unk)
2027 {
2028     IServiceProvider *servprov = (void*)0xdeadbeef;
2029     HRESULT hres;
2030     IUnknown *ret = NULL;
2031     static const IID IID_IBrowserService2 =
2032         {0x68BD21CC,0x438B,0x11d2,{0xA5,0x60,0x00,0xA0,0xC,0x2D,0xBF,0xE8}};
2033
2034     hres = IUnknown_QueryInterface(unk, &IID_IServiceProvider, (void**)&servprov);
2035     ok(hres == S_OK, "QueryInterface returned %08x, expected S_OK\n", hres);
2036     if(FAILED(hres))
2037         return;
2038
2039     hres = IServiceProvider_QueryService(servprov, &SID_STopLevelBrowser, &IID_IBrowserService2, (LPVOID*)&ret);
2040     ok(hres == E_FAIL, "QueryService returned %08x, expected E_FAIL\n", hres);
2041     ok(ret == NULL, "ret returned %p, expected NULL\n", ret);
2042     if(hres == S_OK)
2043     {
2044         IUnknown_Release(ret);
2045     }
2046
2047     IServiceProvider_Release(servprov);
2048 }
2049
2050 static void test_QueryInterface(IUnknown *unk)
2051 {
2052     IQuickActivate *qa = (IQuickActivate*)0xdeadbeef;
2053     IRunnableObject *runnable = (IRunnableObject*)0xdeadbeef;
2054     IPerPropertyBrowsing *propbrowse = (void*)0xdeadbeef;
2055     IOleInPlaceSite *inplace = (void*)0xdeadbeef;
2056     IOleCache *cache = (void*)0xdeadbeef;
2057     IObjectWithSite *site = (void*)0xdeadbeef;
2058     IViewObjectEx *viewex = (void*)0xdeadbeef;
2059     HRESULT hres;
2060
2061     hres = IUnknown_QueryInterface(unk, &IID_IQuickActivate, (void**)&qa);
2062     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2063     ok(qa == NULL, "qa=%p, expected NULL\n", qa);
2064
2065     hres = IUnknown_QueryInterface(unk, &IID_IRunnableObject, (void**)&runnable);
2066     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2067     ok(runnable == NULL, "runnable=%p, expected NULL\n", runnable);
2068
2069     hres = IUnknown_QueryInterface(unk, &IID_IPerPropertyBrowsing, (void**)&propbrowse);
2070     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2071     ok(propbrowse == NULL, "propbrowse=%p, expected NULL\n", propbrowse);
2072
2073     hres = IUnknown_QueryInterface(unk, &IID_IOleCache, (void**)&cache);
2074     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2075     ok(cache == NULL, "cache=%p, expected NULL\n", cache);
2076
2077     hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceSite, (void**)&inplace);
2078     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2079     ok(inplace == NULL, "inplace=%p, expected NULL\n", inplace);
2080
2081     hres = IUnknown_QueryInterface(unk, &IID_IObjectWithSite, (void**)&site);
2082     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2083     ok(site == NULL, "site=%p, expected NULL\n", site);
2084
2085     hres = IUnknown_QueryInterface(unk, &IID_IViewObjectEx, (void**)&viewex);
2086     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
2087     ok(viewex == NULL, "viewex=%p, expected NULL\n", viewex);
2088
2089 }
2090
2091 static void test_WebBrowser(void)
2092 {
2093     IUnknown *unk = NULL;
2094     ULONG ref;
2095     HRESULT hres;
2096
2097     hres = CoCreateInstance(&CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
2098             &IID_IUnknown, (void**)&unk);
2099     ok(hres == S_OK, "CoCreateInterface failed: %08x\n", hres);
2100     if(FAILED(hres))
2101         return;
2102
2103     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
2104     ok(hres == S_OK, "Could not get IWebBrowser2 iface: %08x\n", hres);
2105
2106     test_QueryInterface(unk);
2107     test_ClassInfo(unk);
2108     test_LocationURL(unk, emptyW);
2109     test_ConnectionPoint(unk, TRUE);
2110     test_ClientSite(unk, &ClientSite);
2111     test_Extent(unk);
2112     test_wb_funcs(unk, TRUE);
2113     test_DoVerb(unk);
2114     test_Navigate2(unk);
2115     test_ClientSite(unk, NULL);
2116     test_ie_funcs(unk);
2117     test_GetControlInfo(unk);
2118     test_wb_funcs(unk, FALSE);
2119     test_ConnectionPoint(unk, FALSE);
2120     test_IServiceProvider(unk);
2121
2122     IWebBrowser2_Release(wb);
2123     ref = IUnknown_Release(unk);
2124     ok(ref == 0, "ref=%d, expected 0\n", ref);
2125 }
2126
2127 static void gecko_installer_workaround(BOOL disable)
2128 {
2129     HKEY hkey;
2130     DWORD res;
2131
2132     static BOOL has_url = FALSE;
2133     static char url[2048];
2134
2135     if(!disable && !has_url)
2136         return;
2137
2138     res = RegOpenKey(HKEY_CURRENT_USER, "Software\\Wine\\MSHTML", &hkey);
2139     if(res != ERROR_SUCCESS)
2140         return;
2141
2142     if(disable) {
2143         DWORD type, size = sizeof(url);
2144
2145         res = RegQueryValueEx(hkey, "GeckoUrl", NULL, &type, (PVOID)url, &size);
2146         if(res == ERROR_SUCCESS && type == REG_SZ)
2147             has_url = TRUE;
2148
2149         RegDeleteValue(hkey, "GeckoUrl");
2150     }else {
2151         RegSetValueEx(hkey, "GeckoUrl", 0, REG_SZ, (PVOID)url, lstrlenA(url)+1);
2152     }
2153
2154     RegCloseKey(hkey);
2155 }
2156
2157 START_TEST(webbrowser)
2158 {
2159     gecko_installer_workaround(TRUE);
2160
2161     container_hwnd = create_container_window();
2162
2163     OleInitialize(NULL);
2164
2165     test_WebBrowser();
2166
2167     OleUninitialize();
2168
2169     gecko_installer_workaround(FALSE);
2170 }