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
21 #include <wine/test.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) \
38 ok(expect_ ##func, "unexpected call " #func "\n"); \
39 expect_ ## func = FALSE; \
40 called_ ## func = TRUE; \
43 #define CHECK_EXPECT2(func) \
45 ok(expect_ ##func, "unexpected call " #func "\n"); \
46 called_ ## func = TRUE; \
49 #define CHECK_CALLED(func) \
51 ok(called_ ## func, "expected " #func "\n"); \
52 expect_ ## func = called_ ## func = FALSE; \
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");
84 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
89 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
94 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
95 LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut)
97 ok(0, "unexpected call\n");
101 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
102 IEnumUnknown **ppenum)
104 ok(0, "unexpected call\n");
108 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
110 ok(0, "unexpected call\n");
114 static const IOleContainerVtbl OleContainerVtbl = {
115 OleContainer_QueryInterface,
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)
135 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
140 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
142 ok(0, "unexpected call\n");
146 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAsign, DWORD dwWhichMoniker,
149 ok(0, "unexpected call\n");
153 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
155 CHECK_EXPECT(GetContainer);
157 ok(ppContainer != NULL, "ppContainer == NULL\n");
159 *ppContainer = &OleContainer;
164 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
166 CHECK_EXPECT(ShowObject);
170 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
172 ok(0, "unexpected call\n");
176 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
178 ok(0, "unexpected call\n");
182 static const IOleClientSiteVtbl ClientSiteVtbl = {
183 ClientSite_QueryInterface,
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)
206 static ULONG WINAPI InPlaceUIWindow_Release(IOleInPlaceFrame *iface)
211 static HRESULT WINAPI InPlaceUIWindow_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
213 ok(0, "unexpected call\n");
217 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
219 CHECK_EXPECT(Frame_GetWindow);
220 ok(phwnd != NULL, "phwnd == NULL\n");
222 *phwnd = container_hwnd;
226 static HRESULT WINAPI InPlaceUIWindow_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
228 ok(0, "unexpected call\n");
232 static HRESULT WINAPI InPlaceUIWindow_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
234 ok(0, "unexpected call\n");
238 static HRESULT WINAPI InPlaceUIWindow_RequestBorderSpace(IOleInPlaceFrame *iface,
239 LPCBORDERWIDTHS pborderwidths)
241 ok(0, "unexpected call\n");
245 static HRESULT WINAPI InPlaceUIWindow_SetBorderSpace(IOleInPlaceFrame *iface,
246 LPCBORDERWIDTHS pborderwidths)
248 ok(0, "unexpected call\n");
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");
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");
270 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
271 LPOLEMENUGROUPWIDTHS lpMenuWidths)
273 ok(0, "unexpected call\n");
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);
288 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
290 ok(0, "unexpected call\n");
294 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
296 ok(0, "unexpected call\n");
300 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
302 ok(0, "unexpected call\n");
306 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
308 ok(0, "unexpected call\n");
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)
358 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSiteEx *iface)
363 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
365 CHECK_EXPECT(Site_GetWindow);
366 ok(phwnd != NULL, "phwnd == NULL\n");
368 *phwnd = container_hwnd;
372 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
374 ok(0, "unexpected call\n");
378 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
380 CHECK_EXPECT(CanInPlaceActivate);
384 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
386 CHECK_EXPECT(OnInPlaceActivate);
390 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
392 CHECK_EXPECT(OnUIActivate);
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");
407 *ppFrame = &InPlaceFrame;
409 ok(ppDoc != NULL, "ppDoc = NULL\n");
411 *ppDoc = &InPlaceUIWindow;
413 ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
415 memcpy(lprcPosRect, &pos_rect, sizeof(RECT));
417 ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
419 memcpy(lprcClipRect, &clip_rect, sizeof(RECT));
421 ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n");
423 lpFrameInfo->cb = sizeof(*lpFrameInfo);
424 lpFrameInfo->fMDIApp = FALSE;
425 lpFrameInfo->hwndFrame = container_hwnd;
426 lpFrameInfo->haccel = NULL;
427 lpFrameInfo->cAccelEntries = 0;
433 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtant)
435 ok(0, "unexpected call\n");
439 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
441 ok(0, "unexpected call\n");
445 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
447 ok(0, "unexpected call\n");
451 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
453 ok(0, "unexpected call\n");
457 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
459 ok(0, "unexpected call\n");
463 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
465 ok(0, "unexpected call\n");
469 static HRESULT WINAPI InPlaceSite_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface,
470 BOOL *pNoRedraw, DWORD dwFlags)
472 ok(0, "unexpected call\n");
476 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface,
479 ok(0, "unexpected call\n");
483 static HRESULT WINAPI InPlaceSite_RequestUIActivate(IOleInPlaceSiteEx *iface)
485 ok(0, "unexpected call\n");
489 static const IOleInPlaceSiteExVtbl InPlaceSiteExVtbl = {
490 InPlaceSite_QueryInterface,
493 InPlaceSite_GetWindow,
494 InPlaceSite_ContextSensitiveHelp,
495 InPlaceSite_CanInPlaceActivate,
496 InPlaceSite_OnInPlaceActivate,
497 InPlaceSite_OnUIActivate,
498 InPlaceSite_GetWindowContext,
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)
516 if(IsEqualGUID(&IID_IUnknown, riid)
517 || IsEqualGUID(&IID_IOleClientSite, riid))
519 else if(IsEqualGUID(&IID_IOleWindow, riid)
520 || IsEqualGUID(&IID_IOleInPlaceSite, riid)
521 || IsEqualGUID(&IID_IOleInPlaceSiteEx, riid))
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 = {
543 0, 0, NULL, NULL, NULL, NULL, NULL,
544 wszWebBrowserContainer,
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)
557 RECT rect = {0,0,1000,1000};
560 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
561 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08lx\n", hres);
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);
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)
605 for(i=0; i<10; i++) {
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)
619 IOleInPlaceObject *inplace;
623 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
624 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08lx\n", hres);
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);
633 IOleObject_Release(oleobj);
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);
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);
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;
670 hres = IUnknown_QueryInterface(unk, &IID_IProvideClassInfo2, (void**)&class_info);
671 ok(hres == S_OK, "QueryInterface(IID_IProvideClassInfo) failed: %08lx\n", hres);
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_WebBrowser(void)
698 IUnknown *unk = NULL;
702 hres = CoCreateInstance(&CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
703 &IID_IUnknown, (void**)&unk);
704 ok(hres == S_OK, "CoCreateInterface failed: %08lx\n", hres);
709 test_ClientSite(unk, &ClientSite);
711 test_ClientSite(unk, NULL);
713 ref = IUnknown_Release(unk);
714 ok(ref == 0, "ref=%ld, expected 0\n", ref);
717 START_TEST(webbrowser)
719 container_hwnd = create_container_window();