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