shell32: Fix ExplorerBrowser::SetRect to work properly when passed a NULL-valued...
[wine.git] / dlls / shell32 / tests / ebrowser.c
blob99368d03cccab67ac993b45f4e58066e3565df49
1 /*
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
21 #include <stdio.h>
23 #define COBJMACROS
25 #include "shlobj.h"
26 #include "shlwapi.h"
28 #include "wine/test.h"
30 #include "initguid.h"
31 #include "mshtml.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);
64 static HWND hwnd;
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)
71 HMODULE hmod;
73 hmod = GetModuleHandleA("shell32.dll");
74 pSHCreateShellItem = (void*)GetProcAddress(hmod, "SHCreateShellItem");
75 pSHParseDisplayName = (void*)GetProcAddress(hmod, "SHParseDisplayName");
78 /*********************************************************************
79 * Some simple helpers
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)
89 RECT rc;
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;
97 SHGetSpecialFolderLocation (hwnd, CSIDL_DESKTOP, &pidl_desktop);
98 return IExplorerBrowser_BrowseToIDList(peb, pidl_desktop, 0);
101 /* Process some messages */
102 static void process_msgs(void)
104 MSG msg;
105 while(PeekMessage( &msg, NULL, 0, 0, PM_REMOVE))
107 TranslateMessage(&msg);
108 DispatchMessage(&msg);
112 static void dbg_print_guid(const GUID *guid) {
113 WCHAR buf[MAX_PATH];
115 StringFromGUID2(guid, buf, MAX_PATH);
116 printf("guid:[%s]\n", wine_dbgstr_wn(buf, lstrlenW(buf)));
119 /*********************************************************************
120 * IExplorerBrowserEvents implementation
122 typedef struct {
123 const IExplorerBrowserEventsVtbl *lpVtbl;
124 LONG ref;
125 UINT pending, created, completed, failed;
126 } IExplorerBrowserEventsImpl;
128 static IExplorerBrowserEventsImpl ebev;
130 static HRESULT WINAPI IExplorerBrowserEvents_fnQueryInterface(IExplorerBrowserEvents *iface,
131 REFIID riid, void **ppvObj)
133 ok(0, "Never called.\n");
134 return E_NOINTERFACE;
137 static ULONG WINAPI IExplorerBrowserEvents_fnAddRef(IExplorerBrowserEvents *iface)
139 IExplorerBrowserEventsImpl *This = (IExplorerBrowserEventsImpl*)iface;
140 return InterlockedIncrement(&This->ref);
143 static ULONG WINAPI IExplorerBrowserEvents_fnRelease(IExplorerBrowserEvents *iface)
145 IExplorerBrowserEventsImpl *This = (IExplorerBrowserEventsImpl*)iface;
146 return InterlockedDecrement(&This->ref);
149 static HRESULT WINAPI IExplorerBrowserEvents_fnOnNavigationPending(IExplorerBrowserEvents *iface,
150 PCIDLIST_ABSOLUTE pidlFolder)
152 IExplorerBrowserEventsImpl *This = (IExplorerBrowserEventsImpl*)iface;
153 This->pending++;
154 return S_OK;
157 static HRESULT WINAPI IExplorerBrowserEvents_fnOnNavigationComplete(IExplorerBrowserEvents *iface,
158 PCIDLIST_ABSOLUTE pidlFolder)
160 IExplorerBrowserEventsImpl *This = (IExplorerBrowserEventsImpl*)iface;
161 This->completed++;
162 return S_OK;
164 static HRESULT WINAPI IExplorerBrowserEvents_fnOnNavigationFailed(IExplorerBrowserEvents *iface,
165 PCIDLIST_ABSOLUTE pidlFolder)
167 IExplorerBrowserEventsImpl *This = (IExplorerBrowserEventsImpl*)iface;
168 This->failed++;
169 return S_OK;
171 static HRESULT WINAPI IExplorerBrowserEvents_fnOnViewCreated(IExplorerBrowserEvents *iface,
172 IShellView *psv)
174 IExplorerBrowserEventsImpl *This = (IExplorerBrowserEventsImpl*)iface;
175 This->created++;
176 return S_OK;
179 static const IExplorerBrowserEventsVtbl ebevents =
181 IExplorerBrowserEvents_fnQueryInterface,
182 IExplorerBrowserEvents_fnAddRef,
183 IExplorerBrowserEvents_fnRelease,
184 IExplorerBrowserEvents_fnOnNavigationPending,
185 IExplorerBrowserEvents_fnOnViewCreated,
186 IExplorerBrowserEvents_fnOnNavigationComplete,
187 IExplorerBrowserEvents_fnOnNavigationFailed
190 /*********************************************************************
191 * IExplorerPaneVisibility implementation
193 typedef struct
195 const IExplorerPaneVisibilityVtbl *lpVtbl;
196 LONG ref;
197 LONG count;
198 LONG np, cp, cp_o, cp_v, dp, pp, qp, aqp, unk; /* The panes */
199 } IExplorerPaneVisibilityImpl;
201 static HRESULT WINAPI IExplorerPaneVisibility_fnQueryInterface(IExplorerPaneVisibility *iface,
202 REFIID riid, LPVOID *ppvObj)
204 ok(0, "Not called.\n");
205 trace("REFIID:"); dbg_print_guid(riid);
206 *ppvObj = NULL;
207 return E_NOINTERFACE;
210 static ULONG WINAPI IExplorerPaneVisibility_fnAddRef(IExplorerPaneVisibility *iface)
212 IExplorerPaneVisibilityImpl *This = (IExplorerPaneVisibilityImpl *)iface;
213 return InterlockedIncrement(&This->ref);
216 static ULONG WINAPI IExplorerPaneVisibility_fnRelease(IExplorerPaneVisibility *iface)
218 IExplorerPaneVisibilityImpl *This = (IExplorerPaneVisibilityImpl *)iface;
219 ULONG ref = InterlockedDecrement(&This->ref);
221 if(!ref)
222 HeapFree(GetProcessHeap(), 0, This);
224 return ref;
227 static HRESULT WINAPI IExplorerPaneVisibility_fnGetPaneState(IExplorerPaneVisibility *iface,
228 REFEXPLORERPANE ep,
229 EXPLORERPANESTATE *peps)
231 IExplorerPaneVisibilityImpl *This = (IExplorerPaneVisibilityImpl *)iface;
232 This->count++;
234 ok(ep != NULL, "ep is NULL.\n");
235 ok(peps != NULL, "peps is NULL.\n");
236 ok(*peps == 0, "got %d\n", *peps);
238 *peps = EPS_FORCE;
239 if(IsEqualGUID(&EP_NavPane, ep)) This->np++;
240 else if(IsEqualGUID(&EP_Commands, ep)) This->cp++;
241 else if(IsEqualGUID(&EP_Commands_Organize, ep)) This->cp_o++;
242 else if(IsEqualGUID(&EP_Commands_View, ep)) This->cp_v++;
243 else if(IsEqualGUID(&EP_DetailsPane, ep)) This->dp++;
244 else if(IsEqualGUID(&EP_PreviewPane, ep)) This->pp++;
245 else if(IsEqualGUID(&EP_QueryPane, ep)) This->qp++;
246 else if(IsEqualGUID(&EP_AdvQueryPane, ep)) This->aqp++;
247 else
249 trace("Unknown explorer pane: "); dbg_print_guid(ep);
250 This->unk++;
253 return S_OK;
256 static const IExplorerPaneVisibilityVtbl epvvt =
258 IExplorerPaneVisibility_fnQueryInterface,
259 IExplorerPaneVisibility_fnAddRef,
260 IExplorerPaneVisibility_fnRelease,
261 IExplorerPaneVisibility_fnGetPaneState
264 static IExplorerPaneVisibilityImpl *create_explorerpanevisibility(void)
266 IExplorerPaneVisibilityImpl *epv;
268 epv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IExplorerPaneVisibilityImpl));
269 epv->lpVtbl = &epvvt;
270 epv->ref = 1;
272 return epv;
275 /*********************************************************************
276 * ICommDlgBrowser3 implementation
278 typedef struct
280 const ICommDlgBrowser3Vtbl *lpVtbl;
281 LONG ref;
282 UINT OnDefaultCommand, OnStateChange, IncludeObject;
283 UINT Notify, GetDefaultMenuText, GetViewFlags;
284 UINT OnColumnClicked, GetCurrentFilter, OnPreviewCreated;
285 } ICommDlgBrowser3Impl;
287 static HRESULT WINAPI ICommDlgBrowser3_fnQueryInterface(ICommDlgBrowser3 *iface, REFIID riid, LPVOID *ppvObj)
289 ok(0, "Not called.\n");
290 trace("riid:"); dbg_print_guid(riid);
291 *ppvObj = NULL;
292 return E_NOINTERFACE;
295 static ULONG WINAPI ICommDlgBrowser3_fnAddRef(ICommDlgBrowser3 *iface)
297 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
298 return InterlockedIncrement(&This->ref);
301 static ULONG WINAPI ICommDlgBrowser3_fnRelease(ICommDlgBrowser3 *iface)
303 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
304 ULONG ref = InterlockedDecrement(&This->ref);
306 if(!ref)
307 HeapFree(GetProcessHeap(), 0, This);
309 return ref;
312 static HRESULT WINAPI ICommDlgBrowser3_fnOnDefaultCommand(ICommDlgBrowser3* iface, IShellView *shv)
314 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
315 This->OnDefaultCommand++;
316 return E_NOTIMPL;
319 static HRESULT WINAPI ICommDlgBrowser3_fnOnStateChange(
320 ICommDlgBrowser3* iface,
321 IShellView *shv,
322 ULONG uChange)
324 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
325 This->OnStateChange++;
326 return E_NOTIMPL;
329 static HRESULT WINAPI ICommDlgBrowser3_fnIncludeObject(
330 ICommDlgBrowser3* iface,
331 IShellView *shv,
332 LPCITEMIDLIST pidl)
334 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
335 This->IncludeObject++;
336 return S_OK;
339 static HRESULT WINAPI ICommDlgBrowser3_fnNotify(
340 ICommDlgBrowser3* iface,
341 IShellView *ppshv,
342 DWORD dwNotifyType)
344 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
345 This->Notify++;
346 return E_NOTIMPL;
349 static HRESULT WINAPI ICommDlgBrowser3_fnGetDefaultMenuText(
350 ICommDlgBrowser3* iface,
351 IShellView *ppshv,
352 LPWSTR pszText,
353 int cchMax)
355 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
356 This->GetDefaultMenuText++;
357 return E_NOTIMPL;
360 static HRESULT WINAPI ICommDlgBrowser3_fnGetViewFlags(
361 ICommDlgBrowser3* iface,
362 DWORD *pdwFlags)
364 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
365 This->GetViewFlags++;
366 return E_NOTIMPL;
369 static HRESULT WINAPI ICommDlgBrowser3_fnOnColumnClicked(
370 ICommDlgBrowser3* iface,
371 IShellView *ppshv,
372 int iColumn)
374 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
375 This->OnColumnClicked++;
376 return E_NOTIMPL;
379 static HRESULT WINAPI ICommDlgBrowser3_fnGetCurrentFilter(
380 ICommDlgBrowser3* iface,
381 LPWSTR pszFileSpec,
382 int cchFileSpec)
384 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
385 This->GetCurrentFilter++;
386 return E_NOTIMPL;
389 static HRESULT WINAPI ICommDlgBrowser3_fnOnPreviewCreated(
390 ICommDlgBrowser3* iface,
391 IShellView *ppshv)
393 ICommDlgBrowser3Impl *This = (ICommDlgBrowser3Impl *)iface;
394 This->OnPreviewCreated++;
395 return E_NOTIMPL;
398 static const ICommDlgBrowser3Vtbl cdbvtbl =
400 ICommDlgBrowser3_fnQueryInterface,
401 ICommDlgBrowser3_fnAddRef,
402 ICommDlgBrowser3_fnRelease,
403 ICommDlgBrowser3_fnOnDefaultCommand,
404 ICommDlgBrowser3_fnOnStateChange,
405 ICommDlgBrowser3_fnIncludeObject,
406 ICommDlgBrowser3_fnNotify,
407 ICommDlgBrowser3_fnGetDefaultMenuText,
408 ICommDlgBrowser3_fnGetViewFlags,
409 ICommDlgBrowser3_fnOnColumnClicked,
410 ICommDlgBrowser3_fnGetCurrentFilter,
411 ICommDlgBrowser3_fnOnPreviewCreated
414 static ICommDlgBrowser3Impl *create_commdlgbrowser3(void)
416 ICommDlgBrowser3Impl *cdb;
418 cdb = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ICommDlgBrowser3Impl));
419 cdb->lpVtbl = &cdbvtbl;
420 cdb->ref = 1;
422 return cdb;
425 /*********************************************************************
426 * IServiceProvider Implementation
428 typedef struct {
429 const IServiceProviderVtbl *lpVtbl;
430 LONG ref;
431 struct services {
432 REFGUID service;
433 REFIID id;
434 int count;
435 void *punk;
436 } *interfaces;
437 } IServiceProviderImpl;
439 static HRESULT WINAPI IServiceProvider_fnQueryInterface(IServiceProvider *iface, REFIID riid, LPVOID *ppvObj)
441 *ppvObj = NULL;
442 if(IsEqualIID(riid, &IID_IServiceProvider))
444 *ppvObj = iface;
445 IServiceProvider_AddRef((IServiceProvider*)iface);
446 return S_OK;
449 if(IsEqualIID(riid, &IID_IOleCommandTarget))
451 /* Windows Vista. */
452 return E_NOINTERFACE;
455 ok(0, "Unexpected interface requested.\n");
456 trace("riid: "); dbg_print_guid(riid);
457 return E_NOINTERFACE;
460 static ULONG WINAPI IServiceProvider_fnAddRef(IServiceProvider *iface)
462 IServiceProviderImpl *This = (IServiceProviderImpl*)iface;
463 return InterlockedIncrement(&This->ref);
466 static ULONG WINAPI IServiceProvider_fnRelease(IServiceProvider *iface)
468 IServiceProviderImpl *This = (IServiceProviderImpl*)iface;
469 LONG ref = InterlockedDecrement(&This->ref);
471 if(!ref)
472 HeapFree(GetProcessHeap(), 0, This);
474 return ref;
477 static HRESULT WINAPI IServiceProvider_fnQueryService(IServiceProvider *iface,
478 REFGUID guidService,
479 REFIID riid,
480 void **ppv)
482 IServiceProviderImpl *This = (IServiceProviderImpl*)iface;
483 BOOL was_in_list = FALSE;
484 IUnknown *punk = NULL;
485 UINT i;
487 *ppv = NULL;
488 for(i = 0; This->interfaces[i].service != NULL; i++)
490 if(IsEqualGUID(This->interfaces[i].service, guidService) &&
491 IsEqualIID(This->interfaces[i].id, riid))
493 was_in_list = TRUE;
494 This->interfaces[i].count++;
495 punk = This->interfaces[i].punk;
496 break;
500 ok(was_in_list, "-- Unknown service requested --\n");
501 if(!was_in_list)
503 trace("guidService: "); dbg_print_guid(guidService);
504 trace("riid: "); dbg_print_guid(riid);
507 /* Give back an interface, if any. */
508 if(punk)
510 *ppv = punk;
511 IUnknown_AddRef((IUnknown*)punk);
512 return S_OK;
515 return E_NOINTERFACE;
518 static const IServiceProviderVtbl spvtbl =
520 IServiceProvider_fnQueryInterface,
521 IServiceProvider_fnAddRef,
522 IServiceProvider_fnRelease,
523 IServiceProvider_fnQueryService
526 static IServiceProviderImpl *create_serviceprovider(void)
528 IServiceProviderImpl *sp = HeapAlloc(GetProcessHeap(), 0, sizeof(IServiceProviderImpl));
529 sp->lpVtbl = &spvtbl;
530 sp->ref = 1;
531 return sp;
534 static void test_QueryInterface(void)
536 IExplorerBrowser *peb;
537 IUnknown *punk;
538 HRESULT hr;
539 LONG lres;
541 hr = ebrowser_instantiate(&peb);
542 ok(hr == S_OK, "Got 0x%08x\n", hr);
544 #define test_qinterface(iid, exp) \
545 do { \
546 hr = IExplorerBrowser_QueryInterface(peb, &iid, (void**)&punk); \
547 ok(hr == exp, "(%s:)Expected (0x%08x), got (0x%08x)\n", \
548 #iid, exp, hr); \
549 if(SUCCEEDED(hr)) IUnknown_Release(punk); \
550 } while(0)
552 test_qinterface(IID_IUnknown, S_OK);
553 test_qinterface(IID_IExplorerBrowser, S_OK);
554 test_qinterface(IID_IShellBrowser, S_OK);
555 todo_wine test_qinterface(IID_IOleWindow, S_OK);
556 test_qinterface(IID_ICommDlgBrowser, S_OK);
557 test_qinterface(IID_ICommDlgBrowser2, S_OK);
558 test_qinterface(IID_ICommDlgBrowser3, S_OK);
559 todo_wine test_qinterface(IID_IServiceProvider, S_OK);
560 test_qinterface(IID_IObjectWithSite, S_OK);
561 todo_wine test_qinterface(IID_IConnectionPointContainer, S_OK);
562 test_qinterface(IID_IOleObject, E_NOINTERFACE);
563 test_qinterface(IID_IViewObject, E_NOINTERFACE);
564 test_qinterface(IID_IViewObject2, E_NOINTERFACE);
565 test_qinterface(IID_IViewObjectEx, E_NOINTERFACE);
566 test_qinterface(IID_IConnectionPoint, E_NOINTERFACE);
567 test_qinterface(IID_IShellView, E_NOINTERFACE);
568 test_qinterface(IID_INameSpaceTreeControlEvents, E_NOINTERFACE);
570 #undef test_qinterface
572 lres = IExplorerBrowser_Release(peb);
573 ok(lres == 0, "Got %d\n", lres);
576 static void test_SB_misc(void)
578 IExplorerBrowser *peb;
579 IShellBrowser *psb;
580 IUnknown *punk;
581 HRESULT hr;
582 HWND retHwnd;
583 LRESULT lres;
584 LONG ref;
586 ebrowser_instantiate(&peb);
587 hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb);
588 ok(hr == S_OK, "Got 0x%08x\n", hr);
589 if(FAILED(hr))
591 skip("Failed to get IShellBrowser interface.\n");
592 return;
595 /* Some unimplemented methods */
596 retHwnd = (HWND)0xDEADBEEF;
597 hr = IShellBrowser_GetControlWindow(psb, FCW_TOOLBAR, &retHwnd);
598 ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
599 ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n");
601 hr = IShellBrowser_GetControlWindow(psb, FCW_STATUS, &retHwnd);
602 ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
603 ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n");
605 hr = IShellBrowser_GetControlWindow(psb, FCW_TREE, &retHwnd);
606 ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
607 ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n");
609 hr = IShellBrowser_GetControlWindow(psb, FCW_PROGRESS, &retHwnd);
610 ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
611 ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n");
613 /* ::InsertMenuSB */
614 hr = IShellBrowser_InsertMenusSB(psb, NULL, NULL);
615 ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
617 /* ::RemoveMenusSB */
618 hr = IShellBrowser_RemoveMenusSB(psb, NULL);
619 ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
621 /* ::SetMenuSB */
622 hr = IShellBrowser_SetMenuSB(psb, NULL, NULL, NULL);
623 ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr);
625 /***** Before EB::Initialize *****/
627 /* ::GetWindow */
628 retHwnd = (HWND)0xDEADBEEF;
629 hr = IShellBrowser_GetWindow(psb, &retHwnd);
630 ok(hr == E_FAIL, "got (0x%08x)\n", hr);
631 ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n");
633 todo_wine
636 /* ::SendControlMsg */
637 lres = 0xDEADBEEF;
638 hr = IShellBrowser_SendControlMsg(psb, FCW_STATUS, 0, 0, 0, &lres);
639 ok(hr == S_OK, "got (0x%08x)\n", hr);
640 ok(lres == 0, "lres was %ld\n", lres);
642 lres = 0xDEADBEEF;
643 hr = IShellBrowser_SendControlMsg(psb, FCW_TOOLBAR, TB_CHECKBUTTON,
644 FCIDM_TB_SMALLICON, TRUE, &lres);
645 ok(hr == S_OK, "got (0x%08x)\n", hr);
646 ok(lres == 0, "lres was %ld\n", lres);
648 hr = IShellBrowser_SendControlMsg(psb, FCW_STATUS, 0, 0, 0, NULL);
649 ok(hr == S_OK, "got (0x%08x)\n", hr);
651 hr = IShellBrowser_SendControlMsg(psb, FCW_TREE, 0, 0, 0, NULL);
652 ok(hr == S_OK, "got (0x%08x)\n", hr);
654 hr = IShellBrowser_SendControlMsg(psb, FCW_PROGRESS, 0, 0, 0, NULL);
655 ok(hr == S_OK, "got (0x%08x)\n", hr);
658 /* ::QueryActiveShellView */
659 hr = IShellBrowser_QueryActiveShellView(psb, (IShellView**)&punk);
660 ok(hr == E_FAIL, "got (0x%08x)\n", hr);
662 /* Initialize ExplorerBrowser */
663 ebrowser_initialize(peb);
665 /***** After EB::Initialize *****/
667 /* ::GetWindow */
668 hr = IShellBrowser_GetWindow(psb, &retHwnd);
669 ok(hr == S_OK, "got (0x%08x)\n", hr);
670 ok(GetParent(retHwnd) == hwnd, "The HWND returned is not our child.\n");
672 todo_wine
674 /* ::SendControlMsg */
675 hr = IShellBrowser_SendControlMsg(psb, FCW_STATUS, 0, 0, 0, NULL);
676 ok(hr == S_OK, "got (0x%08x)\n", hr);
678 lres = 0xDEADBEEF;
679 hr = IShellBrowser_SendControlMsg(psb, FCW_TOOLBAR, 0, 0, 0, &lres);
680 ok(hr == S_OK, "got (0x%08x)\n", hr);
681 ok(lres == 0, "lres was %ld\n", lres);
683 lres = 0xDEADBEEF;
684 hr = IShellBrowser_SendControlMsg(psb, FCW_STATUS, 0, 0, 0, &lres);
685 ok(hr == S_OK, "got (0x%08x)\n", hr);
686 ok(lres == 0, "lres was %ld\n", lres);
688 lres = 0xDEADBEEF;
689 hr = IShellBrowser_SendControlMsg(psb, 1234, 0, 0, 0, &lres);
690 ok(hr == S_OK, "got (0x%08x)\n", hr);
691 ok(lres == 0, "lres was %ld\n", lres);
693 /* Returns S_OK */
694 hr = IShellBrowser_SetStatusTextSB(psb, NULL);
695 ok(hr == S_OK, "got (0x%08x)\n", hr);
697 hr = IShellBrowser_ContextSensitiveHelp(psb, FALSE);
698 ok(hr == S_OK, "got (0x%08x)\n", hr);
700 hr = IShellBrowser_EnableModelessSB(psb, TRUE);
701 ok(hr == S_OK, "got (0x%08x)\n", hr);
703 hr = IShellBrowser_SetToolbarItems(psb, NULL, 1, 1);
704 ok(hr == S_OK, "got (0x%08x)\n", hr);
707 hr = IShellBrowser_QueryActiveShellView(psb, (IShellView**)&punk);
708 ok(hr == E_FAIL, "got (0x%08x)\n", hr);
710 IShellBrowser_Release(psb);
711 IExplorerBrowser_Destroy(peb);
712 IExplorerBrowser_Release(peb);
714 /* Browse to the desktop. */
715 ebrowser_instantiate(&peb);
716 ebrowser_initialize(peb);
717 IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb);
719 process_msgs();
720 hr = ebrowser_browse_to_desktop(peb);
721 ok(hr == S_OK, "got (0x%08x)\n", hr);
722 process_msgs();
724 /****** After Browsing *****/
726 hr = IShellBrowser_QueryActiveShellView(psb, (IShellView**)&punk);
727 ok(hr == S_OK, "got (0x%08x)\n", hr);
728 if(SUCCEEDED(hr)) IUnknown_Release(punk);
730 IShellBrowser_Release(psb);
731 IExplorerBrowser_Destroy(peb);
732 ref = IExplorerBrowser_Release(peb);
733 ok(ref == 0, "Got %d\n", ref);
736 static void test_initialization(void)
738 IExplorerBrowser *peb;
739 IShellBrowser *psb;
740 HRESULT hr;
741 ULONG lres;
742 RECT rc;
744 ebrowser_instantiate(&peb);
746 if(0)
748 /* Crashes on Windows 7 */
749 hr = IExplorerBrowser_Initialize(peb, NULL, NULL, NULL);
750 hr = IExplorerBrowser_Initialize(peb, hwnd, NULL, NULL);
753 ZeroMemory(&rc, sizeof(RECT));
755 hr = IExplorerBrowser_Initialize(peb, NULL, &rc, NULL);
756 ok(hr == E_INVALIDARG, "got (0x%08x)\n", hr);
758 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
759 ok(hr == S_OK, "got (0x%08x)\n", hr);
761 /* Initialize twice */
762 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
763 ok(hr == E_UNEXPECTED, "got (0x%08x)\n", hr);
765 hr = IExplorerBrowser_Destroy(peb);
766 ok(hr == S_OK, "got (0x%08x)\n", hr);
768 /* Initialize again */
769 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
770 ok(hr == E_UNEXPECTED, "got (0x%08x)\n", hr);
772 /* Destroy again */
773 hr = IExplorerBrowser_Destroy(peb);
774 ok(hr == S_OK, "got (0x%08x)\n", hr);
775 lres = IExplorerBrowser_Release(peb);
776 ok(lres == 0, "Got %d\n", lres);
778 /* Initialize with a few different rectangles */
779 peb = NULL;
780 ebrowser_instantiate(&peb);
781 rc.left = 50; rc.top = 20; rc.right = 100; rc.bottom = 80;
782 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
783 ok(hr == S_OK, "got (0x%08x)\n", hr);
784 hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb);
785 ok(hr == S_OK, "Got 0x%08x\n", hr);
786 if(SUCCEEDED(hr))
788 HWND eb_hwnd;
789 RECT eb_rc;
790 char buf[1024];
791 LONG style, expected_style;
792 static const RECT exp_rc = {0, 0, 48, 58};
794 hr = IShellBrowser_GetWindow(psb, &eb_hwnd);
795 ok(hr == S_OK, "Got 0x%08x\n", hr);
797 GetClientRect(eb_hwnd, &eb_rc);
798 ok(EqualRect(&eb_rc, &exp_rc), "Got client rect (%d, %d)-(%d, %d)\n",
799 eb_rc.left, eb_rc.top, eb_rc.right, eb_rc.bottom);
801 GetWindowRect(eb_hwnd, &eb_rc);
802 ok(eb_rc.right - eb_rc.left == 50, "Got window width %d\n", eb_rc.right - eb_rc.left);
803 ok(eb_rc.bottom - eb_rc.top == 60, "Got window height %d\n", eb_rc.bottom - eb_rc.top);
805 buf[0] = '\0';
806 GetClassNameA(eb_hwnd, buf, 1024);
807 ok(!lstrcmpA(buf, "ExplorerBrowserControl"), "Unexpected classname %s\n", buf);
809 expected_style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_BORDER;
810 style = GetWindowLongPtrW(eb_hwnd, GWL_STYLE);
811 todo_wine ok(style == expected_style, "Got style 0x%08x, expected 0x%08x\n", style, expected_style);
813 expected_style = WS_EX_CONTROLPARENT;
814 style = GetWindowLongPtrW(eb_hwnd, GWL_EXSTYLE);
815 ok(style == expected_style, "Got exstyle 0x%08x, expected 0x%08x\n", style, expected_style);
817 ok(GetParent(eb_hwnd) == hwnd, "GetParent returns %p\n", GetParent(eb_hwnd));
819 /* ::Destroy() destroys the window. */
820 ok(IsWindow(eb_hwnd), "eb_hwnd invalid.\n");
821 IExplorerBrowser_Destroy(peb);
822 ok(!IsWindow(eb_hwnd), "eb_hwnd valid.\n");
824 IShellBrowser_Release(psb);
825 lres = IExplorerBrowser_Release(peb);
826 ok(lres == 0, "Got refcount %d\n", lres);
828 else
830 skip("Skipping some tests.\n");
832 IExplorerBrowser_Destroy(peb);
833 lres = IExplorerBrowser_Release(peb);
834 ok(lres == 0, "Got refcount %d\n", lres);
837 ebrowser_instantiate(&peb);
838 rc.left = 0; rc.top = 0; rc.right = 0; rc.bottom = 0;
839 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
840 ok(hr == S_OK, "got (0x%08x)\n", hr);
841 IExplorerBrowser_Destroy(peb);
842 lres = IExplorerBrowser_Release(peb);
843 ok(lres == 0, "Got refcount %d\n", lres);
845 ebrowser_instantiate(&peb);
846 rc.left = -1; rc.top = -1; rc.right = 1; rc.bottom = 1;
847 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
848 ok(hr == S_OK, "got (0x%08x)\n", hr);
849 IExplorerBrowser_Destroy(peb);
850 lres = IExplorerBrowser_Release(peb);
851 ok(lres == 0, "Got refcount %d\n", lres);
853 ebrowser_instantiate(&peb);
854 rc.left = 10; rc.top = 10; rc.right = 5; rc.bottom = 5;
855 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
856 ok(hr == S_OK, "got (0x%08x)\n", hr);
857 IExplorerBrowser_Destroy(peb);
858 lres = IExplorerBrowser_Release(peb);
859 ok(lres == 0, "Got refcount %d\n", lres);
861 ebrowser_instantiate(&peb);
862 rc.left = 10; rc.top = 10; rc.right = 5; rc.bottom = 5;
863 hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
864 ok(hr == S_OK, "got (0x%08x)\n", hr);
865 IExplorerBrowser_Destroy(peb);
866 lres = IExplorerBrowser_Release(peb);
867 ok(lres == 0, "Got refcount %d\n", lres);
870 static void test_SetSite(void)
872 IExplorerBrowser *peb;
873 IServiceProviderImpl *spimpl = create_serviceprovider();
874 ICommDlgBrowser3Impl *cdbimpl = create_commdlgbrowser3();
875 IExplorerPaneVisibilityImpl *epvimpl = create_explorerpanevisibility();
876 IObjectWithSite *pow;
877 HRESULT hr;
878 LONG ref;
879 UINT i;
880 struct services expected[] = {
881 /* Win 7 */
882 { &SID_STopLevelBrowser, &IID_ICommDlgBrowser2, 0, cdbimpl },
883 { &SID_STopLevelBrowser, &IID_IShellBrowserService, 0, NULL },
884 { &SID_STopLevelBrowser, &IID_IShellBrowser, 0, NULL },
885 { &SID_STopLevelBrowser, &IID_UnknownInterface8, 0, NULL },
886 { &SID_STopLevelBrowser, &IID_IConnectionPointContainer, 0, NULL },
887 { &SID_STopLevelBrowser, &IID_IProfferService, 0, NULL },
888 { &SID_STopLevelBrowser, &IID_UnknownInterface9, 0, NULL },
889 { &SID_ExplorerPaneVisibility, &IID_IExplorerPaneVisibility, 0, epvimpl },
890 { &SID_SExplorerBrowserFrame, &IID_ICommDlgBrowser2, 0, cdbimpl },
891 { &SID_SExplorerBrowserFrame, &IID_ICommDlgBrowser3, 0, cdbimpl },
892 { &IID_IFileDialogPrivate, &IID_IFileDialogPrivate, 0, NULL },
893 { &IID_IFileDialogPrivate, &IID_IFileDialog, 0, NULL },
894 { &IID_IShellTaskScheduler, &IID_IShellTaskScheduler, 0, NULL },
895 { &IID_IShellTaskScheduler, &IID_UnknownInterface2, 0, NULL },
896 { &IID_IWebbrowserApp, &IID_IConnectionPointContainer, 0, NULL },
897 { &IID_IFolderView, &IID_IFolderView, 0, NULL },
898 { &IID_ILayoutModifier, &IID_ILayoutModifier, 0, NULL },
899 { &IID_IBrowserSettings, &IID_IBrowserSettings, 0, NULL },
900 { &CLSID_Desktop, &IID_IUnknown, 0, NULL },
901 { &IID_UnknownInterface1, &IID_UnknownInterface1, 0, NULL },
902 { &IID_UnknownInterface3, &IID_UnknownInterface3, 0, NULL },
903 { &IID_UnknownInterface4, &IID_IUnknown, 0, NULL },
904 { &IID_UnknownInterface6, &IID_UnknownInterface7, 0, NULL },
905 { &IID_IBrowserWithActivationNotification, &IID_IBrowserWithActivationNotification, 0, NULL },
907 /* Other services requested in Vista, Windows 2008 but not in Windows 7 */
908 { &IID_IBrowserSettings_Vista, &IID_IBrowserSettings_Vista, 0, NULL },
909 { &IID_IFolderTypeModifier, &IID_IFolderTypeModifier, 0, NULL },
910 { &SID_STopLevelBrowser, &IID_IShellBrowserService_Vista, 0, NULL },
911 { &IID_UnknownInterface5, &IID_UnknownInterface5, 0, NULL },
912 { &IID_ICommDlgBrowser, &IID_ICommDlgBrowser, 0, cdbimpl },
913 { &IID_IFileDialogPrivate_Vista,&IID_IFileDialogPrivate_Vista, 0, NULL},
914 { &IID_IFileDialogPrivate_Vista,&IID_IFileDialog, 0, NULL},
915 { &IID_UnknownInterface10, &IID_IHTMLDocument2, 0, NULL},
916 { &SID_SMenuBandParent, &IID_IOleCommandTarget, 0, NULL},
917 { &SID_SMenuBandParent, &IID_IShellMenu, 0, NULL},
918 { &SID_STopLevelBrowser, &IID_IOleWindow, 0, NULL},
919 { &SID_SMenuPopup, &IID_IOleCommandTarget, 0, NULL},
920 { NULL }
923 ebrowser_instantiate(&peb);
924 IExplorerBrowser_SetOptions(peb, EBO_SHOWFRAMES);
926 hr = IExplorerBrowser_QueryInterface(peb, &IID_IObjectWithSite, (void**)&pow);
927 ok(hr == S_OK, "Got 0x%08x\n", hr);
928 if(SUCCEEDED(hr))
930 spimpl->interfaces = expected;
932 hr = IObjectWithSite_SetSite(pow, (IUnknown*)spimpl);
933 ok(hr == S_OK, "Got 0x%08x\n", hr);
935 if(FAILED(hr))
936 IObjectWithSite_Release(pow);
939 if(FAILED(hr))
941 skip("Failed to set site.\n");
943 IServiceProvider_Release((IServiceProvider*)spimpl);
944 ICommDlgBrowser3_Release((ICommDlgBrowser3*)cdbimpl);
945 IExplorerPaneVisibility_Release((IExplorerPaneVisibility*)epvimpl);
946 IExplorerBrowser_Destroy(peb);
947 ref = IExplorerBrowser_Release(peb);
948 ok(ref == 0, "Got ref %d\n", ref);
950 return;
953 ShowWindow(hwnd, TRUE);
954 ebrowser_initialize(peb);
955 ebrowser_browse_to_desktop(peb);
957 for(i = 0; i < 10; i++)
959 Sleep(100);
960 process_msgs();
962 ShowWindow(hwnd, FALSE);
964 /* ICommDlgBrowser3 */
965 ok(!cdbimpl->OnDefaultCommand, "Got %d\n", cdbimpl->OnDefaultCommand);
966 todo_wine ok(cdbimpl->OnStateChange, "Got %d\n", cdbimpl->OnStateChange);
967 ok(cdbimpl->IncludeObject, "Got %d\n", cdbimpl->IncludeObject);
968 ok(!cdbimpl->Notify, "Got %d\n", cdbimpl->Notify);
969 ok(!cdbimpl->GetDefaultMenuText, "Got %d\n", cdbimpl->GetDefaultMenuText);
970 todo_wine ok(cdbimpl->GetViewFlags, "Got %d\n", cdbimpl->GetViewFlags);
971 ok(!cdbimpl->OnColumnClicked, "Got %d\n", cdbimpl->OnColumnClicked);
972 ok(!cdbimpl->GetCurrentFilter, "Got %d\n", cdbimpl->GetCurrentFilter);
973 todo_wine ok(cdbimpl->OnPreviewCreated, "Got %d\n", cdbimpl->OnPreviewCreated);
975 /* IExplorerPaneVisibility */
976 ok(epvimpl->np, "Got %d\n", epvimpl->np);
977 todo_wine ok(epvimpl->cp, "Got %d\n", epvimpl->cp);
978 todo_wine ok(epvimpl->cp_o, "Got %d\n", epvimpl->cp_o);
979 todo_wine ok(epvimpl->cp_v, "Got %d\n", epvimpl->cp_v);
980 todo_wine ok(epvimpl->dp, "Got %d\n", epvimpl->dp);
981 todo_wine ok(epvimpl->pp, "Got %d\n", epvimpl->pp);
982 ok(!epvimpl->qp, "Got %d\n", epvimpl->qp);
983 ok(!epvimpl->aqp, "Got %d\n", epvimpl->aqp);
984 ok(!epvimpl->unk, "Got %d\n", epvimpl->unk);
986 if(0)
988 for(i = 0; expected[i].service != NULL; i++)
989 if(!expected[i].count) trace("count %d was 0.\n", i);
992 /* Test when IServiceProvider is released. */
993 IServiceProvider_AddRef((IServiceProvider*)spimpl);
994 ref = IServiceProvider_Release((IServiceProvider*)spimpl);
995 ok(ref == 2, "Got ref %d\n", ref);
997 hr = IObjectWithSite_SetSite(pow, NULL);
998 ok(hr == S_OK, "Got 0x%08x\n", hr);
1000 IServiceProvider_AddRef((IServiceProvider*)spimpl);
1001 ref = IServiceProvider_Release((IServiceProvider*)spimpl);
1002 ok(ref == 1, "Got ref %d\n", ref);
1004 hr = IObjectWithSite_SetSite(pow, (IUnknown*)spimpl);
1005 ok(hr == S_OK, "Got 0x%08x\n", hr);
1007 IServiceProvider_AddRef((IServiceProvider*)spimpl);
1008 ref = IServiceProvider_Release((IServiceProvider*)spimpl);
1009 ok(ref == 2, "Got ref %d\n", ref);
1011 IExplorerBrowser_Destroy(peb);
1013 IServiceProvider_AddRef((IServiceProvider*)spimpl);
1014 ref = IServiceProvider_Release((IServiceProvider*)spimpl);
1015 ok(ref == 2, "Got ref %d\n", ref);
1017 IObjectWithSite_Release(pow);
1018 ref = IExplorerBrowser_Release(peb);
1019 ok(ref == 0, "Got ref %d\n", ref);
1021 ref = IServiceProvider_Release((IServiceProvider*)spimpl);
1022 ok(ref == 0, "Got ref %d\n", ref);
1024 ref = ICommDlgBrowser3_Release((ICommDlgBrowser3*)cdbimpl);
1025 ok(ref == 0, "Got ref %d\n", ref);
1026 ref = IExplorerPaneVisibility_Release((IExplorerPaneVisibility*)epvimpl);
1027 ok(ref == 0, "Got ref %d\n", ref);
1030 static void test_basics(void)
1032 IExplorerBrowser *peb;
1033 IShellBrowser *psb;
1034 FOLDERSETTINGS fs;
1035 ULONG lres;
1036 DWORD flags;
1037 HDWP hdwp;
1038 RECT rc;
1039 HRESULT hr;
1041 ebrowser_instantiate(&peb);
1042 ebrowser_initialize(peb);
1044 /* SetRect */
1045 rc.left = 0; rc.top = 0; rc.right = 0; rc.bottom = 0;
1046 hr = IExplorerBrowser_SetRect(peb, NULL, rc);
1047 ok(hr == S_OK, "got (0x%08x)\n", hr);
1049 rc.left = 100; rc.top = 100; rc.right = 10; rc.bottom = 10;
1050 hr = IExplorerBrowser_SetRect(peb, NULL, rc);
1051 ok(hr == S_OK, "got (0x%08x)\n", hr);
1053 /* SetRect with DeferWindowPos */
1054 rc.left = rc.top = 0; rc.right = rc.bottom = 10;
1055 hdwp = BeginDeferWindowPos(1);
1056 hr = IExplorerBrowser_SetRect(peb, &hdwp, rc);
1057 ok(hr == S_OK, "got (0x%08x)\n", hr);
1058 lres = EndDeferWindowPos(hdwp);
1059 ok(lres, "EndDeferWindowPos failed.\n");
1061 hdwp = NULL;
1062 hr = IExplorerBrowser_SetRect(peb, &hdwp, rc);
1063 ok(hr == S_OK, "got (0x%08x)\n", hr);
1064 ok(hdwp == NULL, "got %p\n", hdwp);
1065 lres = EndDeferWindowPos(hdwp);
1066 ok(!lres, "EndDeferWindowPos succeeded unexpectedly.\n");
1068 /* Test positioning */
1069 rc.left = 10; rc.top = 20; rc.right = 50; rc.bottom = 50;
1070 hr = IExplorerBrowser_SetRect(peb, NULL, rc);
1071 ok(hr == S_OK, "got (0x%08x)\n", hr);
1072 hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb);
1073 ok(hr == S_OK, "Got 0x%08x\n", hr);
1074 if(SUCCEEDED(hr))
1076 HWND eb_hwnd;
1077 RECT eb_rc;
1078 static const RECT exp_rc = {11, 21, 49, 49};
1079 static const RECT exp_rc2 = {11, 21, 49, 24};
1081 hr = IShellBrowser_GetWindow(psb, &eb_hwnd);
1082 ok(hr == S_OK, "Got 0x%08x\n", hr);
1084 GetClientRect(eb_hwnd, &eb_rc);
1085 MapWindowPoints(eb_hwnd, hwnd, (POINT*)&eb_rc, 2);
1086 ok(EqualRect(&eb_rc, &exp_rc), "Got rect (%d, %d) - (%d, %d)\n",
1087 eb_rc.left, eb_rc.top, eb_rc.right, eb_rc.bottom);
1089 /* Try resizing with invalid hdwp */
1090 rc.bottom = 25;
1091 hdwp = (HDWP)0xdeadbeef;
1092 hr = IExplorerBrowser_SetRect(peb, &hdwp, rc);
1093 ok(hr == E_FAIL, "Got 0x%08x\n", hr);
1094 GetClientRect(eb_hwnd, &eb_rc);
1095 MapWindowPoints(eb_hwnd, hwnd, (POINT*)&eb_rc, 2);
1096 ok(EqualRect(&eb_rc, &exp_rc), "Got rect (%d, %d) - (%d, %d)\n",
1097 eb_rc.left, eb_rc.top, eb_rc.right, eb_rc.bottom);
1099 hdwp = NULL;
1100 hr = IExplorerBrowser_SetRect(peb, &hdwp, rc);
1101 ok(hr == S_OK, "Got 0x%08x\n", hr);
1102 GetClientRect(eb_hwnd, &eb_rc);
1103 MapWindowPoints(eb_hwnd, hwnd, (POINT*)&eb_rc, 2);
1104 ok(EqualRect(&eb_rc, &exp_rc2), "Got rect (%d, %d) - (%d, %d)\n",
1105 eb_rc.left, eb_rc.top, eb_rc.right, eb_rc.bottom);
1107 IShellBrowser_Release(psb);
1110 IExplorerBrowser_Destroy(peb);
1111 IExplorerBrowser_Release(peb);
1113 /* GetOptions/SetOptions*/
1114 ebrowser_instantiate(&peb);
1116 if(0) {
1117 /* Crashes on Windows 7 */
1118 IExplorerBrowser_GetOptions(peb, NULL);
1121 hr = IExplorerBrowser_GetOptions(peb, &flags);
1122 ok(hr == S_OK, "got (0x%08x)\n", hr);
1123 ok(flags == 0, "got (0x%08x)\n", flags);
1125 /* Settings preserved through Initialize. */
1126 hr = IExplorerBrowser_SetOptions(peb, 0xDEADBEEF);
1127 ok(hr == S_OK, "got (0x%08x)\n", hr);
1129 ebrowser_initialize(peb);
1131 hr = IExplorerBrowser_GetOptions(peb, &flags);
1132 ok(flags == 0xDEADBEEF, "got (0x%08x)\n", flags);
1133 ok(hr == S_OK, "got (0x%08x)\n", hr);
1135 IExplorerBrowser_Destroy(peb);
1136 IExplorerBrowser_Release(peb);
1138 ebrowser_instantiate(&peb);
1139 ebrowser_initialize(peb);
1141 /* SetFolderSettings */
1142 hr = IExplorerBrowser_SetFolderSettings(peb, NULL);
1143 ok(hr == E_INVALIDARG, "got (0x%08x)\n", hr);
1144 fs.ViewMode = 0; fs.fFlags = 0;
1145 hr = IExplorerBrowser_SetFolderSettings(peb, &fs);
1146 todo_wine ok(hr == E_INVALIDARG, "got (0x%08x)\n", hr);
1148 /* TODO: Test after browsing somewhere. */
1150 IExplorerBrowser_Destroy(peb);
1151 lres = IExplorerBrowser_Release(peb);
1152 ok(lres == 0, "Got %d\n", lres);
1155 static void test_Advise(void)
1157 IExplorerBrowser *peb;
1158 IExplorerBrowserEvents *pebe;
1159 DWORD cookies[10];
1160 HRESULT hr;
1161 UINT i, ref;
1163 /* Set up our IExplorerBrowserEvents implementation */
1164 ebev.lpVtbl = &ebevents;
1165 pebe = (IExplorerBrowserEvents*) &ebev;
1167 ebrowser_instantiate(&peb);
1169 if(0)
1171 /* Crashes on Windows 7 */
1172 IExplorerBrowser_Advise(peb, pebe, NULL);
1173 IExplorerBrowser_Advise(peb, NULL, &cookies[0]);
1176 /* Using Unadvise with a cookie that has yet to be given out
1177 * results in E_INVALIDARG */
1178 hr = IExplorerBrowser_Unadvise(peb, 11);
1179 ok(hr == E_INVALIDARG, "got (0x%08x)\n", hr);
1181 /* Add some before initialization */
1182 for(i = 0; i < 5; i++)
1184 hr = IExplorerBrowser_Advise(peb, pebe, &cookies[i]);
1185 ok(hr == S_OK, "got (0x%08x)\n", hr);
1188 ebrowser_initialize(peb);
1190 /* Add some after initialization */
1191 for(i = 5; i < 10; i++)
1193 hr = IExplorerBrowser_Advise(peb, pebe, &cookies[i]);
1194 ok(hr == S_OK, "got (0x%08x)\n", hr);
1197 ok(ebev.ref == 10, "Got %d\n", ebev.ref);
1199 ebev.completed = 0;
1200 ebrowser_browse_to_desktop(peb);
1201 process_msgs();
1202 ok(ebev.completed == 10, "Got %d\n", ebev.completed);
1204 /* Remove a bunch somewhere in the middle */
1205 for(i = 4; i < 8; i++)
1207 hr = IExplorerBrowser_Unadvise(peb, cookies[i]);
1208 ok(hr == S_OK, "got (0x%08x)\n", hr);
1211 ebev.completed = 0;
1212 ebrowser_browse_to_desktop(peb);
1213 process_msgs();
1214 ok(ebev.completed == 6, "Got %d\n", ebev.completed);
1216 if(0)
1218 /* Using unadvise with a previously unadvised cookie results
1219 * in a crash. */
1220 hr = IExplorerBrowser_Unadvise(peb, cookies[5]);
1223 /* Remove the rest. */
1224 for(i = 0; i < 10; i++)
1226 if(i<4||i>7)
1228 hr = IExplorerBrowser_Unadvise(peb, cookies[i]);
1229 ok(hr == S_OK, "%d: got (0x%08x)\n", i, hr);
1233 ok(ebev.ref == 0, "Got %d\n", ebev.ref);
1235 ebev.completed = 0;
1236 ebrowser_browse_to_desktop(peb);
1237 process_msgs();
1238 ok(ebev.completed == 0, "Got %d\n", ebev.completed);
1240 /* ::Destroy implies ::Unadvise. */
1241 hr = IExplorerBrowser_Advise(peb, pebe, &cookies[0]);
1242 ok(hr == S_OK, "Got 0x%08x\n", hr);
1243 ok(ebev.ref == 1, "Got %d\n", ebev.ref);
1245 hr = IExplorerBrowser_Destroy(peb);
1246 ok(hr == S_OK, "Got 0x%08x\n", hr);
1247 ok(ebev.ref == 0, "Got %d\n", ebev.ref);
1249 ref = IExplorerBrowser_Release(peb);
1250 ok(!ref, "Got %d\n", ref);
1253 /* Based on PathAddBackslashW from dlls/shlwapi/path.c */
1254 static LPWSTR myPathAddBackslashW( LPWSTR lpszPath )
1256 size_t iLen;
1258 if (!lpszPath || (iLen = lstrlenW(lpszPath)) >= MAX_PATH)
1259 return NULL;
1261 if (iLen)
1263 lpszPath += iLen;
1264 if (lpszPath[-1] != '\\')
1266 *lpszPath++ = '\\';
1267 *lpszPath = '\0';
1270 return lpszPath;
1273 static void test_browse_pidl_(IExplorerBrowser *peb, IExplorerBrowserEventsImpl *ebev,
1274 LPITEMIDLIST pidl, UINT uFlags,
1275 HRESULT hr_exp, UINT pending, UINT created, UINT failed, UINT completed,
1276 const char *file, int line)
1278 HRESULT hr;
1279 ebev->completed = ebev->created = ebev->pending = ebev->failed = 0;
1281 hr = IExplorerBrowser_BrowseToIDList(peb, pidl, uFlags);
1282 ok_(file, line) (hr == hr_exp, "BrowseToIDList returned 0x%08x\n", hr);
1283 process_msgs();
1285 ok_(file, line)
1286 (ebev->pending == pending && ebev->created == created &&
1287 ebev->failed == failed && ebev->completed == completed,
1288 "Events occurred: %d, %d, %d, %d\n",
1289 ebev->pending, ebev->created, ebev->failed, ebev->completed);
1291 #define test_browse_pidl(peb, ebev, pidl, uFlags, hr, p, cr, f, co) \
1292 test_browse_pidl_(peb, ebev, pidl, uFlags, hr, p, cr, f, co, __FILE__, __LINE__)
1294 static void test_browse_pidl_sb_(IExplorerBrowser *peb, IExplorerBrowserEventsImpl *ebev,
1295 LPITEMIDLIST pidl, UINT uFlags,
1296 HRESULT hr_exp, UINT pending, UINT created, UINT failed, UINT completed,
1297 const char *file, int line)
1299 IShellBrowser *psb;
1300 HRESULT hr;
1302 hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb);
1303 ok_(file, line) (hr == S_OK, "QueryInterface returned 0x%08x\n", hr);
1304 if(SUCCEEDED(hr))
1306 ebev->completed = ebev->created = ebev->pending = ebev->failed = 0;
1308 hr = IShellBrowser_BrowseObject(psb, pidl, uFlags);
1309 ok_(file, line) (hr == hr_exp, "BrowseObject returned 0x%08x\n", hr);
1310 process_msgs();
1312 ok_(file, line)
1313 (ebev->pending == pending && ebev->created == created &&
1314 ebev->failed == failed && ebev->completed == completed,
1315 "Events occurred: %d, %d, %d, %d\n",
1316 ebev->pending, ebev->created, ebev->failed, ebev->completed);
1318 IShellBrowser_Release(psb);
1321 #define test_browse_pidl_sb(peb, ebev, pidl, uFlags, hr, p, cr, f, co) \
1322 test_browse_pidl_sb_(peb, ebev, pidl, uFlags, hr, p, cr, f, co, __FILE__, __LINE__)
1324 static void test_navigation(void)
1326 IExplorerBrowser *peb, *peb2;
1327 IFolderView *pfv;
1328 IShellItem *psi;
1329 IShellFolder *psf;
1330 LPITEMIDLIST pidl_current, pidl_child;
1331 DWORD cookie, cookie2;
1332 HRESULT hr;
1333 LONG lres;
1334 WCHAR current_path[MAX_PATH];
1335 WCHAR child_path[MAX_PATH];
1336 static const WCHAR testfolderW[] =
1337 {'w','i','n','e','t','e','s','t','f','o','l','d','e','r','\0'};
1339 ok(pSHParseDisplayName != NULL, "pSHParseDisplayName unexpectedly missing.\n");
1340 ok(pSHCreateShellItem != NULL, "pSHCreateShellItem unexpectedly missing.\n");
1342 GetCurrentDirectoryW(MAX_PATH, current_path);
1343 if(!lstrlenW(current_path))
1345 skip("Failed to create test-directory.\n");
1346 return;
1349 lstrcpyW(child_path, current_path);
1350 myPathAddBackslashW(child_path);
1351 lstrcatW(child_path, testfolderW);
1353 CreateDirectoryW(child_path, NULL);
1355 pSHParseDisplayName(current_path, NULL, &pidl_current, 0, NULL);
1356 pSHParseDisplayName(child_path, NULL, &pidl_child, 0, NULL);
1358 ebrowser_instantiate(&peb);
1359 ebrowser_initialize(peb);
1361 ebrowser_instantiate(&peb2);
1362 ebrowser_initialize(peb2);
1364 /* Set up our IExplorerBrowserEvents implementation */
1365 ebev.lpVtbl = &ebevents;
1367 IExplorerBrowser_Advise(peb, (IExplorerBrowserEvents*)&ebev, &cookie);
1368 IExplorerBrowser_Advise(peb2, (IExplorerBrowserEvents*)&ebev, &cookie2);
1370 /* These should all fail */
1371 test_browse_pidl(peb, &ebev, 0, SBSP_ABSOLUTE | SBSP_RELATIVE, E_FAIL, 0, 0, 0, 0);
1372 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_ABSOLUTE | SBSP_RELATIVE, E_FAIL, 0, 0, 0, 0);
1373 test_browse_pidl(peb, &ebev, 0, SBSP_ABSOLUTE, E_INVALIDARG, 0, 0, 0, 0);
1374 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_ABSOLUTE, E_INVALIDARG, 0, 0, 0, 0);
1375 test_browse_pidl(peb, &ebev, 0, SBSP_RELATIVE, E_FAIL, 0, 0, 0, 0);
1376 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_RELATIVE, E_FAIL, 0, 0, 0, 0);
1377 test_browse_pidl(peb, &ebev, 0, SBSP_PARENT, E_FAIL, 0, 0, 0, 0);
1378 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_PARENT, E_FAIL, 0, 0, 0, 0);
1379 test_browse_pidl(peb, &ebev, 0, SBSP_NAVIGATEFORWARD, E_FAIL, 0, 0, 0, 0);
1380 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_NAVIGATEFORWARD, E_FAIL, 0, 0, 0, 0);
1381 test_browse_pidl(peb, &ebev, 0, SBSP_NAVIGATEBACK, E_FAIL, 0, 0, 0, 0);
1382 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_NAVIGATEBACK, E_FAIL, 0, 0, 0, 0);
1384 /* "The first browse is synchronous" */
1385 test_browse_pidl(peb, &ebev, pidl_child, SBSP_ABSOLUTE, S_OK, 1, 1, 0, 1);
1386 test_browse_pidl_sb(peb2, &ebev, pidl_child, SBSP_ABSOLUTE, S_OK, 1, 1, 0, 1);
1388 /* Navigate empty history */
1389 test_browse_pidl(peb, &ebev, 0, SBSP_NAVIGATEFORWARD, S_OK, 0, 0, 0, 0);
1390 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_NAVIGATEFORWARD, S_OK, 0, 0, 0, 0);
1391 test_browse_pidl(peb, &ebev, 0, SBSP_NAVIGATEBACK, S_OK, 0, 0, 0, 0);
1392 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_NAVIGATEBACK, S_OK, 0, 0, 0, 0);
1394 /* Navigate history */
1395 test_browse_pidl(peb, &ebev, 0, SBSP_PARENT, S_OK, 1, 1, 0, 1);
1396 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_PARENT, S_OK, 1, 1, 0, 1);
1397 test_browse_pidl(peb, &ebev, 0, SBSP_NAVIGATEBACK, S_OK, 1, 1, 0, 1);
1398 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_NAVIGATEBACK, S_OK, 1, 1, 0, 1);
1399 test_browse_pidl(peb, &ebev, 0, SBSP_NAVIGATEFORWARD, S_OK, 1, 1, 0, 1);
1400 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_NAVIGATEFORWARD, S_OK, 1, 1, 0, 1);
1401 test_browse_pidl(peb, &ebev, 0, SBSP_ABSOLUTE, S_OK, 0, 0, 0, 0);
1402 test_browse_pidl_sb(peb2, &ebev, 0, SBSP_ABSOLUTE, S_OK, 0, 0, 0, 0);
1404 /* Relative navigation */
1405 test_browse_pidl(peb, &ebev, pidl_current, SBSP_ABSOLUTE, S_OK, 1, 0, 0, 1);
1406 test_browse_pidl_sb(peb2, &ebev, pidl_current, SBSP_ABSOLUTE, S_OK, 1, 0, 0, 1);
1408 hr = IExplorerBrowser_GetCurrentView(peb, &IID_IFolderView, (void**)&pfv);
1409 ok(hr == S_OK, "Got 0x%08x\n", hr);
1410 if(SUCCEEDED(hr))
1412 LPITEMIDLIST pidl_relative;
1414 hr = IFolderView_GetFolder(pfv, &IID_IShellFolder, (void**)&psf);
1415 ok(hr == S_OK, "Got 0x%08x\n", hr);
1416 hr = IShellFolder_ParseDisplayName(psf, NULL, NULL, (LPWSTR)testfolderW,
1417 NULL, &pidl_relative, NULL);
1418 ok(hr == S_OK, "Got 0x%08x\n", hr);
1420 /* Browsing to another location here before using the
1421 * pidl_relative would make ExplorerBrowser in Windows 7 show a
1422 * not-available dialog. Also, passing a relative pidl without
1423 * specifying SBSP_RELATIVE makes it look for the pidl on the
1424 * desktop
1427 test_browse_pidl(peb, &ebev, pidl_relative, SBSP_RELATIVE, S_OK, 1, 1, 0, 1);
1428 test_browse_pidl_sb(peb2, &ebev, pidl_relative, SBSP_RELATIVE, S_OK, 1, 1, 0, 1);
1430 ILFree(pidl_relative);
1431 /* IShellFolder_Release(psf); */
1432 IFolderView_Release(pfv);
1435 /* misc **/
1436 test_browse_pidl(peb, &ebev, NULL, SBSP_ABSOLUTE, S_OK, 0, 0, 0, 0);
1437 test_browse_pidl_sb(peb2, &ebev, NULL, SBSP_ABSOLUTE, S_OK, 0, 0, 0, 0);
1438 test_browse_pidl(peb, &ebev, NULL, SBSP_DEFBROWSER, S_OK, 0, 0, 0, 0);
1439 test_browse_pidl_sb(peb2, &ebev, NULL, SBSP_DEFBROWSER, S_OK, 0, 0, 0, 0);
1440 test_browse_pidl(peb, &ebev, pidl_current, SBSP_SAMEBROWSER, S_OK, 1, 1, 0, 1);
1441 test_browse_pidl_sb(peb2, &ebev, pidl_current, SBSP_SAMEBROWSER, S_OK, 1, 1, 0, 1);
1442 test_browse_pidl(peb, &ebev, pidl_current, SBSP_SAMEBROWSER, S_OK, 1, 0, 0, 1);
1443 test_browse_pidl_sb(peb2, &ebev, pidl_current, SBSP_SAMEBROWSER, S_OK, 1, 0, 0, 1);
1445 test_browse_pidl(peb, &ebev, pidl_current, SBSP_EXPLOREMODE, E_INVALIDARG, 0, 0, 0, 0);
1446 test_browse_pidl_sb(peb2, &ebev, pidl_current, SBSP_EXPLOREMODE, E_INVALIDARG, 0, 0, 0, 0);
1447 test_browse_pidl(peb, &ebev, pidl_current, SBSP_OPENMODE, S_OK, 1, 0, 0, 1);
1448 test_browse_pidl_sb(peb2, &ebev, pidl_current, SBSP_OPENMODE, S_OK, 1, 0, 0, 1);
1450 /* SBSP_NEWBROWSER will return E_INVALIDARG, claims MSDN, but in
1451 * reality it works as one would expect (Windows 7 only?).
1453 if(0)
1455 IExplorerBrowser_BrowseToIDList(peb, NULL, SBSP_NEWBROWSER);
1458 hr = IExplorerBrowser_Unadvise(peb, cookie);
1459 ok(hr == S_OK, "Got 0x%08x\n", hr);
1460 IExplorerBrowser_Destroy(peb);
1461 process_msgs();
1462 hr = IExplorerBrowser_Unadvise(peb2, cookie2);
1463 ok(hr == S_OK, "Got 0x%08x\n", hr);
1464 IExplorerBrowser_Destroy(peb2);
1465 process_msgs();
1467 /* Attempt browsing after destroyed */
1468 test_browse_pidl(peb, &ebev, pidl_child, SBSP_ABSOLUTE, HRESULT_FROM_WIN32(ERROR_BUSY), 0, 0, 0, 0);
1469 test_browse_pidl_sb(peb2, &ebev, pidl_child, SBSP_ABSOLUTE, HRESULT_FROM_WIN32(ERROR_BUSY), 0, 0, 0, 0);
1471 lres = IExplorerBrowser_Release(peb);
1472 ok(lres == 0, "Got lres %d\n", lres);
1473 lres = IExplorerBrowser_Release(peb2);
1474 ok(lres == 0, "Got lres %d\n", lres);
1476 /******************************************/
1477 /* Test some options that affect browsing */
1479 ebrowser_instantiate(&peb);
1480 hr = IExplorerBrowser_Advise(peb, (IExplorerBrowserEvents*)&ebev, &cookie);
1481 ok(hr == S_OK, "Got 0x%08x\n", hr);
1482 hr = IExplorerBrowser_SetOptions(peb, EBO_NAVIGATEONCE);
1483 ok(hr == S_OK, "got (0x%08x)\n", hr);
1484 ebrowser_initialize(peb);
1486 test_browse_pidl(peb, &ebev, pidl_current, 0, S_OK, 1, 1, 0, 1);
1487 test_browse_pidl(peb, &ebev, pidl_current, 0, E_FAIL, 0, 0, 0, 0);
1489 hr = IExplorerBrowser_SetOptions(peb, 0);
1490 ok(hr == S_OK, "got (0x%08x)\n", hr);
1492 test_browse_pidl(peb, &ebev, pidl_current, 0, S_OK, 1, 0, 0, 1);
1493 test_browse_pidl(peb, &ebev, pidl_current, 0, S_OK, 1, 0, 0, 1);
1495 /* Difference in behavior lies where? */
1496 hr = IExplorerBrowser_SetOptions(peb, EBO_ALWAYSNAVIGATE);
1497 ok(hr == S_OK, "got (0x%08x)\n", hr);
1499 test_browse_pidl(peb, &ebev, pidl_current, 0, S_OK, 1, 0, 0, 1);
1500 test_browse_pidl(peb, &ebev, pidl_current, 0, S_OK, 1, 0, 0, 1);
1502 hr = IExplorerBrowser_Unadvise(peb, cookie);
1503 ok(hr == S_OK, "Got 0x%08x\n", hr);
1505 IExplorerBrowser_Destroy(peb);
1506 lres = IExplorerBrowser_Release(peb);
1507 ok(lres == 0, "Got lres %d\n", lres);
1509 /* BrowseToObject tests */
1510 ebrowser_instantiate(&peb);
1511 ebrowser_initialize(peb);
1513 /* Browse to the desktop by passing an IShellFolder */
1514 hr = SHGetDesktopFolder(&psf);
1515 ok(hr == S_OK, "Got 0x%08x\n", hr);
1516 if(SUCCEEDED(hr))
1518 hr = IExplorerBrowser_BrowseToObject(peb, (IUnknown*)psf, SBSP_DEFBROWSER);
1519 ok(hr == S_OK, "got (0x%08x)\n", hr);
1520 if(hr == S_OK) process_msgs();
1522 IShellFolder_Release(psf);
1525 /* Browse to the current directory by passing a ShellItem */
1526 hr = pSHCreateShellItem(NULL, NULL, pidl_current, &psi);
1527 ok(hr == S_OK, "Got 0x%08x\n", hr);
1528 if(SUCCEEDED(hr))
1530 hr = IExplorerBrowser_BrowseToObject(peb, (IUnknown*)psi, SBSP_DEFBROWSER);
1531 ok(hr == S_OK, "got (0x%08x)\n", hr);
1532 process_msgs();
1534 IShellItem_Release(psi);
1537 IExplorerBrowser_Destroy(peb);
1538 lres = IExplorerBrowser_Release(peb);
1539 ok(lres == 0, "Got lres %d\n", lres);
1541 /* Cleanup */
1542 RemoveDirectoryW(child_path);
1543 ILFree(pidl_current);
1544 ILFree(pidl_child);
1547 static void test_GetCurrentView(void)
1549 IExplorerBrowser *peb;
1550 IUnknown *punk;
1551 HRESULT hr;
1553 /* GetCurrentView */
1554 ebrowser_instantiate(&peb);
1556 if(0)
1558 /* Crashes under Windows 7 */
1559 hr = IExplorerBrowser_GetCurrentView(peb, NULL, NULL);
1561 hr = IExplorerBrowser_GetCurrentView(peb, NULL, (void**)&punk);
1562 ok(hr == E_FAIL, "Got 0x%08x\n", hr);
1564 #define test_gcv(iid, exp) \
1565 do { \
1566 hr = IExplorerBrowser_GetCurrentView(peb, &iid, (void**)&punk); \
1567 ok(hr == exp, "(%s:)Expected (0x%08x), got: (0x%08x)\n", \
1568 #iid ,exp, hr); \
1569 if(SUCCEEDED(hr)) IUnknown_Release(punk); \
1570 } while(0)
1572 test_gcv(IID_IUnknown, E_FAIL);
1573 test_gcv(IID_IUnknown, E_FAIL);
1574 test_gcv(IID_IShellView, E_FAIL);
1575 test_gcv(IID_IShellView2, E_FAIL);
1576 test_gcv(IID_IFolderView, E_FAIL);
1577 test_gcv(IID_IPersistFolder, E_FAIL);
1578 test_gcv(IID_IPersistFolder2, E_FAIL);
1579 test_gcv(IID_ICommDlgBrowser, E_FAIL);
1580 test_gcv(IID_ICommDlgBrowser2, E_FAIL);
1581 test_gcv(IID_ICommDlgBrowser3, E_FAIL);
1583 ebrowser_initialize(peb);
1584 ebrowser_browse_to_desktop(peb);
1586 test_gcv(IID_IUnknown, S_OK);
1587 test_gcv(IID_IUnknown, S_OK);
1588 test_gcv(IID_IShellView, S_OK);
1589 test_gcv(IID_IShellView2, S_OK);
1590 test_gcv(IID_IFolderView, S_OK);
1591 todo_wine test_gcv(IID_IPersistFolder, S_OK);
1592 test_gcv(IID_IPersistFolder2, E_NOINTERFACE);
1593 test_gcv(IID_ICommDlgBrowser, E_NOINTERFACE);
1594 test_gcv(IID_ICommDlgBrowser2, E_NOINTERFACE);
1595 test_gcv(IID_ICommDlgBrowser3, E_NOINTERFACE);
1597 #undef test_gcv
1599 IExplorerBrowser_Destroy(peb);
1600 IExplorerBrowser_Release(peb);
1603 static BOOL test_instantiate_control(void)
1605 IExplorerBrowser *peb;
1606 HRESULT hr;
1608 hr = ebrowser_instantiate(&peb);
1609 ok(hr == S_OK || hr == REGDB_E_CLASSNOTREG, "Got (0x%08x)\n", hr);
1610 if(FAILED(hr))
1611 return FALSE;
1613 IExplorerBrowser_Release(peb);
1614 return TRUE;
1617 static void setup_window(void)
1619 WNDCLASSW wc;
1620 static const WCHAR ebtestW[] = {'e','b','t','e','s','t',0};
1622 ZeroMemory(&wc, sizeof(WNDCLASSW));
1623 wc.lpfnWndProc = DefWindowProcW;
1624 wc.lpszClassName = ebtestW;
1625 RegisterClassW(&wc);
1626 hwnd = CreateWindowExW(0, ebtestW, NULL, 0,
1627 0, 0, 500, 500,
1628 NULL, 0, 0, NULL);
1629 ok(hwnd != NULL, "Failed to create window for tests.\n");
1632 START_TEST(ebrowser)
1634 OleInitialize(NULL);
1636 if(!test_instantiate_control())
1638 win_skip("No ExplorerBrowser control..\n");
1639 OleUninitialize();
1640 return;
1643 setup_window();
1644 init_function_pointers();
1646 test_QueryInterface();
1647 test_SB_misc();
1648 test_initialization();
1649 test_basics();
1650 test_Advise();
1651 test_navigation();
1652 test_GetCurrentView();
1653 test_SetSite();
1655 DestroyWindow(hwnd);
1656 OleUninitialize();