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