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