kernel32: GlobalMemoryStatusEx: return the size of physical memory + swapsize in...
[wine] / dlls / shdocvw / tests / webbrowser.c
1 /*
2  * Copyright 2006 Jacek Caban for CodeWeavers
3  *
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.
8  *
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.
13  *
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
17  */
18
19 #define COBJMACROS
20 #define CONST_VTABLE
21
22 #include <wine/test.h>
23 #include <stdarg.h>
24
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"
34
35 #define DEFINE_EXPECT(func) \
36     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
37
38 #define SET_EXPECT(func) \
39     expect_ ## func = TRUE
40
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)
47
48 #define CHECK_EXPECT2(func) \
49     do { \
50         ok(expect_ ##func, "unexpected call " #func "\n"); \
51         called_ ## func = TRUE; \
52     }while(0)
53
54 #define CHECK_CALLED(func) \
55     do { \
56         ok(called_ ## func, "expected " #func "\n"); \
57         expect_ ## func = called_ ## func = FALSE; \
58     }while(0)
59
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);
83
84 static const WCHAR wszItem[] = {'i','t','e','m',0};
85
86 static HWND container_hwnd, shell_embedding_hwnd;
87
88 static HRESULT QueryInterface(REFIID,void**);
89
90 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
91 {
92     if(IsEqualGUID(&IID_ITargetContainer, riid))
93         return E_NOINTERFACE; /* TODO */
94     if(IsEqualGUID(&IID_IOleCommandTarget, riid))
95         return E_NOINTERFACE; /* TODO */
96
97     ok(0, "unexpected call\n");
98     return E_NOINTERFACE;
99 }
100
101 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
102 {
103     return 2;
104 }
105
106 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
107 {
108     return 1;
109 }
110
111 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
112         LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut)
113 {
114     ok(0, "unexpected call\n");
115     return E_NOTIMPL;
116 }
117
118 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
119         IEnumUnknown **ppenum)
120 {
121     ok(0, "unexpected call\n");
122     return E_NOTIMPL;
123 }
124
125 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
126 {
127     ok(0, "unexpected call\n");
128     return E_NOTIMPL;
129 }
130
131 static const IOleContainerVtbl OleContainerVtbl = {
132     OleContainer_QueryInterface,
133     OleContainer_AddRef,
134     OleContainer_Release,
135     OleContainer_ParseDisplayName,
136     OleContainer_EnumObjects,
137     OleContainer_LockContainer
138 };
139
140 static IOleContainer OleContainer = { &OleContainerVtbl };
141
142 static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
143 {
144     return QueryInterface(riid, ppv);
145 }
146
147 static ULONG WINAPI Dispatch_AddRef(IDispatch *iface)
148 {
149     return 2;
150 }
151
152 static ULONG WINAPI Dispatch_Release(IDispatch *iface)
153 {
154     return 1;
155 }
156
157 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
158 {
159     ok(0, "unexpected call\n");
160     return E_NOTIMPL;
161 }
162
163 static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
164         ITypeInfo **ppTInfo)
165 {
166     ok(0, "unexpected call\n");
167     return E_NOTIMPL;
168 }
169
170 static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
171         UINT cNames, LCID lcid, DISPID *rgDispId)
172 {
173     ok(0, "unexpected call\n");
174     return E_NOTIMPL;
175 }
176
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)
180 {
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);
191
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;
220     }
221
222     ok(0, "unexpected dispIdMember %d\n", dispIdMember);
223     return E_NOTIMPL;
224 }
225
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
234 };
235
236 static IDispatch Dispatch = { &DispatchVtbl };
237
238 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
239 {
240     return QueryInterface(riid, ppv);
241 }
242
243 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
244 {
245     return 2;
246 }
247
248 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
249 {
250     return 1;
251 }
252
253 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
254 {
255     ok(0, "unexpected call\n");
256     return E_NOTIMPL;
257 }
258
259 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAsign, DWORD dwWhichMoniker,
260         IMoniker **ppmon)
261 {
262     ok(0, "unexpected call\n");
263     return E_NOTIMPL;
264 }
265
266 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
267 {
268     CHECK_EXPECT(GetContainer);
269
270     ok(ppContainer != NULL, "ppContainer == NULL\n");
271     if(ppContainer)
272         *ppContainer = &OleContainer;
273
274     return S_OK;
275 }
276
277 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
278 {
279     CHECK_EXPECT(ShowObject);
280     return S_OK;
281 }
282
283 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
284 {
285     ok(0, "unexpected call\n");
286     return E_NOTIMPL;
287 }
288
289 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
290 {
291     ok(0, "unexpected call\n");
292     return E_NOTIMPL;
293 }
294
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
305 };
306
307 static IOleClientSite ClientSite = { &ClientSiteVtbl };
308
309 static HRESULT WINAPI InPlaceUIWindow_QueryInterface(IOleInPlaceFrame *iface,
310                                                      REFIID riid, void **ppv)
311 {
312     ok(0, "unexpected call\n");
313     return E_NOINTERFACE;
314 }
315
316 static ULONG WINAPI InPlaceUIWindow_AddRef(IOleInPlaceFrame *iface)
317 {
318     return 2;
319 }
320
321 static ULONG WINAPI InPlaceUIWindow_Release(IOleInPlaceFrame *iface)
322 {
323     return 1;
324 }
325
326 static HRESULT WINAPI InPlaceUIWindow_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
327 {
328     ok(0, "unexpected call\n");
329     return E_NOTIMPL;
330 }
331
332 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
333 {
334     CHECK_EXPECT(Frame_GetWindow);
335     ok(phwnd != NULL, "phwnd == NULL\n");
336     if(phwnd)
337         *phwnd = container_hwnd;
338     return S_OK;
339 }
340
341 static HRESULT WINAPI InPlaceUIWindow_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
342 {
343     ok(0, "unexpected call\n");
344     return E_NOTIMPL;
345 }
346
347 static HRESULT WINAPI InPlaceUIWindow_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
348 {
349     ok(0, "unexpected call\n");
350     return E_NOTIMPL;
351 }
352
353 static HRESULT WINAPI InPlaceUIWindow_RequestBorderSpace(IOleInPlaceFrame *iface,
354         LPCBORDERWIDTHS pborderwidths)
355 {
356     ok(0, "unexpected call\n");
357     return E_NOTIMPL;
358 }
359
360 static HRESULT WINAPI InPlaceUIWindow_SetBorderSpace(IOleInPlaceFrame *iface,
361         LPCBORDERWIDTHS pborderwidths)
362 {
363     ok(0, "unexpected call\n");
364     return E_NOTIMPL;
365 }
366
367 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
368         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
369 {
370     CHECK_EXPECT(UIWindow_SetActiveObject);
371     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
372     ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
373     return S_OK;
374 }
375
376 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
377         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
378 {
379     CHECK_EXPECT(Frame_SetActiveObject);
380     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
381     ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
382     return S_OK;
383 }
384
385 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
386         LPOLEMENUGROUPWIDTHS lpMenuWidths)
387 {
388     ok(0, "unexpected call\n");
389     return E_NOTIMPL;
390 }
391
392 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
393         HOLEMENU holemenu, HWND hwndActiveObject)
394 {
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;
401 }
402
403 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
404 {
405     ok(0, "unexpected call\n");
406     return E_NOTIMPL;
407 }
408
409 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
410 {
411     CHECK_EXPECT2(SetStatusText);
412     /* FIXME: Check pszStatusText */
413     return S_OK;
414 }
415
416 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
417 {
418     if(fEnable)
419         CHECK_EXPECT(EnableModeless_TRUE);
420     else
421         CHECK_EXPECT(EnableModeless_FALSE);
422     return S_OK;
423 }
424
425 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
426 {
427     ok(0, "unexpected call\n");
428     return E_NOTIMPL;
429 }
430
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,
441 };
442
443 static IOleInPlaceUIWindow InPlaceUIWindow = { (IOleInPlaceUIWindowVtbl*)&InPlaceUIWindowVtbl };
444
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
461 };
462
463 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
464
465 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
466 {
467     return QueryInterface(riid, ppv);
468 }
469
470 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
471 {
472     return 2;
473 }
474
475 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSiteEx *iface)
476 {
477     return 1;
478 }
479
480 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
481 {
482     CHECK_EXPECT(Site_GetWindow);
483     ok(phwnd != NULL, "phwnd == NULL\n");
484     if(phwnd)
485         *phwnd = container_hwnd;
486     return S_OK;
487 }
488
489 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
490 {
491     ok(0, "unexpected call\n");
492     return E_NOTIMPL;
493 }
494
495 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
496 {
497     CHECK_EXPECT(CanInPlaceActivate);
498     return S_OK;
499 }
500
501 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
502 {
503     CHECK_EXPECT(OnInPlaceActivate);
504     return S_OK;
505 }
506
507 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
508 {
509     CHECK_EXPECT(OnUIActivate);
510     return S_OK;
511 }
512
513 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
514         IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
515         LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
516 {
517     static const RECT pos_rect = {2,1,1002,901};
518     static const RECT clip_rect = {10,10,990,890};
519
520     CHECK_EXPECT(GetWindowContext);
521
522     ok(ppFrame != NULL, "ppFrame = NULL\n");
523     if(ppFrame)
524         *ppFrame = &InPlaceFrame;
525
526     ok(ppDoc != NULL, "ppDoc = NULL\n");
527     if(ppDoc)
528         *ppDoc = &InPlaceUIWindow;
529
530     ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
531     if(lprcPosRect)
532         memcpy(lprcPosRect, &pos_rect, sizeof(RECT));
533
534     ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
535     if(lprcClipRect)
536         memcpy(lprcClipRect, &clip_rect, sizeof(RECT));
537
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;
545     }
546
547     return S_OK;
548 }
549
550 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtant)
551 {
552     ok(0, "unexpected call\n");
553     return E_NOTIMPL;
554 }
555
556 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
557 {
558     ok(0, "unexpected call\n");
559     return E_NOTIMPL;
560 }
561
562 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
563 {
564     ok(0, "unexpected call\n");
565     return E_NOTIMPL;
566 }
567
568 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
569 {
570     ok(0, "unexpected call\n");
571     return E_NOTIMPL;
572 }
573
574 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
575 {
576     ok(0, "unexpected call\n");
577     return E_NOTIMPL;
578 }
579
580 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
581 {
582     ok(0, "unexpected call\n");
583     return E_NOTIMPL;
584 }
585
586 static HRESULT WINAPI InPlaceSite_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface,
587                                                       BOOL *pNoRedraw, DWORD dwFlags)
588 {
589     ok(0, "unexpected call\n");
590     return E_NOTIMPL;
591 }
592
593 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface,
594                                                         BOOL fNoRedraw)
595 {
596     ok(0, "unexpected call\n");
597     return E_NOTIMPL;
598 }
599
600 static HRESULT WINAPI InPlaceSite_RequestUIActivate(IOleInPlaceSiteEx *iface)
601 {
602     ok(0, "unexpected call\n");
603     return S_OK;
604 }
605
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
625 };
626
627 static IOleInPlaceSiteEx InPlaceSite = { &InPlaceSiteExVtbl };
628
629 static HRESULT WINAPI DocHostUIHandler_QueryInterface(IDocHostUIHandler2 *iface, REFIID riid, void **ppv)
630 {
631     return QueryInterface(riid, ppv);
632 }
633
634 static ULONG WINAPI DocHostUIHandler_AddRef(IDocHostUIHandler2 *iface)
635 {
636     return 2;
637 }
638
639 static ULONG WINAPI DocHostUIHandler_Release(IDocHostUIHandler2 *iface)
640 {
641     return 1;
642 }
643
644 static HRESULT WINAPI DocHostUIHandler_ShowContextMenu(IDocHostUIHandler2 *iface, DWORD dwID, POINT *ppt,
645         IUnknown *pcmdtReserved, IDispatch *pdicpReserved)
646 {
647     ok(0, "unexpected call %d %p %p %p\n", dwID, ppt, pcmdtReserved, pdicpReserved);
648     return S_FALSE;
649 }
650
651 static HRESULT WINAPI DocHostUIHandler_GetHostInfo(IDocHostUIHandler2 *iface, DOCHOSTUIINFO *pInfo)
652 {
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);
661     }
662     return E_FAIL;
663 }
664
665 static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD dwID,
666         IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget,
667         IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
668 {
669     ok(0, "unexpected call\n");
670     return E_NOTIMPL;
671 }
672
673 static HRESULT WINAPI DocHostUIHandler_HideUI(IDocHostUIHandler2 *iface)
674 {
675     ok(0, "unexpected call\n");
676     return E_NOTIMPL;
677 }
678
679 static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface)
680 {
681     ok(0, "unexpected call\n");
682     return E_NOTIMPL;
683 }
684
685 static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable)
686 {
687     ok(0, "unexpected call\n");
688     return E_NOTIMPL;
689 }
690
691 static HRESULT WINAPI DocHostUIHandler_OnDocWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
692 {
693     ok(0, "unexpected call\n");
694     return E_NOTIMPL;
695 }
696
697 static HRESULT WINAPI DocHostUIHandler_OnFrameWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
698 {
699     ok(0, "unexpected call\n");
700     return E_NOTIMPL;
701 }
702
703 static HRESULT WINAPI DocHostUIHandler_ResizeBorder(IDocHostUIHandler2 *iface, LPCRECT prcBorder,
704         IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
705 {
706     ok(0, "unexpected call\n");
707     return E_NOTIMPL;
708 }
709
710 static HRESULT WINAPI DocHostUIHandler_TranslateAccelerator(IDocHostUIHandler2 *iface, LPMSG lpMsg,
711         const GUID *pguidCmdGroup, DWORD nCmdID)
712 {
713     ok(0, "unexpected call\n");
714     return E_NOTIMPL;
715 }
716
717 static HRESULT WINAPI DocHostUIHandler_GetOptionKeyPath(IDocHostUIHandler2 *iface,
718         LPOLESTR *pchKey, DWORD dw)
719 {
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;
726 }
727
728 static HRESULT WINAPI DocHostUIHandler_GetDropTarget(IDocHostUIHandler2 *iface,
729         IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
730 {
731     ok(0, "unexpected call\n");
732     return E_NOTIMPL;
733 }
734
735 static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, IDispatch **ppDispatch)
736 {
737     ok(0, "unexpected call\n");
738     return E_NOTIMPL;
739 }
740
741 static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate,
742         OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
743 {
744     ok(0, "unexpected call\n");
745     return E_NOTIMPL;
746 }
747
748 static HRESULT WINAPI DocHostUIHandler_FilterDataObject(IDocHostUIHandler2 *iface, IDataObject *pDO,
749         IDataObject **ppPORet)
750 {
751     ok(0, "unexpected call\n");
752     return E_NOTIMPL;
753 }
754
755 static HRESULT WINAPI DocHostUIHandler_GetOverrideKeyPath(IDocHostUIHandler2 *iface,
756         LPOLESTR *pchKey, DWORD dw)
757 {
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;
764 }
765
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
786 };
787
788 static IDocHostUIHandler2 DocHostUIHandler = { &DocHostUIHandlerVtbl };
789
790 static HRESULT QueryInterface(REFIID riid, void **ppv)
791 {
792     *ppv = NULL;
793
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;
806
807     if(*ppv)
808         return S_OK;
809
810     return E_NOINTERFACE;
811 }
812
813 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
814 {
815     return DefWindowProcW(hwnd, msg, wParam, lParam);
816 }
817
818 static HWND create_container_window(void)
819 {
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),
824         0,
825         wnd_proc,
826         0, 0, NULL, NULL, NULL, NULL, NULL,
827         wszWebBrowserContainer,
828         NULL
829     };
830
831     RegisterClassExW(&wndclass);
832     return CreateWindowW(wszWebBrowserContainer, wszWebBrowserContainer,
833             WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
834             CW_USEDEFAULT, NULL, NULL, NULL, NULL);
835 }
836
837 static void test_DoVerb(IUnknown *unk)
838 {
839     IOleObject *oleobj;
840     RECT rect = {0,0,1000,1000};
841     HRESULT hres;
842
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;
847
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);
859
860     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
861                              0, (HWND)0xdeadbeef, &rect);
862     ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
863
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);
875
876     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
877                            0, (HWND)0xdeadbeef, &rect);
878     ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
879
880     IOleObject_Release(oleobj);
881 }
882
883 static void test_GetMiscStatus(IOleObject *oleobj)
884 {
885     DWORD st, i;
886     HRESULT hres;
887
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);
896     }
897 }
898
899 static void test_ClientSite(IUnknown *unk, IOleClientSite *client)
900 {
901     IOleObject *oleobj;
902     IOleInPlaceObject *inplace;
903     HWND hwnd;
904     HRESULT hres;
905
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;
910
911     test_GetMiscStatus(oleobj);
912
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;
918     }
919
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);
923
924     if(client) {
925         SET_EXPECT(GetContainer);
926         SET_EXPECT(Site_GetWindow);
927         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
928         SET_EXPECT(Invoke_AMBIENT_SILENT);
929     }
930
931     hres = IOleObject_SetClientSite(oleobj, client);
932     ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
933
934     if(client) {
935         CHECK_CALLED(GetContainer);
936         CHECK_CALLED(Site_GetWindow);
937         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
938         CHECK_CALLED(Invoke_AMBIENT_SILENT);
939     }
940
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);
944
945     shell_embedding_hwnd = hwnd;
946
947     IOleInPlaceObject_Release(inplace);
948     IOleObject_Release(oleobj);
949 }
950
951 static void test_ClassInfo(IUnknown *unk)
952 {
953     IProvideClassInfo2 *class_info;
954     GUID guid;
955     HRESULT hres;
956
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;
961
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");
965
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");
969
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");
973
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);
976
977     hres = IProvideClassInfo2_GetGUID(class_info, 0, NULL);
978     ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
979
980     IProvideClassInfo2_Release(class_info);
981 }
982
983 static void test_ie_funcs(IUnknown *unk)
984 {
985     IWebBrowser2 *wb;
986     VARIANT_BOOL b;
987     int i;
988     long hwnd;
989     HRESULT hres;
990
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;
995
996     /* HWND */
997
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);
1002
1003     /* MenuBar */
1004
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);
1008
1009     hres = IWebBrowser2_put_MenuBar(wb, VARIANT_FALSE);
1010     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1011
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);
1015
1016     hres = IWebBrowser2_put_MenuBar(wb, 100);
1017     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1018
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);
1022
1023     /* AddressBar */
1024
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);
1028
1029     hres = IWebBrowser2_put_AddressBar(wb, VARIANT_FALSE);
1030     ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
1031
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);
1035
1036     hres = IWebBrowser2_put_AddressBar(wb, 100);
1037     ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
1038
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);
1042
1043     hres = IWebBrowser2_put_AddressBar(wb, VARIANT_TRUE);
1044     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1045
1046     /* StatusBar */
1047
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);
1051
1052     hres = IWebBrowser2_put_StatusBar(wb, VARIANT_TRUE);
1053     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1054
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);
1058
1059     hres = IWebBrowser2_put_StatusBar(wb, VARIANT_FALSE);
1060     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1061
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);
1065
1066     hres = IWebBrowser2_put_StatusBar(wb, 100);
1067     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1068
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);
1072
1073     /* ToolBar */
1074
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);
1078
1079     hres = IWebBrowser2_put_ToolBar(wb, VARIANT_FALSE);
1080     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1081
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);
1085
1086     hres = IWebBrowser2_put_ToolBar(wb, 100);
1087     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1088
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);
1092
1093     hres = IWebBrowser2_put_ToolBar(wb, VARIANT_TRUE);
1094     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1095
1096     IWebBrowser2_Release(wb);
1097 }
1098
1099 static void test_Silent(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
1100 {
1101     VARIANT_BOOL b;
1102     HRESULT hres;
1103
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);
1108
1109     hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
1110     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1111
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);
1116
1117     hres = IWebBrowser2_put_Silent(wb, 100);
1118     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1119
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);
1124
1125     hres = IWebBrowser2_put_Silent(wb, VARIANT_FALSE);
1126     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1127
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);
1132
1133     if(is_clientsite) {
1134         hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
1135         ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1136
1137         SET_EXPECT(Invoke_AMBIENT_SILENT);
1138     }
1139
1140     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_SILENT);
1141     ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
1142
1143     if(is_clientsite)
1144         CHECK_CALLED(Invoke_AMBIENT_SILENT);
1145
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);
1150 }
1151
1152 static void test_Offline(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
1153 {
1154     VARIANT_BOOL b;
1155     HRESULT hres;
1156
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);
1161
1162     hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
1163     ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1164
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);
1169
1170     hres = IWebBrowser2_put_Offline(wb, 100);
1171     ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1172
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);
1177
1178     hres = IWebBrowser2_put_Offline(wb, VARIANT_FALSE);
1179     ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1180
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);
1185
1186     if(is_clientsite) {
1187         hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
1188         ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1189
1190         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1191     }
1192
1193     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
1194     ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
1195
1196     if(is_clientsite)
1197         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1198
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);
1203 }
1204
1205 static void test_wb_funcs(IUnknown *unk, BOOL is_clientsite)
1206 {
1207     IWebBrowser2 *wb;
1208     IOleControl *control;
1209     HRESULT hres;
1210
1211     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
1212     ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
1213
1214     hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1215     ok(hres == S_OK, "Could not get IOleControl interface: %08x\n", hres);
1216
1217     test_Silent(wb, control, is_clientsite);
1218     test_Offline(wb, control, is_clientsite);
1219
1220     IWebBrowser_Release(wb);
1221     IOleControl_Release(control);
1222 }
1223
1224 static void test_GetControlInfo(IUnknown *unk)
1225 {
1226     IOleControl *control;
1227     CONTROLINFO info;
1228     HRESULT hres;
1229
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;
1234
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);
1239
1240     IOleControl_Release(control);
1241 }
1242
1243 static void test_Extent(IUnknown *unk)
1244 {
1245     IOleObject *oleobj;
1246     SIZE size;
1247     HRESULT hres;
1248
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;
1253
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);
1258
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);
1263
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);
1268
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);
1273
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);
1278
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);
1283
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);
1288
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);
1293
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);
1298
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);
1303
1304     IOleObject_Release(oleobj);
1305 }
1306
1307 static void test_Navigate2(IUnknown *unk)
1308 {
1309     IWebBrowser2 *webbrowser;
1310     VARIANT url;
1311     HRESULT hres;
1312
1313     static const WCHAR wszAboutBlank[] =
1314         {'a','b','o','u','t',':','b','l','a','n','k',0};
1315
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;
1320
1321     V_VT(&url) = VT_BSTR;
1322     V_BSTR(&url) = SysAllocString(wszAboutBlank);
1323
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);
1334
1335     hres = IWebBrowser2_Navigate2(webbrowser, &url, NULL, NULL, NULL, NULL);
1336     ok(hres == S_OK, "Navigate2 failed: %08x\n", hres);
1337
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);
1348
1349     IWebBrowser2_Release(webbrowser);
1350 }
1351
1352 static void test_QueryInterface(IUnknown *unk)
1353 {
1354     IQuickActivate *qa = (IQuickActivate*)0xdeadbeef;
1355     IRunnableObject *runnable = (IRunnableObject*)0xdeadbeef;
1356     HRESULT hres;
1357
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);
1361
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);
1365 }
1366
1367 static void test_WebBrowser(void)
1368 {
1369     IUnknown *unk = NULL;
1370     ULONG ref;
1371     HRESULT hres;
1372
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;
1378
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);
1390
1391     ref = IUnknown_Release(unk);
1392     ok(ref == 0, "ref=%d, expected 0\n", ref);
1393 }
1394
1395 static void gecko_installer_workaround(BOOL disable)
1396 {
1397     HKEY hkey;
1398     DWORD res;
1399
1400     static BOOL has_url = FALSE;
1401     static char url[2048];
1402
1403     if(!disable && !has_url)
1404         return;
1405
1406     res = RegOpenKey(HKEY_CURRENT_USER, "Software\\Wine\\MSHTML", &hkey);
1407     if(res != ERROR_SUCCESS)
1408         return;
1409
1410     if(disable) {
1411         DWORD type, size = sizeof(url);
1412
1413         res = RegQueryValueEx(hkey, "GeckoUrl", NULL, &type, (PVOID)url, &size);
1414         if(res == ERROR_SUCCESS && type == REG_SZ)
1415             has_url = TRUE;
1416
1417         RegDeleteValue(hkey, "GeckoUrl");
1418     }else {
1419         RegSetValueEx(hkey, "GeckoUrl", 0, REG_SZ, (PVOID)url, lstrlenA(url)+1);
1420     }
1421
1422     RegCloseKey(hkey);
1423 }
1424
1425 START_TEST(webbrowser)
1426 {
1427     gecko_installer_workaround(TRUE);
1428
1429     container_hwnd = create_container_window();
1430
1431     OleInitialize(NULL);
1432
1433     test_WebBrowser();
1434
1435     OleUninitialize();
1436
1437     gecko_installer_workaround(FALSE);
1438 }