2 * Unit tests for the Explorer Browser control
4 * Copyright 2010 David Hedberg
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
28 #include "wine/test.h"
33 /**********************************************************************
34 * Some IID's for test_SetSite.
36 DEFINE_GUID(IID_IBrowserSettings, 0xDD1E21CC, 0xE2C7, 0x402C, 0xBF,0x05, 0x10,0x32,0x8D,0x3F,0x6B,0xAD);
37 DEFINE_GUID(IID_IShellBrowserService, 0xDFBC7E30, 0xF9E5, 0x455F, 0x88,0xF8, 0xFA,0x98,0xC1,0xE4,0x94,0xCA);
38 DEFINE_GUID(IID_IShellTaskScheduler, 0x6CCB7BE0, 0x6807, 0x11D0, 0xB8,0x10, 0x00,0xC0,0x4F,0xD7,0x06,0xEC);
39 DEFINE_GUID(IID_IBrowserWithActivationNotification,
40 0x6DB89131, 0x7B4C, 0x4E1C, 0x8B,0x01, 0x5D,0x31,0x2C,0x9C,0x73,0x88);
41 DEFINE_GUID(IID_ILayoutModifier, 0x90B4135A, 0x95BA, 0x46EA, 0x8C,0xAA, 0xE0,0x5B,0x45,0xCD,0x80,0x1E);
42 DEFINE_GUID(CLSID_Desktop, 0x00021400, 0x0000, 0x0000, 0xC0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
43 DEFINE_GUID(IID_IFileDialogPrivate, 0xAC92FFC5, 0xF0E9, 0x455A, 0x90,0x6B, 0x4A,0x83,0xE7,0x4A,0x80,0x3B);
44 DEFINE_GUID(IID_IWebbrowserApp, 0x0002df05, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
45 DEFINE_GUID(IID_IBrowserSettings_Vista, 0xF81B80BC, 0x29D1, 0x4734, 0xB5,0x15, 0x77,0x24,0xBF,0xF1,0x60,0x01);
46 DEFINE_GUID(IID_IFolderTypeModifier, 0x04BA120E, 0xAD52, 0x4A2D, 0x98,0x07, 0x2D,0xA1,0x78,0xD0,0xC3,0xE1);
47 DEFINE_GUID(IID_IShellBrowserService_Vista, 0xF5A24314, 0x5B8B, 0x44FA, 0xBC,0x2E, 0x31,0x28,0x55,0x44,0xB5,0x20);
48 DEFINE_GUID(IID_IFileDialogPrivate_Vista, 0x2539E31C, 0x857F, 0x43C4, 0x88,0x72, 0x45,0xBD,0x6A,0x02,0x48,0x92);
49 DEFINE_GUID(SID_SMenuBandParent, 0x8C278EEC, 0x3EAB, 0x11D1, 0x8C,0xB0 ,0x00,0xC0,0x4F,0xD9,0x18,0xD0);
50 DEFINE_GUID(SID_SMenuPopup, 0xD1E7AFEB, 0x6A2E, 0x11D0, 0x8C,0x78, 0x00,0xC0,0x4F,0xD9,0x18,0xB4);
51 DEFINE_GUID(IID_IShellMenu, 0xEE1F7637, 0xE138, 0x11D1, 0x83,0x79, 0x00,0xC0,0x4F,0xD9,0x18,0xD0);
53 DEFINE_GUID(IID_UnknownInterface1, 0x3934E4C2, 0x8143, 0x4E4C, 0xA1,0xDC, 0x71,0x8F,0x85,0x63,0xF3,0x37);
54 DEFINE_GUID(IID_UnknownInterface2, 0x3E24A11C, 0x15B2, 0x4F71, 0xB8,0x1E, 0x00,0x8F,0x77,0x99,0x8E,0x9F);
55 DEFINE_GUID(IID_UnknownInterface3, 0xE38FE0F3, 0x3DB0, 0x47EE, 0xA3,0x14, 0x25,0xCF,0x7F,0x4B,0xF5,0x21);
56 DEFINE_GUID(IID_UnknownInterface4, 0xFAD451C2, 0xAF58, 0x4161, 0xB9,0xFF, 0x57,0xAF,0xBB,0xED,0x0A,0xD2);
57 DEFINE_GUID(IID_UnknownInterface5, 0xF80C2137, 0x5829, 0x4CE9, 0x9F,0x81, 0xA9,0x5E,0x15,0x9D,0xD8,0xD5);
58 DEFINE_GUID(IID_UnknownInterface6, 0xD7F81F62, 0x491F, 0x49BC, 0x89,0x1D, 0x56,0x65,0x08,0x5D,0xF9,0x69);
59 DEFINE_GUID(IID_UnknownInterface7, 0x68A4FDBA, 0xA48A, 0x4A86, 0xA3,0x29, 0x1B,0x69,0xB9,0xB1,0x9E,0x89);
60 DEFINE_GUID(IID_UnknownInterface8, 0xD3B1CAF5, 0xEC4F, 0x4B2E, 0xBC,0xB0, 0x60,0xD7,0x15,0xC9,0x3C,0xB2);
61 DEFINE_GUID(IID_UnknownInterface9, 0x9536CA39, 0x1ACB, 0x4AE6, 0xAD,0x27, 0x24,0x03,0xD0,0x4C,0xA2,0x8F);
62 DEFINE_GUID(IID_UnknownInterface10, 0xB722BE00, 0x4E68, 0x101B, 0xA2,0xBC, 0x00,0xAA,0x00,0x40,0x47,0x70);
66 static HRESULT (WINAPI *pSHCreateShellItem)(LPCITEMIDLIST,IShellFolder*,LPCITEMIDLIST,IShellItem**);
67 static HRESULT (WINAPI *pSHParseDisplayName)(LPCWSTR,IBindCtx*,LPITEMIDLIST*,SFGAOF,SFGAOF*);
69 static void init_function_pointers(void)
73 hmod = GetModuleHandleA("shell32.dll");
74 pSHCreateShellItem = (void*)GetProcAddress(hmod, "SHCreateShellItem");
75 pSHParseDisplayName = (void*)GetProcAddress(hmod, "SHParseDisplayName");
78 /*********************************************************************
81 static HRESULT ebrowser_instantiate(IExplorerBrowser **peb)
83 return CoCreateInstance(&CLSID_ExplorerBrowser, NULL, CLSCTX_INPROC_SERVER,
84 &IID_IExplorerBrowser, (void**)peb);
87 static HRESULT ebrowser_initialize(IExplorerBrowser *peb)
90 rc.top = rc.left = 0; rc.bottom = rc.right = 500;
91 return IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
94 static HRESULT ebrowser_browse_to_desktop(IExplorerBrowser *peb)
96 LPITEMIDLIST pidl_desktop;
98 SHGetSpecialFolderLocation (hwnd, CSIDL_DESKTOP, &pidl_desktop);
99 hr = IExplorerBrowser_BrowseToIDList(peb, pidl_desktop, 0);
100 ILFree(pidl_desktop);
104 /* Process some messages */
105 static void process_msgs(void)
108 while(PeekMessage( &msg, NULL, 0, 0, PM_REMOVE))
110 TranslateMessage(&msg);
111 DispatchMessage(&msg);
115 static void dbg_print_guid(const GUID *guid) {
118 StringFromGUID2(guid, buf, MAX_PATH);
119 printf("guid:[%s]\n", wine_dbgstr_wn(buf, lstrlenW(buf)));
122 /*********************************************************************
123 * IExplorerBrowserEvents implementation
126 const IExplorerBrowserEventsVtbl *lpVtbl;
128 UINT pending, created, completed, failed;
129 } IExplorerBrowserEventsImpl;
131 static IExplorerBrowserEventsImpl ebev;
133 static HRESULT WINAPI IExplorerBrowserEvents_fnQueryInterface(IExplorerBrowserEvents *iface,
134 REFIID riid, void **ppvObj)
136 ok(0, "Never called.\n");
137 return E_NOINTERFACE;
140 static ULONG WINAPI IExplorerBrowserEvents_fnAddRef(IExplorerBrowserEvents *iface)
142 IExplorerBrowserEventsImpl *This = (IExplorerBrowserEventsImpl*)iface;
143 return InterlockedIncrement(&This->ref);
146 static ULONG WINAPI IExplorerBrowserEvents_fnRelease(IExplorerBrowserEvents *iface)
148 IExplorerBrowserEventsImpl *This = (IExplorerBrowserEventsImpl*)iface;
149 return InterlockedDecrement(&This->ref);
152 static HRESULT WINAPI IExplorerBrowserEvents_fnOnNavigationPending(IExplorerBrowserEvents *iface,
153 PCIDLIST_ABSOLUTE pidlFolder)
155 IExplorerBrowserEventsImpl *This = (IExplorerBrowserEventsImpl*)iface;
160 static HRESULT WINAPI IExplorerBrowserEvents_fnOnNavigationComplete(IExplorerBrowserEvents *iface,
161 PCIDLIST_ABSOLUTE pidlFolder)
163 IExplorerBrowserEventsImpl *This = (IExplorerBrowserEventsImpl*)iface;
167 static HRESULT WINAPI IExplorerBrowserEvents_fnOnNavigationFailed(IExplorerBrowserEvents *iface,
168 PCIDLIST_ABSOLUTE pidlFolder)
170 IExplorerBrowserEventsImpl *This = (IExplorerBrowserEventsImpl*)iface;
174 static HRESULT WINAPI IExplorerBrowserEvents_fnOnViewCreated(IExplorerBrowserEvents *iface,
177 IExplorerBrowserEventsImpl *This = (IExplorerBrowserEventsImpl*)iface;
182 static const IExplorerBrowserEventsVtbl ebevents =
184 IExplorerBrowserEvents_fnQueryInterface,
185 IExplorerBrowserEvents_fnAddRef,
186 IExplorerBrowserEvents_fnRelease,
187 IExplorerBrowserEvents_fnOnNavigationPending,
188 IExplorerBrowserEvents_fnOnViewCreated,
189 IExplorerBrowserEvents_fnOnNavigationComplete,
190 IExplorerBrowserEvents_fnOnNavigationFailed
193 /*********************************************************************
194 * IExplorerPaneVisibility implementation
198 const IExplorerPaneVisibilityVtbl *lpVtbl;
201 LONG np, cp, cp_o, cp_v, dp, pp, qp, aqp, unk; /* The panes */
202 } IExplorerPaneVisibilityImpl;
204 static HRESULT WINAPI IExplorerPaneVisibility_fnQueryInterface(IExplorerPaneVisibility *iface,
205 REFIID riid, LPVOID *ppvObj)
207 ok(0, "Not called.\n");
208 trace("REFIID:"); dbg_print_guid(riid);
210 return E_NOINTERFACE;
213 static ULONG WINAPI IExplorerPaneVisibility_fnAddRef(IExplorerPaneVisibility *iface)
215 IExplorerPaneVisibilityImpl *This = (IExplorerPaneVisibilityImpl *)iface;
216 return InterlockedIncrement(&This->ref);
219 static ULONG WINAPI IExplorerPaneVisibility_fnRelease(IExplorerPaneVisibility *iface)
221 IExplorerPaneVisibilityImpl *This = (IExplorerPaneVisibilityImpl *)iface;
222 ULONG ref = InterlockedDecrement(&This->ref);
225 HeapFree(GetProcessHeap(), 0, This);
230 static HRESULT WINAPI IExplorerPaneVisibility_fnGetPaneState(IExplorerPaneVisibility *iface,
232 EXPLORERPANESTATE *peps)
234 IExplorerPaneVisibilityImpl *This = (IExplorerPaneVisibilityImpl *)iface;
237 ok(ep != NULL, "ep is NULL.\n");
238 ok(peps != NULL, "peps is NULL.\n");
239 ok(*peps == 0, "got %d\n", *peps);
242 if(IsEqualGUID(&EP_NavPane, ep)) This->np++;
243 else if(IsEqualGUID(&EP_Commands, ep)) This->cp++;
244 else if(IsEqualGUID(&EP_Commands_Organize, ep)) This->cp_o++;
245 else if(IsEqualGUID(&EP_Commands_View, ep)) This->cp_v++;
246 else if(IsEqualGUID(&EP_DetailsPane, ep)) This->dp++;
247 else if(IsEqualGUID(&EP_PreviewPane, ep)) This->pp++;
248 else if(IsEqualGUID(&EP_QueryPane, ep)) This->qp++;
249 else if(IsEqualGUID(&EP_AdvQueryPane, ep)) This->aqp++;
252 trace("Unknown explorer pane: "); dbg_print_guid(ep);
259 static const IExplorerPaneVisibilityVtbl epvvt =
261 IExplorerPaneVisibility_fnQueryInterface,
262 IExplorerPaneVisibility_fnAddRef,
263 IExplorerPaneVisibility_fnRelease,
264 IExplorerPaneVisibility_fnGetPaneState
267 static IExplorerPaneVisibilityImpl *create_explorerpanevisibility(void)
269 IExplorerPaneVisibilityImpl *epv;
271 epv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IExplorerPaneVisibilityImpl));
272 epv->lpVtbl = &epvvt;
278 /*********************************************************************
279 * ICommDlgBrowser3 implementation
283 const ICommDlgBrowser3Vtbl *lpVtbl;
285 UINT OnDefaultCommand, OnStateChange, IncludeObject;
286 UINT Notify, GetDefaultMenuText, GetViewFlags;
287 UINT OnColumnClicked, GetCurrentFilter, OnPreviewCreated;
288 } ICommDlgBrowser3Impl;
290 static HRESULT WINAPI ICommDlgBrowser3_fnQueryInterface(ICommDlgBrowser3 *iface, REFIID riid, LPVOID *ppvObj)
292 ok(0, "Not called.\n");
293 trace("riid:"); dbg_print_guid(riid);
295 return E_NOINTERFACE;
298 static ULONG WINAPI ICommDlgBrowser3_fnAddRef(ICommDlgBrowser3 *iface)
300 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
301 return InterlockedIncrement(&This->ref);
304 static ULONG WINAPI ICommDlgBrowser3_fnRelease(ICommDlgBrowser3 *iface)
306 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
307 ULONG ref = InterlockedDecrement(&This->ref);
310 HeapFree(GetProcessHeap(), 0, This);
315 static HRESULT WINAPI ICommDlgBrowser3_fnOnDefaultCommand(ICommDlgBrowser3* iface, IShellView *shv)
317 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
318 This->OnDefaultCommand++;
322 static HRESULT WINAPI ICommDlgBrowser3_fnOnStateChange(
323 ICommDlgBrowser3* iface,
327 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
328 This->OnStateChange++;
332 static HRESULT WINAPI ICommDlgBrowser3_fnIncludeObject(
333 ICommDlgBrowser3* iface,
337 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
338 This->IncludeObject++;
342 static HRESULT WINAPI ICommDlgBrowser3_fnNotify(
343 ICommDlgBrowser3* iface,
347 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
352 static HRESULT WINAPI ICommDlgBrowser3_fnGetDefaultMenuText(
353 ICommDlgBrowser3* iface,
358 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
359 This->GetDefaultMenuText++;
363 static HRESULT WINAPI ICommDlgBrowser3_fnGetViewFlags(
364 ICommDlgBrowser3* iface,
367 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
368 This->GetViewFlags++;
372 static HRESULT WINAPI ICommDlgBrowser3_fnOnColumnClicked(
373 ICommDlgBrowser3* iface,
377 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
378 This->OnColumnClicked++;
382 static HRESULT WINAPI ICommDlgBrowser3_fnGetCurrentFilter(
383 ICommDlgBrowser3* iface,
387 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
388 This->GetCurrentFilter++;
392 static HRESULT WINAPI ICommDlgBrowser3_fnOnPreviewCreated(
393 ICommDlgBrowser3* iface,
396 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
397 This->OnPreviewCreated++;
401 static const ICommDlgBrowser3Vtbl cdbvtbl =
403 ICommDlgBrowser3_fnQueryInterface,
404 ICommDlgBrowser3_fnAddRef,
405 ICommDlgBrowser3_fnRelease,
406 ICommDlgBrowser3_fnOnDefaultCommand,
407 ICommDlgBrowser3_fnOnStateChange,
408 ICommDlgBrowser3_fnIncludeObject,
409 ICommDlgBrowser3_fnNotify,
410 ICommDlgBrowser3_fnGetDefaultMenuText,
411 ICommDlgBrowser3_fnGetViewFlags,
412 ICommDlgBrowser3_fnOnColumnClicked,
413 ICommDlgBrowser3_fnGetCurrentFilter,
414 ICommDlgBrowser3_fnOnPreviewCreated
417 static ICommDlgBrowser3Impl *create_commdlgbrowser3(void)
419 ICommDlgBrowser3Impl *cdb;
421 cdb = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ICommDlgBrowser3Impl));
422 cdb->lpVtbl = &cdbvtbl;
428 /*********************************************************************
429 * IServiceProvider Implementation
432 const IServiceProviderVtbl *lpVtbl;
440 } IServiceProviderImpl;
442 static HRESULT WINAPI IServiceProvider_fnQueryInterface(IServiceProvider *iface, REFIID riid, LPVOID *ppvObj)
445 if(IsEqualIID(riid, &IID_IServiceProvider))
448 IServiceProvider_AddRef((IServiceProvider*)iface);
452 if(IsEqualIID(riid, &IID_IOleCommandTarget))
455 return E_NOINTERFACE;
458 ok(0, "Unexpected interface requested.\n");
459 trace("riid: "); dbg_print_guid(riid);
460 return E_NOINTERFACE;
463 static ULONG WINAPI IServiceProvider_fnAddRef(IServiceProvider *iface)
465 IServiceProviderImpl *This = (IServiceProviderImpl*)iface;
466 return InterlockedIncrement(&This->ref);
469 static ULONG WINAPI IServiceProvider_fnRelease(IServiceProvider *iface)
471 IServiceProviderImpl *This = (IServiceProviderImpl*)iface;
472 LONG ref = InterlockedDecrement(&This->ref);
475 HeapFree(GetProcessHeap(), 0, This);
480 static HRESULT WINAPI IServiceProvider_fnQueryService(IServiceProvider *iface,
485 IServiceProviderImpl *This = (IServiceProviderImpl*)iface;
486 BOOL was_in_list = FALSE;
487 IUnknown *punk = NULL;
491 for(i = 0; This->interfaces[i].service != NULL; i++)
493 if(IsEqualGUID(This->interfaces[i].service, guidService) &&
494 IsEqualIID(This->interfaces[i].id, riid))
497 This->interfaces[i].count++;
498 punk = This->interfaces[i].punk;
503 ok(was_in_list, "-- Unknown service requested --\n");
506 trace("guidService: "); dbg_print_guid(guidService);
507 trace("riid: "); dbg_print_guid(riid);
510 /* Give back an interface, if any. */
514 IUnknown_AddRef((IUnknown*)punk);
518 return E_NOINTERFACE;
521 static const IServiceProviderVtbl spvtbl =
523 IServiceProvider_fnQueryInterface,
524 IServiceProvider_fnAddRef,
525 IServiceProvider_fnRelease,
526 IServiceProvider_fnQueryService
529 static IServiceProviderImpl *create_serviceprovider(void)
531 IServiceProviderImpl *sp = HeapAlloc(GetProcessHeap(), 0, sizeof(IServiceProviderImpl));
532 sp->lpVtbl = &spvtbl;
537 static void test_QueryInterface(void)
539 IExplorerBrowser *peb;
544 hr = ebrowser_instantiate(&peb);
545 ok(hr == S_OK, "Got 0x%08x\n", hr);
547 #define test_qinterface(iid, exp) \
549 hr = IExplorerBrowser_QueryInterface(peb, &iid, (void**)&punk); \
550 ok(hr == exp, "(%s:)Expected (0x%08x), got (0x%08x)\n", \
552 if(SUCCEEDED(hr)) IUnknown_Release(punk); \
555 test_qinterface(IID_IUnknown, S_OK);
556 test_qinterface(IID_IExplorerBrowser, S_OK);
557 test_qinterface(IID_IShellBrowser, S_OK);
558 todo_wine test_qinterface(IID_IOleWindow, S_OK);
559 test_qinterface(IID_ICommDlgBrowser, S_OK);
560 test_qinterface(IID_ICommDlgBrowser2, S_OK);
561 test_qinterface(IID_ICommDlgBrowser3, S_OK);
562 todo_wine test_qinterface(IID_IServiceProvider, S_OK);
563 test_qinterface(IID_IObjectWithSite, S_OK);
564 todo_wine test_qinterface(IID_IConnectionPointContainer, S_OK);
565 test_qinterface(IID_IOleObject, E_NOINTERFACE);
566 test_qinterface(IID_IViewObject, E_NOINTERFACE);
567 test_qinterface(IID_IViewObject2, E_NOINTERFACE);
568 test_qinterface(IID_IViewObjectEx, E_NOINTERFACE);
569 test_qinterface(IID_IConnectionPoint, E_NOINTERFACE);
570 test_qinterface(IID_IShellView, E_NOINTERFACE);
571 test_qinterface(IID_INameSpaceTreeControlEvents, E_NOINTERFACE);
573 #undef test_qinterface
575 lres = IExplorerBrowser_Release(peb);
576 ok(lres == 0, "Got %d\n", lres);
579 static void test_SB_misc(void)
581 IExplorerBrowser *peb;
589 ebrowser_instantiate(&peb);
590 hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb);
591 ok(hr == S_OK, "Got 0x%08x\n", hr);
594 skip("Failed to get IShellBrowser interface.\n");
598 /* Some unimplemented methods */
599 retHwnd = (HWND)0xDEADBEEF;
600 hr = IShellBrowser_GetControlWindow(psb, FCW_TOOLBAR, &retHwnd);
601 ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
602 ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n");
604 hr = IShellBrowser_GetControlWindow(psb, FCW_STATUS, &retHwnd);
605 ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
606 ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n");
608 hr = IShellBrowser_GetControlWindow(psb, FCW_TREE, &retHwnd);
609 ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
610 ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n");
612 hr = IShellBrowser_GetControlWindow(psb, FCW_PROGRESS, &retHwnd);
613 ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
614 ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n");
617 hr = IShellBrowser_InsertMenusSB(psb, NULL, NULL);
618 ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
620 /* ::RemoveMenusSB */
621 hr = IShellBrowser_RemoveMenusSB(psb, NULL);
622 ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
625 hr = IShellBrowser_SetMenuSB(psb, NULL, NULL, NULL);
626 ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
628 /***** Before EB::Initialize *****/
631 retHwnd = (HWND)0xDEADBEEF;
632 hr = IShellBrowser_GetWindow(psb, &retHwnd);
633 ok(hr == E_FAIL, "got (0x%08x)\n", hr);
634 ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n");
639 /* ::SendControlMsg */
641 hr = IShellBrowser_SendControlMsg(psb, FCW_STATUS, 0, 0, 0, &lres);
642 ok(hr == S_OK, "got (0x%08x)\n", hr);
643 ok(lres == 0, "lres was %ld\n", lres);
646 hr = IShellBrowser_SendControlMsg(psb, FCW_TOOLBAR, TB_CHECKBUTTON,
647 FCIDM_TB_SMALLICON, TRUE, &lres);
648 ok(hr == S_OK, "got (0x%08x)\n", hr);
649 ok(lres == 0, "lres was %ld\n", lres);
651 hr = IShellBrowser_SendControlMsg(psb, FCW_STATUS, 0, 0, 0, NULL);
652 ok(hr == S_OK, "got (0x%08x)\n", hr);
654 hr = IShellBrowser_SendControlMsg(psb, FCW_TREE, 0, 0, 0, NULL);
655 ok(hr == S_OK, "got (0x%08x)\n", hr);
657 hr = IShellBrowser_SendControlMsg(psb, FCW_PROGRESS, 0, 0, 0, NULL);
658 ok(hr == S_OK, "got (0x%08x)\n", hr);
661 /* ::QueryActiveShellView */
662 hr = IShellBrowser_QueryActiveShellView(psb, (IShellView**)&punk);
663 ok(hr == E_FAIL, "got (0x%08x)\n", hr);
665 /* Initialize ExplorerBrowser */
666 ebrowser_initialize(peb);
668 /***** After EB::Initialize *****/
671 hr = IShellBrowser_GetWindow(psb, &retHwnd);
672 ok(hr == S_OK, "got (0x%08x)\n", hr);
673 ok(GetParent(retHwnd) == hwnd, "The HWND returned is not our child.\n");
677 /* ::SendControlMsg */
678 hr = IShellBrowser_SendControlMsg(psb, FCW_STATUS, 0, 0, 0, NULL);
679 ok(hr == S_OK, "got (0x%08x)\n", hr);
682 hr = IShellBrowser_SendControlMsg(psb, FCW_TOOLBAR, 0, 0, 0, &lres);
683 ok(hr == S_OK, "got (0x%08x)\n", hr);
684 ok(lres == 0, "lres was %ld\n", lres);
687 hr = IShellBrowser_SendControlMsg(psb, FCW_STATUS, 0, 0, 0, &lres);
688 ok(hr == S_OK, "got (0x%08x)\n", hr);
689 ok(lres == 0, "lres was %ld\n", lres);
692 hr = IShellBrowser_SendControlMsg(psb, 1234, 0, 0, 0, &lres);
693 ok(hr == S_OK, "got (0x%08x)\n", hr);
694 ok(lres == 0, "lres was %ld\n", lres);
697 hr = IShellBrowser_SetStatusTextSB(psb, NULL);
698 ok(hr == S_OK, "got (0x%08x)\n", hr);
700 hr = IShellBrowser_ContextSensitiveHelp(psb, FALSE);
701 ok(hr == S_OK, "got (0x%08x)\n", hr);
703 hr = IShellBrowser_EnableModelessSB(psb, TRUE);
704 ok(hr == S_OK, "got (0x%08x)\n", hr);
706 hr = IShellBrowser_SetToolbarItems(psb, NULL, 1, 1);
707 ok(hr == S_OK, "got (0x%08x)\n", hr);
710 hr = IShellBrowser_QueryActiveShellView(psb, (IShellView**)&punk);
711 ok(hr == E_FAIL, "got (0x%08x)\n", hr);
713 IShellBrowser_Release(psb);
714 IExplorerBrowser_Destroy(peb);
715 IExplorerBrowser_Release(peb);
717 /* Browse to the desktop. */
718 ebrowser_instantiate(&peb);
719 ebrowser_initialize(peb);
720 IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb);
723 hr = ebrowser_browse_to_desktop(peb);
724 ok(hr == S_OK, "got (0x%08x)\n", hr);
727 /****** After Browsing *****/
729 hr = IShellBrowser_QueryActiveShellView(psb, (IShellView**)&punk);
730 ok(hr == S_OK, "got (0x%08x)\n", hr);
731 if(SUCCEEDED(hr)) IUnknown_Release(punk);
733 IShellBrowser_Release(psb);
734 IExplorerBrowser_Destroy(peb);
735 ref = IExplorerBrowser_Release(peb);
736 ok(ref == 0, "Got %d\n", ref);
739 static void test_initialization(void)
741 IExplorerBrowser *peb;
747 ebrowser_instantiate(&peb);
751 /* Crashes on Windows 7 */
752 IExplorerBrowser_Initialize(peb, NULL, NULL, NULL);
753 IExplorerBrowser_Initialize(peb, hwnd, NULL, NULL);
756 ZeroMemory(&rc, sizeof(RECT));
758 hr = IExplorerBrowser_Initialize(peb, NULL, &rc, NULL);
759 ok(hr == E_INVALIDARG, "got (0x%08x)\n", hr);
761 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
762 ok(hr == S_OK, "got (0x%08x)\n", hr);
764 /* Initialize twice */
765 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
766 ok(hr == E_UNEXPECTED, "got (0x%08x)\n", hr);
768 hr = IExplorerBrowser_Destroy(peb);
769 ok(hr == S_OK, "got (0x%08x)\n", hr);
771 /* Initialize again */
772 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
773 ok(hr == E_UNEXPECTED, "got (0x%08x)\n", hr);
776 hr = IExplorerBrowser_Destroy(peb);
777 ok(hr == S_OK, "got (0x%08x)\n", hr);
778 lres = IExplorerBrowser_Release(peb);
779 ok(lres == 0, "Got %d\n", lres);
781 /* Initialize with a few different rectangles */
783 ebrowser_instantiate(&peb);
784 rc.left = 50; rc.top = 20; rc.right = 100; rc.bottom = 80;
785 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
786 ok(hr == S_OK, "got (0x%08x)\n", hr);
787 hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb);
788 ok(hr == S_OK, "Got 0x%08x\n", hr);
794 LONG style, expected_style;
795 static const RECT exp_rc = {0, 0, 48, 58};
797 hr = IShellBrowser_GetWindow(psb, &eb_hwnd);
798 ok(hr == S_OK, "Got 0x%08x\n", hr);
800 GetClientRect(eb_hwnd, &eb_rc);
801 ok(EqualRect(&eb_rc, &exp_rc), "Got client rect (%d, %d)-(%d, %d)\n",
802 eb_rc.left, eb_rc.top, eb_rc.right, eb_rc.bottom);
804 GetWindowRect(eb_hwnd, &eb_rc);
805 ok(eb_rc.right - eb_rc.left == 50, "Got window width %d\n", eb_rc.right - eb_rc.left);
806 ok(eb_rc.bottom - eb_rc.top == 60, "Got window height %d\n", eb_rc.bottom - eb_rc.top);
809 GetClassNameA(eb_hwnd, buf, 1024);
810 ok(!lstrcmpA(buf, "ExplorerBrowserControl"), "Unexpected classname %s\n", buf);
812 expected_style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_BORDER;
813 style = GetWindowLongPtrW(eb_hwnd, GWL_STYLE);
814 todo_wine ok(style == expected_style, "Got style 0x%08x, expected 0x%08x\n", style, expected_style);
816 expected_style = WS_EX_CONTROLPARENT;
817 style = GetWindowLongPtrW(eb_hwnd, GWL_EXSTYLE);
818 ok(style == expected_style, "Got exstyle 0x%08x, expected 0x%08x\n", style, expected_style);
820 ok(GetParent(eb_hwnd) == hwnd, "GetParent returns %p\n", GetParent(eb_hwnd));
822 /* ::Destroy() destroys the window. */
823 ok(IsWindow(eb_hwnd), "eb_hwnd invalid.\n");
824 IExplorerBrowser_Destroy(peb);
825 ok(!IsWindow(eb_hwnd), "eb_hwnd valid.\n");
827 IShellBrowser_Release(psb);
828 lres = IExplorerBrowser_Release(peb);
829 ok(lres == 0, "Got refcount %d\n", lres);
833 skip("Skipping some tests.\n");
835 IExplorerBrowser_Destroy(peb);
836 lres = IExplorerBrowser_Release(peb);
837 ok(lres == 0, "Got refcount %d\n", lres);
840 ebrowser_instantiate(&peb);
841 rc.left = 0; rc.top = 0; rc.right = 0; rc.bottom = 0;
842 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
843 ok(hr == S_OK, "got (0x%08x)\n", hr);
844 IExplorerBrowser_Destroy(peb);
845 lres = IExplorerBrowser_Release(peb);
846 ok(lres == 0, "Got refcount %d\n", lres);
848 ebrowser_instantiate(&peb);
849 rc.left = -1; rc.top = -1; rc.right = 1; rc.bottom = 1;
850 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
851 ok(hr == S_OK, "got (0x%08x)\n", hr);
852 IExplorerBrowser_Destroy(peb);
853 lres = IExplorerBrowser_Release(peb);
854 ok(lres == 0, "Got refcount %d\n", lres);
856 ebrowser_instantiate(&peb);
857 rc.left = 10; rc.top = 10; rc.right = 5; rc.bottom = 5;
858 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
859 ok(hr == S_OK, "got (0x%08x)\n", hr);
860 IExplorerBrowser_Destroy(peb);
861 lres = IExplorerBrowser_Release(peb);
862 ok(lres == 0, "Got refcount %d\n", lres);
864 ebrowser_instantiate(&peb);
865 rc.left = 10; rc.top = 10; rc.right = 5; rc.bottom = 5;
866 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
867 ok(hr == S_OK, "got (0x%08x)\n", hr);
868 IExplorerBrowser_Destroy(peb);
869 lres = IExplorerBrowser_Release(peb);
870 ok(lres == 0, "Got refcount %d\n", lres);
873 static void test_SetSite(void)
875 IExplorerBrowser *peb;
876 IServiceProviderImpl *spimpl = create_serviceprovider();
877 ICommDlgBrowser3Impl *cdbimpl = create_commdlgbrowser3();
878 IExplorerPaneVisibilityImpl *epvimpl = create_explorerpanevisibility();
879 IObjectWithSite *pow;
883 struct services expected[] = {
885 { &SID_STopLevelBrowser, &IID_ICommDlgBrowser2, 0, cdbimpl },
886 { &SID_STopLevelBrowser, &IID_IShellBrowserService, 0, NULL },
887 { &SID_STopLevelBrowser, &IID_IShellBrowser, 0, NULL },
888 { &SID_STopLevelBrowser, &IID_UnknownInterface8, 0, NULL },
889 { &SID_STopLevelBrowser, &IID_IConnectionPointContainer, 0, NULL },
890 { &SID_STopLevelBrowser, &IID_IProfferService, 0, NULL },
891 { &SID_STopLevelBrowser, &IID_UnknownInterface9, 0, NULL },
892 { &SID_ExplorerPaneVisibility, &IID_IExplorerPaneVisibility, 0, epvimpl },
893 { &SID_SExplorerBrowserFrame, &IID_ICommDlgBrowser2, 0, cdbimpl },
894 { &SID_SExplorerBrowserFrame, &IID_ICommDlgBrowser3, 0, cdbimpl },
895 { &IID_IFileDialogPrivate, &IID_IFileDialogPrivate, 0, NULL },
896 { &IID_IFileDialogPrivate, &IID_IFileDialog, 0, NULL },
897 { &IID_IShellTaskScheduler, &IID_IShellTaskScheduler, 0, NULL },
898 { &IID_IShellTaskScheduler, &IID_UnknownInterface2, 0, NULL },
899 { &IID_IWebbrowserApp, &IID_IConnectionPointContainer, 0, NULL },
900 { &IID_IFolderView, &IID_IFolderView, 0, NULL },
901 { &IID_ILayoutModifier, &IID_ILayoutModifier, 0, NULL },
902 { &IID_IBrowserSettings, &IID_IBrowserSettings, 0, NULL },
903 { &CLSID_Desktop, &IID_IUnknown, 0, NULL },
904 { &IID_UnknownInterface1, &IID_UnknownInterface1, 0, NULL },
905 { &IID_UnknownInterface3, &IID_UnknownInterface3, 0, NULL },
906 { &IID_UnknownInterface4, &IID_IUnknown, 0, NULL },
907 { &IID_UnknownInterface6, &IID_UnknownInterface7, 0, NULL },
908 { &IID_IBrowserWithActivationNotification, &IID_IBrowserWithActivationNotification, 0, NULL },
910 /* Other services requested in Vista, Windows 2008 but not in Windows 7 */
911 { &IID_IBrowserSettings_Vista, &IID_IBrowserSettings_Vista, 0, NULL },
912 { &IID_IFolderTypeModifier, &IID_IFolderTypeModifier, 0, NULL },
913 { &SID_STopLevelBrowser, &IID_IShellBrowserService_Vista, 0, NULL },
914 { &IID_UnknownInterface5, &IID_UnknownInterface5, 0, NULL },
915 { &IID_ICommDlgBrowser, &IID_ICommDlgBrowser, 0, cdbimpl },
916 { &IID_IFileDialogPrivate_Vista,&IID_IFileDialogPrivate_Vista, 0, NULL},
917 { &IID_IFileDialogPrivate_Vista,&IID_IFileDialog, 0, NULL},
918 { &IID_UnknownInterface10, &IID_IHTMLDocument2, 0, NULL},
919 { &SID_SMenuBandParent, &IID_IOleCommandTarget, 0, NULL},
920 { &SID_SMenuBandParent, &IID_IShellMenu, 0, NULL},
921 { &SID_STopLevelBrowser, &IID_IOleWindow, 0, NULL},
922 { &SID_SMenuPopup, &IID_IOleCommandTarget, 0, NULL},
926 ebrowser_instantiate(&peb);
927 IExplorerBrowser_SetOptions(peb, EBO_SHOWFRAMES);
929 hr = IExplorerBrowser_QueryInterface(peb, &IID_IObjectWithSite, (void**)&pow);
930 ok(hr == S_OK, "Got 0x%08x\n", hr);
933 spimpl->interfaces = expected;
935 hr = IObjectWithSite_SetSite(pow, (IUnknown*)spimpl);
936 ok(hr == S_OK, "Got 0x%08x\n", hr);
939 IObjectWithSite_Release(pow);
944 skip("Failed to set site.\n");
946 IServiceProvider_Release((IServiceProvider*)spimpl);
947 ICommDlgBrowser3_Release((ICommDlgBrowser3*)cdbimpl);
948 IExplorerPaneVisibility_Release((IExplorerPaneVisibility*)epvimpl);
949 IExplorerBrowser_Destroy(peb);
950 ref = IExplorerBrowser_Release(peb);
951 ok(ref == 0, "Got ref %d\n", ref);
956 ShowWindow(hwnd, TRUE);
957 ebrowser_initialize(peb);
958 ebrowser_browse_to_desktop(peb);
960 for(i = 0; i < 10; i++)
965 ShowWindow(hwnd, FALSE);
967 /* ICommDlgBrowser3 */
968 ok(!cdbimpl->OnDefaultCommand, "Got %d\n", cdbimpl->OnDefaultCommand);
969 todo_wine ok(cdbimpl->OnStateChange, "Got %d\n", cdbimpl->OnStateChange);
970 ok(cdbimpl->IncludeObject, "Got %d\n", cdbimpl->IncludeObject);
971 ok(!cdbimpl->Notify, "Got %d\n", cdbimpl->Notify);
972 ok(!cdbimpl->GetDefaultMenuText, "Got %d\n", cdbimpl->GetDefaultMenuText);
973 todo_wine ok(cdbimpl->GetViewFlags, "Got %d\n", cdbimpl->GetViewFlags);
974 ok(!cdbimpl->OnColumnClicked, "Got %d\n", cdbimpl->OnColumnClicked);
975 ok(!cdbimpl->GetCurrentFilter, "Got %d\n", cdbimpl->GetCurrentFilter);
976 todo_wine ok(cdbimpl->OnPreviewCreated, "Got %d\n", cdbimpl->OnPreviewCreated);
978 /* IExplorerPaneVisibility */
979 ok(epvimpl->np, "Got %d\n", epvimpl->np);
980 todo_wine ok(epvimpl->cp, "Got %d\n", epvimpl->cp);
981 todo_wine ok(epvimpl->cp_o, "Got %d\n", epvimpl->cp_o);
982 todo_wine ok(epvimpl->cp_v, "Got %d\n", epvimpl->cp_v);
983 todo_wine ok(epvimpl->dp, "Got %d\n", epvimpl->dp);
984 todo_wine ok(epvimpl->pp, "Got %d\n", epvimpl->pp);
985 ok(!epvimpl->qp, "Got %d\n", epvimpl->qp);
986 ok(!epvimpl->aqp, "Got %d\n", epvimpl->aqp);
987 ok(!epvimpl->unk, "Got %d\n", epvimpl->unk);
991 for(i = 0; expected[i].service != NULL; i++)
992 if(!expected[i].count) trace("count %d was 0.\n", i);
995 /* Test when IServiceProvider is released. */
996 IServiceProvider_AddRef((IServiceProvider*)spimpl);
997 ref = IServiceProvider_Release((IServiceProvider*)spimpl);
998 ok(ref == 2, "Got ref %d\n", ref);
1000 hr = IObjectWithSite_SetSite(pow, NULL);
1001 ok(hr == S_OK, "Got 0x%08x\n", hr);
1003 IServiceProvider_AddRef((IServiceProvider*)spimpl);
1004 ref = IServiceProvider_Release((IServiceProvider*)spimpl);
1005 ok(ref == 1, "Got ref %d\n", ref);
1007 hr = IObjectWithSite_SetSite(pow, (IUnknown*)spimpl);
1008 ok(hr == S_OK, "Got 0x%08x\n", hr);
1010 IServiceProvider_AddRef((IServiceProvider*)spimpl);
1011 ref = IServiceProvider_Release((IServiceProvider*)spimpl);
1012 ok(ref == 2, "Got ref %d\n", ref);
1014 IExplorerBrowser_Destroy(peb);
1016 IServiceProvider_AddRef((IServiceProvider*)spimpl);
1017 ref = IServiceProvider_Release((IServiceProvider*)spimpl);
1018 ok(ref == 2, "Got ref %d\n", ref);
1020 IObjectWithSite_Release(pow);
1021 ref = IExplorerBrowser_Release(peb);
1022 ok(ref == 0, "Got ref %d\n", ref);
1024 ref = IServiceProvider_Release((IServiceProvider*)spimpl);
1025 ok(ref == 0, "Got ref %d\n", ref);
1027 ref = ICommDlgBrowser3_Release((ICommDlgBrowser3*)cdbimpl);
1028 ok(ref == 0, "Got ref %d\n", ref);
1029 ref = IExplorerPaneVisibility_Release((IExplorerPaneVisibility*)epvimpl);
1030 ok(ref == 0, "Got ref %d\n", ref);
1033 static void test_basics(void)
1035 IExplorerBrowser *peb;
1043 static const WCHAR winetest[] = {'W','i','n','e','T','e','s','t',0};
1045 ebrowser_instantiate(&peb);
1046 ebrowser_initialize(peb);
1049 rc.left = 0; rc.top = 0; rc.right = 0; rc.bottom = 0;
1050 hr = IExplorerBrowser_SetRect(peb, NULL, rc);
1051 ok(hr == S_OK, "got (0x%08x)\n", hr);
1053 rc.left = 100; rc.top = 100; rc.right = 10; rc.bottom = 10;
1054 hr = IExplorerBrowser_SetRect(peb, NULL, rc);
1055 ok(hr == S_OK, "got (0x%08x)\n", hr);
1057 /* SetRect with DeferWindowPos */
1058 rc.left = rc.top = 0; rc.right = rc.bottom = 10;
1059 hdwp = BeginDeferWindowPos(1);
1060 hr = IExplorerBrowser_SetRect(peb, &hdwp, rc);
1061 ok(hr == S_OK, "got (0x%08x)\n", hr);
1062 lres = EndDeferWindowPos(hdwp);
1063 ok(lres, "EndDeferWindowPos failed.\n");
1066 hr = IExplorerBrowser_SetRect(peb, &hdwp, rc);
1067 ok(hr == S_OK, "got (0x%08x)\n", hr);
1068 ok(hdwp == NULL, "got %p\n", hdwp);
1069 lres = EndDeferWindowPos(hdwp);
1070 ok(!lres, "EndDeferWindowPos succeeded unexpectedly.\n");
1072 /* Test positioning */
1073 rc.left = 10; rc.top = 20; rc.right = 50; rc.bottom = 50;
1074 hr = IExplorerBrowser_SetRect(peb, NULL, rc);
1075 ok(hr == S_OK, "got (0x%08x)\n", hr);
1076 hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb);
1077 ok(hr == S_OK, "Got 0x%08x\n", hr);
1082 static const RECT exp_rc = {11, 21, 49, 49};
1083 static const RECT exp_rc2 = {11, 21, 49, 24};
1085 hr = IShellBrowser_GetWindow(psb, &eb_hwnd);
1086 ok(hr == S_OK, "Got 0x%08x\n", hr);
1088 GetClientRect(eb_hwnd, &eb_rc);
1089 MapWindowPoints(eb_hwnd, hwnd, (POINT*)&eb_rc, 2);
1090 ok(EqualRect(&eb_rc, &exp_rc), "Got rect (%d, %d) - (%d, %d)\n",
1091 eb_rc.left, eb_rc.top, eb_rc.right, eb_rc.bottom);
1093 /* Try resizing with invalid hdwp */
1095 hdwp = (HDWP)0xdeadbeef;
1096 hr = IExplorerBrowser_SetRect(peb, &hdwp, rc);
1097 ok(hr == E_FAIL, "Got 0x%08x\n", hr);
1098 GetClientRect(eb_hwnd, &eb_rc);
1099 MapWindowPoints(eb_hwnd, hwnd, (POINT*)&eb_rc, 2);
1100 ok(EqualRect(&eb_rc, &exp_rc), "Got rect (%d, %d) - (%d, %d)\n",
1101 eb_rc.left, eb_rc.top, eb_rc.right, eb_rc.bottom);
1104 hr = IExplorerBrowser_SetRect(peb, &hdwp, rc);
1105 ok(hr == S_OK, "Got 0x%08x\n", hr);
1106 GetClientRect(eb_hwnd, &eb_rc);
1107 MapWindowPoints(eb_hwnd, hwnd, (POINT*)&eb_rc, 2);
1108 ok(EqualRect(&eb_rc, &exp_rc2), "Got rect (%d, %d) - (%d, %d)\n",
1109 eb_rc.left, eb_rc.top, eb_rc.right, eb_rc.bottom);
1111 IShellBrowser_Release(psb);
1114 IExplorerBrowser_Destroy(peb);
1115 IExplorerBrowser_Release(peb);
1117 /* GetOptions/SetOptions*/
1118 ebrowser_instantiate(&peb);
1121 /* Crashes on Windows 7 */
1122 IExplorerBrowser_GetOptions(peb, NULL);
1125 hr = IExplorerBrowser_GetOptions(peb, &flags);
1126 ok(hr == S_OK, "got (0x%08x)\n", hr);
1127 ok(flags == 0, "got (0x%08x)\n", flags);
1129 /* Settings preserved through Initialize. */
1130 hr = IExplorerBrowser_SetOptions(peb, 0xDEADBEEF);
1131 ok(hr == S_OK, "got (0x%08x)\n", hr);
1133 ebrowser_initialize(peb);
1135 hr = IExplorerBrowser_GetOptions(peb, &flags);
1136 ok(flags == 0xDEADBEEF, "got (0x%08x)\n", flags);
1137 ok(hr == S_OK, "got (0x%08x)\n", hr);
1139 IExplorerBrowser_Destroy(peb);
1140 IExplorerBrowser_Release(peb);
1142 ebrowser_instantiate(&peb);
1143 ebrowser_initialize(peb);
1145 /* SetFolderSettings */
1146 hr = IExplorerBrowser_SetFolderSettings(peb, NULL);
1147 ok(hr == E_INVALIDARG, "got (0x%08x)\n", hr);
1148 fs.ViewMode = 0; fs.fFlags = 0;
1149 hr = IExplorerBrowser_SetFolderSettings(peb, &fs);
1150 todo_wine ok(hr == E_INVALIDARG, "got (0x%08x)\n", hr);
1152 /* SetPropertyBag */
1153 hr = IExplorerBrowser_SetPropertyBag(peb, NULL);
1154 ok(hr == E_INVALIDARG, "Got 0x%08x\n", hr);
1155 hr = IExplorerBrowser_SetPropertyBag(peb, winetest);
1156 ok(hr == S_OK, "Got 0x%08x\n", hr);
1158 /* TODO: Test after browsing somewhere. */
1160 IExplorerBrowser_Destroy(peb);
1161 lres = IExplorerBrowser_Release(peb);
1162 ok(lres == 0, "Got %d\n", lres);
1165 static void test_Advise(void)
1167 IExplorerBrowser *peb;
1168 IExplorerBrowserEvents *pebe;
1173 /* Set up our IExplorerBrowserEvents implementation */
1174 ebev.lpVtbl = &ebevents;
1175 pebe = (IExplorerBrowserEvents*) &ebev;
1177 ebrowser_instantiate(&peb);
1181 /* Crashes on Windows 7 */
1182 IExplorerBrowser_Advise(peb, pebe, NULL);
1183 IExplorerBrowser_Advise(peb, NULL, &cookies[0]);
1186 /* Using Unadvise with a cookie that has yet to be given out
1187 * results in E_INVALIDARG */
1188 hr = IExplorerBrowser_Unadvise(peb, 11);
1189 ok(hr == E_INVALIDARG, "got (0x%08x)\n", hr);
1191 /* Add some before initialization */
1192 for(i = 0; i < 5; i++)
1194 hr = IExplorerBrowser_Advise(peb, pebe, &cookies[i]);
1195 ok(hr == S_OK, "got (0x%08x)\n", hr);
1198 ebrowser_initialize(peb);
1200 /* Add some after initialization */
1201 for(i = 5; i < 10; i++)
1203 hr = IExplorerBrowser_Advise(peb, pebe, &cookies[i]);
1204 ok(hr == S_OK, "got (0x%08x)\n", hr);
1207 ok(ebev.ref == 10, "Got %d\n", ebev.ref);
1210 ebrowser_browse_to_desktop(peb);
1212 ok(ebev.completed == 10, "Got %d\n", ebev.completed);
1214 /* Remove a bunch somewhere in the middle */
1215 for(i = 4; i < 8; i++)
1217 hr = IExplorerBrowser_Unadvise(peb, cookies[i]);
1218 ok(hr == S_OK, "got (0x%08x)\n", hr);
1222 ebrowser_browse_to_desktop(peb);
1224 ok(ebev.completed == 6, "Got %d\n", ebev.completed);
1228 /* Using unadvise with a previously unadvised cookie results
1230 IExplorerBrowser_Unadvise(peb, cookies[5]);
1233 /* Remove the rest. */
1234 for(i = 0; i < 10; i++)
1238 hr = IExplorerBrowser_Unadvise(peb, cookies[i]);
1239 ok(hr == S_OK, "%d: got (0x%08x)\n", i, hr);
1243 ok(ebev.ref == 0, "Got %d\n", ebev.ref);
1246 ebrowser_browse_to_desktop(peb);
1248 ok(ebev.completed == 0, "Got %d\n", ebev.completed);
1250 /* ::Destroy implies ::Unadvise. */
1251 hr = IExplorerBrowser_Advise(peb, pebe, &cookies[0]);
1252 ok(hr == S_OK, "Got 0x%08x\n", hr);
1253 ok(ebev.ref == 1, "Got %d\n", ebev.ref);
1255 hr = IExplorerBrowser_Destroy(peb);
1256 ok(hr == S_OK, "Got 0x%08x\n", hr);
1257 ok(ebev.ref == 0, "Got %d\n", ebev.ref);
1259 ref = IExplorerBrowser_Release(peb);
1260 ok(!ref, "Got %d\n", ref);
1263 /* Based on PathAddBackslashW from dlls/shlwapi/path.c */
1264 static LPWSTR myPathAddBackslashW( LPWSTR lpszPath )
1268 if (!lpszPath || (iLen = lstrlenW(lpszPath)) >= MAX_PATH)
1274 if (lpszPath[-1] != '\\')
1283 static void test_browse_pidl_(IExplorerBrowser *peb, IExplorerBrowserEventsImpl *ebev,
1284 LPITEMIDLIST pidl, UINT uFlags,
1285 HRESULT hr_exp, UINT pending, UINT created, UINT failed, UINT completed,
1286 const char *file, int line)
1289 ebev->completed = ebev->created = ebev->pending = ebev->failed = 0;
1291 hr = IExplorerBrowser_BrowseToIDList(peb, pidl, uFlags);
1292 ok_(file, line) (hr == hr_exp, "BrowseToIDList returned 0x%08x\n", hr);
1296 (ebev->pending == pending && ebev->created == created &&
1297 ebev->failed == failed && ebev->completed == completed,
1298 "Events occurred: %d, %d, %d, %d\n",
1299 ebev->pending, ebev->created, ebev->failed, ebev->completed);
1301 #define test_browse_pidl(peb, ebev, pidl, uFlags, hr, p, cr, f, co) \
1302 test_browse_pidl_(peb, ebev, pidl, uFlags, hr, p, cr, f, co, __FILE__, __LINE__)
1304 static void test_browse_pidl_sb_(IExplorerBrowser *peb, IExplorerBrowserEventsImpl *ebev,
1305 LPITEMIDLIST pidl, UINT uFlags,
1306 HRESULT hr_exp, UINT pending, UINT created, UINT failed, UINT completed,
1307 const char *file, int line)
1312 hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb);
1313 ok_(file, line) (hr == S_OK, "QueryInterface returned 0x%08x\n", hr);
1316 ebev->completed = ebev->created = ebev->pending = ebev->failed = 0;
1318 hr = IShellBrowser_BrowseObject(psb, pidl, uFlags);
1319 ok_(file, line) (hr == hr_exp, "BrowseObject returned 0x%08x\n", hr);
1323 (ebev->pending == pending && ebev->created == created &&
1324 ebev->failed == failed && ebev->completed == completed,
1325 "Events occurred: %d, %d, %d, %d\n",
1326 ebev->pending, ebev->created, ebev->failed, ebev->completed);
1328 IShellBrowser_Release(psb);
1331 #define test_browse_pidl_sb(peb, ebev, pidl, uFlags, hr, p, cr, f, co) \
1332 test_browse_pidl_sb_(peb, ebev, pidl, uFlags, hr, p, cr, f, co, __FILE__, __LINE__)
1334 static void test_navigation(void)
1336 IExplorerBrowser *peb, *peb2;
1340 LPITEMIDLIST pidl_current, pidl_child;
1341 DWORD cookie, cookie2;
1344 WCHAR current_path[MAX_PATH];
1345 WCHAR child_path[MAX_PATH];
1346 static const WCHAR testfolderW[] =
1347 {'w','i','n','e','t','e','s','t','f','o','l','d','e','r','\0'};
1349 ok(pSHParseDisplayName != NULL, "pSHParseDisplayName unexpectedly missing.\n");
1350 ok(pSHCreateShellItem != NULL, "pSHCreateShellItem unexpectedly missing.\n");
1352 GetCurrentDirectoryW(MAX_PATH, current_path);
1353 if(!lstrlenW(current_path))
1355 skip("Failed to create test-directory.\n");
1359 lstrcpyW(child_path, current_path);
1360 myPathAddBackslashW(child_path);
1361 lstrcatW(child_path, testfolderW);
1363 CreateDirectoryW(child_path, NULL);
1365 pSHParseDisplayName(current_path, NULL, &pidl_current, 0, NULL);
1366 pSHParseDisplayName(child_path, NULL, &pidl_child, 0, NULL);
1368 ebrowser_instantiate(&peb);
1369 ebrowser_initialize(peb);
1371 ebrowser_instantiate(&peb2);
1372 ebrowser_initialize(peb2);
1374 /* Set up our IExplorerBrowserEvents implementation */
1375 ebev.lpVtbl = &ebevents;
1377 IExplorerBrowser_Advise(peb, (IExplorerBrowserEvents*)&ebev, &cookie);
1378 IExplorerBrowser_Advise(peb2, (IExplorerBrowserEvents*)&ebev, &cookie2);
1380 /* These should all fail */
1381 test_browse_pidl(peb, &ebev, 0, SBSP_ABSOLUTE | SBSP_RELATIVE, E_FAIL, 0, 0, 0, 0);
1382 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_ABSOLUTE | SBSP_RELATIVE, E_FAIL, 0, 0, 0, 0);
1383 test_browse_pidl(peb, &ebev, 0, SBSP_ABSOLUTE, E_INVALIDARG, 0, 0, 0, 0);
1384 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_ABSOLUTE, E_INVALIDARG, 0, 0, 0, 0);
1385 test_browse_pidl(peb, &ebev, 0, SBSP_RELATIVE, E_FAIL, 0, 0, 0, 0);
1386 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_RELATIVE, E_FAIL, 0, 0, 0, 0);
1387 test_browse_pidl(peb, &ebev, 0, SBSP_PARENT, E_FAIL, 0, 0, 0, 0);
1388 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_PARENT, E_FAIL, 0, 0, 0, 0);
1389 test_browse_pidl(peb, &ebev, 0, SBSP_NAVIGATEFORWARD, E_FAIL, 0, 0, 0, 0);
1390 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_NAVIGATEFORWARD, E_FAIL, 0, 0, 0, 0);
1391 test_browse_pidl(peb, &ebev, 0, SBSP_NAVIGATEBACK, E_FAIL, 0, 0, 0, 0);
1392 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_NAVIGATEBACK, E_FAIL, 0, 0, 0, 0);
1394 /* "The first browse is synchronous" */
1395 test_browse_pidl(peb, &ebev, pidl_child, SBSP_ABSOLUTE, S_OK, 1, 1, 0, 1);
1396 test_browse_pidl_sb(peb2, &ebev, pidl_child, SBSP_ABSOLUTE, S_OK, 1, 1, 0, 1);
1398 /* Navigate empty history */
1399 test_browse_pidl(peb, &ebev, 0, SBSP_NAVIGATEFORWARD, S_OK, 0, 0, 0, 0);
1400 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_NAVIGATEFORWARD, S_OK, 0, 0, 0, 0);
1401 test_browse_pidl(peb, &ebev, 0, SBSP_NAVIGATEBACK, S_OK, 0, 0, 0, 0);
1402 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_NAVIGATEBACK, S_OK, 0, 0, 0, 0);
1404 /* Navigate history */
1405 test_browse_pidl(peb, &ebev, 0, SBSP_PARENT, S_OK, 1, 1, 0, 1);
1406 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_PARENT, S_OK, 1, 1, 0, 1);
1407 test_browse_pidl(peb, &ebev, 0, SBSP_NAVIGATEBACK, S_OK, 1, 1, 0, 1);
1408 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_NAVIGATEBACK, S_OK, 1, 1, 0, 1);
1409 test_browse_pidl(peb, &ebev, 0, SBSP_NAVIGATEFORWARD, S_OK, 1, 1, 0, 1);
1410 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_NAVIGATEFORWARD, S_OK, 1, 1, 0, 1);
1411 test_browse_pidl(peb, &ebev, 0, SBSP_ABSOLUTE, S_OK, 0, 0, 0, 0);
1412 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_ABSOLUTE, S_OK, 0, 0, 0, 0);
1414 /* Relative navigation */
1415 test_browse_pidl(peb, &ebev, pidl_current, SBSP_ABSOLUTE, S_OK, 1, 0, 0, 1);
1416 test_browse_pidl_sb(peb2, &ebev, pidl_current, SBSP_ABSOLUTE, S_OK, 1, 0, 0, 1);
1418 hr = IExplorerBrowser_GetCurrentView(peb, &IID_IFolderView, (void**)&pfv);
1419 ok(hr == S_OK, "Got 0x%08x\n", hr);
1422 LPITEMIDLIST pidl_relative;
1424 hr = IFolderView_GetFolder(pfv, &IID_IShellFolder, (void**)&psf);
1425 ok(hr == S_OK, "Got 0x%08x\n", hr);
1426 hr = IShellFolder_ParseDisplayName(psf, NULL, NULL, (LPWSTR)testfolderW,
1427 NULL, &pidl_relative, NULL);
1428 ok(hr == S_OK, "Got 0x%08x\n", hr);
1430 /* Browsing to another location here before using the
1431 * pidl_relative would make ExplorerBrowser in Windows 7 show a
1432 * not-available dialog. Also, passing a relative pidl without
1433 * specifying SBSP_RELATIVE makes it look for the pidl on the
1437 test_browse_pidl(peb, &ebev, pidl_relative, SBSP_RELATIVE, S_OK, 1, 1, 0, 1);
1438 test_browse_pidl_sb(peb2, &ebev, pidl_relative, SBSP_RELATIVE, S_OK, 1, 1, 0, 1);
1440 ILFree(pidl_relative);
1441 /* IShellFolder_Release(psf); */
1442 IFolderView_Release(pfv);
1446 test_browse_pidl(peb, &ebev, NULL, SBSP_ABSOLUTE, S_OK, 0, 0, 0, 0);
1447 test_browse_pidl_sb(peb2, &ebev, NULL, SBSP_ABSOLUTE, S_OK, 0, 0, 0, 0);
1448 test_browse_pidl(peb, &ebev, NULL, SBSP_DEFBROWSER, S_OK, 0, 0, 0, 0);
1449 test_browse_pidl_sb(peb2, &ebev, NULL, SBSP_DEFBROWSER, S_OK, 0, 0, 0, 0);
1450 test_browse_pidl(peb, &ebev, pidl_current, SBSP_SAMEBROWSER, S_OK, 1, 1, 0, 1);
1451 test_browse_pidl_sb(peb2, &ebev, pidl_current, SBSP_SAMEBROWSER, S_OK, 1, 1, 0, 1);
1452 test_browse_pidl(peb, &ebev, pidl_current, SBSP_SAMEBROWSER, S_OK, 1, 0, 0, 1);
1453 test_browse_pidl_sb(peb2, &ebev, pidl_current, SBSP_SAMEBROWSER, S_OK, 1, 0, 0, 1);
1455 test_browse_pidl(peb, &ebev, pidl_current, SBSP_EXPLOREMODE, E_INVALIDARG, 0, 0, 0, 0);
1456 test_browse_pidl_sb(peb2, &ebev, pidl_current, SBSP_EXPLOREMODE, E_INVALIDARG, 0, 0, 0, 0);
1457 test_browse_pidl(peb, &ebev, pidl_current, SBSP_OPENMODE, S_OK, 1, 0, 0, 1);
1458 test_browse_pidl_sb(peb2, &ebev, pidl_current, SBSP_OPENMODE, S_OK, 1, 0, 0, 1);
1460 /* SBSP_NEWBROWSER will return E_INVALIDARG, claims MSDN, but in
1461 * reality it works as one would expect (Windows 7 only?).
1465 IExplorerBrowser_BrowseToIDList(peb, NULL, SBSP_NEWBROWSER);
1468 hr = IExplorerBrowser_Unadvise(peb, cookie);
1469 ok(hr == S_OK, "Got 0x%08x\n", hr);
1470 IExplorerBrowser_Destroy(peb);
1472 hr = IExplorerBrowser_Unadvise(peb2, cookie2);
1473 ok(hr == S_OK, "Got 0x%08x\n", hr);
1474 IExplorerBrowser_Destroy(peb2);
1477 /* Attempt browsing after destroyed */
1478 test_browse_pidl(peb, &ebev, pidl_child, SBSP_ABSOLUTE, HRESULT_FROM_WIN32(ERROR_BUSY), 0, 0, 0, 0);
1479 test_browse_pidl_sb(peb2, &ebev, pidl_child, SBSP_ABSOLUTE, HRESULT_FROM_WIN32(ERROR_BUSY), 0, 0, 0, 0);
1481 lres = IExplorerBrowser_Release(peb);
1482 ok(lres == 0, "Got lres %d\n", lres);
1483 lres = IExplorerBrowser_Release(peb2);
1484 ok(lres == 0, "Got lres %d\n", lres);
1486 /******************************************/
1487 /* Test some options that affect browsing */
1489 ebrowser_instantiate(&peb);
1490 hr = IExplorerBrowser_Advise(peb, (IExplorerBrowserEvents*)&ebev, &cookie);
1491 ok(hr == S_OK, "Got 0x%08x\n", hr);
1492 hr = IExplorerBrowser_SetOptions(peb, EBO_NAVIGATEONCE);
1493 ok(hr == S_OK, "got (0x%08x)\n", hr);
1494 ebrowser_initialize(peb);
1496 test_browse_pidl(peb, &ebev, pidl_current, 0, S_OK, 1, 1, 0, 1);
1497 test_browse_pidl(peb, &ebev, pidl_current, 0, E_FAIL, 0, 0, 0, 0);
1499 hr = IExplorerBrowser_SetOptions(peb, 0);
1500 ok(hr == S_OK, "got (0x%08x)\n", hr);
1502 test_browse_pidl(peb, &ebev, pidl_current, 0, S_OK, 1, 0, 0, 1);
1503 test_browse_pidl(peb, &ebev, pidl_current, 0, S_OK, 1, 0, 0, 1);
1505 /* Difference in behavior lies where? */
1506 hr = IExplorerBrowser_SetOptions(peb, EBO_ALWAYSNAVIGATE);
1507 ok(hr == S_OK, "got (0x%08x)\n", hr);
1509 test_browse_pidl(peb, &ebev, pidl_current, 0, S_OK, 1, 0, 0, 1);
1510 test_browse_pidl(peb, &ebev, pidl_current, 0, S_OK, 1, 0, 0, 1);
1512 hr = IExplorerBrowser_Unadvise(peb, cookie);
1513 ok(hr == S_OK, "Got 0x%08x\n", hr);
1515 IExplorerBrowser_Destroy(peb);
1516 lres = IExplorerBrowser_Release(peb);
1517 ok(lres == 0, "Got lres %d\n", lres);
1519 /* BrowseToObject tests */
1520 ebrowser_instantiate(&peb);
1521 ebrowser_initialize(peb);
1523 /* Browse to the desktop by passing an IShellFolder */
1524 hr = SHGetDesktopFolder(&psf);
1525 ok(hr == S_OK, "Got 0x%08x\n", hr);
1528 hr = IExplorerBrowser_BrowseToObject(peb, (IUnknown*)psf, SBSP_DEFBROWSER);
1529 ok(hr == S_OK, "got (0x%08x)\n", hr);
1530 if(hr == S_OK) process_msgs();
1532 IShellFolder_Release(psf);
1535 /* Browse to the current directory by passing a ShellItem */
1536 hr = pSHCreateShellItem(NULL, NULL, pidl_current, &psi);
1537 ok(hr == S_OK, "Got 0x%08x\n", hr);
1540 hr = IExplorerBrowser_BrowseToObject(peb, (IUnknown*)psi, SBSP_DEFBROWSER);
1541 ok(hr == S_OK, "got (0x%08x)\n", hr);
1544 IShellItem_Release(psi);
1547 IExplorerBrowser_Destroy(peb);
1548 lres = IExplorerBrowser_Release(peb);
1549 ok(lres == 0, "Got lres %d\n", lres);
1552 RemoveDirectoryW(child_path);
1553 ILFree(pidl_current);
1557 static void test_GetCurrentView(void)
1559 IExplorerBrowser *peb;
1563 /* GetCurrentView */
1564 ebrowser_instantiate(&peb);
1568 /* Crashes under Windows 7 */
1569 IExplorerBrowser_GetCurrentView(peb, NULL, NULL);
1571 hr = IExplorerBrowser_GetCurrentView(peb, NULL, (void**)&punk);
1572 ok(hr == E_FAIL, "Got 0x%08x\n", hr);
1574 #define test_gcv(iid, exp) \
1576 hr = IExplorerBrowser_GetCurrentView(peb, &iid, (void**)&punk); \
1577 ok(hr == exp, "(%s:)Expected (0x%08x), got: (0x%08x)\n", \
1579 if(SUCCEEDED(hr)) IUnknown_Release(punk); \
1582 test_gcv(IID_IUnknown, E_FAIL);
1583 test_gcv(IID_IUnknown, E_FAIL);
1584 test_gcv(IID_IShellView, E_FAIL);
1585 test_gcv(IID_IShellView2, E_FAIL);
1586 test_gcv(IID_IFolderView, E_FAIL);
1587 test_gcv(IID_IPersistFolder, E_FAIL);
1588 test_gcv(IID_IPersistFolder2, E_FAIL);
1589 test_gcv(IID_ICommDlgBrowser, E_FAIL);
1590 test_gcv(IID_ICommDlgBrowser2, E_FAIL);
1591 test_gcv(IID_ICommDlgBrowser3, E_FAIL);
1593 ebrowser_initialize(peb);
1594 ebrowser_browse_to_desktop(peb);
1596 test_gcv(IID_IUnknown, S_OK);
1597 test_gcv(IID_IUnknown, S_OK);
1598 test_gcv(IID_IShellView, S_OK);
1599 test_gcv(IID_IShellView2, S_OK);
1600 test_gcv(IID_IFolderView, S_OK);
1601 todo_wine test_gcv(IID_IPersistFolder, S_OK);
1602 test_gcv(IID_IPersistFolder2, E_NOINTERFACE);
1603 test_gcv(IID_ICommDlgBrowser, E_NOINTERFACE);
1604 test_gcv(IID_ICommDlgBrowser2, E_NOINTERFACE);
1605 test_gcv(IID_ICommDlgBrowser3, E_NOINTERFACE);
1609 IExplorerBrowser_Destroy(peb);
1610 IExplorerBrowser_Release(peb);
1613 static void test_InputObject(void)
1615 IExplorerBrowser *peb;
1621 WPARAM supported_key_accels_mode1[] = {
1622 VK_BACK, VK_TAB, VK_RETURN, VK_PRIOR, VK_NEXT, VK_END, VK_HOME,
1623 VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN, VK_DELETE, VK_F1, VK_F2,
1624 VK_F5, VK_F6, VK_F10, 0 };
1625 WPARAM supported_key_accels_mode2[] = {
1626 VK_RETURN, VK_PRIOR, VK_NEXT, VK_END, VK_HOME,
1627 VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN, VK_DELETE, VK_F1, VK_F2,
1638 ebrowser_instantiate(&peb);
1639 hr = IExplorerBrowser_QueryInterface(peb, &IID_IInputObject, (void**)&pio);
1640 ok(hr == S_OK, "Got 0x%08x\n", hr);
1643 win_skip("IInputObject not supported.\n");
1647 /* Before initializing */
1648 hr = IInputObject_TranslateAcceleratorIO(pio, &msg_a);
1649 todo_wine ok(hr == E_FAIL, "Got 0x%08x\n", hr);
1651 hr = IInputObject_HasFocusIO(pio);
1652 todo_wine ok(hr == E_FAIL, "Got 0x%08x\n", hr);
1654 hr = IInputObject_UIActivateIO(pio, TRUE, &msg_a);
1655 todo_wine ok(hr == S_OK, "Got 0x%08x\n", hr);
1657 hr = IInputObject_HasFocusIO(pio);
1658 todo_wine ok(hr == E_FAIL, "Got 0x%08x\n", hr);
1660 hr = IInputObject_TranslateAcceleratorIO(pio, &msg_a);
1661 todo_wine ok(hr == E_FAIL, "Got 0x%08x\n", hr);
1663 rc.left = 0; rc.top = 0; rc.right = 100; rc.bottom = 100;
1664 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
1665 ok(hr == S_OK, "Got 0x%08x\n", hr);
1667 hr = IInputObject_HasFocusIO(pio);
1668 todo_wine ok(hr == E_FAIL, "Got 0x%08x\n", hr);
1670 hr = IInputObject_TranslateAcceleratorIO(pio, &msg_a);
1671 todo_wine ok(hr == E_FAIL, "Got 0x%08x\n", hr);
1673 /* Browse to the desktop */
1674 SHGetDesktopFolder(&psf);
1675 hr = IExplorerBrowser_BrowseToObject(peb, (IUnknown*)psf, SBSP_DEFBROWSER);
1676 ok(hr == S_OK, "Got 0x%08x\n", hr);
1677 IShellFolder_Release(psf);
1679 hr = IInputObject_UIActivateIO(pio, TRUE, &msg_a);
1680 todo_wine ok(hr == S_OK, "Got 0x%08x\n", hr);
1682 hr = IInputObject_HasFocusIO(pio);
1683 todo_wine ok(hr == S_OK, "Got 0x%08x\n", hr);
1685 hr = IInputObject_UIActivateIO(pio, FALSE, &msg_a);
1686 todo_wine ok(hr == S_OK, "Got 0x%08x\n", hr);
1688 hr = IInputObject_HasFocusIO(pio);
1689 todo_wine ok(hr == S_OK, "Got 0x%08x\n", hr);
1691 hr = IInputObject_TranslateAcceleratorIO(pio, &msg_a);
1693 key_accels = supported_key_accels_mode1;
1695 key_accels = supported_key_accels_mode2;
1697 for(i = 0; i < 0x100; i++)
1701 for(j = 0; key_accels[j] != 0; j++)
1702 if(key_accels[j] == i)
1710 hr = IInputObject_TranslateAcceleratorIO(pio, &msg_a);
1711 todo_wine ok(hr == (found ? S_OK : S_FALSE), "Got 0x%08x (%04x)\n", hr, i);
1713 Sleep(1000); /* Needed for w2k8 (64bit) */
1718 IInputObject_Release(pio);
1719 IExplorerBrowser_Destroy(peb);
1720 IExplorerBrowser_Release(peb);
1723 static BOOL test_instantiate_control(void)
1725 IExplorerBrowser *peb;
1728 hr = ebrowser_instantiate(&peb);
1729 ok(hr == S_OK || hr == REGDB_E_CLASSNOTREG, "Got (0x%08x)\n", hr);
1733 IExplorerBrowser_Release(peb);
1737 static void setup_window(void)
1740 static const WCHAR ebtestW[] = {'e','b','t','e','s','t',0};
1742 ZeroMemory(&wc, sizeof(WNDCLASSW));
1743 wc.lpfnWndProc = DefWindowProcW;
1744 wc.lpszClassName = ebtestW;
1745 RegisterClassW(&wc);
1746 hwnd = CreateWindowExW(0, ebtestW, NULL, 0,
1749 ok(hwnd != NULL, "Failed to create window for tests.\n");
1752 START_TEST(ebrowser)
1754 OleInitialize(NULL);
1756 if(!test_instantiate_control())
1758 win_skip("No ExplorerBrowser control..\n");
1764 init_function_pointers();
1766 test_QueryInterface();
1768 test_initialization();
1772 test_GetCurrentView();
1776 DestroyWindow(hwnd);