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