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