shdocvw: Fixed tests on IE7.
[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 DEFINE_EXPECT(UpdateUI);
84
85 static const WCHAR wszItem[] = {'i','t','e','m',0};
86
87 static HWND container_hwnd, shell_embedding_hwnd;
88
89 static HRESULT QueryInterface(REFIID,void**);
90
91 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
92 {
93     if(IsEqualGUID(&IID_ITargetContainer, riid))
94         return E_NOINTERFACE; /* TODO */
95     if(IsEqualGUID(&IID_IOleCommandTarget, riid))
96         return E_NOINTERFACE; /* TODO */
97
98     ok(0, "unexpected call\n");
99     return E_NOINTERFACE;
100 }
101
102 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
103 {
104     return 2;
105 }
106
107 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
108 {
109     return 1;
110 }
111
112 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
113         LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut)
114 {
115     ok(0, "unexpected call\n");
116     return E_NOTIMPL;
117 }
118
119 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
120         IEnumUnknown **ppenum)
121 {
122     ok(0, "unexpected call\n");
123     return E_NOTIMPL;
124 }
125
126 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
127 {
128     ok(0, "unexpected call\n");
129     return E_NOTIMPL;
130 }
131
132 static const IOleContainerVtbl OleContainerVtbl = {
133     OleContainer_QueryInterface,
134     OleContainer_AddRef,
135     OleContainer_Release,
136     OleContainer_ParseDisplayName,
137     OleContainer_EnumObjects,
138     OleContainer_LockContainer
139 };
140
141 static IOleContainer OleContainer = { &OleContainerVtbl };
142
143 static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
144 {
145     return QueryInterface(riid, ppv);
146 }
147
148 static ULONG WINAPI Dispatch_AddRef(IDispatch *iface)
149 {
150     return 2;
151 }
152
153 static ULONG WINAPI Dispatch_Release(IDispatch *iface)
154 {
155     return 1;
156 }
157
158 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
159 {
160     ok(0, "unexpected call\n");
161     return E_NOTIMPL;
162 }
163
164 static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
165         ITypeInfo **ppTInfo)
166 {
167     ok(0, "unexpected call\n");
168     return E_NOTIMPL;
169 }
170
171 static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
172         UINT cNames, LCID lcid, DISPID *rgDispId)
173 {
174     ok(0, "unexpected call\n");
175     return E_NOTIMPL;
176 }
177
178 static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
179         LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
180         EXCEPINFO *pExcepInfo, UINT *puArgErr)
181 {
182     ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
183     ok(pDispParams != NULL, "pDispParams == NULL\n");
184     ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
185     ok(V_VT(pVarResult) == VT_EMPTY, "V_VT(pVarResult)=%d\n", V_VT(pVarResult));
186     ok(wFlags == DISPATCH_PROPERTYGET, "wFlags=%08x, expected DISPATCH_PROPERTYGET\n", wFlags);
187     ok(pDispParams->rgvarg == NULL, "pDispParams->rgvarg = %p\n", pDispParams->rgvarg);
188     ok(pDispParams->rgdispidNamedArgs == NULL,
189        "pDispParams->rgdispidNamedArgs = %p\n", pDispParams->rgdispidNamedArgs);
190     ok(pDispParams->cArgs == 0, "pDispParams->cArgs = %d\n", pDispParams->cArgs);
191     ok(pDispParams->cNamedArgs == 0, "pDispParams->cNamedArgs = %d\n", pDispParams->cNamedArgs);
192
193     switch(dispIdMember) {
194     case DISPID_AMBIENT_USERMODE:
195         CHECK_EXPECT2(Invoke_AMBIENT_USERMODE);
196         return E_FAIL;
197     case DISPID_AMBIENT_DLCONTROL:
198         CHECK_EXPECT(Invoke_AMBIENT_DLCONTROL);
199         ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
200         return E_FAIL;
201     case DISPID_AMBIENT_USERAGENT:
202        CHECK_EXPECT(Invoke_AMBIENT_USERAGENT);
203         ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
204         return E_FAIL;
205     case DISPID_AMBIENT_PALETTE:
206         CHECK_EXPECT(Invoke_AMBIENT_PALETTE);
207         ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
208         return E_FAIL;
209     case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
210         CHECK_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
211         ok(puArgErr == NULL, "puArgErr=%p\n", puArgErr);
212         V_VT(pVarResult) = VT_BOOL;
213         V_BOOL(pVarResult) = VARIANT_FALSE;
214         return S_OK;
215     case DISPID_AMBIENT_SILENT:
216         CHECK_EXPECT(Invoke_AMBIENT_SILENT);
217         ok(puArgErr == NULL, "puArgErr=%p\n", puArgErr);
218         V_VT(pVarResult) = VT_BOOL;
219         V_BOOL(pVarResult) = VARIANT_FALSE;
220         return S_OK;
221     }
222
223     ok(0, "unexpected dispIdMember %d\n", dispIdMember);
224     return E_NOTIMPL;
225 }
226
227 static IDispatchVtbl DispatchVtbl = {
228     Dispatch_QueryInterface,
229     Dispatch_AddRef,
230     Dispatch_Release,
231     Dispatch_GetTypeInfoCount,
232     Dispatch_GetTypeInfo,
233     Dispatch_GetIDsOfNames,
234     Dispatch_Invoke
235 };
236
237 static IDispatch Dispatch = { &DispatchVtbl };
238
239 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
240 {
241     return QueryInterface(riid, ppv);
242 }
243
244 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
245 {
246     return 2;
247 }
248
249 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
250 {
251     return 1;
252 }
253
254 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
255 {
256     ok(0, "unexpected call\n");
257     return E_NOTIMPL;
258 }
259
260 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAsign, DWORD dwWhichMoniker,
261         IMoniker **ppmon)
262 {
263     ok(0, "unexpected call\n");
264     return E_NOTIMPL;
265 }
266
267 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
268 {
269     CHECK_EXPECT(GetContainer);
270
271     ok(ppContainer != NULL, "ppContainer == NULL\n");
272     if(ppContainer)
273         *ppContainer = &OleContainer;
274
275     return S_OK;
276 }
277
278 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
279 {
280     CHECK_EXPECT(ShowObject);
281     return S_OK;
282 }
283
284 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
285 {
286     ok(0, "unexpected call\n");
287     return E_NOTIMPL;
288 }
289
290 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
291 {
292     ok(0, "unexpected call\n");
293     return E_NOTIMPL;
294 }
295
296 static const IOleClientSiteVtbl ClientSiteVtbl = {
297     ClientSite_QueryInterface,
298     ClientSite_AddRef,
299     ClientSite_Release,
300     ClientSite_SaveObject,
301     ClientSite_GetMoniker,
302     ClientSite_GetContainer,
303     ClientSite_ShowObject,
304     ClientSite_OnShowWindow,
305     ClientSite_RequestNewObjectLayout
306 };
307
308 static IOleClientSite ClientSite = { &ClientSiteVtbl };
309
310 static HRESULT WINAPI InPlaceUIWindow_QueryInterface(IOleInPlaceFrame *iface,
311                                                      REFIID riid, void **ppv)
312 {
313     ok(0, "unexpected call\n");
314     return E_NOINTERFACE;
315 }
316
317 static ULONG WINAPI InPlaceUIWindow_AddRef(IOleInPlaceFrame *iface)
318 {
319     return 2;
320 }
321
322 static ULONG WINAPI InPlaceUIWindow_Release(IOleInPlaceFrame *iface)
323 {
324     return 1;
325 }
326
327 static HRESULT WINAPI InPlaceUIWindow_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
328 {
329     ok(0, "unexpected call\n");
330     return E_NOTIMPL;
331 }
332
333 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
334 {
335     CHECK_EXPECT(Frame_GetWindow);
336     ok(phwnd != NULL, "phwnd == NULL\n");
337     if(phwnd)
338         *phwnd = container_hwnd;
339     return S_OK;
340 }
341
342 static HRESULT WINAPI InPlaceUIWindow_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
343 {
344     ok(0, "unexpected call\n");
345     return E_NOTIMPL;
346 }
347
348 static HRESULT WINAPI InPlaceUIWindow_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
349 {
350     ok(0, "unexpected call\n");
351     return E_NOTIMPL;
352 }
353
354 static HRESULT WINAPI InPlaceUIWindow_RequestBorderSpace(IOleInPlaceFrame *iface,
355         LPCBORDERWIDTHS pborderwidths)
356 {
357     ok(0, "unexpected call\n");
358     return E_NOTIMPL;
359 }
360
361 static HRESULT WINAPI InPlaceUIWindow_SetBorderSpace(IOleInPlaceFrame *iface,
362         LPCBORDERWIDTHS pborderwidths)
363 {
364     ok(0, "unexpected call\n");
365     return E_NOTIMPL;
366 }
367
368 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
369         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
370 {
371     CHECK_EXPECT(UIWindow_SetActiveObject);
372     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
373     ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
374     return S_OK;
375 }
376
377 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
378         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
379 {
380     CHECK_EXPECT(Frame_SetActiveObject);
381     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
382     ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
383     return S_OK;
384 }
385
386 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
387         LPOLEMENUGROUPWIDTHS lpMenuWidths)
388 {
389     ok(0, "unexpected call\n");
390     return E_NOTIMPL;
391 }
392
393 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
394         HOLEMENU holemenu, HWND hwndActiveObject)
395 {
396     CHECK_EXPECT(SetMenu);
397     ok(hmenuShared == NULL, "hmenuShared=%p\n", hmenuShared);
398     ok(holemenu == NULL, "holemenu=%p\n", holemenu);
399     ok(hwndActiveObject == shell_embedding_hwnd, "hwndActiveObject=%p, expected %p\n",
400        hwndActiveObject, shell_embedding_hwnd);
401     return S_OK;
402 }
403
404 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
405 {
406     ok(0, "unexpected call\n");
407     return E_NOTIMPL;
408 }
409
410 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
411 {
412     CHECK_EXPECT2(SetStatusText);
413     /* FIXME: Check pszStatusText */
414     return S_OK;
415 }
416
417 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
418 {
419     if(fEnable)
420         CHECK_EXPECT(EnableModeless_TRUE);
421     else
422         CHECK_EXPECT(EnableModeless_FALSE);
423     return S_OK;
424 }
425
426 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
427 {
428     ok(0, "unexpected call\n");
429     return E_NOTIMPL;
430 }
431
432 static const IOleInPlaceFrameVtbl InPlaceUIWindowVtbl = {
433     InPlaceUIWindow_QueryInterface,
434     InPlaceUIWindow_AddRef,
435     InPlaceUIWindow_Release,
436     InPlaceUIWindow_GetWindow,
437     InPlaceUIWindow_ContextSensitiveHelp,
438     InPlaceUIWindow_GetBorder,
439     InPlaceUIWindow_RequestBorderSpace,
440     InPlaceUIWindow_SetBorderSpace,
441     InPlaceUIWindow_SetActiveObject,
442 };
443
444 static IOleInPlaceUIWindow InPlaceUIWindow = { (IOleInPlaceUIWindowVtbl*)&InPlaceUIWindowVtbl };
445
446 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = {
447     InPlaceUIWindow_QueryInterface,
448     InPlaceUIWindow_AddRef,
449     InPlaceUIWindow_Release,
450     InPlaceFrame_GetWindow,
451     InPlaceUIWindow_ContextSensitiveHelp,
452     InPlaceUIWindow_GetBorder,
453     InPlaceUIWindow_RequestBorderSpace,
454     InPlaceUIWindow_SetBorderSpace,
455     InPlaceFrame_SetActiveObject,
456     InPlaceFrame_InsertMenus,
457     InPlaceFrame_SetMenu,
458     InPlaceFrame_RemoveMenus,
459     InPlaceFrame_SetStatusText,
460     InPlaceFrame_EnableModeless,
461     InPlaceFrame_TranslateAccelerator
462 };
463
464 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
465
466 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
467 {
468     return QueryInterface(riid, ppv);
469 }
470
471 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
472 {
473     return 2;
474 }
475
476 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSiteEx *iface)
477 {
478     return 1;
479 }
480
481 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
482 {
483     CHECK_EXPECT(Site_GetWindow);
484     ok(phwnd != NULL, "phwnd == NULL\n");
485     if(phwnd)
486         *phwnd = container_hwnd;
487     return S_OK;
488 }
489
490 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
491 {
492     ok(0, "unexpected call\n");
493     return E_NOTIMPL;
494 }
495
496 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
497 {
498     CHECK_EXPECT(CanInPlaceActivate);
499     return S_OK;
500 }
501
502 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
503 {
504     CHECK_EXPECT(OnInPlaceActivate);
505     return S_OK;
506 }
507
508 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
509 {
510     CHECK_EXPECT(OnUIActivate);
511     return S_OK;
512 }
513
514 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
515         IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
516         LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
517 {
518     static const RECT pos_rect = {2,1,1002,901};
519     static const RECT clip_rect = {10,10,990,890};
520
521     CHECK_EXPECT(GetWindowContext);
522
523     ok(ppFrame != NULL, "ppFrame = NULL\n");
524     if(ppFrame)
525         *ppFrame = &InPlaceFrame;
526
527     ok(ppDoc != NULL, "ppDoc = NULL\n");
528     if(ppDoc)
529         *ppDoc = &InPlaceUIWindow;
530
531     ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
532     if(lprcPosRect)
533         memcpy(lprcPosRect, &pos_rect, sizeof(RECT));
534
535     ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
536     if(lprcClipRect)
537         memcpy(lprcClipRect, &clip_rect, sizeof(RECT));
538
539     ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n");
540     if(lpFrameInfo) {
541         lpFrameInfo->cb = sizeof(*lpFrameInfo);
542         lpFrameInfo->fMDIApp = FALSE;
543         lpFrameInfo->hwndFrame = container_hwnd;
544         lpFrameInfo->haccel = NULL;
545         lpFrameInfo->cAccelEntries = 0;
546     }
547
548     return S_OK;
549 }
550
551 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtant)
552 {
553     ok(0, "unexpected call\n");
554     return E_NOTIMPL;
555 }
556
557 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
558 {
559     ok(0, "unexpected call\n");
560     return E_NOTIMPL;
561 }
562
563 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
564 {
565     ok(0, "unexpected call\n");
566     return E_NOTIMPL;
567 }
568
569 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
570 {
571     ok(0, "unexpected call\n");
572     return E_NOTIMPL;
573 }
574
575 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
576 {
577     ok(0, "unexpected call\n");
578     return E_NOTIMPL;
579 }
580
581 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
582 {
583     ok(0, "unexpected call\n");
584     return E_NOTIMPL;
585 }
586
587 static HRESULT WINAPI InPlaceSite_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface,
588                                                       BOOL *pNoRedraw, DWORD dwFlags)
589 {
590     ok(0, "unexpected call\n");
591     return E_NOTIMPL;
592 }
593
594 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface,
595                                                         BOOL fNoRedraw)
596 {
597     ok(0, "unexpected call\n");
598     return E_NOTIMPL;
599 }
600
601 static HRESULT WINAPI InPlaceSite_RequestUIActivate(IOleInPlaceSiteEx *iface)
602 {
603     ok(0, "unexpected call\n");
604     return S_OK;
605 }
606
607 static const IOleInPlaceSiteExVtbl InPlaceSiteExVtbl = {
608     InPlaceSite_QueryInterface,
609     InPlaceSite_AddRef,
610     InPlaceSite_Release,
611     InPlaceSite_GetWindow,
612     InPlaceSite_ContextSensitiveHelp,
613     InPlaceSite_CanInPlaceActivate,
614     InPlaceSite_OnInPlaceActivate,
615     InPlaceSite_OnUIActivate,
616     InPlaceSite_GetWindowContext,
617     InPlaceSite_Scroll,
618     InPlaceSite_OnUIDeactivate,
619     InPlaceSite_OnInPlaceDeactivate,
620     InPlaceSite_DiscardUndoState,
621     InPlaceSite_DeactivateAndUndo,
622     InPlaceSite_OnPosRectChange,
623     InPlaceSite_OnInPlaceActivateEx,
624     InPlaceSite_OnInPlaceDeactivateEx,
625     InPlaceSite_RequestUIActivate
626 };
627
628 static IOleInPlaceSiteEx InPlaceSite = { &InPlaceSiteExVtbl };
629
630 static HRESULT WINAPI DocHostUIHandler_QueryInterface(IDocHostUIHandler2 *iface, REFIID riid, void **ppv)
631 {
632     return QueryInterface(riid, ppv);
633 }
634
635 static ULONG WINAPI DocHostUIHandler_AddRef(IDocHostUIHandler2 *iface)
636 {
637     return 2;
638 }
639
640 static ULONG WINAPI DocHostUIHandler_Release(IDocHostUIHandler2 *iface)
641 {
642     return 1;
643 }
644
645 static HRESULT WINAPI DocHostUIHandler_ShowContextMenu(IDocHostUIHandler2 *iface, DWORD dwID, POINT *ppt,
646         IUnknown *pcmdtReserved, IDispatch *pdicpReserved)
647 {
648     ok(0, "unexpected call %d %p %p %p\n", dwID, ppt, pcmdtReserved, pdicpReserved);
649     return S_FALSE;
650 }
651
652 static HRESULT WINAPI DocHostUIHandler_GetHostInfo(IDocHostUIHandler2 *iface, DOCHOSTUIINFO *pInfo)
653 {
654     CHECK_EXPECT(GetHostInfo);
655     ok(pInfo != NULL, "pInfo=NULL\n");
656     if(pInfo) {
657         ok(pInfo->cbSize == sizeof(DOCHOSTUIINFO), "pInfo->cbSize=%u\n", pInfo->cbSize);
658         ok(!pInfo->dwFlags, "pInfo->dwFlags=%08x, expected 0\n", pInfo->dwFlags);
659         ok(!pInfo->dwDoubleClick, "pInfo->dwDoubleClick=%08x, expected 0\n", pInfo->dwDoubleClick);
660         ok(!pInfo->pchHostCss, "pInfo->pchHostCss=%p, expected NULL\n", pInfo->pchHostCss);
661         ok(!pInfo->pchHostNS, "pInfo->pchhostNS=%p, expected NULL\n", pInfo->pchHostNS);
662     }
663     return E_FAIL;
664 }
665
666 static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD dwID,
667         IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget,
668         IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
669 {
670     ok(0, "unexpected call\n");
671     return E_NOTIMPL;
672 }
673
674 static HRESULT WINAPI DocHostUIHandler_HideUI(IDocHostUIHandler2 *iface)
675 {
676     ok(0, "unexpected call\n");
677     return E_NOTIMPL;
678 }
679
680 static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface)
681 {
682     CHECK_EXPECT(UpdateUI);
683     return E_NOTIMPL;
684 }
685
686 static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable)
687 {
688     ok(0, "unexpected call\n");
689     return E_NOTIMPL;
690 }
691
692 static HRESULT WINAPI DocHostUIHandler_OnDocWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
693 {
694     ok(0, "unexpected call\n");
695     return E_NOTIMPL;
696 }
697
698 static HRESULT WINAPI DocHostUIHandler_OnFrameWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
699 {
700     ok(0, "unexpected call\n");
701     return E_NOTIMPL;
702 }
703
704 static HRESULT WINAPI DocHostUIHandler_ResizeBorder(IDocHostUIHandler2 *iface, LPCRECT prcBorder,
705         IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
706 {
707     ok(0, "unexpected call\n");
708     return E_NOTIMPL;
709 }
710
711 static HRESULT WINAPI DocHostUIHandler_TranslateAccelerator(IDocHostUIHandler2 *iface, LPMSG lpMsg,
712         const GUID *pguidCmdGroup, DWORD nCmdID)
713 {
714     ok(0, "unexpected call\n");
715     return E_NOTIMPL;
716 }
717
718 static HRESULT WINAPI DocHostUIHandler_GetOptionKeyPath(IDocHostUIHandler2 *iface,
719         LPOLESTR *pchKey, DWORD dw)
720 {
721     CHECK_EXPECT(GetOptionKeyPath);
722     ok(pchKey != NULL, "pchKey==NULL\n");
723     if(pchKey)
724         ok(*pchKey == NULL, "*pchKey=%p\n", *pchKey);
725     ok(!dw, "dw=%x\n", dw);
726     return E_NOTIMPL;
727 }
728
729 static HRESULT WINAPI DocHostUIHandler_GetDropTarget(IDocHostUIHandler2 *iface,
730         IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
731 {
732     ok(0, "unexpected call\n");
733     return E_NOTIMPL;
734 }
735
736 static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, IDispatch **ppDispatch)
737 {
738     ok(0, "unexpected call\n");
739     return E_NOTIMPL;
740 }
741
742 static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate,
743         OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
744 {
745     ok(0, "unexpected call\n");
746     return E_NOTIMPL;
747 }
748
749 static HRESULT WINAPI DocHostUIHandler_FilterDataObject(IDocHostUIHandler2 *iface, IDataObject *pDO,
750         IDataObject **ppPORet)
751 {
752     ok(0, "unexpected call\n");
753     return E_NOTIMPL;
754 }
755
756 static HRESULT WINAPI DocHostUIHandler_GetOverrideKeyPath(IDocHostUIHandler2 *iface,
757         LPOLESTR *pchKey, DWORD dw)
758 {
759     CHECK_EXPECT(GetOverridesKeyPath);
760     ok(pchKey != NULL, "pchKey==NULL\n");
761     if(pchKey)
762         ok(*pchKey == NULL, "*pchKey=%p\n", *pchKey);
763     ok(!dw, "dw=%x\n", dw);
764     return E_NOTIMPL;
765 }
766
767 static const IDocHostUIHandler2Vtbl DocHostUIHandlerVtbl = {
768     DocHostUIHandler_QueryInterface,
769     DocHostUIHandler_AddRef,
770     DocHostUIHandler_Release,
771     DocHostUIHandler_ShowContextMenu,
772     DocHostUIHandler_GetHostInfo,
773     DocHostUIHandler_ShowUI,
774     DocHostUIHandler_HideUI,
775     DocHostUIHandler_UpdateUI,
776     DocHostUIHandler_EnableModeless,
777     DocHostUIHandler_OnDocWindowActivate,
778     DocHostUIHandler_OnFrameWindowActivate,
779     DocHostUIHandler_ResizeBorder,
780     DocHostUIHandler_TranslateAccelerator,
781     DocHostUIHandler_GetOptionKeyPath,
782     DocHostUIHandler_GetDropTarget,
783     DocHostUIHandler_GetExternal,
784     DocHostUIHandler_TranslateUrl,
785     DocHostUIHandler_FilterDataObject,
786     DocHostUIHandler_GetOverrideKeyPath
787 };
788
789 static IDocHostUIHandler2 DocHostUIHandler = { &DocHostUIHandlerVtbl };
790
791 static HRESULT QueryInterface(REFIID riid, void **ppv)
792 {
793     *ppv = NULL;
794
795     if(IsEqualGUID(&IID_IUnknown, riid)
796             || IsEqualGUID(&IID_IOleClientSite, riid))
797         *ppv = &ClientSite;
798     else if(IsEqualGUID(&IID_IOleWindow, riid)
799             || IsEqualGUID(&IID_IOleInPlaceSite, riid)
800             || IsEqualGUID(&IID_IOleInPlaceSiteEx, riid))
801         *ppv = &InPlaceSite;
802     else if(IsEqualGUID(&IID_IDocHostUIHandler, riid)
803             || IsEqualGUID(&IID_IDocHostUIHandler2, riid))
804         *ppv = &DocHostUIHandler;
805     else if(IsEqualGUID(&IID_IDispatch, riid))
806         *ppv = &Dispatch;
807
808     if(*ppv)
809         return S_OK;
810
811     return E_NOINTERFACE;
812 }
813
814 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
815 {
816     return DefWindowProcW(hwnd, msg, wParam, lParam);
817 }
818
819 static HWND create_container_window(void)
820 {
821     static const WCHAR wszWebBrowserContainer[] =
822         {'W','e','b','B','r','o','w','s','e','r','C','o','n','t','a','i','n','e','r',0};
823     static WNDCLASSEXW wndclass = {
824         sizeof(WNDCLASSEXW),
825         0,
826         wnd_proc,
827         0, 0, NULL, NULL, NULL, NULL, NULL,
828         wszWebBrowserContainer,
829         NULL
830     };
831
832     RegisterClassExW(&wndclass);
833     return CreateWindowW(wszWebBrowserContainer, wszWebBrowserContainer,
834             WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
835             CW_USEDEFAULT, NULL, NULL, NULL, NULL);
836 }
837
838 static void test_DoVerb(IUnknown *unk)
839 {
840     IOleObject *oleobj;
841     RECT rect = {0,0,1000,1000};
842     HRESULT hres;
843
844     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
845     ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
846     if(FAILED(hres))
847         return;
848
849     SET_EXPECT(CanInPlaceActivate);
850     SET_EXPECT(Site_GetWindow);
851     SET_EXPECT(OnInPlaceActivate);
852     SET_EXPECT(GetWindowContext);
853     SET_EXPECT(ShowObject);
854     SET_EXPECT(GetContainer);
855     SET_EXPECT(Frame_GetWindow);
856     SET_EXPECT(OnUIActivate);
857     SET_EXPECT(Frame_SetActiveObject);
858     SET_EXPECT(UIWindow_SetActiveObject);
859     SET_EXPECT(SetMenu);
860
861     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
862                              0, (HWND)0xdeadbeef, &rect);
863     ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
864
865     CHECK_CALLED(CanInPlaceActivate);
866     CHECK_CALLED(Site_GetWindow);
867     CHECK_CALLED(OnInPlaceActivate);
868     CHECK_CALLED(GetWindowContext);
869     CHECK_CALLED(ShowObject);
870     CHECK_CALLED(GetContainer);
871     CHECK_CALLED(Frame_GetWindow);
872     CHECK_CALLED(OnUIActivate);
873     CHECK_CALLED(Frame_SetActiveObject);
874     CHECK_CALLED(UIWindow_SetActiveObject);
875     CHECK_CALLED(SetMenu);
876
877     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
878                            0, (HWND)0xdeadbeef, &rect);
879     ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
880
881     IOleObject_Release(oleobj);
882 }
883
884 static void test_GetMiscStatus(IOleObject *oleobj)
885 {
886     DWORD st, i;
887     HRESULT hres;
888
889     for(i=0; i<10; i++) {
890         st = 0xdeadbeef;
891         hres = IOleObject_GetMiscStatus(oleobj, i, &st);
892         ok(hres == S_OK, "GetMiscStatus failed: %08x\n", hres);
893         ok(st == (OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT
894                   |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE),
895            "st=%08x, expected OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|"
896            "OLEMISC_INSIDEOUT|OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE)\n", st);
897     }
898 }
899
900 static void test_ClientSite(IUnknown *unk, IOleClientSite *client)
901 {
902     IOleObject *oleobj;
903     IOleInPlaceObject *inplace;
904     HWND hwnd;
905     HRESULT hres;
906
907     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
908     ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
909     if(FAILED(hres))
910         return;
911
912     test_GetMiscStatus(oleobj);
913
914     hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceObject, (void**)&inplace);
915     ok(hres == S_OK, "QueryInterface(IID_OleInPlaceObject) failed: %08x\n", hres);
916     if(FAILED(hres)) {
917         IOleObject_Release(oleobj);
918         return;
919     }
920
921     hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
922     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
923     ok((hwnd == NULL) ^ (client == NULL), "unexpected hwnd %p\n", hwnd);
924
925     if(client) {
926         SET_EXPECT(GetContainer);
927         SET_EXPECT(Site_GetWindow);
928         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
929         SET_EXPECT(Invoke_AMBIENT_SILENT);
930     }
931
932     hres = IOleObject_SetClientSite(oleobj, client);
933     ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
934
935     if(client) {
936         CHECK_CALLED(GetContainer);
937         CHECK_CALLED(Site_GetWindow);
938         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
939         CHECK_CALLED(Invoke_AMBIENT_SILENT);
940     }
941
942     hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
943     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
944     ok((hwnd == NULL) == (client == NULL), "unexpected hwnd %p\n", hwnd);
945
946     shell_embedding_hwnd = hwnd;
947
948     IOleInPlaceObject_Release(inplace);
949     IOleObject_Release(oleobj);
950 }
951
952 static void test_ClassInfo(IUnknown *unk)
953 {
954     IProvideClassInfo2 *class_info;
955     GUID guid;
956     HRESULT hres;
957
958     hres = IUnknown_QueryInterface(unk, &IID_IProvideClassInfo2, (void**)&class_info);
959     ok(hres == S_OK, "QueryInterface(IID_IProvideClassInfo)  failed: %08x\n", hres);
960     if(FAILED(hres))
961         return;
962
963     hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, &guid);
964     ok(hres == S_OK, "GetGUID failed: %08x\n", hres);
965     ok(IsEqualGUID(&DIID_DWebBrowserEvents2, &guid), "wrong guid\n");
966
967     hres = IProvideClassInfo2_GetGUID(class_info, 0, &guid);
968     ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres);
969     ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
970
971     hres = IProvideClassInfo2_GetGUID(class_info, 2, &guid);
972     ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres);
973     ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
974
975     hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, NULL);
976     ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
977
978     hres = IProvideClassInfo2_GetGUID(class_info, 0, NULL);
979     ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
980
981     IProvideClassInfo2_Release(class_info);
982 }
983
984 static void test_ie_funcs(IUnknown *unk)
985 {
986     IWebBrowser2 *wb;
987     VARIANT_BOOL b;
988     int i;
989     long hwnd;
990     HRESULT hres;
991
992     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
993     ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
994     if(FAILED(hres))
995         return;
996
997     /* HWND */
998
999     hwnd = 0xdeadbeef;
1000     hres = IWebBrowser2_get_HWND(wb, &hwnd);
1001     ok(hres == E_FAIL, "get_HWND failed: %08x, expected E_FAIL\n", hres);
1002     ok(hwnd == 0, "unexpected hwnd %lx\n", hwnd);
1003
1004     /* MenuBar */
1005
1006     hres = IWebBrowser2_get_MenuBar(wb, &b);
1007     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1008     ok(b == VARIANT_TRUE, "b=%x\n", b);
1009
1010     hres = IWebBrowser2_put_MenuBar(wb, VARIANT_FALSE);
1011     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1012
1013     hres = IWebBrowser2_get_MenuBar(wb, &b);
1014     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1015     ok(b == VARIANT_FALSE, "b=%x\n", b);
1016
1017     hres = IWebBrowser2_put_MenuBar(wb, 100);
1018     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1019
1020     hres = IWebBrowser2_get_MenuBar(wb, &b);
1021     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1022     ok(b == VARIANT_TRUE, "b=%x\n", b);
1023
1024     /* AddressBar */
1025
1026     hres = IWebBrowser2_get_AddressBar(wb, &b);
1027     ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres);
1028     ok(b == VARIANT_TRUE, "b=%x\n", b);
1029
1030     hres = IWebBrowser2_put_AddressBar(wb, VARIANT_FALSE);
1031     ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
1032
1033     hres = IWebBrowser2_get_AddressBar(wb, &b);
1034     ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1035     ok(b == VARIANT_FALSE, "b=%x\n", b);
1036
1037     hres = IWebBrowser2_put_AddressBar(wb, 100);
1038     ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
1039
1040     hres = IWebBrowser2_get_AddressBar(wb, &b);
1041     ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres);
1042     ok(b == VARIANT_TRUE, "b=%x\n", b);
1043
1044     hres = IWebBrowser2_put_AddressBar(wb, VARIANT_TRUE);
1045     ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1046
1047     /* StatusBar */
1048
1049     hres = IWebBrowser2_get_StatusBar(wb, &b);
1050     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1051     ok(b == VARIANT_TRUE, "b=%x\n", b);
1052
1053     hres = IWebBrowser2_put_StatusBar(wb, VARIANT_TRUE);
1054     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1055
1056     hres = IWebBrowser2_get_StatusBar(wb, &b);
1057     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1058     ok(b == VARIANT_TRUE, "b=%x\n", b);
1059
1060     hres = IWebBrowser2_put_StatusBar(wb, VARIANT_FALSE);
1061     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1062
1063     hres = IWebBrowser2_get_StatusBar(wb, &b);
1064     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1065     ok(b == VARIANT_FALSE, "b=%x\n", b);
1066
1067     hres = IWebBrowser2_put_StatusBar(wb, 100);
1068     ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1069
1070     hres = IWebBrowser2_get_StatusBar(wb, &b);
1071     ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1072     ok(b == VARIANT_TRUE, "b=%x\n", b);
1073
1074     /* ToolBar */
1075
1076     hres = IWebBrowser2_get_ToolBar(wb, &i);
1077     ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1078     ok(i, "i=%x\n", i);
1079
1080     hres = IWebBrowser2_put_ToolBar(wb, VARIANT_FALSE);
1081     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1082
1083     hres = IWebBrowser2_get_ToolBar(wb, &i);
1084     ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1085     ok(i == VARIANT_FALSE, "b=%x\n", i);
1086
1087     hres = IWebBrowser2_put_ToolBar(wb, 100);
1088     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1089
1090     hres = IWebBrowser2_get_ToolBar(wb, &i);
1091     ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1092     ok(i, "i=%x\n", i);
1093
1094     hres = IWebBrowser2_put_ToolBar(wb, VARIANT_TRUE);
1095     ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1096
1097     /* FullScreen */
1098
1099     hres = IWebBrowser2_get_FullScreen(wb, &b);
1100     ok(hres == S_OK, "get_FullScreen failed: %08x\n", hres);
1101     ok(b == VARIANT_FALSE, "b=%x\n", b);
1102
1103     hres = IWebBrowser2_put_FullScreen(wb, VARIANT_TRUE);
1104     ok(hres == S_OK, "put_FullScreen failed: %08x\n", hres);
1105
1106     hres = IWebBrowser2_get_FullScreen(wb, &b);
1107     ok(hres == S_OK, "get_FullScreen failed: %08x\n", hres);
1108     ok(b == VARIANT_TRUE, "b=%x\n", b);
1109
1110     hres = IWebBrowser2_put_FullScreen(wb, 100);
1111     ok(hres == S_OK, "put_FullScreen failed: %08x\n", hres);
1112
1113     hres = IWebBrowser2_get_FullScreen(wb, &b);
1114     ok(hres == S_OK, "get_FullScreen failed: %08x\n", hres);
1115     ok(b == VARIANT_TRUE, "b=%x\n", b);
1116
1117     hres = IWebBrowser2_put_FullScreen(wb, VARIANT_FALSE);
1118     ok(hres == S_OK, "put_FullScreen failed: %08x\n", hres);
1119
1120     /* Resizable */
1121
1122     b = 0x100;
1123     hres = IWebBrowser2_get_Resizable(wb, &b);
1124     ok(hres == E_NOTIMPL, "get_Resizable failed: %08x\n", hres);
1125     ok(b == 0x100, "b=%x\n", b);
1126
1127     hres = IWebBrowser2_put_Resizable(wb, VARIANT_TRUE);
1128     ok(hres == S_OK, "put_Resizable failed: %08x\n", hres);
1129
1130     hres = IWebBrowser2_put_Resizable(wb, VARIANT_FALSE);
1131     ok(hres == S_OK, "put_Resizable failed: %08x\n", hres);
1132
1133     hres = IWebBrowser2_get_Resizable(wb, &b);
1134     ok(hres == E_NOTIMPL, "get_Resizable failed: %08x\n", hres);
1135     ok(b == 0x100, "b=%x\n", b);
1136
1137     IWebBrowser2_Release(wb);
1138 }
1139
1140 static void test_Silent(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
1141 {
1142     VARIANT_BOOL b;
1143     HRESULT hres;
1144
1145     b = 100;
1146     hres = IWebBrowser2_get_Silent(wb, &b);
1147     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1148     ok(b == VARIANT_FALSE, "b=%x\n", b);
1149
1150     hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
1151     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1152
1153     b = 100;
1154     hres = IWebBrowser2_get_Silent(wb, &b);
1155     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1156     ok(b == VARIANT_TRUE, "b=%x\n", b);
1157
1158     hres = IWebBrowser2_put_Silent(wb, 100);
1159     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1160
1161     b = 100;
1162     hres = IWebBrowser2_get_Silent(wb, &b);
1163     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1164     ok(b == VARIANT_TRUE, "b=%x\n", b);
1165
1166     hres = IWebBrowser2_put_Silent(wb, VARIANT_FALSE);
1167     ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1168
1169     b = 100;
1170     hres = IWebBrowser2_get_Silent(wb, &b);
1171     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1172     ok(b == VARIANT_FALSE, "b=%x\n", b);
1173
1174     if(is_clientsite) {
1175         hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
1176         ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1177
1178         SET_EXPECT(Invoke_AMBIENT_SILENT);
1179     }
1180
1181     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_SILENT);
1182     ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
1183
1184     if(is_clientsite)
1185         CHECK_CALLED(Invoke_AMBIENT_SILENT);
1186
1187     b = 100;
1188     hres = IWebBrowser2_get_Silent(wb, &b);
1189     ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1190     ok(b == VARIANT_FALSE, "b=%x\n", b);
1191 }
1192
1193 static void test_Offline(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
1194 {
1195     VARIANT_BOOL b;
1196     HRESULT hres;
1197
1198     b = 100;
1199     hres = IWebBrowser2_get_Offline(wb, &b);
1200     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1201     ok(b == VARIANT_FALSE, "b=%x\n", b);
1202
1203     hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
1204     ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1205
1206     b = 100;
1207     hres = IWebBrowser2_get_Offline(wb, &b);
1208     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1209     ok(b == VARIANT_TRUE, "b=%x\n", b);
1210
1211     hres = IWebBrowser2_put_Offline(wb, 100);
1212     ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1213
1214     b = 100;
1215     hres = IWebBrowser2_get_Offline(wb, &b);
1216     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1217     ok(b == VARIANT_TRUE, "b=%x\n", b);
1218
1219     hres = IWebBrowser2_put_Offline(wb, VARIANT_FALSE);
1220     ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1221
1222     b = 100;
1223     hres = IWebBrowser2_get_Offline(wb, &b);
1224     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1225     ok(b == VARIANT_FALSE, "b=%x\n", b);
1226
1227     if(is_clientsite) {
1228         hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
1229         ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1230
1231         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1232     }
1233
1234     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
1235     ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
1236
1237     if(is_clientsite)
1238         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1239
1240     b = 100;
1241     hres = IWebBrowser2_get_Offline(wb, &b);
1242     ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1243     ok(b == VARIANT_FALSE, "b=%x\n", b);
1244 }
1245
1246 static void test_wb_funcs(IUnknown *unk, BOOL is_clientsite)
1247 {
1248     IWebBrowser2 *wb;
1249     IOleControl *control;
1250     HRESULT hres;
1251
1252     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
1253     ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
1254
1255     hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1256     ok(hres == S_OK, "Could not get IOleControl interface: %08x\n", hres);
1257
1258     test_Silent(wb, control, is_clientsite);
1259     test_Offline(wb, control, is_clientsite);
1260
1261     IWebBrowser_Release(wb);
1262     IOleControl_Release(control);
1263 }
1264
1265 static void test_GetControlInfo(IUnknown *unk)
1266 {
1267     IOleControl *control;
1268     CONTROLINFO info;
1269     HRESULT hres;
1270
1271     hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1272     ok(hres == S_OK, "Could not get IOleControl: %08x\n", hres);
1273     if(FAILED(hres))
1274         return;
1275
1276     hres = IOleControl_GetControlInfo(control, &info);
1277     ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, exxpected E_NOTIMPL\n", hres);
1278     hres = IOleControl_GetControlInfo(control, NULL);
1279     ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, exxpected E_NOTIMPL\n", hres);
1280
1281     IOleControl_Release(control);
1282 }
1283
1284 static void test_Extent(IUnknown *unk)
1285 {
1286     IOleObject *oleobj;
1287     SIZE size;
1288     HRESULT hres;
1289
1290     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1291     ok(hres == S_OK, "Could not get IOleObkect: %08x\n", hres);
1292     if(FAILED(hres))
1293         return;
1294
1295     size.cx = size.cy = 0xdeadbeef;
1296     hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
1297     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1298     ok(size.cx == 1323 && size.cy == 529, "size = {%d %d}\n", size.cx, size.cy);
1299
1300     size.cx = 800;
1301     size.cy = 700;
1302     hres = IOleObject_SetExtent(oleobj, DVASPECT_CONTENT, &size);
1303     ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
1304
1305     size.cx = size.cy = 0xdeadbeef;
1306     hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
1307     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1308     ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy);
1309
1310     size.cx = size.cy = 0xdeadbeef;
1311     hres = IOleObject_GetExtent(oleobj, 0, &size);
1312     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1313     ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy);
1314
1315     size.cx = 900;
1316     size.cy = 800;
1317     hres = IOleObject_SetExtent(oleobj, 0, &size);
1318     ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
1319
1320     size.cx = size.cy = 0xdeadbeef;
1321     hres = IOleObject_GetExtent(oleobj, 0, &size);
1322     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1323     ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy);
1324
1325     size.cx = size.cy = 0xdeadbeef;
1326     hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
1327     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1328     ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy);
1329
1330     size.cx = 1000;
1331     size.cy = 900;
1332     hres = IOleObject_SetExtent(oleobj, 0xdeadbeef, &size);
1333     ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
1334
1335     size.cx = size.cy = 0xdeadbeef;
1336     hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
1337     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1338     ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy);
1339
1340     size.cx = size.cy = 0xdeadbeef;
1341     hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
1342     ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1343     ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy);
1344
1345     IOleObject_Release(oleobj);
1346 }
1347
1348 static void test_Navigate2(IUnknown *unk)
1349 {
1350     IWebBrowser2 *webbrowser;
1351     VARIANT url;
1352     HRESULT hres;
1353
1354     static const WCHAR wszAboutBlank[] =
1355         {'a','b','o','u','t',':','b','l','a','n','k',0};
1356
1357     hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&webbrowser);
1358     ok(hres == S_OK, "QueryInterface(IID_IWebBrowser) failed: %08x\n", hres);
1359     if(FAILED(hres))
1360         return;
1361
1362     V_VT(&url) = VT_BSTR;
1363     V_BSTR(&url) = SysAllocString(wszAboutBlank);
1364
1365     SET_EXPECT(Invoke_AMBIENT_USERMODE);
1366     SET_EXPECT(EnableModeless_FALSE);
1367     SET_EXPECT(GetHostInfo);
1368     SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
1369     SET_EXPECT(Invoke_AMBIENT_USERAGENT);
1370     SET_EXPECT(Invoke_AMBIENT_PALETTE);
1371     SET_EXPECT(GetOptionKeyPath);
1372     SET_EXPECT(GetOverridesKeyPath);
1373     SET_EXPECT(SetStatusText);
1374     SET_EXPECT(EnableModeless_TRUE);
1375
1376     hres = IWebBrowser2_Navigate2(webbrowser, &url, NULL, NULL, NULL, NULL);
1377     ok(hres == S_OK, "Navigate2 failed: %08x\n", hres);
1378
1379     CHECK_CALLED(Invoke_AMBIENT_USERMODE);
1380     CHECK_CALLED(EnableModeless_FALSE);
1381     CHECK_CALLED(GetHostInfo);
1382     CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
1383     CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
1384     CHECK_CALLED(Invoke_AMBIENT_PALETTE);
1385     CHECK_CALLED(GetOptionKeyPath);
1386     CHECK_CALLED(GetOverridesKeyPath);
1387     CHECK_CALLED(SetStatusText);
1388     CHECK_CALLED(EnableModeless_TRUE);
1389
1390     IWebBrowser2_Release(webbrowser);
1391 }
1392
1393 static void test_QueryInterface(IUnknown *unk)
1394 {
1395     IQuickActivate *qa = (IQuickActivate*)0xdeadbeef;
1396     IRunnableObject *runnable = (IRunnableObject*)0xdeadbeef;
1397     HRESULT hres;
1398
1399     hres = IUnknown_QueryInterface(unk, &IID_IQuickActivate, (void**)&qa);
1400     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
1401     ok(qa == NULL, "qa=%p, ezpected NULL\n", qa);
1402
1403     hres = IUnknown_QueryInterface(unk, &IID_IRunnableObject, (void**)&runnable);
1404     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
1405     ok(runnable == NULL, "runnable=%p, ezpected NULL\n", runnable);
1406 }
1407
1408 static void test_WebBrowser(void)
1409 {
1410     IUnknown *unk = NULL;
1411     ULONG ref;
1412     HRESULT hres;
1413
1414     hres = CoCreateInstance(&CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1415             &IID_IUnknown, (void**)&unk);
1416     ok(hres == S_OK, "CoCreateInterface failed: %08x\n", hres);
1417     if(FAILED(hres))
1418         return;
1419
1420     test_QueryInterface(unk);
1421     test_ClassInfo(unk);
1422     test_ClientSite(unk, &ClientSite);
1423     test_Extent(unk);
1424     test_wb_funcs(unk, TRUE);
1425     test_DoVerb(unk);
1426     test_Navigate2(unk);
1427     test_ClientSite(unk, NULL);
1428     test_ie_funcs(unk);
1429     test_GetControlInfo(unk);
1430     test_wb_funcs(unk, FALSE);
1431
1432     ref = IUnknown_Release(unk);
1433     ok(ref == 0, "ref=%d, expected 0\n", ref);
1434 }
1435
1436 static void gecko_installer_workaround(BOOL disable)
1437 {
1438     HKEY hkey;
1439     DWORD res;
1440
1441     static BOOL has_url = FALSE;
1442     static char url[2048];
1443
1444     if(!disable && !has_url)
1445         return;
1446
1447     res = RegOpenKey(HKEY_CURRENT_USER, "Software\\Wine\\MSHTML", &hkey);
1448     if(res != ERROR_SUCCESS)
1449         return;
1450
1451     if(disable) {
1452         DWORD type, size = sizeof(url);
1453
1454         res = RegQueryValueEx(hkey, "GeckoUrl", NULL, &type, (PVOID)url, &size);
1455         if(res == ERROR_SUCCESS && type == REG_SZ)
1456             has_url = TRUE;
1457
1458         RegDeleteValue(hkey, "GeckoUrl");
1459     }else {
1460         RegSetValueEx(hkey, "GeckoUrl", 0, REG_SZ, (PVOID)url, lstrlenA(url)+1);
1461     }
1462
1463     RegCloseKey(hkey);
1464 }
1465
1466 START_TEST(webbrowser)
1467 {
1468     gecko_installer_workaround(TRUE);
1469
1470     container_hwnd = create_container_window();
1471
1472     OleInitialize(NULL);
1473
1474     test_WebBrowser();
1475
1476     OleUninitialize();
1477
1478     gecko_installer_workaround(FALSE);
1479 }