opengl32: Avoid generating a wrapper for internal functions when we can call the...
[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
25 #include "windef.h"
26 #include "winbase.h"
27 #include "ole2.h"
28 #include "exdisp.h"
29 #include "htiframe.h"
30 #include "mshtmhst.h"
31 #include "idispids.h"
32
33 #define DEFINE_EXPECT(func) \
34     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
35
36 #define SET_EXPECT(func) \
37     expect_ ## func = TRUE
38
39 #define CHECK_EXPECT(func) \
40     do { \
41         ok(expect_ ##func, "unexpected call " #func "\n"); \
42         expect_ ## func = FALSE; \
43         called_ ## func = TRUE; \
44     }while(0)
45
46 #define CHECK_EXPECT2(func) \
47     do { \
48         ok(expect_ ##func, "unexpected call " #func "\n"); \
49         called_ ## func = TRUE; \
50     }while(0)
51
52 #define CHECK_CALLED(func) \
53     do { \
54         ok(called_ ## func, "expected " #func "\n"); \
55         expect_ ## func = called_ ## func = FALSE; \
56     }while(0)
57
58 DEFINE_EXPECT(GetContainer);
59 DEFINE_EXPECT(Site_GetWindow);
60 DEFINE_EXPECT(ShowObject);
61 DEFINE_EXPECT(CanInPlaceActivate);
62 DEFINE_EXPECT(OnInPlaceActivate);
63 DEFINE_EXPECT(OnUIActivate);
64 DEFINE_EXPECT(GetWindowContext);
65 DEFINE_EXPECT(Frame_GetWindow);
66 DEFINE_EXPECT(Frame_SetActiveObject);
67 DEFINE_EXPECT(UIWindow_SetActiveObject);
68 DEFINE_EXPECT(SetMenu);
69 DEFINE_EXPECT(Invoke_AMBIENT_SILENT);
70 DEFINE_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
71
72 static const WCHAR wszItem[] = {'i','t','e','m',0};
73
74 static HWND container_hwnd, shell_embedding_hwnd;
75
76 static HRESULT QueryInterface(REFIID,void**);
77
78 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
79 {
80     if(IsEqualGUID(&IID_ITargetContainer, riid))
81         return E_NOINTERFACE; /* TODO */
82     if(IsEqualGUID(&IID_IOleCommandTarget, riid))
83         return E_NOINTERFACE; /* TODO */
84
85     ok(0, "unexpected call\n");
86     return E_NOINTERFACE;
87 }
88
89 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
90 {
91     return 2;
92 }
93
94 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
95 {
96     return 1;
97 }
98
99 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
100         LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut)
101 {
102     ok(0, "unexpected call\n");
103     return E_NOTIMPL;
104 }
105
106 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
107         IEnumUnknown **ppenum)
108 {
109     ok(0, "unexpected call\n");
110     return E_NOTIMPL;
111 }
112
113 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
114 {
115     ok(0, "unexpected call\n");
116     return E_NOTIMPL;
117 }
118
119 static const IOleContainerVtbl OleContainerVtbl = {
120     OleContainer_QueryInterface,
121     OleContainer_AddRef,
122     OleContainer_Release,
123     OleContainer_ParseDisplayName,
124     OleContainer_EnumObjects,
125     OleContainer_LockContainer
126 };
127
128 static IOleContainer OleContainer = { &OleContainerVtbl };
129
130 static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
131 {
132     return QueryInterface(riid, ppv);
133 }
134
135 static ULONG WINAPI Dispatch_AddRef(IDispatch *iface)
136 {
137     return 2;
138 }
139
140 static ULONG WINAPI Dispatch_Release(IDispatch *iface)
141 {
142     return 1;
143 }
144
145 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
146 {
147     ok(0, "unexpected call\n");
148     return E_NOTIMPL;
149 }
150
151 static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
152         ITypeInfo **ppTInfo)
153 {
154     ok(0, "unexpected call\n");
155     return E_NOTIMPL;
156 }
157
158 static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
159         UINT cNames, LCID lcid, DISPID *rgDispId)
160 {
161     ok(0, "unexpected call\n");
162     return E_NOTIMPL;
163 }
164
165 static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
166         LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
167         EXCEPINFO *pExcepInfo, UINT *puArgErr)
168 {
169     ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
170     ok(pDispParams != NULL, "pDispParams == NULL\n");
171     ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
172     ok(puArgErr == NULL, "puArgErr=%p\n", puArgErr);
173     ok(V_VT(pVarResult) == VT_EMPTY, "V_VT(pVarResult)=%d\n", V_VT(pVarResult));
174     ok(wFlags == DISPATCH_PROPERTYGET, "wFlags=%08x, expected DISPATCH_PROPERTYGET\n", wFlags);
175     ok(pDispParams->rgvarg == NULL, "pDispParams->rgvarg = %p\n", pDispParams->rgvarg);
176     ok(pDispParams->rgdispidNamedArgs == NULL,
177        "pDispParams->rgdispidNamedArgs = %p\n", pDispParams->rgdispidNamedArgs);
178     ok(pDispParams->cArgs == 0, "pDispParams->cArgs = %d\n", pDispParams->cArgs);
179     ok(pDispParams->cNamedArgs == 0, "pDispParams->cNamedArgs = %d\n", pDispParams->cNamedArgs);
180
181     switch(dispIdMember) {
182     case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
183         CHECK_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
184         V_VT(pVarResult) = VT_BOOL;
185         V_BOOL(pVarResult) = VARIANT_FALSE;
186         return S_OK;
187     case DISPID_AMBIENT_SILENT:
188         CHECK_EXPECT(Invoke_AMBIENT_SILENT);
189         V_VT(pVarResult) = VT_BOOL;
190         V_BOOL(pVarResult) = VARIANT_FALSE;
191         return S_OK;
192     }
193
194     ok(0, "unexpected dispIdMember %d\n", dispIdMember);
195     return E_NOTIMPL;
196 }
197
198 static IDispatchVtbl DispatchVtbl = {
199     Dispatch_QueryInterface,
200     Dispatch_AddRef,
201     Dispatch_Release,
202     Dispatch_GetTypeInfoCount,
203     Dispatch_GetTypeInfo,
204     Dispatch_GetIDsOfNames,
205     Dispatch_Invoke
206 };
207
208 static IDispatch Dispatch = { &DispatchVtbl };
209
210 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
211 {
212     return QueryInterface(riid, ppv);
213 }
214
215 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
216 {
217     return 2;
218 }
219
220 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
221 {
222     return 1;
223 }
224
225 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
226 {
227     ok(0, "unexpected call\n");
228     return E_NOTIMPL;
229 }
230
231 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAsign, DWORD dwWhichMoniker,
232         IMoniker **ppmon)
233 {
234     ok(0, "unexpected call\n");
235     return E_NOTIMPL;
236 }
237
238 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
239 {
240     CHECK_EXPECT(GetContainer);
241
242     ok(ppContainer != NULL, "ppContainer == NULL\n");
243     if(ppContainer)
244         *ppContainer = &OleContainer;
245
246     return S_OK;
247 }
248
249 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
250 {
251     CHECK_EXPECT(ShowObject);
252     return S_OK;
253 }
254
255 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
256 {
257     ok(0, "unexpected call\n");
258     return E_NOTIMPL;
259 }
260
261 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
262 {
263     ok(0, "unexpected call\n");
264     return E_NOTIMPL;
265 }
266
267 static const IOleClientSiteVtbl ClientSiteVtbl = {
268     ClientSite_QueryInterface,
269     ClientSite_AddRef,
270     ClientSite_Release,
271     ClientSite_SaveObject,
272     ClientSite_GetMoniker,
273     ClientSite_GetContainer,
274     ClientSite_ShowObject,
275     ClientSite_OnShowWindow,
276     ClientSite_RequestNewObjectLayout
277 };
278
279 static IOleClientSite ClientSite = { &ClientSiteVtbl };
280
281 static HRESULT WINAPI InPlaceUIWindow_QueryInterface(IOleInPlaceFrame *iface,
282                                                      REFIID riid, void **ppv)
283 {
284     ok(0, "unexpected call\n");
285     return E_NOINTERFACE;
286 }
287
288 static ULONG WINAPI InPlaceUIWindow_AddRef(IOleInPlaceFrame *iface)
289 {
290     return 2;
291 }
292
293 static ULONG WINAPI InPlaceUIWindow_Release(IOleInPlaceFrame *iface)
294 {
295     return 1;
296 }
297
298 static HRESULT WINAPI InPlaceUIWindow_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
299 {
300     ok(0, "unexpected call\n");
301     return E_NOTIMPL;
302 }
303
304 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
305 {
306     CHECK_EXPECT(Frame_GetWindow);
307     ok(phwnd != NULL, "phwnd == NULL\n");
308     if(phwnd)
309         *phwnd = container_hwnd;
310     return S_OK;
311 }
312
313 static HRESULT WINAPI InPlaceUIWindow_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
314 {
315     ok(0, "unexpected call\n");
316     return E_NOTIMPL;
317 }
318
319 static HRESULT WINAPI InPlaceUIWindow_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
320 {
321     ok(0, "unexpected call\n");
322     return E_NOTIMPL;
323 }
324
325 static HRESULT WINAPI InPlaceUIWindow_RequestBorderSpace(IOleInPlaceFrame *iface,
326         LPCBORDERWIDTHS pborderwidths)
327 {
328     ok(0, "unexpected call\n");
329     return E_NOTIMPL;
330 }
331
332 static HRESULT WINAPI InPlaceUIWindow_SetBorderSpace(IOleInPlaceFrame *iface,
333         LPCBORDERWIDTHS pborderwidths)
334 {
335     ok(0, "unexpected call\n");
336     return E_NOTIMPL;
337 }
338
339 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
340         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
341 {
342     CHECK_EXPECT(UIWindow_SetActiveObject);
343     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
344     ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
345     return S_OK;
346 }
347
348 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
349         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
350 {
351     CHECK_EXPECT(Frame_SetActiveObject);
352     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
353     ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
354     return S_OK;
355 }
356
357 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
358         LPOLEMENUGROUPWIDTHS lpMenuWidths)
359 {
360     ok(0, "unexpected call\n");
361     return E_NOTIMPL;
362 }
363
364 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
365         HOLEMENU holemenu, HWND hwndActiveObject)
366 {
367     CHECK_EXPECT(SetMenu);
368     ok(hmenuShared == NULL, "hmenuShared=%p\n", hmenuShared);
369     ok(holemenu == NULL, "holemenu=%p\n", holemenu);
370     ok(hwndActiveObject == shell_embedding_hwnd, "hwndActiveObject=%p, expected %p\n",
371        hwndActiveObject, shell_embedding_hwnd);
372     return S_OK;
373 }
374
375 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
376 {
377     ok(0, "unexpected call\n");
378     return E_NOTIMPL;
379 }
380
381 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
382 {
383     ok(0, "unexpected call\n");
384     return E_NOTIMPL;
385 }
386
387 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
388 {
389     ok(0, "unexpected call\n");
390     return E_NOTIMPL;
391 }
392
393 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
394 {
395     ok(0, "unexpected call\n");
396     return E_NOTIMPL;
397 }
398
399 static const IOleInPlaceFrameVtbl InPlaceUIWindowVtbl = {
400     InPlaceUIWindow_QueryInterface,
401     InPlaceUIWindow_AddRef,
402     InPlaceUIWindow_Release,
403     InPlaceUIWindow_GetWindow,
404     InPlaceUIWindow_ContextSensitiveHelp,
405     InPlaceUIWindow_GetBorder,
406     InPlaceUIWindow_RequestBorderSpace,
407     InPlaceUIWindow_SetBorderSpace,
408     InPlaceUIWindow_SetActiveObject,
409 };
410
411 static IOleInPlaceUIWindow InPlaceUIWindow = { (IOleInPlaceUIWindowVtbl*)&InPlaceUIWindowVtbl };
412
413 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = {
414     InPlaceUIWindow_QueryInterface,
415     InPlaceUIWindow_AddRef,
416     InPlaceUIWindow_Release,
417     InPlaceFrame_GetWindow,
418     InPlaceUIWindow_ContextSensitiveHelp,
419     InPlaceUIWindow_GetBorder,
420     InPlaceUIWindow_RequestBorderSpace,
421     InPlaceUIWindow_SetBorderSpace,
422     InPlaceFrame_SetActiveObject,
423     InPlaceFrame_InsertMenus,
424     InPlaceFrame_SetMenu,
425     InPlaceFrame_RemoveMenus,
426     InPlaceFrame_SetStatusText,
427     InPlaceFrame_EnableModeless,
428     InPlaceFrame_TranslateAccelerator
429 };
430
431 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
432
433 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
434 {
435     return QueryInterface(riid, ppv);
436 }
437
438 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
439 {
440     return 2;
441 }
442
443 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSiteEx *iface)
444 {
445     return 1;
446 }
447
448 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
449 {
450     CHECK_EXPECT(Site_GetWindow);
451     ok(phwnd != NULL, "phwnd == NULL\n");
452     if(phwnd)
453         *phwnd = container_hwnd;
454     return S_OK;
455 }
456
457 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
458 {
459     ok(0, "unexpected call\n");
460     return E_NOTIMPL;
461 }
462
463 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
464 {
465     CHECK_EXPECT(CanInPlaceActivate);
466     return S_OK;
467 }
468
469 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
470 {
471     CHECK_EXPECT(OnInPlaceActivate);
472     return S_OK;
473 }
474
475 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
476 {
477     CHECK_EXPECT(OnUIActivate);
478     return S_OK;
479 }
480
481 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
482         IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
483         LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
484 {
485     static const RECT pos_rect = {2,1,1002,901};
486     static const RECT clip_rect = {10,10,990,890};
487
488     CHECK_EXPECT(GetWindowContext);
489
490     ok(ppFrame != NULL, "ppFrame = NULL\n");
491     if(ppFrame)
492         *ppFrame = &InPlaceFrame;
493
494     ok(ppDoc != NULL, "ppDoc = NULL\n");
495     if(ppDoc)
496         *ppDoc = &InPlaceUIWindow;
497
498     ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
499     if(lprcPosRect)
500         memcpy(lprcPosRect, &pos_rect, sizeof(RECT));
501
502     ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
503     if(lprcClipRect)
504         memcpy(lprcClipRect, &clip_rect, sizeof(RECT));
505
506     ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n");
507     if(lpFrameInfo) {
508         lpFrameInfo->cb = sizeof(*lpFrameInfo);
509         lpFrameInfo->fMDIApp = FALSE;
510         lpFrameInfo->hwndFrame = container_hwnd;
511         lpFrameInfo->haccel = NULL;
512         lpFrameInfo->cAccelEntries = 0;
513     }
514
515     return S_OK;
516 }
517
518 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtant)
519 {
520     ok(0, "unexpected call\n");
521     return E_NOTIMPL;
522 }
523
524 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
525 {
526     ok(0, "unexpected call\n");
527     return E_NOTIMPL;
528 }
529
530 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
531 {
532     ok(0, "unexpected call\n");
533     return E_NOTIMPL;
534 }
535
536 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
537 {
538     ok(0, "unexpected call\n");
539     return E_NOTIMPL;
540 }
541
542 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
543 {
544     ok(0, "unexpected call\n");
545     return E_NOTIMPL;
546 }
547
548 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
549 {
550     ok(0, "unexpected call\n");
551     return E_NOTIMPL;
552 }
553
554 static HRESULT WINAPI InPlaceSite_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface,
555                                                       BOOL *pNoRedraw, DWORD dwFlags)
556 {
557     ok(0, "unexpected call\n");
558     return E_NOTIMPL;
559 }
560
561 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface,
562                                                         BOOL fNoRedraw)
563 {
564     ok(0, "unexpected call\n");
565     return E_NOTIMPL;
566 }
567
568 static HRESULT WINAPI InPlaceSite_RequestUIActivate(IOleInPlaceSiteEx *iface)
569 {
570     ok(0, "unexpected call\n");
571     return S_OK;
572 }
573
574 static const IOleInPlaceSiteExVtbl InPlaceSiteExVtbl = {
575     InPlaceSite_QueryInterface,
576     InPlaceSite_AddRef,
577     InPlaceSite_Release,
578     InPlaceSite_GetWindow,
579     InPlaceSite_ContextSensitiveHelp,
580     InPlaceSite_CanInPlaceActivate,
581     InPlaceSite_OnInPlaceActivate,
582     InPlaceSite_OnUIActivate,
583     InPlaceSite_GetWindowContext,
584     InPlaceSite_Scroll,
585     InPlaceSite_OnUIDeactivate,
586     InPlaceSite_OnInPlaceDeactivate,
587     InPlaceSite_DiscardUndoState,
588     InPlaceSite_DeactivateAndUndo,
589     InPlaceSite_OnPosRectChange,
590     InPlaceSite_OnInPlaceActivateEx,
591     InPlaceSite_OnInPlaceDeactivateEx,
592     InPlaceSite_RequestUIActivate
593 };
594
595 static IOleInPlaceSiteEx InPlaceSite = { &InPlaceSiteExVtbl };
596
597 static HRESULT WINAPI DocHostUIHandler_QueryInterface(IDocHostUIHandler2 *iface, REFIID riid, void **ppv)
598 {
599     return QueryInterface(riid, ppv);
600 }
601
602 static ULONG WINAPI DocHostUIHandler_AddRef(IDocHostUIHandler2 *iface)
603 {
604     return 2;
605 }
606
607 static ULONG WINAPI DocHostUIHandler_Release(IDocHostUIHandler2 *iface)
608 {
609     return 1;
610 }
611
612 static HRESULT WINAPI DocHostUIHandler_ShowContextMenu(IDocHostUIHandler2 *iface, DWORD dwID, POINT *ppt,
613         IUnknown *pcmdtReserved, IDispatch *pdicpReserved)
614 {
615     ok(0, "unexpected call %d %p %p %p\n", dwID, ppt, pcmdtReserved, pdicpReserved);
616     return S_FALSE;
617 }
618
619 static HRESULT WINAPI DocHostUIHandler_GetHostInfo(IDocHostUIHandler2 *iface, DOCHOSTUIINFO *pInfo)
620 {
621     ok(0, "unexpected call\n");
622     return E_NOTIMPL;
623 }
624
625 static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD dwID,
626         IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget,
627         IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
628 {
629     ok(0, "unexpected call\n");
630     return E_NOTIMPL;
631 }
632
633 static HRESULT WINAPI DocHostUIHandler_HideUI(IDocHostUIHandler2 *iface)
634 {
635     ok(0, "unexpected call\n");
636     return E_NOTIMPL;
637 }
638
639 static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface)
640 {
641     ok(0, "unexpected call\n");
642     return E_NOTIMPL;
643 }
644
645 static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable)
646 {
647     ok(0, "unexpected call\n");
648     return E_NOTIMPL;
649 }
650
651 static HRESULT WINAPI DocHostUIHandler_OnDocWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
652 {
653     ok(0, "unexpected call\n");
654     return E_NOTIMPL;
655 }
656
657 static HRESULT WINAPI DocHostUIHandler_OnFrameWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
658 {
659     ok(0, "unexpected call\n");
660     return E_NOTIMPL;
661 }
662
663 static HRESULT WINAPI DocHostUIHandler_ResizeBorder(IDocHostUIHandler2 *iface, LPCRECT prcBorder,
664         IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
665 {
666     ok(0, "unexpected call\n");
667     return E_NOTIMPL;
668 }
669
670 static HRESULT WINAPI DocHostUIHandler_TranslateAccelerator(IDocHostUIHandler2 *iface, LPMSG lpMsg,
671         const GUID *pguidCmdGroup, DWORD nCmdID)
672 {
673     ok(0, "unexpected call\n");
674     return E_NOTIMPL;
675 }
676
677 static HRESULT WINAPI DocHostUIHandler_GetOptionKeyPath(IDocHostUIHandler2 *iface,
678         LPOLESTR *pchKey, DWORD dw)
679 {
680     ok(0, "unexpected call\n");
681     return E_NOTIMPL;
682 }
683
684 static HRESULT WINAPI DocHostUIHandler_GetDropTarget(IDocHostUIHandler2 *iface,
685         IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
686 {
687     ok(0, "unexpected call\n");
688     return E_NOTIMPL;
689 }
690
691 static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, IDispatch **ppDispatch)
692 {
693     ok(0, "unexpected call\n");
694     return E_NOTIMPL;
695 }
696
697 static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate,
698         OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
699 {
700     ok(0, "unexpected call\n");
701     return E_NOTIMPL;
702 }
703
704 static HRESULT WINAPI DocHostUIHandler_FilterDataObject(IDocHostUIHandler2 *iface, IDataObject *pDO,
705         IDataObject **ppPORet)
706 {
707     ok(0, "unexpected call\n");
708     return E_NOTIMPL;
709 }
710
711 static HRESULT WINAPI DocHostUIHandler_GetOverrideKeyPath(IDocHostUIHandler2 *iface,
712         LPOLESTR *pchKey, DWORD dw)
713 {
714     ok(0, "unexpected call\n");
715     return E_NOTIMPL;
716 }
717
718 static const IDocHostUIHandler2Vtbl DocHostUIHandlerVtbl = {
719     DocHostUIHandler_QueryInterface,
720     DocHostUIHandler_AddRef,
721     DocHostUIHandler_Release,
722     DocHostUIHandler_ShowContextMenu,
723     DocHostUIHandler_GetHostInfo,
724     DocHostUIHandler_ShowUI,
725     DocHostUIHandler_HideUI,
726     DocHostUIHandler_UpdateUI,
727     DocHostUIHandler_EnableModeless,
728     DocHostUIHandler_OnDocWindowActivate,
729     DocHostUIHandler_OnFrameWindowActivate,
730     DocHostUIHandler_ResizeBorder,
731     DocHostUIHandler_TranslateAccelerator,
732     DocHostUIHandler_GetOptionKeyPath,
733     DocHostUIHandler_GetDropTarget,
734     DocHostUIHandler_GetExternal,
735     DocHostUIHandler_TranslateUrl,
736     DocHostUIHandler_FilterDataObject,
737     DocHostUIHandler_GetOverrideKeyPath
738 };
739
740 static IDocHostUIHandler2 DocHostUIHandler = { &DocHostUIHandlerVtbl };
741
742 static HRESULT QueryInterface(REFIID riid, void **ppv)
743 {
744     *ppv = NULL;
745
746     if(IsEqualGUID(&IID_IUnknown, riid)
747             || IsEqualGUID(&IID_IOleClientSite, riid))
748         *ppv = &ClientSite;
749     else if(IsEqualGUID(&IID_IOleWindow, riid)
750             || IsEqualGUID(&IID_IOleInPlaceSite, riid)
751             || IsEqualGUID(&IID_IOleInPlaceSiteEx, riid))
752         *ppv = &InPlaceSite;
753     else if(IsEqualGUID(&IID_IDocHostUIHandler, riid)
754             || IsEqualGUID(&IID_IDocHostUIHandler2, riid))
755         *ppv = &DocHostUIHandler;
756     else if(IsEqualGUID(&IID_IDispatch, riid))
757         *ppv = &Dispatch;
758
759     if(*ppv)
760         return S_OK;
761
762     return E_NOINTERFACE;
763 }
764
765 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
766 {
767     return DefWindowProcW(hwnd, msg, wParam, lParam);
768 }
769
770 static HWND create_container_window(void)
771 {
772     static const WCHAR wszWebBrowserContainer[] =
773         {'W','e','b','B','r','o','w','s','e','r','C','o','n','t','a','i','n','e','r',0};
774     static WNDCLASSEXW wndclass = {
775         sizeof(WNDCLASSEXW),
776         0,
777         wnd_proc,
778         0, 0, NULL, NULL, NULL, NULL, NULL,
779         wszWebBrowserContainer,
780         NULL
781     };
782
783     RegisterClassExW(&wndclass);
784     return CreateWindowW(wszWebBrowserContainer, wszWebBrowserContainer,
785             WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
786             CW_USEDEFAULT, NULL, NULL, NULL, NULL);
787 }
788
789 static void test_DoVerb(IUnknown *unk)
790 {
791     IOleObject *oleobj;
792     RECT rect = {0,0,1000,1000};
793     HRESULT hres;
794
795     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
796     ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
797     if(FAILED(hres))
798         return;
799
800     SET_EXPECT(CanInPlaceActivate);
801     SET_EXPECT(Site_GetWindow);
802     SET_EXPECT(OnInPlaceActivate);
803     SET_EXPECT(GetWindowContext);
804     SET_EXPECT(ShowObject);
805     SET_EXPECT(GetContainer);
806     SET_EXPECT(Frame_GetWindow);
807     SET_EXPECT(OnUIActivate);
808     SET_EXPECT(Frame_SetActiveObject);
809     SET_EXPECT(UIWindow_SetActiveObject);
810     SET_EXPECT(SetMenu);
811
812     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
813                              0, (HWND)0xdeadbeef, &rect);
814     ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
815
816     CHECK_CALLED(CanInPlaceActivate);
817     CHECK_CALLED(Site_GetWindow);
818     CHECK_CALLED(OnInPlaceActivate);
819     CHECK_CALLED(GetWindowContext);
820     CHECK_CALLED(ShowObject);
821     CHECK_CALLED(GetContainer);
822     CHECK_CALLED(Frame_GetWindow);
823     CHECK_CALLED(OnUIActivate);
824     CHECK_CALLED(Frame_SetActiveObject);
825     CHECK_CALLED(UIWindow_SetActiveObject);
826     CHECK_CALLED(SetMenu);
827
828     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
829                            0, (HWND)0xdeadbeef, &rect);
830     ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
831
832     IOleObject_Release(oleobj);
833 }
834
835 static void test_GetMiscStatus(IOleObject *oleobj)
836 {
837     DWORD st, i;
838     HRESULT hres;
839
840     for(i=0; i<10; i++) {
841         st = 0xdeadbeef;
842         hres = IOleObject_GetMiscStatus(oleobj, i, &st);
843         ok(hres == S_OK, "GetMiscStatus failed: %08x\n", hres);
844         ok(st == (OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT
845                   |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE),
846            "st=%08x, expected OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|"
847            "OLEMISC_INSIDEOUT|OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE)\n", st);
848     }
849 }
850
851 static void test_ClientSite(IUnknown *unk, IOleClientSite *client)
852 {
853     IOleObject *oleobj;
854     IOleInPlaceObject *inplace;
855     HWND hwnd;
856     HRESULT hres;
857
858     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
859     ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
860     if(FAILED(hres))
861         return;
862
863     test_GetMiscStatus(oleobj);
864
865     hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceObject, (void**)&inplace);
866     ok(hres == S_OK, "QueryInterface(IID_OleInPlaceObject) failed: %08x\n", hres);
867     if(FAILED(hres)) {
868         IOleObject_Release(oleobj);
869         return;
870     }
871
872     hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
873     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
874     ok((hwnd == NULL) ^ (client == NULL), "unexpected hwnd %p\n", hwnd);
875
876     if(client) {
877         SET_EXPECT(GetContainer);
878         SET_EXPECT(Site_GetWindow);
879         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
880         SET_EXPECT(Invoke_AMBIENT_SILENT);
881     }
882
883     hres = IOleObject_SetClientSite(oleobj, client);
884     ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
885
886     if(client) {
887         CHECK_CALLED(GetContainer);
888         CHECK_CALLED(Site_GetWindow);
889         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
890         CHECK_CALLED(Invoke_AMBIENT_SILENT);
891     }
892
893     hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
894     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
895     ok((hwnd == NULL) == (client == NULL), "unexpected hwnd %p\n", hwnd);
896
897     shell_embedding_hwnd = hwnd;
898
899     IOleInPlaceObject_Release(inplace);
900     IOleObject_Release(oleobj);
901 }
902
903 static void test_ClassInfo(IUnknown *unk)
904 {
905     IProvideClassInfo2 *class_info;
906     GUID guid;
907     HRESULT hres;
908
909     hres = IUnknown_QueryInterface(unk, &IID_IProvideClassInfo2, (void**)&class_info);
910     ok(hres == S_OK, "QueryInterface(IID_IProvideClassInfo)  failed: %08x\n", hres);
911     if(FAILED(hres))
912         return;
913
914     hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, &guid);
915     ok(hres == S_OK, "GetGUID failed: %08x\n", hres);
916     ok(IsEqualGUID(&DIID_DWebBrowserEvents2, &guid), "wrong guid\n");
917
918     hres = IProvideClassInfo2_GetGUID(class_info, 0, &guid);
919     ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres);
920     ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
921
922     hres = IProvideClassInfo2_GetGUID(class_info, 2, &guid);
923     ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres);
924     ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
925
926     hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, NULL);
927     ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
928
929     hres = IProvideClassInfo2_GetGUID(class_info, 0, NULL);
930     ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
931
932     IProvideClassInfo2_Release(class_info);
933 }
934
935 static void test_ie_funcs(IUnknown *unk)
936 {
937     IWebBrowser2 *wb;
938     VARIANT_BOOL b;
939     int i;
940     long hwnd;
941     HRESULT hres;
942
943     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
944     ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
945     if(FAILED(hres))
946         return;
947
948     /* HWND */
949
950     hwnd = 0xdeadbeef;
951     hres = IWebBrowser2_get_HWND(wb, &hwnd);
952     ok(hres == E_FAIL, "get_HWND failed: %08x, expected E_FAIL\n", hres);
953     ok(hwnd == 0, "unexpected hwnd %lx\n", hwnd);
954
955     /* MenuBar */
956
957     hres = IWebBrowser2_get_MenuBar(wb, &b);
958     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
959     ok(b == VARIANT_TRUE, "b=%x\n", b);
960
961     hres = IWebBrowser2_put_MenuBar(wb, VARIANT_FALSE);
962     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
963
964     hres = IWebBrowser2_get_MenuBar(wb, &b);
965     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
966     ok(b == VARIANT_FALSE, "b=%x\n", b);
967
968     hres = IWebBrowser2_put_MenuBar(wb, 100);
969     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
970
971     hres = IWebBrowser2_get_MenuBar(wb, &b);
972     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
973     ok(b == VARIANT_TRUE, "b=%x\n", b);
974
975     /* AddressBar */
976
977     hres = IWebBrowser2_get_AddressBar(wb, &b);
978     ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres);
979     ok(b == VARIANT_TRUE, "b=%x\n", b);
980
981     hres = IWebBrowser2_put_AddressBar(wb, VARIANT_FALSE);
982     ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
983
984     hres = IWebBrowser2_get_AddressBar(wb, &b);
985     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
986     ok(b == VARIANT_FALSE, "b=%x\n", b);
987
988     hres = IWebBrowser2_put_AddressBar(wb, 100);
989     ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
990
991     hres = IWebBrowser2_get_AddressBar(wb, &b);
992     ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres);
993     ok(b == VARIANT_TRUE, "b=%x\n", b);
994
995     hres = IWebBrowser2_put_AddressBar(wb, VARIANT_TRUE);
996     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
997
998     /* StatusBar */
999
1000     hres = IWebBrowser2_get_StatusBar(wb, &b);
1001     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1002     ok(b == VARIANT_TRUE, "b=%x\n", b);
1003
1004     hres = IWebBrowser2_put_StatusBar(wb, VARIANT_TRUE);
1005     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1006
1007     hres = IWebBrowser2_get_StatusBar(wb, &b);
1008     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1009     ok(b == VARIANT_TRUE, "b=%x\n", b);
1010
1011     hres = IWebBrowser2_put_StatusBar(wb, VARIANT_FALSE);
1012     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1013
1014     hres = IWebBrowser2_get_StatusBar(wb, &b);
1015     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1016     ok(b == VARIANT_FALSE, "b=%x\n", b);
1017
1018     hres = IWebBrowser2_put_StatusBar(wb, 100);
1019     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1020
1021     hres = IWebBrowser2_get_StatusBar(wb, &b);
1022     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1023     ok(b == VARIANT_TRUE, "b=%x\n", b);
1024
1025     /* ToolBar */
1026
1027     hres = IWebBrowser2_get_ToolBar(wb, &i);
1028     ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1029     ok(i == VARIANT_TRUE, "i=%x\n", i);
1030
1031     hres = IWebBrowser2_put_ToolBar(wb, VARIANT_FALSE);
1032     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1033
1034     hres = IWebBrowser2_get_ToolBar(wb, &i);
1035     ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1036     ok(i == VARIANT_FALSE, "b=%x\n", i);
1037
1038     hres = IWebBrowser2_put_ToolBar(wb, 100);
1039     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1040
1041     hres = IWebBrowser2_get_ToolBar(wb, &i);
1042     ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1043     ok(i == VARIANT_TRUE, "i=%x\n", i);
1044
1045     hres = IWebBrowser2_put_ToolBar(wb, VARIANT_TRUE);
1046     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1047
1048     IWebBrowser2_Release(wb);
1049 }
1050
1051 static void test_Silent(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
1052 {
1053     VARIANT_BOOL b;
1054     HRESULT hres;
1055
1056     b = 100;
1057     hres = IWebBrowser2_get_Silent(wb, &b);
1058     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1059     ok(b == VARIANT_FALSE, "b=%x\n", b);
1060
1061     hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
1062     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1063
1064     b = 100;
1065     hres = IWebBrowser2_get_Silent(wb, &b);
1066     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1067     ok(b == VARIANT_TRUE, "b=%x\n", b);
1068
1069     hres = IWebBrowser2_put_Silent(wb, 100);
1070     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1071
1072     b = 100;
1073     hres = IWebBrowser2_get_Silent(wb, &b);
1074     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1075     ok(b == VARIANT_TRUE, "b=%x\n", b);
1076
1077     hres = IWebBrowser2_put_Silent(wb, VARIANT_FALSE);
1078     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1079
1080     b = 100;
1081     hres = IWebBrowser2_get_Silent(wb, &b);
1082     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1083     ok(b == VARIANT_FALSE, "b=%x\n", b);
1084
1085     if(is_clientsite) {
1086         hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
1087         ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1088
1089         SET_EXPECT(Invoke_AMBIENT_SILENT);
1090     }
1091
1092     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_SILENT);
1093     ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
1094
1095     if(is_clientsite)
1096         CHECK_CALLED(Invoke_AMBIENT_SILENT);
1097
1098     b = 100;
1099     hres = IWebBrowser2_get_Silent(wb, &b);
1100     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1101     ok(b == VARIANT_FALSE, "b=%x\n", b);
1102 }
1103
1104 static void test_Offline(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
1105 {
1106     VARIANT_BOOL b;
1107     HRESULT hres;
1108
1109     b = 100;
1110     hres = IWebBrowser2_get_Offline(wb, &b);
1111     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1112     ok(b == VARIANT_FALSE, "b=%x\n", b);
1113
1114     hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
1115     ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1116
1117     b = 100;
1118     hres = IWebBrowser2_get_Offline(wb, &b);
1119     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1120     ok(b == VARIANT_TRUE, "b=%x\n", b);
1121
1122     hres = IWebBrowser2_put_Offline(wb, 100);
1123     ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1124
1125     b = 100;
1126     hres = IWebBrowser2_get_Offline(wb, &b);
1127     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1128     ok(b == VARIANT_TRUE, "b=%x\n", b);
1129
1130     hres = IWebBrowser2_put_Offline(wb, VARIANT_FALSE);
1131     ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1132
1133     b = 100;
1134     hres = IWebBrowser2_get_Offline(wb, &b);
1135     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1136     ok(b == VARIANT_FALSE, "b=%x\n", b);
1137
1138     if(is_clientsite) {
1139         hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
1140         ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1141
1142         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1143     }
1144
1145     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
1146     ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
1147
1148     if(is_clientsite)
1149         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1150
1151     b = 100;
1152     hres = IWebBrowser2_get_Offline(wb, &b);
1153     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1154     ok(b == VARIANT_FALSE, "b=%x\n", b);
1155 }
1156
1157 static void test_wb_funcs(IUnknown *unk, BOOL is_clientsite)
1158 {
1159     IWebBrowser2 *wb;
1160     IOleControl *control;
1161     HRESULT hres;
1162
1163     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
1164     ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
1165
1166     hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1167     ok(hres == S_OK, "Could not get IOleControl interface: %08x\n", hres);
1168
1169     test_Silent(wb, control, is_clientsite);
1170     test_Offline(wb, control, is_clientsite);
1171
1172     IWebBrowser_Release(wb);
1173     IOleControl_Release(control);
1174 }
1175
1176 static void test_GetControlInfo(IUnknown *unk)
1177 {
1178     IOleControl *control;
1179     CONTROLINFO info;
1180     HRESULT hres;
1181
1182     hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1183     ok(hres == S_OK, "Could not get IOleControl: %08x\n", hres);
1184     if(FAILED(hres))
1185         return;
1186
1187     hres = IOleControl_GetControlInfo(control, &info);
1188     ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, exxpected E_NOTIMPL\n", hres);
1189     hres = IOleControl_GetControlInfo(control, NULL);
1190     ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, exxpected E_NOTIMPL\n", hres);
1191
1192     IOleControl_Release(control);
1193 }
1194
1195 static void test_Extent(IUnknown *unk)
1196 {
1197     IOleObject *oleobj;
1198     SIZE size;
1199     HRESULT hres;
1200
1201     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1202     ok(hres == S_OK, "Could not get IOleObkect: %08x\n", hres);
1203     if(FAILED(hres))
1204         return;
1205
1206     size.cx = size.cy = 0xdeadbeef;
1207     hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
1208     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1209     ok(size.cx == 1323 && size.cy == 529, "size = {%d %d}\n", size.cx, size.cy);
1210
1211     size.cx = 800;
1212     size.cy = 700;
1213     hres = IOleObject_SetExtent(oleobj, DVASPECT_CONTENT, &size);
1214     ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
1215
1216     size.cx = size.cy = 0xdeadbeef;
1217     hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
1218     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1219     ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy);
1220
1221     size.cx = size.cy = 0xdeadbeef;
1222     hres = IOleObject_GetExtent(oleobj, 0, &size);
1223     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1224     ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy);
1225
1226     size.cx = 900;
1227     size.cy = 800;
1228     hres = IOleObject_SetExtent(oleobj, 0, &size);
1229     ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
1230
1231     size.cx = size.cy = 0xdeadbeef;
1232     hres = IOleObject_GetExtent(oleobj, 0, &size);
1233     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1234     ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy);
1235
1236     size.cx = size.cy = 0xdeadbeef;
1237     hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
1238     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1239     ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy);
1240
1241     size.cx = 1000;
1242     size.cy = 900;
1243     hres = IOleObject_SetExtent(oleobj, 0xdeadbeef, &size);
1244     ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
1245
1246     size.cx = size.cy = 0xdeadbeef;
1247     hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
1248     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1249     ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy);
1250
1251     size.cx = size.cy = 0xdeadbeef;
1252     hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
1253     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1254     ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy);
1255
1256     IOleObject_Release(oleobj);
1257 }
1258
1259 static void test_QueryInterface(IUnknown *unk)
1260 {
1261     IQuickActivate *qa = (IQuickActivate*)0xdeadbeef;
1262     IRunnableObject *runnable = (IRunnableObject*)0xdeadbeef;
1263     HRESULT hres;
1264
1265     hres = IUnknown_QueryInterface(unk, &IID_IQuickActivate, (void**)&qa);
1266     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
1267     ok(qa == NULL, "qa=%p, ezpected NULL\n", qa);
1268
1269     hres = IUnknown_QueryInterface(unk, &IID_IRunnableObject, (void**)&runnable);
1270     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
1271     ok(runnable == NULL, "runnable=%p, ezpected NULL\n", runnable);
1272 }
1273
1274 static void test_WebBrowser(void)
1275 {
1276     IUnknown *unk = NULL;
1277     ULONG ref;
1278     HRESULT hres;
1279
1280     hres = CoCreateInstance(&CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1281             &IID_IUnknown, (void**)&unk);
1282     ok(hres == S_OK, "CoCreateInterface failed: %08x\n", hres);
1283     if(FAILED(hres))
1284         return;
1285
1286     test_QueryInterface(unk);
1287     test_ClassInfo(unk);
1288     test_ClientSite(unk, &ClientSite);
1289     test_Extent(unk);
1290     test_wb_funcs(unk, TRUE);
1291     test_DoVerb(unk);
1292     test_ClientSite(unk, NULL);
1293     test_ie_funcs(unk);
1294     test_GetControlInfo(unk);
1295     test_wb_funcs(unk, FALSE);
1296
1297     ref = IUnknown_Release(unk);
1298     ok(ref == 0, "ref=%d, expected 0\n", ref);
1299 }
1300
1301 START_TEST(webbrowser)
1302 {
1303     container_hwnd = create_container_window();
1304
1305     OleInitialize(NULL);
1306
1307     test_WebBrowser();
1308
1309     OleUninitialize();
1310 }