push 014043c4937c940c54cd1214c96e33a3b3c8cf7d
[wine/hacks.git] / dlls / shdocvw / tests / webbrowser.c
blob0f337edadc8193b2378e1f3d59148f95d3eb67bd
1 /*
2 * Copyright 2006 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #define COBJMACROS
20 #define CONST_VTABLE
22 #include <wine/test.h>
23 #include <stdarg.h>
24 #include <stdio.h>
26 #include "windef.h"
27 #include "winbase.h"
28 #include "ole2.h"
29 #include "exdisp.h"
30 #include "htiframe.h"
31 #include "mshtmhst.h"
32 #include "idispids.h"
33 #include "olectl.h"
34 #include "mshtmdid.h"
35 #include "shlguid.h"
36 #include "exdispid.h"
38 #define DEFINE_EXPECT(func) \
39 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
41 #define SET_EXPECT(func) \
42 expect_ ## func = TRUE
44 #define CHECK_EXPECT2(func) \
45 do { \
46 ok(expect_ ##func, "unexpected call " #func "\n"); \
47 called_ ## func = TRUE; \
48 }while(0)
50 #define CHECK_EXPECT(func) \
51 do { \
52 CHECK_EXPECT2(func); \
53 expect_ ## func = FALSE; \
54 }while(0)
56 #define CHECK_CALLED(func) \
57 do { \
58 ok(called_ ## func, "expected " #func "\n"); \
59 expect_ ## func = called_ ## func = FALSE; \
60 }while(0)
62 DEFINE_EXPECT(GetContainer);
63 DEFINE_EXPECT(Site_GetWindow);
64 DEFINE_EXPECT(ShowObject);
65 DEFINE_EXPECT(CanInPlaceActivate);
66 DEFINE_EXPECT(OnInPlaceActivate);
67 DEFINE_EXPECT(OnUIActivate);
68 DEFINE_EXPECT(GetWindowContext);
69 DEFINE_EXPECT(Frame_GetWindow);
70 DEFINE_EXPECT(Frame_SetActiveObject);
71 DEFINE_EXPECT(UIWindow_SetActiveObject);
72 DEFINE_EXPECT(SetMenu);
73 DEFINE_EXPECT(Invoke_AMBIENT_USERMODE);
74 DEFINE_EXPECT(Invoke_AMBIENT_DLCONTROL);
75 DEFINE_EXPECT(Invoke_AMBIENT_USERAGENT);
76 DEFINE_EXPECT(Invoke_AMBIENT_PALETTE);
77 DEFINE_EXPECT(Invoke_AMBIENT_SILENT);
78 DEFINE_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
79 DEFINE_EXPECT(Invoke_STATUSTEXTCHANGE);
80 DEFINE_EXPECT(Invoke_PROPERTYCHANGE);
81 DEFINE_EXPECT(Invoke_DOWNLOADBEGIN);
82 DEFINE_EXPECT(Invoke_BEFORENAVIGATE2);
83 DEFINE_EXPECT(Invoke_SETSECURELOCKICON);
84 DEFINE_EXPECT(Invoke_FILEDOWNLOAD);
85 DEFINE_EXPECT(Invoke_COMMANDSTATECHANGE);
86 DEFINE_EXPECT(Invoke_DOWNLOADCOMPLETE);
87 DEFINE_EXPECT(Invoke_ONMENUBAR);
88 DEFINE_EXPECT(Invoke_ONADDRESSBAR);
89 DEFINE_EXPECT(Invoke_ONSTATUSBAR);
90 DEFINE_EXPECT(Invoke_ONTOOLBAR);
91 DEFINE_EXPECT(Invoke_ONFULLSCREEN);
92 DEFINE_EXPECT(Invoke_ONTHEATERMODE);
93 DEFINE_EXPECT(Invoke_WINDOWSETRESIZABLE);
94 DEFINE_EXPECT(EnableModeless_TRUE);
95 DEFINE_EXPECT(EnableModeless_FALSE);
96 DEFINE_EXPECT(GetHostInfo);
97 DEFINE_EXPECT(GetOptionKeyPath);
98 DEFINE_EXPECT(GetOverridesKeyPath);
99 DEFINE_EXPECT(SetStatusText);
100 DEFINE_EXPECT(UpdateUI);
101 DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_0);
102 DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_1);
103 DEFINE_EXPECT(Exec_SETPROGRESSMAX);
104 DEFINE_EXPECT(Exec_SETPROGRESSPOS);
105 DEFINE_EXPECT(QueryStatus_SETPROGRESSTEXT);
107 static const WCHAR wszItem[] = {'i','t','e','m',0};
108 static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
109 static const WCHAR emptyW[] = {0};
111 static VARIANT_BOOL exvb;
112 static IWebBrowser2 *wb;
114 static HWND container_hwnd, shell_embedding_hwnd;
116 static const char *debugstr_w(LPCWSTR str)
118 static char buf[1024];
119 if(!str)
120 return "(null)";
121 WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL);
122 return buf;
125 static const char *debugstr_guid(REFIID riid)
127 static char buf[50];
129 sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
130 riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
131 riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
132 riid->Data4[5], riid->Data4[6], riid->Data4[7]);
134 return buf;
137 #define test_LocationURL(a,b) _test_LocationURL(__LINE__,a,b)
138 static void _test_LocationURL(unsigned line, IUnknown *unk, LPCWSTR exurl)
140 IWebBrowser2 *wb;
141 BSTR url = (void*)0xdeadbeef;
142 HRESULT hres;
144 hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
145 ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
146 if(FAILED(hres))
147 return;
149 hres = IWebBrowser2_get_LocationURL(wb, &url);
150 ok_(__FILE__,line) (hres == (*exurl ? S_OK : S_FALSE), "get_LocationURL failed: %08x\n", hres);
151 ok_(__FILE__,line) (!lstrcmpW(url, exurl), "unexpected URL: %s\n", debugstr_w(url));
153 SysFreeString(url);
154 IWebBrowser2_Release(wb);
157 static HRESULT QueryInterface(REFIID,void**);
159 static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface,
160 REFIID riid, void **ppv)
162 ok(0, "unexpected call\n");
163 return E_NOINTERFACE;
166 static ULONG WINAPI OleCommandTarget_AddRef(IOleCommandTarget *iface)
168 return 2;
171 static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface)
173 return 1;
176 static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
177 ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
179 ok(!pguidCmdGroup, "pguidCmdGroup != MULL\n");
180 ok(cCmds == 1, "cCmds=%d, expected 1\n", cCmds);
181 ok(!pCmdText, "pCmdText != NULL\n");
183 switch(prgCmds[0].cmdID) {
184 case OLECMDID_SETPROGRESSTEXT:
185 CHECK_EXPECT(QueryStatus_SETPROGRESSTEXT);
186 prgCmds[0].cmdf = OLECMDF_ENABLED;
187 return S_OK;
188 default:
189 ok(0, "unexpected command %d\n", prgCmds[0].cmdID);
192 return E_FAIL;
195 static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
196 DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
198 if(!pguidCmdGroup) {
199 switch(nCmdID) {
200 case OLECMDID_SETPROGRESSMAX:
201 CHECK_EXPECT(Exec_SETPROGRESSMAX);
202 ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
203 ok(pvaIn != NULL, "pvaIn == NULL\n");
204 if(pvaIn)
205 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
206 ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
207 return S_OK;
208 case OLECMDID_SETPROGRESSPOS:
209 CHECK_EXPECT(Exec_SETPROGRESSPOS);
210 ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
211 ok(pvaIn != NULL, "pvaIn == NULL\n");
212 if(pvaIn)
213 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
214 ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
215 return S_OK;
216 case OLECMDID_SETDOWNLOADSTATE:
217 ok(!nCmdexecopt, "nCmdexecopts=%08x\n", nCmdexecopt);
218 ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut);
219 ok(pvaIn != NULL, "pvaIn == NULL\n");
220 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d\n", V_VT(pvaIn));
221 switch(V_I4(pvaIn)) {
222 case 0:
223 CHECK_EXPECT(Exec_SETDOWNLOADSTATE_0);
224 break;
225 case 1:
226 CHECK_EXPECT2(Exec_SETDOWNLOADSTATE_1);
227 break;
228 default:
229 ok(0, "unexpevted V_I4(pvaIn)=%d\n", V_I4(pvaIn));
231 return S_OK;
232 default:
233 ok(0, "unexpected nsCmdID %d\n", nCmdID);
235 }else if(IsEqualGUID(&CGID_Explorer, pguidCmdGroup)) {
236 switch(nCmdID) {
237 case 24:
238 return E_FAIL; /* TODO */
239 case 66:
240 return E_FAIL; /* TODO */
241 default:
242 ok(0, "unexpected nCmdID %d\n", nCmdID);
244 }else {
245 ok(0, "unepected pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
248 return E_FAIL;
251 static IOleCommandTargetVtbl OleCommandTargetVtbl = {
252 OleCommandTarget_QueryInterface,
253 OleCommandTarget_AddRef,
254 OleCommandTarget_Release,
255 OleCommandTarget_QueryStatus,
256 OleCommandTarget_Exec
259 static IOleCommandTarget OleCommandTarget = { &OleCommandTargetVtbl };
261 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
263 if(IsEqualGUID(&IID_ITargetContainer, riid))
264 return E_NOINTERFACE; /* TODO */
266 if(IsEqualGUID(&IID_IOleCommandTarget, riid)) {
267 *ppv = &OleCommandTarget;
268 return S_OK;
271 ok(0, "unexpected call\n");
272 return E_NOINTERFACE;
275 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
277 return 2;
280 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
282 return 1;
285 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
286 LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut)
288 ok(0, "unexpected call\n");
289 return E_NOTIMPL;
292 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
293 IEnumUnknown **ppenum)
295 ok(0, "unexpected call\n");
296 return E_NOTIMPL;
299 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
301 ok(0, "unexpected call\n");
302 return E_NOTIMPL;
305 static const IOleContainerVtbl OleContainerVtbl = {
306 OleContainer_QueryInterface,
307 OleContainer_AddRef,
308 OleContainer_Release,
309 OleContainer_ParseDisplayName,
310 OleContainer_EnumObjects,
311 OleContainer_LockContainer
314 static IOleContainer OleContainer = { &OleContainerVtbl };
316 static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
318 return QueryInterface(riid, ppv);
321 static ULONG WINAPI Dispatch_AddRef(IDispatch *iface)
323 return 2;
326 static ULONG WINAPI Dispatch_Release(IDispatch *iface)
328 return 1;
331 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
333 ok(0, "unexpected call\n");
334 return E_NOTIMPL;
337 static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
338 ITypeInfo **ppTInfo)
340 ok(0, "unexpected call\n");
341 return E_NOTIMPL;
344 static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
345 UINT cNames, LCID lcid, DISPID *rgDispId)
347 ok(0, "unexpected call\n");
348 return E_NOTIMPL;
351 static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
352 LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
353 EXCEPINFO *pExcepInfo, UINT *puArgErr)
355 ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
356 ok(pDispParams != NULL, "pDispParams == NULL\n");
357 ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
358 ok(V_VT(pVarResult) == VT_EMPTY, "V_VT(pVarResult)=%d\n", V_VT(pVarResult));
359 ok(wFlags == DISPATCH_PROPERTYGET, "wFlags=%08x, expected DISPATCH_PROPERTYGET\n", wFlags);
360 ok(pDispParams->rgvarg == NULL, "pDispParams->rgvarg = %p\n", pDispParams->rgvarg);
361 ok(pDispParams->rgdispidNamedArgs == NULL,
362 "pDispParams->rgdispidNamedArgs = %p\n", pDispParams->rgdispidNamedArgs);
363 ok(pDispParams->cArgs == 0, "pDispParams->cArgs = %d\n", pDispParams->cArgs);
364 ok(pDispParams->cNamedArgs == 0, "pDispParams->cNamedArgs = %d\n", pDispParams->cNamedArgs);
366 switch(dispIdMember) {
367 case DISPID_AMBIENT_USERMODE:
368 CHECK_EXPECT2(Invoke_AMBIENT_USERMODE);
369 return E_FAIL;
370 case DISPID_AMBIENT_DLCONTROL:
371 CHECK_EXPECT(Invoke_AMBIENT_DLCONTROL);
372 ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
373 return E_FAIL;
374 case DISPID_AMBIENT_USERAGENT:
375 CHECK_EXPECT(Invoke_AMBIENT_USERAGENT);
376 ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
377 return E_FAIL;
378 case DISPID_AMBIENT_PALETTE:
379 CHECK_EXPECT(Invoke_AMBIENT_PALETTE);
380 ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr);
381 return E_FAIL;
382 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
383 CHECK_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
384 ok(puArgErr == NULL, "puArgErr=%p\n", puArgErr);
385 V_VT(pVarResult) = VT_BOOL;
386 V_BOOL(pVarResult) = VARIANT_FALSE;
387 return S_OK;
388 case DISPID_AMBIENT_SILENT:
389 CHECK_EXPECT(Invoke_AMBIENT_SILENT);
390 ok(puArgErr == NULL, "puArgErr=%p\n", puArgErr);
391 V_VT(pVarResult) = VT_BOOL;
392 V_BOOL(pVarResult) = VARIANT_FALSE;
393 return S_OK;
396 ok(0, "unexpected dispIdMember %d\n", dispIdMember);
397 return E_NOTIMPL;
400 static IDispatchVtbl DispatchVtbl = {
401 Dispatch_QueryInterface,
402 Dispatch_AddRef,
403 Dispatch_Release,
404 Dispatch_GetTypeInfoCount,
405 Dispatch_GetTypeInfo,
406 Dispatch_GetIDsOfNames,
407 Dispatch_Invoke
410 static IDispatch Dispatch = { &DispatchVtbl };
412 static HRESULT WINAPI WebBrowserEvents2_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
414 *ppv = NULL;
416 if(IsEqualGUID(&DIID_DWebBrowserEvents2, riid)) {
417 *ppv = iface;
418 return S_OK;
421 ok(0, "unexpected riid %s\n", debugstr_guid(riid));
422 return E_NOINTERFACE;
425 #define test_invoke_bool(p) _test_invoke_bool(__LINE__,p)
426 static void _test_invoke_bool(unsigned line, const DISPPARAMS *params)
428 ok_(__FILE__,line) (params->rgvarg != NULL, "rgvarg == NULL\n");
429 ok_(__FILE__,line) (params->cArgs == 1, "cArgs=%d, expected 1\n", params->cArgs);
430 ok_(__FILE__,line) (V_VT(params->rgvarg) == VT_BOOL, "V_VT(arg)=%d\n", V_VT(params->rgvarg));
431 ok_(__FILE__,line) (V_BOOL(params->rgvarg) == exvb, "V_VT(arg)=%x, expected %x\n",
432 V_BOOL(params->rgvarg), exvb);
435 static void test_OnBeforeNavigate(const VARIANT *disp, const VARIANT *url, const VARIANT *flags,
436 const VARIANT *frame, const VARIANT *post_data, const VARIANT *headers, const VARIANT *cancel)
438 ok(V_VT(disp) == VT_DISPATCH, "V_VT(disp)=%d, expected VT_DISPATCH\n", V_VT(disp));
439 ok(V_DISPATCH(disp) != NULL, "V_DISPATCH(disp) == NULL\n");
440 ok(V_DISPATCH(disp) == (IDispatch*)wb, "V_DISPATCH(disp)=%p, wb=%p\n", V_DISPATCH(disp), wb);
442 ok(V_VT(url) == (VT_BYREF|VT_VARIANT), "V_VT(url)=%x, expected VT_BYREF|VT_VARIANT\n", V_VT(url));
443 ok(V_VARIANTREF(url) != NULL, "V_VARIANTREF(url) == NULL)\n");
444 if(V_VARIANTREF(url)) {
445 ok(V_VT(V_VARIANTREF(url)) == VT_BSTR, "V_VT(V_VARIANTREF(url))=%d, expected VT_BSTR\n",
446 V_VT(V_VARIANTREF(url)));
447 ok(V_BSTR(V_VARIANTREF(url)) != NULL, "V_BSTR(V_VARIANTREF(url)) == NULL\n");
448 ok(!lstrcmpW(V_BSTR(V_VARIANTREF(url)), about_blankW), "unexpected url %s\n",
449 debugstr_w(V_BSTR(V_VARIANTREF(url))));
452 ok(V_VT(flags) == (VT_BYREF|VT_VARIANT), "V_VT(flags)=%x, expected VT_BYREF|VT_VARIANT\n",
453 V_VT(flags));
454 ok(V_VT(flags) == (VT_BYREF|VT_VARIANT), "V_VT(flags)=%x, expected VT_BYREF|VT_VARIANT\n",
455 V_VT(flags));
456 ok(V_VARIANTREF(flags) != NULL, "V_VARIANTREF(flags) == NULL)\n");
457 if(V_VARIANTREF(flags)) {
458 ok(V_VT(V_VARIANTREF(flags)) == VT_I4, "V_VT(V_VARIANTREF(flags))=%d, expected VT_I4\n",
459 V_VT(V_VARIANTREF(flags)));
460 ok(V_I4(V_VARIANTREF(flags)) == 0, "V_I4(V_VARIANTREF(flags)) = %d, expected 0\n",
461 V_I4(V_VARIANTREF(flags)));
464 ok(V_VT(frame) == (VT_BYREF|VT_VARIANT), "V_VT(frame)=%x, expected VT_BYREF|VT_VARIANT\n",
465 V_VT(frame));
466 ok(V_VT(frame) == (VT_BYREF|VT_VARIANT), "V_VT(frame)=%x, expected VT_BYREF|VT_VARIANT\n",
467 V_VT(frame));
468 ok(V_VARIANTREF(frame) != NULL, "V_VARIANTREF(frame) == NULL)\n");
469 if(V_VARIANTREF(frame)) {
470 ok(V_VT(V_VARIANTREF(frame)) == VT_BSTR, "V_VT(V_VARIANTREF(frame))=%d, expected VT_BSTR\n",
471 V_VT(V_VARIANTREF(frame)));
472 ok(V_BSTR(V_VARIANTREF(frame)) == NULL, "V_BSTR(V_VARIANTREF(frame)) = %p, expected NULL\n",
473 V_BSTR(V_VARIANTREF(frame)));
476 ok(V_VT(post_data) == (VT_BYREF|VT_VARIANT), "V_VT(post_data)=%x, expected VT_BYREF|VT_VARIANT\n",
477 V_VT(post_data));
478 ok(V_VT(post_data) == (VT_BYREF|VT_VARIANT), "V_VT(post_data)=%x, expected VT_BYREF|VT_VARIANT\n",
479 V_VT(post_data));
480 ok(V_VARIANTREF(post_data) != NULL, "V_VARIANTREF(post_data) == NULL)\n");
481 if(V_VARIANTREF(post_data)) {
482 ok(V_VT(V_VARIANTREF(post_data)) == (VT_VARIANT|VT_BYREF),
483 "V_VT(V_VARIANTREF(post_data))=%d, expected VT_VARIANT|VT_BYREF\n",
484 V_VT(V_VARIANTREF(post_data)));
485 ok(V_VARIANTREF(V_VARIANTREF(post_data)) != NULL,
486 "V_VARIANTREF(V_VARIANTREF(post_data)) == NULL\n");
487 if(V_VARIANTREF(V_VARIANTREF(post_data))) {
488 ok(V_VT(V_VARIANTREF(V_VARIANTREF(post_data))) == VT_EMPTY,
489 "V_VT(V_VARIANTREF(V_VARIANTREF(post_data))) = %d, expected VT_EMPTY\n",
490 V_VT(V_VARIANTREF(V_VARIANTREF(post_data))));
492 if(V_VT(V_VARIANTREF(V_VARIANTREF(post_data))) == (VT_UI1|VT_ARRAY)) {
493 const SAFEARRAY *sa = V_ARRAY(V_VARIANTREF(V_VARIANTREF(post_data)));
495 ok(sa->cDims == 1, "sa->cDims = %d, expected 1\n", sa->cDims);
496 ok(sa->fFeatures == 0, "sa->fFeatures = %d, expected 0\n", sa->fFeatures);
501 ok(V_VT(headers) == (VT_BYREF|VT_VARIANT), "V_VT(headers)=%x, expected VT_BYREF|VT_VARIANT\n",
502 V_VT(headers));
503 ok(V_VARIANTREF(headers) != NULL, "V_VARIANTREF(headers) == NULL)\n");
504 if(V_VARIANTREF(headers)) {
505 ok(V_VT(V_VARIANTREF(headers)) == VT_BSTR, "V_VT(V_VARIANTREF(headers))=%d, expected VT_BSTR\n",
506 V_VT(V_VARIANTREF(headers)));
507 ok(V_BSTR(V_VARIANTREF(headers)) == NULL, "V_BSTR(V_VARIANTREF(heders)) = %p, expected NULL\n",
508 V_BSTR(V_VARIANTREF(headers)));
511 ok(V_VT(cancel) == (VT_BYREF|VT_BOOL), "V_VT(cancel)=%x, expected VT_BYREF|VT_BOOL\n",
512 V_VT(cancel));
513 ok(V_BOOLREF(cancel) != NULL, "V_BOOLREF(pDispParams->rgvarg[0] == NULL)\n");
514 if(V_BOOLREF(cancel))
515 ok(*V_BOOLREF(cancel) == VARIANT_FALSE, "*V_BOOLREF(calcel) = %x, expected VARIANT_FALSE\n",
516 *V_BOOLREF(cancel));
519 static HRESULT WINAPI WebBrowserEvents2_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
520 LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
521 EXCEPINFO *pExcepInfo, UINT *puArgErr)
523 ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
524 ok(pDispParams != NULL, "pDispParams == NULL\n");
525 ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
526 ok(pVarResult == NULL, "pVarResult=%p\n", pVarResult);
527 ok(wFlags == DISPATCH_METHOD, "wFlags=%08x, expected DISPATCH_METHOD\n", wFlags);
528 ok(pDispParams->rgdispidNamedArgs == NULL,
529 "pDispParams->rgdispidNamedArgs = %p\n", pDispParams->rgdispidNamedArgs);
530 ok(pDispParams->cNamedArgs == 0, "pDispParams->cNamedArgs = %d\n", pDispParams->cNamedArgs);
532 switch(dispIdMember) {
533 case DISPID_STATUSTEXTCHANGE:
534 CHECK_EXPECT2(Invoke_STATUSTEXTCHANGE);
536 ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
537 ok(pDispParams->cArgs == 1, "cArgs=%d, expected 1\n", pDispParams->cArgs);
538 ok(V_VT(pDispParams->rgvarg) == VT_BSTR, "V_VT(pDispParams->rgvarg)=%d, expected VT_BSTR\n",
539 V_VT(pDispParams->rgvarg));
540 /* TODO: Check text */
541 break;
543 case DISPID_PROPERTYCHANGE:
544 CHECK_EXPECT2(Invoke_PROPERTYCHANGE);
546 ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
547 ok(pDispParams->cArgs == 1, "cArgs=%d, expected 1\n", pDispParams->cArgs);
548 /* TODO: Check args */
549 break;
551 case DISPID_DOWNLOADBEGIN:
552 CHECK_EXPECT(Invoke_DOWNLOADBEGIN);
554 ok(pDispParams->rgvarg == NULL, "rgvarg=%p, expected NULL\n", pDispParams->rgvarg);
555 ok(pDispParams->cArgs == 0, "cArgs=%d, expected 0\n", pDispParams->cArgs);
556 break;
558 case DISPID_BEFORENAVIGATE2:
559 CHECK_EXPECT(Invoke_BEFORENAVIGATE2);
561 ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
562 ok(pDispParams->cArgs == 7, "cArgs=%d, expected 7\n", pDispParams->cArgs);
563 test_OnBeforeNavigate(pDispParams->rgvarg+6, pDispParams->rgvarg+5, pDispParams->rgvarg+4,
564 pDispParams->rgvarg+3, pDispParams->rgvarg+2, pDispParams->rgvarg+1,
565 pDispParams->rgvarg);
566 break;
568 case DISPID_SETSECURELOCKICON:
569 CHECK_EXPECT(Invoke_SETSECURELOCKICON);
571 ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
572 ok(pDispParams->cArgs == 1, "cArgs=%d, expected 1\n", pDispParams->cArgs);
573 /* TODO: Check args */
574 break;
576 case DISPID_FILEDOWNLOAD:
577 CHECK_EXPECT(Invoke_FILEDOWNLOAD);
579 ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
580 ok(pDispParams->cArgs == 2, "cArgs=%d, expected 2\n", pDispParams->cArgs);
581 /* TODO: Check args */
582 break;
584 case DISPID_COMMANDSTATECHANGE:
585 CHECK_EXPECT2(Invoke_COMMANDSTATECHANGE);
587 ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n");
588 ok(pDispParams->cArgs == 2, "cArgs=%d, expected 2\n", pDispParams->cArgs);
589 /* TODO: Check args */
590 break;
592 case DISPID_DOWNLOADCOMPLETE:
593 CHECK_EXPECT(Invoke_DOWNLOADCOMPLETE);
595 ok(pDispParams->rgvarg == NULL, "rgvarg=%p, expected NULL\n", pDispParams->rgvarg);
596 ok(pDispParams->cArgs == 0, "cArgs=%d, expected 0\n", pDispParams->cArgs);
597 break;
599 case DISPID_ONMENUBAR:
600 CHECK_EXPECT(Invoke_ONMENUBAR);
601 test_invoke_bool(pDispParams);
602 break;
604 case DISPID_ONADDRESSBAR:
605 CHECK_EXPECT(Invoke_ONADDRESSBAR);
606 test_invoke_bool(pDispParams);
607 break;
609 case DISPID_ONSTATUSBAR:
610 CHECK_EXPECT(Invoke_ONSTATUSBAR);
611 test_invoke_bool(pDispParams);
612 break;
614 case DISPID_ONTOOLBAR:
615 CHECK_EXPECT(Invoke_ONTOOLBAR);
616 test_invoke_bool(pDispParams);
617 break;
619 case DISPID_ONFULLSCREEN:
620 CHECK_EXPECT(Invoke_ONFULLSCREEN);
621 test_invoke_bool(pDispParams);
622 break;
624 case DISPID_ONTHEATERMODE:
625 CHECK_EXPECT(Invoke_ONTHEATERMODE);
626 test_invoke_bool(pDispParams);
627 break;
629 case DISPID_WINDOWSETRESIZABLE:
630 CHECK_EXPECT(Invoke_WINDOWSETRESIZABLE);
631 test_invoke_bool(pDispParams);
632 break;
634 default:
635 ok(0, "unexpected dispIdMember %d\n", dispIdMember);
638 return S_OK;
641 static IDispatchVtbl WebBrowserEvents2Vtbl = {
642 WebBrowserEvents2_QueryInterface,
643 Dispatch_AddRef,
644 Dispatch_Release,
645 Dispatch_GetTypeInfoCount,
646 Dispatch_GetTypeInfo,
647 Dispatch_GetIDsOfNames,
648 WebBrowserEvents2_Invoke
651 static IDispatch WebBrowserEvents2 = { &WebBrowserEvents2Vtbl };
653 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
655 return QueryInterface(riid, ppv);
658 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
660 return 2;
663 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
665 return 1;
668 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
670 ok(0, "unexpected call\n");
671 return E_NOTIMPL;
674 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAsign, DWORD dwWhichMoniker,
675 IMoniker **ppmon)
677 ok(0, "unexpected call\n");
678 return E_NOTIMPL;
681 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
683 CHECK_EXPECT(GetContainer);
685 ok(ppContainer != NULL, "ppContainer == NULL\n");
686 if(ppContainer)
687 *ppContainer = &OleContainer;
689 return S_OK;
692 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
694 CHECK_EXPECT(ShowObject);
695 return S_OK;
698 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
700 ok(0, "unexpected call\n");
701 return E_NOTIMPL;
704 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
706 ok(0, "unexpected call\n");
707 return E_NOTIMPL;
710 static const IOleClientSiteVtbl ClientSiteVtbl = {
711 ClientSite_QueryInterface,
712 ClientSite_AddRef,
713 ClientSite_Release,
714 ClientSite_SaveObject,
715 ClientSite_GetMoniker,
716 ClientSite_GetContainer,
717 ClientSite_ShowObject,
718 ClientSite_OnShowWindow,
719 ClientSite_RequestNewObjectLayout
722 static IOleClientSite ClientSite = { &ClientSiteVtbl };
724 static HRESULT WINAPI InPlaceUIWindow_QueryInterface(IOleInPlaceFrame *iface,
725 REFIID riid, void **ppv)
727 ok(0, "unexpected call\n");
728 return E_NOINTERFACE;
731 static ULONG WINAPI InPlaceUIWindow_AddRef(IOleInPlaceFrame *iface)
733 return 2;
736 static ULONG WINAPI InPlaceUIWindow_Release(IOleInPlaceFrame *iface)
738 return 1;
741 static HRESULT WINAPI InPlaceUIWindow_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
743 ok(0, "unexpected call\n");
744 return E_NOTIMPL;
747 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
749 CHECK_EXPECT(Frame_GetWindow);
750 ok(phwnd != NULL, "phwnd == NULL\n");
751 if(phwnd)
752 *phwnd = container_hwnd;
753 return S_OK;
756 static HRESULT WINAPI InPlaceUIWindow_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
758 ok(0, "unexpected call\n");
759 return E_NOTIMPL;
762 static HRESULT WINAPI InPlaceUIWindow_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
764 ok(0, "unexpected call\n");
765 return E_NOTIMPL;
768 static HRESULT WINAPI InPlaceUIWindow_RequestBorderSpace(IOleInPlaceFrame *iface,
769 LPCBORDERWIDTHS pborderwidths)
771 ok(0, "unexpected call\n");
772 return E_NOTIMPL;
775 static HRESULT WINAPI InPlaceUIWindow_SetBorderSpace(IOleInPlaceFrame *iface,
776 LPCBORDERWIDTHS pborderwidths)
778 ok(0, "unexpected call\n");
779 return E_NOTIMPL;
782 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
783 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
785 CHECK_EXPECT(UIWindow_SetActiveObject);
786 ok(pActiveObject != NULL, "pActiveObject = NULL\n");
787 ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
788 return S_OK;
791 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
792 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
794 CHECK_EXPECT(Frame_SetActiveObject);
795 ok(pActiveObject != NULL, "pActiveObject = NULL\n");
796 ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n");
797 return S_OK;
800 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
801 LPOLEMENUGROUPWIDTHS lpMenuWidths)
803 ok(0, "unexpected call\n");
804 return E_NOTIMPL;
807 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
808 HOLEMENU holemenu, HWND hwndActiveObject)
810 CHECK_EXPECT(SetMenu);
811 ok(hmenuShared == NULL, "hmenuShared=%p\n", hmenuShared);
812 ok(holemenu == NULL, "holemenu=%p\n", holemenu);
813 ok(hwndActiveObject == shell_embedding_hwnd, "hwndActiveObject=%p, expected %p\n",
814 hwndActiveObject, shell_embedding_hwnd);
815 return S_OK;
818 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
820 ok(0, "unexpected call\n");
821 return E_NOTIMPL;
824 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
826 CHECK_EXPECT2(SetStatusText);
827 /* FIXME: Check pszStatusText */
828 return S_OK;
831 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
833 if(fEnable)
834 CHECK_EXPECT(EnableModeless_TRUE);
835 else
836 CHECK_EXPECT(EnableModeless_FALSE);
837 return S_OK;
840 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
842 ok(0, "unexpected call\n");
843 return E_NOTIMPL;
846 static const IOleInPlaceFrameVtbl InPlaceUIWindowVtbl = {
847 InPlaceUIWindow_QueryInterface,
848 InPlaceUIWindow_AddRef,
849 InPlaceUIWindow_Release,
850 InPlaceUIWindow_GetWindow,
851 InPlaceUIWindow_ContextSensitiveHelp,
852 InPlaceUIWindow_GetBorder,
853 InPlaceUIWindow_RequestBorderSpace,
854 InPlaceUIWindow_SetBorderSpace,
855 InPlaceUIWindow_SetActiveObject,
858 static IOleInPlaceUIWindow InPlaceUIWindow = { (IOleInPlaceUIWindowVtbl*)&InPlaceUIWindowVtbl };
860 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = {
861 InPlaceUIWindow_QueryInterface,
862 InPlaceUIWindow_AddRef,
863 InPlaceUIWindow_Release,
864 InPlaceFrame_GetWindow,
865 InPlaceUIWindow_ContextSensitiveHelp,
866 InPlaceUIWindow_GetBorder,
867 InPlaceUIWindow_RequestBorderSpace,
868 InPlaceUIWindow_SetBorderSpace,
869 InPlaceFrame_SetActiveObject,
870 InPlaceFrame_InsertMenus,
871 InPlaceFrame_SetMenu,
872 InPlaceFrame_RemoveMenus,
873 InPlaceFrame_SetStatusText,
874 InPlaceFrame_EnableModeless,
875 InPlaceFrame_TranslateAccelerator
878 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
880 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
882 return QueryInterface(riid, ppv);
885 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
887 return 2;
890 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSiteEx *iface)
892 return 1;
895 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
897 CHECK_EXPECT(Site_GetWindow);
898 ok(phwnd != NULL, "phwnd == NULL\n");
899 if(phwnd)
900 *phwnd = container_hwnd;
901 return S_OK;
904 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
906 ok(0, "unexpected call\n");
907 return E_NOTIMPL;
910 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
912 CHECK_EXPECT(CanInPlaceActivate);
913 return S_OK;
916 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
918 CHECK_EXPECT(OnInPlaceActivate);
919 return S_OK;
922 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
924 CHECK_EXPECT(OnUIActivate);
925 return S_OK;
928 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
929 IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
930 LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
932 static const RECT pos_rect = {2,1,1002,901};
933 static const RECT clip_rect = {10,10,990,890};
935 CHECK_EXPECT(GetWindowContext);
937 ok(ppFrame != NULL, "ppFrame = NULL\n");
938 if(ppFrame)
939 *ppFrame = &InPlaceFrame;
941 ok(ppDoc != NULL, "ppDoc = NULL\n");
942 if(ppDoc)
943 *ppDoc = &InPlaceUIWindow;
945 ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
946 if(lprcPosRect)
947 memcpy(lprcPosRect, &pos_rect, sizeof(RECT));
949 ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
950 if(lprcClipRect)
951 memcpy(lprcClipRect, &clip_rect, sizeof(RECT));
953 ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n");
954 if(lpFrameInfo) {
955 lpFrameInfo->cb = sizeof(*lpFrameInfo);
956 lpFrameInfo->fMDIApp = FALSE;
957 lpFrameInfo->hwndFrame = container_hwnd;
958 lpFrameInfo->haccel = NULL;
959 lpFrameInfo->cAccelEntries = 0;
962 return S_OK;
965 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtant)
967 ok(0, "unexpected call\n");
968 return E_NOTIMPL;
971 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
973 ok(0, "unexpected call\n");
974 return E_NOTIMPL;
977 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
979 ok(0, "unexpected call\n");
980 return E_NOTIMPL;
983 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
985 ok(0, "unexpected call\n");
986 return E_NOTIMPL;
989 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
991 ok(0, "unexpected call\n");
992 return E_NOTIMPL;
995 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
997 ok(0, "unexpected call\n");
998 return E_NOTIMPL;
1001 static HRESULT WINAPI InPlaceSite_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface,
1002 BOOL *pNoRedraw, DWORD dwFlags)
1004 ok(0, "unexpected call\n");
1005 return E_NOTIMPL;
1008 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface,
1009 BOOL fNoRedraw)
1011 ok(0, "unexpected call\n");
1012 return E_NOTIMPL;
1015 static HRESULT WINAPI InPlaceSite_RequestUIActivate(IOleInPlaceSiteEx *iface)
1017 ok(0, "unexpected call\n");
1018 return S_OK;
1021 static const IOleInPlaceSiteExVtbl InPlaceSiteExVtbl = {
1022 InPlaceSite_QueryInterface,
1023 InPlaceSite_AddRef,
1024 InPlaceSite_Release,
1025 InPlaceSite_GetWindow,
1026 InPlaceSite_ContextSensitiveHelp,
1027 InPlaceSite_CanInPlaceActivate,
1028 InPlaceSite_OnInPlaceActivate,
1029 InPlaceSite_OnUIActivate,
1030 InPlaceSite_GetWindowContext,
1031 InPlaceSite_Scroll,
1032 InPlaceSite_OnUIDeactivate,
1033 InPlaceSite_OnInPlaceDeactivate,
1034 InPlaceSite_DiscardUndoState,
1035 InPlaceSite_DeactivateAndUndo,
1036 InPlaceSite_OnPosRectChange,
1037 InPlaceSite_OnInPlaceActivateEx,
1038 InPlaceSite_OnInPlaceDeactivateEx,
1039 InPlaceSite_RequestUIActivate
1042 static IOleInPlaceSiteEx InPlaceSite = { &InPlaceSiteExVtbl };
1044 static HRESULT WINAPI DocHostUIHandler_QueryInterface(IDocHostUIHandler2 *iface, REFIID riid, void **ppv)
1046 return QueryInterface(riid, ppv);
1049 static ULONG WINAPI DocHostUIHandler_AddRef(IDocHostUIHandler2 *iface)
1051 return 2;
1054 static ULONG WINAPI DocHostUIHandler_Release(IDocHostUIHandler2 *iface)
1056 return 1;
1059 static HRESULT WINAPI DocHostUIHandler_ShowContextMenu(IDocHostUIHandler2 *iface, DWORD dwID, POINT *ppt,
1060 IUnknown *pcmdtReserved, IDispatch *pdicpReserved)
1062 ok(0, "unexpected call %d %p %p %p\n", dwID, ppt, pcmdtReserved, pdicpReserved);
1063 return S_FALSE;
1066 static HRESULT WINAPI DocHostUIHandler_GetHostInfo(IDocHostUIHandler2 *iface, DOCHOSTUIINFO *pInfo)
1068 CHECK_EXPECT(GetHostInfo);
1069 ok(pInfo != NULL, "pInfo=NULL\n");
1070 if(pInfo) {
1071 ok(pInfo->cbSize == sizeof(DOCHOSTUIINFO), "pInfo->cbSize=%u\n", pInfo->cbSize);
1072 ok(!pInfo->dwFlags, "pInfo->dwFlags=%08x, expected 0\n", pInfo->dwFlags);
1073 ok(!pInfo->dwDoubleClick, "pInfo->dwDoubleClick=%08x, expected 0\n", pInfo->dwDoubleClick);
1074 ok(!pInfo->pchHostCss, "pInfo->pchHostCss=%p, expected NULL\n", pInfo->pchHostCss);
1075 ok(!pInfo->pchHostNS, "pInfo->pchhostNS=%p, expected NULL\n", pInfo->pchHostNS);
1077 return E_FAIL;
1080 static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD dwID,
1081 IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget,
1082 IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
1084 ok(0, "unexpected call\n");
1085 return E_NOTIMPL;
1088 static HRESULT WINAPI DocHostUIHandler_HideUI(IDocHostUIHandler2 *iface)
1090 ok(0, "unexpected call\n");
1091 return E_NOTIMPL;
1094 static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface)
1096 CHECK_EXPECT(UpdateUI);
1097 return E_NOTIMPL;
1100 static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable)
1102 ok(0, "unexpected call\n");
1103 return E_NOTIMPL;
1106 static HRESULT WINAPI DocHostUIHandler_OnDocWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
1108 ok(0, "unexpected call\n");
1109 return E_NOTIMPL;
1112 static HRESULT WINAPI DocHostUIHandler_OnFrameWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
1114 ok(0, "unexpected call\n");
1115 return E_NOTIMPL;
1118 static HRESULT WINAPI DocHostUIHandler_ResizeBorder(IDocHostUIHandler2 *iface, LPCRECT prcBorder,
1119 IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
1121 ok(0, "unexpected call\n");
1122 return E_NOTIMPL;
1125 static HRESULT WINAPI DocHostUIHandler_TranslateAccelerator(IDocHostUIHandler2 *iface, LPMSG lpMsg,
1126 const GUID *pguidCmdGroup, DWORD nCmdID)
1128 ok(0, "unexpected call\n");
1129 return E_NOTIMPL;
1132 static HRESULT WINAPI DocHostUIHandler_GetOptionKeyPath(IDocHostUIHandler2 *iface,
1133 LPOLESTR *pchKey, DWORD dw)
1135 CHECK_EXPECT(GetOptionKeyPath);
1136 ok(pchKey != NULL, "pchKey==NULL\n");
1137 if(pchKey)
1138 ok(*pchKey == NULL, "*pchKey=%p\n", *pchKey);
1139 ok(!dw, "dw=%x\n", dw);
1140 return E_NOTIMPL;
1143 static HRESULT WINAPI DocHostUIHandler_GetDropTarget(IDocHostUIHandler2 *iface,
1144 IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
1146 ok(0, "unexpected call\n");
1147 return E_NOTIMPL;
1150 static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, IDispatch **ppDispatch)
1152 ok(0, "unexpected call\n");
1153 return E_NOTIMPL;
1156 static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate,
1157 OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
1159 ok(0, "unexpected call\n");
1160 return E_NOTIMPL;
1163 static HRESULT WINAPI DocHostUIHandler_FilterDataObject(IDocHostUIHandler2 *iface, IDataObject *pDO,
1164 IDataObject **ppPORet)
1166 ok(0, "unexpected call\n");
1167 return E_NOTIMPL;
1170 static HRESULT WINAPI DocHostUIHandler_GetOverrideKeyPath(IDocHostUIHandler2 *iface,
1171 LPOLESTR *pchKey, DWORD dw)
1173 CHECK_EXPECT(GetOverridesKeyPath);
1174 ok(pchKey != NULL, "pchKey==NULL\n");
1175 if(pchKey)
1176 ok(*pchKey == NULL, "*pchKey=%p\n", *pchKey);
1177 ok(!dw, "dw=%x\n", dw);
1178 return E_NOTIMPL;
1181 static const IDocHostUIHandler2Vtbl DocHostUIHandlerVtbl = {
1182 DocHostUIHandler_QueryInterface,
1183 DocHostUIHandler_AddRef,
1184 DocHostUIHandler_Release,
1185 DocHostUIHandler_ShowContextMenu,
1186 DocHostUIHandler_GetHostInfo,
1187 DocHostUIHandler_ShowUI,
1188 DocHostUIHandler_HideUI,
1189 DocHostUIHandler_UpdateUI,
1190 DocHostUIHandler_EnableModeless,
1191 DocHostUIHandler_OnDocWindowActivate,
1192 DocHostUIHandler_OnFrameWindowActivate,
1193 DocHostUIHandler_ResizeBorder,
1194 DocHostUIHandler_TranslateAccelerator,
1195 DocHostUIHandler_GetOptionKeyPath,
1196 DocHostUIHandler_GetDropTarget,
1197 DocHostUIHandler_GetExternal,
1198 DocHostUIHandler_TranslateUrl,
1199 DocHostUIHandler_FilterDataObject,
1200 DocHostUIHandler_GetOverrideKeyPath
1203 static IDocHostUIHandler2 DocHostUIHandler = { &DocHostUIHandlerVtbl };
1205 static HRESULT QueryInterface(REFIID riid, void **ppv)
1207 *ppv = NULL;
1209 if(IsEqualGUID(&IID_IUnknown, riid)
1210 || IsEqualGUID(&IID_IOleClientSite, riid))
1211 *ppv = &ClientSite;
1212 else if(IsEqualGUID(&IID_IOleWindow, riid)
1213 || IsEqualGUID(&IID_IOleInPlaceSite, riid)
1214 || IsEqualGUID(&IID_IOleInPlaceSiteEx, riid))
1215 *ppv = &InPlaceSite;
1216 else if(IsEqualGUID(&IID_IDocHostUIHandler, riid)
1217 || IsEqualGUID(&IID_IDocHostUIHandler2, riid))
1218 *ppv = &DocHostUIHandler;
1219 else if(IsEqualGUID(&IID_IDispatch, riid))
1220 *ppv = &Dispatch;
1222 if(*ppv)
1223 return S_OK;
1225 return E_NOINTERFACE;
1228 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
1230 return DefWindowProcW(hwnd, msg, wParam, lParam);
1233 static HWND create_container_window(void)
1235 static const WCHAR wszWebBrowserContainer[] =
1236 {'W','e','b','B','r','o','w','s','e','r','C','o','n','t','a','i','n','e','r',0};
1237 static WNDCLASSEXW wndclass = {
1238 sizeof(WNDCLASSEXW),
1240 wnd_proc,
1241 0, 0, NULL, NULL, NULL, NULL, NULL,
1242 wszWebBrowserContainer,
1243 NULL
1246 RegisterClassExW(&wndclass);
1247 return CreateWindowW(wszWebBrowserContainer, wszWebBrowserContainer,
1248 WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
1249 CW_USEDEFAULT, NULL, NULL, NULL, NULL);
1252 static void test_DoVerb(IUnknown *unk)
1254 IOleObject *oleobj;
1255 RECT rect = {0,0,1000,1000};
1256 HRESULT hres;
1258 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1259 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
1260 if(FAILED(hres))
1261 return;
1263 SET_EXPECT(CanInPlaceActivate);
1264 SET_EXPECT(Site_GetWindow);
1265 SET_EXPECT(OnInPlaceActivate);
1266 SET_EXPECT(GetWindowContext);
1267 SET_EXPECT(ShowObject);
1268 SET_EXPECT(GetContainer);
1269 SET_EXPECT(Frame_GetWindow);
1270 SET_EXPECT(OnUIActivate);
1271 SET_EXPECT(Frame_SetActiveObject);
1272 SET_EXPECT(UIWindow_SetActiveObject);
1273 SET_EXPECT(SetMenu);
1275 hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
1276 0, (HWND)0xdeadbeef, &rect);
1277 ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
1279 CHECK_CALLED(CanInPlaceActivate);
1280 CHECK_CALLED(Site_GetWindow);
1281 CHECK_CALLED(OnInPlaceActivate);
1282 CHECK_CALLED(GetWindowContext);
1283 CHECK_CALLED(ShowObject);
1284 CHECK_CALLED(GetContainer);
1285 CHECK_CALLED(Frame_GetWindow);
1286 CHECK_CALLED(OnUIActivate);
1287 CHECK_CALLED(Frame_SetActiveObject);
1288 CHECK_CALLED(UIWindow_SetActiveObject);
1289 CHECK_CALLED(SetMenu);
1291 hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite,
1292 0, (HWND)0xdeadbeef, &rect);
1293 ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
1295 IOleObject_Release(oleobj);
1298 static void test_GetMiscStatus(IOleObject *oleobj)
1300 DWORD st, i;
1301 HRESULT hres;
1303 for(i=0; i<10; i++) {
1304 st = 0xdeadbeef;
1305 hres = IOleObject_GetMiscStatus(oleobj, i, &st);
1306 ok(hres == S_OK, "GetMiscStatus failed: %08x\n", hres);
1307 ok(st == (OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT
1308 |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE),
1309 "st=%08x, expected OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|"
1310 "OLEMISC_INSIDEOUT|OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE)\n", st);
1314 static void test_SetHostNames(IOleObject *oleobj)
1316 HRESULT hres;
1318 static const WCHAR test_appW[] = {'t','e','s','t',' ','a','p','p',0};
1320 hres = IOleObject_SetHostNames(oleobj, test_appW, (void*)0xdeadbeef);
1321 ok(hres == S_OK, "SetHostNames failed: %08x\n", hres);
1324 static void test_ClientSite(IUnknown *unk, IOleClientSite *client)
1326 IOleObject *oleobj;
1327 IOleInPlaceObject *inplace;
1328 HWND hwnd;
1329 HRESULT hres;
1331 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1332 ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres);
1333 if(FAILED(hres))
1334 return;
1336 test_GetMiscStatus(oleobj);
1337 test_SetHostNames(oleobj);
1339 hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceObject, (void**)&inplace);
1340 ok(hres == S_OK, "QueryInterface(IID_OleInPlaceObject) failed: %08x\n", hres);
1341 if(FAILED(hres)) {
1342 IOleObject_Release(oleobj);
1343 return;
1346 hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
1347 ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
1348 ok((hwnd == NULL) ^ (client == NULL), "unexpected hwnd %p\n", hwnd);
1350 if(client) {
1351 SET_EXPECT(GetContainer);
1352 SET_EXPECT(Site_GetWindow);
1353 SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1354 SET_EXPECT(Invoke_AMBIENT_SILENT);
1355 }else {
1356 SET_EXPECT(Invoke_DOWNLOADCOMPLETE);
1357 SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
1358 SET_EXPECT(Invoke_COMMANDSTATECHANGE);
1361 hres = IOleObject_SetClientSite(oleobj, client);
1362 ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
1364 if(client) {
1365 CHECK_CALLED(GetContainer);
1366 CHECK_CALLED(Site_GetWindow);
1367 CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1368 CHECK_CALLED(Invoke_AMBIENT_SILENT);
1369 }else {
1370 todo_wine CHECK_CALLED(Invoke_DOWNLOADCOMPLETE);
1371 todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
1372 todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE);
1375 hres = IOleInPlaceObject_GetWindow(inplace, &hwnd);
1376 ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
1377 ok((hwnd == NULL) == (client == NULL), "unexpected hwnd %p\n", hwnd);
1379 shell_embedding_hwnd = hwnd;
1381 test_SetHostNames(oleobj);
1383 IOleInPlaceObject_Release(inplace);
1384 IOleObject_Release(oleobj);
1387 static void test_ClassInfo(IUnknown *unk)
1389 IProvideClassInfo2 *class_info;
1390 GUID guid;
1391 HRESULT hres;
1393 hres = IUnknown_QueryInterface(unk, &IID_IProvideClassInfo2, (void**)&class_info);
1394 ok(hres == S_OK, "QueryInterface(IID_IProvideClassInfo) failed: %08x\n", hres);
1395 if(FAILED(hres))
1396 return;
1398 hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, &guid);
1399 ok(hres == S_OK, "GetGUID failed: %08x\n", hres);
1400 ok(IsEqualGUID(&DIID_DWebBrowserEvents2, &guid), "wrong guid\n");
1402 hres = IProvideClassInfo2_GetGUID(class_info, 0, &guid);
1403 ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres);
1404 ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
1406 hres = IProvideClassInfo2_GetGUID(class_info, 2, &guid);
1407 ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres);
1408 ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n");
1410 hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, NULL);
1411 ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
1413 hres = IProvideClassInfo2_GetGUID(class_info, 0, NULL);
1414 ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres);
1416 IProvideClassInfo2_Release(class_info);
1419 static void test_ie_funcs(IUnknown *unk)
1421 IWebBrowser2 *wb;
1422 IDispatch *disp;
1423 VARIANT_BOOL b;
1424 int i;
1425 long hwnd;
1426 HRESULT hres;
1428 hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
1429 ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
1430 if(FAILED(hres))
1431 return;
1433 /* HWND */
1435 hwnd = 0xdeadbeef;
1436 hres = IWebBrowser2_get_HWND(wb, &hwnd);
1437 ok(hres == E_FAIL, "get_HWND failed: %08x, expected E_FAIL\n", hres);
1438 ok(hwnd == 0, "unexpected hwnd %lx\n", hwnd);
1440 /* MenuBar */
1442 hres = IWebBrowser2_get_MenuBar(wb, &b);
1443 ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1444 ok(b == VARIANT_TRUE, "b=%x\n", b);
1446 SET_EXPECT(Invoke_ONMENUBAR);
1447 hres = IWebBrowser2_put_MenuBar(wb, (exvb = VARIANT_FALSE));
1448 ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1449 CHECK_CALLED(Invoke_ONMENUBAR);
1451 hres = IWebBrowser2_get_MenuBar(wb, &b);
1452 ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1453 ok(b == VARIANT_FALSE, "b=%x\n", b);
1455 SET_EXPECT(Invoke_ONMENUBAR);
1456 hres = IWebBrowser2_put_MenuBar(wb, (exvb = 100));
1457 ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1458 CHECK_CALLED(Invoke_ONMENUBAR);
1460 hres = IWebBrowser2_get_MenuBar(wb, &b);
1461 ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1462 ok(b == VARIANT_TRUE, "b=%x\n", b);
1464 /* AddressBar */
1466 hres = IWebBrowser2_get_AddressBar(wb, &b);
1467 ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres);
1468 ok(b == VARIANT_TRUE, "b=%x\n", b);
1470 SET_EXPECT(Invoke_ONADDRESSBAR);
1471 hres = IWebBrowser2_put_AddressBar(wb, (exvb = VARIANT_FALSE));
1472 ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
1473 CHECK_CALLED(Invoke_ONADDRESSBAR);
1475 hres = IWebBrowser2_get_AddressBar(wb, &b);
1476 ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres);
1477 ok(b == VARIANT_FALSE, "b=%x\n", b);
1479 SET_EXPECT(Invoke_ONADDRESSBAR);
1480 hres = IWebBrowser2_put_AddressBar(wb, (exvb = 100));
1481 ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres);
1482 CHECK_CALLED(Invoke_ONADDRESSBAR);
1484 hres = IWebBrowser2_get_AddressBar(wb, &b);
1485 ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres);
1486 ok(b == VARIANT_TRUE, "b=%x\n", b);
1488 SET_EXPECT(Invoke_ONADDRESSBAR);
1489 hres = IWebBrowser2_put_AddressBar(wb, (exvb = VARIANT_TRUE));
1490 ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres);
1491 CHECK_CALLED(Invoke_ONADDRESSBAR);
1493 /* StatusBar */
1495 hres = IWebBrowser2_get_StatusBar(wb, &b);
1496 ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1497 ok(b == VARIANT_TRUE, "b=%x\n", b);
1499 SET_EXPECT(Invoke_ONSTATUSBAR);
1500 hres = IWebBrowser2_put_StatusBar(wb, (exvb = VARIANT_TRUE));
1501 ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1502 CHECK_CALLED(Invoke_ONSTATUSBAR);
1504 hres = IWebBrowser2_get_StatusBar(wb, &b);
1505 ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1506 ok(b == VARIANT_TRUE, "b=%x\n", b);
1508 SET_EXPECT(Invoke_ONSTATUSBAR);
1509 hres = IWebBrowser2_put_StatusBar(wb, (exvb = VARIANT_FALSE));
1510 ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1511 CHECK_CALLED(Invoke_ONSTATUSBAR);
1513 hres = IWebBrowser2_get_StatusBar(wb, &b);
1514 ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1515 ok(b == VARIANT_FALSE, "b=%x\n", b);
1517 SET_EXPECT(Invoke_ONSTATUSBAR);
1518 hres = IWebBrowser2_put_StatusBar(wb, (exvb = 100));
1519 ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres);
1520 CHECK_CALLED(Invoke_ONSTATUSBAR);
1522 hres = IWebBrowser2_get_StatusBar(wb, &b);
1523 ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres);
1524 ok(b == VARIANT_TRUE, "b=%x\n", b);
1526 /* ToolBar */
1528 hres = IWebBrowser2_get_ToolBar(wb, &i);
1529 ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1530 ok(i, "i=%x\n", i);
1532 SET_EXPECT(Invoke_ONTOOLBAR);
1533 hres = IWebBrowser2_put_ToolBar(wb, (exvb = VARIANT_FALSE));
1534 ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1535 CHECK_CALLED(Invoke_ONTOOLBAR);
1537 hres = IWebBrowser2_get_ToolBar(wb, &i);
1538 ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1539 ok(i == VARIANT_FALSE, "b=%x\n", i);
1541 SET_EXPECT(Invoke_ONTOOLBAR);
1542 hres = IWebBrowser2_put_ToolBar(wb, (exvb = 100));
1543 ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1544 CHECK_CALLED(Invoke_ONTOOLBAR);
1546 hres = IWebBrowser2_get_ToolBar(wb, &i);
1547 ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres);
1548 ok(i, "i=%x\n", i);
1550 SET_EXPECT(Invoke_ONTOOLBAR);
1551 hres = IWebBrowser2_put_ToolBar(wb, (exvb = VARIANT_TRUE));
1552 ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres);
1553 CHECK_CALLED(Invoke_ONTOOLBAR);
1555 /* FullScreen */
1557 hres = IWebBrowser2_get_FullScreen(wb, &b);
1558 ok(hres == S_OK, "get_FullScreen failed: %08x\n", hres);
1559 ok(b == VARIANT_FALSE, "b=%x\n", b);
1561 SET_EXPECT(Invoke_ONFULLSCREEN);
1562 hres = IWebBrowser2_put_FullScreen(wb, (exvb = VARIANT_TRUE));
1563 ok(hres == S_OK, "put_FullScreen failed: %08x\n", hres);
1564 CHECK_CALLED(Invoke_ONFULLSCREEN);
1566 hres = IWebBrowser2_get_FullScreen(wb, &b);
1567 ok(hres == S_OK, "get_FullScreen failed: %08x\n", hres);
1568 ok(b == VARIANT_TRUE, "b=%x\n", b);
1570 SET_EXPECT(Invoke_ONFULLSCREEN);
1571 hres = IWebBrowser2_put_FullScreen(wb, (exvb = 100));
1572 ok(hres == S_OK, "put_FullScreen failed: %08x\n", hres);
1573 CHECK_CALLED(Invoke_ONFULLSCREEN);
1575 hres = IWebBrowser2_get_FullScreen(wb, &b);
1576 ok(hres == S_OK, "get_FullScreen failed: %08x\n", hres);
1577 ok(b == VARIANT_TRUE, "b=%x\n", b);
1579 SET_EXPECT(Invoke_ONFULLSCREEN);
1580 hres = IWebBrowser2_put_FullScreen(wb, (exvb = VARIANT_FALSE));
1581 ok(hres == S_OK, "put_FullScreen failed: %08x\n", hres);
1582 CHECK_CALLED(Invoke_ONFULLSCREEN);
1584 /* TheaterMode */
1586 hres = IWebBrowser2_get_TheaterMode(wb, &b);
1587 ok(hres == S_OK, "get_TheaterMode failed: %08x\n", hres);
1588 ok(b == VARIANT_FALSE, "b=%x\n", b);
1590 SET_EXPECT(Invoke_ONTHEATERMODE);
1591 hres = IWebBrowser2_put_TheaterMode(wb, (exvb = VARIANT_TRUE));
1592 ok(hres == S_OK, "put_TheaterMode failed: %08x\n", hres);
1593 CHECK_CALLED(Invoke_ONTHEATERMODE);
1595 hres = IWebBrowser2_get_TheaterMode(wb, &b);
1596 ok(hres == S_OK, "get_TheaterMode failed: %08x\n", hres);
1597 ok(b == VARIANT_TRUE, "b=%x\n", b);
1599 SET_EXPECT(Invoke_ONTHEATERMODE);
1600 hres = IWebBrowser2_put_TheaterMode(wb, (exvb = 100));
1601 ok(hres == S_OK, "put_TheaterMode failed: %08x\n", hres);
1602 CHECK_CALLED(Invoke_ONTHEATERMODE);
1604 hres = IWebBrowser2_get_TheaterMode(wb, &b);
1605 ok(hres == S_OK, "get_TheaterMode failed: %08x\n", hres);
1606 ok(b == VARIANT_TRUE, "b=%x\n", b);
1608 SET_EXPECT(Invoke_ONTHEATERMODE);
1609 hres = IWebBrowser2_put_TheaterMode(wb, (exvb = VARIANT_FALSE));
1610 ok(hres == S_OK, "put_TheaterMode failed: %08x\n", hres);
1611 CHECK_CALLED(Invoke_ONTHEATERMODE);
1613 /* Resizable */
1615 b = 0x100;
1616 hres = IWebBrowser2_get_Resizable(wb, &b);
1617 ok(hres == E_NOTIMPL, "get_Resizable failed: %08x\n", hres);
1618 ok(b == 0x100, "b=%x\n", b);
1620 SET_EXPECT(Invoke_WINDOWSETRESIZABLE);
1621 hres = IWebBrowser2_put_Resizable(wb, (exvb = VARIANT_TRUE));
1622 ok(hres == S_OK, "put_Resizable failed: %08x\n", hres);
1623 CHECK_CALLED(Invoke_WINDOWSETRESIZABLE);
1625 SET_EXPECT(Invoke_WINDOWSETRESIZABLE);
1626 hres = IWebBrowser2_put_Resizable(wb, (exvb = VARIANT_FALSE));
1627 ok(hres == S_OK, "put_Resizable failed: %08x\n", hres);
1628 CHECK_CALLED(Invoke_WINDOWSETRESIZABLE);
1630 hres = IWebBrowser2_get_Resizable(wb, &b);
1631 ok(hres == E_NOTIMPL, "get_Resizable failed: %08x\n", hres);
1632 ok(b == 0x100, "b=%x\n", b);
1634 /* Application */
1636 disp = NULL;
1637 hres = IWebBrowser2_get_Application(wb, &disp);
1638 ok(hres == S_OK, "get_Application failed: %08x\n", hres);
1639 ok(disp == (void*)wb, "disp=%p, expected %p\n", disp, wb);
1640 if(disp)
1641 IDispatch_Release(disp);
1643 hres = IWebBrowser2_get_Application(wb, NULL);
1644 ok(hres == E_POINTER, "get_Application failed: %08x, expected E_POINTER\n", hres);
1646 /* Quit */
1648 hres = IWebBrowser2_Quit(wb);
1649 ok(hres == E_FAIL, "Quit failed: %08x, expected E_FAIL\n", hres);
1651 IWebBrowser2_Release(wb);
1654 static void test_Silent(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
1656 VARIANT_BOOL b;
1657 HRESULT hres;
1659 b = 100;
1660 hres = IWebBrowser2_get_Silent(wb, &b);
1661 ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1662 ok(b == VARIANT_FALSE, "b=%x\n", b);
1664 hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
1665 ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1667 b = 100;
1668 hres = IWebBrowser2_get_Silent(wb, &b);
1669 ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1670 ok(b == VARIANT_TRUE, "b=%x\n", b);
1672 hres = IWebBrowser2_put_Silent(wb, 100);
1673 ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1675 b = 100;
1676 hres = IWebBrowser2_get_Silent(wb, &b);
1677 ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1678 ok(b == VARIANT_TRUE, "b=%x\n", b);
1680 hres = IWebBrowser2_put_Silent(wb, VARIANT_FALSE);
1681 ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1683 b = 100;
1684 hres = IWebBrowser2_get_Silent(wb, &b);
1685 ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1686 ok(b == VARIANT_FALSE, "b=%x\n", b);
1688 if(is_clientsite) {
1689 hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE);
1690 ok(hres == S_OK, "set_Silent failed: %08x\n", hres);
1692 SET_EXPECT(Invoke_AMBIENT_SILENT);
1695 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_SILENT);
1696 ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
1698 if(is_clientsite)
1699 CHECK_CALLED(Invoke_AMBIENT_SILENT);
1701 b = 100;
1702 hres = IWebBrowser2_get_Silent(wb, &b);
1703 ok(hres == S_OK, "get_Silent failed: %08x\n", hres);
1704 ok(b == VARIANT_FALSE, "b=%x\n", b);
1707 static void test_Offline(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite)
1709 VARIANT_BOOL b;
1710 HRESULT hres;
1712 b = 100;
1713 hres = IWebBrowser2_get_Offline(wb, &b);
1714 ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1715 ok(b == VARIANT_FALSE, "b=%x\n", b);
1717 hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
1718 ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1720 b = 100;
1721 hres = IWebBrowser2_get_Offline(wb, &b);
1722 ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1723 ok(b == VARIANT_TRUE, "b=%x\n", b);
1725 hres = IWebBrowser2_put_Offline(wb, 100);
1726 ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1728 b = 100;
1729 hres = IWebBrowser2_get_Offline(wb, &b);
1730 ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1731 ok(b == VARIANT_TRUE, "b=%x\n", b);
1733 hres = IWebBrowser2_put_Offline(wb, VARIANT_FALSE);
1734 ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1736 b = 100;
1737 hres = IWebBrowser2_get_Offline(wb, &b);
1738 ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1739 ok(b == VARIANT_FALSE, "b=%x\n", b);
1741 if(is_clientsite) {
1742 hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE);
1743 ok(hres == S_OK, "set_Offline failed: %08x\n", hres);
1745 SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1748 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
1749 ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres);
1751 if(is_clientsite)
1752 CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1754 b = 100;
1755 hres = IWebBrowser2_get_Offline(wb, &b);
1756 ok(hres == S_OK, "get_Offline failed: %08x\n", hres);
1757 ok(b == VARIANT_FALSE, "b=%x\n", b);
1760 static void test_wb_funcs(IUnknown *unk, BOOL is_clientsite)
1762 IWebBrowser2 *wb;
1763 IOleControl *control;
1764 HRESULT hres;
1766 hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
1767 ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
1769 hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1770 ok(hres == S_OK, "Could not get IOleControl interface: %08x\n", hres);
1772 test_Silent(wb, control, is_clientsite);
1773 test_Offline(wb, control, is_clientsite);
1775 IWebBrowser_Release(wb);
1776 IOleControl_Release(control);
1779 static void test_GetControlInfo(IUnknown *unk)
1781 IOleControl *control;
1782 CONTROLINFO info;
1783 HRESULT hres;
1785 hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1786 ok(hres == S_OK, "Could not get IOleControl: %08x\n", hres);
1787 if(FAILED(hres))
1788 return;
1790 hres = IOleControl_GetControlInfo(control, &info);
1791 ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, exxpected E_NOTIMPL\n", hres);
1792 hres = IOleControl_GetControlInfo(control, NULL);
1793 ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, exxpected E_NOTIMPL\n", hres);
1795 IOleControl_Release(control);
1798 static void test_Extent(IUnknown *unk)
1800 IOleObject *oleobj;
1801 SIZE size;
1802 HRESULT hres;
1804 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1805 ok(hres == S_OK, "Could not get IOleObkect: %08x\n", hres);
1806 if(FAILED(hres))
1807 return;
1809 size.cx = size.cy = 0xdeadbeef;
1810 hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
1811 ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1812 ok(size.cx == 1323 && size.cy == 529, "size = {%d %d}\n", size.cx, size.cy);
1814 size.cx = 800;
1815 size.cy = 700;
1816 hres = IOleObject_SetExtent(oleobj, DVASPECT_CONTENT, &size);
1817 ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
1819 size.cx = size.cy = 0xdeadbeef;
1820 hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
1821 ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1822 ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy);
1824 size.cx = size.cy = 0xdeadbeef;
1825 hres = IOleObject_GetExtent(oleobj, 0, &size);
1826 ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1827 ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy);
1829 size.cx = 900;
1830 size.cy = 800;
1831 hres = IOleObject_SetExtent(oleobj, 0, &size);
1832 ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
1834 size.cx = size.cy = 0xdeadbeef;
1835 hres = IOleObject_GetExtent(oleobj, 0, &size);
1836 ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1837 ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy);
1839 size.cx = size.cy = 0xdeadbeef;
1840 hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
1841 ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1842 ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy);
1844 size.cx = 1000;
1845 size.cy = 900;
1846 hres = IOleObject_SetExtent(oleobj, 0xdeadbeef, &size);
1847 ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
1849 size.cx = size.cy = 0xdeadbeef;
1850 hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size);
1851 ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1852 ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy);
1854 size.cx = size.cy = 0xdeadbeef;
1855 hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size);
1856 ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
1857 ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy);
1859 IOleObject_Release(oleobj);
1862 static void test_ConnectionPoint(IUnknown *unk, BOOL init)
1864 IConnectionPointContainer *container;
1865 IConnectionPoint *point;
1866 HRESULT hres;
1868 static DWORD dw = 100;
1870 hres = IUnknown_QueryInterface(unk, &IID_IConnectionPointContainer, (void**)&container);
1871 ok(hres == S_OK, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres);
1872 if(FAILED(hres))
1873 return;
1875 hres = IConnectionPointContainer_FindConnectionPoint(container, &DIID_DWebBrowserEvents2, &point);
1876 IConnectionPointContainer_Release(container);
1877 ok(hres == S_OK, "FindConnectionPoint failed: %08x\n", hres);
1878 if(FAILED(hres))
1879 return;
1881 if(init) {
1882 hres = IConnectionPoint_Advise(point, (IUnknown*)&WebBrowserEvents2, &dw);
1883 ok(hres == S_OK, "Advise failed: %08x\n", hres);
1884 ok(dw == 1, "dw=%d, expected 1\n", dw);
1885 }else {
1886 hres = IConnectionPoint_Unadvise(point, dw);
1887 ok(hres == S_OK, "Unadvise failed: %08x\n", hres);
1890 IConnectionPoint_Release(point);
1893 static void test_Navigate2(IUnknown *unk)
1895 IWebBrowser2 *webbrowser;
1896 VARIANT url;
1897 HRESULT hres;
1899 hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&webbrowser);
1900 ok(hres == S_OK, "QueryInterface(IID_IWebBrowser) failed: %08x\n", hres);
1901 if(FAILED(hres))
1902 return;
1904 test_LocationURL(unk, emptyW);
1906 V_VT(&url) = VT_BSTR;
1907 V_BSTR(&url) = SysAllocString(about_blankW);
1909 SET_EXPECT(Invoke_AMBIENT_USERMODE);
1910 SET_EXPECT(Invoke_PROPERTYCHANGE);
1911 SET_EXPECT(Invoke_BEFORENAVIGATE2);
1912 SET_EXPECT(Invoke_DOWNLOADBEGIN);
1913 SET_EXPECT(Exec_SETDOWNLOADSTATE_1);
1914 SET_EXPECT(EnableModeless_FALSE);
1915 SET_EXPECT(Invoke_STATUSTEXTCHANGE);
1916 SET_EXPECT(SetStatusText);
1917 SET_EXPECT(GetHostInfo);
1918 SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
1919 SET_EXPECT(Invoke_AMBIENT_USERAGENT);
1920 SET_EXPECT(Invoke_AMBIENT_PALETTE);
1921 SET_EXPECT(GetOptionKeyPath);
1922 SET_EXPECT(GetOverridesKeyPath);
1923 SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
1924 SET_EXPECT(Exec_SETPROGRESSMAX);
1925 SET_EXPECT(Exec_SETPROGRESSPOS);
1926 SET_EXPECT(Invoke_SETSECURELOCKICON);
1927 SET_EXPECT(Invoke_FILEDOWNLOAD);
1928 SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
1929 SET_EXPECT(Invoke_COMMANDSTATECHANGE);
1930 SET_EXPECT(EnableModeless_TRUE);
1932 hres = IWebBrowser2_Navigate2(webbrowser, &url, NULL, NULL, NULL, NULL);
1933 ok(hres == S_OK, "Navigate2 failed: %08x\n", hres);
1935 CHECK_CALLED(Invoke_AMBIENT_USERMODE);
1936 todo_wine CHECK_CALLED(Invoke_PROPERTYCHANGE);
1937 CHECK_CALLED(Invoke_BEFORENAVIGATE2);
1938 todo_wine CHECK_CALLED(Invoke_DOWNLOADBEGIN);
1939 todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_1);
1940 CHECK_CALLED(EnableModeless_FALSE);
1941 CHECK_CALLED(Invoke_STATUSTEXTCHANGE);
1942 CHECK_CALLED(SetStatusText);
1943 CHECK_CALLED(GetHostInfo);
1944 CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
1945 CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
1946 CHECK_CALLED(Invoke_AMBIENT_PALETTE);
1947 CHECK_CALLED(GetOptionKeyPath);
1948 CHECK_CALLED(GetOverridesKeyPath);
1949 todo_wine CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
1950 todo_wine CHECK_CALLED(Exec_SETPROGRESSMAX);
1951 todo_wine CHECK_CALLED(Exec_SETPROGRESSPOS);
1952 todo_wine CHECK_CALLED(Invoke_SETSECURELOCKICON);
1953 todo_wine CHECK_CALLED(Invoke_FILEDOWNLOAD);
1954 todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE);
1955 todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
1956 CHECK_CALLED(EnableModeless_TRUE);
1958 VariantClear(&url);
1959 IWebBrowser2_Release(webbrowser);
1962 static void test_QueryInterface(IUnknown *unk)
1964 IQuickActivate *qa = (IQuickActivate*)0xdeadbeef;
1965 IRunnableObject *runnable = (IRunnableObject*)0xdeadbeef;
1966 IPerPropertyBrowsing *propbrowse = (void*)0xdeadbeef;
1967 IOleInPlaceSite *inplace = (void*)0xdeadbeef;
1968 IOleCache *cache = (void*)0xdeadbeef;
1969 IObjectWithSite *site = (void*)0xdeadbeef;
1970 HRESULT hres;
1972 hres = IUnknown_QueryInterface(unk, &IID_IQuickActivate, (void**)&qa);
1973 ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
1974 ok(qa == NULL, "qa=%p, ezpected NULL\n", qa);
1976 hres = IUnknown_QueryInterface(unk, &IID_IRunnableObject, (void**)&runnable);
1977 ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
1978 ok(runnable == NULL, "runnable=%p, ezpected NULL\n", runnable);
1980 hres = IUnknown_QueryInterface(unk, &IID_IPerPropertyBrowsing, (void**)&propbrowse);
1981 ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
1982 ok(propbrowse == NULL, "propbrowse=%p, ezpected NULL\n", runnable);
1984 hres = IUnknown_QueryInterface(unk, &IID_IOleCache, (void**)&cache);
1985 ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
1986 ok(cache == NULL, "cache=%p, ezpected NULL\n", runnable);
1988 hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceSite, (void**)&inplace);
1989 ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
1990 ok(inplace == NULL, "inplace=%p, ezpected NULL\n", runnable);
1992 hres = IUnknown_QueryInterface(unk, &IID_IObjectWithSite, (void**)&site);
1993 ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
1994 ok(site == NULL, "inplace=%p, ezpected NULL\n", runnable);
1997 static void test_WebBrowser(void)
1999 IUnknown *unk = NULL;
2000 ULONG ref;
2001 HRESULT hres;
2003 hres = CoCreateInstance(&CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
2004 &IID_IUnknown, (void**)&unk);
2005 ok(hres == S_OK, "CoCreateInterface failed: %08x\n", hres);
2006 if(FAILED(hres))
2007 return;
2009 hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
2010 ok(hres == S_OK, "Could not get IWebBrowser2 iface: %08x\n", hres);
2012 test_QueryInterface(unk);
2013 test_ClassInfo(unk);
2014 test_LocationURL(unk, emptyW);
2015 test_ConnectionPoint(unk, TRUE);
2016 test_ClientSite(unk, &ClientSite);
2017 test_Extent(unk);
2018 test_wb_funcs(unk, TRUE);
2019 test_DoVerb(unk);
2020 test_Navigate2(unk);
2021 test_ClientSite(unk, NULL);
2022 test_ie_funcs(unk);
2023 test_GetControlInfo(unk);
2024 test_wb_funcs(unk, FALSE);
2025 test_ConnectionPoint(unk, FALSE);
2027 IWebBrowser2_Release(wb);
2028 ref = IUnknown_Release(unk);
2029 ok(ref == 0, "ref=%d, expected 0\n", ref);
2032 static void gecko_installer_workaround(BOOL disable)
2034 HKEY hkey;
2035 DWORD res;
2037 static BOOL has_url = FALSE;
2038 static char url[2048];
2040 if(!disable && !has_url)
2041 return;
2043 res = RegOpenKey(HKEY_CURRENT_USER, "Software\\Wine\\MSHTML", &hkey);
2044 if(res != ERROR_SUCCESS)
2045 return;
2047 if(disable) {
2048 DWORD type, size = sizeof(url);
2050 res = RegQueryValueEx(hkey, "GeckoUrl", NULL, &type, (PVOID)url, &size);
2051 if(res == ERROR_SUCCESS && type == REG_SZ)
2052 has_url = TRUE;
2054 RegDeleteValue(hkey, "GeckoUrl");
2055 }else {
2056 RegSetValueEx(hkey, "GeckoUrl", 0, REG_SZ, (PVOID)url, lstrlenA(url)+1);
2059 RegCloseKey(hkey);
2062 START_TEST(webbrowser)
2064 gecko_installer_workaround(TRUE);
2066 container_hwnd = create_container_window();
2068 OleInitialize(NULL);
2070 test_WebBrowser();
2072 OleUninitialize();
2074 gecko_installer_workaround(FALSE);