shdocvw: Added [get|put]_Silent implementation.
[wine/wine64.git] / dlls / shdocvw / tests / webbrowser.c
blob161f60865f827e36d20da4e26ceac1937ea4ee46
1 /*
2 * Copyright 2006 Jacek Caban for CodeWeavers
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.
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.
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
19 #define COBJMACROS
21 #include <wine/test.h>
22 #include <stdarg.h>
24 #include "windef.h"
25 #include "winbase.h"
26 #include "ole2.h"
27 #include "exdisp.h"
28 #include "htiframe.h"
30 #define DEFINE_EXPECT(func) \
31 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
33 #define SET_EXPECT(func) \
34 expect_ ## func = TRUE
36 #define CHECK_EXPECT(func) \
37 do { \
38 ok(expect_ ##func, "unexpected call " #func "\n"); \
39 expect_ ## func = FALSE; \
40 called_ ## func = TRUE; \
41 }while(0)
43 #define CHECK_EXPECT2(func) \
44 do { \
45 ok(expect_ ##func, "unexpected call " #func "\n"); \
46 called_ ## func = TRUE; \
47 }while(0)
49 #define CHECK_CALLED(func) \
50 do { \
51 ok(called_ ## func, "expected " #func "\n"); \
52 expect_ ## func = called_ ## func = FALSE; \
53 }while(0)
55 DEFINE_EXPECT(GetContainer);
56 DEFINE_EXPECT(Site_GetWindow);
57 DEFINE_EXPECT(ShowObject);
58 DEFINE_EXPECT(CanInPlaceActivate);
59 DEFINE_EXPECT(OnInPlaceActivate);
60 DEFINE_EXPECT(OnUIActivate);
61 DEFINE_EXPECT(GetWindowContext);
62 DEFINE_EXPECT(Frame_GetWindow);
63 DEFINE_EXPECT(Frame_SetActiveObject);
64 DEFINE_EXPECT(UIWindow_SetActiveObject);
65 DEFINE_EXPECT(SetMenu);
67 static const WCHAR wszItem[] = {'i','t','e','m',0};
69 static HWND container_hwnd, shell_embedding_hwnd;
71 static HRESULT QueryInterface(REFIID,void**);
73 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
75 if(IsEqualGUID(&IID_ITargetContainer, riid))
76 return E_NOINTERFACE; /* TODO */
77 if(IsEqualGUID(&IID_IOleCommandTarget, riid))
78 return E_NOINTERFACE; /* TODO */
80 ok(0, "unexpected call\n");
81 return E_NOINTERFACE;
84 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
86 return 2;
89 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
91 return 1;
94 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
95 LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut)
97 ok(0, "unexpected call\n");
98 return E_NOTIMPL;
101 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
102 IEnumUnknown **ppenum)
104 ok(0, "unexpected call\n");
105 return E_NOTIMPL;
108 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
110 ok(0, "unexpected call\n");
111 return E_NOTIMPL;
114 static const IOleContainerVtbl OleContainerVtbl = {
115 OleContainer_QueryInterface,
116 OleContainer_AddRef,
117 OleContainer_Release,
118 OleContainer_ParseDisplayName,
119 OleContainer_EnumObjects,
120 OleContainer_LockContainer
123 static IOleContainer OleContainer = { &OleContainerVtbl };
125 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
127 return QueryInterface(riid, ppv);
130 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
132 return 2;
135 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
137 return 1;
140 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
142 ok(0, "unexpected call\n");
143 return E_NOTIMPL;
146 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAsign, DWORD dwWhichMoniker,
147 IMoniker **ppmon)
149 ok(0, "unexpected call\n");
150 return E_NOTIMPL;
153 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
155 CHECK_EXPECT(GetContainer);
157 ok(ppContainer != NULL, "ppContainer == NULL\n");
158 if(ppContainer)
159 *ppContainer = &OleContainer;
161 return S_OK;
164 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
166 CHECK_EXPECT(ShowObject);
167 return S_OK;
170 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
172 ok(0, "unexpected call\n");
173 return E_NOTIMPL;
176 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
178 ok(0, "unexpected call\n");
179 return E_NOTIMPL;
182 static const IOleClientSiteVtbl ClientSiteVtbl = {
183 ClientSite_QueryInterface,
184 ClientSite_AddRef,
185 ClientSite_Release,
186 ClientSite_SaveObject,
187 ClientSite_GetMoniker,
188 ClientSite_GetContainer,
189 ClientSite_ShowObject,
190 ClientSite_OnShowWindow,
191 ClientSite_RequestNewObjectLayout
194 static HRESULT WINAPI InPlaceUIWindow_QueryInterface(IOleInPlaceFrame *iface,
195 REFIID riid, void **ppv)
197 ok(0, "unexpected call\n");
198 return E_NOINTERFACE;
201 static ULONG WINAPI InPlaceUIWindow_AddRef(IOleInPlaceFrame *iface)
203 return 2;
206 static ULONG WINAPI InPlaceUIWindow_Release(IOleInPlaceFrame *iface)
208 return 1;
211 static HRESULT WINAPI InPlaceUIWindow_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
213 ok(0, "unexpected call\n");
214 return E_NOTIMPL;
217 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
219 CHECK_EXPECT(Frame_GetWindow);
220 ok(phwnd != NULL, "phwnd == NULL\n");
221 if(phwnd)
222 *phwnd = container_hwnd;
223 return S_OK;
226 static HRESULT WINAPI InPlaceUIWindow_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
228 ok(0, "unexpected call\n");
229 return E_NOTIMPL;
232 static HRESULT WINAPI InPlaceUIWindow_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
234 ok(0, "unexpected call\n");
235 return E_NOTIMPL;
238 static HRESULT WINAPI InPlaceUIWindow_RequestBorderSpace(IOleInPlaceFrame *iface,
239 LPCBORDERWIDTHS pborderwidths)
241 ok(0, "unexpected call\n");
242 return E_NOTIMPL;
245 static HRESULT WINAPI InPlaceUIWindow_SetBorderSpace(IOleInPlaceFrame *iface,
246 LPCBORDERWIDTHS pborderwidths)
248 ok(0, "unexpected call\n");
249 return E_NOTIMPL;
252 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
253 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
255 CHECK_EXPECT(UIWindow_SetActiveObject);
256 ok(pActiveObject != NULL, "pActiveObject = NULL\n");
257 ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
258 return S_OK;
261 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
262 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
264 CHECK_EXPECT(Frame_SetActiveObject);
265 ok(pActiveObject != NULL, "pActiveObject = NULL\n");
266 ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
267 return S_OK;
270 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
271 LPOLEMENUGROUPWIDTHS lpMenuWidths)
273 ok(0, "unexpected call\n");
274 return E_NOTIMPL;
277 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
278 HOLEMENU holemenu, HWND hwndActiveObject)
280 CHECK_EXPECT(SetMenu);
281 ok(hmenuShared == NULL, "hmenuShared=%p\n", hmenuShared);
282 ok(holemenu == NULL, "holemenu=%p\n", holemenu);
283 ok(hwndActiveObject == shell_embedding_hwnd, "hwndActiveObject=%p, expected %p\n",
284 hwndActiveObject, shell_embedding_hwnd);
285 return S_OK;
288 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
290 ok(0, "unexpected call\n");
291 return E_NOTIMPL;
294 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
296 ok(0, "unexpected call\n");
297 return E_NOTIMPL;
300 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
302 ok(0, "unexpected call\n");
303 return E_NOTIMPL;
306 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
308 ok(0, "unexpected call\n");
309 return E_NOTIMPL;
312 static const IOleInPlaceFrameVtbl InPlaceUIWindowVtbl = {
313 InPlaceUIWindow_QueryInterface,
314 InPlaceUIWindow_AddRef,
315 InPlaceUIWindow_Release,
316 InPlaceUIWindow_GetWindow,
317 InPlaceUIWindow_ContextSensitiveHelp,
318 InPlaceUIWindow_GetBorder,
319 InPlaceUIWindow_RequestBorderSpace,
320 InPlaceUIWindow_SetBorderSpace,
321 InPlaceUIWindow_SetActiveObject,
324 static IOleInPlaceUIWindow InPlaceUIWindow = { (IOleInPlaceUIWindowVtbl*)&InPlaceUIWindowVtbl };
326 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = {
327 InPlaceUIWindow_QueryInterface,
328 InPlaceUIWindow_AddRef,
329 InPlaceUIWindow_Release,
330 InPlaceFrame_GetWindow,
331 InPlaceUIWindow_ContextSensitiveHelp,
332 InPlaceUIWindow_GetBorder,
333 InPlaceUIWindow_RequestBorderSpace,
334 InPlaceUIWindow_SetBorderSpace,
335 InPlaceFrame_SetActiveObject,
336 InPlaceFrame_InsertMenus,
337 InPlaceFrame_SetMenu,
338 InPlaceFrame_RemoveMenus,
339 InPlaceFrame_SetStatusText,
340 InPlaceFrame_EnableModeless,
341 InPlaceFrame_TranslateAccelerator
344 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
346 static IOleClientSite ClientSite = { &ClientSiteVtbl };
348 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
350 return QueryInterface(riid, ppv);
353 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
355 return 2;
358 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSiteEx *iface)
360 return 1;
363 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
365 CHECK_EXPECT(Site_GetWindow);
366 ok(phwnd != NULL, "phwnd == NULL\n");
367 if(phwnd)
368 *phwnd = container_hwnd;
369 return S_OK;
372 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
374 ok(0, "unexpected call\n");
375 return E_NOTIMPL;
378 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
380 CHECK_EXPECT(CanInPlaceActivate);
381 return S_OK;
384 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
386 CHECK_EXPECT(OnInPlaceActivate);
387 return S_OK;
390 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
392 CHECK_EXPECT(OnUIActivate);
393 return S_OK;
396 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
397 IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
398 LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
400 static const RECT pos_rect = {2,1,1002,901};
401 static const RECT clip_rect = {10,10,990,890};
403 CHECK_EXPECT(GetWindowContext);
405 ok(ppFrame != NULL, "ppFrame = NULL\n");
406 if(ppFrame)
407 *ppFrame = &InPlaceFrame;
409 ok(ppDoc != NULL, "ppDoc = NULL\n");
410 if(ppDoc)
411 *ppDoc = &InPlaceUIWindow;
413 ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
414 if(lprcPosRect)
415 memcpy(lprcPosRect, &pos_rect, sizeof(RECT));
417 ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
418 if(lprcClipRect)
419 memcpy(lprcClipRect, &clip_rect, sizeof(RECT));
421 ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n");
422 if(lpFrameInfo) {
423 lpFrameInfo->cb = sizeof(*lpFrameInfo);
424 lpFrameInfo->fMDIApp = FALSE;
425 lpFrameInfo->hwndFrame = container_hwnd;
426 lpFrameInfo->haccel = NULL;
427 lpFrameInfo->cAccelEntries = 0;
430 return S_OK;
433 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtant)
435 ok(0, "unexpected call\n");
436 return E_NOTIMPL;
439 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
441 ok(0, "unexpected call\n");
442 return E_NOTIMPL;
445 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
447 ok(0, "unexpected call\n");
448 return E_NOTIMPL;
451 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
453 ok(0, "unexpected call\n");
454 return E_NOTIMPL;
457 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
459 ok(0, "unexpected call\n");
460 return E_NOTIMPL;
463 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
465 ok(0, "unexpected call\n");
466 return E_NOTIMPL;
469 static HRESULT WINAPI InPlaceSite_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface,
470 BOOL *pNoRedraw, DWORD dwFlags)
472 ok(0, "unexpected call\n");
473 return E_NOTIMPL;
476 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface,
477 BOOL fNoRedraw)
479 ok(0, "unexpected call\n");
480 return E_NOTIMPL;
483 static HRESULT WINAPI InPlaceSite_RequestUIActivate(IOleInPlaceSiteEx *iface)
485 ok(0, "unexpected call\n");
486 return S_OK;
489 static const IOleInPlaceSiteExVtbl InPlaceSiteExVtbl = {
490 InPlaceSite_QueryInterface,
491 InPlaceSite_AddRef,
492 InPlaceSite_Release,
493 InPlaceSite_GetWindow,
494 InPlaceSite_ContextSensitiveHelp,
495 InPlaceSite_CanInPlaceActivate,
496 InPlaceSite_OnInPlaceActivate,
497 InPlaceSite_OnUIActivate,
498 InPlaceSite_GetWindowContext,
499 InPlaceSite_Scroll,
500 InPlaceSite_OnUIDeactivate,
501 InPlaceSite_OnInPlaceDeactivate,
502 InPlaceSite_DiscardUndoState,
503 InPlaceSite_DeactivateAndUndo,
504 InPlaceSite_OnPosRectChange,
505 InPlaceSite_OnInPlaceActivateEx,
506 InPlaceSite_OnInPlaceDeactivateEx,
507 InPlaceSite_RequestUIActivate
510 static IOleInPlaceSiteEx InPlaceSite = { &InPlaceSiteExVtbl };
512 static HRESULT QueryInterface(REFIID riid, void **ppv)
514 *ppv = NULL;
516 if(IsEqualGUID(&IID_IUnknown, riid)
517 || IsEqualGUID(&IID_IOleClientSite, riid))
518 *ppv = &ClientSite;
519 else if(IsEqualGUID(&IID_IOleWindow, riid)
520 || IsEqualGUID(&IID_IOleInPlaceSite, riid)
521 || IsEqualGUID(&IID_IOleInPlaceSiteEx, riid))
522 *ppv = &InPlaceSite;
524 if(*ppv)
525 return S_OK;
527 return E_NOINTERFACE;
530 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
532 return DefWindowProcW(hwnd, msg, wParam, lParam);
535 static HWND create_container_window(void)
537 static const WCHAR wszWebBrowserContainer[] =
538 {'W','e','b','B','r','o','w','s','e','r','C','o','n','t','a','i','n','e','r',0};
539 static WNDCLASSEXW wndclass = {
540 sizeof(WNDCLASSEXW),
542 wnd_proc,
543 0, 0, NULL, NULL, NULL, NULL, NULL,
544 wszWebBrowserContainer,
545 NULL
548 RegisterClassExW(&wndclass);
549 return CreateWindowW(wszWebBrowserContainer, wszWebBrowserContainer,
550 WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
551 CW_USEDEFAULT, NULL, NULL, NULL, NULL);
554 static void test_DoVerb(IUnknown *unk)
556 IOleObject *oleobj;
557 RECT rect = {0,0,1000,1000};
558 HRESULT hres;
560 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
561 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08lx\n", hres);
562 if(FAILED(hres))
563 return;
565 SET_EXPECT(CanInPlaceActivate);
566 SET_EXPECT(Site_GetWindow);
567 SET_EXPECT(OnInPlaceActivate);
568 SET_EXPECT(GetWindowContext);
569 SET_EXPECT(ShowObject);
570 SET_EXPECT(GetContainer);
571 SET_EXPECT(Frame_GetWindow);
572 SET_EXPECT(OnUIActivate);
573 SET_EXPECT(Frame_SetActiveObject);
574 SET_EXPECT(UIWindow_SetActiveObject);
575 SET_EXPECT(SetMenu);
577 hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
578 0, container_hwnd, &rect);
579 ok(hres == S_OK, "DoVerb failed: %08lx\n", hres);
581 CHECK_CALLED(CanInPlaceActivate);
582 CHECK_CALLED(Site_GetWindow);
583 CHECK_CALLED(OnInPlaceActivate);
584 CHECK_CALLED(GetWindowContext);
585 CHECK_CALLED(ShowObject);
586 CHECK_CALLED(GetContainer);
587 CHECK_CALLED(Frame_GetWindow);
588 CHECK_CALLED(OnUIActivate);
589 CHECK_CALLED(Frame_SetActiveObject);
590 CHECK_CALLED(UIWindow_SetActiveObject);
591 CHECK_CALLED(SetMenu);
593 hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
594 0, container_hwnd, &rect);
595 ok(hres == S_OK, "DoVerb failed: %08lx\n", hres);
597 IOleObject_Release(oleobj);
600 static void test_GetMiscStatus(IOleObject *oleobj)
602 DWORD st, i;
603 HRESULT hres;
605 for(i=0; i<10; i++) {
606 st = 0xdeadbeef;
607 hres = IOleObject_GetMiscStatus(oleobj, i, &st);
608 ok(hres == S_OK, "GetMiscStatus failed: %08lx\n", hres);
609 ok(st == (OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT
610 |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE),
611 "st=%08lx, expected OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|"
612 "OLEMISC_INSIDEOUT|OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE)\n", st);
616 static void test_ClientSite(IUnknown *unk, IOleClientSite *client)
618 IOleObject *oleobj;
619 IOleInPlaceObject *inplace;
620 HWND hwnd;
621 HRESULT hres;
623 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
624 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08lx\n", hres);
625 if(FAILED(hres))
626 return;
628 test_GetMiscStatus(oleobj);
630 hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceObject, (void**)&inplace);
631 ok(hres == S_OK, "QueryInterface(IID_OleInPlaceObject) failed: %08lx\n", hres);
632 if(FAILED(hres)) {
633 IOleObject_Release(oleobj);
634 return;
637 hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
638 ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
639 ok((hwnd == NULL) ^ (client == NULL), "unexpected hwnd %p\n", hwnd);
641 if(client) {
642 SET_EXPECT(GetContainer);
643 SET_EXPECT(Site_GetWindow);
646 hres = IOleObject_SetClientSite(oleobj, client);
647 ok(hres == S_OK, "SetClientSite failed: %08lx\n", hres);
649 if(client) {
650 CHECK_CALLED(GetContainer);
651 CHECK_CALLED(Site_GetWindow);
654 hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
655 ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
656 ok((hwnd == NULL) == (client == NULL), "unexpected hwnd %p\n", hwnd);
658 shell_embedding_hwnd = hwnd;
660 IOleInPlaceObject_Release(inplace);
661 IOleObject_Release(oleobj);
664 static void test_ClassInfo(IUnknown *unk)
666 IProvideClassInfo2 *class_info;
667 GUID guid;
668 HRESULT hres;
670 hres = IUnknown_QueryInterface(unk, &IID_IProvideClassInfo2, (void**)&class_info);
671 ok(hres == S_OK, "QueryInterface(IID_IProvideClassInfo) failed: %08lx\n", hres);
672 if(FAILED(hres))
673 return;
675 hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, &guid);
676 ok(hres == S_OK, "GetGUID failed: %08lx\n", hres);
677 ok(IsEqualGUID(&DIID_DWebBrowserEvents2, &guid), "wrong guid\n");
679 hres = IProvideClassInfo2_GetGUID(class_info, 0, &guid);
680 ok(hres == E_FAIL, "GetGUID failed: %08lx, expected E_FAIL\n", hres);
681 ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
683 hres = IProvideClassInfo2_GetGUID(class_info, 2, &guid);
684 ok(hres == E_FAIL, "GetGUID failed: %08lx, expected E_FAIL\n", hres);
685 ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
687 hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, NULL);
688 ok(hres == E_POINTER, "GetGUID failed: %08lx, expected E_POINTER\n", hres);
690 hres = IProvideClassInfo2_GetGUID(class_info, 0, NULL);
691 ok(hres == E_POINTER, "GetGUID failed: %08lx, expected E_POINTER\n", hres);
693 IProvideClassInfo2_Release(class_info);
696 static void test_ie_funcs(IUnknown *unk)
698 IWebBrowser2 *wb;
699 VARIANT_BOOL b;
700 int i;
701 long hwnd;
702 HRESULT hres;
704 hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
705 ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08lx\n", hres);
706 if(FAILED(hres))
707 return;
709 /* HWND */
711 hwnd = 0xdeadbeef;
712 hres = IWebBrowser2_get_HWND(wb, &hwnd);
713 ok(hres == E_FAIL, "get_HWND failed: %08lx, expected E_FAIL\n", hres);
714 ok(hwnd == 0, "unexpected hwnd %lx\n", hwnd);
716 /* MenuBar */
718 hres = IWebBrowser2_get_MenuBar(wb, &b);
719 ok(hres == S_OK, "get_MenuBar failed: %08lx\n", hres);
720 ok(b == VARIANT_TRUE, "b=%x\n", b);
722 hres = IWebBrowser2_put_MenuBar(wb, VARIANT_FALSE);
723 ok(hres == S_OK, "put_MenuBar failed: %08lx\n", hres);
725 hres = IWebBrowser2_get_MenuBar(wb, &b);
726 ok(hres == S_OK, "get_MenuBar failed: %08lx\n", hres);
727 ok(b == VARIANT_FALSE, "b=%x\n", b);
729 hres = IWebBrowser2_put_MenuBar(wb, 100);
730 ok(hres == S_OK, "put_MenuBar failed: %08lx\n", hres);
732 hres = IWebBrowser2_get_MenuBar(wb, &b);
733 ok(hres == S_OK, "get_MenuBar failed: %08lx\n", hres);
734 ok(b == VARIANT_TRUE, "b=%x\n", b);
736 /* AddressBar */
738 hres = IWebBrowser2_get_AddressBar(wb, &b);
739 ok(hres == S_OK, "get_AddressBar failed: %08lx\n", hres);
740 ok(b == VARIANT_TRUE, "b=%x\n", b);
742 hres = IWebBrowser2_put_AddressBar(wb, VARIANT_FALSE);
743 ok(hres == S_OK, "put_AddressBar failed: %08lx\n", hres);
745 hres = IWebBrowser2_get_AddressBar(wb, &b);
746 ok(hres == S_OK, "get_MenuBar failed: %08lx\n", hres);
747 ok(b == VARIANT_FALSE, "b=%x\n", b);
749 hres = IWebBrowser2_put_AddressBar(wb, 100);
750 ok(hres == S_OK, "put_AddressBar failed: %08lx\n", hres);
752 hres = IWebBrowser2_get_AddressBar(wb, &b);
753 ok(hres == S_OK, "get_AddressBar failed: %08lx\n", hres);
754 ok(b == VARIANT_TRUE, "b=%x\n", b);
756 hres = IWebBrowser2_put_AddressBar(wb, VARIANT_TRUE);
757 ok(hres == S_OK, "put_MenuBar failed: %08lx\n", hres);
759 /* StatusBar */
761 hres = IWebBrowser2_get_StatusBar(wb, &b);
762 ok(hres == S_OK, "get_StatusBar failed: %08lx\n", hres);
763 ok(b == VARIANT_TRUE, "b=%x\n", b);
765 hres = IWebBrowser2_put_StatusBar(wb, VARIANT_TRUE);
766 ok(hres == S_OK, "put_StatusBar failed: %08lx\n", hres);
768 hres = IWebBrowser2_get_StatusBar(wb, &b);
769 ok(hres == S_OK, "get_StatusBar failed: %08lx\n", hres);
770 ok(b == VARIANT_TRUE, "b=%x\n", b);
772 hres = IWebBrowser2_put_StatusBar(wb, VARIANT_FALSE);
773 ok(hres == S_OK, "put_StatusBar failed: %08lx\n", hres);
775 hres = IWebBrowser2_get_StatusBar(wb, &b);
776 ok(hres == S_OK, "get_StatusBar failed: %08lx\n", hres);
777 ok(b == VARIANT_FALSE, "b=%x\n", b);
779 hres = IWebBrowser2_put_StatusBar(wb, 100);
780 ok(hres == S_OK, "put_StatusBar failed: %08lx\n", hres);
782 hres = IWebBrowser2_get_StatusBar(wb, &b);
783 ok(hres == S_OK, "get_StatusBar failed: %08lx\n", hres);
784 ok(b == VARIANT_TRUE, "b=%x\n", b);
786 /* ToolBar */
788 hres = IWebBrowser2_get_ToolBar(wb, &i);
789 ok(hres == S_OK, "get_ToolBar failed: %08lx\n", hres);
790 ok(i == VARIANT_TRUE, "i=%x\n", i);
792 hres = IWebBrowser2_put_ToolBar(wb, VARIANT_FALSE);
793 ok(hres == S_OK, "put_ToolBar failed: %08lx\n", hres);
795 hres = IWebBrowser2_get_ToolBar(wb, &i);
796 ok(hres == S_OK, "get_ToolBar failed: %08lx\n", hres);
797 ok(i == VARIANT_FALSE, "b=%x\n", i);
799 hres = IWebBrowser2_put_ToolBar(wb, 100);
800 ok(hres == S_OK, "put_ToolBar failed: %08lx\n", hres);
802 hres = IWebBrowser2_get_ToolBar(wb, &i);
803 ok(hres == S_OK, "get_ToolBar failed: %08lx\n", hres);
804 ok(i == VARIANT_TRUE, "i=%x\n", i);
806 hres = IWebBrowser2_put_ToolBar(wb, VARIANT_TRUE);
807 ok(hres == S_OK, "put_ToolBar failed: %08lx\n", hres);
809 IWebBrowser2_Release(wb);
812 static void test_Silent(IUnknown *unk)
814 IWebBrowser2 *wb;
815 VARIANT_BOOL b;
816 HRESULT hres;
818 hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
819 ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08lx\n", hres);
820 if(FAILED(hres))
821 return;
823 b = 100;
824 hres = IWebBrowser2_get_Silent(wb, &b);
825 ok(hres == S_OK, "get_Silent failed: %08lx\n", hres);
826 ok(b == VARIANT_FALSE, "b=%x\n", b);
828 hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
829 ok(hres == S_OK, "set_Silent failed: %08lx\n", hres);
831 b = 100;
832 hres = IWebBrowser2_get_Silent(wb, &b);
833 ok(hres == S_OK, "get_Silent failed: %08lx\n", hres);
834 ok(b == VARIANT_TRUE, "b=%x\n", b);
836 hres = IWebBrowser2_put_Silent(wb, 100);
837 ok(hres == S_OK, "set_Silent failed: %08lx\n", hres);
839 b = 100;
840 hres = IWebBrowser2_get_Silent(wb, &b);
841 ok(hres == S_OK, "get_Silent failed: %08lx\n", hres);
842 ok(b == VARIANT_TRUE, "b=%x\n", b);
844 hres = IWebBrowser2_put_Silent(wb, VARIANT_FALSE);
845 ok(hres == S_OK, "set_Silent failed: %08lx\n", hres);
847 b = 100;
848 hres = IWebBrowser2_get_Silent(wb, &b);
849 ok(hres == S_OK, "get_Silent failed: %08lx\n", hres);
850 ok(b == VARIANT_FALSE, "b=%x\n", b);
852 IWebBrowser_Release(wb);
855 static void test_GetControlInfo(IUnknown *unk)
857 IOleControl *control;
858 CONTROLINFO info;
859 HRESULT hres;
861 hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
862 ok(hres == S_OK, "Could not get IOleControl: %08lx\n", hres);
863 if(FAILED(hres))
864 return;
866 hres = IOleControl_GetControlInfo(control, &info);
867 ok(hres == E_NOTIMPL, "GetControlInfo failed: %08lx, exxpected E_NOTIMPL\n", hres);
868 hres = IOleControl_GetControlInfo(control, NULL);
869 ok(hres == E_NOTIMPL, "GetControlInfo failed: %08lx, exxpected E_NOTIMPL\n", hres);
871 IOleControl_Release(control);
874 static void test_Extent(IUnknown *unk)
876 IOleObject *oleobj;
877 SIZE size;
878 HRESULT hres;
880 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
881 ok(hres == S_OK, "Could not get IOleObkect: %08lx\n", hres);
882 if(FAILED(hres))
883 return;
885 size.cx = size.cy = 0xdeadbeef;
886 hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
887 ok(hres == S_OK, "GetExtent failed: %08lx\n", hres);
888 ok(size.cx == 1323 && size.cy == 529, "size = {%ld %ld}\n", size.cx, size.cy);
890 size.cx = 800;
891 size.cy = 700;
892 hres = IOleObject_SetExtent(oleobj, DVASPECT_CONTENT, &size);
893 ok(hres == S_OK, "SetExtent failed: %08lx\n", hres);
895 size.cx = size.cy = 0xdeadbeef;
896 hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
897 ok(hres == S_OK, "GetExtent failed: %08lx\n", hres);
898 ok(size.cx == 800 && size.cy == 700, "size = {%ld %ld}\n", size.cx, size.cy);
900 size.cx = size.cy = 0xdeadbeef;
901 hres = IOleObject_GetExtent(oleobj, 0, &size);
902 ok(hres == S_OK, "GetExtent failed: %08lx\n", hres);
903 ok(size.cx == 800 && size.cy == 700, "size = {%ld %ld}\n", size.cx, size.cy);
905 size.cx = 900;
906 size.cy = 800;
907 hres = IOleObject_SetExtent(oleobj, 0, &size);
908 ok(hres == S_OK, "SetExtent failed: %08lx\n", hres);
910 size.cx = size.cy = 0xdeadbeef;
911 hres = IOleObject_GetExtent(oleobj, 0, &size);
912 ok(hres == S_OK, "GetExtent failed: %08lx\n", hres);
913 ok(size.cx == 900 && size.cy == 800, "size = {%ld %ld}\n", size.cx, size.cy);
915 size.cx = size.cy = 0xdeadbeef;
916 hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
917 ok(hres == S_OK, "GetExtent failed: %08lx\n", hres);
918 ok(size.cx == 900 && size.cy == 800, "size = {%ld %ld}\n", size.cx, size.cy);
920 size.cx = 1000;
921 size.cy = 900;
922 hres = IOleObject_SetExtent(oleobj, 0xdeadbeef, &size);
923 ok(hres == S_OK, "SetExtent failed: %08lx\n", hres);
925 size.cx = size.cy = 0xdeadbeef;
926 hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
927 ok(hres == S_OK, "GetExtent failed: %08lx\n", hres);
928 ok(size.cx == 1000 && size.cy == 900, "size = {%ld %ld}\n", size.cx, size.cy);
930 size.cx = size.cy = 0xdeadbeef;
931 hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
932 ok(hres == S_OK, "GetExtent failed: %08lx\n", hres);
933 ok(size.cx == 1000 && size.cy == 900, "size = {%ld %ld}\n", size.cx, size.cy);
935 IOleObject_Release(oleobj);
938 static void test_WebBrowser(void)
940 IUnknown *unk = NULL;
941 ULONG ref;
942 HRESULT hres;
944 hres = CoCreateInstance(&CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
945 &IID_IUnknown, (void**)&unk);
946 ok(hres == S_OK, "CoCreateInterface failed: %08lx\n", hres);
947 if(FAILED(hres))
948 return;
950 test_ClassInfo(unk);
951 test_ClientSite(unk, &ClientSite);
952 test_Extent(unk);
953 test_DoVerb(unk);
954 test_ClientSite(unk, NULL);
955 test_ie_funcs(unk);
956 test_GetControlInfo(unk);
957 test_Silent(unk);
959 ref = IUnknown_Release(unk);
960 ok(ref == 0, "ref=%ld, expected 0\n", ref);
963 START_TEST(webbrowser)
965 container_hwnd = create_container_window();
967 OleInitialize(NULL);
969 test_WebBrowser();
971 OleUninitialize();