| /* | |
| * Copyright 2006 Jacek Caban for CodeWeavers | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| */ | |
| #define COBJMACROS | |
| #define CONST_VTABLE | |
| #include <wine/test.h> | |
| #include <stdarg.h> | |
| #include <stdio.h> | |
| #include "windef.h" | |
| #include "winbase.h" | |
| #include "initguid.h" | |
| #include "ole2.h" | |
| #include "exdisp.h" | |
| #include "htiframe.h" | |
| #include "htiface.h" | |
| #include "mshtmhst.h" | |
| #include "mshtmcid.h" | |
| #include "mshtml.h" | |
| #include "idispids.h" | |
| #include "olectl.h" | |
| #include "mshtmdid.h" | |
| #include "shobjidl.h" | |
| #include "shdeprecated.h" | |
| #include "shlguid.h" | |
| #include "exdispid.h" | |
| #include "mimeinfo.h" | |
| #include "hlink.h" | |
| #include "docobjectservice.h" | |
| DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); | |
| DEFINE_OLEGUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0); | |
| #define DEFINE_EXPECT(func) \ | |
| static BOOL expect_ ## func = FALSE, called_ ## func = FALSE | |
| #define SET_EXPECT(func) \ | |
| do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0) | |
| #define CHECK_EXPECT2(func) \ | |
| do { \ | |
| ok(expect_ ##func, "unexpected call " #func "\n"); \ | |
| called_ ## func = TRUE; \ | |
| }while(0) | |
| #define CHECK_EXPECT(func) \ | |
| do { \ | |
| CHECK_EXPECT2(func); \ | |
| expect_ ## func = FALSE; \ | |
| }while(0) | |
| #define CHECK_CALLED(func) \ | |
| do { \ | |
| ok(called_ ## func, "expected " #func "\n"); \ | |
| expect_ ## func = called_ ## func = FALSE; \ | |
| }while(0) | |
| #define CHECK_NOT_CALLED(func) \ | |
| do { \ | |
| ok(!called_ ## func, "unexpected " #func "\n"); \ | |
| expect_ ## func = called_ ## func = FALSE; \ | |
| }while(0) | |
| #define CLEAR_CALLED(func) \ | |
| expect_ ## func = called_ ## func = FALSE | |
| DEFINE_EXPECT(GetContainer); | |
| DEFINE_EXPECT(Site_GetWindow); | |
| DEFINE_EXPECT(ShowObject); | |
| DEFINE_EXPECT(CanInPlaceActivate); | |
| DEFINE_EXPECT(OnInPlaceActivate); | |
| DEFINE_EXPECT(OnUIActivate); | |
| DEFINE_EXPECT(GetWindowContext); | |
| DEFINE_EXPECT(Frame_GetWindow); | |
| DEFINE_EXPECT(Frame_SetActiveObject); | |
| DEFINE_EXPECT(UIWindow_SetActiveObject); | |
| DEFINE_EXPECT(SetMenu); | |
| DEFINE_EXPECT(Invoke_AMBIENT_USERMODE); | |
| DEFINE_EXPECT(Invoke_AMBIENT_DLCONTROL); | |
| DEFINE_EXPECT(Invoke_AMBIENT_USERAGENT); | |
| DEFINE_EXPECT(Invoke_AMBIENT_PALETTE); | |
| DEFINE_EXPECT(Invoke_AMBIENT_SILENT); | |
| DEFINE_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| DEFINE_EXPECT(Invoke_STATUSTEXTCHANGE); | |
| DEFINE_EXPECT(Invoke_PROPERTYCHANGE); | |
| DEFINE_EXPECT(Invoke_DOWNLOADBEGIN); | |
| DEFINE_EXPECT(Invoke_BEFORENAVIGATE2); | |
| DEFINE_EXPECT(Invoke_SETSECURELOCKICON); | |
| DEFINE_EXPECT(Invoke_FILEDOWNLOAD); | |
| DEFINE_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| DEFINE_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE); | |
| DEFINE_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| DEFINE_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE); | |
| DEFINE_EXPECT(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS); | |
| DEFINE_EXPECT(Invoke_DOWNLOADCOMPLETE); | |
| DEFINE_EXPECT(Invoke_ONMENUBAR); | |
| DEFINE_EXPECT(Invoke_ONADDRESSBAR); | |
| DEFINE_EXPECT(Invoke_ONSTATUSBAR); | |
| DEFINE_EXPECT(Invoke_ONTOOLBAR); | |
| DEFINE_EXPECT(Invoke_ONFULLSCREEN); | |
| DEFINE_EXPECT(Invoke_ONTHEATERMODE); | |
| DEFINE_EXPECT(Invoke_WINDOWSETRESIZABLE); | |
| DEFINE_EXPECT(Invoke_TITLECHANGE); | |
| DEFINE_EXPECT(Invoke_NAVIGATECOMPLETE2); | |
| DEFINE_EXPECT(Invoke_PROGRESSCHANGE); | |
| DEFINE_EXPECT(Invoke_DOCUMENTCOMPLETE); | |
| DEFINE_EXPECT(Invoke_WINDOWCLOSING); | |
| DEFINE_EXPECT(Invoke_SETPHISHINGFILTERSTATUS); | |
| DEFINE_EXPECT(EnableModeless_TRUE); | |
| DEFINE_EXPECT(EnableModeless_FALSE); | |
| DEFINE_EXPECT(GetHostInfo); | |
| DEFINE_EXPECT(GetOptionKeyPath); | |
| DEFINE_EXPECT(GetOverridesKeyPath); | |
| DEFINE_EXPECT(SetStatusText); | |
| DEFINE_EXPECT(UpdateUI); | |
| DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_0); | |
| DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_1); | |
| DEFINE_EXPECT(Exec_SETPROGRESSMAX); | |
| DEFINE_EXPECT(Exec_SETPROGRESSPOS); | |
| DEFINE_EXPECT(Exec_UPDATECOMMANDS); | |
| DEFINE_EXPECT(Exec_SETTITLE); | |
| DEFINE_EXPECT(QueryStatus_SETPROGRESSTEXT); | |
| DEFINE_EXPECT(Exec_STOP); | |
| DEFINE_EXPECT(Exec_IDM_STOP); | |
| DEFINE_EXPECT(Exec_DocHostCommandHandler_2300); | |
| DEFINE_EXPECT(QueryStatus_STOP); | |
| DEFINE_EXPECT(QueryStatus_IDM_STOP); | |
| DEFINE_EXPECT(DocHost_EnableModeless_TRUE); | |
| DEFINE_EXPECT(DocHost_EnableModeless_FALSE); | |
| DEFINE_EXPECT(DocHost_TranslateAccelerator); | |
| DEFINE_EXPECT(GetDropTarget); | |
| DEFINE_EXPECT(TranslateUrl); | |
| DEFINE_EXPECT(ShowUI); | |
| DEFINE_EXPECT(HideUI); | |
| DEFINE_EXPECT(OnUIDeactivate); | |
| DEFINE_EXPECT(OnInPlaceDeactivate); | |
| DEFINE_EXPECT(RequestUIActivate); | |
| DEFINE_EXPECT(ControlSite_TranslateAccelerator); | |
| DEFINE_EXPECT(OnFocus_TRUE); | |
| DEFINE_EXPECT(OnFocus_FALSE); | |
| DEFINE_EXPECT(GetExternal); | |
| static const WCHAR wszItem[] = {'i','t','e','m',0}; | |
| static VARIANT_BOOL exvb; | |
| static IWebBrowser2 *wb; | |
| static HWND container_hwnd, shell_embedding_hwnd; | |
| static BOOL is_downloading, do_download, is_first_load, use_container_olecmd, test_close, is_http, use_container_dochostui; | |
| static HRESULT hr_dochost_TranslateAccelerator = E_NOTIMPL; | |
| static HRESULT hr_site_TranslateAccelerator = E_NOTIMPL; | |
| static const char *current_url; | |
| static int wb_version, expect_update_commands_enable, set_update_commands_enable; | |
| static BOOL nav_back_todo, nav_forward_todo; /* FIXME */ | |
| #define DWL_EXPECT_BEFORE_NAVIGATE 0x01 | |
| #define DWL_FROM_PUT_HREF 0x02 | |
| #define DWL_FROM_GOBACK 0x04 | |
| #define DWL_FROM_GOFORWARD 0x08 | |
| #define DWL_HTTP 0x10 | |
| #define DWL_REFRESH 0x20 | |
| #define DWL_BACK_ENABLE 0x40 | |
| static DWORD dwl_flags; | |
| /* Returns true if the user interface is in English. Note that this does not | |
| * presume of the formatting of dates, numbers, etc. | |
| */ | |
| static BOOL is_lang_english(void) | |
| { | |
| static HMODULE hkernel32 = NULL; | |
| static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL; | |
| static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL; | |
| if (!hkernel32) | |
| { | |
| hkernel32 = GetModuleHandleA("kernel32.dll"); | |
| pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage"); | |
| pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage"); | |
| } | |
| if (pGetThreadUILanguage) | |
| return PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH; | |
| if (pGetUserDefaultUILanguage) | |
| return PRIMARYLANGID(pGetUserDefaultUILanguage()) == LANG_ENGLISH; | |
| return PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH; | |
| } | |
| static int strcmp_wa(LPCWSTR strw, const char *stra) | |
| { | |
| CHAR buf[512]; | |
| WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL); | |
| return lstrcmpA(stra, buf); | |
| } | |
| static BOOL iface_cmp(IUnknown *iface1, IUnknown *iface2) | |
| { | |
| IUnknown *unk1, *unk2; | |
| if(iface1 == iface2) | |
| return TRUE; | |
| IUnknown_QueryInterface(iface1, &IID_IUnknown, (void**)&unk1); | |
| IUnknown_Release(unk1); | |
| IUnknown_QueryInterface(iface2, &IID_IUnknown, (void**)&unk2); | |
| IUnknown_Release(unk2); | |
| return unk1 == unk2; | |
| } | |
| static BSTR a2bstr(const char *str) | |
| { | |
| BSTR ret; | |
| int len; | |
| len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); | |
| ret = SysAllocStringLen(NULL, len); | |
| MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len); | |
| return ret; | |
| } | |
| #define create_webbrowser() _create_webbrowser(__LINE__) | |
| static IWebBrowser2 *_create_webbrowser(unsigned line) | |
| { | |
| IWebBrowser2 *ret; | |
| HRESULT hres; | |
| wb_version = 2; | |
| hres = CoCreateInstance(&CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, | |
| &IID_IWebBrowser2, (void**)&ret); | |
| ok_(__FILE__,line)(hres == S_OK, "Creating WebBrowser object failed: %08x\n", hres); | |
| return ret; | |
| } | |
| #define test_LocationURL(a,b) _test_LocationURL(__LINE__,a,b) | |
| static void _test_LocationURL(unsigned line, IWebBrowser2 *wb, const char *exurl) | |
| { | |
| BSTR url = (void*)0xdeadbeef; | |
| HRESULT hres; | |
| hres = IWebBrowser2_get_LocationURL(wb, &url); | |
| ok_(__FILE__,line) (hres == (*exurl ? S_OK : S_FALSE), "get_LocationURL failed: %08x\n", hres); | |
| if (SUCCEEDED(hres)) | |
| { | |
| ok_(__FILE__,line) (!strcmp_wa(url, exurl), "unexpected URL: %s\n", wine_dbgstr_w(url)); | |
| SysFreeString(url); | |
| } | |
| } | |
| #define test_ready_state(ex) _test_ready_state(__LINE__,ex) | |
| static void _test_ready_state(unsigned line, READYSTATE exstate) | |
| { | |
| READYSTATE state; | |
| HRESULT hres; | |
| hres = IWebBrowser2_get_ReadyState(wb, &state); | |
| ok_(__FILE__,line)(hres == S_OK, "get_ReadyState failed: %08x\n", hres); | |
| ok_(__FILE__,line)(state == exstate, "ReadyState = %d, expected %d\n", state, exstate); | |
| } | |
| #define get_document(u) _get_document(__LINE__,u) | |
| static IHTMLDocument2 *_get_document(unsigned line, IWebBrowser2 *wb) | |
| { | |
| IHTMLDocument2 *html_doc; | |
| IDispatch *disp; | |
| HRESULT hres; | |
| disp = NULL; | |
| hres = IWebBrowser2_get_Document(wb, &disp); | |
| ok_(__FILE__,line)(hres == S_OK, "get_Document failed: %08x\n", hres); | |
| ok_(__FILE__,line)(disp != NULL, "doc_disp == NULL\n"); | |
| hres = IDispatch_QueryInterface(disp, &IID_IHTMLDocument2, (void**)&html_doc); | |
| ok_(__FILE__,line)(hres == S_OK, "Could not get IHTMLDocument iface: %08x\n", hres); | |
| ok(disp == (IDispatch*)html_doc, "disp != html_doc\n"); | |
| IDispatch_Release(disp); | |
| return html_doc; | |
| } | |
| #define get_dochost(u) _get_dochost(__LINE__,u) | |
| static IOleClientSite *_get_dochost(unsigned line, IWebBrowser2 *unk) | |
| { | |
| IOleClientSite *client_site; | |
| IHTMLDocument2 *doc; | |
| IOleObject *oleobj; | |
| HRESULT hres; | |
| doc = _get_document(line, unk); | |
| hres = IHTMLDocument2_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj); | |
| IHTMLDocument2_Release(doc); | |
| ok_(__FILE__,line)(hres == S_OK, "Got 0x%08x\n", hres); | |
| hres = IOleObject_GetClientSite(oleobj, &client_site); | |
| IOleObject_Release(oleobj); | |
| ok_(__FILE__,line)(hres == S_OK, "Got 0x%08x\n", hres); | |
| return client_site; | |
| } | |
| static HRESULT QueryInterface(REFIID,void**); | |
| static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface, | |
| REFIID riid, void **ppv) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOINTERFACE; | |
| } | |
| static ULONG WINAPI OleCommandTarget_AddRef(IOleCommandTarget *iface) | |
| { | |
| return 2; | |
| } | |
| static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface) | |
| { | |
| return 1; | |
| } | |
| static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup, | |
| ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText) | |
| { | |
| ok(!pguidCmdGroup, "pguidCmdGroup != MULL\n"); | |
| ok(cCmds == 1, "cCmds=%d, expected 1\n", cCmds); | |
| ok(!pCmdText, "pCmdText != NULL\n"); | |
| switch(prgCmds[0].cmdID) { | |
| case OLECMDID_STOP: | |
| CHECK_EXPECT2(QueryStatus_STOP); | |
| prgCmds[0].cmdf = OLECMDF_SUPPORTED; | |
| return S_OK; | |
| case OLECMDID_SETPROGRESSTEXT: | |
| CHECK_EXPECT(QueryStatus_SETPROGRESSTEXT); | |
| prgCmds[0].cmdf = OLECMDF_ENABLED; | |
| return S_OK; | |
| case IDM_STOP: | |
| /* Note: | |
| * IDM_STOP is a command specific to CGID_MSHTML (not an OLECMDID command). | |
| * This command appears here for the ExecWB and QueryStatusWB tests in order | |
| * to help demonstrate that these routines use a NULL pguidCmdGroup. | |
| */ | |
| CHECK_EXPECT(QueryStatus_IDM_STOP); | |
| prgCmds[0].cmdf = 0; | |
| return S_OK; | |
| default: | |
| ok(0, "unexpected command %d\n", prgCmds[0].cmdID); | |
| } | |
| return E_FAIL; | |
| } | |
| static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup, | |
| DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) | |
| { | |
| if(!pguidCmdGroup) { | |
| switch(nCmdID) { | |
| case OLECMDID_SETPROGRESSMAX: | |
| CHECK_EXPECT2(Exec_SETPROGRESSMAX); | |
| ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt); | |
| ok(pvaIn != NULL, "pvaIn == NULL\n"); | |
| if(pvaIn) | |
| ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn)); | |
| ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut); | |
| return S_OK; | |
| case OLECMDID_SETPROGRESSPOS: | |
| CHECK_EXPECT2(Exec_SETPROGRESSPOS); | |
| ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt); | |
| ok(pvaIn != NULL, "pvaIn == NULL\n"); | |
| if(pvaIn) | |
| ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn)); | |
| ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut); | |
| return S_OK; | |
| case OLECMDID_SETDOWNLOADSTATE: | |
| if(is_downloading) | |
| ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER || !nCmdexecopt, | |
| "nCmdexecopts=%08x\n", nCmdexecopt); | |
| else | |
| ok(!nCmdexecopt, "nCmdexecopts=%08x\n", nCmdexecopt); | |
| ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut); | |
| ok(pvaIn != NULL, "pvaIn == NULL\n"); | |
| ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d\n", V_VT(pvaIn)); | |
| switch(V_I4(pvaIn)) { | |
| case 0: | |
| CHECK_EXPECT2(Exec_SETDOWNLOADSTATE_0); | |
| break; | |
| case 1: | |
| CHECK_EXPECT2(Exec_SETDOWNLOADSTATE_1); | |
| break; | |
| default: | |
| ok(0, "unexpevted V_I4(pvaIn)=%d\n", V_I4(pvaIn)); | |
| } | |
| return S_OK; | |
| case OLECMDID_UPDATECOMMANDS: | |
| CHECK_EXPECT2(Exec_UPDATECOMMANDS); | |
| ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt); | |
| ok(!pvaIn, "pvaIn != NULL\n"); | |
| ok(!pvaOut, "pvaOut=%p, expected NULL\n", pvaOut); | |
| return S_OK; | |
| case OLECMDID_SETTITLE: | |
| CHECK_EXPECT(Exec_SETTITLE); | |
| /* TODO: test args */ | |
| return S_OK; | |
| case OLECMDID_STOP: | |
| CHECK_EXPECT(Exec_STOP); | |
| return S_OK; | |
| case IDM_STOP: | |
| /* Note: | |
| * IDM_STOP is a command specific to CGID_MSHTML (not an OLECMDID command). | |
| * This command appears here for the ExecWB and QueryStatusWB tests in order | |
| * to help demonstrate that these routines use a NULL pguidCmdGroup. | |
| */ | |
| CHECK_EXPECT(Exec_IDM_STOP); | |
| return OLECMDERR_E_NOTSUPPORTED; | |
| case OLECMDID_UPDATETRAVELENTRY_DATARECOVERY: | |
| case OLECMDID_PAGEAVAILABLE: /* TODO (IE11) */ | |
| return E_NOTIMPL; | |
| case 6058: /* TODO */ | |
| return E_NOTIMPL; | |
| default: | |
| ok(0, "unexpected nCmdID %d\n", nCmdID); | |
| } | |
| }else if(IsEqualGUID(&CGID_Explorer, pguidCmdGroup)) { | |
| switch(nCmdID) { | |
| case 20: /* TODO */ | |
| case 24: /* TODO */ | |
| case 25: /* IE5 */ | |
| case 37: /* TODO */ | |
| case 39: /* TODO */ | |
| case 66: /* TODO */ | |
| case 67: /* TODO */ | |
| case 69: /* TODO */ | |
| case 101: /* TODO (IE8) */ | |
| case 109: /* TODO (IE9) */ | |
| case 113: /* TODO (IE10) */ | |
| case 119: /* IE11 */ | |
| return E_FAIL; | |
| default: | |
| ok(0, "unexpected nCmdID %d\n", nCmdID); | |
| } | |
| }else if(IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup)) { | |
| switch(nCmdID) { | |
| case 63: /* win10 */ | |
| case 105: /* TODO */ | |
| case 132: /* win10 */ | |
| case 133: /* IE11 */ | |
| case 134: /* TODO (IE10) */ | |
| case 135: /* IE11 */ | |
| case 136: /* TODO (IE10) */ | |
| case 137: /* win10 */ | |
| case 138: /* TODO */ | |
| case 140: /* TODO (Win7) */ | |
| case 144: /* TODO */ | |
| case 178: /* IE11 */ | |
| case 179: /* IE11 */ | |
| case 180: /* IE11 */ | |
| case 181: /* IE11 */ | |
| case 182: /* win10 */ | |
| return E_FAIL; | |
| default: | |
| ok(0, "unexpected nCmdID %d\n", nCmdID); | |
| } | |
| }else if(IsEqualGUID(&CGID_DocHostCmdPriv, pguidCmdGroup)) { | |
| switch(nCmdID) { | |
| case 11: /* TODO */ | |
| break; | |
| default: | |
| ok(0, "unexpected nCmdID %d of CGID_DocHostCmdPriv\n", nCmdID); | |
| } | |
| }else if(IsEqualGUID(&CGID_DocHostCommandHandler, pguidCmdGroup)) { | |
| switch(nCmdID) { | |
| case 6041: /* TODO */ | |
| break; | |
| case 2300: | |
| CHECK_EXPECT(Exec_DocHostCommandHandler_2300); | |
| return E_NOTIMPL; | |
| default: | |
| ok(0, "unexpected nCmdID %d of CGID_DocHostCommandHandler\n", nCmdID); | |
| } | |
| }else { | |
| ok(0, "unexpected pguidCmdGroup %s\n", wine_dbgstr_guid(pguidCmdGroup)); | |
| } | |
| return E_FAIL; | |
| } | |
| static IOleCommandTargetVtbl OleCommandTargetVtbl = { | |
| OleCommandTarget_QueryInterface, | |
| OleCommandTarget_AddRef, | |
| OleCommandTarget_Release, | |
| OleCommandTarget_QueryStatus, | |
| OleCommandTarget_Exec | |
| }; | |
| static IOleCommandTarget OleCommandTarget = { &OleCommandTargetVtbl }; | |
| static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv) | |
| { | |
| if(IsEqualGUID(&IID_ITargetContainer, riid)) | |
| return E_NOINTERFACE; /* TODO */ | |
| if(IsEqualGUID(&IID_IOleCommandTarget, riid)) { | |
| if(use_container_olecmd) | |
| { | |
| *ppv = &OleCommandTarget; | |
| return S_OK; | |
| } | |
| else | |
| return E_NOINTERFACE; | |
| } | |
| ok(0, "unexpected call\n"); | |
| return E_NOINTERFACE; | |
| } | |
| static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface) | |
| { | |
| return 2; | |
| } | |
| static ULONG WINAPI OleContainer_Release(IOleContainer *iface) | |
| { | |
| return 1; | |
| } | |
| static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc, | |
| LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags, | |
| IEnumUnknown **ppenum) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static const IOleContainerVtbl OleContainerVtbl = { | |
| OleContainer_QueryInterface, | |
| OleContainer_AddRef, | |
| OleContainer_Release, | |
| OleContainer_ParseDisplayName, | |
| OleContainer_EnumObjects, | |
| OleContainer_LockContainer | |
| }; | |
| static IOleContainer OleContainer = { &OleContainerVtbl }; | |
| static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv) | |
| { | |
| return QueryInterface(riid, ppv); | |
| } | |
| static ULONG WINAPI Dispatch_AddRef(IDispatch *iface) | |
| { | |
| return 2; | |
| } | |
| static ULONG WINAPI Dispatch_Release(IDispatch *iface) | |
| { | |
| return 1; | |
| } | |
| static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid, | |
| ITypeInfo **ppTInfo) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames, | |
| UINT cNames, LCID lcid, DISPID *rgDispId) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid, | |
| LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, | |
| EXCEPINFO *pExcepInfo, UINT *puArgErr) | |
| { | |
| ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n"); | |
| ok(pDispParams != NULL, "pDispParams == NULL\n"); | |
| ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo); | |
| ok(V_VT(pVarResult) == VT_EMPTY, "V_VT(pVarResult)=%d\n", V_VT(pVarResult)); | |
| ok(wFlags == DISPATCH_PROPERTYGET, "wFlags=%08x, expected DISPATCH_PROPERTYGET\n", wFlags); | |
| ok(pDispParams->rgvarg == NULL, "pDispParams->rgvarg = %p\n", pDispParams->rgvarg); | |
| ok(pDispParams->rgdispidNamedArgs == NULL, | |
| "pDispParams->rgdispidNamedArgs = %p\n", pDispParams->rgdispidNamedArgs); | |
| ok(pDispParams->cArgs == 0, "pDispParams->cArgs = %d\n", pDispParams->cArgs); | |
| ok(pDispParams->cNamedArgs == 0, "pDispParams->cNamedArgs = %d\n", pDispParams->cNamedArgs); | |
| switch(dispIdMember) { | |
| case DISPID_AMBIENT_USERMODE: | |
| CHECK_EXPECT2(Invoke_AMBIENT_USERMODE); | |
| return E_FAIL; | |
| case DISPID_AMBIENT_DLCONTROL: | |
| CHECK_EXPECT(Invoke_AMBIENT_DLCONTROL); | |
| ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr); | |
| return E_FAIL; | |
| case DISPID_AMBIENT_USERAGENT: | |
| CHECK_EXPECT(Invoke_AMBIENT_USERAGENT); | |
| ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr); | |
| return E_FAIL; | |
| case DISPID_AMBIENT_PALETTE: | |
| CHECK_EXPECT(Invoke_AMBIENT_PALETTE); | |
| ok(puArgErr != NULL, "puArgErr=%p\n", puArgErr); | |
| return E_FAIL; | |
| case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED: | |
| CHECK_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| ok(puArgErr == NULL, "puArgErr=%p\n", puArgErr); | |
| V_VT(pVarResult) = VT_BOOL; | |
| V_BOOL(pVarResult) = VARIANT_FALSE; | |
| return S_OK; | |
| case DISPID_AMBIENT_SILENT: | |
| CHECK_EXPECT(Invoke_AMBIENT_SILENT); | |
| ok(puArgErr == NULL, "puArgErr=%p\n", puArgErr); | |
| V_VT(pVarResult) = VT_BOOL; | |
| V_BOOL(pVarResult) = VARIANT_FALSE; | |
| return S_OK; | |
| } | |
| ok(0, "unexpected dispIdMember %d\n", dispIdMember); | |
| return E_NOTIMPL; | |
| } | |
| static IDispatchVtbl DispatchVtbl = { | |
| Dispatch_QueryInterface, | |
| Dispatch_AddRef, | |
| Dispatch_Release, | |
| Dispatch_GetTypeInfoCount, | |
| Dispatch_GetTypeInfo, | |
| Dispatch_GetIDsOfNames, | |
| Dispatch_Invoke | |
| }; | |
| static IDispatch Dispatch = { &DispatchVtbl }; | |
| static HRESULT WINAPI WebBrowserEvents2_QueryInterface(IDispatch *iface, REFIID riid, void **ppv) | |
| { | |
| *ppv = NULL; | |
| if(IsEqualGUID(&DIID_DWebBrowserEvents2, riid) || IsEqualGUID(&IID_IDispatch, riid)) { | |
| *ppv = iface; | |
| return S_OK; | |
| } | |
| ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); | |
| return E_NOINTERFACE; | |
| } | |
| #define test_invoke_bool(p,s) _test_invoke_bool(__LINE__,p,s) | |
| static void _test_invoke_bool(unsigned line, const DISPPARAMS *params, BOOL strict) | |
| { | |
| ok_(__FILE__,line) (params->rgvarg != NULL, "rgvarg == NULL\n"); | |
| ok_(__FILE__,line) (params->cArgs == 1, "cArgs=%d, expected 1\n", params->cArgs); | |
| ok_(__FILE__,line) (V_VT(params->rgvarg) == VT_BOOL, "V_VT(arg)=%d\n", V_VT(params->rgvarg)); | |
| if(strict) | |
| ok_(__FILE__,line) (V_BOOL(params->rgvarg) == exvb, "V_VT(arg)=%x, expected %x\n", | |
| V_BOOL(params->rgvarg), exvb); | |
| else | |
| ok_(__FILE__,line) (!V_BOOL(params->rgvarg) == !exvb, "V_VT(arg)=%x, expected %x\n", | |
| V_BOOL(params->rgvarg), exvb); | |
| } | |
| static void test_OnBeforeNavigate(const VARIANT *disp, const VARIANT *url, const VARIANT *flags, | |
| const VARIANT *frame, const VARIANT *post_data, const VARIANT *headers, const VARIANT *cancel) | |
| { | |
| BSTR str; | |
| ok(V_VT(disp) == VT_DISPATCH, "V_VT(disp)=%d, expected VT_DISPATCH\n", V_VT(disp)); | |
| ok(V_DISPATCH(disp) != NULL, "V_DISPATCH(disp) == NULL\n"); | |
| ok(V_DISPATCH(disp) == (IDispatch*)wb, "V_DISPATCH(disp)=%p, wb=%p\n", V_DISPATCH(disp), wb); | |
| ok(V_VT(url) == (VT_BYREF|VT_VARIANT), "V_VT(url)=%x, expected VT_BYREF|VT_VARIANT\n", V_VT(url)); | |
| ok(V_VARIANTREF(url) != NULL, "V_VARIANTREF(url) == NULL)\n"); | |
| if(V_VARIANTREF(url)) { | |
| ok(V_VT(V_VARIANTREF(url)) == VT_BSTR, "V_VT(V_VARIANTREF(url))=%d, expected VT_BSTR\n", | |
| V_VT(V_VARIANTREF(url))); | |
| ok(V_BSTR(V_VARIANTREF(url)) != NULL, "V_BSTR(V_VARIANTREF(url)) == NULL\n"); | |
| ok(!strcmp_wa(V_BSTR(V_VARIANTREF(url)), current_url), "unexpected url %s, expected %s\n", | |
| wine_dbgstr_w(V_BSTR(V_VARIANTREF(url))), current_url); | |
| } | |
| ok(V_VT(flags) == (VT_BYREF|VT_VARIANT), "V_VT(flags)=%x, expected VT_BYREF|VT_VARIANT\n", | |
| V_VT(flags)); | |
| ok(V_VT(flags) == (VT_BYREF|VT_VARIANT), "V_VT(flags)=%x, expected VT_BYREF|VT_VARIANT\n", | |
| V_VT(flags)); | |
| ok(V_VARIANTREF(flags) != NULL, "V_VARIANTREF(flags) == NULL)\n"); | |
| if(V_VARIANTREF(flags)) { | |
| int f; | |
| ok(V_VT(V_VARIANTREF(flags)) == VT_I4, "V_VT(V_VARIANTREF(flags))=%d, expected VT_I4\n", | |
| V_VT(V_VARIANTREF(flags))); | |
| f = V_I4(V_VARIANTREF(flags)); | |
| f &= ~0x100; /* IE11 sets this flag */ | |
| if(is_first_load) | |
| ok(!f, "flags = %x, expected 0\n", V_I4(V_VARIANTREF(flags))); | |
| else | |
| ok(!(f & ~0x40), "flags = %x, expected 0x40 or 0\n", V_I4(V_VARIANTREF(flags))); | |
| } | |
| ok(V_VT(frame) == (VT_BYREF|VT_VARIANT), "V_VT(frame)=%x, expected VT_BYREF|VT_VARIANT\n", | |
| V_VT(frame)); | |
| ok(V_VT(frame) == (VT_BYREF|VT_VARIANT), "V_VT(frame)=%x, expected VT_BYREF|VT_VARIANT\n", | |
| V_VT(frame)); | |
| ok(V_VARIANTREF(frame) != NULL, "V_VARIANTREF(frame) == NULL)\n"); | |
| if(V_VARIANTREF(frame)) { | |
| ok(V_VT(V_VARIANTREF(frame)) == VT_BSTR, "V_VT(V_VARIANTREF(frame))=%d, expected VT_BSTR\n", | |
| V_VT(V_VARIANTREF(frame))); | |
| ok(V_BSTR(V_VARIANTREF(frame)) == NULL, "V_BSTR(V_VARIANTREF(frame)) = %p, expected NULL\n", | |
| V_BSTR(V_VARIANTREF(frame))); | |
| } | |
| ok(V_VT(post_data) == (VT_BYREF|VT_VARIANT), "V_VT(post_data)=%x, expected VT_BYREF|VT_VARIANT\n", | |
| V_VT(post_data)); | |
| ok(V_VT(post_data) == (VT_BYREF|VT_VARIANT), "V_VT(post_data)=%x, expected VT_BYREF|VT_VARIANT\n", | |
| V_VT(post_data)); | |
| ok(V_VARIANTREF(post_data) != NULL, "V_VARIANTREF(post_data) == NULL)\n"); | |
| if(V_VARIANTREF(post_data)) { | |
| ok(V_VT(V_VARIANTREF(post_data)) == (VT_VARIANT|VT_BYREF), | |
| "V_VT(V_VARIANTREF(post_data))=%d, expected VT_VARIANT|VT_BYREF\n", | |
| V_VT(V_VARIANTREF(post_data))); | |
| ok(V_VARIANTREF(V_VARIANTREF(post_data)) != NULL, | |
| "V_VARIANTREF(V_VARIANTREF(post_data)) == NULL\n"); | |
| if(V_VARIANTREF(V_VARIANTREF(post_data))) { | |
| ok(V_VT(V_VARIANTREF(V_VARIANTREF(post_data))) == VT_EMPTY, | |
| "V_VT(V_VARIANTREF(V_VARIANTREF(post_data))) = %d, expected VT_EMPTY\n", | |
| V_VT(V_VARIANTREF(V_VARIANTREF(post_data)))); | |
| if(V_VT(V_VARIANTREF(V_VARIANTREF(post_data))) == (VT_UI1|VT_ARRAY)) { | |
| const SAFEARRAY *sa = V_ARRAY(V_VARIANTREF(V_VARIANTREF(post_data))); | |
| ok(sa->cDims == 1, "sa->cDims = %d, expected 1\n", sa->cDims); | |
| ok(sa->fFeatures == 0, "sa->fFeatures = %d, expected 0\n", sa->fFeatures); | |
| } | |
| } | |
| } | |
| ok(V_VT(headers) == (VT_BYREF|VT_VARIANT), "V_VT(headers)=%x, expected VT_BYREF|VT_VARIANT\n", | |
| V_VT(headers)); | |
| ok(V_VARIANTREF(headers) != NULL, "V_VARIANTREF(headers) == NULL)\n"); | |
| if(V_VARIANTREF(headers)) { | |
| ok(V_VT(V_VARIANTREF(headers)) == VT_BSTR, "V_VT(V_VARIANTREF(headers))=%d, expected VT_BSTR\n", | |
| V_VT(V_VARIANTREF(headers))); | |
| str = V_BSTR(V_VARIANTREF(headers)); | |
| ok(!str || !strcmp_wa(str, "Referer: http://test.winehq.org/tests/hello.html\r\n"), | |
| "V_BSTR(V_VARIANTREF(headers)) = %s, expected NULL\n", wine_dbgstr_w(str)); | |
| } | |
| ok(V_VT(cancel) == (VT_BYREF|VT_BOOL), "V_VT(cancel)=%x, expected VT_BYREF|VT_BOOL\n", | |
| V_VT(cancel)); | |
| ok(V_BOOLREF(cancel) != NULL, "V_BOOLREF(pDispParams->rgvarg[0] == NULL)\n"); | |
| if(V_BOOLREF(cancel)) | |
| ok(*V_BOOLREF(cancel) == VARIANT_FALSE, "*V_BOOLREF(cancel) = %x, expected VARIANT_FALSE\n", | |
| *V_BOOLREF(cancel)); | |
| } | |
| static void test_navigatecomplete2(DISPPARAMS *dp) | |
| { | |
| VARIANT *v; | |
| CHECK_EXPECT(Invoke_NAVIGATECOMPLETE2); | |
| ok(dp->rgvarg != NULL, "rgvarg == NULL\n"); | |
| ok(dp->cArgs == 2, "cArgs=%d, expected 2\n", dp->cArgs); | |
| ok(V_VT(dp->rgvarg) == (VT_BYREF|VT_VARIANT), "V_VT(dp->rgvarg) = %d\n", V_VT(dp->rgvarg)); | |
| v = V_VARIANTREF(dp->rgvarg); | |
| ok(V_VT(v) == VT_BSTR, "V_VT(url) = %d\n", V_VT(v)); | |
| ok(!strcmp_wa(V_BSTR(v), current_url), "url=%s, expected %s\n", wine_dbgstr_w(V_BSTR(v)), current_url); | |
| ok(V_VT(dp->rgvarg+1) == VT_DISPATCH, "V_VT(dp->rgvarg+1) = %d\n", V_VT(dp->rgvarg+1)); | |
| ok(V_DISPATCH(dp->rgvarg+1) == (IDispatch*)wb, "V_DISPATCH=%p, wb=%p\n", V_DISPATCH(dp->rgvarg+1), wb); | |
| test_ready_state((dwl_flags & (DWL_FROM_PUT_HREF|DWL_FROM_GOBACK|DWL_FROM_GOFORWARD)) | |
| ? READYSTATE_COMPLETE : READYSTATE_LOADING); | |
| } | |
| static void test_documentcomplete(DISPPARAMS *dp) | |
| { | |
| VARIANT *v; | |
| CHECK_EXPECT(Invoke_DOCUMENTCOMPLETE); | |
| ok(dp->rgvarg != NULL, "rgvarg == NULL\n"); | |
| ok(dp->cArgs == 2, "cArgs=%d, expected 2\n", dp->cArgs); | |
| ok(V_VT(dp->rgvarg) == (VT_BYREF|VT_VARIANT), "V_VT(dp->rgvarg) = %d\n", V_VT(dp->rgvarg)); | |
| v = V_VARIANTREF(dp->rgvarg); | |
| ok(V_VT(v) == VT_BSTR, "V_VT(url) = %d\n", V_VT(v)); | |
| ok(!strcmp_wa(V_BSTR(v), current_url), "url=%s, expected %s\n", wine_dbgstr_w(V_BSTR(v)), current_url); | |
| ok(V_VT(dp->rgvarg+1) == VT_DISPATCH, "V_VT(dp->rgvarg+1) = %d\n", V_VT(dp->rgvarg+1)); | |
| ok(V_DISPATCH(dp->rgvarg+1) == (IDispatch*)wb, "V_DISPATCH=%p, wb=%p\n", V_DISPATCH(dp->rgvarg+1), wb); | |
| test_ready_state(READYSTATE_COMPLETE); | |
| } | |
| static HRESULT WINAPI WebBrowserEvents2_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid, | |
| LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, | |
| EXCEPINFO *pExcepInfo, UINT *puArgErr) | |
| { | |
| ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n"); | |
| ok(pDispParams != NULL, "pDispParams == NULL\n"); | |
| ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo); | |
| ok(pVarResult == NULL, "pVarResult=%p\n", pVarResult); | |
| ok(wFlags == DISPATCH_METHOD, "wFlags=%08x, expected DISPATCH_METHOD\n", wFlags); | |
| ok(pDispParams->rgdispidNamedArgs == NULL, | |
| "pDispParams->rgdispidNamedArgs = %p\n", pDispParams->rgdispidNamedArgs); | |
| ok(pDispParams->cNamedArgs == 0, "pDispParams->cNamedArgs = %d\n", pDispParams->cNamedArgs); | |
| switch(dispIdMember) { | |
| case DISPID_STATUSTEXTCHANGE: | |
| CHECK_EXPECT2(Invoke_STATUSTEXTCHANGE); | |
| ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n"); | |
| ok(pDispParams->cArgs == 1, "cArgs=%d, expected 1\n", pDispParams->cArgs); | |
| ok(V_VT(pDispParams->rgvarg) == VT_BSTR, "V_VT(pDispParams->rgvarg)=%d, expected VT_BSTR\n", | |
| V_VT(pDispParams->rgvarg)); | |
| ok(V_BSTR(pDispParams->rgvarg) != NULL, "V_BSTR(pDispParams->rgvarg) is NULL\n"); | |
| /* TODO: Check text */ | |
| break; | |
| case DISPID_PROPERTYCHANGE: | |
| CHECK_EXPECT2(Invoke_PROPERTYCHANGE); | |
| ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n"); | |
| ok(pDispParams->cArgs == 1, "cArgs=%d, expected 1\n", pDispParams->cArgs); | |
| /* TODO: Check args */ | |
| break; | |
| case DISPID_DOWNLOADBEGIN: | |
| CHECK_EXPECT2(Invoke_DOWNLOADBEGIN); | |
| ok(pDispParams->rgvarg == NULL, "rgvarg=%p, expected NULL\n", pDispParams->rgvarg); | |
| ok(pDispParams->cArgs == 0, "cArgs=%d, expected 0\n", pDispParams->cArgs); | |
| if(dwl_flags & (DWL_FROM_PUT_HREF|DWL_FROM_GOFORWARD|DWL_FROM_GOBACK)) | |
| test_ready_state(READYSTATE_COMPLETE); | |
| else if(!(dwl_flags & DWL_REFRESH)) /* todo_wine */ | |
| test_ready_state(READYSTATE_LOADING); | |
| break; | |
| case DISPID_BEFORENAVIGATE2: | |
| CHECK_EXPECT(Invoke_BEFORENAVIGATE2); | |
| ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n"); | |
| ok(pDispParams->cArgs == 7, "cArgs=%d, expected 7\n", pDispParams->cArgs); | |
| test_OnBeforeNavigate(pDispParams->rgvarg+6, pDispParams->rgvarg+5, pDispParams->rgvarg+4, | |
| pDispParams->rgvarg+3, pDispParams->rgvarg+2, pDispParams->rgvarg+1, | |
| pDispParams->rgvarg); | |
| test_ready_state((dwl_flags & (DWL_FROM_PUT_HREF|DWL_FROM_GOFORWARD)) ? READYSTATE_COMPLETE : READYSTATE_LOADING); | |
| break; | |
| case DISPID_SETSECURELOCKICON: | |
| CHECK_EXPECT2(Invoke_SETSECURELOCKICON); | |
| ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n"); | |
| ok(pDispParams->cArgs == 1, "cArgs=%d, expected 1\n", pDispParams->cArgs); | |
| /* TODO: Check args */ | |
| break; | |
| case DISPID_FILEDOWNLOAD: | |
| CHECK_EXPECT(Invoke_FILEDOWNLOAD); | |
| ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n"); | |
| ok(pDispParams->cArgs == 2, "cArgs=%d, expected 2\n", pDispParams->cArgs); | |
| /* TODO: Check args */ | |
| break; | |
| case DISPID_COMMANDSTATECHANGE: | |
| ok(pDispParams->rgvarg != NULL, "rgvarg == NULL\n"); | |
| ok(pDispParams->cArgs == 2, "cArgs=%d, expected 2\n", pDispParams->cArgs); | |
| ok(V_VT(pDispParams->rgvarg) == VT_BOOL, "V_VT(pDispParams->rgvarg) = %d\n", V_VT(pDispParams->rgvarg)); | |
| ok(V_VT(pDispParams->rgvarg+1) == VT_I4, "V_VT(pDispParams->rgvarg+1) = %d\n", V_VT(pDispParams->rgvarg+1)); | |
| ok(V_I4(pDispParams->rgvarg+1) == CSC_NAVIGATEFORWARD || | |
| V_I4(pDispParams->rgvarg+1) == CSC_NAVIGATEBACK || | |
| V_I4(pDispParams->rgvarg+1) == CSC_UPDATECOMMANDS, | |
| "V_I4(pDispParams->rgvarg+1) = %x\n", V_I4(pDispParams->rgvarg+1)); | |
| if (V_I4(pDispParams->rgvarg+1) == CSC_NAVIGATEFORWARD) | |
| { | |
| todo_wine_if(nav_forward_todo) { | |
| if(V_BOOL(pDispParams->rgvarg)) | |
| CHECK_EXPECT2(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE); | |
| else | |
| CHECK_EXPECT2(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| } | |
| } | |
| else if (V_I4(pDispParams->rgvarg+1) == CSC_NAVIGATEBACK) | |
| { | |
| todo_wine_if(nav_back_todo) { | |
| if(V_BOOL(pDispParams->rgvarg)) | |
| CHECK_EXPECT2(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE); | |
| else | |
| CHECK_EXPECT2(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| } | |
| } | |
| else if (V_I4(pDispParams->rgvarg+1) == CSC_UPDATECOMMANDS) | |
| { | |
| todo_wine CHECK_EXPECT2(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS); | |
| set_update_commands_enable = V_BOOL(pDispParams->rgvarg); | |
| } | |
| break; | |
| case DISPID_DOWNLOADCOMPLETE: | |
| CHECK_EXPECT2(Invoke_DOWNLOADCOMPLETE); | |
| ok(pDispParams->rgvarg == NULL, "rgvarg=%p, expected NULL\n", pDispParams->rgvarg); | |
| ok(pDispParams->cArgs == 0, "cArgs=%d, expected 0\n", pDispParams->cArgs); | |
| if(use_container_olecmd) | |
| test_ready_state(READYSTATE_LOADING); | |
| break; | |
| case DISPID_ONMENUBAR: | |
| CHECK_EXPECT(Invoke_ONMENUBAR); | |
| test_invoke_bool(pDispParams, TRUE); | |
| break; | |
| case DISPID_ONADDRESSBAR: | |
| CHECK_EXPECT(Invoke_ONADDRESSBAR); | |
| test_invoke_bool(pDispParams, TRUE); | |
| break; | |
| case DISPID_ONSTATUSBAR: | |
| CHECK_EXPECT(Invoke_ONSTATUSBAR); | |
| test_invoke_bool(pDispParams, TRUE); | |
| break; | |
| case DISPID_ONTOOLBAR: | |
| CHECK_EXPECT(Invoke_ONTOOLBAR); | |
| test_invoke_bool(pDispParams, FALSE); | |
| break; | |
| case DISPID_ONFULLSCREEN: | |
| CHECK_EXPECT(Invoke_ONFULLSCREEN); | |
| test_invoke_bool(pDispParams, TRUE); | |
| break; | |
| case DISPID_ONTHEATERMODE: | |
| CHECK_EXPECT(Invoke_ONTHEATERMODE); | |
| test_invoke_bool(pDispParams, TRUE); | |
| break; | |
| case DISPID_WINDOWSETRESIZABLE: | |
| CHECK_EXPECT(Invoke_WINDOWSETRESIZABLE); | |
| test_invoke_bool(pDispParams, TRUE); | |
| break; | |
| case DISPID_TITLECHANGE: | |
| CHECK_EXPECT2(Invoke_TITLECHANGE); | |
| /* FIXME */ | |
| break; | |
| case DISPID_NAVIGATECOMPLETE2: | |
| test_navigatecomplete2(pDispParams); | |
| break; | |
| case DISPID_PROGRESSCHANGE: | |
| CHECK_EXPECT2(Invoke_PROGRESSCHANGE); | |
| /* FIXME */ | |
| break; | |
| case DISPID_DOCUMENTCOMPLETE: | |
| test_documentcomplete(pDispParams); | |
| break; | |
| case DISPID_WINDOWCLOSING: { | |
| VARIANT *is_child = pDispParams->rgvarg+1, *cancel = pDispParams->rgvarg; | |
| CHECK_EXPECT(Invoke_WINDOWCLOSING); | |
| ok(pDispParams->cArgs == 2, "pdp->cArgs = %d\n", pDispParams->cArgs); | |
| ok(V_VT(is_child) == VT_BOOL, "V_VT(is_child) = %d\n", V_VT(is_child)); | |
| ok(!V_BOOL(is_child), "V_BOOL(is_child) = %x\n", V_BOOL(is_child)); | |
| ok(V_VT(cancel) == (VT_BYREF|VT_BOOL), "V_VT(cancel) = %d\n", V_VT(cancel)); | |
| ok(!*V_BOOLREF(cancel), "*V_BOOLREF(cancel) = %x\n", *V_BOOLREF(cancel)); | |
| *V_BOOLREF(cancel) = VARIANT_TRUE; | |
| return S_OK; | |
| } | |
| case DISPID_SETPHISHINGFILTERSTATUS: /* FIXME */ | |
| CHECK_EXPECT2(Invoke_SETPHISHINGFILTERSTATUS); | |
| break; | |
| case DISPID_BEFORESCRIPTEXECUTE: /* FIXME: IE10 */ | |
| break; | |
| case DISPID_PRIVACYIMPACTEDSTATECHANGE: | |
| break; | |
| default: | |
| ok(0, "unexpected dispIdMember %d\n", dispIdMember); | |
| } | |
| return S_OK; | |
| } | |
| static IDispatchVtbl WebBrowserEvents2Vtbl = { | |
| WebBrowserEvents2_QueryInterface, | |
| Dispatch_AddRef, | |
| Dispatch_Release, | |
| Dispatch_GetTypeInfoCount, | |
| Dispatch_GetTypeInfo, | |
| Dispatch_GetIDsOfNames, | |
| WebBrowserEvents2_Invoke | |
| }; | |
| static IDispatch WebBrowserEvents2 = { &WebBrowserEvents2Vtbl }; | |
| static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv) | |
| { | |
| return QueryInterface(riid, ppv); | |
| } | |
| static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface) | |
| { | |
| return 2; | |
| } | |
| static ULONG WINAPI ClientSite_Release(IOleClientSite *iface) | |
| { | |
| return 1; | |
| } | |
| static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker, | |
| IMoniker **ppmon) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer) | |
| { | |
| CHECK_EXPECT(GetContainer); | |
| ok(ppContainer != NULL, "ppContainer == NULL\n"); | |
| if(ppContainer) | |
| *ppContainer = &OleContainer; | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface) | |
| { | |
| CHECK_EXPECT(ShowObject); | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static const IOleClientSiteVtbl ClientSiteVtbl = { | |
| ClientSite_QueryInterface, | |
| ClientSite_AddRef, | |
| ClientSite_Release, | |
| ClientSite_SaveObject, | |
| ClientSite_GetMoniker, | |
| ClientSite_GetContainer, | |
| ClientSite_ShowObject, | |
| ClientSite_OnShowWindow, | |
| ClientSite_RequestNewObjectLayout | |
| }; | |
| static IOleClientSite ClientSite = { &ClientSiteVtbl }; | |
| static IOleClientSite ClientSite2 = { &ClientSiteVtbl }; | |
| static HRESULT WINAPI IOleControlSite_fnQueryInterface(IOleControlSite *iface, REFIID riid, void **ppv) | |
| { | |
| *ppv = NULL; | |
| return E_NOINTERFACE; | |
| } | |
| static ULONG WINAPI IOleControlSite_fnAddRef(IOleControlSite *iface) | |
| { | |
| return 2; | |
| } | |
| static ULONG WINAPI IOleControlSite_fnRelease(IOleControlSite *iface) | |
| { | |
| return 1; | |
| } | |
| static HRESULT WINAPI IOleControlSite_fnOnControlInfoChanged(IOleControlSite* This) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IOleControlSite_fnLockInPlaceActive(IOleControlSite* This, | |
| BOOL fLock) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IOleControlSite_fnGetExtendedControl(IOleControlSite* This, | |
| IDispatch **ppDisp) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IOleControlSite_fnTransformCoords(IOleControlSite* This, | |
| POINTL *pPtlHimetric, | |
| POINTF *pPtfContainer, | |
| DWORD dwFlags) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IOleControlSite_fnTranslateAccelerator(IOleControlSite* This, MSG *pMsg, | |
| DWORD grfModifiers) | |
| { | |
| CHECK_EXPECT(ControlSite_TranslateAccelerator); | |
| return hr_site_TranslateAccelerator; | |
| } | |
| static HRESULT WINAPI IOleControlSite_fnOnFocus(IOleControlSite* This, BOOL fGotFocus) | |
| { | |
| if(fGotFocus) | |
| CHECK_EXPECT2(OnFocus_TRUE); | |
| else | |
| CHECK_EXPECT2(OnFocus_FALSE); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IOleControlSite_fnShowPropertyFrame(IOleControlSite* This) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static IOleControlSiteVtbl ControlSiteVtbl = { | |
| IOleControlSite_fnQueryInterface, | |
| IOleControlSite_fnAddRef, | |
| IOleControlSite_fnRelease, | |
| IOleControlSite_fnOnControlInfoChanged, | |
| IOleControlSite_fnLockInPlaceActive, | |
| IOleControlSite_fnGetExtendedControl, | |
| IOleControlSite_fnTransformCoords, | |
| IOleControlSite_fnTranslateAccelerator, | |
| IOleControlSite_fnOnFocus, | |
| IOleControlSite_fnShowPropertyFrame | |
| }; | |
| static IOleControlSite ControlSite = { &ControlSiteVtbl }; | |
| static HRESULT WINAPI InPlaceUIWindow_QueryInterface(IOleInPlaceFrame *iface, | |
| REFIID riid, void **ppv) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOINTERFACE; | |
| } | |
| static ULONG WINAPI InPlaceUIWindow_AddRef(IOleInPlaceFrame *iface) | |
| { | |
| return 2; | |
| } | |
| static ULONG WINAPI InPlaceUIWindow_Release(IOleInPlaceFrame *iface) | |
| { | |
| return 1; | |
| } | |
| static HRESULT WINAPI InPlaceUIWindow_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd) | |
| { | |
| CHECK_EXPECT(Frame_GetWindow); | |
| ok(phwnd != NULL, "phwnd == NULL\n"); | |
| if(phwnd) | |
| *phwnd = container_hwnd; | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI InPlaceUIWindow_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI InPlaceUIWindow_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI InPlaceUIWindow_RequestBorderSpace(IOleInPlaceFrame *iface, | |
| LPCBORDERWIDTHS pborderwidths) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI InPlaceUIWindow_SetBorderSpace(IOleInPlaceFrame *iface, | |
| LPCBORDERWIDTHS pborderwidths) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface, | |
| IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName) | |
| { | |
| CHECK_EXPECT(UIWindow_SetActiveObject); | |
| if(!test_close) { | |
| ok(pActiveObject != NULL, "pActiveObject = NULL\n"); | |
| ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n"); | |
| } else { | |
| ok(!pActiveObject, "pActiveObject != NULL\n"); | |
| ok(!pszObjName, "pszObjName != NULL\n"); | |
| } | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface, | |
| IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName) | |
| { | |
| CHECK_EXPECT(Frame_SetActiveObject); | |
| if(!test_close) { | |
| ok(pActiveObject != NULL, "pActiveObject = NULL\n"); | |
| ok(!lstrcmpW(pszObjName, wszItem), "unexpected pszObjName\n"); | |
| } else { | |
| ok(!pActiveObject, "pActiveObject != NULL\n"); | |
| ok(!pszObjName, "pszObjName != NULL\n"); | |
| } | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared, | |
| LPOLEMENUGROUPWIDTHS lpMenuWidths) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared, | |
| HOLEMENU holemenu, HWND hwndActiveObject) | |
| { | |
| CHECK_EXPECT(SetMenu); | |
| ok(hmenuShared == NULL, "hmenuShared=%p\n", hmenuShared); | |
| ok(holemenu == NULL, "holemenu=%p\n", holemenu); | |
| ok(hwndActiveObject == shell_embedding_hwnd, "hwndActiveObject=%p, expected %p\n", | |
| hwndActiveObject, shell_embedding_hwnd); | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText) | |
| { | |
| CHECK_EXPECT2(SetStatusText); | |
| /* FIXME: Check pszStatusText */ | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable) | |
| { | |
| if(fEnable) | |
| CHECK_EXPECT2(EnableModeless_TRUE); | |
| else | |
| CHECK_EXPECT2(EnableModeless_FALSE); | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static const IOleInPlaceFrameVtbl InPlaceUIWindowVtbl = { | |
| InPlaceUIWindow_QueryInterface, | |
| InPlaceUIWindow_AddRef, | |
| InPlaceUIWindow_Release, | |
| InPlaceUIWindow_GetWindow, | |
| InPlaceUIWindow_ContextSensitiveHelp, | |
| InPlaceUIWindow_GetBorder, | |
| InPlaceUIWindow_RequestBorderSpace, | |
| InPlaceUIWindow_SetBorderSpace, | |
| InPlaceUIWindow_SetActiveObject, | |
| }; | |
| static IOleInPlaceUIWindow InPlaceUIWindow = { (IOleInPlaceUIWindowVtbl*)&InPlaceUIWindowVtbl }; | |
| static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = { | |
| InPlaceUIWindow_QueryInterface, | |
| InPlaceUIWindow_AddRef, | |
| InPlaceUIWindow_Release, | |
| InPlaceFrame_GetWindow, | |
| InPlaceUIWindow_ContextSensitiveHelp, | |
| InPlaceUIWindow_GetBorder, | |
| InPlaceUIWindow_RequestBorderSpace, | |
| InPlaceUIWindow_SetBorderSpace, | |
| InPlaceFrame_SetActiveObject, | |
| InPlaceFrame_InsertMenus, | |
| InPlaceFrame_SetMenu, | |
| InPlaceFrame_RemoveMenus, | |
| InPlaceFrame_SetStatusText, | |
| InPlaceFrame_EnableModeless, | |
| InPlaceFrame_TranslateAccelerator | |
| }; | |
| static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl }; | |
| static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv) | |
| { | |
| return QueryInterface(riid, ppv); | |
| } | |
| static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSiteEx *iface) | |
| { | |
| return 2; | |
| } | |
| static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSiteEx *iface) | |
| { | |
| return 1; | |
| } | |
| static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd) | |
| { | |
| CHECK_EXPECT(Site_GetWindow); | |
| ok(phwnd != NULL, "phwnd == NULL\n"); | |
| if(phwnd) | |
| *phwnd = container_hwnd; | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface) | |
| { | |
| CHECK_EXPECT(CanInPlaceActivate); | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface) | |
| { | |
| CHECK_EXPECT(OnInPlaceActivate); | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface) | |
| { | |
| CHECK_EXPECT(OnUIActivate); | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface, | |
| IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect, | |
| LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo) | |
| { | |
| static const RECT pos_rect = {2,1,1002,901}; | |
| static const RECT clip_rect = {10,10,990,890}; | |
| CHECK_EXPECT(GetWindowContext); | |
| ok(ppFrame != NULL, "ppFrame = NULL\n"); | |
| if(ppFrame) | |
| *ppFrame = &InPlaceFrame; | |
| ok(ppDoc != NULL, "ppDoc = NULL\n"); | |
| if(ppDoc) | |
| *ppDoc = &InPlaceUIWindow; | |
| ok(lprcPosRect != NULL, "lprcPosRect = NULL\n"); | |
| if(lprcPosRect) | |
| memcpy(lprcPosRect, &pos_rect, sizeof(RECT)); | |
| ok(lprcClipRect != NULL, "lprcClipRect = NULL\n"); | |
| if(lprcClipRect) | |
| memcpy(lprcClipRect, &clip_rect, sizeof(RECT)); | |
| ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n"); | |
| if(lpFrameInfo) { | |
| ok(lpFrameInfo->cb == sizeof(*lpFrameInfo), "lpFrameInfo->cb = %u, expected %u\n", lpFrameInfo->cb, (unsigned)sizeof(*lpFrameInfo)); | |
| lpFrameInfo->fMDIApp = FALSE; | |
| lpFrameInfo->hwndFrame = container_hwnd; | |
| lpFrameInfo->haccel = NULL; | |
| lpFrameInfo->cAccelEntries = 0; | |
| } | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtant) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable) | |
| { | |
| CHECK_EXPECT(OnUIDeactivate); | |
| ok(!fUndoable, "fUndoable should be FALSE\n"); | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface) | |
| { | |
| CHECK_EXPECT(OnInPlaceDeactivate); | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI InPlaceSite_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface, | |
| BOOL *pNoRedraw, DWORD dwFlags) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface, | |
| BOOL fNoRedraw) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI InPlaceSite_RequestUIActivate(IOleInPlaceSiteEx *iface) | |
| { | |
| CHECK_EXPECT2(RequestUIActivate); | |
| return S_OK; | |
| } | |
| static const IOleInPlaceSiteExVtbl InPlaceSiteExVtbl = { | |
| InPlaceSite_QueryInterface, | |
| InPlaceSite_AddRef, | |
| InPlaceSite_Release, | |
| InPlaceSite_GetWindow, | |
| InPlaceSite_ContextSensitiveHelp, | |
| InPlaceSite_CanInPlaceActivate, | |
| InPlaceSite_OnInPlaceActivate, | |
| InPlaceSite_OnUIActivate, | |
| InPlaceSite_GetWindowContext, | |
| InPlaceSite_Scroll, | |
| InPlaceSite_OnUIDeactivate, | |
| InPlaceSite_OnInPlaceDeactivate, | |
| InPlaceSite_DiscardUndoState, | |
| InPlaceSite_DeactivateAndUndo, | |
| InPlaceSite_OnPosRectChange, | |
| InPlaceSite_OnInPlaceActivateEx, | |
| InPlaceSite_OnInPlaceDeactivateEx, | |
| InPlaceSite_RequestUIActivate | |
| }; | |
| static IOleInPlaceSiteEx InPlaceSite = { &InPlaceSiteExVtbl }; | |
| static HRESULT WINAPI DocHostUIHandler_QueryInterface(IDocHostUIHandler2 *iface, REFIID riid, void **ppv) | |
| { | |
| return QueryInterface(riid, ppv); | |
| } | |
| static ULONG WINAPI DocHostUIHandler_AddRef(IDocHostUIHandler2 *iface) | |
| { | |
| return 2; | |
| } | |
| static ULONG WINAPI DocHostUIHandler_Release(IDocHostUIHandler2 *iface) | |
| { | |
| return 1; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_ShowContextMenu(IDocHostUIHandler2 *iface, DWORD dwID, POINT *ppt, | |
| IUnknown *pcmdtReserved, IDispatch *pdicpReserved) | |
| { | |
| ok(0, "unexpected call %d %p %p %p\n", dwID, ppt, pcmdtReserved, pdicpReserved); | |
| return S_FALSE; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_GetHostInfo(IDocHostUIHandler2 *iface, DOCHOSTUIINFO *pInfo) | |
| { | |
| CHECK_EXPECT2(GetHostInfo); | |
| ok(pInfo != NULL, "pInfo=NULL\n"); | |
| if(pInfo) { | |
| ok(pInfo->cbSize == sizeof(DOCHOSTUIINFO) || broken(!pInfo->cbSize), "pInfo->cbSize=%u\n", pInfo->cbSize); | |
| ok(!pInfo->dwFlags, "pInfo->dwFlags=%08x, expected 0\n", pInfo->dwFlags); | |
| ok(!pInfo->dwDoubleClick, "pInfo->dwDoubleClick=%08x, expected 0\n", pInfo->dwDoubleClick); | |
| ok(!pInfo->pchHostCss, "pInfo->pchHostCss=%p, expected NULL\n", pInfo->pchHostCss); | |
| ok(!pInfo->pchHostNS, "pInfo->pchhostNS=%p, expected NULL\n", pInfo->pchHostNS); | |
| } | |
| return E_FAIL; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD dwID, | |
| IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget, | |
| IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc) | |
| { | |
| CHECK_EXPECT(ShowUI); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_HideUI(IDocHostUIHandler2 *iface) | |
| { | |
| CHECK_EXPECT(HideUI); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface) | |
| { | |
| CHECK_EXPECT2(UpdateUI); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable) | |
| { | |
| if(fEnable) | |
| CHECK_EXPECT(DocHost_EnableModeless_TRUE); | |
| else | |
| CHECK_EXPECT(DocHost_EnableModeless_FALSE); | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_OnDocWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_OnFrameWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_ResizeBorder(IDocHostUIHandler2 *iface, LPCRECT prcBorder, | |
| IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_TranslateAccelerator(IDocHostUIHandler2 *iface, LPMSG lpMsg, | |
| const GUID *pguidCmdGroup, DWORD nCmdID) | |
| { | |
| CHECK_EXPECT(DocHost_TranslateAccelerator); | |
| ok(pguidCmdGroup != NULL, "Got NULL pguidCmdGroup.\n"); | |
| if(pguidCmdGroup) | |
| ok(IsEqualGUID(pguidCmdGroup, &CGID_MSHTML), "Unexpected pguidCmdGroup\n"); | |
| ok(lpMsg != NULL, "Got NULL lpMsg.\n"); | |
| return hr_dochost_TranslateAccelerator; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_GetOptionKeyPath(IDocHostUIHandler2 *iface, | |
| LPOLESTR *pchKey, DWORD dw) | |
| { | |
| CHECK_EXPECT(GetOptionKeyPath); | |
| ok(pchKey != NULL, "pchKey==NULL\n"); | |
| if(pchKey) | |
| ok(*pchKey == NULL, "*pchKey=%p\n", *pchKey); | |
| ok(!dw, "dw=%x\n", dw); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_GetDropTarget(IDocHostUIHandler2 *iface, | |
| IDropTarget *pDropTarget, IDropTarget **ppDropTarget) | |
| { | |
| CHECK_EXPECT(GetDropTarget); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, IDispatch **ppDispatch) | |
| { | |
| CHECK_EXPECT(GetExternal); | |
| *ppDispatch = NULL; | |
| return S_FALSE; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate, | |
| OLECHAR *pchURLIn, OLECHAR **ppchURLOut) | |
| { | |
| todo_wine_if(is_downloading && !(dwl_flags & DWL_EXPECT_BEFORE_NAVIGATE)) | |
| CHECK_EXPECT(TranslateUrl); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_FilterDataObject(IDocHostUIHandler2 *iface, IDataObject *pDO, | |
| IDataObject **ppPORet) | |
| { | |
| ok(0, "unexpected call\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI DocHostUIHandler_GetOverrideKeyPath(IDocHostUIHandler2 *iface, | |
| LPOLESTR *pchKey, DWORD dw) | |
| { | |
| CHECK_EXPECT(GetOverridesKeyPath); | |
| ok(pchKey != NULL, "pchKey==NULL\n"); | |
| if(pchKey) | |
| ok(*pchKey == NULL, "*pchKey=%p\n", *pchKey); | |
| ok(!dw, "dw=%x\n", dw); | |
| return E_NOTIMPL; | |
| } | |
| static const IDocHostUIHandler2Vtbl DocHostUIHandlerVtbl = { | |
| DocHostUIHandler_QueryInterface, | |
| DocHostUIHandler_AddRef, | |
| DocHostUIHandler_Release, | |
| DocHostUIHandler_ShowContextMenu, | |
| DocHostUIHandler_GetHostInfo, | |
| DocHostUIHandler_ShowUI, | |
| DocHostUIHandler_HideUI, | |
| DocHostUIHandler_UpdateUI, | |
| DocHostUIHandler_EnableModeless, | |
| DocHostUIHandler_OnDocWindowActivate, | |
| DocHostUIHandler_OnFrameWindowActivate, | |
| DocHostUIHandler_ResizeBorder, | |
| DocHostUIHandler_TranslateAccelerator, | |
| DocHostUIHandler_GetOptionKeyPath, | |
| DocHostUIHandler_GetDropTarget, | |
| DocHostUIHandler_GetExternal, | |
| DocHostUIHandler_TranslateUrl, | |
| DocHostUIHandler_FilterDataObject, | |
| DocHostUIHandler_GetOverrideKeyPath | |
| }; | |
| static IDocHostUIHandler2 DocHostUIHandler = { &DocHostUIHandlerVtbl }; | |
| static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv) | |
| { | |
| return QueryInterface(riid, ppv); | |
| } | |
| static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface) | |
| { | |
| return 2; | |
| } | |
| static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface) | |
| { | |
| return 1; | |
| } | |
| static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, | |
| REFGUID guidService, REFIID riid, void **ppv) | |
| { | |
| *ppv = NULL; | |
| if(!winetest_interactive) | |
| return E_NOINTERFACE; | |
| if (IsEqualGUID(&SID_STopLevelBrowser, guidService)) | |
| trace("Service SID_STopLevelBrowser\n"); | |
| else if (IsEqualGUID(&SID_SEditCommandTarget, guidService)) | |
| trace("Service SID_SEditCommandTarget\n"); | |
| else if (IsEqualGUID(&IID_ITargetFrame2, guidService)) | |
| trace("Service IID_ITargetFrame2\n"); | |
| else if (IsEqualGUID(&SID_SInternetSecurityManager, guidService)) | |
| trace("Service SID_SInternetSecurityManager\n"); | |
| else if (IsEqualGUID(&SID_SOleUndoManager, guidService)) | |
| trace("Service SID_SOleUndoManager\n"); | |
| else if (IsEqualGUID(&SID_IMimeInfo, guidService)) | |
| trace("Service SID_IMimeInfo\n"); | |
| else if (IsEqualGUID(&SID_STopWindow, guidService)) | |
| trace("Service SID_STopWindow\n"); | |
| /* 30D02401-6A81-11D0-8274-00C04FD5AE38 Explorer Bar: Search */ | |
| /* D1E7AFEC-6A2E-11D0-8C78-00C04FD918B4 no info */ | |
| /* A9227C3C-7F8E-11D0-8CB0-00A0C92DBFE8 no info */ | |
| /* 371EA634-DC5C-11D1-BA57-00C04FC2040E one reference to IVersionHost */ | |
| /* 3050F429-98B5-11CF-BB82-00AA00BDCE0B IID_IElementBehaviorFactory */ | |
| /* 6D12FE80-7911-11CF-9534-0000C05BAE0B SID_DefView */ | |
| /* AD7F6C62-F6BD-11D2-959B-006097C553C8 no info */ | |
| /* 53A2D5B1-D2FC-11D0-84E0-006097C9987D no info */ | |
| /* 3050F312-98B5-11CF-BB82-00AA00BDCE0B HTMLFrameBaseClass */ | |
| /* 639447BD-B2D3-44B9-9FB0-510F23CB45E4 no info */ | |
| /* 20C46561-8491-11CF-960C-0080C7F4EE85 no info */ | |
| else | |
| trace("Service %s not supported\n", wine_dbgstr_guid(guidService)); | |
| return E_NOINTERFACE; | |
| } | |
| static const IServiceProviderVtbl ServiceProviderVtbl = { | |
| ServiceProvider_QueryInterface, | |
| ServiceProvider_AddRef, | |
| ServiceProvider_Release, | |
| ServiceProvider_QueryService | |
| }; | |
| static IServiceProvider ServiceProvider = { &ServiceProviderVtbl }; | |
| static HRESULT QueryInterface(REFIID riid, void **ppv) | |
| { | |
| *ppv = NULL; | |
| if(IsEqualGUID(&IID_IUnknown, riid) | |
| || IsEqualGUID(&IID_IOleClientSite, riid)) | |
| *ppv = &ClientSite; | |
| else if(IsEqualGUID(&IID_IOleWindow, riid) | |
| || IsEqualGUID(&IID_IOleInPlaceSite, riid) | |
| || IsEqualGUID(&IID_IOleInPlaceSiteEx, riid)) | |
| *ppv = &InPlaceSite; | |
| else if(IsEqualGUID(&IID_IDocHostUIHandler, riid) | |
| || IsEqualGUID(&IID_IDocHostUIHandler2, riid)) | |
| *ppv = use_container_dochostui ? &DocHostUIHandler : NULL; | |
| else if(IsEqualGUID(&IID_IDispatch, riid)) | |
| *ppv = &Dispatch; | |
| else if(IsEqualGUID(&IID_IServiceProvider, riid)) | |
| *ppv = &ServiceProvider; | |
| else if(IsEqualGUID(&IID_IDocHostShowUI, riid)) | |
| trace("interface IID_IDocHostShowUI\n"); | |
| else if(IsEqualGUID(&IID_IOleControlSite, riid)) | |
| *ppv = &ControlSite; | |
| else if(IsEqualGUID(&IID_IOleCommandTarget, riid)) | |
| trace("interface IID_IOleCommandTarget\n"); | |
| /* B6EA2050-048A-11D1-82B9-00C04FB9942E IAxWinHostWindow */ | |
| else | |
| { | |
| /* are there more interfaces, that a host can support? */ | |
| trace("%s: interface not supported\n", wine_dbgstr_guid(riid)); | |
| } | |
| return (*ppv) ? S_OK : E_NOINTERFACE; | |
| } | |
| static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) | |
| { | |
| return DefWindowProcW(hwnd, msg, wParam, lParam); | |
| } | |
| static HWND create_container_window(void) | |
| { | |
| static const WCHAR wszWebBrowserContainer[] = | |
| {'W','e','b','B','r','o','w','s','e','r','C','o','n','t','a','i','n','e','r',0}; | |
| static WNDCLASSEXW wndclass = { | |
| sizeof(WNDCLASSEXW), | |
| 0, | |
| wnd_proc, | |
| 0, 0, NULL, NULL, NULL, NULL, NULL, | |
| wszWebBrowserContainer, | |
| NULL | |
| }; | |
| RegisterClassExW(&wndclass); | |
| return CreateWindowW(wszWebBrowserContainer, wszWebBrowserContainer, | |
| WS_OVERLAPPEDWINDOW, 10, 10, 600, 600, NULL, NULL, NULL, NULL); | |
| } | |
| static void test_DoVerb(IWebBrowser2 *unk) | |
| { | |
| IOleObject *oleobj; | |
| RECT rect = {0,0,1000,1000}; | |
| HRESULT hres; | |
| hres = IWebBrowser2_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj); | |
| ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres); | |
| if(FAILED(hres)) | |
| return; | |
| SET_EXPECT(CanInPlaceActivate); | |
| SET_EXPECT(Site_GetWindow); | |
| SET_EXPECT(OnInPlaceActivate); | |
| SET_EXPECT(GetWindowContext); | |
| SET_EXPECT(ShowObject); | |
| SET_EXPECT(GetContainer); | |
| SET_EXPECT(Frame_GetWindow); | |
| SET_EXPECT(OnUIActivate); | |
| SET_EXPECT(Frame_SetActiveObject); | |
| SET_EXPECT(UIWindow_SetActiveObject); | |
| SET_EXPECT(SetMenu); | |
| SET_EXPECT(OnFocus_TRUE); | |
| hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite, | |
| 0, (HWND)0xdeadbeef, &rect); | |
| ok(hres == S_OK, "DoVerb failed: %08x\n", hres); | |
| CHECK_CALLED(CanInPlaceActivate); | |
| CHECK_CALLED(Site_GetWindow); | |
| CHECK_CALLED(OnInPlaceActivate); | |
| CHECK_CALLED(GetWindowContext); | |
| CHECK_CALLED(ShowObject); | |
| CHECK_CALLED(GetContainer); | |
| CHECK_CALLED(Frame_GetWindow); | |
| CHECK_CALLED(OnUIActivate); | |
| CHECK_CALLED(Frame_SetActiveObject); | |
| CHECK_CALLED(UIWindow_SetActiveObject); | |
| CHECK_CALLED(SetMenu); | |
| CHECK_CALLED(OnFocus_TRUE); | |
| hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite, | |
| 0, (HWND)0xdeadbeef, &rect); | |
| ok(hres == S_OK, "DoVerb failed: %08x\n", hres); | |
| IOleObject_Release(oleobj); | |
| } | |
| static void call_DoVerb(IWebBrowser2 *unk, LONG verb) | |
| { | |
| IOleObject *oleobj; | |
| RECT rect = {60,60,600,600}; | |
| HRESULT hres; | |
| hres = IWebBrowser2_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj); | |
| ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres); | |
| if(FAILED(hres)) | |
| return; | |
| hres = IOleObject_DoVerb(oleobj, verb, NULL, &ClientSite, | |
| -1, container_hwnd, &rect); | |
| ok(hres == S_OK, "DoVerb failed: %08x\n", hres); | |
| IOleObject_Release(oleobj); | |
| } | |
| static HWND get_hwnd(IWebBrowser2 *unk) | |
| { | |
| IOleInPlaceObject *inplace; | |
| HWND hwnd; | |
| HRESULT hres; | |
| hres = IWebBrowser2_QueryInterface(unk, &IID_IOleInPlaceObject, (void**)&inplace); | |
| ok(hres == S_OK, "QueryInterface(IID_OleInPlaceObject) failed: %08x\n", hres); | |
| hres = IOleInPlaceObject_GetWindow(inplace, &hwnd); | |
| ok(hres == S_OK, "GetWindow failed: %08x\n", hres); | |
| IOleInPlaceObject_Release(inplace); | |
| return hwnd; | |
| } | |
| static void test_GetMiscStatus(IOleObject *oleobj) | |
| { | |
| DWORD st, i; | |
| HRESULT hres; | |
| for(i=0; i<10; i++) { | |
| st = 0xdeadbeef; | |
| hres = IOleObject_GetMiscStatus(oleobj, i, &st); | |
| ok(hres == S_OK, "GetMiscStatus failed: %08x\n", hres); | |
| ok(st == (OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT | |
| |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE), | |
| "st=%08x, expected OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|" | |
| "OLEMISC_INSIDEOUT|OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE)\n", st); | |
| } | |
| } | |
| static void test_SetHostNames(IOleObject *oleobj) | |
| { | |
| HRESULT hres; | |
| static const WCHAR test_appW[] = {'t','e','s','t',' ','a','p','p',0}; | |
| hres = IOleObject_SetHostNames(oleobj, test_appW, (void*)0xdeadbeef); | |
| ok(hres == S_OK, "SetHostNames failed: %08x\n", hres); | |
| } | |
| static void test_ClientSite(IWebBrowser2 *unk, IOleClientSite *client, BOOL stop_download) | |
| { | |
| IOleObject *oleobj; | |
| IOleInPlaceObject *inplace; | |
| HWND hwnd; | |
| HRESULT hres; | |
| hres = IWebBrowser2_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj); | |
| ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres); | |
| if(FAILED(hres)) | |
| return; | |
| test_GetMiscStatus(oleobj); | |
| test_SetHostNames(oleobj); | |
| hres = IWebBrowser2_QueryInterface(unk, &IID_IOleInPlaceObject, (void**)&inplace); | |
| ok(hres == S_OK, "QueryInterface(IID_OleInPlaceObject) failed: %08x\n", hres); | |
| if(FAILED(hres)) { | |
| IOleObject_Release(oleobj); | |
| return; | |
| } | |
| hres = IOleInPlaceObject_GetWindow(inplace, &hwnd); | |
| ok(hres == S_OK, "GetWindow failed: %08x\n", hres); | |
| ok((hwnd == NULL) ^ (client == NULL), "unexpected hwnd %p\n", hwnd); | |
| if(client) { | |
| SET_EXPECT(GetContainer); | |
| SET_EXPECT(Site_GetWindow); | |
| SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| SET_EXPECT(Invoke_AMBIENT_SILENT); | |
| }else if(stop_download) { | |
| if (use_container_olecmd) { | |
| SET_EXPECT(Exec_SETDOWNLOADSTATE_0); | |
| SET_EXPECT(Invoke_DOWNLOADCOMPLETE); | |
| } | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| expect_update_commands_enable = 0; | |
| set_update_commands_enable = 0xdead; | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS); | |
| }else { | |
| SET_EXPECT(Invoke_STATUSTEXTCHANGE); | |
| SET_EXPECT(Invoke_PROGRESSCHANGE); | |
| nav_back_todo = nav_forward_todo = TRUE; | |
| } | |
| hres = IOleObject_SetClientSite(oleobj, client); | |
| ok(hres == S_OK, "SetClientSite failed: %08x\n", hres); | |
| if(client) { | |
| CHECK_CALLED(GetContainer); | |
| CHECK_CALLED(Site_GetWindow); | |
| CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| CHECK_CALLED(Invoke_AMBIENT_SILENT); | |
| }else if(stop_download) { | |
| if (use_container_olecmd) { | |
| todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0); | |
| todo_wine CHECK_CALLED(Invoke_DOWNLOADCOMPLETE); | |
| } | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS); | |
| todo_wine ok(expect_update_commands_enable == set_update_commands_enable, | |
| "got %d\n", set_update_commands_enable); | |
| }else { | |
| CLEAR_CALLED(Invoke_STATUSTEXTCHANGE); /* Called by IE9 */ | |
| CLEAR_CALLED(Invoke_PROGRESSCHANGE); | |
| nav_back_todo = nav_forward_todo = FALSE; | |
| } | |
| hres = IOleInPlaceObject_GetWindow(inplace, &hwnd); | |
| ok(hres == S_OK, "GetWindow failed: %08x\n", hres); | |
| ok((hwnd == NULL) == (client == NULL), "unexpected hwnd %p\n", hwnd); | |
| shell_embedding_hwnd = hwnd; | |
| test_SetHostNames(oleobj); | |
| IOleInPlaceObject_Release(inplace); | |
| IOleObject_Release(oleobj); | |
| } | |
| static void test_change_ClientSite(IWebBrowser2 *unk) | |
| { | |
| BOOL old_use_container_olecmd = use_container_olecmd; | |
| IOleClientSite *doc_clientsite; | |
| IOleInPlaceObject *inplace; | |
| IOleCommandTarget *olecmd; | |
| IOleObject *oleobj; | |
| HRESULT hres; | |
| HWND hwnd; | |
| hres = IWebBrowser2_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj); | |
| ok(hres == S_OK, "QueryInterface(IID_OleObject) failed: %08x\n", hres); | |
| if(FAILED(hres)) | |
| return; | |
| use_container_olecmd = FALSE; | |
| SET_EXPECT(Site_GetWindow); | |
| SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| SET_EXPECT(Invoke_AMBIENT_SILENT); | |
| hres = IOleObject_SetClientSite(oleobj, &ClientSite2); | |
| ok(hres == S_OK, "SetClientSite failed: %08x\n", hres); | |
| IOleObject_Release(oleobj); | |
| CHECK_CALLED(Site_GetWindow); | |
| CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| CHECK_CALLED(Invoke_AMBIENT_SILENT); | |
| doc_clientsite = get_dochost(unk); | |
| hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IOleCommandTarget, (void**)&olecmd); | |
| ok(hres == S_OK, "QueryInterface(IOleCommandTarget) failed: %08x\n", hres); | |
| IOleClientSite_Release(doc_clientsite); | |
| hres = IWebBrowser2_QueryInterface(unk, &IID_IOleInPlaceObject, (void**)&inplace); | |
| ok(hres == S_OK, "QueryInterface(OleInPlaceObject) failed: %08x\n", hres); | |
| hres = IOleInPlaceObject_GetWindow(inplace, &hwnd); | |
| ok(hres == S_OK, "GetWindow failed: %08x\n", hres); | |
| ok(hwnd == shell_embedding_hwnd, "unexpected hwnd %p\n", hwnd); | |
| IOleInPlaceObject_Release(inplace); | |
| if(old_use_container_olecmd) { | |
| SET_EXPECT(Exec_UPDATECOMMANDS); | |
| hres = IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_UPDATECOMMANDS, | |
| OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL); | |
| ok(hres == S_OK, "Exec(OLECMDID_UPDATECOMMAND) failed: %08x\n", hres); | |
| CHECK_CALLED(Exec_UPDATECOMMANDS); | |
| use_container_olecmd = TRUE; | |
| } | |
| IOleCommandTarget_Release(olecmd); | |
| } | |
| static void test_ClassInfo(IWebBrowser2 *unk) | |
| { | |
| IProvideClassInfo2 *class_info; | |
| TYPEATTR *type_attr; | |
| ITypeInfo *typeinfo; | |
| GUID guid; | |
| HRESULT hres; | |
| hres = IWebBrowser2_QueryInterface(unk, &IID_IProvideClassInfo2, (void**)&class_info); | |
| ok(hres == S_OK, "QueryInterface(IID_IProvideClassInfo) failed: %08x\n", hres); | |
| if(FAILED(hres)) | |
| return; | |
| hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, &guid); | |
| ok(hres == S_OK, "GetGUID failed: %08x\n", hres); | |
| ok(IsEqualGUID(wb_version > 1 ? &DIID_DWebBrowserEvents2 : &DIID_DWebBrowserEvents, &guid), "wrong guid\n"); | |
| hres = IProvideClassInfo2_GetGUID(class_info, 0, &guid); | |
| ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres); | |
| ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n"); | |
| hres = IProvideClassInfo2_GetGUID(class_info, 2, &guid); | |
| ok(hres == E_FAIL, "GetGUID failed: %08x, expected E_FAIL\n", hres); | |
| ok(IsEqualGUID(&IID_NULL, &guid), "wrong guid\n"); | |
| hres = IProvideClassInfo2_GetGUID(class_info, GUIDKIND_DEFAULT_SOURCE_DISP_IID, NULL); | |
| ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres); | |
| hres = IProvideClassInfo2_GetGUID(class_info, 0, NULL); | |
| ok(hres == E_POINTER, "GetGUID failed: %08x, expected E_POINTER\n", hres); | |
| typeinfo = NULL; | |
| hres = IProvideClassInfo2_GetClassInfo(class_info, &typeinfo); | |
| ok(hres == S_OK, "GetClassInfo failed: %08x\n", hres); | |
| ok(typeinfo != NULL, "typeinfo == NULL\n"); | |
| hres = ITypeInfo_GetTypeAttr(typeinfo, &type_attr); | |
| ok(hres == S_OK, "GetTypeAtr failed: %08x\n", hres); | |
| ok(IsEqualGUID(&type_attr->guid, wb_version > 1 ? &CLSID_WebBrowser : &CLSID_WebBrowser_V1), | |
| "guid = %s\n", wine_dbgstr_guid(&type_attr->guid)); | |
| ITypeInfo_ReleaseTypeAttr(typeinfo, type_attr); | |
| ITypeInfo_Release(typeinfo); | |
| IProvideClassInfo2_Release(class_info); | |
| } | |
| #define expect_oleverb(a,b) _expect_oleverb(__LINE__,a,b) | |
| static void _expect_oleverb(unsigned line, const OLEVERB *verb, LONG exverb) | |
| { | |
| ok_(__FILE__,line)(verb->lVerb == exverb, "verb->lVerb = %d, expected %d\n", verb->lVerb, exverb); | |
| ok_(__FILE__,line)(!verb->lpszVerbName, "verb->lpszVerbName = %s\n", wine_dbgstr_w(verb->lpszVerbName)); | |
| ok_(__FILE__,line)(!verb->fuFlags, "verb->fuFlags = %x\n", verb->fuFlags); | |
| ok_(__FILE__,line)(!verb->grfAttribs, "verb->grfAttribs = %x\n", verb->grfAttribs); | |
| } | |
| #define test_next_oleverb(a,b) _test_next_oleverb(__LINE__,a,b) | |
| static void _test_next_oleverb(unsigned line, IEnumOLEVERB *enum_verbs, LONG exverb) | |
| { | |
| ULONG fetched = 0xdeadbeef; | |
| OLEVERB verb; | |
| HRESULT hres; | |
| fetched = 0xdeadbeef; | |
| memset(&verb, 0xa, sizeof(verb)); | |
| hres = IEnumOLEVERB_Next(enum_verbs, 1, &verb, &fetched); | |
| ok_(__FILE__,line)(hres == S_OK, "Next failed: %08x\n", hres); | |
| ok_(__FILE__,line)(!fetched, "fetched = %d\n", fetched); | |
| _expect_oleverb(line, &verb, exverb); | |
| } | |
| static void test_EnumVerbs(IWebBrowser2 *wb) | |
| { | |
| IEnumOLEVERB *enum_verbs; | |
| IOleObject *oleobj; | |
| OLEVERB verbs[20]; | |
| ULONG fetched; | |
| HRESULT hres; | |
| hres = IWebBrowser2_QueryInterface(wb, &IID_IOleObject, (void**)&oleobj); | |
| ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08x\n", hres); | |
| hres = IOleObject_EnumVerbs(oleobj, &enum_verbs); | |
| IOleObject_Release(oleobj); | |
| ok(hres == S_OK, "EnumVerbs failed: %08x\n", hres); | |
| ok(enum_verbs != NULL, "enum_verbs == NULL\n"); | |
| fetched = 0xdeadbeef; | |
| memset(verbs, 0xa, sizeof(verbs)); | |
| verbs[1].lVerb = 0xdeadbeef; | |
| hres = IEnumOLEVERB_Next(enum_verbs, sizeof(verbs)/sizeof(*verbs), verbs, &fetched); | |
| ok(hres == S_OK, "Next failed: %08x\n", hres); | |
| ok(!fetched, "fetched = %d\n", fetched); | |
| /* Although fetched==0, an element is returned. */ | |
| expect_oleverb(verbs, OLEIVERB_PRIMARY); | |
| /* The first argument is ignored and always one element is returned. */ | |
| ok(verbs[1].lVerb == 0xdeadbeef, "verbs[1].lVerb = %x\n", verbs[1].lVerb); | |
| test_next_oleverb(enum_verbs, OLEIVERB_INPLACEACTIVATE); | |
| test_next_oleverb(enum_verbs, OLEIVERB_UIACTIVATE); | |
| test_next_oleverb(enum_verbs, OLEIVERB_SHOW); | |
| test_next_oleverb(enum_verbs, OLEIVERB_HIDE); | |
| /* There is anouther verb, returned correctly. */ | |
| fetched = 0xdeadbeef; | |
| memset(verbs, 0xa, sizeof(verbs)); | |
| verbs[0].lVerb = 0xdeadbeef; | |
| hres = IEnumOLEVERB_Next(enum_verbs, sizeof(verbs)/sizeof(*verbs), verbs, &fetched); | |
| todo_wine ok(hres == S_OK, "Next failed: %08x\n", hres); | |
| todo_wine ok(fetched == 1, "fetched = %d\n", fetched); | |
| todo_wine ok(verbs[0].lVerb != 0xdeadbeef, "verbs[0].lVerb = %x\n", verbs[0].lVerb); | |
| hres = IEnumOLEVERB_Next(enum_verbs, sizeof(verbs)/sizeof(*verbs), verbs, &fetched); | |
| ok(hres == S_FALSE, "Next failed: %08x\n", hres); | |
| ok(!fetched, "fetched = %d\n", fetched); | |
| hres = IEnumOLEVERB_Reset(enum_verbs); | |
| ok(hres == S_OK, "Reset failed: %08x\n", hres); | |
| fetched = 0xdeadbeef; | |
| hres = IEnumOLEVERB_Next(enum_verbs, 1, verbs, &fetched); | |
| ok(hres == S_OK, "Next failed: %08x\n", hres); | |
| ok(!fetched, "fetched = %d\n", fetched); | |
| hres = IEnumOLEVERB_Next(enum_verbs, 1, verbs, NULL); | |
| ok(hres == S_OK, "Next failed: %08x\n", hres); | |
| hres = IEnumOLEVERB_Skip(enum_verbs, 20); | |
| ok(hres == S_OK, "Reset failed: %08x\n", hres); | |
| fetched = 0xdeadbeef; | |
| hres = IEnumOLEVERB_Next(enum_verbs, 1, verbs, &fetched); | |
| ok(hres == S_OK, "Next failed: %08x\n", hres); | |
| ok(!fetched, "fetched = %d\n", fetched); | |
| test_next_oleverb(enum_verbs, OLEIVERB_SHOW); | |
| IEnumOLEVERB_Release(enum_verbs); | |
| } | |
| static void test_ie_funcs(IWebBrowser2 *wb) | |
| { | |
| IDispatch *disp; | |
| VARIANT_BOOL b; | |
| int i; | |
| SHANDLE_PTR hwnd; | |
| HRESULT hres; | |
| BSTR sName; | |
| /* HWND */ | |
| hwnd = 0xdeadbeef; | |
| hres = IWebBrowser2_get_HWND(wb, &hwnd); | |
| ok(hres == E_FAIL, "get_HWND failed: %08x, expected E_FAIL\n", hres); | |
| ok(hwnd == 0, "unexpected hwnd %p\n", (PVOID)hwnd); | |
| /* MenuBar */ | |
| hres = IWebBrowser2_get_MenuBar(wb, &b); | |
| ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres); | |
| ok(b == VARIANT_TRUE, "b=%x\n", b); | |
| SET_EXPECT(Invoke_ONMENUBAR); | |
| hres = IWebBrowser2_put_MenuBar(wb, (exvb = VARIANT_FALSE)); | |
| ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONMENUBAR); | |
| hres = IWebBrowser2_get_MenuBar(wb, &b); | |
| ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres); | |
| ok(b == VARIANT_FALSE, "b=%x\n", b); | |
| SET_EXPECT(Invoke_ONMENUBAR); | |
| hres = IWebBrowser2_put_MenuBar(wb, (exvb = 100)); | |
| ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONMENUBAR); | |
| hres = IWebBrowser2_get_MenuBar(wb, &b); | |
| ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres); | |
| ok(b == VARIANT_TRUE, "b=%x\n", b); | |
| /* AddressBar */ | |
| hres = IWebBrowser2_get_AddressBar(wb, &b); | |
| ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres); | |
| ok(b == VARIANT_TRUE, "b=%x\n", b); | |
| SET_EXPECT(Invoke_ONADDRESSBAR); | |
| hres = IWebBrowser2_put_AddressBar(wb, (exvb = VARIANT_FALSE)); | |
| ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONADDRESSBAR); | |
| hres = IWebBrowser2_get_AddressBar(wb, &b); | |
| ok(hres == S_OK, "get_MenuBar failed: %08x\n", hres); | |
| ok(b == VARIANT_FALSE, "b=%x\n", b); | |
| SET_EXPECT(Invoke_ONADDRESSBAR); | |
| hres = IWebBrowser2_put_AddressBar(wb, (exvb = 100)); | |
| ok(hres == S_OK, "put_AddressBar failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONADDRESSBAR); | |
| hres = IWebBrowser2_get_AddressBar(wb, &b); | |
| ok(hres == S_OK, "get_AddressBar failed: %08x\n", hres); | |
| ok(b == VARIANT_TRUE, "b=%x\n", b); | |
| SET_EXPECT(Invoke_ONADDRESSBAR); | |
| hres = IWebBrowser2_put_AddressBar(wb, (exvb = VARIANT_TRUE)); | |
| ok(hres == S_OK, "put_MenuBar failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONADDRESSBAR); | |
| /* StatusBar */ | |
| hres = IWebBrowser2_get_StatusBar(wb, &b); | |
| ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres); | |
| ok(b == VARIANT_TRUE, "b=%x\n", b); | |
| SET_EXPECT(Invoke_ONSTATUSBAR); | |
| hres = IWebBrowser2_put_StatusBar(wb, (exvb = VARIANT_TRUE)); | |
| ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONSTATUSBAR); | |
| hres = IWebBrowser2_get_StatusBar(wb, &b); | |
| ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres); | |
| ok(b == VARIANT_TRUE, "b=%x\n", b); | |
| SET_EXPECT(Invoke_ONSTATUSBAR); | |
| hres = IWebBrowser2_put_StatusBar(wb, (exvb = VARIANT_FALSE)); | |
| ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONSTATUSBAR); | |
| hres = IWebBrowser2_get_StatusBar(wb, &b); | |
| ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres); | |
| ok(b == VARIANT_FALSE, "b=%x\n", b); | |
| SET_EXPECT(Invoke_ONSTATUSBAR); | |
| hres = IWebBrowser2_put_StatusBar(wb, (exvb = 100)); | |
| ok(hres == S_OK, "put_StatusBar failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONSTATUSBAR); | |
| hres = IWebBrowser2_get_StatusBar(wb, &b); | |
| ok(hres == S_OK, "get_StatusBar failed: %08x\n", hres); | |
| ok(b == VARIANT_TRUE, "b=%x\n", b); | |
| /* ToolBar */ | |
| hres = IWebBrowser2_get_ToolBar(wb, &i); | |
| ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres); | |
| ok(i, "i=%x\n", i); | |
| SET_EXPECT(Invoke_ONTOOLBAR); | |
| hres = IWebBrowser2_put_ToolBar(wb, (exvb = VARIANT_FALSE)); | |
| ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONTOOLBAR); | |
| hres = IWebBrowser2_get_ToolBar(wb, &i); | |
| ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres); | |
| ok(i == VARIANT_FALSE, "b=%x\n", i); | |
| SET_EXPECT(Invoke_ONTOOLBAR); | |
| hres = IWebBrowser2_put_ToolBar(wb, (exvb = 100)); | |
| ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONTOOLBAR); | |
| hres = IWebBrowser2_get_ToolBar(wb, &i); | |
| ok(hres == S_OK, "get_ToolBar failed: %08x\n", hres); | |
| ok(i, "i=%x\n", i); | |
| SET_EXPECT(Invoke_ONTOOLBAR); | |
| hres = IWebBrowser2_put_ToolBar(wb, (exvb = VARIANT_TRUE)); | |
| ok(hres == S_OK, "put_ToolBar failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONTOOLBAR); | |
| /* FullScreen */ | |
| hres = IWebBrowser2_get_FullScreen(wb, &b); | |
| ok(hres == S_OK, "get_FullScreen failed: %08x\n", hres); | |
| ok(b == VARIANT_FALSE, "b=%x\n", b); | |
| SET_EXPECT(Invoke_ONFULLSCREEN); | |
| hres = IWebBrowser2_put_FullScreen(wb, (exvb = VARIANT_TRUE)); | |
| ok(hres == S_OK, "put_FullScreen failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONFULLSCREEN); | |
| hres = IWebBrowser2_get_FullScreen(wb, &b); | |
| ok(hres == S_OK, "get_FullScreen failed: %08x\n", hres); | |
| ok(b == VARIANT_TRUE, "b=%x\n", b); | |
| SET_EXPECT(Invoke_ONFULLSCREEN); | |
| hres = IWebBrowser2_put_FullScreen(wb, (exvb = 100)); | |
| ok(hres == S_OK, "put_FullScreen failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONFULLSCREEN); | |
| hres = IWebBrowser2_get_FullScreen(wb, &b); | |
| ok(hres == S_OK, "get_FullScreen failed: %08x\n", hres); | |
| ok(b == VARIANT_TRUE, "b=%x\n", b); | |
| SET_EXPECT(Invoke_ONFULLSCREEN); | |
| hres = IWebBrowser2_put_FullScreen(wb, (exvb = VARIANT_FALSE)); | |
| ok(hres == S_OK, "put_FullScreen failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONFULLSCREEN); | |
| /* TheaterMode */ | |
| hres = IWebBrowser2_get_TheaterMode(wb, &b); | |
| ok(hres == S_OK, "get_TheaterMode failed: %08x\n", hres); | |
| ok(b == VARIANT_FALSE, "b=%x\n", b); | |
| SET_EXPECT(Invoke_ONTHEATERMODE); | |
| hres = IWebBrowser2_put_TheaterMode(wb, (exvb = VARIANT_TRUE)); | |
| ok(hres == S_OK, "put_TheaterMode failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONTHEATERMODE); | |
| hres = IWebBrowser2_get_TheaterMode(wb, &b); | |
| ok(hres == S_OK, "get_TheaterMode failed: %08x\n", hres); | |
| ok(b == VARIANT_TRUE, "b=%x\n", b); | |
| SET_EXPECT(Invoke_ONTHEATERMODE); | |
| hres = IWebBrowser2_put_TheaterMode(wb, (exvb = 100)); | |
| ok(hres == S_OK, "put_TheaterMode failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONTHEATERMODE); | |
| hres = IWebBrowser2_get_TheaterMode(wb, &b); | |
| ok(hres == S_OK, "get_TheaterMode failed: %08x\n", hres); | |
| ok(b == VARIANT_TRUE, "b=%x\n", b); | |
| SET_EXPECT(Invoke_ONTHEATERMODE); | |
| hres = IWebBrowser2_put_TheaterMode(wb, (exvb = VARIANT_FALSE)); | |
| ok(hres == S_OK, "put_TheaterMode failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_ONTHEATERMODE); | |
| /* Resizable */ | |
| b = 0x100; | |
| hres = IWebBrowser2_get_Resizable(wb, &b); | |
| ok(hres == E_NOTIMPL, "get_Resizable failed: %08x\n", hres); | |
| ok(b == 0x100, "b=%x\n", b); | |
| SET_EXPECT(Invoke_WINDOWSETRESIZABLE); | |
| hres = IWebBrowser2_put_Resizable(wb, (exvb = VARIANT_TRUE)); | |
| ok(hres == S_OK, "put_Resizable failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_WINDOWSETRESIZABLE); | |
| SET_EXPECT(Invoke_WINDOWSETRESIZABLE); | |
| hres = IWebBrowser2_put_Resizable(wb, (exvb = VARIANT_FALSE)); | |
| ok(hres == S_OK, "put_Resizable failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_WINDOWSETRESIZABLE); | |
| hres = IWebBrowser2_get_Resizable(wb, &b); | |
| ok(hres == E_NOTIMPL, "get_Resizable failed: %08x\n", hres); | |
| ok(b == 0x100, "b=%x\n", b); | |
| /* Application */ | |
| disp = NULL; | |
| hres = IWebBrowser2_get_Application(wb, &disp); | |
| ok(hres == S_OK, "get_Application failed: %08x\n", hres); | |
| ok(disp == (void*)wb, "disp=%p, expected %p\n", disp, wb); | |
| if(disp) | |
| IDispatch_Release(disp); | |
| hres = IWebBrowser2_get_Application(wb, NULL); | |
| ok(hres == E_POINTER, "get_Application failed: %08x, expected E_POINTER\n", hres); | |
| /* Name */ | |
| hres = IWebBrowser2_get_Name(wb, &sName); | |
| ok(hres == S_OK, "getName failed: %08x, expected S_OK\n", hres); | |
| if (is_lang_english()) | |
| ok(!strcmp_wa(sName, "Microsoft Web Browser Control"), "got '%s', expected 'Microsoft Web Browser Control'\n", wine_dbgstr_w(sName)); | |
| else /* Non-English cannot be blank. */ | |
| ok(sName!=NULL, "get_Name return a NULL string.\n"); | |
| SysFreeString(sName); | |
| /* RegisterAsDropTarget */ | |
| hres = IWebBrowser2_get_RegisterAsDropTarget(wb, NULL); | |
| ok(hres == E_INVALIDARG, "get_RegisterAsDropTarget returned: %08x\n", hres); | |
| /* Quit */ | |
| hres = IWebBrowser2_Quit(wb); | |
| ok(hres == E_FAIL, "Quit failed: %08x, expected E_FAIL\n", hres); | |
| } | |
| static void test_Silent(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite) | |
| { | |
| VARIANT_BOOL b; | |
| HRESULT hres; | |
| b = 100; | |
| hres = IWebBrowser2_get_Silent(wb, &b); | |
| ok(hres == S_OK, "get_Silent failed: %08x\n", hres); | |
| ok(b == VARIANT_FALSE, "b=%x\n", b); | |
| hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE); | |
| ok(hres == S_OK, "set_Silent failed: %08x\n", hres); | |
| b = 100; | |
| hres = IWebBrowser2_get_Silent(wb, &b); | |
| ok(hres == S_OK, "get_Silent failed: %08x\n", hres); | |
| ok(b == VARIANT_TRUE, "b=%x\n", b); | |
| hres = IWebBrowser2_put_Silent(wb, 100); | |
| ok(hres == S_OK, "set_Silent failed: %08x\n", hres); | |
| b = 100; | |
| hres = IWebBrowser2_get_Silent(wb, &b); | |
| ok(hres == S_OK, "get_Silent failed: %08x\n", hres); | |
| ok(b == VARIANT_TRUE, "b=%x\n", b); | |
| hres = IWebBrowser2_put_Silent(wb, VARIANT_FALSE); | |
| ok(hres == S_OK, "set_Silent failed: %08x\n", hres); | |
| b = 100; | |
| hres = IWebBrowser2_get_Silent(wb, &b); | |
| ok(hres == S_OK, "get_Silent failed: %08x\n", hres); | |
| ok(b == VARIANT_FALSE, "b=%x\n", b); | |
| if(is_clientsite) { | |
| hres = IWebBrowser2_put_Silent(wb, VARIANT_TRUE); | |
| ok(hres == S_OK, "set_Silent failed: %08x\n", hres); | |
| SET_EXPECT(Invoke_AMBIENT_SILENT); | |
| } | |
| hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_SILENT); | |
| ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres); | |
| if(is_clientsite) | |
| CHECK_CALLED(Invoke_AMBIENT_SILENT); | |
| b = 100; | |
| hres = IWebBrowser2_get_Silent(wb, &b); | |
| ok(hres == S_OK, "get_Silent failed: %08x\n", hres); | |
| ok(b == VARIANT_FALSE, "b=%x\n", b); | |
| } | |
| static void test_Offline(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite) | |
| { | |
| VARIANT_BOOL b; | |
| HRESULT hres; | |
| b = 100; | |
| hres = IWebBrowser2_get_Offline(wb, &b); | |
| ok(hres == S_OK, "get_Offline failed: %08x\n", hres); | |
| ok(b == VARIANT_FALSE, "b=%x\n", b); | |
| hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE); | |
| ok(hres == S_OK, "set_Offline failed: %08x\n", hres); | |
| b = 100; | |
| hres = IWebBrowser2_get_Offline(wb, &b); | |
| ok(hres == S_OK, "get_Offline failed: %08x\n", hres); | |
| ok(b == VARIANT_TRUE, "b=%x\n", b); | |
| hres = IWebBrowser2_put_Offline(wb, 100); | |
| ok(hres == S_OK, "set_Offline failed: %08x\n", hres); | |
| b = 100; | |
| hres = IWebBrowser2_get_Offline(wb, &b); | |
| ok(hres == S_OK, "get_Offline failed: %08x\n", hres); | |
| ok(b == VARIANT_TRUE, "b=%x\n", b); | |
| hres = IWebBrowser2_put_Offline(wb, VARIANT_FALSE); | |
| ok(hres == S_OK, "set_Offline failed: %08x\n", hres); | |
| b = 100; | |
| hres = IWebBrowser2_get_Offline(wb, &b); | |
| ok(hres == S_OK, "get_Offline failed: %08x\n", hres); | |
| ok(b == VARIANT_FALSE, "b=%x\n", b); | |
| if(is_clientsite) { | |
| hres = IWebBrowser2_put_Offline(wb, VARIANT_TRUE); | |
| ok(hres == S_OK, "set_Offline failed: %08x\n", hres); | |
| SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| } | |
| hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres); | |
| if(is_clientsite) | |
| CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| b = 100; | |
| hres = IWebBrowser2_get_Offline(wb, &b); | |
| ok(hres == S_OK, "get_Offline failed: %08x\n", hres); | |
| ok(b == VARIANT_FALSE, "b=%x\n", b); | |
| } | |
| static void test_ambient_unknown(IWebBrowser2 *wb, IOleControl *control, BOOL is_clientsite) | |
| { | |
| HRESULT hres; | |
| SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| SET_EXPECT(Invoke_AMBIENT_SILENT); | |
| SET_EXPECT(Invoke_AMBIENT_USERMODE); | |
| SET_EXPECT(Invoke_AMBIENT_DLCONTROL); | |
| SET_EXPECT(Invoke_AMBIENT_USERAGENT); | |
| SET_EXPECT(Invoke_AMBIENT_PALETTE); | |
| hres = IOleControl_OnAmbientPropertyChange(control, DISPID_UNKNOWN); | |
| ok(hres == S_OK, "OnAmbientPropertyChange failed %08x\n", hres); | |
| CHECK_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| CHECK_EXPECT(Invoke_AMBIENT_SILENT); | |
| CHECK_EXPECT(Invoke_AMBIENT_USERMODE); | |
| CHECK_EXPECT(Invoke_AMBIENT_DLCONTROL); | |
| CHECK_EXPECT(Invoke_AMBIENT_USERAGENT); | |
| CHECK_EXPECT(Invoke_AMBIENT_PALETTE); | |
| CLEAR_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| CLEAR_CALLED(Invoke_AMBIENT_SILENT); | |
| CLEAR_CALLED(Invoke_AMBIENT_USERMODE); | |
| CLEAR_CALLED(Invoke_AMBIENT_DLCONTROL); | |
| CLEAR_CALLED(Invoke_AMBIENT_USERAGENT); | |
| CLEAR_CALLED(Invoke_AMBIENT_PALETTE); | |
| } | |
| static void test_wb_funcs(IWebBrowser2 *wb, BOOL is_clientsite) | |
| { | |
| IOleControl *control; | |
| HRESULT hres; | |
| hres = IWebBrowser2_QueryInterface(wb, &IID_IOleControl, (void**)&control); | |
| ok(hres == S_OK, "Could not get IOleControl interface: %08x\n", hres); | |
| test_Silent(wb, control, is_clientsite); | |
| test_Offline(wb, control, is_clientsite); | |
| test_ambient_unknown(wb, control, is_clientsite); | |
| IOleControl_Release(control); | |
| } | |
| static void test_GetControlInfo(IWebBrowser2 *unk) | |
| { | |
| IOleControl *control; | |
| CONTROLINFO info; | |
| HRESULT hres; | |
| hres = IWebBrowser2_QueryInterface(unk, &IID_IOleControl, (void**)&control); | |
| ok(hres == S_OK, "Could not get IOleControl: %08x\n", hres); | |
| if(FAILED(hres)) | |
| return; | |
| hres = IOleControl_GetControlInfo(control, &info); | |
| ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, expected E_NOTIMPL\n", hres); | |
| hres = IOleControl_GetControlInfo(control, NULL); | |
| ok(hres == E_NOTIMPL, "GetControlInfo failed: %08x, expected E_NOTIMPL\n", hres); | |
| IOleControl_Release(control); | |
| } | |
| static void test_Extent(IWebBrowser2 *unk) | |
| { | |
| IOleObject *oleobj; | |
| SIZE size, expected; | |
| HRESULT hres; | |
| DWORD dpi_x; | |
| DWORD dpi_y; | |
| HDC hdc; | |
| /* default aspect ratio is 96dpi / 96dpi */ | |
| hdc = GetDC(0); | |
| dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); | |
| dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); | |
| ReleaseDC(0, hdc); | |
| if (dpi_x != 96 || dpi_y != 96) | |
| trace("dpi: %d / %d\n", dpi_y, dpi_y); | |
| hres = IWebBrowser2_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj); | |
| ok(hres == S_OK, "Could not get IOleObkect: %08x\n", hres); | |
| if(FAILED(hres)) | |
| return; | |
| size.cx = size.cy = 0xdeadbeef; | |
| hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size); | |
| ok(hres == S_OK, "GetExtent failed: %08x\n", hres); | |
| /* Default size is 50x20 pixels, in himetric units */ | |
| expected.cx = MulDiv( 50, 2540, dpi_x ); | |
| expected.cy = MulDiv( 20, 2540, dpi_y ); | |
| ok(size.cx == expected.cx && size.cy == expected.cy, "size = {%d %d} (expected %d %d)\n", | |
| size.cx, size.cy, expected.cx, expected.cy ); | |
| size.cx = 800; | |
| size.cy = 700; | |
| hres = IOleObject_SetExtent(oleobj, DVASPECT_CONTENT, &size); | |
| ok(hres == S_OK, "SetExtent failed: %08x\n", hres); | |
| size.cx = size.cy = 0xdeadbeef; | |
| hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size); | |
| ok(hres == S_OK, "GetExtent failed: %08x\n", hres); | |
| ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy); | |
| size.cx = size.cy = 0xdeadbeef; | |
| hres = IOleObject_GetExtent(oleobj, 0, &size); | |
| ok(hres == S_OK, "GetExtent failed: %08x\n", hres); | |
| ok(size.cx == 800 && size.cy == 700, "size = {%d %d}\n", size.cx, size.cy); | |
| size.cx = 900; | |
| size.cy = 800; | |
| hres = IOleObject_SetExtent(oleobj, 0, &size); | |
| ok(hres == S_OK, "SetExtent failed: %08x\n", hres); | |
| size.cx = size.cy = 0xdeadbeef; | |
| hres = IOleObject_GetExtent(oleobj, 0, &size); | |
| ok(hres == S_OK, "GetExtent failed: %08x\n", hres); | |
| ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy); | |
| size.cx = size.cy = 0xdeadbeef; | |
| hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size); | |
| ok(hres == S_OK, "GetExtent failed: %08x\n", hres); | |
| ok(size.cx == 900 && size.cy == 800, "size = {%d %d}\n", size.cx, size.cy); | |
| size.cx = 1000; | |
| size.cy = 900; | |
| hres = IOleObject_SetExtent(oleobj, 0xdeadbeef, &size); | |
| ok(hres == S_OK, "SetExtent failed: %08x\n", hres); | |
| size.cx = size.cy = 0xdeadbeef; | |
| hres = IOleObject_GetExtent(oleobj, 0xdeadbeef, &size); | |
| ok(hres == S_OK, "GetExtent failed: %08x\n", hres); | |
| ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy); | |
| size.cx = size.cy = 0xdeadbeef; | |
| hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &size); | |
| ok(hres == S_OK, "GetExtent failed: %08x\n", hres); | |
| ok(size.cx == 1000 && size.cy == 900, "size = {%d %d}\n", size.cx, size.cy); | |
| IOleObject_Release(oleobj); | |
| } | |
| static void test_ConnectionPoint(IWebBrowser2 *unk, BOOL init) | |
| { | |
| IConnectionPointContainer *container; | |
| IConnectionPoint *point; | |
| HRESULT hres; | |
| static DWORD dw = 100; | |
| hres = IWebBrowser2_QueryInterface(unk, &IID_IConnectionPointContainer, (void**)&container); | |
| ok(hres == S_OK, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres); | |
| if(FAILED(hres)) | |
| return; | |
| hres = IConnectionPointContainer_FindConnectionPoint(container, &DIID_DWebBrowserEvents2, &point); | |
| IConnectionPointContainer_Release(container); | |
| ok(hres == S_OK, "FindConnectionPoint failed: %08x\n", hres); | |
| if(FAILED(hres)) | |
| return; | |
| if(init) { | |
| hres = IConnectionPoint_Advise(point, (IUnknown*)&WebBrowserEvents2, &dw); | |
| ok(hres == S_OK, "Advise failed: %08x\n", hres); | |
| ok(dw == 1, "dw=%d, expected 1\n", dw); | |
| }else { | |
| hres = IConnectionPoint_Unadvise(point, dw); | |
| ok(hres == S_OK, "Unadvise failed: %08x\n", hres); | |
| } | |
| IConnectionPoint_Release(point); | |
| } | |
| static void test_Navigate2(IWebBrowser2 *webbrowser, const char *nav_url) | |
| { | |
| VARIANT url; | |
| BOOL is_file; | |
| HRESULT hres; | |
| test_LocationURL(webbrowser, is_first_load ? "" : current_url); | |
| test_ready_state(is_first_load ? READYSTATE_UNINITIALIZED : READYSTATE_COMPLETE); | |
| is_http = !memcmp(nav_url, "http:", 5); | |
| V_VT(&url) = VT_BSTR; | |
| V_BSTR(&url) = a2bstr(current_url = nav_url); | |
| if((is_file = !strncasecmp(nav_url, "file://", 7))) | |
| current_url = nav_url + 7; | |
| if(is_first_load) { | |
| SET_EXPECT(Invoke_AMBIENT_USERMODE); | |
| SET_EXPECT(Invoke_PROPERTYCHANGE); | |
| SET_EXPECT(Invoke_BEFORENAVIGATE2); | |
| SET_EXPECT(Invoke_DOWNLOADBEGIN); | |
| if (use_container_olecmd) SET_EXPECT(Exec_SETDOWNLOADSTATE_1); | |
| SET_EXPECT(EnableModeless_FALSE); | |
| SET_EXPECT(Invoke_STATUSTEXTCHANGE); | |
| SET_EXPECT(SetStatusText); | |
| if(use_container_dochostui) | |
| SET_EXPECT(GetHostInfo); | |
| SET_EXPECT(Invoke_AMBIENT_DLCONTROL); | |
| SET_EXPECT(Invoke_AMBIENT_USERAGENT); | |
| SET_EXPECT(Invoke_AMBIENT_PALETTE); | |
| if(use_container_dochostui) { | |
| SET_EXPECT(GetOptionKeyPath); | |
| SET_EXPECT(GetOverridesKeyPath); | |
| } | |
| if (use_container_olecmd) { | |
| SET_EXPECT(QueryStatus_SETPROGRESSTEXT); | |
| SET_EXPECT(Exec_SETPROGRESSMAX); | |
| SET_EXPECT(Exec_SETPROGRESSPOS); | |
| } | |
| SET_EXPECT(Invoke_SETSECURELOCKICON); | |
| SET_EXPECT(Invoke_FILEDOWNLOAD); | |
| if (use_container_olecmd) SET_EXPECT(Exec_SETDOWNLOADSTATE_0); | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| SET_EXPECT(EnableModeless_TRUE); | |
| if (!use_container_olecmd) SET_EXPECT(Invoke_DOWNLOADCOMPLETE); | |
| if (is_file) SET_EXPECT(Invoke_PROGRESSCHANGE); | |
| } | |
| hres = IWebBrowser2_Navigate2(webbrowser, &url, NULL, NULL, NULL, NULL); | |
| ok(hres == S_OK, "Navigate2 failed: %08x\n", hres); | |
| if(is_first_load) { | |
| CHECK_CALLED(Invoke_AMBIENT_USERMODE); | |
| todo_wine CHECK_CALLED(Invoke_PROPERTYCHANGE); | |
| CHECK_CALLED(Invoke_BEFORENAVIGATE2); | |
| CHECK_CALLED(Invoke_DOWNLOADBEGIN); | |
| if (use_container_olecmd) todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_1); | |
| CHECK_CALLED(EnableModeless_FALSE); | |
| CHECK_CALLED(Invoke_STATUSTEXTCHANGE); | |
| CHECK_CALLED(SetStatusText); | |
| if(use_container_dochostui) | |
| CHECK_CALLED(GetHostInfo); | |
| CHECK_CALLED(Invoke_AMBIENT_DLCONTROL); | |
| CHECK_CALLED(Invoke_AMBIENT_USERAGENT); | |
| CLEAR_CALLED(Invoke_AMBIENT_PALETTE); /* Not called by IE9 */ | |
| if(use_container_dochostui) { | |
| CLEAR_CALLED(GetOptionKeyPath); | |
| CHECK_CALLED(GetOverridesKeyPath); | |
| } | |
| if (use_container_olecmd) { | |
| todo_wine CHECK_CALLED(QueryStatus_SETPROGRESSTEXT); | |
| todo_wine CHECK_CALLED(Exec_SETPROGRESSMAX); | |
| todo_wine CHECK_CALLED(Exec_SETPROGRESSPOS); | |
| } | |
| todo_wine CHECK_CALLED(Invoke_SETSECURELOCKICON); | |
| todo_wine CHECK_CALLED(Invoke_FILEDOWNLOAD); | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| if (use_container_olecmd) todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0); | |
| CHECK_CALLED(EnableModeless_TRUE); | |
| if (!use_container_olecmd) CHECK_CALLED(Invoke_DOWNLOADCOMPLETE); | |
| if (is_file) todo_wine CHECK_CALLED(Invoke_PROGRESSCHANGE); | |
| } | |
| VariantClear(&url); | |
| test_ready_state(READYSTATE_LOADING); | |
| } | |
| static void test_QueryStatusWB(IWebBrowser2 *webbrowser, BOOL has_document) | |
| { | |
| HRESULT hres, success_state; | |
| OLECMDF success_flags; | |
| enum OLECMDF status; | |
| /* | |
| * We can tell the difference between the custom container target and the built-in target | |
| * since the custom target returns OLECMDF_SUPPORTED instead of OLECMDF_ENABLED. | |
| */ | |
| if (use_container_olecmd) | |
| success_flags = OLECMDF_SUPPORTED; | |
| else | |
| success_flags = OLECMDF_ENABLED; | |
| /* When no target is available (no document or custom target) an error is returned */ | |
| if (has_document) | |
| success_state = S_OK; | |
| else | |
| success_state = E_UNEXPECTED; | |
| /* | |
| * Test a safe operation that exists as both a high-numbered MSHTML id and an OLECMDID. | |
| * These tests show that QueryStatusWB uses a NULL pguidCmdGroup, since OLECMDID_STOP | |
| * is enabled and IDM_STOP is not. | |
| */ | |
| status = 0xdeadbeef; | |
| if (use_container_olecmd) SET_EXPECT(QueryStatus_STOP); | |
| hres = IWebBrowser2_QueryStatusWB(webbrowser, OLECMDID_STOP, &status); | |
| ok(hres == success_state, "QueryStatusWB failed: %08x %08x\n", hres, success_state); | |
| todo_wine_if (!use_container_olecmd && has_document) | |
| ok((has_document && status == success_flags) || (!has_document && status == 0xdeadbeef), | |
| "OLECMDID_STOP not enabled/supported: %08x %08x\n", status, success_flags); | |
| status = 0xdeadbeef; | |
| if (use_container_olecmd) SET_EXPECT(QueryStatus_IDM_STOP); | |
| hres = IWebBrowser2_QueryStatusWB(webbrowser, IDM_STOP, &status); | |
| ok(hres == success_state, "QueryStatusWB failed: %08x %08x\n", hres, success_state); | |
| ok((has_document && status == 0) || (!has_document && status == 0xdeadbeef), | |
| "IDM_STOP is enabled/supported: %08x %d\n", status, has_document); | |
| } | |
| static void test_ExecWB(IWebBrowser2 *webbrowser, BOOL has_document) | |
| { | |
| HRESULT hres, olecmdid_state, idm_state; | |
| /* When no target is available (no document or custom target) an error is returned */ | |
| if (has_document) | |
| { | |
| olecmdid_state = S_OK; | |
| idm_state = OLECMDERR_E_NOTSUPPORTED; | |
| } | |
| else | |
| { | |
| olecmdid_state = E_UNEXPECTED; | |
| idm_state = E_UNEXPECTED; | |
| } | |
| /* | |
| * Test a safe operation that exists as both a high-numbered MSHTML id and an OLECMDID. | |
| * These tests show that QueryStatusWB uses a NULL pguidCmdGroup, since OLECMDID_STOP | |
| * succeeds (S_OK) and IDM_STOP does not (OLECMDERR_E_NOTSUPPORTED). | |
| */ | |
| if(use_container_olecmd) { | |
| SET_EXPECT(Exec_STOP); | |
| }else if(has_document) { | |
| SET_EXPECT(Invoke_STATUSTEXTCHANGE); | |
| SET_EXPECT(SetStatusText); | |
| } | |
| hres = IWebBrowser2_ExecWB(webbrowser, OLECMDID_STOP, OLECMDEXECOPT_DONTPROMPTUSER, 0, 0); | |
| if(!use_container_olecmd && has_document) { | |
| todo_wine ok(hres == olecmdid_state, "ExecWB failed: %08x %08x\n", hres, olecmdid_state); | |
| CLEAR_CALLED(Invoke_STATUSTEXTCHANGE); /* Called by IE9 */ | |
| CLEAR_CALLED(SetStatusText); /* Called by IE9 */ | |
| }else { | |
| ok(hres == olecmdid_state, "ExecWB failed: %08x %08x\n", hres, olecmdid_state); | |
| } | |
| if (use_container_olecmd) | |
| SET_EXPECT(Exec_IDM_STOP); | |
| hres = IWebBrowser2_ExecWB(webbrowser, IDM_STOP, OLECMDEXECOPT_DONTPROMPTUSER, 0, 0); | |
| ok(hres == idm_state, "ExecWB failed: %08x %08x\n", hres, idm_state); | |
| } | |
| static void test_download(DWORD flags) | |
| { | |
| BOOL *b = &called_Invoke_DOCUMENTCOMPLETE; | |
| MSG msg; | |
| if(flags & DWL_REFRESH) | |
| b = use_container_olecmd ? &called_Exec_SETDOWNLOADSTATE_0 : &called_Invoke_DOWNLOADCOMPLETE; | |
| else if((flags & DWL_FROM_PUT_HREF) && !use_container_olecmd && 0) | |
| b = &called_Invoke_DOWNLOADCOMPLETE; | |
| is_downloading = TRUE; | |
| dwl_flags = flags; | |
| test_ready_state((flags & (DWL_FROM_PUT_HREF|DWL_FROM_GOBACK|DWL_FROM_GOFORWARD|DWL_REFRESH)) | |
| ? READYSTATE_COMPLETE : READYSTATE_LOADING); | |
| if(flags & (DWL_EXPECT_BEFORE_NAVIGATE|(is_http ? DWL_FROM_PUT_HREF : 0)|DWL_FROM_GOFORWARD|DWL_REFRESH)) | |
| SET_EXPECT(Invoke_PROPERTYCHANGE); | |
| if(flags & DWL_EXPECT_BEFORE_NAVIGATE) { | |
| SET_EXPECT(Invoke_BEFORENAVIGATE2); | |
| SET_EXPECT(TranslateUrl); | |
| } | |
| if(use_container_olecmd) { | |
| SET_EXPECT(Exec_SETPROGRESSMAX); | |
| SET_EXPECT(Exec_SETPROGRESSPOS); | |
| SET_EXPECT(Exec_SETDOWNLOADSTATE_1); | |
| }else { | |
| SET_EXPECT(Invoke_DOWNLOADBEGIN); | |
| } | |
| SET_EXPECT(DocHost_EnableModeless_FALSE); | |
| SET_EXPECT(DocHost_EnableModeless_TRUE); | |
| SET_EXPECT(Invoke_SETSECURELOCKICON); | |
| SET_EXPECT(Invoke_SETPHISHINGFILTERSTATUS); | |
| SET_EXPECT(EnableModeless_FALSE); | |
| if(!(flags & DWL_REFRESH)) { | |
| if(flags & (DWL_FROM_GOFORWARD|DWL_BACK_ENABLE)) | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE); | |
| else | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| if(flags & DWL_FROM_GOBACK) | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE); | |
| else | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| } | |
| expect_update_commands_enable = 0; | |
| set_update_commands_enable = 0xdead; | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS); | |
| SET_EXPECT(Invoke_STATUSTEXTCHANGE); | |
| SET_EXPECT(SetStatusText); | |
| SET_EXPECT(EnableModeless_TRUE); | |
| if(!is_first_load) | |
| SET_EXPECT(GetHostInfo); | |
| if(use_container_olecmd) | |
| SET_EXPECT(Exec_SETDOWNLOADSTATE_0); | |
| else | |
| SET_EXPECT(Invoke_DOWNLOADCOMPLETE); | |
| SET_EXPECT(Invoke_TITLECHANGE); | |
| if(!(flags & DWL_REFRESH)) | |
| SET_EXPECT(Invoke_NAVIGATECOMPLETE2); | |
| if(is_first_load) | |
| SET_EXPECT(GetDropTarget); | |
| SET_EXPECT(Invoke_PROGRESSCHANGE); | |
| if(!(flags & DWL_REFRESH)) | |
| SET_EXPECT(Invoke_DOCUMENTCOMPLETE); | |
| if(flags & DWL_HTTP) | |
| SET_EXPECT(Exec_SETTITLE); | |
| SET_EXPECT(UpdateUI); | |
| if(use_container_olecmd) | |
| SET_EXPECT(Exec_UPDATECOMMANDS); | |
| SET_EXPECT(QueryStatus_STOP); | |
| SET_EXPECT(GetOverridesKeyPath); /* Called randomly on some VMs. */ | |
| trace("Downloading...\n"); | |
| while(!*b && GetMessageW(&msg, NULL, 0, 0)) { | |
| TranslateMessage(&msg); | |
| DispatchMessageW(&msg); | |
| } | |
| if(flags & (DWL_EXPECT_BEFORE_NAVIGATE|(is_http ? DWL_FROM_PUT_HREF : 0))) | |
| todo_wine CHECK_CALLED(Invoke_PROPERTYCHANGE); | |
| else if(flags & (DWL_FROM_GOFORWARD|DWL_REFRESH)) | |
| CLEAR_CALLED(Invoke_PROPERTYCHANGE); /* called by IE11 */ | |
| if(flags & DWL_EXPECT_BEFORE_NAVIGATE) { | |
| CHECK_CALLED(Invoke_BEFORENAVIGATE2); | |
| CHECK_CALLED(TranslateUrl); | |
| } | |
| if(use_container_olecmd) { | |
| todo_wine CHECK_CALLED(Exec_SETPROGRESSMAX); | |
| todo_wine CHECK_CALLED(Exec_SETPROGRESSPOS); | |
| CHECK_CALLED(Exec_SETDOWNLOADSTATE_1); | |
| }else { | |
| SET_EXPECT(Invoke_DOWNLOADBEGIN); | |
| } | |
| CLEAR_CALLED(DocHost_EnableModeless_FALSE); /* IE 7 */ | |
| CLEAR_CALLED(DocHost_EnableModeless_TRUE); /* IE 7 */ | |
| todo_wine CHECK_CALLED(Invoke_SETSECURELOCKICON); | |
| CLEAR_CALLED(Invoke_SETPHISHINGFILTERSTATUS); /* IE 7 */ | |
| if(is_first_load) | |
| todo_wine CHECK_CALLED(EnableModeless_FALSE); | |
| else | |
| CLEAR_CALLED(EnableModeless_FALSE); /* IE 8 */ | |
| if(!(flags & DWL_REFRESH)) { | |
| todo_wine_if(nav_back_todo) { | |
| if(flags & (DWL_FROM_GOFORWARD|DWL_BACK_ENABLE)) | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE); | |
| else | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| } | |
| if(flags & DWL_FROM_GOBACK) | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE); | |
| else | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| } | |
| CLEAR_CALLED(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS); | |
| todo_wine CHECK_CALLED(Invoke_STATUSTEXTCHANGE); | |
| todo_wine CHECK_CALLED(SetStatusText); | |
| if(is_first_load) | |
| todo_wine CHECK_CALLED(EnableModeless_TRUE); | |
| else | |
| CLEAR_CALLED(EnableModeless_FALSE); /* IE 8 */ | |
| if(!is_first_load) | |
| todo_wine CHECK_CALLED(GetHostInfo); | |
| if(use_container_olecmd) | |
| CHECK_CALLED(Exec_SETDOWNLOADSTATE_0); | |
| else | |
| CHECK_CALLED(Invoke_DOWNLOADCOMPLETE); | |
| todo_wine CHECK_CALLED(Invoke_TITLECHANGE); | |
| if(!(flags & DWL_REFRESH)) | |
| CHECK_CALLED(Invoke_NAVIGATECOMPLETE2); | |
| if(is_first_load) | |
| todo_wine CHECK_CALLED(GetDropTarget); | |
| if(!(flags & DWL_REFRESH)) | |
| CHECK_CALLED(Invoke_DOCUMENTCOMPLETE); | |
| is_downloading = FALSE; | |
| test_ready_state(READYSTATE_COMPLETE); | |
| while(use_container_olecmd && !called_Exec_UPDATECOMMANDS && GetMessageA(&msg, NULL, 0, 0)) { | |
| TranslateMessage(&msg); | |
| DispatchMessageA(&msg); | |
| } | |
| todo_wine CHECK_CALLED(Invoke_PROGRESSCHANGE); | |
| if(flags & DWL_HTTP) | |
| CLEAR_CALLED(Exec_SETTITLE); /* FIXME: make it more strict */ | |
| if(use_container_olecmd) | |
| CHECK_CALLED(UpdateUI); | |
| else | |
| CLEAR_CALLED(UpdateUI); | |
| if(use_container_olecmd) | |
| CHECK_CALLED(Exec_UPDATECOMMANDS); | |
| CLEAR_CALLED(QueryStatus_STOP); | |
| CLEAR_CALLED(GetOverridesKeyPath); | |
| } | |
| static void test_Refresh(IWebBrowser2 *webbrowser, BOOL use_refresh2) | |
| { | |
| HRESULT hres; | |
| trace("Refresh...\n"); | |
| if(use_container_olecmd) | |
| SET_EXPECT(Exec_DocHostCommandHandler_2300); | |
| if(use_refresh2) { | |
| VARIANT v; | |
| V_VT(&v) = VT_I4; | |
| V_I4(&v) = REFRESH_NORMAL; | |
| hres = IWebBrowser2_Refresh2(webbrowser, &v); | |
| ok(hres == S_OK, "Refresh failed: %08x\n", hres); | |
| }else { | |
| hres = IWebBrowser2_Refresh(webbrowser); | |
| ok(hres == S_OK, "Refresh failed: %08x\n", hres); | |
| } | |
| if(use_container_olecmd) | |
| CHECK_CALLED(Exec_DocHostCommandHandler_2300); | |
| test_download(DWL_REFRESH); | |
| } | |
| static void test_olecmd(IWebBrowser2 *unk, BOOL loaded) | |
| { | |
| IOleCommandTarget *cmdtrg; | |
| OLECMD cmds[3]; | |
| HRESULT hres; | |
| hres = IWebBrowser2_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg); | |
| ok(hres == S_OK, "Could not get IOleCommandTarget iface: %08x\n", hres); | |
| if(FAILED(hres)) | |
| return; | |
| cmds[0].cmdID = OLECMDID_SPELL; | |
| cmds[0].cmdf = 0xdeadbeef; | |
| cmds[1].cmdID = OLECMDID_REFRESH; | |
| cmds[1].cmdf = 0xdeadbeef; | |
| hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 2, cmds, NULL); | |
| if(loaded) { | |
| ok(hres == S_OK, "QueryStatus failed: %08x\n", hres); | |
| ok(cmds[0].cmdf == OLECMDF_SUPPORTED, "OLECMDID_SPELL cmdf = %x\n", cmds[0].cmdf); | |
| ok(cmds[1].cmdf == (OLECMDF_ENABLED|OLECMDF_SUPPORTED), | |
| "OLECMDID_REFRESH cmdf = %x\n", cmds[1].cmdf); | |
| }else { | |
| ok(hres == 0x80040104, "QueryStatus failed: %08x\n", hres); | |
| ok(cmds[0].cmdf == 0xdeadbeef, "OLECMDID_SPELL cmdf = %x\n", cmds[0].cmdf); | |
| ok(cmds[1].cmdf == 0xdeadbeef, "OLECMDID_REFRESH cmdf = %x\n", cmds[0].cmdf); | |
| } | |
| IOleCommandTarget_Release(cmdtrg); | |
| } | |
| static void test_IServiceProvider(IWebBrowser2 *unk) | |
| { | |
| IServiceProvider *servprov = (void*)0xdeadbeef; | |
| IUnknown *iface; | |
| HRESULT hres; | |
| hres = IWebBrowser2_QueryInterface(unk, &IID_IServiceProvider, (void**)&servprov); | |
| ok(hres == S_OK, "QueryInterface returned %08x, expected S_OK\n", hres); | |
| if(FAILED(hres)) | |
| return; | |
| hres = IServiceProvider_QueryService(servprov, &SID_STopLevelBrowser, &IID_IBrowserService2, (LPVOID*)&iface); | |
| ok(hres == E_FAIL, "QueryService returned %08x, expected E_FAIL\n", hres); | |
| ok(!iface, "QueryService returned %p, expected NULL\n", iface); | |
| if(hres == S_OK) | |
| IUnknown_Release(iface); | |
| hres = IServiceProvider_QueryService(servprov, &SID_SHTMLWindow, &IID_IHTMLWindow2, (LPVOID*)&iface); | |
| ok(hres == S_OK, "QueryService returned %08x, expected S_OK\n", hres); | |
| ok(iface != NULL, "QueryService returned NULL\n"); | |
| if(hres == S_OK) | |
| IUnknown_Release(iface); | |
| IServiceProvider_Release(servprov); | |
| } | |
| static void test_put_href(IWebBrowser2 *unk, const char *url) | |
| { | |
| IHTMLLocation *location; | |
| IHTMLDocument2 *doc; | |
| BSTR str; | |
| HRESULT hres; | |
| trace("put_href(%s)...\n", url); | |
| doc = get_document(unk); | |
| location = NULL; | |
| hres = IHTMLDocument2_get_location(doc, &location); | |
| IHTMLDocument2_Release(doc); | |
| ok(hres == S_OK, "get_location failed: %08x\n", hres); | |
| ok(location != NULL, "location == NULL\n"); | |
| is_http = !memcmp(url, "http:", 5); | |
| SET_EXPECT(TranslateUrl); | |
| SET_EXPECT(Invoke_BEFORENAVIGATE2); | |
| if(!is_http) | |
| SET_EXPECT(Invoke_PROPERTYCHANGE); | |
| dwl_flags = DWL_FROM_PUT_HREF; | |
| str = a2bstr(current_url = url); | |
| is_first_load = FALSE; | |
| hres = IHTMLLocation_put_href(location, str); | |
| CHECK_CALLED(TranslateUrl); | |
| CHECK_CALLED(Invoke_BEFORENAVIGATE2); | |
| if(!is_http) | |
| todo_wine CHECK_CALLED(Invoke_PROPERTYCHANGE); | |
| IHTMLLocation_Release(location); | |
| SysFreeString(str); | |
| ok(hres == S_OK, "put_href failed: %08x\n", hres); | |
| test_ready_state(READYSTATE_COMPLETE); | |
| } | |
| static void test_go_back(IWebBrowser2 *wb, const char *back_url, int back_enable, int forward_enable, int forward_todo) | |
| { | |
| HRESULT hres; | |
| current_url = back_url; | |
| SET_EXPECT(Invoke_BEFORENAVIGATE2); | |
| if(back_enable) | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE); | |
| else | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| if(forward_enable) | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE); | |
| else | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| nav_forward_todo = forward_todo; | |
| SET_EXPECT(Invoke_PROPERTYCHANGE); | |
| hres = IWebBrowser2_GoBack(wb); | |
| ok(hres == S_OK, "GoBack failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_BEFORENAVIGATE2); | |
| nav_forward_todo = FALSE; | |
| todo_wine_if(nav_back_todo) { | |
| if(back_enable) | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE); | |
| else | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| } | |
| todo_wine_if(forward_todo) { | |
| if(forward_enable) | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE); | |
| else | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| } | |
| CLEAR_CALLED(Invoke_PROPERTYCHANGE); /* called by IE11 */ | |
| } | |
| static void test_go_forward(IWebBrowser2 *wb, const char *forward_url, int back_enable, int forward_enable) | |
| { | |
| HRESULT hres; | |
| current_url = forward_url; | |
| dwl_flags |= DWL_FROM_GOFORWARD; | |
| SET_EXPECT(Invoke_BEFORENAVIGATE2); | |
| if(back_enable) | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE); | |
| else | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| if(forward_enable) | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE); | |
| else | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| hres = IWebBrowser2_GoForward(wb); | |
| ok(hres == S_OK, "GoForward failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_BEFORENAVIGATE2); | |
| if(back_enable) | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_TRUE); | |
| else | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| if(forward_enable) | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_TRUE); | |
| else | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| } | |
| static void test_QueryInterface(IWebBrowser2 *wb) | |
| { | |
| IQuickActivate *qa = (IQuickActivate*)0xdeadbeef; | |
| IRunnableObject *runnable = (IRunnableObject*)0xdeadbeef; | |
| IPerPropertyBrowsing *propbrowse = (void*)0xdeadbeef; | |
| IOleInPlaceSite *inplace = (void*)0xdeadbeef; | |
| IOleCache *cache = (void*)0xdeadbeef; | |
| IObjectWithSite *site = (void*)0xdeadbeef; | |
| IViewObjectEx *viewex = (void*)0xdeadbeef; | |
| IOleLink *link = (void*)0xdeadbeef; | |
| IMarshal *marshal = (void*)0xdeadbeef; | |
| IUnknown *unk = (IUnknown*)wb; | |
| HRESULT hres; | |
| hres = IUnknown_QueryInterface(unk, &IID_IQuickActivate, (void**)&qa); | |
| ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres); | |
| ok(qa == NULL, "qa=%p, expected NULL\n", qa); | |
| hres = IUnknown_QueryInterface(unk, &IID_IRunnableObject, (void**)&runnable); | |
| ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres); | |
| ok(runnable == NULL, "runnable=%p, expected NULL\n", runnable); | |
| hres = IUnknown_QueryInterface(unk, &IID_IPerPropertyBrowsing, (void**)&propbrowse); | |
| ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres); | |
| ok(propbrowse == NULL, "propbrowse=%p, expected NULL\n", propbrowse); | |
| hres = IUnknown_QueryInterface(unk, &IID_IOleCache, (void**)&cache); | |
| ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres); | |
| ok(cache == NULL, "cache=%p, expected NULL\n", cache); | |
| hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceSite, (void**)&inplace); | |
| ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres); | |
| ok(inplace == NULL, "inplace=%p, expected NULL\n", inplace); | |
| hres = IUnknown_QueryInterface(unk, &IID_IObjectWithSite, (void**)&site); | |
| ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres); | |
| ok(site == NULL, "site=%p, expected NULL\n", site); | |
| hres = IUnknown_QueryInterface(unk, &IID_IViewObjectEx, (void**)&viewex); | |
| ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres); | |
| ok(viewex == NULL, "viewex=%p, expected NULL\n", viewex); | |
| hres = IUnknown_QueryInterface(unk, &IID_IOleLink, (void**)&link); | |
| ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres); | |
| ok(link == NULL, "link=%p, expected NULL\n", link); | |
| hres = IUnknown_QueryInterface(unk, &IID_IMarshal, (void**)&marshal); | |
| ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres); | |
| ok(marshal == NULL, "marshal=%p, expected NULL\n", marshal); | |
| } | |
| static void test_UIActivate(IWebBrowser2 *unk, BOOL activate) | |
| { | |
| IOleDocumentView *docview; | |
| IHTMLDocument2 *doc; | |
| HRESULT hres; | |
| doc = get_document(unk); | |
| hres = IHTMLDocument2_QueryInterface(doc, &IID_IOleDocumentView, (void**)&docview); | |
| ok(hres == S_OK, "Got 0x%08x\n", hres); | |
| if(SUCCEEDED(hres)) { | |
| if(activate) { | |
| SET_EXPECT(RequestUIActivate); | |
| SET_EXPECT(ShowUI); | |
| SET_EXPECT(HideUI); | |
| SET_EXPECT(OnFocus_FALSE); | |
| } | |
| hres = IOleDocumentView_UIActivate(docview, activate); | |
| todo_wine_if(activate) | |
| ok(hres == S_OK, "Got 0x%08x\n", hres); | |
| if(activate) { | |
| todo_wine { | |
| CHECK_CALLED(RequestUIActivate); | |
| CHECK_CALLED(ShowUI); | |
| CHECK_CALLED(HideUI); | |
| CHECK_CALLED(OnFocus_FALSE); | |
| } | |
| } | |
| IOleDocumentView_Release(docview); | |
| } | |
| IHTMLDocument2_Release(doc); | |
| } | |
| static void test_external(IWebBrowser2 *unk) | |
| { | |
| IDocHostUIHandler2 *dochost; | |
| IOleClientSite *client; | |
| IDispatch *disp; | |
| HRESULT hres; | |
| client = get_dochost(unk); | |
| hres = IOleClientSite_QueryInterface(client, &IID_IDocHostUIHandler2, (void**)&dochost); | |
| ok(hres == S_OK, "Could not get IDocHostUIHandler2 iface: %08x\n", hres); | |
| IOleClientSite_Release(client); | |
| if(use_container_dochostui) | |
| SET_EXPECT(GetExternal); | |
| disp = (void*)0xdeadbeef; | |
| hres = IDocHostUIHandler2_GetExternal(dochost, &disp); | |
| if(use_container_dochostui) { | |
| CHECK_CALLED(GetExternal); | |
| ok(hres == S_FALSE, "GetExternal failed: %08x\n", hres); | |
| ok(!disp, "disp = %p\n", disp); | |
| }else { | |
| IShellUIHelper *uihelper; | |
| ok(hres == S_OK, "GetExternal failed: %08x\n", hres); | |
| ok(disp != NULL, "disp == NULL\n"); | |
| hres = IDispatch_QueryInterface(disp, &IID_IShellUIHelper, (void**)&uihelper); | |
| ok(hres == S_OK, "Could not get IShellUIHelper iface: %08x\n", hres); | |
| IShellUIHelper_Release(uihelper); | |
| IDispatch_Release(disp); | |
| } | |
| IDocHostUIHandler2_Release(dochost); | |
| } | |
| static void test_htmlwindow_close(IWebBrowser2 *wb) | |
| { | |
| IHTMLWindow2 *window; | |
| IHTMLDocument2 *doc; | |
| HRESULT hres; | |
| doc = get_document(wb); | |
| hres = IHTMLDocument2_get_parentWindow(doc, &window); | |
| ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres); | |
| IHTMLDocument2_Release(doc); | |
| SET_EXPECT(Invoke_WINDOWCLOSING); | |
| hres = IHTMLWindow2_close(window); | |
| ok(hres == S_OK, "close failed: %08x\n", hres); | |
| CHECK_CALLED(Invoke_WINDOWCLOSING); | |
| IHTMLWindow2_Release(window); | |
| } | |
| static void test_TranslateAccelerator(IWebBrowser2 *unk) | |
| { | |
| IOleClientSite *doc_clientsite; | |
| IOleInPlaceActiveObject *pao; | |
| HRESULT hres; | |
| DWORD keycode; | |
| MSG msg_a = { | |
| container_hwnd, | |
| 0, 0, 0, | |
| GetTickCount(), | |
| {5, 5} | |
| }; | |
| test_Navigate2(unk, "about:blank"); | |
| hres = IWebBrowser2_QueryInterface(unk, &IID_IOleInPlaceActiveObject, (void**)&pao); | |
| ok(hres == S_OK, "Got 0x%08x\n", hres); | |
| if(SUCCEEDED(hres)) { | |
| /* One accelerator that should be handled by mshtml */ | |
| msg_a.message = WM_KEYDOWN; | |
| msg_a.wParam = VK_F1; | |
| hres = IOleInPlaceActiveObject_TranslateAccelerator(pao, &msg_a); | |
| ok(hres == S_FALSE, "Got 0x%08x (%04x::%02lx)\n", hres, msg_a.message, msg_a.wParam); | |
| /* And one that should not */ | |
| msg_a.message = WM_KEYDOWN; | |
| msg_a.wParam = VK_F5; | |
| hres = IOleInPlaceActiveObject_TranslateAccelerator(pao, &msg_a); | |
| ok(hres == S_FALSE, "Got 0x%08x (%04x::%02lx)\n", hres, msg_a.message, msg_a.wParam); | |
| IOleInPlaceActiveObject_Release(pao); | |
| } | |
| test_UIActivate(unk, TRUE); | |
| /* Test again after UIActivate */ | |
| hres = IWebBrowser2_QueryInterface(unk, &IID_IOleInPlaceActiveObject, (void**)&pao); | |
| ok(hres == S_OK, "Got 0x%08x\n", hres); | |
| if(SUCCEEDED(hres)) { | |
| /* One accelerator that should be handled by mshtml */ | |
| msg_a.message = WM_KEYDOWN; | |
| msg_a.wParam = VK_F1; | |
| SET_EXPECT(DocHost_TranslateAccelerator); | |
| SET_EXPECT(ControlSite_TranslateAccelerator); | |
| hres = IOleInPlaceActiveObject_TranslateAccelerator(pao, &msg_a); | |
| ok(hres == S_FALSE, "Got 0x%08x (%04x::%02lx)\n", hres, msg_a.message, msg_a.wParam); | |
| todo_wine CHECK_CALLED(DocHost_TranslateAccelerator); | |
| todo_wine CHECK_CALLED(ControlSite_TranslateAccelerator); | |
| /* And one that should not */ | |
| msg_a.message = WM_KEYDOWN; | |
| msg_a.wParam = VK_F5; | |
| SET_EXPECT(DocHost_TranslateAccelerator); | |
| hres = IOleInPlaceActiveObject_TranslateAccelerator(pao, &msg_a); | |
| todo_wine ok(hres == S_OK, "Got 0x%08x (%04x::%02lx)\n", hres, msg_a.message, msg_a.wParam); | |
| todo_wine CHECK_CALLED(DocHost_TranslateAccelerator); | |
| IOleInPlaceActiveObject_Release(pao); | |
| } | |
| doc_clientsite = get_dochost(unk); | |
| if(doc_clientsite) { | |
| IDocHostUIHandler2 *dochost; | |
| IOleControlSite *doc_controlsite; | |
| IUnknown *unk_test; | |
| hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IOleInPlaceFrame, (void**)&unk_test); | |
| ok(hres == E_NOINTERFACE, "Got 0x%08x\n", hres); | |
| if(SUCCEEDED(hres)) IUnknown_Release(unk_test); | |
| hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IDocHostShowUI, (void**)&unk_test); | |
| todo_wine ok(hres == S_OK, "Got 0x%08x\n", hres); | |
| if(SUCCEEDED(hres)) IUnknown_Release(unk_test); | |
| hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IDocHostUIHandler, (void**)&unk_test); | |
| ok(hres == S_OK, "Got 0x%08x\n", hres); | |
| if(SUCCEEDED(hres)) IUnknown_Release(unk_test); | |
| hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IDocHostUIHandler2, (void**)&dochost); | |
| ok(hres == S_OK, "Got 0x%08x\n", hres); | |
| if(SUCCEEDED(hres)) { | |
| msg_a.message = WM_KEYDOWN; | |
| hr_dochost_TranslateAccelerator = 0xdeadbeef; | |
| for(keycode = 0; keycode <= 0x100; keycode++) { | |
| msg_a.wParam = keycode; | |
| SET_EXPECT(DocHost_TranslateAccelerator); | |
| hres = IDocHostUIHandler2_TranslateAccelerator(dochost, &msg_a, &CGID_MSHTML, 1234); | |
| ok(hres == 0xdeadbeef, "Got 0x%08x\n", hres); | |
| CHECK_CALLED(DocHost_TranslateAccelerator); | |
| } | |
| hr_dochost_TranslateAccelerator = E_NOTIMPL; | |
| SET_EXPECT(DocHost_TranslateAccelerator); | |
| hres = IDocHostUIHandler2_TranslateAccelerator(dochost, &msg_a, &CGID_MSHTML, 1234); | |
| ok(hres == E_NOTIMPL, "Got 0x%08x\n", hres); | |
| CHECK_CALLED(DocHost_TranslateAccelerator); | |
| IDocHostUIHandler2_Release(dochost); | |
| } | |
| hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IOleControlSite, (void**)&doc_controlsite); | |
| ok(hres == S_OK, "Got 0x%08x\n", hres); | |
| if(SUCCEEDED(hres)) { | |
| msg_a.message = WM_KEYDOWN; | |
| hr_site_TranslateAccelerator = 0xdeadbeef; | |
| for(keycode = 0; keycode < 0x100; keycode++) { | |
| msg_a.wParam = keycode; | |
| SET_EXPECT(ControlSite_TranslateAccelerator); | |
| hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0); | |
| if(keycode == 0x9 || keycode == 0x75) | |
| todo_wine ok(hres == S_OK, "Got 0x%08x (keycode: %04x)\n", hres, keycode); | |
| else | |
| ok(hres == S_FALSE, "Got 0x%08x (keycode: %04x)\n", hres, keycode); | |
| CHECK_CALLED(ControlSite_TranslateAccelerator); | |
| } | |
| msg_a.wParam = VK_LEFT; | |
| SET_EXPECT(ControlSite_TranslateAccelerator); | |
| hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0); | |
| ok(hres == S_FALSE, "Got 0x%08x (keycode: %04x)\n", hres, keycode); | |
| CHECK_CALLED(ControlSite_TranslateAccelerator); | |
| hr_site_TranslateAccelerator = S_OK; | |
| SET_EXPECT(ControlSite_TranslateAccelerator); | |
| hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0); | |
| ok(hres == S_OK, "Got 0x%08x (keycode: %04x)\n", hres, keycode); | |
| CHECK_CALLED(ControlSite_TranslateAccelerator); | |
| hr_site_TranslateAccelerator = E_NOTIMPL; | |
| SET_EXPECT(ControlSite_TranslateAccelerator); | |
| hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0); | |
| ok(hres == S_FALSE, "Got 0x%08x (keycode: %04x)\n", hres, keycode); | |
| CHECK_CALLED(ControlSite_TranslateAccelerator); | |
| IOleControlSite_Release(doc_controlsite); | |
| } | |
| IOleClientSite_Release(doc_clientsite); | |
| } | |
| test_UIActivate(unk, FALSE); | |
| } | |
| static void test_dochost_qs(IWebBrowser2 *webbrowser) | |
| { | |
| IOleClientSite *client_site; | |
| IServiceProvider *serv_prov; | |
| IUnknown *service; | |
| HRESULT hres; | |
| client_site = get_dochost(webbrowser); | |
| hres = IOleClientSite_QueryInterface(client_site, &IID_IServiceProvider, (void**)&serv_prov); | |
| IOleClientSite_Release(client_site); | |
| ok(hres == S_OK, "Could not get IServiceProvider iface: %08x\n", hres); | |
| hres = IServiceProvider_QueryService(serv_prov, &IID_IHlinkFrame, &IID_IHlinkFrame, (void**)&service); | |
| ok(hres == S_OK, "QueryService failed: %08x\n", hres); | |
| ok(iface_cmp(service, (IUnknown*)webbrowser), "service != unk\n"); | |
| IUnknown_Release(service); | |
| hres = IServiceProvider_QueryService(serv_prov, &IID_IWebBrowserApp, &IID_IHlinkFrame, (void**)&service); | |
| ok(hres == S_OK, "QueryService failed: %08x\n", hres); | |
| ok(iface_cmp(service, (IUnknown*)webbrowser), "service != unk\n"); | |
| IUnknown_Release(service); | |
| hres = IServiceProvider_QueryService(serv_prov, &IID_ITargetFrame, &IID_ITargetFrame, (void**)&service); | |
| ok(hres == S_OK, "QueryService failed: %08x\n", hres); | |
| ok(iface_cmp(service, (IUnknown*)webbrowser), "service != unk\n"); | |
| IUnknown_Release(service); | |
| hres = IServiceProvider_QueryService(serv_prov, &IID_IShellBrowser, &IID_IShellBrowser, (void**)&service); | |
| ok(hres == S_OK, "QueryService failed: %08x\n", hres); | |
| IUnknown_Release(service); | |
| hres = IServiceProvider_QueryService(serv_prov, &IID_IShellBrowser, &IID_IBrowserService, (void**)&service); | |
| ok(hres == S_OK, "QueryService failed: %08x\n", hres); | |
| IUnknown_Release(service); | |
| hres = IServiceProvider_QueryService(serv_prov, &IID_IShellBrowser, &IID_IDocObjectService, (void**)&service); | |
| ok(hres == S_OK, "QueryService failed: %08x\n", hres); | |
| IUnknown_Release(service); | |
| IServiceProvider_Release(serv_prov); | |
| } | |
| static void test_Close(IWebBrowser2 *wb, BOOL do_download) | |
| { | |
| IOleObject *oo; | |
| IOleClientSite *ocs; | |
| HRESULT hres; | |
| hres = IWebBrowser2_QueryInterface(wb, &IID_IOleObject, (void**)&oo); | |
| ok(hres == S_OK, "QueryInterface failed: %08x\n", hres); | |
| if(hres != S_OK) | |
| return; | |
| test_close = TRUE; | |
| SET_EXPECT(Frame_SetActiveObject); | |
| SET_EXPECT(UIWindow_SetActiveObject); | |
| SET_EXPECT(OnUIDeactivate); | |
| SET_EXPECT(OnFocus_FALSE); | |
| SET_EXPECT(OnInPlaceDeactivate); | |
| SET_EXPECT(Invoke_STATUSTEXTCHANGE); | |
| if(!do_download) { | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| expect_update_commands_enable = 0; | |
| set_update_commands_enable = 0xdead; | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS); | |
| if(use_container_olecmd) | |
| SET_EXPECT(Invoke_DOWNLOADCOMPLETE); | |
| }else { | |
| nav_back_todo = nav_forward_todo = TRUE; | |
| } | |
| hres = IOleObject_Close(oo, OLECLOSE_NOSAVE); | |
| ok(hres == S_OK, "OleObject_Close failed: %x\n", hres); | |
| CHECK_CALLED(Frame_SetActiveObject); | |
| CHECK_CALLED(UIWindow_SetActiveObject); | |
| CHECK_CALLED(OnUIDeactivate); | |
| CHECK_CALLED(OnFocus_FALSE); | |
| CHECK_CALLED(OnInPlaceDeactivate); | |
| CLEAR_CALLED(Invoke_STATUSTEXTCHANGE); /* Called by IE9 */ | |
| if(!do_download) { | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| CHECK_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE_UPDATECOMMANDS); | |
| todo_wine ok(expect_update_commands_enable == set_update_commands_enable, | |
| "got %d\n", set_update_commands_enable); | |
| if(use_container_olecmd) | |
| todo_wine CHECK_CALLED(Invoke_DOWNLOADCOMPLETE); | |
| }else { | |
| nav_back_todo = nav_forward_todo = FALSE; | |
| } | |
| hres = IOleObject_GetClientSite(oo, &ocs); | |
| ok(hres == S_OK, "hres = %x\n", hres); | |
| ok(!ocs, "ocs != NULL\n"); | |
| SET_EXPECT(GetContainer); | |
| SET_EXPECT(Site_GetWindow); | |
| SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| SET_EXPECT(Invoke_AMBIENT_SILENT); | |
| hres = IOleObject_DoVerb(oo, OLEIVERB_HIDE, NULL, (IOleClientSite*)0xdeadbeef, | |
| 0, (HWND)0xdeadbeef, NULL); | |
| ok(hres == S_OK, "DoVerb failed: %08x\n", hres); | |
| CHECK_CALLED(GetContainer); | |
| CHECK_CALLED(Site_GetWindow); | |
| CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| CHECK_CALLED(Invoke_AMBIENT_SILENT); | |
| hres = IOleObject_GetClientSite(oo, &ocs); | |
| ok(hres == S_OK, "hres = %x\n", hres); | |
| ok(ocs == &ClientSite, "ocs != &ClientSite\n"); | |
| if(ocs) | |
| IOleClientSite_Release(ocs); | |
| SET_EXPECT(OnFocus_FALSE); | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| hres = IOleObject_Close(oo, OLECLOSE_NOSAVE); | |
| ok(hres == S_OK, "OleObject_Close failed: %x\n", hres); | |
| todo_wine CHECK_NOT_CALLED(OnFocus_FALSE); | |
| todo_wine CHECK_NOT_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE); | |
| todo_wine CHECK_NOT_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE); | |
| test_close = FALSE; | |
| IOleObject_Release(oo); | |
| } | |
| #define TEST_DOWNLOAD 0x0001 | |
| #define TEST_NOOLECMD 0x0002 | |
| #define TEST_NODOCHOST 0x0004 | |
| static void init_test(IWebBrowser2 *webbrowser, DWORD flags) | |
| { | |
| wb = webbrowser; | |
| do_download = is_downloading = (flags & TEST_DOWNLOAD) != 0; | |
| is_first_load = TRUE; | |
| dwl_flags = 0; | |
| use_container_olecmd = !(flags & TEST_NOOLECMD); | |
| use_container_dochostui = !(flags & TEST_NODOCHOST); | |
| } | |
| static void test_WebBrowser(DWORD flags, BOOL do_close) | |
| { | |
| IWebBrowser2 *webbrowser; | |
| ULONG ref; | |
| webbrowser = create_webbrowser(); | |
| if(!webbrowser) | |
| return; | |
| init_test(webbrowser, flags); | |
| test_QueryStatusWB(webbrowser, FALSE); | |
| test_ExecWB(webbrowser, FALSE); | |
| test_QueryInterface(webbrowser); | |
| test_ready_state(READYSTATE_UNINITIALIZED); | |
| test_ClassInfo(webbrowser); | |
| test_EnumVerbs(webbrowser); | |
| test_LocationURL(webbrowser, ""); | |
| test_ConnectionPoint(webbrowser, TRUE); | |
| test_ClientSite(webbrowser, &ClientSite, !do_download); | |
| test_Extent(webbrowser); | |
| test_wb_funcs(webbrowser, TRUE); | |
| test_DoVerb(webbrowser); | |
| test_olecmd(webbrowser, FALSE); | |
| test_Navigate2(webbrowser, "about:blank"); | |
| test_QueryStatusWB(webbrowser, TRUE); | |
| if(do_download) { | |
| IHTMLDocument2 *doc, *doc2; | |
| test_download(0); | |
| test_olecmd(webbrowser, TRUE); | |
| doc = get_document(webbrowser); | |
| test_put_href(webbrowser, "about:test"); | |
| test_download(DWL_FROM_PUT_HREF); | |
| doc2 = get_document(webbrowser); | |
| ok(doc == doc2, "doc != doc2\n"); | |
| IHTMLDocument2_Release(doc2); | |
| trace("Navigate2 repeated...\n"); | |
| test_Navigate2(webbrowser, "about:blank"); | |
| test_download(DWL_EXPECT_BEFORE_NAVIGATE); | |
| doc2 = get_document(webbrowser); | |
| ok(doc == doc2, "doc != doc2\n"); | |
| IHTMLDocument2_Release(doc2); | |
| IHTMLDocument2_Release(doc); | |
| if(!do_close) { | |
| trace("Navigate2 http URL...\n"); | |
| test_ready_state(READYSTATE_COMPLETE); | |
| test_Navigate2(webbrowser, "http://test.winehq.org/tests/hello.html"); | |
| nav_back_todo = TRUE; | |
| test_download(DWL_EXPECT_BEFORE_NAVIGATE|DWL_HTTP); | |
| nav_back_todo = FALSE; | |
| test_Refresh(webbrowser, FALSE); | |
| test_Refresh(webbrowser, TRUE); | |
| trace("put_href http URL...\n"); | |
| test_put_href(webbrowser, "http://test.winehq.org/tests/winehq_snapshot/"); | |
| test_download(DWL_FROM_PUT_HREF|DWL_HTTP|DWL_BACK_ENABLE); | |
| trace("GoBack...\n"); | |
| nav_back_todo = TRUE; | |
| test_go_back(webbrowser, "http://test.winehq.org/tests/hello.html", 0, 0, 1); | |
| test_download(DWL_FROM_GOBACK|DWL_HTTP); | |
| nav_back_todo = FALSE; | |
| trace("GoForward...\n"); | |
| test_go_forward(webbrowser, "http://test.winehq.org/tests/winehq_snapshot/", -1, 0); | |
| test_download(DWL_FROM_GOFORWARD|DWL_HTTP); | |
| trace("GoBack...\n"); | |
| nav_back_todo = TRUE; | |
| test_go_back(webbrowser, "http://test.winehq.org/tests/hello.html", 0, -1, 0); | |
| test_download(DWL_FROM_GOBACK|DWL_HTTP); | |
| nav_back_todo = FALSE; | |
| trace("GoForward...\n"); | |
| test_go_forward(webbrowser, "http://test.winehq.org/tests/winehq_snapshot/", -1, 0); | |
| test_download(DWL_FROM_GOFORWARD|DWL_HTTP); | |
| }else { | |
| trace("Navigate2 repeated with the same URL...\n"); | |
| test_Navigate2(webbrowser, "about:blank"); | |
| test_download(DWL_EXPECT_BEFORE_NAVIGATE); | |
| } | |
| test_EnumVerbs(webbrowser); | |
| test_TranslateAccelerator(webbrowser); | |
| test_dochost_qs(webbrowser); | |
| }else { | |
| test_ExecWB(webbrowser, TRUE); | |
| } | |
| test_external(webbrowser); | |
| test_htmlwindow_close(webbrowser); | |
| if(do_close) { | |
| test_Close(webbrowser, do_download); | |
| }else { | |
| test_change_ClientSite(webbrowser); | |
| test_ClientSite(webbrowser, NULL, !do_download); | |
| } | |
| test_ie_funcs(webbrowser); | |
| test_GetControlInfo(webbrowser); | |
| test_wb_funcs(webbrowser, FALSE); | |
| test_ConnectionPoint(webbrowser, FALSE); | |
| test_IServiceProvider(webbrowser); | |
| ref = IWebBrowser2_Release(webbrowser); | |
| ok(ref == 0 || broken(do_download && !do_close), "ref=%d, expected 0\n", ref); | |
| } | |
| static void test_WebBrowserV1(void) | |
| { | |
| IWebBrowser2 *wb; | |
| ULONG ref; | |
| HRESULT hres; | |
| hres = CoCreateInstance(&CLSID_WebBrowser_V1, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, | |
| &IID_IWebBrowser2, (void**)&wb); | |
| ok(hres == S_OK, "Could not get WebBrowserV1 instance: %08x\n", hres); | |
| init_test(wb, 0); | |
| wb_version = 1; | |
| test_QueryStatusWB(wb, FALSE); | |
| test_ExecWB(wb, FALSE); | |
| test_QueryInterface(wb); | |
| test_ready_state(READYSTATE_UNINITIALIZED); | |
| test_ClassInfo(wb); | |
| test_EnumVerbs(wb); | |
| ref = IWebBrowser2_Release(wb); | |
| ok(ref == 0, "ref=%d, expected 0\n", ref); | |
| } | |
| static void test_WebBrowser_slim_container(void) | |
| { | |
| IWebBrowser2 *webbrowser; | |
| ULONG ref; | |
| webbrowser = create_webbrowser(); | |
| init_test(webbrowser, TEST_NOOLECMD|TEST_NODOCHOST); | |
| test_ConnectionPoint(webbrowser, TRUE); | |
| test_ClientSite(webbrowser, &ClientSite, TRUE); | |
| test_DoVerb(webbrowser); | |
| test_Navigate2(webbrowser, "about:blank"); | |
| /* Tests of interest */ | |
| test_QueryStatusWB(webbrowser, TRUE); | |
| test_ExecWB(webbrowser, TRUE); | |
| test_external(webbrowser); | |
| /* Cleanup stage */ | |
| test_ClientSite(webbrowser, NULL, TRUE); | |
| test_ConnectionPoint(webbrowser, FALSE); | |
| ref = IWebBrowser2_Release(webbrowser); | |
| ok(ref == 0, "ref=%d, expected 0\n", ref); | |
| } | |
| static void test_WebBrowser_DoVerb(void) | |
| { | |
| IWebBrowser2 *webbrowser; | |
| RECT rect; | |
| HWND hwnd; | |
| ULONG ref; | |
| BOOL res; | |
| webbrowser = create_webbrowser(); | |
| init_test(webbrowser, 0); | |
| test_ClientSite(webbrowser, &ClientSite, FALSE); | |
| SET_EXPECT(CanInPlaceActivate); | |
| SET_EXPECT(Site_GetWindow); | |
| SET_EXPECT(OnInPlaceActivate); | |
| SET_EXPECT(GetWindowContext); | |
| SET_EXPECT(ShowObject); | |
| SET_EXPECT(GetContainer); | |
| SET_EXPECT(Frame_GetWindow); | |
| call_DoVerb(webbrowser, OLEIVERB_INPLACEACTIVATE); | |
| CHECK_CALLED(CanInPlaceActivate); | |
| CHECK_CALLED(Site_GetWindow); | |
| CHECK_CALLED(OnInPlaceActivate); | |
| CHECK_CALLED(GetWindowContext); | |
| CHECK_CALLED(ShowObject); | |
| CHECK_CALLED(GetContainer); | |
| CHECK_CALLED(Frame_GetWindow); | |
| hwnd = get_hwnd(webbrowser); | |
| memset(&rect, 0xa, sizeof(rect)); | |
| res = GetWindowRect(hwnd, &rect); | |
| ok(res, "GetWindowRect failed: %u\n", GetLastError()); | |
| SET_EXPECT(OnInPlaceDeactivate); | |
| call_DoVerb(webbrowser, OLEIVERB_HIDE); | |
| CHECK_CALLED(OnInPlaceDeactivate); | |
| test_ClientSite(webbrowser, NULL, FALSE); | |
| ref = IWebBrowser2_Release(webbrowser); | |
| ok(ref == 0, "ref=%d, expected 0\n", ref); | |
| } | |
| /* Check if Internet Explorer is configured to run in "Enhanced Security Configuration" (aka hardened mode) */ | |
| /* Note: this code is duplicated in dlls/mshtml/tests/mshtml_test.h and dlls/urlmon/tests/sec_mgr.c */ | |
| static BOOL is_ie_hardened(void) | |
| { | |
| HKEY zone_map; | |
| DWORD ie_harden, type, size; | |
| ie_harden = 0; | |
| if(RegOpenKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap", | |
| 0, KEY_QUERY_VALUE, &zone_map) == ERROR_SUCCESS) { | |
| size = sizeof(DWORD); | |
| if (RegQueryValueExA(zone_map, "IEHarden", NULL, &type, (LPBYTE) &ie_harden, &size) != ERROR_SUCCESS || | |
| type != REG_DWORD) { | |
| ie_harden = 0; | |
| } | |
| RegCloseKey(zone_map); | |
| } | |
| return ie_harden != 0; | |
| } | |
| static void test_FileProtocol(void) | |
| { | |
| IWebBrowser2 *webbrowser; | |
| HANDLE file; | |
| ULONG ref; | |
| char file_path[MAX_PATH]; | |
| char file_url[MAX_PATH] = "File://"; | |
| static const char test_file[] = "wine_test.html"; | |
| GetTempPathA(MAX_PATH, file_path); | |
| strcat(file_path, test_file); | |
| webbrowser = create_webbrowser(); | |
| if(!webbrowser) | |
| return; | |
| init_test(webbrowser, 0); | |
| file = CreateFileA(file_path, GENERIC_WRITE, 0, NULL, | |
| CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); | |
| if(file == INVALID_HANDLE_VALUE && GetLastError() != ERROR_FILE_EXISTS){ | |
| ok(0, "CreateFile failed\n"); | |
| return; | |
| } | |
| CloseHandle(file); | |
| GetLongPathNameA(file_path, file_path, sizeof(file_path)); | |
| strcat(file_url, file_path); | |
| test_ConnectionPoint(webbrowser, TRUE); | |
| test_ClientSite(webbrowser, &ClientSite, TRUE); | |
| test_DoVerb(webbrowser); | |
| test_Navigate2(webbrowser, file_url); | |
| test_ClientSite(webbrowser, NULL, TRUE); | |
| ref = IWebBrowser2_Release(webbrowser); | |
| ok(ref == 0, "ref=%u, expected 0\n", ref); | |
| if(file != INVALID_HANDLE_VALUE) | |
| DeleteFileA(file_path); | |
| } | |
| static HRESULT WINAPI sink_QueryInterface( IAdviseSink *iface, REFIID riid, void **obj) | |
| { | |
| if (IsEqualGUID(riid, &IID_IAdviseSink) || IsEqualGUID(riid, &IID_IUnknown)) { | |
| *obj = iface; | |
| return S_OK; | |
| } | |
| ok(0, "unexpected call QI(%s)\n", wine_dbgstr_guid(riid)); | |
| return E_NOINTERFACE; | |
| } | |
| static ULONG WINAPI sink_AddRef(IAdviseSink *iface) | |
| { | |
| return 2; | |
| } | |
| static ULONG WINAPI sink_Release(IAdviseSink *iface) | |
| { | |
| return 1; | |
| } | |
| static void WINAPI sink_OnDataChange(IAdviseSink *iface, FORMATETC *format, STGMEDIUM *medium) | |
| { | |
| trace("%p, %p, %p\n", iface, format, medium); | |
| } | |
| static void WINAPI sink_OnViewChange(IAdviseSink *iface, DWORD aspect, LONG index) | |
| { | |
| trace("%p, %08x, %d\n", iface, aspect, index); | |
| } | |
| static void WINAPI sink_OnRename(IAdviseSink *iface, IMoniker *moniker) | |
| { | |
| trace("%p, %p\n", iface, moniker); | |
| } | |
| static void WINAPI sink_OnSave(IAdviseSink *iface) | |
| { | |
| trace("%p\n", iface); | |
| } | |
| static void WINAPI sink_OnClose(IAdviseSink *iface) | |
| { | |
| trace("%p\n", iface); | |
| } | |
| static const IAdviseSinkVtbl sink_vtbl = | |
| { | |
| sink_QueryInterface, | |
| sink_AddRef, | |
| sink_Release, | |
| sink_OnDataChange, | |
| sink_OnViewChange, | |
| sink_OnRename, | |
| sink_OnSave, | |
| sink_OnClose | |
| }; | |
| static IAdviseSink test_sink = { &sink_vtbl }; | |
| static void test_SetAdvise(void) | |
| { | |
| HRESULT hr; | |
| IWebBrowser2 *browser; | |
| IViewObject2 *view; | |
| IAdviseSink *sink; | |
| IOleObject *oleobj; | |
| DWORD aspects, flags; | |
| if (!(browser = create_webbrowser())) return; | |
| init_test(browser, 0); | |
| hr = IWebBrowser2_QueryInterface(browser, &IID_IViewObject2, (void **)&view); | |
| ok(hr == S_OK, "got %08x\n", hr); | |
| if (FAILED(hr)) return; | |
| aspects = flags = 0xdeadbeef; | |
| sink = (IAdviseSink *)0xdeadbeef; | |
| hr = IViewObject2_GetAdvise(view, &aspects, &flags, &sink); | |
| ok(hr == S_OK, "got %08x\n", hr); | |
| ok(!aspects, "got %08x\n", aspects); | |
| ok(!flags, "got %08x\n", aspects); | |
| ok(sink == NULL, "got %p\n", sink); | |
| hr = IViewObject2_SetAdvise(view, DVASPECT_CONTENT, 0, (IAdviseSink *)&test_sink); | |
| ok(hr == S_OK, "got %08x\n", hr); | |
| aspects = flags = 0xdeadbeef; | |
| sink = (IAdviseSink *)0xdeadbeef; | |
| hr = IViewObject2_GetAdvise(view, &aspects, &flags, &sink); | |
| ok(hr == S_OK, "got %08x\n", hr); | |
| ok(aspects == DVASPECT_CONTENT, "got %08x\n", aspects); | |
| ok(!flags, "got %08x\n", aspects); | |
| ok(sink == &test_sink, "got %p\n", sink); | |
| hr = IWebBrowser2_QueryInterface(browser, &IID_IOleObject, (void **)&oleobj); | |
| ok(hr == S_OK, "got %08x\n", hr); | |
| SET_EXPECT(GetContainer); | |
| SET_EXPECT(Site_GetWindow); | |
| SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| SET_EXPECT(Invoke_AMBIENT_SILENT); | |
| hr = IOleObject_SetClientSite(oleobj, &ClientSite); | |
| ok(hr == S_OK, "got %08x\n", hr); | |
| CHECK_CALLED(GetContainer); | |
| CHECK_CALLED(Site_GetWindow); | |
| CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); | |
| CHECK_CALLED(Invoke_AMBIENT_SILENT); | |
| sink = (IAdviseSink *)0xdeadbeef; | |
| hr = IViewObject2_GetAdvise(view, &aspects, &flags, &sink); | |
| ok(hr == S_OK, "got %08x\n", hr); | |
| ok(sink == &test_sink, "got %p\n", sink); | |
| hr = IOleObject_SetClientSite(oleobj, NULL); | |
| ok(hr == S_OK, "got %08x\n", hr); | |
| aspects = flags = 0xdeadbeef; | |
| sink = (IAdviseSink *)0xdeadbeef; | |
| hr = IViewObject2_GetAdvise(view, &aspects, &flags, &sink); | |
| ok(hr == S_OK, "got %08x\n", hr); | |
| ok(sink == &test_sink, "got %p\n", sink); | |
| hr = IViewObject2_SetAdvise(view, 0, 0, NULL); | |
| ok(hr == S_OK, "got %08x\n", hr); | |
| IOleObject_Release(oleobj); | |
| IViewObject2_Release(view); | |
| IWebBrowser2_Release(browser); | |
| } | |
| START_TEST(webbrowser) | |
| { | |
| OleInitialize(NULL); | |
| container_hwnd = create_container_window(); | |
| trace("Testing WebBrowser (no download)...\n"); | |
| test_WebBrowser(0, FALSE); | |
| test_WebBrowser(0, TRUE); | |
| if(!is_ie_hardened()) { | |
| trace("Testing WebBrowser...\n"); | |
| test_WebBrowser(TEST_DOWNLOAD, FALSE); | |
| trace("Testing WebBrowser(no olecmd)...\n"); | |
| test_WebBrowser(TEST_DOWNLOAD|TEST_NOOLECMD, FALSE); | |
| }else { | |
| win_skip("Skipping http tests in hardened mode\n"); | |
| } | |
| trace("Testing WebBrowser DoVerb\n"); | |
| test_WebBrowser_DoVerb(); | |
| trace("Testing WebBrowser (with close)...\n"); | |
| test_WebBrowser(TEST_DOWNLOAD, TRUE); | |
| trace("Testing WebBrowser w/o container-based olecmd...\n"); | |
| test_WebBrowser_slim_container(); | |
| trace("Testing WebBrowserV1...\n"); | |
| test_WebBrowserV1(); | |
| trace("Testing file protocol...\n"); | |
| test_FileProtocol(); | |
| trace("Testing SetAdvise...\n"); | |
| test_SetAdvise(); | |
| OleUninitialize(); | |
| } |