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
22 #include <wine/test.h>
33 #define DEFINE_EXPECT(func) \
34 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
36 #define SET_EXPECT(func) \
37 expect_ ## func = TRUE
39 #define CHECK_EXPECT(func) \
41 ok(expect_ ##func, "unexpected call " #func "\n"); \
42 expect_ ## func = FALSE; \
43 called_ ## func = TRUE; \
46 #define CHECK_EXPECT2(func) \
48 ok(expect_ ##func, "unexpected call " #func "\n"); \
49 called_ ## func = TRUE; \
52 #define CHECK_CALLED(func) \
54 ok(called_ ## func, "expected " #func "\n"); \
55 expect_ ## func = called_ ## func = FALSE; \
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);
72 static const WCHAR wszItem[] = {'i','t','e','m',0};
74 static HWND container_hwnd, shell_embedding_hwnd;
76 static HRESULT QueryInterface(REFIID,void**);
78 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
80 if(IsEqualGUID(&IID_ITargetContainer, riid))
81 return E_NOINTERFACE; /* TODO */
82 if(IsEqualGUID(&IID_IOleCommandTarget, riid))
83 return E_NOINTERFACE; /* TODO */
85 ok(0, "unexpected call\n");
89 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
94 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
99 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
100 LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut)
102 ok(0, "unexpected call\n");
106 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
107 IEnumUnknown **ppenum)
109 ok(0, "unexpected call\n");
113 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
115 ok(0, "unexpected call\n");
119 static const IOleContainerVtbl OleContainerVtbl = {
120 OleContainer_QueryInterface,
122 OleContainer_Release,
123 OleContainer_ParseDisplayName,
124 OleContainer_EnumObjects,
125 OleContainer_LockContainer
128 static IOleContainer OleContainer = { &OleContainerVtbl };
130 static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
132 return QueryInterface(riid, ppv);
135 static ULONG WINAPI Dispatch_AddRef(IDispatch *iface)
140 static ULONG WINAPI Dispatch_Release(IDispatch *iface)
145 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
147 ok(0, "unexpected call\n");
151 static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
154 ok(0, "unexpected call\n");
158 static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
159 UINT cNames, LCID lcid, DISPID *rgDispId)
161 ok(0, "unexpected call\n");
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)
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);
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;
187 case DISPID_AMBIENT_SILENT:
188 CHECK_EXPECT(Invoke_AMBIENT_SILENT);
189 V_VT(pVarResult) = VT_BOOL;
190 V_BOOL(pVarResult) = VARIANT_FALSE;
194 ok(0, "unexpected dispIdMember %d\n", dispIdMember);
198 static IDispatchVtbl DispatchVtbl = {
199 Dispatch_QueryInterface,
202 Dispatch_GetTypeInfoCount,
203 Dispatch_GetTypeInfo,
204 Dispatch_GetIDsOfNames,
208 static IDispatch Dispatch = { &DispatchVtbl };
210 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
212 return QueryInterface(riid, ppv);
215 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
220 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
225 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
227 ok(0, "unexpected call\n");
231 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAsign, DWORD dwWhichMoniker,
234 ok(0, "unexpected call\n");
238 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
240 CHECK_EXPECT(GetContainer);
242 ok(ppContainer != NULL, "ppContainer == NULL\n");
244 *ppContainer = &OleContainer;
249 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
251 CHECK_EXPECT(ShowObject);
255 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
257 ok(0, "unexpected call\n");
261 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
263 ok(0, "unexpected call\n");
267 static const IOleClientSiteVtbl ClientSiteVtbl = {
268 ClientSite_QueryInterface,
271 ClientSite_SaveObject,
272 ClientSite_GetMoniker,
273 ClientSite_GetContainer,
274 ClientSite_ShowObject,
275 ClientSite_OnShowWindow,
276 ClientSite_RequestNewObjectLayout
279 static IOleClientSite ClientSite = { &ClientSiteVtbl };
281 static HRESULT WINAPI InPlaceUIWindow_QueryInterface(IOleInPlaceFrame *iface,
282 REFIID riid, void **ppv)
284 ok(0, "unexpected call\n");
285 return E_NOINTERFACE;
288 static ULONG WINAPI InPlaceUIWindow_AddRef(IOleInPlaceFrame *iface)
293 static ULONG WINAPI InPlaceUIWindow_Release(IOleInPlaceFrame *iface)
298 static HRESULT WINAPI InPlaceUIWindow_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
300 ok(0, "unexpected call\n");
304 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
306 CHECK_EXPECT(Frame_GetWindow);
307 ok(phwnd != NULL, "phwnd == NULL\n");
309 *phwnd = container_hwnd;
313 static HRESULT WINAPI InPlaceUIWindow_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
315 ok(0, "unexpected call\n");
319 static HRESULT WINAPI InPlaceUIWindow_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
321 ok(0, "unexpected call\n");
325 static HRESULT WINAPI InPlaceUIWindow_RequestBorderSpace(IOleInPlaceFrame *iface,
326 LPCBORDERWIDTHS pborderwidths)
328 ok(0, "unexpected call\n");
332 static HRESULT WINAPI InPlaceUIWindow_SetBorderSpace(IOleInPlaceFrame *iface,
333 LPCBORDERWIDTHS pborderwidths)
335 ok(0, "unexpected call\n");
339 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
340 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
342 CHECK_EXPECT(UIWindow_SetActiveObject);
343 ok(pActiveObject != NULL, "pActiveObject = NULL\n");
344 ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
348 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
349 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
351 CHECK_EXPECT(Frame_SetActiveObject);
352 ok(pActiveObject != NULL, "pActiveObject = NULL\n");
353 ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
357 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
358 LPOLEMENUGROUPWIDTHS lpMenuWidths)
360 ok(0, "unexpected call\n");
364 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
365 HOLEMENU holemenu, HWND hwndActiveObject)
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);
375 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
377 ok(0, "unexpected call\n");
381 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
383 ok(0, "unexpected call\n");
387 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
389 ok(0, "unexpected call\n");
393 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
395 ok(0, "unexpected call\n");
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,
411 static IOleInPlaceUIWindow InPlaceUIWindow = { (IOleInPlaceUIWindowVtbl*)&InPlaceUIWindowVtbl };
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
431 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
433 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
435 return QueryInterface(riid, ppv);
438 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
443 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSiteEx *iface)
448 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
450 CHECK_EXPECT(Site_GetWindow);
451 ok(phwnd != NULL, "phwnd == NULL\n");
453 *phwnd = container_hwnd;
457 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
459 ok(0, "unexpected call\n");
463 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
465 CHECK_EXPECT(CanInPlaceActivate);
469 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
471 CHECK_EXPECT(OnInPlaceActivate);
475 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
477 CHECK_EXPECT(OnUIActivate);
481 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
482 IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
483 LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
485 static const RECT pos_rect = {2,1,1002,901};
486 static const RECT clip_rect = {10,10,990,890};
488 CHECK_EXPECT(GetWindowContext);
490 ok(ppFrame != NULL, "ppFrame = NULL\n");
492 *ppFrame = &InPlaceFrame;
494 ok(ppDoc != NULL, "ppDoc = NULL\n");
496 *ppDoc = &InPlaceUIWindow;
498 ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
500 memcpy(lprcPosRect, &pos_rect, sizeof(RECT));
502 ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
504 memcpy(lprcClipRect, &clip_rect, sizeof(RECT));
506 ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n");
508 lpFrameInfo->cb = sizeof(*lpFrameInfo);
509 lpFrameInfo->fMDIApp = FALSE;
510 lpFrameInfo->hwndFrame = container_hwnd;
511 lpFrameInfo->haccel = NULL;
512 lpFrameInfo->cAccelEntries = 0;
518 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtant)
520 ok(0, "unexpected call\n");
524 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
526 ok(0, "unexpected call\n");
530 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
532 ok(0, "unexpected call\n");
536 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
538 ok(0, "unexpected call\n");
542 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
544 ok(0, "unexpected call\n");
548 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
550 ok(0, "unexpected call\n");
554 static HRESULT WINAPI InPlaceSite_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface,
555 BOOL *pNoRedraw, DWORD dwFlags)
557 ok(0, "unexpected call\n");
561 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface,
564 ok(0, "unexpected call\n");
568 static HRESULT WINAPI InPlaceSite_RequestUIActivate(IOleInPlaceSiteEx *iface)
570 ok(0, "unexpected call\n");
574 static const IOleInPlaceSiteExVtbl InPlaceSiteExVtbl = {
575 InPlaceSite_QueryInterface,
578 InPlaceSite_GetWindow,
579 InPlaceSite_ContextSensitiveHelp,
580 InPlaceSite_CanInPlaceActivate,
581 InPlaceSite_OnInPlaceActivate,
582 InPlaceSite_OnUIActivate,
583 InPlaceSite_GetWindowContext,
585 InPlaceSite_OnUIDeactivate,
586 InPlaceSite_OnInPlaceDeactivate,
587 InPlaceSite_DiscardUndoState,
588 InPlaceSite_DeactivateAndUndo,
589 InPlaceSite_OnPosRectChange,
590 InPlaceSite_OnInPlaceActivateEx,
591 InPlaceSite_OnInPlaceDeactivateEx,
592 InPlaceSite_RequestUIActivate
595 static IOleInPlaceSiteEx InPlaceSite = { &InPlaceSiteExVtbl };
597 static HRESULT WINAPI DocHostUIHandler_QueryInterface(IDocHostUIHandler2 *iface, REFIID riid, void **ppv)
599 return QueryInterface(riid, ppv);
602 static ULONG WINAPI DocHostUIHandler_AddRef(IDocHostUIHandler2 *iface)
607 static ULONG WINAPI DocHostUIHandler_Release(IDocHostUIHandler2 *iface)
612 static HRESULT WINAPI DocHostUIHandler_ShowContextMenu(IDocHostUIHandler2 *iface, DWORD dwID, POINT *ppt,
613 IUnknown *pcmdtReserved, IDispatch *pdicpReserved)
615 ok(0, "unexpected call %d %p %p %p\n", dwID, ppt, pcmdtReserved, pdicpReserved);
619 static HRESULT WINAPI DocHostUIHandler_GetHostInfo(IDocHostUIHandler2 *iface, DOCHOSTUIINFO *pInfo)
621 ok(0, "unexpected call\n");
625 static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD dwID,
626 IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget,
627 IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
629 ok(0, "unexpected call\n");
633 static HRESULT WINAPI DocHostUIHandler_HideUI(IDocHostUIHandler2 *iface)
635 ok(0, "unexpected call\n");
639 static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface)
641 ok(0, "unexpected call\n");
645 static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable)
647 ok(0, "unexpected call\n");
651 static HRESULT WINAPI DocHostUIHandler_OnDocWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
653 ok(0, "unexpected call\n");
657 static HRESULT WINAPI DocHostUIHandler_OnFrameWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
659 ok(0, "unexpected call\n");
663 static HRESULT WINAPI DocHostUIHandler_ResizeBorder(IDocHostUIHandler2 *iface, LPCRECT prcBorder,
664 IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
666 ok(0, "unexpected call\n");
670 static HRESULT WINAPI DocHostUIHandler_TranslateAccelerator(IDocHostUIHandler2 *iface, LPMSG lpMsg,
671 const GUID *pguidCmdGroup, DWORD nCmdID)
673 ok(0, "unexpected call\n");
677 static HRESULT WINAPI DocHostUIHandler_GetOptionKeyPath(IDocHostUIHandler2 *iface,
678 LPOLESTR *pchKey, DWORD dw)
680 ok(0, "unexpected call\n");
684 static HRESULT WINAPI DocHostUIHandler_GetDropTarget(IDocHostUIHandler2 *iface,
685 IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
687 ok(0, "unexpected call\n");
691 static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, IDispatch **ppDispatch)
693 ok(0, "unexpected call\n");
697 static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate,
698 OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
700 ok(0, "unexpected call\n");
704 static HRESULT WINAPI DocHostUIHandler_FilterDataObject(IDocHostUIHandler2 *iface, IDataObject *pDO,
705 IDataObject **ppPORet)
707 ok(0, "unexpected call\n");
711 static HRESULT WINAPI DocHostUIHandler_GetOverrideKeyPath(IDocHostUIHandler2 *iface,
712 LPOLESTR *pchKey, DWORD dw)
714 ok(0, "unexpected call\n");
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
740 static IDocHostUIHandler2 DocHostUIHandler = { &DocHostUIHandlerVtbl };
742 static HRESULT QueryInterface(REFIID riid, void **ppv)
746 if(IsEqualGUID(&IID_IUnknown, riid)
747 || IsEqualGUID(&IID_IOleClientSite, riid))
749 else if(IsEqualGUID(&IID_IOleWindow, riid)
750 || IsEqualGUID(&IID_IOleInPlaceSite, riid)
751 || IsEqualGUID(&IID_IOleInPlaceSiteEx, riid))
753 else if(IsEqualGUID(&IID_IDocHostUIHandler, riid)
754 || IsEqualGUID(&IID_IDocHostUIHandler2, riid))
755 *ppv = &DocHostUIHandler;
756 else if(IsEqualGUID(&IID_IDispatch, riid))
762 return E_NOINTERFACE;
765 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
767 return DefWindowProcW(hwnd, msg, wParam, lParam);
770 static HWND create_container_window(void)
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 = {
778 0, 0, NULL, NULL, NULL, NULL, NULL,
779 wszWebBrowserContainer,
783 RegisterClassExW(&wndclass);
784 return CreateWindowW(wszWebBrowserContainer, wszWebBrowserContainer,
785 WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
786 CW_USEDEFAULT, NULL, NULL, NULL, NULL);
789 static void test_DoVerb(IUnknown *unk)
792 RECT rect = {0,0,1000,1000};
795 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
796 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
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);
812 hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
813 0, (HWND)0xdeadbeef, &rect);
814 ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
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);
828 hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
829 0, (HWND)0xdeadbeef, &rect);
830 ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
832 IOleObject_Release(oleobj);
835 static void test_GetMiscStatus(IOleObject *oleobj)
840 for(i=0; i<10; i++) {
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);
851 static void test_ClientSite(IUnknown *unk, IOleClientSite *client)
854 IOleInPlaceObject *inplace;
858 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
859 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
863 test_GetMiscStatus(oleobj);
865 hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceObject, (void**)&inplace);
866 ok(hres == S_OK, "QueryInterface(IID_OleInPlaceObject) failed: %08x\n", hres);
868 IOleObject_Release(oleobj);
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);
877 SET_EXPECT(GetContainer);
878 SET_EXPECT(Site_GetWindow);
879 SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
880 SET_EXPECT(Invoke_AMBIENT_SILENT);
883 hres = IOleObject_SetClientSite(oleobj, client);
884 ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
887 CHECK_CALLED(GetContainer);
888 CHECK_CALLED(Site_GetWindow);
889 CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
890 CHECK_CALLED(Invoke_AMBIENT_SILENT);
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);
897 shell_embedding_hwnd = hwnd;
899 IOleInPlaceObject_Release(inplace);
900 IOleObject_Release(oleobj);
903 static void test_ClassInfo(IUnknown *unk)
905 IProvideClassInfo2 *class_info;
909 hres = IUnknown_QueryInterface(unk, &IID_IProvideClassInfo2, (void**)&class_info);
910 ok(hres == S_OK, "QueryInterface(IID_IProvideClassInfo) failed: %08x\n", hres);
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");
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");
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");
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);
929 hres = IProvideClassInfo2_GetGUID(class_info, 0, NULL);
930 ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
932 IProvideClassInfo2_Release(class_info);
935 static void test_ie_funcs(IUnknown *unk)
943 hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
944 ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
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);
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);
961 hres = IWebBrowser2_put_MenuBar(wb, VARIANT_FALSE);
962 ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
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);
968 hres = IWebBrowser2_put_MenuBar(wb, 100);
969 ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
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);
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);
981 hres = IWebBrowser2_put_AddressBar(wb, VARIANT_FALSE);
982 ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
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);
988 hres = IWebBrowser2_put_AddressBar(wb, 100);
989 ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
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);
995 hres = IWebBrowser2_put_AddressBar(wb, VARIANT_TRUE);
996 ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
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);
1004 hres = IWebBrowser2_put_StatusBar(wb, VARIANT_TRUE);
1005 ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
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);
1011 hres = IWebBrowser2_put_StatusBar(wb, VARIANT_FALSE);
1012 ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
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);
1018 hres = IWebBrowser2_put_StatusBar(wb, 100);
1019 ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
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);
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);
1031 hres = IWebBrowser2_put_ToolBar(wb, VARIANT_FALSE);
1032 ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
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);
1038 hres = IWebBrowser2_put_ToolBar(wb, 100);
1039 ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
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);
1045 hres = IWebBrowser2_put_ToolBar(wb, VARIANT_TRUE);
1046 ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1048 IWebBrowser2_Release(wb);
1051 static void test_Silent(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
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);
1061 hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
1062 ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
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);
1069 hres = IWebBrowser2_put_Silent(wb, 100);
1070 ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
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);
1077 hres = IWebBrowser2_put_Silent(wb, VARIANT_FALSE);
1078 ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
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);
1086 hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
1087 ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1089 SET_EXPECT(Invoke_AMBIENT_SILENT);
1092 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_SILENT);
1093 ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
1096 CHECK_CALLED(Invoke_AMBIENT_SILENT);
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);
1104 static void test_Offline(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
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);
1114 hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
1115 ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
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);
1122 hres = IWebBrowser2_put_Offline(wb, 100);
1123 ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
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);
1130 hres = IWebBrowser2_put_Offline(wb, VARIANT_FALSE);
1131 ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
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);
1139 hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
1140 ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1142 SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1145 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
1146 ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
1149 CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
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);
1157 static void test_wb_funcs(IUnknown *unk, BOOL is_clientsite)
1160 IOleControl *control;
1163 hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
1164 ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
1166 hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1167 ok(hres == S_OK, "Could not get IOleControl interface: %08x\n", hres);
1169 test_Silent(wb, control, is_clientsite);
1170 test_Offline(wb, control, is_clientsite);
1172 IWebBrowser_Release(wb);
1173 IOleControl_Release(control);
1176 static void test_GetControlInfo(IUnknown *unk)
1178 IOleControl *control;
1182 hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1183 ok(hres == S_OK, "Could not get IOleControl: %08x\n", hres);
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);
1192 IOleControl_Release(control);
1195 static void test_Extent(IUnknown *unk)
1201 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1202 ok(hres == S_OK, "Could not get IOleObkect: %08x\n", hres);
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);
1213 hres = IOleObject_SetExtent(oleobj, DVASPECT_CONTENT, &size);
1214 ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
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);
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);
1228 hres = IOleObject_SetExtent(oleobj, 0, &size);
1229 ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
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);
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);
1243 hres = IOleObject_SetExtent(oleobj, 0xdeadbeef, &size);
1244 ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
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);
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);
1256 IOleObject_Release(oleobj);
1259 static void test_QueryInterface(IUnknown *unk)
1261 IQuickActivate *qa = (IQuickActivate*)0xdeadbeef;
1262 IRunnableObject *runnable = (IRunnableObject*)0xdeadbeef;
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);
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);
1274 static void test_WebBrowser(void)
1276 IUnknown *unk = NULL;
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);
1286 test_QueryInterface(unk);
1287 test_ClassInfo(unk);
1288 test_ClientSite(unk, &ClientSite);
1290 test_wb_funcs(unk, TRUE);
1292 test_ClientSite(unk, NULL);
1294 test_GetControlInfo(unk);
1295 test_wb_funcs(unk, FALSE);
1297 ref = IUnknown_Release(unk);
1298 ok(ref == 0, "ref=%d, expected 0\n", ref);
1301 START_TEST(webbrowser)
1303 container_hwnd = create_container_window();
1305 OleInitialize(NULL);