Release 0.9.39.
[wine/gsoc-2012-control.git] / dlls / shdocvw / tests / webbrowser.c
blobaa231c04b005c6e304a811c9dedc87566d1513f2
1 /*
2 * Copyright 2006 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #define COBJMACROS
20 #define CONST_VTABLE
22 #include <wine/test.h>
23 #include <stdarg.h>
25 #include "windef.h"
26 #include "winbase.h"
27 #include "ole2.h"
28 #include "exdisp.h"
29 #include "htiframe.h"
30 #include "mshtmhst.h"
31 #include "idispids.h"
32 #include "olectl.h"
33 #include "mshtmdid.h"
35 #define DEFINE_EXPECT(func) \
36 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
38 #define SET_EXPECT(func) \
39 expect_ ## func = TRUE
41 #define CHECK_EXPECT(func) \
42 do { \
43 ok(expect_ ##func, "unexpected call " #func "\n"); \
44 expect_ ## func = FALSE; \
45 called_ ## func = TRUE; \
46 }while(0)
48 #define CHECK_EXPECT2(func) \
49 do { \
50 ok(expect_ ##func, "unexpected call " #func "\n"); \
51 called_ ## func = TRUE; \
52 }while(0)
54 #define CHECK_CALLED(func) \
55 do { \
56 ok(called_ ## func, "expected " #func "\n"); \
57 expect_ ## func = called_ ## func = FALSE; \
58 }while(0)
60 DEFINE_EXPECT(GetContainer);
61 DEFINE_EXPECT(Site_GetWindow);
62 DEFINE_EXPECT(ShowObject);
63 DEFINE_EXPECT(CanInPlaceActivate);
64 DEFINE_EXPECT(OnInPlaceActivate);
65 DEFINE_EXPECT(OnUIActivate);
66 DEFINE_EXPECT(GetWindowContext);
67 DEFINE_EXPECT(Frame_GetWindow);
68 DEFINE_EXPECT(Frame_SetActiveObject);
69 DEFINE_EXPECT(UIWindow_SetActiveObject);
70 DEFINE_EXPECT(SetMenu);
71 DEFINE_EXPECT(Invoke_AMBIENT_USERMODE);
72 DEFINE_EXPECT(Invoke_AMBIENT_DLCONTROL);
73 DEFINE_EXPECT(Invoke_AMBIENT_USERAGENT);
74 DEFINE_EXPECT(Invoke_AMBIENT_PALETTE);
75 DEFINE_EXPECT(Invoke_AMBIENT_SILENT);
76 DEFINE_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
77 DEFINE_EXPECT(EnableModeless_TRUE);
78 DEFINE_EXPECT(EnableModeless_FALSE);
79 DEFINE_EXPECT(GetHostInfo);
80 DEFINE_EXPECT(GetOptionKeyPath);
81 DEFINE_EXPECT(GetOverridesKeyPath);
82 DEFINE_EXPECT(SetStatusText);
84 static const WCHAR wszItem[] = {'i','t','e','m',0};
86 static HWND container_hwnd, shell_embedding_hwnd;
88 static HRESULT QueryInterface(REFIID,void**);
90 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
92 if(IsEqualGUID(&IID_ITargetContainer, riid))
93 return E_NOINTERFACE; /* TODO */
94 if(IsEqualGUID(&IID_IOleCommandTarget, riid))
95 return E_NOINTERFACE; /* TODO */
97 ok(0, "unexpected call\n");
98 return E_NOINTERFACE;
101 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
103 return 2;
106 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
108 return 1;
111 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
112 LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut)
114 ok(0, "unexpected call\n");
115 return E_NOTIMPL;
118 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
119 IEnumUnknown **ppenum)
121 ok(0, "unexpected call\n");
122 return E_NOTIMPL;
125 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
127 ok(0, "unexpected call\n");
128 return E_NOTIMPL;
131 static const IOleContainerVtbl OleContainerVtbl = {
132 OleContainer_QueryInterface,
133 OleContainer_AddRef,
134 OleContainer_Release,
135 OleContainer_ParseDisplayName,
136 OleContainer_EnumObjects,
137 OleContainer_LockContainer
140 static IOleContainer OleContainer = { &OleContainerVtbl };
142 static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
144 return QueryInterface(riid, ppv);
147 static ULONG WINAPI Dispatch_AddRef(IDispatch *iface)
149 return 2;
152 static ULONG WINAPI Dispatch_Release(IDispatch *iface)
154 return 1;
157 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
159 ok(0, "unexpected call\n");
160 return E_NOTIMPL;
163 static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
164 ITypeInfo **ppTInfo)
166 ok(0, "unexpected call\n");
167 return E_NOTIMPL;
170 static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
171 UINT cNames, LCID lcid, DISPID *rgDispId)
173 ok(0, "unexpected call\n");
174 return E_NOTIMPL;
177 static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
178 LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
179 EXCEPINFO *pExcepInfo, UINT *puArgErr)
181 ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
182 ok(pDispParams != NULL, "pDispParams == NULL\n");
183 ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
184 ok(V_VT(pVarResult) == VT_EMPTY, "V_VT(pVarResult)=%d\n", V_VT(pVarResult));
185 ok(wFlags == DISPATCH_PROPERTYGET, "wFlags=%08x, expected DISPATCH_PROPERTYGET\n", wFlags);
186 ok(pDispParams->rgvarg == NULL, "pDispParams->rgvarg = %p\n", pDispParams->rgvarg);
187 ok(pDispParams->rgdispidNamedArgs == NULL,
188 "pDispParams->rgdispidNamedArgs = %p\n", pDispParams->rgdispidNamedArgs);
189 ok(pDispParams->cArgs == 0, "pDispParams->cArgs = %d\n", pDispParams->cArgs);
190 ok(pDispParams->cNamedArgs == 0, "pDispParams->cNamedArgs = %d\n", pDispParams->cNamedArgs);
192 switch(dispIdMember) {
193 case DISPID_AMBIENT_USERMODE:
194 CHECK_EXPECT2(Invoke_AMBIENT_USERMODE);
195 return E_FAIL;
196 case DISPID_AMBIENT_DLCONTROL:
197 CHECK_EXPECT(Invoke_AMBIENT_DLCONTROL);
198 ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
199 return E_FAIL;
200 case DISPID_AMBIENT_USERAGENT:
201 CHECK_EXPECT(Invoke_AMBIENT_USERAGENT);
202 ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
203 return E_FAIL;
204 case DISPID_AMBIENT_PALETTE:
205 CHECK_EXPECT(Invoke_AMBIENT_PALETTE);
206 ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
207 return E_FAIL;
208 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
209 CHECK_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
210 ok(puArgErr == NULL, "puArgErr=%p\n", puArgErr);
211 V_VT(pVarResult) = VT_BOOL;
212 V_BOOL(pVarResult) = VARIANT_FALSE;
213 return S_OK;
214 case DISPID_AMBIENT_SILENT:
215 CHECK_EXPECT(Invoke_AMBIENT_SILENT);
216 ok(puArgErr == NULL, "puArgErr=%p\n", puArgErr);
217 V_VT(pVarResult) = VT_BOOL;
218 V_BOOL(pVarResult) = VARIANT_FALSE;
219 return S_OK;
222 ok(0, "unexpected dispIdMember %d\n", dispIdMember);
223 return E_NOTIMPL;
226 static IDispatchVtbl DispatchVtbl = {
227 Dispatch_QueryInterface,
228 Dispatch_AddRef,
229 Dispatch_Release,
230 Dispatch_GetTypeInfoCount,
231 Dispatch_GetTypeInfo,
232 Dispatch_GetIDsOfNames,
233 Dispatch_Invoke
236 static IDispatch Dispatch = { &DispatchVtbl };
238 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
240 return QueryInterface(riid, ppv);
243 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
245 return 2;
248 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
250 return 1;
253 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
255 ok(0, "unexpected call\n");
256 return E_NOTIMPL;
259 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAsign, DWORD dwWhichMoniker,
260 IMoniker **ppmon)
262 ok(0, "unexpected call\n");
263 return E_NOTIMPL;
266 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
268 CHECK_EXPECT(GetContainer);
270 ok(ppContainer != NULL, "ppContainer == NULL\n");
271 if(ppContainer)
272 *ppContainer = &OleContainer;
274 return S_OK;
277 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
279 CHECK_EXPECT(ShowObject);
280 return S_OK;
283 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
285 ok(0, "unexpected call\n");
286 return E_NOTIMPL;
289 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
291 ok(0, "unexpected call\n");
292 return E_NOTIMPL;
295 static const IOleClientSiteVtbl ClientSiteVtbl = {
296 ClientSite_QueryInterface,
297 ClientSite_AddRef,
298 ClientSite_Release,
299 ClientSite_SaveObject,
300 ClientSite_GetMoniker,
301 ClientSite_GetContainer,
302 ClientSite_ShowObject,
303 ClientSite_OnShowWindow,
304 ClientSite_RequestNewObjectLayout
307 static IOleClientSite ClientSite = { &ClientSiteVtbl };
309 static HRESULT WINAPI InPlaceUIWindow_QueryInterface(IOleInPlaceFrame *iface,
310 REFIID riid, void **ppv)
312 ok(0, "unexpected call\n");
313 return E_NOINTERFACE;
316 static ULONG WINAPI InPlaceUIWindow_AddRef(IOleInPlaceFrame *iface)
318 return 2;
321 static ULONG WINAPI InPlaceUIWindow_Release(IOleInPlaceFrame *iface)
323 return 1;
326 static HRESULT WINAPI InPlaceUIWindow_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
328 ok(0, "unexpected call\n");
329 return E_NOTIMPL;
332 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
334 CHECK_EXPECT(Frame_GetWindow);
335 ok(phwnd != NULL, "phwnd == NULL\n");
336 if(phwnd)
337 *phwnd = container_hwnd;
338 return S_OK;
341 static HRESULT WINAPI InPlaceUIWindow_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
343 ok(0, "unexpected call\n");
344 return E_NOTIMPL;
347 static HRESULT WINAPI InPlaceUIWindow_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
349 ok(0, "unexpected call\n");
350 return E_NOTIMPL;
353 static HRESULT WINAPI InPlaceUIWindow_RequestBorderSpace(IOleInPlaceFrame *iface,
354 LPCBORDERWIDTHS pborderwidths)
356 ok(0, "unexpected call\n");
357 return E_NOTIMPL;
360 static HRESULT WINAPI InPlaceUIWindow_SetBorderSpace(IOleInPlaceFrame *iface,
361 LPCBORDERWIDTHS pborderwidths)
363 ok(0, "unexpected call\n");
364 return E_NOTIMPL;
367 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
368 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
370 CHECK_EXPECT(UIWindow_SetActiveObject);
371 ok(pActiveObject != NULL, "pActiveObject = NULL\n");
372 ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
373 return S_OK;
376 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
377 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
379 CHECK_EXPECT(Frame_SetActiveObject);
380 ok(pActiveObject != NULL, "pActiveObject = NULL\n");
381 ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
382 return S_OK;
385 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
386 LPOLEMENUGROUPWIDTHS lpMenuWidths)
388 ok(0, "unexpected call\n");
389 return E_NOTIMPL;
392 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
393 HOLEMENU holemenu, HWND hwndActiveObject)
395 CHECK_EXPECT(SetMenu);
396 ok(hmenuShared == NULL, "hmenuShared=%p\n", hmenuShared);
397 ok(holemenu == NULL, "holemenu=%p\n", holemenu);
398 ok(hwndActiveObject == shell_embedding_hwnd, "hwndActiveObject=%p, expected %p\n",
399 hwndActiveObject, shell_embedding_hwnd);
400 return S_OK;
403 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
405 ok(0, "unexpected call\n");
406 return E_NOTIMPL;
409 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
411 CHECK_EXPECT2(SetStatusText);
412 /* FIXME: Check pszStatusText */
413 return S_OK;
416 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
418 if(fEnable)
419 CHECK_EXPECT(EnableModeless_TRUE);
420 else
421 CHECK_EXPECT(EnableModeless_FALSE);
422 return S_OK;
425 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
427 ok(0, "unexpected call\n");
428 return E_NOTIMPL;
431 static const IOleInPlaceFrameVtbl InPlaceUIWindowVtbl = {
432 InPlaceUIWindow_QueryInterface,
433 InPlaceUIWindow_AddRef,
434 InPlaceUIWindow_Release,
435 InPlaceUIWindow_GetWindow,
436 InPlaceUIWindow_ContextSensitiveHelp,
437 InPlaceUIWindow_GetBorder,
438 InPlaceUIWindow_RequestBorderSpace,
439 InPlaceUIWindow_SetBorderSpace,
440 InPlaceUIWindow_SetActiveObject,
443 static IOleInPlaceUIWindow InPlaceUIWindow = { (IOleInPlaceUIWindowVtbl*)&InPlaceUIWindowVtbl };
445 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = {
446 InPlaceUIWindow_QueryInterface,
447 InPlaceUIWindow_AddRef,
448 InPlaceUIWindow_Release,
449 InPlaceFrame_GetWindow,
450 InPlaceUIWindow_ContextSensitiveHelp,
451 InPlaceUIWindow_GetBorder,
452 InPlaceUIWindow_RequestBorderSpace,
453 InPlaceUIWindow_SetBorderSpace,
454 InPlaceFrame_SetActiveObject,
455 InPlaceFrame_InsertMenus,
456 InPlaceFrame_SetMenu,
457 InPlaceFrame_RemoveMenus,
458 InPlaceFrame_SetStatusText,
459 InPlaceFrame_EnableModeless,
460 InPlaceFrame_TranslateAccelerator
463 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
465 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
467 return QueryInterface(riid, ppv);
470 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
472 return 2;
475 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSiteEx *iface)
477 return 1;
480 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
482 CHECK_EXPECT(Site_GetWindow);
483 ok(phwnd != NULL, "phwnd == NULL\n");
484 if(phwnd)
485 *phwnd = container_hwnd;
486 return S_OK;
489 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
491 ok(0, "unexpected call\n");
492 return E_NOTIMPL;
495 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
497 CHECK_EXPECT(CanInPlaceActivate);
498 return S_OK;
501 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
503 CHECK_EXPECT(OnInPlaceActivate);
504 return S_OK;
507 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
509 CHECK_EXPECT(OnUIActivate);
510 return S_OK;
513 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
514 IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
515 LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
517 static const RECT pos_rect = {2,1,1002,901};
518 static const RECT clip_rect = {10,10,990,890};
520 CHECK_EXPECT(GetWindowContext);
522 ok(ppFrame != NULL, "ppFrame = NULL\n");
523 if(ppFrame)
524 *ppFrame = &InPlaceFrame;
526 ok(ppDoc != NULL, "ppDoc = NULL\n");
527 if(ppDoc)
528 *ppDoc = &InPlaceUIWindow;
530 ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
531 if(lprcPosRect)
532 memcpy(lprcPosRect, &pos_rect, sizeof(RECT));
534 ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
535 if(lprcClipRect)
536 memcpy(lprcClipRect, &clip_rect, sizeof(RECT));
538 ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n");
539 if(lpFrameInfo) {
540 lpFrameInfo->cb = sizeof(*lpFrameInfo);
541 lpFrameInfo->fMDIApp = FALSE;
542 lpFrameInfo->hwndFrame = container_hwnd;
543 lpFrameInfo->haccel = NULL;
544 lpFrameInfo->cAccelEntries = 0;
547 return S_OK;
550 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtant)
552 ok(0, "unexpected call\n");
553 return E_NOTIMPL;
556 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
558 ok(0, "unexpected call\n");
559 return E_NOTIMPL;
562 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
564 ok(0, "unexpected call\n");
565 return E_NOTIMPL;
568 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
570 ok(0, "unexpected call\n");
571 return E_NOTIMPL;
574 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
576 ok(0, "unexpected call\n");
577 return E_NOTIMPL;
580 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
582 ok(0, "unexpected call\n");
583 return E_NOTIMPL;
586 static HRESULT WINAPI InPlaceSite_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface,
587 BOOL *pNoRedraw, DWORD dwFlags)
589 ok(0, "unexpected call\n");
590 return E_NOTIMPL;
593 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface,
594 BOOL fNoRedraw)
596 ok(0, "unexpected call\n");
597 return E_NOTIMPL;
600 static HRESULT WINAPI InPlaceSite_RequestUIActivate(IOleInPlaceSiteEx *iface)
602 ok(0, "unexpected call\n");
603 return S_OK;
606 static const IOleInPlaceSiteExVtbl InPlaceSiteExVtbl = {
607 InPlaceSite_QueryInterface,
608 InPlaceSite_AddRef,
609 InPlaceSite_Release,
610 InPlaceSite_GetWindow,
611 InPlaceSite_ContextSensitiveHelp,
612 InPlaceSite_CanInPlaceActivate,
613 InPlaceSite_OnInPlaceActivate,
614 InPlaceSite_OnUIActivate,
615 InPlaceSite_GetWindowContext,
616 InPlaceSite_Scroll,
617 InPlaceSite_OnUIDeactivate,
618 InPlaceSite_OnInPlaceDeactivate,
619 InPlaceSite_DiscardUndoState,
620 InPlaceSite_DeactivateAndUndo,
621 InPlaceSite_OnPosRectChange,
622 InPlaceSite_OnInPlaceActivateEx,
623 InPlaceSite_OnInPlaceDeactivateEx,
624 InPlaceSite_RequestUIActivate
627 static IOleInPlaceSiteEx InPlaceSite = { &InPlaceSiteExVtbl };
629 static HRESULT WINAPI DocHostUIHandler_QueryInterface(IDocHostUIHandler2 *iface, REFIID riid, void **ppv)
631 return QueryInterface(riid, ppv);
634 static ULONG WINAPI DocHostUIHandler_AddRef(IDocHostUIHandler2 *iface)
636 return 2;
639 static ULONG WINAPI DocHostUIHandler_Release(IDocHostUIHandler2 *iface)
641 return 1;
644 static HRESULT WINAPI DocHostUIHandler_ShowContextMenu(IDocHostUIHandler2 *iface, DWORD dwID, POINT *ppt,
645 IUnknown *pcmdtReserved, IDispatch *pdicpReserved)
647 ok(0, "unexpected call %d %p %p %p\n", dwID, ppt, pcmdtReserved, pdicpReserved);
648 return S_FALSE;
651 static HRESULT WINAPI DocHostUIHandler_GetHostInfo(IDocHostUIHandler2 *iface, DOCHOSTUIINFO *pInfo)
653 CHECK_EXPECT(GetHostInfo);
654 ok(pInfo != NULL, "pInfo=NULL\n");
655 if(pInfo) {
656 ok(pInfo->cbSize == sizeof(DOCHOSTUIINFO), "pInfo->cbSize=%u\n", pInfo->cbSize);
657 ok(!pInfo->dwFlags, "pInfo->dwFlags=%08x, expected 0\n", pInfo->dwFlags);
658 ok(!pInfo->dwDoubleClick, "pInfo->dwDoubleClick=%08x, expected 0\n", pInfo->dwDoubleClick);
659 ok(!pInfo->pchHostCss, "pInfo->pchHostCss=%p, expected NULL\n", pInfo->pchHostCss);
660 ok(!pInfo->pchHostNS, "pInfo->pchhostNS=%p, expected NULL\n", pInfo->pchHostNS);
662 return E_FAIL;
665 static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD dwID,
666 IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget,
667 IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
669 ok(0, "unexpected call\n");
670 return E_NOTIMPL;
673 static HRESULT WINAPI DocHostUIHandler_HideUI(IDocHostUIHandler2 *iface)
675 ok(0, "unexpected call\n");
676 return E_NOTIMPL;
679 static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface)
681 ok(0, "unexpected call\n");
682 return E_NOTIMPL;
685 static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable)
687 ok(0, "unexpected call\n");
688 return E_NOTIMPL;
691 static HRESULT WINAPI DocHostUIHandler_OnDocWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
693 ok(0, "unexpected call\n");
694 return E_NOTIMPL;
697 static HRESULT WINAPI DocHostUIHandler_OnFrameWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
699 ok(0, "unexpected call\n");
700 return E_NOTIMPL;
703 static HRESULT WINAPI DocHostUIHandler_ResizeBorder(IDocHostUIHandler2 *iface, LPCRECT prcBorder,
704 IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
706 ok(0, "unexpected call\n");
707 return E_NOTIMPL;
710 static HRESULT WINAPI DocHostUIHandler_TranslateAccelerator(IDocHostUIHandler2 *iface, LPMSG lpMsg,
711 const GUID *pguidCmdGroup, DWORD nCmdID)
713 ok(0, "unexpected call\n");
714 return E_NOTIMPL;
717 static HRESULT WINAPI DocHostUIHandler_GetOptionKeyPath(IDocHostUIHandler2 *iface,
718 LPOLESTR *pchKey, DWORD dw)
720 CHECK_EXPECT(GetOptionKeyPath);
721 ok(pchKey != NULL, "pchKey==NULL\n");
722 if(pchKey)
723 ok(*pchKey == NULL, "*pchKey=%p\n", *pchKey);
724 ok(!dw, "dw=%x\n", dw);
725 return E_NOTIMPL;
728 static HRESULT WINAPI DocHostUIHandler_GetDropTarget(IDocHostUIHandler2 *iface,
729 IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
731 ok(0, "unexpected call\n");
732 return E_NOTIMPL;
735 static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, IDispatch **ppDispatch)
737 ok(0, "unexpected call\n");
738 return E_NOTIMPL;
741 static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate,
742 OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
744 ok(0, "unexpected call\n");
745 return E_NOTIMPL;
748 static HRESULT WINAPI DocHostUIHandler_FilterDataObject(IDocHostUIHandler2 *iface, IDataObject *pDO,
749 IDataObject **ppPORet)
751 ok(0, "unexpected call\n");
752 return E_NOTIMPL;
755 static HRESULT WINAPI DocHostUIHandler_GetOverrideKeyPath(IDocHostUIHandler2 *iface,
756 LPOLESTR *pchKey, DWORD dw)
758 CHECK_EXPECT(GetOverridesKeyPath);
759 ok(pchKey != NULL, "pchKey==NULL\n");
760 if(pchKey)
761 ok(*pchKey == NULL, "*pchKey=%p\n", *pchKey);
762 ok(!dw, "dw=%x\n", dw);
763 return E_NOTIMPL;
766 static const IDocHostUIHandler2Vtbl DocHostUIHandlerVtbl = {
767 DocHostUIHandler_QueryInterface,
768 DocHostUIHandler_AddRef,
769 DocHostUIHandler_Release,
770 DocHostUIHandler_ShowContextMenu,
771 DocHostUIHandler_GetHostInfo,
772 DocHostUIHandler_ShowUI,
773 DocHostUIHandler_HideUI,
774 DocHostUIHandler_UpdateUI,
775 DocHostUIHandler_EnableModeless,
776 DocHostUIHandler_OnDocWindowActivate,
777 DocHostUIHandler_OnFrameWindowActivate,
778 DocHostUIHandler_ResizeBorder,
779 DocHostUIHandler_TranslateAccelerator,
780 DocHostUIHandler_GetOptionKeyPath,
781 DocHostUIHandler_GetDropTarget,
782 DocHostUIHandler_GetExternal,
783 DocHostUIHandler_TranslateUrl,
784 DocHostUIHandler_FilterDataObject,
785 DocHostUIHandler_GetOverrideKeyPath
788 static IDocHostUIHandler2 DocHostUIHandler = { &DocHostUIHandlerVtbl };
790 static HRESULT QueryInterface(REFIID riid, void **ppv)
792 *ppv = NULL;
794 if(IsEqualGUID(&IID_IUnknown, riid)
795 || IsEqualGUID(&IID_IOleClientSite, riid))
796 *ppv = &ClientSite;
797 else if(IsEqualGUID(&IID_IOleWindow, riid)
798 || IsEqualGUID(&IID_IOleInPlaceSite, riid)
799 || IsEqualGUID(&IID_IOleInPlaceSiteEx, riid))
800 *ppv = &InPlaceSite;
801 else if(IsEqualGUID(&IID_IDocHostUIHandler, riid)
802 || IsEqualGUID(&IID_IDocHostUIHandler2, riid))
803 *ppv = &DocHostUIHandler;
804 else if(IsEqualGUID(&IID_IDispatch, riid))
805 *ppv = &Dispatch;
807 if(*ppv)
808 return S_OK;
810 return E_NOINTERFACE;
813 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
815 return DefWindowProcW(hwnd, msg, wParam, lParam);
818 static HWND create_container_window(void)
820 static const WCHAR wszWebBrowserContainer[] =
821 {'W','e','b','B','r','o','w','s','e','r','C','o','n','t','a','i','n','e','r',0};
822 static WNDCLASSEXW wndclass = {
823 sizeof(WNDCLASSEXW),
825 wnd_proc,
826 0, 0, NULL, NULL, NULL, NULL, NULL,
827 wszWebBrowserContainer,
828 NULL
831 RegisterClassExW(&wndclass);
832 return CreateWindowW(wszWebBrowserContainer, wszWebBrowserContainer,
833 WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
834 CW_USEDEFAULT, NULL, NULL, NULL, NULL);
837 static void test_DoVerb(IUnknown *unk)
839 IOleObject *oleobj;
840 RECT rect = {0,0,1000,1000};
841 HRESULT hres;
843 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
844 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
845 if(FAILED(hres))
846 return;
848 SET_EXPECT(CanInPlaceActivate);
849 SET_EXPECT(Site_GetWindow);
850 SET_EXPECT(OnInPlaceActivate);
851 SET_EXPECT(GetWindowContext);
852 SET_EXPECT(ShowObject);
853 SET_EXPECT(GetContainer);
854 SET_EXPECT(Frame_GetWindow);
855 SET_EXPECT(OnUIActivate);
856 SET_EXPECT(Frame_SetActiveObject);
857 SET_EXPECT(UIWindow_SetActiveObject);
858 SET_EXPECT(SetMenu);
860 hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
861 0, (HWND)0xdeadbeef, &rect);
862 ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
864 CHECK_CALLED(CanInPlaceActivate);
865 CHECK_CALLED(Site_GetWindow);
866 CHECK_CALLED(OnInPlaceActivate);
867 CHECK_CALLED(GetWindowContext);
868 CHECK_CALLED(ShowObject);
869 CHECK_CALLED(GetContainer);
870 CHECK_CALLED(Frame_GetWindow);
871 CHECK_CALLED(OnUIActivate);
872 CHECK_CALLED(Frame_SetActiveObject);
873 CHECK_CALLED(UIWindow_SetActiveObject);
874 CHECK_CALLED(SetMenu);
876 hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
877 0, (HWND)0xdeadbeef, &rect);
878 ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
880 IOleObject_Release(oleobj);
883 static void test_GetMiscStatus(IOleObject *oleobj)
885 DWORD st, i;
886 HRESULT hres;
888 for(i=0; i<10; i++) {
889 st = 0xdeadbeef;
890 hres = IOleObject_GetMiscStatus(oleobj, i, &st);
891 ok(hres == S_OK, "GetMiscStatus failed: %08x\n", hres);
892 ok(st == (OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT
893 |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE),
894 "st=%08x, expected OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|"
895 "OLEMISC_INSIDEOUT|OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE)\n", st);
899 static void test_ClientSite(IUnknown *unk, IOleClientSite *client)
901 IOleObject *oleobj;
902 IOleInPlaceObject *inplace;
903 HWND hwnd;
904 HRESULT hres;
906 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
907 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
908 if(FAILED(hres))
909 return;
911 test_GetMiscStatus(oleobj);
913 hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceObject, (void**)&inplace);
914 ok(hres == S_OK, "QueryInterface(IID_OleInPlaceObject) failed: %08x\n", hres);
915 if(FAILED(hres)) {
916 IOleObject_Release(oleobj);
917 return;
920 hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
921 ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
922 ok((hwnd == NULL) ^ (client == NULL), "unexpected hwnd %p\n", hwnd);
924 if(client) {
925 SET_EXPECT(GetContainer);
926 SET_EXPECT(Site_GetWindow);
927 SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
928 SET_EXPECT(Invoke_AMBIENT_SILENT);
931 hres = IOleObject_SetClientSite(oleobj, client);
932 ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
934 if(client) {
935 CHECK_CALLED(GetContainer);
936 CHECK_CALLED(Site_GetWindow);
937 CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
938 CHECK_CALLED(Invoke_AMBIENT_SILENT);
941 hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
942 ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
943 ok((hwnd == NULL) == (client == NULL), "unexpected hwnd %p\n", hwnd);
945 shell_embedding_hwnd = hwnd;
947 IOleInPlaceObject_Release(inplace);
948 IOleObject_Release(oleobj);
951 static void test_ClassInfo(IUnknown *unk)
953 IProvideClassInfo2 *class_info;
954 GUID guid;
955 HRESULT hres;
957 hres = IUnknown_QueryInterface(unk, &IID_IProvideClassInfo2, (void**)&class_info);
958 ok(hres == S_OK, "QueryInterface(IID_IProvideClassInfo) failed: %08x\n", hres);
959 if(FAILED(hres))
960 return;
962 hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, &guid);
963 ok(hres == S_OK, "GetGUID failed: %08x\n", hres);
964 ok(IsEqualGUID(&DIID_DWebBrowserEvents2, &guid), "wrong guid\n");
966 hres = IProvideClassInfo2_GetGUID(class_info, 0, &guid);
967 ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres);
968 ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
970 hres = IProvideClassInfo2_GetGUID(class_info, 2, &guid);
971 ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres);
972 ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
974 hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, NULL);
975 ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
977 hres = IProvideClassInfo2_GetGUID(class_info, 0, NULL);
978 ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
980 IProvideClassInfo2_Release(class_info);
983 static void test_ie_funcs(IUnknown *unk)
985 IWebBrowser2 *wb;
986 VARIANT_BOOL b;
987 int i;
988 long hwnd;
989 HRESULT hres;
991 hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
992 ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
993 if(FAILED(hres))
994 return;
996 /* HWND */
998 hwnd = 0xdeadbeef;
999 hres = IWebBrowser2_get_HWND(wb, &hwnd);
1000 ok(hres == E_FAIL, "get_HWND failed: %08x, expected E_FAIL\n", hres);
1001 ok(hwnd == 0, "unexpected hwnd %lx\n", hwnd);
1003 /* MenuBar */
1005 hres = IWebBrowser2_get_MenuBar(wb, &b);
1006 ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1007 ok(b == VARIANT_TRUE, "b=%x\n", b);
1009 hres = IWebBrowser2_put_MenuBar(wb, VARIANT_FALSE);
1010 ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1012 hres = IWebBrowser2_get_MenuBar(wb, &b);
1013 ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1014 ok(b == VARIANT_FALSE, "b=%x\n", b);
1016 hres = IWebBrowser2_put_MenuBar(wb, 100);
1017 ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1019 hres = IWebBrowser2_get_MenuBar(wb, &b);
1020 ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1021 ok(b == VARIANT_TRUE, "b=%x\n", b);
1023 /* AddressBar */
1025 hres = IWebBrowser2_get_AddressBar(wb, &b);
1026 ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres);
1027 ok(b == VARIANT_TRUE, "b=%x\n", b);
1029 hres = IWebBrowser2_put_AddressBar(wb, VARIANT_FALSE);
1030 ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
1032 hres = IWebBrowser2_get_AddressBar(wb, &b);
1033 ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1034 ok(b == VARIANT_FALSE, "b=%x\n", b);
1036 hres = IWebBrowser2_put_AddressBar(wb, 100);
1037 ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
1039 hres = IWebBrowser2_get_AddressBar(wb, &b);
1040 ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres);
1041 ok(b == VARIANT_TRUE, "b=%x\n", b);
1043 hres = IWebBrowser2_put_AddressBar(wb, VARIANT_TRUE);
1044 ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1046 /* StatusBar */
1048 hres = IWebBrowser2_get_StatusBar(wb, &b);
1049 ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1050 ok(b == VARIANT_TRUE, "b=%x\n", b);
1052 hres = IWebBrowser2_put_StatusBar(wb, VARIANT_TRUE);
1053 ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1055 hres = IWebBrowser2_get_StatusBar(wb, &b);
1056 ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1057 ok(b == VARIANT_TRUE, "b=%x\n", b);
1059 hres = IWebBrowser2_put_StatusBar(wb, VARIANT_FALSE);
1060 ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1062 hres = IWebBrowser2_get_StatusBar(wb, &b);
1063 ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1064 ok(b == VARIANT_FALSE, "b=%x\n", b);
1066 hres = IWebBrowser2_put_StatusBar(wb, 100);
1067 ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1069 hres = IWebBrowser2_get_StatusBar(wb, &b);
1070 ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1071 ok(b == VARIANT_TRUE, "b=%x\n", b);
1073 /* ToolBar */
1075 hres = IWebBrowser2_get_ToolBar(wb, &i);
1076 ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1077 ok(i == VARIANT_TRUE, "i=%x\n", i);
1079 hres = IWebBrowser2_put_ToolBar(wb, VARIANT_FALSE);
1080 ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1082 hres = IWebBrowser2_get_ToolBar(wb, &i);
1083 ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1084 ok(i == VARIANT_FALSE, "b=%x\n", i);
1086 hres = IWebBrowser2_put_ToolBar(wb, 100);
1087 ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1089 hres = IWebBrowser2_get_ToolBar(wb, &i);
1090 ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1091 ok(i == VARIANT_TRUE, "i=%x\n", i);
1093 hres = IWebBrowser2_put_ToolBar(wb, VARIANT_TRUE);
1094 ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1096 IWebBrowser2_Release(wb);
1099 static void test_Silent(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
1101 VARIANT_BOOL b;
1102 HRESULT hres;
1104 b = 100;
1105 hres = IWebBrowser2_get_Silent(wb, &b);
1106 ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1107 ok(b == VARIANT_FALSE, "b=%x\n", b);
1109 hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
1110 ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1112 b = 100;
1113 hres = IWebBrowser2_get_Silent(wb, &b);
1114 ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1115 ok(b == VARIANT_TRUE, "b=%x\n", b);
1117 hres = IWebBrowser2_put_Silent(wb, 100);
1118 ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1120 b = 100;
1121 hres = IWebBrowser2_get_Silent(wb, &b);
1122 ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1123 ok(b == VARIANT_TRUE, "b=%x\n", b);
1125 hres = IWebBrowser2_put_Silent(wb, VARIANT_FALSE);
1126 ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1128 b = 100;
1129 hres = IWebBrowser2_get_Silent(wb, &b);
1130 ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1131 ok(b == VARIANT_FALSE, "b=%x\n", b);
1133 if(is_clientsite) {
1134 hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
1135 ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1137 SET_EXPECT(Invoke_AMBIENT_SILENT);
1140 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_SILENT);
1141 ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
1143 if(is_clientsite)
1144 CHECK_CALLED(Invoke_AMBIENT_SILENT);
1146 b = 100;
1147 hres = IWebBrowser2_get_Silent(wb, &b);
1148 ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1149 ok(b == VARIANT_FALSE, "b=%x\n", b);
1152 static void test_Offline(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
1154 VARIANT_BOOL b;
1155 HRESULT hres;
1157 b = 100;
1158 hres = IWebBrowser2_get_Offline(wb, &b);
1159 ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1160 ok(b == VARIANT_FALSE, "b=%x\n", b);
1162 hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
1163 ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1165 b = 100;
1166 hres = IWebBrowser2_get_Offline(wb, &b);
1167 ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1168 ok(b == VARIANT_TRUE, "b=%x\n", b);
1170 hres = IWebBrowser2_put_Offline(wb, 100);
1171 ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1173 b = 100;
1174 hres = IWebBrowser2_get_Offline(wb, &b);
1175 ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1176 ok(b == VARIANT_TRUE, "b=%x\n", b);
1178 hres = IWebBrowser2_put_Offline(wb, VARIANT_FALSE);
1179 ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1181 b = 100;
1182 hres = IWebBrowser2_get_Offline(wb, &b);
1183 ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1184 ok(b == VARIANT_FALSE, "b=%x\n", b);
1186 if(is_clientsite) {
1187 hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
1188 ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1190 SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1193 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
1194 ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
1196 if(is_clientsite)
1197 CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1199 b = 100;
1200 hres = IWebBrowser2_get_Offline(wb, &b);
1201 ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1202 ok(b == VARIANT_FALSE, "b=%x\n", b);
1205 static void test_wb_funcs(IUnknown *unk, BOOL is_clientsite)
1207 IWebBrowser2 *wb;
1208 IOleControl *control;
1209 HRESULT hres;
1211 hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
1212 ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
1214 hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1215 ok(hres == S_OK, "Could not get IOleControl interface: %08x\n", hres);
1217 test_Silent(wb, control, is_clientsite);
1218 test_Offline(wb, control, is_clientsite);
1220 IWebBrowser_Release(wb);
1221 IOleControl_Release(control);
1224 static void test_GetControlInfo(IUnknown *unk)
1226 IOleControl *control;
1227 CONTROLINFO info;
1228 HRESULT hres;
1230 hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1231 ok(hres == S_OK, "Could not get IOleControl: %08x\n", hres);
1232 if(FAILED(hres))
1233 return;
1235 hres = IOleControl_GetControlInfo(control, &info);
1236 ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, exxpected E_NOTIMPL\n", hres);
1237 hres = IOleControl_GetControlInfo(control, NULL);
1238 ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, exxpected E_NOTIMPL\n", hres);
1240 IOleControl_Release(control);
1243 static void test_Extent(IUnknown *unk)
1245 IOleObject *oleobj;
1246 SIZE size;
1247 HRESULT hres;
1249 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1250 ok(hres == S_OK, "Could not get IOleObkect: %08x\n", hres);
1251 if(FAILED(hres))
1252 return;
1254 size.cx = size.cy = 0xdeadbeef;
1255 hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
1256 ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1257 ok(size.cx == 1323 && size.cy == 529, "size = {%d %d}\n", size.cx, size.cy);
1259 size.cx = 800;
1260 size.cy = 700;
1261 hres = IOleObject_SetExtent(oleobj, DVASPECT_CONTENT, &size);
1262 ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
1264 size.cx = size.cy = 0xdeadbeef;
1265 hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
1266 ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1267 ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy);
1269 size.cx = size.cy = 0xdeadbeef;
1270 hres = IOleObject_GetExtent(oleobj, 0, &size);
1271 ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1272 ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy);
1274 size.cx = 900;
1275 size.cy = 800;
1276 hres = IOleObject_SetExtent(oleobj, 0, &size);
1277 ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
1279 size.cx = size.cy = 0xdeadbeef;
1280 hres = IOleObject_GetExtent(oleobj, 0, &size);
1281 ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1282 ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy);
1284 size.cx = size.cy = 0xdeadbeef;
1285 hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
1286 ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1287 ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy);
1289 size.cx = 1000;
1290 size.cy = 900;
1291 hres = IOleObject_SetExtent(oleobj, 0xdeadbeef, &size);
1292 ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
1294 size.cx = size.cy = 0xdeadbeef;
1295 hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
1296 ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1297 ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy);
1299 size.cx = size.cy = 0xdeadbeef;
1300 hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
1301 ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1302 ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy);
1304 IOleObject_Release(oleobj);
1307 static void test_Navigate2(IUnknown *unk)
1309 IWebBrowser2 *webbrowser;
1310 VARIANT url;
1311 HRESULT hres;
1313 static const WCHAR wszAboutBlank[] =
1314 {'a','b','o','u','t',':','b','l','a','n','k',0};
1316 hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&webbrowser);
1317 ok(hres == S_OK, "QueryInterface(IID_IWebBrowser) failed: %08x\n", hres);
1318 if(FAILED(hres))
1319 return;
1321 V_VT(&url) = VT_BSTR;
1322 V_BSTR(&url) = SysAllocString(wszAboutBlank);
1324 SET_EXPECT(Invoke_AMBIENT_USERMODE);
1325 SET_EXPECT(EnableModeless_FALSE);
1326 SET_EXPECT(GetHostInfo);
1327 SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
1328 SET_EXPECT(Invoke_AMBIENT_USERAGENT);
1329 SET_EXPECT(Invoke_AMBIENT_PALETTE);
1330 SET_EXPECT(GetOptionKeyPath);
1331 SET_EXPECT(GetOverridesKeyPath);
1332 SET_EXPECT(SetStatusText);
1333 SET_EXPECT(EnableModeless_TRUE);
1335 hres = IWebBrowser2_Navigate2(webbrowser, &url, NULL, NULL, NULL, NULL);
1336 ok(hres == S_OK, "Navigate2 failed: %08x\n", hres);
1338 CHECK_CALLED(Invoke_AMBIENT_USERMODE);
1339 CHECK_CALLED(EnableModeless_FALSE);
1340 CHECK_CALLED(GetHostInfo);
1341 CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
1342 CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
1343 CHECK_CALLED(Invoke_AMBIENT_PALETTE);
1344 CHECK_CALLED(GetOptionKeyPath);
1345 CHECK_CALLED(GetOverridesKeyPath);
1346 CHECK_CALLED(SetStatusText);
1347 CHECK_CALLED(EnableModeless_TRUE);
1349 IWebBrowser2_Release(webbrowser);
1352 static void test_QueryInterface(IUnknown *unk)
1354 IQuickActivate *qa = (IQuickActivate*)0xdeadbeef;
1355 IRunnableObject *runnable = (IRunnableObject*)0xdeadbeef;
1356 HRESULT hres;
1358 hres = IUnknown_QueryInterface(unk, &IID_IQuickActivate, (void**)&qa);
1359 ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
1360 ok(qa == NULL, "qa=%p, ezpected NULL\n", qa);
1362 hres = IUnknown_QueryInterface(unk, &IID_IRunnableObject, (void**)&runnable);
1363 ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
1364 ok(runnable == NULL, "runnable=%p, ezpected NULL\n", runnable);
1367 static void test_WebBrowser(void)
1369 IUnknown *unk = NULL;
1370 ULONG ref;
1371 HRESULT hres;
1373 hres = CoCreateInstance(&CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1374 &IID_IUnknown, (void**)&unk);
1375 ok(hres == S_OK, "CoCreateInterface failed: %08x\n", hres);
1376 if(FAILED(hres))
1377 return;
1379 test_QueryInterface(unk);
1380 test_ClassInfo(unk);
1381 test_ClientSite(unk, &ClientSite);
1382 test_Extent(unk);
1383 test_wb_funcs(unk, TRUE);
1384 test_DoVerb(unk);
1385 test_Navigate2(unk);
1386 test_ClientSite(unk, NULL);
1387 test_ie_funcs(unk);
1388 test_GetControlInfo(unk);
1389 test_wb_funcs(unk, FALSE);
1391 ref = IUnknown_Release(unk);
1392 ok(ref == 0, "ref=%d, expected 0\n", ref);
1395 static void gecko_installer_workaround(BOOL disable)
1397 HKEY hkey;
1398 DWORD res;
1400 static BOOL has_url = FALSE;
1401 static char url[2048];
1403 if(!disable && !has_url)
1404 return;
1406 res = RegOpenKey(HKEY_CURRENT_USER, "Software\\Wine\\MSHTML", &hkey);
1407 if(res != ERROR_SUCCESS)
1408 return;
1410 if(disable) {
1411 DWORD type, size = sizeof(url);
1413 res = RegQueryValueEx(hkey, "GeckoUrl", NULL, &type, (PVOID)url, &size);
1414 if(res == ERROR_SUCCESS && type == REG_SZ)
1415 has_url = TRUE;
1417 RegDeleteValue(hkey, "GeckoUrl");
1418 }else {
1419 RegSetValueEx(hkey, "GeckoUrl", 0, REG_SZ, (PVOID)url, lstrlenA(url)+1);
1422 RegCloseKey(hkey);
1425 START_TEST(webbrowser)
1427 gecko_installer_workaround(TRUE);
1429 container_hwnd = create_container_window();
1431 OleInitialize(NULL);
1433 test_WebBrowser();
1435 OleUninitialize();
1437 gecko_installer_workaround(FALSE);