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