janitorial: Remove remaining NULL checks before free() (found by Smatch).
[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
31 #define DEFINE_EXPECT(func) \
32     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
33
34 #define SET_EXPECT(func) \
35     expect_ ## func = TRUE
36
37 #define CHECK_EXPECT(func) \
38     do { \
39         ok(expect_ ##func, "unexpected call " #func "\n"); \
40         expect_ ## func = FALSE; \
41         called_ ## func = TRUE; \
42     }while(0)
43
44 #define CHECK_EXPECT2(func) \
45     do { \
46         ok(expect_ ##func, "unexpected call " #func "\n"); \
47         called_ ## func = TRUE; \
48     }while(0)
49
50 #define CHECK_CALLED(func) \
51     do { \
52         ok(called_ ## func, "expected " #func "\n"); \
53         expect_ ## func = called_ ## func = FALSE; \
54     }while(0)
55
56 DEFINE_EXPECT(GetContainer);
57 DEFINE_EXPECT(Site_GetWindow);
58 DEFINE_EXPECT(ShowObject);
59 DEFINE_EXPECT(CanInPlaceActivate);
60 DEFINE_EXPECT(OnInPlaceActivate);
61 DEFINE_EXPECT(OnUIActivate);
62 DEFINE_EXPECT(GetWindowContext);
63 DEFINE_EXPECT(Frame_GetWindow);
64 DEFINE_EXPECT(Frame_SetActiveObject);
65 DEFINE_EXPECT(UIWindow_SetActiveObject);
66 DEFINE_EXPECT(SetMenu);
67
68 static const WCHAR wszItem[] = {'i','t','e','m',0};
69
70 static HWND container_hwnd, shell_embedding_hwnd;
71
72 static HRESULT QueryInterface(REFIID,void**);
73
74 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
75 {
76     if(IsEqualGUID(&IID_ITargetContainer, riid))
77         return E_NOINTERFACE; /* TODO */
78     if(IsEqualGUID(&IID_IOleCommandTarget, riid))
79         return E_NOINTERFACE; /* TODO */
80
81     ok(0, "unexpected call\n");
82     return E_NOINTERFACE;
83 }
84
85 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
86 {
87     return 2;
88 }
89
90 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
91 {
92     return 1;
93 }
94
95 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
96         LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut)
97 {
98     ok(0, "unexpected call\n");
99     return E_NOTIMPL;
100 }
101
102 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
103         IEnumUnknown **ppenum)
104 {
105     ok(0, "unexpected call\n");
106     return E_NOTIMPL;
107 }
108
109 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
110 {
111     ok(0, "unexpected call\n");
112     return E_NOTIMPL;
113 }
114
115 static const IOleContainerVtbl OleContainerVtbl = {
116     OleContainer_QueryInterface,
117     OleContainer_AddRef,
118     OleContainer_Release,
119     OleContainer_ParseDisplayName,
120     OleContainer_EnumObjects,
121     OleContainer_LockContainer
122 };
123
124 static IOleContainer OleContainer = { &OleContainerVtbl };
125
126 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
127 {
128     return QueryInterface(riid, ppv);
129 }
130
131 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
132 {
133     return 2;
134 }
135
136 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
137 {
138     return 1;
139 }
140
141 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
142 {
143     ok(0, "unexpected call\n");
144     return E_NOTIMPL;
145 }
146
147 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAsign, DWORD dwWhichMoniker,
148         IMoniker **ppmon)
149 {
150     ok(0, "unexpected call\n");
151     return E_NOTIMPL;
152 }
153
154 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
155 {
156     CHECK_EXPECT(GetContainer);
157
158     ok(ppContainer != NULL, "ppContainer == NULL\n");
159     if(ppContainer)
160         *ppContainer = &OleContainer;
161
162     return S_OK;
163 }
164
165 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
166 {
167     CHECK_EXPECT(ShowObject);
168     return S_OK;
169 }
170
171 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
172 {
173     ok(0, "unexpected call\n");
174     return E_NOTIMPL;
175 }
176
177 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
178 {
179     ok(0, "unexpected call\n");
180     return E_NOTIMPL;
181 }
182
183 static const IOleClientSiteVtbl ClientSiteVtbl = {
184     ClientSite_QueryInterface,
185     ClientSite_AddRef,
186     ClientSite_Release,
187     ClientSite_SaveObject,
188     ClientSite_GetMoniker,
189     ClientSite_GetContainer,
190     ClientSite_ShowObject,
191     ClientSite_OnShowWindow,
192     ClientSite_RequestNewObjectLayout
193 };
194
195 static HRESULT WINAPI InPlaceUIWindow_QueryInterface(IOleInPlaceFrame *iface,
196                                                      REFIID riid, void **ppv)
197 {
198     ok(0, "unexpected call\n");
199     return E_NOINTERFACE;
200 }
201
202 static ULONG WINAPI InPlaceUIWindow_AddRef(IOleInPlaceFrame *iface)
203 {
204     return 2;
205 }
206
207 static ULONG WINAPI InPlaceUIWindow_Release(IOleInPlaceFrame *iface)
208 {
209     return 1;
210 }
211
212 static HRESULT WINAPI InPlaceUIWindow_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
213 {
214     ok(0, "unexpected call\n");
215     return E_NOTIMPL;
216 }
217
218 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
219 {
220     CHECK_EXPECT(Frame_GetWindow);
221     ok(phwnd != NULL, "phwnd == NULL\n");
222     if(phwnd)
223         *phwnd = container_hwnd;
224     return S_OK;
225 }
226
227 static HRESULT WINAPI InPlaceUIWindow_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
228 {
229     ok(0, "unexpected call\n");
230     return E_NOTIMPL;
231 }
232
233 static HRESULT WINAPI InPlaceUIWindow_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
234 {
235     ok(0, "unexpected call\n");
236     return E_NOTIMPL;
237 }
238
239 static HRESULT WINAPI InPlaceUIWindow_RequestBorderSpace(IOleInPlaceFrame *iface,
240         LPCBORDERWIDTHS pborderwidths)
241 {
242     ok(0, "unexpected call\n");
243     return E_NOTIMPL;
244 }
245
246 static HRESULT WINAPI InPlaceUIWindow_SetBorderSpace(IOleInPlaceFrame *iface,
247         LPCBORDERWIDTHS pborderwidths)
248 {
249     ok(0, "unexpected call\n");
250     return E_NOTIMPL;
251 }
252
253 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
254         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
255 {
256     CHECK_EXPECT(UIWindow_SetActiveObject);
257     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
258     ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
259     return S_OK;
260 }
261
262 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
263         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
264 {
265     CHECK_EXPECT(Frame_SetActiveObject);
266     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
267     ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
268     return S_OK;
269 }
270
271 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
272         LPOLEMENUGROUPWIDTHS lpMenuWidths)
273 {
274     ok(0, "unexpected call\n");
275     return E_NOTIMPL;
276 }
277
278 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
279         HOLEMENU holemenu, HWND hwndActiveObject)
280 {
281     CHECK_EXPECT(SetMenu);
282     ok(hmenuShared == NULL, "hmenuShared=%p\n", hmenuShared);
283     ok(holemenu == NULL, "holemenu=%p\n", holemenu);
284     ok(hwndActiveObject == shell_embedding_hwnd, "hwndActiveObject=%p, expected %p\n",
285        hwndActiveObject, shell_embedding_hwnd);
286     return S_OK;
287 }
288
289 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
290 {
291     ok(0, "unexpected call\n");
292     return E_NOTIMPL;
293 }
294
295 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
296 {
297     ok(0, "unexpected call\n");
298     return E_NOTIMPL;
299 }
300
301 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
302 {
303     ok(0, "unexpected call\n");
304     return E_NOTIMPL;
305 }
306
307 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
308 {
309     ok(0, "unexpected call\n");
310     return E_NOTIMPL;
311 }
312
313 static const IOleInPlaceFrameVtbl InPlaceUIWindowVtbl = {
314     InPlaceUIWindow_QueryInterface,
315     InPlaceUIWindow_AddRef,
316     InPlaceUIWindow_Release,
317     InPlaceUIWindow_GetWindow,
318     InPlaceUIWindow_ContextSensitiveHelp,
319     InPlaceUIWindow_GetBorder,
320     InPlaceUIWindow_RequestBorderSpace,
321     InPlaceUIWindow_SetBorderSpace,
322     InPlaceUIWindow_SetActiveObject,
323 };
324
325 static IOleInPlaceUIWindow InPlaceUIWindow = { (IOleInPlaceUIWindowVtbl*)&InPlaceUIWindowVtbl };
326
327 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = {
328     InPlaceUIWindow_QueryInterface,
329     InPlaceUIWindow_AddRef,
330     InPlaceUIWindow_Release,
331     InPlaceFrame_GetWindow,
332     InPlaceUIWindow_ContextSensitiveHelp,
333     InPlaceUIWindow_GetBorder,
334     InPlaceUIWindow_RequestBorderSpace,
335     InPlaceUIWindow_SetBorderSpace,
336     InPlaceFrame_SetActiveObject,
337     InPlaceFrame_InsertMenus,
338     InPlaceFrame_SetMenu,
339     InPlaceFrame_RemoveMenus,
340     InPlaceFrame_SetStatusText,
341     InPlaceFrame_EnableModeless,
342     InPlaceFrame_TranslateAccelerator
343 };
344
345 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
346
347 static IOleClientSite ClientSite = { &ClientSiteVtbl };
348
349 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
350 {
351     return QueryInterface(riid, ppv);
352 }
353
354 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
355 {
356     return 2;
357 }
358
359 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSiteEx *iface)
360 {
361     return 1;
362 }
363
364 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
365 {
366     CHECK_EXPECT(Site_GetWindow);
367     ok(phwnd != NULL, "phwnd == NULL\n");
368     if(phwnd)
369         *phwnd = container_hwnd;
370     return S_OK;
371 }
372
373 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
374 {
375     ok(0, "unexpected call\n");
376     return E_NOTIMPL;
377 }
378
379 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
380 {
381     CHECK_EXPECT(CanInPlaceActivate);
382     return S_OK;
383 }
384
385 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
386 {
387     CHECK_EXPECT(OnInPlaceActivate);
388     return S_OK;
389 }
390
391 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
392 {
393     CHECK_EXPECT(OnUIActivate);
394     return S_OK;
395 }
396
397 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
398         IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
399         LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
400 {
401     static const RECT pos_rect = {2,1,1002,901};
402     static const RECT clip_rect = {10,10,990,890};
403
404     CHECK_EXPECT(GetWindowContext);
405
406     ok(ppFrame != NULL, "ppFrame = NULL\n");
407     if(ppFrame)
408         *ppFrame = &InPlaceFrame;
409
410     ok(ppDoc != NULL, "ppDoc = NULL\n");
411     if(ppDoc)
412         *ppDoc = &InPlaceUIWindow;
413
414     ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
415     if(lprcPosRect)
416         memcpy(lprcPosRect, &pos_rect, sizeof(RECT));
417
418     ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
419     if(lprcClipRect)
420         memcpy(lprcClipRect, &clip_rect, sizeof(RECT));
421
422     ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n");
423     if(lpFrameInfo) {
424         lpFrameInfo->cb = sizeof(*lpFrameInfo);
425         lpFrameInfo->fMDIApp = FALSE;
426         lpFrameInfo->hwndFrame = container_hwnd;
427         lpFrameInfo->haccel = NULL;
428         lpFrameInfo->cAccelEntries = 0;
429     }
430
431     return S_OK;
432 }
433
434 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtant)
435 {
436     ok(0, "unexpected call\n");
437     return E_NOTIMPL;
438 }
439
440 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
441 {
442     ok(0, "unexpected call\n");
443     return E_NOTIMPL;
444 }
445
446 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
447 {
448     ok(0, "unexpected call\n");
449     return E_NOTIMPL;
450 }
451
452 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
453 {
454     ok(0, "unexpected call\n");
455     return E_NOTIMPL;
456 }
457
458 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
459 {
460     ok(0, "unexpected call\n");
461     return E_NOTIMPL;
462 }
463
464 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
465 {
466     ok(0, "unexpected call\n");
467     return E_NOTIMPL;
468 }
469
470 static HRESULT WINAPI InPlaceSite_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface,
471                                                       BOOL *pNoRedraw, DWORD dwFlags)
472 {
473     ok(0, "unexpected call\n");
474     return E_NOTIMPL;
475 }
476
477 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface,
478                                                         BOOL fNoRedraw)
479 {
480     ok(0, "unexpected call\n");
481     return E_NOTIMPL;
482 }
483
484 static HRESULT WINAPI InPlaceSite_RequestUIActivate(IOleInPlaceSiteEx *iface)
485 {
486     ok(0, "unexpected call\n");
487     return S_OK;
488 }
489
490 static const IOleInPlaceSiteExVtbl InPlaceSiteExVtbl = {
491     InPlaceSite_QueryInterface,
492     InPlaceSite_AddRef,
493     InPlaceSite_Release,
494     InPlaceSite_GetWindow,
495     InPlaceSite_ContextSensitiveHelp,
496     InPlaceSite_CanInPlaceActivate,
497     InPlaceSite_OnInPlaceActivate,
498     InPlaceSite_OnUIActivate,
499     InPlaceSite_GetWindowContext,
500     InPlaceSite_Scroll,
501     InPlaceSite_OnUIDeactivate,
502     InPlaceSite_OnInPlaceDeactivate,
503     InPlaceSite_DiscardUndoState,
504     InPlaceSite_DeactivateAndUndo,
505     InPlaceSite_OnPosRectChange,
506     InPlaceSite_OnInPlaceActivateEx,
507     InPlaceSite_OnInPlaceDeactivateEx,
508     InPlaceSite_RequestUIActivate
509 };
510
511 static IOleInPlaceSiteEx InPlaceSite = { &InPlaceSiteExVtbl };
512
513 static HRESULT QueryInterface(REFIID riid, void **ppv)
514 {
515     *ppv = NULL;
516
517     if(IsEqualGUID(&IID_IUnknown, riid)
518             || IsEqualGUID(&IID_IOleClientSite, riid))
519         *ppv = &ClientSite;
520     else if(IsEqualGUID(&IID_IOleWindow, riid)
521             || IsEqualGUID(&IID_IOleInPlaceSite, riid)
522             || IsEqualGUID(&IID_IOleInPlaceSiteEx, riid))
523         *ppv = &InPlaceSite;
524
525     if(*ppv)
526         return S_OK;
527
528     return E_NOINTERFACE;
529 }
530
531 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
532 {
533     return DefWindowProcW(hwnd, msg, wParam, lParam);
534 }
535
536 static HWND create_container_window(void)
537 {
538     static const WCHAR wszWebBrowserContainer[] =
539         {'W','e','b','B','r','o','w','s','e','r','C','o','n','t','a','i','n','e','r',0};
540     static WNDCLASSEXW wndclass = {
541         sizeof(WNDCLASSEXW),
542         0,
543         wnd_proc,
544         0, 0, NULL, NULL, NULL, NULL, NULL,
545         wszWebBrowserContainer,
546         NULL
547     };
548
549     RegisterClassExW(&wndclass);
550     return CreateWindowW(wszWebBrowserContainer, wszWebBrowserContainer,
551             WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
552             CW_USEDEFAULT, NULL, NULL, NULL, NULL);
553 }
554
555 static void test_DoVerb(IUnknown *unk)
556 {
557     IOleObject *oleobj;
558     RECT rect = {0,0,1000,1000};
559     HRESULT hres;
560
561     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
562     ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
563     if(FAILED(hres))
564         return;
565
566     SET_EXPECT(CanInPlaceActivate);
567     SET_EXPECT(Site_GetWindow);
568     SET_EXPECT(OnInPlaceActivate);
569     SET_EXPECT(GetWindowContext);
570     SET_EXPECT(ShowObject);
571     SET_EXPECT(GetContainer);
572     SET_EXPECT(Frame_GetWindow);
573     SET_EXPECT(OnUIActivate);
574     SET_EXPECT(Frame_SetActiveObject);
575     SET_EXPECT(UIWindow_SetActiveObject);
576     SET_EXPECT(SetMenu);
577
578     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
579                              0, container_hwnd, &rect);
580     ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
581
582     CHECK_CALLED(CanInPlaceActivate);
583     CHECK_CALLED(Site_GetWindow);
584     CHECK_CALLED(OnInPlaceActivate);
585     CHECK_CALLED(GetWindowContext);
586     CHECK_CALLED(ShowObject);
587     CHECK_CALLED(GetContainer);
588     CHECK_CALLED(Frame_GetWindow);
589     CHECK_CALLED(OnUIActivate);
590     CHECK_CALLED(Frame_SetActiveObject);
591     CHECK_CALLED(UIWindow_SetActiveObject);
592     CHECK_CALLED(SetMenu);
593
594     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
595                            0, container_hwnd, &rect);
596     ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
597
598     IOleObject_Release(oleobj);
599 }
600
601 static void test_GetMiscStatus(IOleObject *oleobj)
602 {
603     DWORD st, i;
604     HRESULT hres;
605
606     for(i=0; i<10; i++) {
607         st = 0xdeadbeef;
608         hres = IOleObject_GetMiscStatus(oleobj, i, &st);
609         ok(hres == S_OK, "GetMiscStatus failed: %08x\n", hres);
610         ok(st == (OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT
611                   |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE),
612            "st=%08x, expected OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|"
613            "OLEMISC_INSIDEOUT|OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE)\n", st);
614     }
615 }
616
617 static void test_ClientSite(IUnknown *unk, IOleClientSite *client)
618 {
619     IOleObject *oleobj;
620     IOleInPlaceObject *inplace;
621     HWND hwnd;
622     HRESULT hres;
623
624     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
625     ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
626     if(FAILED(hres))
627         return;
628
629     test_GetMiscStatus(oleobj);
630
631     hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceObject, (void**)&inplace);
632     ok(hres == S_OK, "QueryInterface(IID_OleInPlaceObject) failed: %08x\n", hres);
633     if(FAILED(hres)) {
634         IOleObject_Release(oleobj);
635         return;
636     }
637
638     hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
639     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
640     ok((hwnd == NULL) ^ (client == NULL), "unexpected hwnd %p\n", hwnd);
641
642     if(client) {
643         SET_EXPECT(GetContainer);
644         SET_EXPECT(Site_GetWindow);
645     }
646
647     hres = IOleObject_SetClientSite(oleobj, client);
648     ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
649
650     if(client) {
651         CHECK_CALLED(GetContainer);
652         CHECK_CALLED(Site_GetWindow);
653     }
654
655     hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
656     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
657     ok((hwnd == NULL) == (client == NULL), "unexpected hwnd %p\n", hwnd);
658
659     shell_embedding_hwnd = hwnd;
660
661     IOleInPlaceObject_Release(inplace);
662     IOleObject_Release(oleobj);
663 }
664
665 static void test_ClassInfo(IUnknown *unk)
666 {
667     IProvideClassInfo2 *class_info;
668     GUID guid;
669     HRESULT hres;
670
671     hres = IUnknown_QueryInterface(unk, &IID_IProvideClassInfo2, (void**)&class_info);
672     ok(hres == S_OK, "QueryInterface(IID_IProvideClassInfo)  failed: %08x\n", hres);
673     if(FAILED(hres))
674         return;
675
676     hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, &guid);
677     ok(hres == S_OK, "GetGUID failed: %08x\n", hres);
678     ok(IsEqualGUID(&DIID_DWebBrowserEvents2, &guid), "wrong guid\n");
679
680     hres = IProvideClassInfo2_GetGUID(class_info, 0, &guid);
681     ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres);
682     ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
683
684     hres = IProvideClassInfo2_GetGUID(class_info, 2, &guid);
685     ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres);
686     ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
687
688     hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, NULL);
689     ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
690
691     hres = IProvideClassInfo2_GetGUID(class_info, 0, NULL);
692     ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
693
694     IProvideClassInfo2_Release(class_info);
695 }
696
697 static void test_ie_funcs(IUnknown *unk)
698 {
699     IWebBrowser2 *wb;
700     VARIANT_BOOL b;
701     int i;
702     long hwnd;
703     HRESULT hres;
704
705     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
706     ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
707     if(FAILED(hres))
708         return;
709
710     /* HWND */
711
712     hwnd = 0xdeadbeef;
713     hres = IWebBrowser2_get_HWND(wb, &hwnd);
714     ok(hres == E_FAIL, "get_HWND failed: %08x, expected E_FAIL\n", hres);
715     ok(hwnd == 0, "unexpected hwnd %lx\n", hwnd);
716
717     /* MenuBar */
718
719     hres = IWebBrowser2_get_MenuBar(wb, &b);
720     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
721     ok(b == VARIANT_TRUE, "b=%x\n", b);
722
723     hres = IWebBrowser2_put_MenuBar(wb, VARIANT_FALSE);
724     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
725
726     hres = IWebBrowser2_get_MenuBar(wb, &b);
727     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
728     ok(b == VARIANT_FALSE, "b=%x\n", b);
729
730     hres = IWebBrowser2_put_MenuBar(wb, 100);
731     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
732
733     hres = IWebBrowser2_get_MenuBar(wb, &b);
734     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
735     ok(b == VARIANT_TRUE, "b=%x\n", b);
736
737     /* AddressBar */
738
739     hres = IWebBrowser2_get_AddressBar(wb, &b);
740     ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres);
741     ok(b == VARIANT_TRUE, "b=%x\n", b);
742
743     hres = IWebBrowser2_put_AddressBar(wb, VARIANT_FALSE);
744     ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
745
746     hres = IWebBrowser2_get_AddressBar(wb, &b);
747     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
748     ok(b == VARIANT_FALSE, "b=%x\n", b);
749
750     hres = IWebBrowser2_put_AddressBar(wb, 100);
751     ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
752
753     hres = IWebBrowser2_get_AddressBar(wb, &b);
754     ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres);
755     ok(b == VARIANT_TRUE, "b=%x\n", b);
756
757     hres = IWebBrowser2_put_AddressBar(wb, VARIANT_TRUE);
758     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
759
760     /* StatusBar */
761
762     hres = IWebBrowser2_get_StatusBar(wb, &b);
763     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
764     ok(b == VARIANT_TRUE, "b=%x\n", b);
765
766     hres = IWebBrowser2_put_StatusBar(wb, VARIANT_TRUE);
767     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
768
769     hres = IWebBrowser2_get_StatusBar(wb, &b);
770     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
771     ok(b == VARIANT_TRUE, "b=%x\n", b);
772
773     hres = IWebBrowser2_put_StatusBar(wb, VARIANT_FALSE);
774     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
775
776     hres = IWebBrowser2_get_StatusBar(wb, &b);
777     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
778     ok(b == VARIANT_FALSE, "b=%x\n", b);
779
780     hres = IWebBrowser2_put_StatusBar(wb, 100);
781     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
782
783     hres = IWebBrowser2_get_StatusBar(wb, &b);
784     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
785     ok(b == VARIANT_TRUE, "b=%x\n", b);
786
787     /* ToolBar */
788
789     hres = IWebBrowser2_get_ToolBar(wb, &i);
790     ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
791     ok(i == VARIANT_TRUE, "i=%x\n", i);
792
793     hres = IWebBrowser2_put_ToolBar(wb, VARIANT_FALSE);
794     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
795
796     hres = IWebBrowser2_get_ToolBar(wb, &i);
797     ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
798     ok(i == VARIANT_FALSE, "b=%x\n", i);
799
800     hres = IWebBrowser2_put_ToolBar(wb, 100);
801     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
802
803     hres = IWebBrowser2_get_ToolBar(wb, &i);
804     ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
805     ok(i == VARIANT_TRUE, "i=%x\n", i);
806
807     hres = IWebBrowser2_put_ToolBar(wb, VARIANT_TRUE);
808     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
809
810     IWebBrowser2_Release(wb);
811 }
812
813 static void test_Silent(IUnknown *unk)
814 {
815     IWebBrowser2 *wb;
816     VARIANT_BOOL b;
817     HRESULT hres;
818
819     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
820     ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
821     if(FAILED(hres))
822         return;
823
824     b = 100;
825     hres = IWebBrowser2_get_Silent(wb, &b);
826     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
827     ok(b == VARIANT_FALSE, "b=%x\n", b);
828
829     hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
830     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
831
832     b = 100;
833     hres = IWebBrowser2_get_Silent(wb, &b);
834     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
835     ok(b == VARIANT_TRUE, "b=%x\n", b);
836
837     hres = IWebBrowser2_put_Silent(wb, 100);
838     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
839
840     b = 100;
841     hres = IWebBrowser2_get_Silent(wb, &b);
842     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
843     ok(b == VARIANT_TRUE, "b=%x\n", b);
844
845     hres = IWebBrowser2_put_Silent(wb, VARIANT_FALSE);
846     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
847
848     b = 100;
849     hres = IWebBrowser2_get_Silent(wb, &b);
850     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
851     ok(b == VARIANT_FALSE, "b=%x\n", b);
852
853     IWebBrowser_Release(wb);
854 }
855
856 static void test_GetControlInfo(IUnknown *unk)
857 {
858     IOleControl *control;
859     CONTROLINFO info;
860     HRESULT hres;
861
862     hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
863     ok(hres == S_OK, "Could not get IOleControl: %08x\n", hres);
864     if(FAILED(hres))
865         return;
866
867     hres = IOleControl_GetControlInfo(control, &info);
868     ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, exxpected E_NOTIMPL\n", hres);
869     hres = IOleControl_GetControlInfo(control, NULL);
870     ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, exxpected E_NOTIMPL\n", hres);
871
872     IOleControl_Release(control);
873 }
874
875 static void test_Extent(IUnknown *unk)
876 {
877     IOleObject *oleobj;
878     SIZE size;
879     HRESULT hres;
880
881     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
882     ok(hres == S_OK, "Could not get IOleObkect: %08x\n", hres);
883     if(FAILED(hres))
884         return;
885
886     size.cx = size.cy = 0xdeadbeef;
887     hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
888     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
889     ok(size.cx == 1323 && size.cy == 529, "size = {%d %d}\n", size.cx, size.cy);
890
891     size.cx = 800;
892     size.cy = 700;
893     hres = IOleObject_SetExtent(oleobj, DVASPECT_CONTENT, &size);
894     ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
895
896     size.cx = size.cy = 0xdeadbeef;
897     hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
898     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
899     ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy);
900
901     size.cx = size.cy = 0xdeadbeef;
902     hres = IOleObject_GetExtent(oleobj, 0, &size);
903     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
904     ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy);
905
906     size.cx = 900;
907     size.cy = 800;
908     hres = IOleObject_SetExtent(oleobj, 0, &size);
909     ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
910
911     size.cx = size.cy = 0xdeadbeef;
912     hres = IOleObject_GetExtent(oleobj, 0, &size);
913     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
914     ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy);
915
916     size.cx = size.cy = 0xdeadbeef;
917     hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
918     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
919     ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy);
920
921     size.cx = 1000;
922     size.cy = 900;
923     hres = IOleObject_SetExtent(oleobj, 0xdeadbeef, &size);
924     ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
925
926     size.cx = size.cy = 0xdeadbeef;
927     hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
928     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
929     ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy);
930
931     size.cx = size.cy = 0xdeadbeef;
932     hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
933     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
934     ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy);
935
936     IOleObject_Release(oleobj);
937 }
938
939 static void test_QueryInterface(IUnknown *unk)
940 {
941     IQuickActivate *qa = (IQuickActivate*)0xdeadbeef;
942     IRunnableObject *runnable = (IRunnableObject*)0xdeadbeef;
943     HRESULT hres;
944
945     hres = IUnknown_QueryInterface(unk, &IID_IQuickActivate, (void**)&qa);
946     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
947     ok(qa == NULL, "qa=%p, ezpected NULL\n", qa);
948
949     hres = IUnknown_QueryInterface(unk, &IID_IRunnableObject, (void**)&runnable);
950     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
951     ok(runnable == NULL, "runnable=%p, ezpected NULL\n", runnable);
952 }
953
954 static void test_WebBrowser(void)
955 {
956     IUnknown *unk = NULL;
957     ULONG ref;
958     HRESULT hres;
959
960     hres = CoCreateInstance(&CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
961             &IID_IUnknown, (void**)&unk);
962     ok(hres == S_OK, "CoCreateInterface failed: %08x\n", hres);
963     if(FAILED(hres))
964         return;
965
966     test_QueryInterface(unk);
967     test_ClassInfo(unk);
968     test_ClientSite(unk, &ClientSite);
969     test_Extent(unk);
970     test_DoVerb(unk);
971     test_ClientSite(unk, NULL);
972     test_ie_funcs(unk);
973     test_GetControlInfo(unk);
974     test_Silent(unk);
975
976     ref = IUnknown_Release(unk);
977     ok(ref == 0, "ref=%d, expected 0\n", ref);
978 }
979
980 START_TEST(webbrowser)
981 {
982     container_hwnd = create_container_window();
983
984     OleInitialize(NULL);
985
986     test_WebBrowser();
987
988     OleUninitialize();
989 }