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