diff --git a/rostests/winetests/mshtml/CMakeLists.txt b/rostests/winetests/mshtml/CMakeLists.txt index 41eb9a4c4ec..ad1e6867d15 100644 --- a/rostests/winetests/mshtml/CMakeLists.txt +++ b/rostests/winetests/mshtml/CMakeLists.txt @@ -20,16 +20,18 @@ add_executable(mshtml_winetest ${SOURCE} rsrc.rc) list(APPEND mshtml_winetest_rc_deps ${CMAKE_CURRENT_BINARY_DIR}/test_tlb.tlb + ${CMAKE_CURRENT_SOURCE_DIR}/blank.html ${CMAKE_CURRENT_SOURCE_DIR}/exectest.html ${CMAKE_CURRENT_SOURCE_DIR}/jstest.html + ${CMAKE_CURRENT_SOURCE_DIR}/nav_test.html ${CMAKE_CURRENT_SOURCE_DIR}/vbtest.html ${CMAKE_CURRENT_SOURCE_DIR}/events.html ${CMAKE_CURRENT_SOURCE_DIR}/externscr.js) set_source_files_properties(rsrc.rc PROPERTIES OBJECT_DEPENDS "${mshtml_winetest_rc_deps}") -target_link_libraries(mshtml_winetest wine uuid strmiids) +target_link_libraries(mshtml_winetest uuid strmiids) set_module_type(mshtml_winetest win32cui) -add_importlibs(mshtml_winetest wininet ole32 oleaut32 user32 gdi32 urlmon advapi32 msvcrt kernel32 ntdll) +add_importlibs(mshtml_winetest wininet ole32 oleaut32 user32 gdi32 urlmon advapi32 msvcrt kernel32) add_dependencies(mshtml_winetest test_tlb_header stdole2) add_cd_file(TARGET mshtml_winetest DESTINATION reactos/bin FOR all) diff --git a/rostests/winetests/mshtml/activex.c b/rostests/winetests/mshtml/activex.c index 0c52b59a174..e26a8600cd6 100644 --- a/rostests/winetests/mshtml/activex.c +++ b/rostests/winetests/mshtml/activex.c @@ -119,6 +119,7 @@ static ITypeInfo *actxtest_typeinfo, *class_typeinfo; static HWND container_hwnd, plugin_hwnd; static int plugin_behavior; static BOOL no_quickact; +static LONG activex_refcnt; #define TESTACTIVEX_CLSID "{178fc163-f585-4e24-9c13-4bb7f6680746}" @@ -164,18 +165,6 @@ static REFIID pluginhost_iids[] = { NULL }; -static const char *debugstr_guid(REFIID riid) -{ - static char buf[50]; - - sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", - riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], - riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], - riid->Data4[5], riid->Data4[6], riid->Data4[7]); - - return buf; -} - static BOOL iface_cmp(IUnknown *iface1, IUnknown *iface2) { IUnknown *unk1, *unk2; @@ -200,7 +189,7 @@ static void _test_ifaces(unsigned line, IUnknown *iface, REFIID *iids) for(piid = iids; *piid; piid++) { hres = IUnknown_QueryInterface(iface, *piid, (void**)&unk); - ok_(__FILE__,line) (hres == S_OK, "Could not get %s interface: %08x\n", debugstr_guid(*piid), hres); + ok_(__FILE__,line) (hres == S_OK, "Could not get %s interface: %08x\n", wine_dbgstr_guid(*piid), hres); if(SUCCEEDED(hres)) IUnknown_Release(unk); } @@ -283,7 +272,7 @@ static LRESULT WINAPI plugin_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa } } - return DefWindowProc(hwnd, msg, wParam, lParam); + return DefWindowProcW(hwnd, msg, wParam, lParam); } static void create_plugin_window(HWND parent, const RECT *rect) @@ -307,7 +296,7 @@ static void create_plugin_window(HWND parent, const RECT *rect) static HRESULT WINAPI ConnectionPoint_QueryInterface(IConnectionPoint *iface, REFIID riid, void **ppv) { - ok(0, "unexpected QI call %s\n", debugstr_guid(riid)); + ok(0, "unexpected QI call %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -398,12 +387,12 @@ static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID riid, static ULONG WINAPI OleControl_AddRef(IOleControl *iface) { - return 2; + return ++activex_refcnt; } static ULONG WINAPI OleControl_Release(IOleControl *iface) { - return 1; + return --activex_refcnt; } static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *pCI) @@ -459,12 +448,12 @@ static HRESULT WINAPI QuickActivate_QueryInterface(IQuickActivate *iface, REFIID static ULONG WINAPI QuickActivate_AddRef(IQuickActivate *iface) { - return 2; + return ++activex_refcnt; } static ULONG WINAPI QuickActivate_Release(IQuickActivate *iface) { - return 1; + return --activex_refcnt; } static HRESULT WINAPI QuickActivate_QuickActivate(IQuickActivate *iface, QACONTAINER *container, QACONTROL *control) @@ -547,12 +536,12 @@ static HRESULT WINAPI PersistPropertyBag_QueryInterface(IPersistPropertyBag *ifa static ULONG WINAPI PersistPropertyBag_AddRef(IPersistPropertyBag *iface) { - return 2; + return ++activex_refcnt; } static ULONG WINAPI PersistPropertyBag_Release(IPersistPropertyBag *iface) { - return 1; + return --activex_refcnt; } static HRESULT WINAPI PersistPropertyBag_GetClassID(IPersistPropertyBag *face, CLSID *pClassID) @@ -689,12 +678,12 @@ static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, voi static ULONG WINAPI Dispatch_AddRef(IDispatch *iface) { - return 2; + return ++activex_refcnt; } static ULONG WINAPI Dispatch_Release(IDispatch *iface) { - return 1; + return --activex_refcnt; } static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo) @@ -716,7 +705,7 @@ static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID l static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) { - ok(IsEqualGUID(riid, &IID_NULL), "riid = %s\n", debugstr_guid(riid)); + ok(IsEqualGUID(riid, &IID_NULL), "riid = %s\n", wine_dbgstr_guid(riid)); ok(cNames == 1, "cNames = %d\n", cNames); ok(rgszNames != NULL, "rgszNames == NULL\n"); ok(rgDispId != NULL, "rgDispId == NULL\n"); @@ -737,7 +726,7 @@ static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REF LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { - ok(IsEqualGUID(riid, &IID_NULL), "riid = %s\n", debugstr_guid(riid)); + ok(IsEqualGUID(riid, &IID_NULL), "riid = %s\n", wine_dbgstr_guid(riid)); ok(pDispParams != NULL, "pDispParams == NULL\n"); ok(!pDispParams->cNamedArgs, "pDispParams->cNamedArgs = %d\n", pDispParams->cNamedArgs); ok(!pDispParams->rgdispidNamedArgs, "pDispParams->rgdispidNamedArgs != NULL\n"); @@ -832,12 +821,12 @@ static HRESULT WINAPI ProvideClassInfo_QueryInterface(IProvideClassInfo *iface, static ULONG WINAPI ProvideClassInfo_AddRef(IProvideClassInfo *iface) { - return 2; + return ++activex_refcnt; } static ULONG WINAPI ProvideClassInfo_Release(IProvideClassInfo *iface) { - return 1; + return --activex_refcnt; } static HRESULT WINAPI ProvideClassInfo_GetClassInfo(IProvideClassInfo *iface, ITypeInfo **ppTI) @@ -865,12 +854,12 @@ static HRESULT WINAPI ConnectionPointContainer_QueryInterface(IConnectionPointCo static ULONG WINAPI ConnectionPointContainer_AddRef(IConnectionPointContainer *iface) { - return 2; + return ++activex_refcnt; } static ULONG WINAPI ConnectionPointContainer_Release(IConnectionPointContainer *iface) { - return 1; + return --activex_refcnt; } static HRESULT WINAPI ConnectionPointContainer_EnumConnectionPoints(IConnectionPointContainer *iface, @@ -890,8 +879,9 @@ static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPo } CHECK_EXPECT(FindConnectionPoint); - ok(IsEqualGUID(riid, &DIID_DispActiveXTest), "riid = %s\n", debugstr_guid(riid)); + ok(IsEqualGUID(riid, &DIID_DispActiveXTest), "riid = %s\n", wine_dbgstr_guid(riid)); + IConnectionPoint_AddRef(&ConnectionPoint); *ppCP = &ConnectionPoint; return S_OK; } @@ -913,12 +903,12 @@ static HRESULT WINAPI ViewObjectEx_QueryInterface(IViewObjectEx *iface, REFIID r static ULONG WINAPI ViewObjectEx_AddRef(IViewObjectEx *iface) { - return 2; + return ++activex_refcnt; } static ULONG WINAPI ViewObjectEx_Release(IViewObjectEx *iface) { - return 1; + return --activex_refcnt; } static HRESULT WINAPI ViewObjectEx_Draw(IViewObjectEx *iface, DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, @@ -987,7 +977,7 @@ static HRESULT WINAPI ViewObjectEx_GetViewStatus(IViewObjectEx *iface, DWORD *pd static HRESULT WINAPI ViewObjectEx_QueryHitPoint(IViewObjectEx *iface, DWORD dwAspect, LPCRECT pRectBounds, POINT ptlLoc, LONG lCloseHint, DWORD *pHitResult) { - ok(0, "unexpected call\n"); + trace("QueryHitPoint call ignored\n"); return E_NOTIMPL; } @@ -1032,12 +1022,12 @@ static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, v static ULONG WINAPI OleObject_AddRef(IOleObject *iface) { - return 2; + return ++activex_refcnt; } static ULONG WINAPI OleObject_Release(IOleObject *iface) { - return 1; + return --activex_refcnt; } static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite) @@ -1291,12 +1281,12 @@ static HRESULT WINAPI OleInPlaceObject_QueryInterface(IOleInPlaceObjectWindowles static ULONG WINAPI OleInPlaceObject_AddRef(IOleInPlaceObjectWindowless *iface) { - return 2; + return ++activex_refcnt; } static ULONG WINAPI OleInPlaceObject_Release(IOleInPlaceObjectWindowless *iface) { - return 1; + return --activex_refcnt; } static HRESULT WINAPI OleInPlaceObject_GetWindow(IOleInPlaceObjectWindowless *iface, @@ -1343,7 +1333,7 @@ static HRESULT WINAPI OleInPlaceObject_UIDeactivate(IOleInPlaceObjectWindowless static HRESULT WINAPI OleInPlaceObject_SetObjectRects(IOleInPlaceObjectWindowless *iface, LPCRECT lprcPosRect, LPCRECT lprcClipRect) { - CHECK_EXPECT(SetObjectRects); + CHECK_EXPECT2(SetObjectRects); return S_OK; } @@ -1456,15 +1446,20 @@ static HRESULT ax_qi(REFIID riid, void **ppv) }else if(IsEqualGUID(riid, &IID_ITestActiveX)) { CHECK_EXPECT(QI_ITestActiveX); *ppv = &wrapped_iface; + return S_OK; }else if(IsEqualGUID(riid, &IID_IOleWindow) || IsEqualGUID(riid, &IID_IOleInPlaceObject) || IsEqualGUID(&IID_IOleInPlaceObjectWindowless, riid)) { *ppv = plugin_behavior == TEST_DISPONLY ? NULL : &OleInPlaceObjectWindowless; }else { - trace("QI %s\n", debugstr_guid(riid)); + trace("QI %s\n", wine_dbgstr_guid(riid)); *ppv = NULL; } - return *ppv ? S_OK : E_NOINTERFACE; + if(!*ppv) + return E_NOINTERFACE; + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; } static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) @@ -1483,7 +1478,7 @@ static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID r if(IsEqualGUID(&IID_IClassFactoryEx, riid)) return E_NOINTERFACE; /* TODO */ - ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); return E_NOTIMPL; } @@ -1502,8 +1497,9 @@ static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown CHECK_EXPECT(CreateInstance); ok(!outer, "outer = %p\n", outer); - ok(IsEqualGUID(riid, &IID_IUnknown), "riid = %s\n", debugstr_guid(riid)); + ok(IsEqualGUID(riid, &IID_IUnknown), "riid = %s\n", wine_dbgstr_guid(riid)); + activex_refcnt++; *ppv = &OleControl; return S_OK; } @@ -1675,7 +1671,7 @@ static void test_object_elem(IHTMLDocument2 *doc) hres = IHTMLObjectElement_put_width(objelem, v); ok(hres == S_OK, "put_width failed: %08x\n", hres); CHECK_CALLED(OnAmbientPropertyChange_UNKNOWN); - CHECK_CALLED(Invoke_ENABLED); + CLEAR_CALLED(Invoke_ENABLED); /* Not called on IE10 */ hres = IHTMLObjectElement_get_width(objelem, &v); ok(hres == S_OK, "get_width failed: %08x\n", hres); @@ -1690,7 +1686,7 @@ static void test_object_elem(IHTMLDocument2 *doc) hres = IHTMLObjectElement_put_height(objelem, v); ok(hres == S_OK, "put_height failed: %08x\n", hres); CHECK_CALLED(OnAmbientPropertyChange_UNKNOWN); - CHECK_CALLED(Invoke_ENABLED); + CLEAR_CALLED(Invoke_ENABLED); /* Not called on IE10 */ hres = IHTMLObjectElement_get_height(objelem, &v); ok(hres == S_OK, "get_height failed: %08x\n", hres); @@ -1739,6 +1735,7 @@ static void test_container(IHTMLDocument2 *doc_obj) ok(hres == S_OK, "QueryService(CLSID_TestActiveX) failed: %08x\n", hres); ok(unk == (IUnknown*)&OleObject, "unexpected unk %p\n", unk); CHECK_CALLED(QueryService_TestActiveX); + IUnknown_Release(unk); IServiceProvider_Release(serv_prov); @@ -1757,7 +1754,7 @@ static void test_ui_activate(void) SET_EXPECT(Invoke_ENABLED); hres = IOleInPlaceSite_OnUIActivate(ip_site); ok(hres == S_OK, "OnUIActivate failed: %08x\n", hres); - CHECK_CALLED(Invoke_ENABLED); + CLEAR_CALLED(Invoke_ENABLED); /* Not called on IE10 */ IOleInPlaceSite_Release(ip_site); } @@ -1770,7 +1767,7 @@ static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, REFII static const GUID undocumented_frame_iid = {0xfbece6c9,0x48d7,0x4a37,{0x8f,0xe3,0x6a,0xd4,0x27,0x2f,0xdd,0xac}}; if(!IsEqualGUID(&undocumented_frame_iid, riid)) - ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); *ppv = NULL; return E_NOINTERFACE; @@ -2143,7 +2140,7 @@ static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFG { if(IsEqualGUID(&CLSID_TestActiveX, guidService)) { CHECK_EXPECT(QueryService_TestActiveX); - ok(IsEqualGUID(&IID_IUnknown, riid), "unexpected riid %s\n", debugstr_guid(riid)); + ok(IsEqualGUID(&IID_IUnknown, riid), "unexpected riid %s\n", wine_dbgstr_guid(riid)); *ppv = &OleObject; return S_OK; } @@ -2334,9 +2331,9 @@ static IHTMLDocument2 *create_doc(const char *str) doc_load_string(doc, str); do_advise((IUnknown*)doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink); - while(!doc_complete && GetMessage(&msg, NULL, 0, 0)) { + while(!doc_complete && GetMessageW(&msg, NULL, 0, 0)) { TranslateMessage(&msg); - DispatchMessage(&msg); + DispatchMessageW(&msg); } return doc; @@ -2359,12 +2356,15 @@ static void release_doc(IHTMLDocument2 *doc) DestroyWindow(plugin_hwnd); plugin_hwnd = NULL; } + + ok(!activex_refcnt, "activex_refcnt = %d\n", activex_refcnt); } static void init_test(int behavior) { plugin_behavior = behavior; + activex_refcnt = 0; no_quickact = behavior == TEST_NOQUICKACT || behavior == TEST_DISPONLY; } @@ -2399,6 +2399,7 @@ static void test_event_call(void) static void test_flash_ax(void) { IHTMLDocument2 *doc; + IOleClientSite *cs; init_test(TEST_FLASH); @@ -2448,6 +2449,9 @@ static void test_flash_ax(void) skip("Skipping test_object_elem(notif_doc). ROSTESTS-114.\n"); } + IOleClientSite_AddRef(client_site); + cs = client_site; + SET_EXPECT(UIDeactivate); SET_EXPECT(Invoke_ENABLED); SET_EXPECT(Invoke_VALID); @@ -2456,13 +2460,14 @@ static void test_flash_ax(void) SET_EXPECT(SetClientSite_NULL); release_doc(doc); CHECK_CALLED(UIDeactivate); - todo_wine - CHECK_CALLED(Invoke_ENABLED); + CLEAR_CALLED(Invoke_ENABLED); /* Not called on IE10 */ todo_wine CHECK_CALLED(Invoke_VALID); CHECK_CALLED(InPlaceDeactivate); CHECK_CALLED(Close); CHECK_CALLED(SetClientSite_NULL); + + IOleClientSite_Release(cs); } static void test_noquickact_ax(void) @@ -2602,7 +2607,7 @@ static void test_nooleobj_ax(void) static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - return DefWindowProc(hwnd, msg, wParam, lParam); + return DefWindowProcW(hwnd, msg, wParam, lParam); } static HWND create_container_window(void) @@ -2650,7 +2655,7 @@ static BOOL init_key(const char *key_name, const char *def_value, BOOL init) DWORD res; if(!init) { - RegDeleteKey(HKEY_CLASSES_ROOT, key_name); + RegDeleteKeyA(HKEY_CLASSES_ROOT, key_name); return TRUE; } diff --git a/rostests/winetests/mshtml/blank.html b/rostests/winetests/mshtml/blank.html new file mode 100644 index 00000000000..18ecdcb795c --- /dev/null +++ b/rostests/winetests/mshtml/blank.html @@ -0,0 +1 @@ + diff --git a/rostests/winetests/mshtml/dom.c b/rostests/winetests/mshtml/dom.c index 689578561ae..c9531188fc9 100644 --- a/rostests/winetests/mshtml/dom.c +++ b/rostests/winetests/mshtml/dom.c @@ -470,18 +470,6 @@ static const elem_type_info_t elem_type_infos[] = { {"BUTTON", button_iids, &DIID_DispHTMLButtonElement} }; -static const char *dbgstr_guid(REFIID riid) -{ - static char buf[50]; - - sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", - riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], - riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], - riid->Data4[5], riid->Data4[6], riid->Data4[7]); - - return buf; -} - static int strcmp_wa(LPCWSTR strw, const char *stra) { CHAR buf[512]; @@ -562,7 +550,7 @@ static void _test_ifaces(unsigned line, IUnknown *iface, REFIID *iids) for(piid = iids; *piid; piid++) { hres = IUnknown_QueryInterface(iface, *piid, (void**)&unk); - ok_(__FILE__,line) (hres == S_OK, "Could not get %s interface: %08x\n", dbgstr_guid(*piid), hres); + ok_(__FILE__,line) (hres == S_OK, "Could not get %s interface: %08x\n", wine_dbgstr_guid(*piid), hres); if(SUCCEEDED(hres)) IUnknown_Release(unk); } @@ -639,7 +627,7 @@ static void _test_disp(unsigned line, IUnknown *unk, const IID *diid, const char IID iid; if(_test_get_dispid(line, unk, &iid)) - ok_(__FILE__,line) (IsEqualGUID(&iid, diid), "unexpected guid %s\n", dbgstr_guid(&iid)); + ok_(__FILE__,line) (IsEqualGUID(&iid, diid), "unexpected guid %s\n", wine_dbgstr_guid(&iid)); if(val) _test_disp_value(line, unk, val); @@ -652,7 +640,7 @@ static void _test_disp2(unsigned line, IUnknown *unk, const IID *diid, const IID if(_test_get_dispid(line, unk, &iid)) ok_(__FILE__,line) (IsEqualGUID(&iid, diid) || broken(IsEqualGUID(&iid, diid2)), - "unexpected guid %s\n", dbgstr_guid(&iid)); + "unexpected guid %s\n", wine_dbgstr_guid(&iid)); if(val) _test_disp_value(line, unk, val); @@ -684,7 +672,7 @@ static void _test_class_info(unsigned line, IUnknown *unk) if(SUCCEEDED(hres)) { ok_(__FILE__,line)(IsEqualGUID(&type_attr->guid, &CLSID_HTMLDocument), - "unexpected guid %s\n", dbgstr_guid(&type_attr->guid)); + "unexpected guid %s\n", wine_dbgstr_guid(&type_attr->guid)); ok_(__FILE__,line)(type_attr->typekind == TKIND_COCLASS, "unexpected typekind %d\n", type_attr->typekind); ITypeInfo_ReleaseTypeAttr(typeinfo, type_attr); @@ -759,6 +747,18 @@ static IHTMLElement4 *_get_elem4_iface(unsigned line, IUnknown *unk) return elem; } +#define get_doc3_iface(u) _get_doc3_iface(__LINE__,u) +static IHTMLDocument3 *_get_doc3_iface(unsigned line, IHTMLDocument2 *doc) +{ + IHTMLDocument3 *doc3; + HRESULT hres; + + hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3); + ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDocument3 interface: %08x\n", hres); + + return doc3; +} + #define get_node_iface(u) _get_node_iface(__LINE__,u) static IHTMLDOMNode *_get_node_iface(unsigned line, IUnknown *unk) { @@ -1943,6 +1943,28 @@ static void _test_select_type(unsigned line, IHTMLSelectElement *select, const c SysFreeString(type); } +#define test_select_multiple(s,t) _test_select_multiple(__LINE__,s,t) +static void _test_select_multiple(unsigned line, IHTMLSelectElement *select, VARIANT_BOOL exmultiple) +{ + VARIANT_BOOL b = 100; + HRESULT hres; + + hres = IHTMLSelectElement_get_multiple(select, &b); + ok_(__FILE__,line) (hres == S_OK, "get_multiple failed: %08x\n", hres); + ok_(__FILE__,line) (b == exmultiple, "multiple=%x, expected %x\n", b, exmultiple); +} + +#define test_select_set_multiple(s,v) _test_select_set_multiple(__LINE__,s,v) +static void _test_select_set_multiple(unsigned line, IHTMLSelectElement *select, VARIANT_BOOL val) +{ + HRESULT hres; + + hres = IHTMLSelectElement_put_multiple(select, val); + ok_(__FILE__,line) (hres == S_OK, "put_multiple failed: %08x\n", hres); + + _test_select_multiple(line, select, val); +} + #define test_range_text(r,t) _test_range_text(__LINE__,r,t) static void _test_range_text(unsigned line, IHTMLTxtRange *range, const char *extext) { @@ -4212,6 +4234,9 @@ static void test_select_elem(IHTMLSelectElement *select) ok(iface_cmp((IUnknown*)disp, (IUnknown*)disp2), "disp != disp2\n"); IDispatch_Release(disp2); IDispatch_Release(disp); + + test_select_multiple(select, VARIANT_FALSE); + test_select_set_multiple(select, VARIANT_TRUE); } static void test_form_item(IHTMLElement *elem) @@ -5171,6 +5196,31 @@ static void test_default_body(IHTMLBodyElement *body) VariantClear(&v); } +#define test_body_scroll(a,b) _test_body_scroll(__LINE__,a,b) +static void _test_body_scroll(unsigned line, IHTMLBodyElement *body, const char *ex) +{ + BSTR str; + HRESULT hres; + + hres = IHTMLBodyElement_get_scroll(body, &str); + ok_(__FILE__,line)(hres == S_OK, "get_scroll failed: %08x\n", hres); + ok_(__FILE__,line)(ex ? !strcmp_wa(str, ex) : !str, "scroll = %s\n", wine_dbgstr_w(str)); + SysFreeString(str); +} + +#define set_body_scroll(a,b) _set_body_scroll(__LINE__,a,b) +static void _set_body_scroll(unsigned line, IHTMLBodyElement *body, const char *val) +{ + BSTR str = a2bstr(val); + HRESULT hres; + + hres = IHTMLBodyElement_put_scroll(body, str); + ok_(__FILE__,line)(hres == S_OK, "put_scroll failed: %08x\n", hres); + SysFreeString(str); + + _test_body_scroll(line, body, val); +} + static void test_body_funs(IHTMLBodyElement *body) { VARIANT vbg, vDefaultbg; @@ -5197,6 +5247,11 @@ static void test_body_funs(IHTMLBodyElement *body) hres = IHTMLBodyElement_put_bgColor(body, vDefaultbg); ok(hres == S_OK, "put_bgColor failed: %08x\n", hres); VariantClear(&vDefaultbg); + + test_body_scroll(body, NULL); + set_body_scroll(body, "yes"); + set_body_scroll(body, "no"); + set_body_scroll(body, "auto"); } static void test_history(IHTMLWindow2 *window) @@ -5521,6 +5576,9 @@ static void test_tr_elem(IHTMLElement *elem) IHTMLElementCollection *col; IHTMLTableRow *row; HRESULT hres; + BSTR bstr; + LONG lval; + VARIANT vbg, vDefaultbg; static const elem_type_t cell_types[] = {ET_TD,ET_TD}; @@ -5537,6 +5595,74 @@ static void test_tr_elem(IHTMLElement *elem) test_elem_collection((IUnknown*)col, cell_types, sizeof(cell_types)/sizeof(*cell_types)); IHTMLElementCollection_Release(col); + bstr = a2bstr("left"); + hres = IHTMLTableRow_put_align(row, bstr); + ok(hres == S_OK, "set_align failed: %08x\n", hres); + SysFreeString(bstr); + + bstr = NULL; + hres = IHTMLTableRow_get_align(row, &bstr); + ok(hres == S_OK, "get_align failed: %08x\n", hres); + ok(bstr != NULL, "get_align returned NULL\n"); + ok(!strcmp_wa(bstr, "left"), "get_align returned %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + bstr = a2bstr("top"); + hres = IHTMLTableRow_put_vAlign(row, bstr); + ok(hres == S_OK, "set_valign failed: %08x\n", hres); + SysFreeString(bstr); + + bstr = NULL; + hres = IHTMLTableRow_get_vAlign(row, &bstr); + ok(hres == S_OK, "get_valign failed: %08x\n", hres); + ok(bstr != NULL, "get_valign returned NULL\n"); + ok(!strcmp_wa(bstr, "top"), "get_valign returned %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + lval = 0xdeadbeef; + hres = IHTMLTableRow_get_rowIndex(row, &lval); + ok(hres == S_OK, "get_rowIndex failed: %08x\n", hres); + ok(lval == 1, "get_rowIndex returned %d\n", lval); + + lval = 0xdeadbeef; + hres = IHTMLTableRow_get_sectionRowIndex(row, &lval); + ok(hres == S_OK, "get_sectionRowIndex failed: %08x\n", hres); + ok(lval == 1, "get_sectionRowIndex returned %d\n", lval); + + hres = IHTMLTableRow_get_bgColor(row, &vDefaultbg); + ok(hres == S_OK, "get_bgColor failed: %08x\n", hres); + ok(V_VT(&vDefaultbg) == VT_BSTR, "bstr != NULL\n"); + ok(!V_BSTR(&vDefaultbg), "V_BSTR(bgColor) = %s\n", wine_dbgstr_w(V_BSTR(&vDefaultbg))); + + V_VT(&vbg) = VT_BSTR; + V_BSTR(&vbg) = a2bstr("red"); + hres = IHTMLTableRow_put_bgColor(row, vbg); + ok(hres == S_OK, "put_bgColor failed: %08x\n", hres); + VariantClear(&vbg); + + hres = IHTMLTableRow_get_bgColor(row, &vbg); + ok(hres == S_OK, "get_bgColor failed: %08x\n", hres); + ok(V_VT(&vDefaultbg) == VT_BSTR, "V_VT(&vDefaultbg) != VT_BSTR\n"); + ok(!strcmp_wa(V_BSTR(&vbg), "#ff0000"), "Unexpected bgcolor %s\n", wine_dbgstr_w(V_BSTR(&vbg))); + VariantClear(&vbg); + + V_VT(&vbg) = VT_I4; + V_I4(&vbg) = 0xff0000; + hres = IHTMLTableRow_put_bgColor(row, vbg); + ok(hres == S_OK, "put_bgColor failed: %08x\n", hres); + VariantClear(&vbg); + + hres = IHTMLTableRow_get_bgColor(row, &vbg); + ok(hres == S_OK, "get_bgColor failed: %08x\n", hres); + ok(V_VT(&vDefaultbg) == VT_BSTR, "V_VT(&vDefaultbg) != VT_BSTR\n"); + ok(!strcmp_wa(V_BSTR(&vbg), "#ff0000"), "Unexpected bgcolor %s\n", wine_dbgstr_w(V_BSTR(&vbg))); + VariantClear(&vbg); + + /* Restore Originial */ + hres = IHTMLTableRow_put_bgColor(row, vDefaultbg); + ok(hres == S_OK, "put_bgColor failed: %08x\n", hres); + VariantClear(&vDefaultbg); + IHTMLTableRow_Release(row); } @@ -5602,6 +5728,8 @@ static void test_table_elem(IHTMLElement *elem) IHTMLDOMNode *node; VARIANT v; HRESULT hres; + BSTR bstr; + VARIANT vbg, vDefaultbg; static const elem_type_t row_types[] = {ET_TR,ET_TR}; static const elem_type_t all_types[] = {ET_TBODY,ET_TR,ET_TR,ET_TD,ET_TD}; @@ -5655,6 +5783,52 @@ static void test_table_elem(IHTMLElement *elem) test_table_cell_spacing(table, "11"); VariantClear(&v); + bstr = a2bstr("left"); + hres = IHTMLTable_put_align(table, bstr); + ok(hres == S_OK, "set_align failed: %08x\n", hres); + SysFreeString(bstr); + + bstr = NULL; + hres = IHTMLTable_get_align(table, &bstr); + ok(hres == S_OK, "get_align failed: %08x\n", hres); + ok(bstr != NULL, "get_align returned NULL\n"); + ok(!strcmp_wa(bstr, "left"), "get_align returned %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + hres = IHTMLTable_get_bgColor(table, &vDefaultbg); + ok(hres == S_OK, "get_bgColor failed: %08x\n", hres); + ok(V_VT(&vDefaultbg) == VT_BSTR, "bstr != NULL\n"); + ok(!V_BSTR(&vDefaultbg), "V_BSTR(bgColor) = %s\n", wine_dbgstr_w(V_BSTR(&vDefaultbg))); + + V_VT(&vbg) = VT_BSTR; + V_BSTR(&vbg) = a2bstr("red"); + hres = IHTMLTable_put_bgColor(table, vbg); + ok(hres == S_OK, "put_bgColor failed: %08x\n", hres); + VariantClear(&vbg); + + hres = IHTMLTable_get_bgColor(table, &vbg); + ok(hres == S_OK, "get_bgColor failed: %08x\n", hres); + ok(V_VT(&vDefaultbg) == VT_BSTR, "V_VT(&vDefaultbg) != VT_BSTR\n"); + ok(!strcmp_wa(V_BSTR(&vbg), "#ff0000"), "Unexpected bgcolor %s\n", wine_dbgstr_w(V_BSTR(&vbg))); + VariantClear(&vbg); + + V_VT(&vbg) = VT_I4; + V_I4(&vbg) = 0xff0000; + hres = IHTMLTable_put_bgColor(table, vbg); + ok(hres == S_OK, "put_bgColor failed: %08x\n", hres); + VariantClear(&vbg); + + hres = IHTMLTable_get_bgColor(table, &vbg); + ok(hres == S_OK, "get_bgColor failed: %08x\n", hres); + ok(V_VT(&vDefaultbg) == VT_BSTR, "V_VT(&vDefaultbg) != VT_BSTR\n"); + ok(!strcmp_wa(V_BSTR(&vbg), "#ff0000"), "Unexpected bgcolor %s\n", wine_dbgstr_w(V_BSTR(&vbg))); + VariantClear(&vbg); + + /* Restore Originial */ + hres = IHTMLTable_put_bgColor(table, vDefaultbg); + ok(hres == S_OK, "put_bgColor failed: %08x\n", hres); + VariantClear(&vDefaultbg); + IHTMLTable_Release(table); } @@ -5903,6 +6077,7 @@ static void test_stylesheet(IDispatch *disp) IHTMLStyleSheetRulesCollection *col = NULL; IHTMLStyleSheet *stylesheet; HRESULT hres; + BSTR href; test_disp2((IUnknown*)disp, &DIID_DispHTMLStyleSheet, &IID_IHTMLStyleSheet, "[object]"); @@ -5912,8 +6087,14 @@ static void test_stylesheet(IDispatch *disp) hres = IHTMLStyleSheet_get_rules(stylesheet, &col); ok(hres == S_OK, "get_rules failed: %08x\n", hres); ok(col != NULL, "col == NULL\n"); - IHTMLStyleSheetRulesCollection_Release(col); + + href = (void*)0xdeadbeef; + hres = IHTMLStyleSheet_get_href(stylesheet, &href); + ok(hres == S_OK, "get_href failed: %08x\n", hres); + ok(href == NULL, "got href != NULL\n"); + SysFreeString(href); + IHTMLStyleSheet_Release(stylesheet); } @@ -5952,7 +6133,6 @@ static void test_stylesheets(IHTMLDocument2 *doc) hres = IHTMLStyleSheetsCollection_item(col, &idx, &res); ok(hres == E_INVALIDARG, "item failed: %08x, expected E_INVALIDARG\n", hres); ok(V_VT(&res) == VT_EMPTY, "V_VT(res) = %d\n", V_VT(&res)); - ok(V_DISPATCH(&res) != NULL, "V_DISPATCH(&res) == NULL\n"); VariantClear(&res); IHTMLStyleSheetsCollection_Release(col); @@ -6682,6 +6862,54 @@ static void test_blocked(IHTMLDocument2 *doc, IHTMLElement *outer_elem) } } +#define doc_get_elems_by_name(a,b) _doc_get_elems_by_name(__LINE__,a,b) +static IHTMLElementCollection *_doc_get_elems_by_name(unsigned line, IHTMLDocument2 *doc, const char *name) +{ + IHTMLDocument3 *doc3 = _get_doc3_iface(line, doc); + IHTMLElementCollection *col; + BSTR str = a2bstr(name); + HRESULT hres; + + hres = IHTMLDocument3_getElementsByName(doc3, str, &col); + ok_(__FILE__,line)(hres == S_OK, "getElementsByName failed: %08x\n", hres); + ok_(__FILE__,line)(col != NULL, "col = NULL\n"); + + IHTMLDocument3_Release(doc3); + SysFreeString(str); + return col; +} + +static void test_elem_names(IHTMLDocument2 *doc) +{ + IHTMLElementCollection *col; + IHTMLElement *body; + LONG len; + HRESULT hres; + + static const elem_type_t test1_types[] = {ET_INPUT, ET_A, ET_DIV}; + + body = doc_get_body(doc); + + test_elem_set_innerhtml((IUnknown*)body, + "
"); + col = doc_get_elems_by_name(doc, "test"); + test_elem_collection((IUnknown*)col, test1_types, sizeof(test1_types)/sizeof(*test1_types)); + IHTMLElementCollection_Release(col); + + col = doc_get_elems_by_name(doc, "yyy"); + test_elem_collection((IUnknown*)col, NULL, 0); + IHTMLElementCollection_Release(col); + + /* case insensivity test */ + col = doc_get_elems_by_name(doc, "Xxx"); + hres = IHTMLElementCollection_get_length(col, &len); + ok(hres == S_OK, "get_length failed: %08x\n", hres); + todo_wine ok(len == 1, "len = %d\n", len); + IHTMLElementCollection_Release(col); + + IHTMLElement_Release(body); +} + static void test_elems2(IHTMLDocument2 *doc) { IHTMLElement *elem, *elem2, *div; @@ -6770,6 +6998,7 @@ static void test_elems2(IHTMLDocument2 *doc) test_attr(div); test_blocked(doc, div); + test_elem_names(doc); IHTMLElement_Release(div); } @@ -7120,7 +7349,7 @@ static void test_cond_comment(IHTMLDocument2 *doc) static HRESULT WINAPI Unknown_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) { - ok(IsEqualGUID(riid, &IID_IServiceProvider), "riid = %s\n", dbgstr_guid(riid)); + ok(IsEqualGUID(riid, &IID_IServiceProvider), "riid = %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -7542,9 +7771,9 @@ static void run_domtest(const char *str, domtest_t test) do_advise((IUnknown*)doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink); - while(!doc_complete && GetMessage(&msg, NULL, 0, 0)) { + while(!doc_complete && GetMessageW(&msg, NULL, 0, 0)) { TranslateMessage(&msg); - DispatchMessage(&msg); + DispatchMessageW(&msg); } test(doc); diff --git a/rostests/winetests/mshtml/events.c b/rostests/winetests/mshtml/events.c index e985dbae5d7..f8f833b2d6b 100644 --- a/rostests/winetests/mshtml/events.c +++ b/rostests/winetests/mshtml/events.c @@ -83,11 +83,13 @@ DEFINE_EXPECT(submit_onclick_attached); DEFINE_EXPECT(submit_onclick_attached_check_cancel); DEFINE_EXPECT(submit_onclick_setret); DEFINE_EXPECT(elem2_cp_onclick); +DEFINE_EXPECT(iframe_onload); static HWND container_hwnd = NULL; static IHTMLWindow2 *window; static IOleDocumentView *view; static BOOL xy_todo; +static BOOL is_ie9plus; typedef struct { LONG x; @@ -125,18 +127,6 @@ static const char form_doc_str[] = "" ""; -static const char *debugstr_guid(REFIID riid) -{ - static char buf[50]; - - sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", - riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], - riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], - riid->Data4[5], riid->Data4[6], riid->Data4[7]); - - return buf; -} - static int strcmp_wa(LPCWSTR strw, const char *stra) { CHAR buf[512]; @@ -198,7 +188,7 @@ static void _test_disp(unsigned line, IUnknown *unk, const IID *diid) hres = ITypeInfo_GetTypeAttr(typeinfo, &type_attr); ok_(__FILE__,line) (hres == S_OK, "GetTypeAttr failed: %08x\n", hres); ok_(__FILE__,line) (IsEqualGUID(&type_attr->guid, diid), "unexpected guid %s\n", - debugstr_guid(&type_attr->guid)); + wine_dbgstr_guid(&type_attr->guid)); ITypeInfo_ReleaseTypeAttr(typeinfo, type_attr); ITypeInfo_Release(typeinfo); @@ -255,6 +245,18 @@ static IHTMLElement3 *_get_elem3_iface(unsigned line, IUnknown *unk) return elem3; } +#define get_iframe_iface(u) _get_iframe_iface(__LINE__,u) +static IHTMLIFrameElement *_get_iframe_iface(unsigned line, IUnknown *unk) +{ + IHTMLIFrameElement *iframe; + HRESULT hres; + + hres = IUnknown_QueryInterface(unk, &IID_IHTMLIFrameElement, (void**)&iframe); + ok_(__FILE__,line)(hres == S_OK, "QueryInterface(IID_IHTMLIFrameElement) failed: %08x\n", hres); + + return iframe; +} + #define doc_get_body(d) _doc_get_body(__LINE__,d) static IHTMLElement *_doc_get_body(unsigned line, IHTMLDocument2 *doc) { @@ -729,7 +731,7 @@ static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, || IsEqualGUID(riid, &IID_IDispatchEx)) *ppv = iface; else { - ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -746,7 +748,7 @@ static HRESULT WINAPI Dispatch_QueryInterface(IDispatchEx *iface, REFIID riid, v }else if(IsEqualGUID(riid, &IID_IDispatchEx)) { return E_NOINTERFACE; }else { - ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -1005,6 +1007,17 @@ static HRESULT WINAPI submit_onclick(IDispatchEx *iface, DISPID id, LCID lcid, W EVENT_HANDLER_FUNC_OBJ(submit_onclick); +static HRESULT WINAPI iframe_onload(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, + VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) +{ + CHECK_EXPECT(iframe_onload); + test_event_args(&DIID_DispHTMLIFrame, id, wFlags, pdp, pvarRes, pei, pspCaller); + test_event_src("IFRAME"); + return S_OK; +} + +EVENT_HANDLER_FUNC_OBJ(iframe_onload); + static HRESULT WINAPI submit_onclick_attached(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { @@ -1200,7 +1213,7 @@ EVENT_HANDLER_FUNC_OBJ(nocall); || IsEqualGUID(riid, &diid)) \ *ppv = iface; \ else { \ - ok(0, "unexpected riid %s\n", debugstr_guid(riid)); \ + ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); \ return E_NOINTERFACE; \ } \ return S_OK; \ @@ -1227,7 +1240,7 @@ EVENT_HANDLER_FUNC_OBJ(nocall); #define test_cp_args(a,b,c,d,e,f) _test_cp_args(__LINE__,a,b,c,d,e,f) static void _test_cp_args(unsigned line, REFIID riid, WORD flags, DISPPARAMS *dp, VARIANT *vres, EXCEPINFO *ei, UINT *argerr) { - ok_(__FILE__,line)(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", debugstr_guid(riid)); + ok_(__FILE__,line)(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid)); ok_(__FILE__,line)(flags == DISPATCH_METHOD, "flags = %x\n", flags); ok_(__FILE__,line)(dp != NULL, "dp == NULL\n"); ok_(__FILE__,line)(!dp->cArgs, "dp->cArgs = %d\n", dp->cArgs); @@ -1245,7 +1258,7 @@ static void _test_cp_eventarg(unsigned line, REFIID riid, WORD flags, DISPPARAMS { IHTMLEventObj *event; - ok_(__FILE__,line)(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", debugstr_guid(riid)); + ok_(__FILE__,line)(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid)); ok_(__FILE__,line)(flags == DISPATCH_METHOD, "flags = %x\n", flags); ok_(__FILE__,line)(dp != NULL, "dp == NULL\n"); ok_(__FILE__,line)(dp->cArgs == 1, "dp->cArgs = %d\n", dp->cArgs); @@ -1329,7 +1342,7 @@ static HRESULT WINAPI timeoutFunc_Invoke(IDispatchEx *iface, DISPID dispIdMember CHECK_EXPECT(timeout); ok(dispIdMember == DISPID_VALUE, "dispIdMember = %d\n", dispIdMember); - ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", debugstr_guid(riid)); + ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid)); ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags); ok(!lcid, "lcid = %x\n", lcid); ok(pDispParams != NULL, "pDispParams == NULL\n"); @@ -1373,7 +1386,7 @@ static HRESULT WINAPI div_onclick_disp_Invoke(IDispatchEx *iface, DISPID id, test_attached_event_args(id, wFlags, pdp, pvarRes, pei); - ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", debugstr_guid(riid)); + ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid)); ok(!puArgErr, "puArgErr = %p\n", puArgErr); return S_OK; @@ -1398,12 +1411,12 @@ static void pump_msgs(BOOL *b) if(b) { while(!*b && GetMessageW(&msg, NULL, 0, 0)) { TranslateMessage(&msg); - DispatchMessage(&msg); + DispatchMessageW(&msg); } }else { while(!b && PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); - DispatchMessage(&msg); + DispatchMessageW(&msg); } } } @@ -1493,7 +1506,7 @@ static HRESULT WINAPI EventDispatch_Invoke(IDispatch *iface, DISPID dispIdMember LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { - ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", debugstr_guid(riid)); + ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid)); ok(pDispParams != NULL, "pDispParams == NULL\n"); ok(pExcepInfo != NULL, "pExcepInfo == NULL\n"); ok(puArgErr != NULL, "puArgErr == NULL\n"); @@ -2070,6 +2083,8 @@ static void test_submit(IHTMLDocument2 *doc) CHECK_CALLED(submit_onclick_attached_check_cancel); CHECK_CALLED(submit_onclick_attached); + if(1)pump_msgs(NULL); + IHTMLElement_Release(submit); } @@ -2156,16 +2171,19 @@ static IHTMLDocument2* get_iframe_doc(IHTMLIFrameElement *iframe) static void test_iframe_connections(IHTMLDocument2 *doc) { - HRESULT hres; IHTMLIFrameElement *iframe; IHTMLDocument2 *iframes_doc; DWORD cookie; IConnectionPoint *cp; - IHTMLElement *element = find_element_by_id(doc, "ifr"); + IHTMLElement *element; + BSTR str; + HRESULT hres; - hres = IHTMLElement_QueryInterface(element, &IID_IHTMLIFrameElement, (void**)&iframe); + trace("iframe tests...\n"); + + element = find_element_by_id(doc, "ifr"); + iframe = get_iframe_iface((IUnknown*)element); IHTMLElement_Release(element); - ok(hres == S_OK, "QueryInterface(IID_IHTMLIFrameElement) failed: %08x\n", hres); iframes_doc = get_iframe_doc(iframe); IHTMLIFrameElement_Release(iframe); @@ -2177,6 +2195,43 @@ static void test_iframe_connections(IHTMLDocument2 *doc) IConnectionPoint_Release(cp); ok(hres == CONNECT_E_NOCONNECTION, "Unadvise returned %08x, expected CONNECT_E_NOCONNECTION\n", hres); + unregister_cp((IUnknown*)iframes_doc, &IID_IDispatch, cookie); + + if(is_ie9plus) { + IHTMLFrameBase2 *frame_base2; + VARIANT v; + + hres = IHTMLIFrameElement_QueryInterface(iframe, &IID_IHTMLFrameBase2, (void**)&frame_base2); + ok(hres == S_OK, "Could not get IHTMLFrameBase2 iface: %08x\n", hres); + + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = (IDispatch*)&iframe_onload_obj; + hres = IHTMLFrameBase2_put_onload(frame_base2, v); + ok(hres == S_OK, "put_onload failed: %08x\n", hres); + + IHTMLFrameBase2_Release(frame_base2); + + str = a2bstr("about:blank"); + hres = IHTMLDocument2_put_URL(iframes_doc, str); + ok(hres == S_OK, "put_URL failed: %08x\n", hres); + SysFreeString(str); + + SET_EXPECT(iframe_onload); + pump_msgs(&called_iframe_onload); + CHECK_CALLED(iframe_onload); + + str = a2bstr("about:test"); + hres = IHTMLDocument2_put_URL(iframes_doc, str); + ok(hres == S_OK, "put_URL failed: %08x\n", hres); + SysFreeString(str); + + SET_EXPECT(iframe_onload); + pump_msgs(&called_iframe_onload); + CHECK_CALLED(iframe_onload); + }else { + win_skip("Skipping iframe onload tests on IE older than 9.\n"); + } + IHTMLDocument2_Release(iframes_doc); } @@ -2684,24 +2739,12 @@ static void set_client_site(IHTMLDocument2 *doc, BOOL set) static IHTMLDocument2 *create_document(void) { IHTMLDocument2 *doc; - IHTMLDocument5 *doc5; HRESULT hres; hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IHTMLDocument2, (void**)&doc); ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres); - if (FAILED(hres)) - return NULL; - - hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5); - if(FAILED(hres)) { - win_skip("Could not get IHTMLDocument5 interface, probably too old IE\n"); - IHTMLDocument2_Release(doc); - return NULL; - } - - IHTMLDocument5_Release(doc5); - return doc; + return SUCCEEDED(hres) ? doc : NULL; } @@ -2722,9 +2765,9 @@ static void run_test(const char *str, testfunc_t test) doc_load_string(doc, str); do_advise((IUnknown*)doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink); - while(!doc_complete && GetMessage(&msg, NULL, 0, 0)) { + while(!doc_complete && GetMessageA(&msg, NULL, 0, 0)) { TranslateMessage(&msg); - DispatchMessage(&msg); + DispatchMessageA(&msg); } hres = IHTMLDocument2_get_body(doc, &body); @@ -2751,7 +2794,7 @@ static void run_test(const char *str, testfunc_t test) static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - return DefWindowProc(hwnd, msg, wParam, lParam); + return DefWindowProcA(hwnd, msg, wParam, lParam); } static HWND create_container_window(void) @@ -2802,24 +2845,57 @@ static void test_empty_document(void) IHTMLDocument2_Release(doc); } +static BOOL check_ie(void) +{ + IHTMLDocument2 *doc; + IHTMLDocument5 *doc5; + IHTMLDocument7 *doc7; + HRESULT hres; + + doc = create_document(); + if(!doc) + return FALSE; + + hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument7, (void**)&doc7); + if(SUCCEEDED(hres)) { + is_ie9plus = TRUE; + IHTMLDocument7_Release(doc7); + } + + trace("is_ie9plus %x\n", is_ie9plus); + + hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5); + if(SUCCEEDED(hres)) + IHTMLDocument5_Release(doc5); + + IHTMLDocument2_Release(doc); + return SUCCEEDED(hres); +} + START_TEST(events) { CoInitialize(NULL); - container_hwnd = create_container_window(); - if(winetest_interactive) - ShowWindow(container_hwnd, SW_SHOW); + if(check_ie()) { + container_hwnd = create_container_window(); - run_test(empty_doc_str, test_timeout); - run_test(click_doc_str, test_onclick); - run_test(readystate_doc_str, test_onreadystatechange); - run_test(img_doc_str, test_imgload); - run_test(input_doc_str, test_focus); - run_test(form_doc_str, test_submit); - run_test(iframe_doc_str, test_iframe_connections); + if(winetest_interactive) + ShowWindow(container_hwnd, SW_SHOW); - test_empty_document(); + run_test(empty_doc_str, test_timeout); + run_test(click_doc_str, test_onclick); + run_test(readystate_doc_str, test_onreadystatechange); + run_test(img_doc_str, test_imgload); + run_test(input_doc_str, test_focus); + run_test(form_doc_str, test_submit); + run_test(iframe_doc_str, test_iframe_connections); + + test_empty_document(); + + DestroyWindow(container_hwnd); + }else { + win_skip("Too old IE\n"); + } - DestroyWindow(container_hwnd); CoUninitialize(); } diff --git a/rostests/winetests/mshtml/events.html b/rostests/winetests/mshtml/events.html index 131ba19cfda..bf8a21f8bd8 100644 --- a/rostests/winetests/mshtml/events.html +++ b/rostests/winetests/mshtml/events.html @@ -1,7 +1,7 @@ + diff --git a/rostests/winetests/mshtml/htmldoc.c b/rostests/winetests/mshtml/htmldoc.c index 1d5f4d79957..ffa22343980 100644 --- a/rostests/winetests/mshtml/htmldoc.c +++ b/rostests/winetests/mshtml/htmldoc.c @@ -126,6 +126,7 @@ DEFINE_EXPECT(Exec_HTTPEQUIV_DONE); DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_0); DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_1); DEFINE_EXPECT(Exec_ShellDocView_37); +DEFINE_EXPECT(Exec_ShellDocView_62); DEFINE_EXPECT(Exec_ShellDocView_63); DEFINE_EXPECT(Exec_ShellDocView_67); DEFINE_EXPECT(Exec_ShellDocView_84); @@ -141,6 +142,7 @@ DEFINE_EXPECT(Exec_MSHTML_PARSECOMPLETE); DEFINE_EXPECT(Exec_Explorer_38); DEFINE_EXPECT(Exec_Explorer_69); DEFINE_EXPECT(Exec_DOCCANNAVIGATE); +DEFINE_EXPECT(Exec_DOCCANNAVIGATE_NULL); DEFINE_EXPECT(Invoke_AMBIENT_USERMODE); DEFINE_EXPECT(Invoke_AMBIENT_DLCONTROL); DEFINE_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); @@ -200,7 +202,9 @@ DEFINE_EXPECT(FindConnectionPoint); DEFINE_EXPECT(EnumConnections); DEFINE_EXPECT(EnumConnections_Next); DEFINE_EXPECT(WindowClosing); +DEFINE_EXPECT(NavigateWithBindCtx); +static BOOL is_ie9plus; static IUnknown *doc_unk; static IMoniker *doc_mon; static BOOL expect_LockContainer_fLock; @@ -213,8 +217,10 @@ static BOOL inplace_deactivated, open_call; static BOOL complete, loading_js, loading_hash, is_refresh; static DWORD status_code = HTTP_STATUS_OK; static BOOL asynchronous_binding = FALSE; -static BOOL support_wbapp, allow_new_window; +static BOOL support_wbapp, allow_new_window, no_travellog; static BOOL report_mime; +static BOOL testing_submit; +static BOOL resetting_document; static int stream_read, protocol_read; static IStream *history_stream; static enum load_state_t { @@ -256,21 +262,6 @@ static const WCHAR wszTimesNewRoman[] = static const WCHAR wszArial[] = {'A','r','i','a','l',0}; -static const char *debugstr_guid(REFIID riid) -{ - static char buf[50]; - - if(!riid) - return "(null)"; - - sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", - riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], - riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], - riid->Data4[5], riid->Data4[6], riid->Data4[7]); - - return buf; -} - static int strcmp_wa(LPCWSTR strw, const char *stra) { CHAR buf[512]; @@ -278,6 +269,13 @@ static int strcmp_wa(LPCWSTR strw, const char *stra) return lstrcmpA(stra, buf); } +static BOOL wstr_contains(const WCHAR *strw, const char *stra) +{ + CHAR buf[512]; + WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL); + return strstr(buf, stra) != NULL; +} + static const WCHAR *strstrW( const WCHAR *str, const WCHAR *sub ) { while (*str) @@ -356,9 +354,9 @@ static void test_timer(DWORD flags) if(flags & EXPECT_SETTITLE) SET_EXPECT(Exec_SETTITLE); - while(!*b && GetMessage(&msg, doc_hwnd, 0, 0)) { + while(!*b && GetMessageA(&msg, doc_hwnd, 0, 0)) { TranslateMessage(&msg); - DispatchMessage(&msg); + DispatchMessageA(&msg); } if(flags & EXPECT_UPDATEUI) { @@ -371,8 +369,8 @@ static void test_timer(DWORD flags) static IMoniker Moniker; -#define test_GetCurMoniker(u,m,v) _test_GetCurMoniker(__LINE__,u,m,v) -static void _test_GetCurMoniker(unsigned line, IUnknown *unk, IMoniker *exmon, const char *exurl) +#define test_GetCurMoniker(u,m,v,t) _test_GetCurMoniker(__LINE__,u,m,v,t) +static void _test_GetCurMoniker(unsigned line, IUnknown *unk, IMoniker *exmon, const char *exurl, BOOL is_todo) { IHTMLDocument2 *doc; IPersistMoniker *permon; @@ -429,7 +427,10 @@ static void _test_GetCurMoniker(unsigned line, IUnknown *unk, IMoniker *exmon, c hres = IMoniker_GetDisplayName(mon, NULL, NULL, &url); ok(hres == S_OK, "GetDisplayName failed: %08x\n", hres); - ok_(__FILE__,line)(!strcmp_wa(url, exurl), "unexpected url %s\n", wine_dbgstr_w(url)); + if(is_todo) + todo_wine ok_(__FILE__,line)(!strcmp_wa(url, exurl), "unexpected url %s\n", wine_dbgstr_w(url)); + else + ok_(__FILE__,line)(!strcmp_wa(url, exurl), "unexpected url %s\n", wine_dbgstr_w(url)); if(!*ptr) ok_(__FILE__,line)(!lstrcmpW(url, doc_url), "url %s != doc_url %s\n", wine_dbgstr_w(url), wine_dbgstr_w(doc_url)); @@ -484,7 +485,7 @@ static HRESULT WINAPI External_QueryInterface(IDispatch *iface, REFIID riid, voi return E_NOINTERFACE; /* TODO */ if(!ignore_external_qi) - ok(0, "unexpected riid: %s\n", debugstr_guid(riid)); + ok(0, "unexpected riid: %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -581,16 +582,29 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, bindinfo.cbSize = sizeof(bindinfo); hres = IInternetBindInfo_GetBindInfo(pOIBindInfo, &bindf, &bindinfo); ok(hres == S_OK, "GetBindInfo failed: %08x\n", hres); - ok(bindf == (BINDF_FROMURLMON|BINDF_PULLDATA|BINDF_NEEDFILE|BINDF_ASYNCSTORAGE|BINDF_ASYNCHRONOUS), - "bindf = %x\n", bindf); + if(!testing_submit) + ok(bindf == (BINDF_FROMURLMON|BINDF_PULLDATA|BINDF_NEEDFILE|BINDF_ASYNCSTORAGE|BINDF_ASYNCHRONOUS), + "bindf = %x\n", bindf); + else + ok(bindf == (BINDF_FROMURLMON|BINDF_FORMS_SUBMIT|BINDF_PRAGMA_NO_CACHE|BINDF_HYPERLINK + |BINDF_PULLDATA|BINDF_NEEDFILE|BINDF_GETNEWESTVERSION|BINDF_ASYNCSTORAGE|BINDF_ASYNCHRONOUS), + "bindf = %x\n", bindf); ok(bindinfo.cbSize == sizeof(bindinfo), "bindinfo.cbSize=%d\n", bindinfo.cbSize); ok(bindinfo.szExtraInfo == NULL, "bindinfo.szExtraInfo=%p\n", bindinfo.szExtraInfo); /* TODO: test stgmedData */ ok(bindinfo.grfBindInfoF == 0, "bindinfo.grfBinfInfoF=%08x\n", bindinfo.grfBindInfoF); - ok(bindinfo.dwBindVerb == 0, "bindinfo.dwBindVerb=%d\n", bindinfo.dwBindVerb); + if(!testing_submit) { + ok(bindinfo.dwBindVerb == BINDVERB_GET, "bindinfo.dwBindVerb=%d\n", bindinfo.dwBindVerb); + ok(bindinfo.cbstgmedData == 0, "bindinfo.cbstgmedData=%d\n", bindinfo.cbstgmedData); + ok(bindinfo.stgmedData.tymed == TYMED_NULL, "bindinfo.stgmedData.tymed=%d\n", bindinfo.stgmedData.tymed); + }else { + ok(bindinfo.dwBindVerb == BINDVERB_POST, "bindinfo.dwBindVerb=%d\n", bindinfo.dwBindVerb); + ok(bindinfo.cbstgmedData == 8, "bindinfo.cbstgmedData=%d\n", bindinfo.cbstgmedData); + ok(bindinfo.stgmedData.tymed == TYMED_HGLOBAL, "bindinfo.stgmedData.tymed=%d\n", bindinfo.stgmedData.tymed); + ok(!memcmp(U(bindinfo.stgmedData).hGlobal, "cmd=TEST", 8), "unexpected hGlobal\n"); + } ok(bindinfo.szCustomVerb == 0, "bindinfo.szCustomVerb=%p\n", bindinfo.szCustomVerb); - ok(bindinfo.cbstgmedData == 0, "bindinfo.cbstgmedData=%d\n", bindinfo.cbstgmedData); ok(bindinfo.dwOptions == 0x80000 || bindinfo.dwOptions == 0x4080000, /* win2k3 */ "bindinfo.dwOptions=%x\n", bindinfo.dwOptions); @@ -669,6 +683,7 @@ static HRESULT WINAPI Protocol_Read(IInternetProtocol *iface, void *pv, protocol_read += *pcbRead = sizeof(css_data)-1; memcpy(pv, css_data, sizeof(css_data)-1); + return S_OK; } @@ -921,6 +936,9 @@ static ULONG WINAPI PropertyNotifySink_Release(IPropertyNotifySink *iface) static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID) { + if(resetting_document) + return S_OK; + switch(dispID) { case DISPID_READYSTATE: CHECK_EXPECT2(OnChanged_READYSTATE); @@ -991,7 +1009,7 @@ static HRESULT WINAPI Stream_QueryInterface(IStream *iface, REFIID riid, void ** return S_OK; } - ok(0, "unexpected call %s\n", debugstr_guid(riid)); + ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid)); *ppv = NULL; return E_NOINTERFACE; } @@ -1118,7 +1136,7 @@ static HRESULT WINAPI WinInetHttpInfo_QueryInterface( if(IsEqualGUID(&IID_IGetBindHandle, riid)) return E_NOINTERFACE; - ok(0, "unexpected call %s\n", debugstr_guid(riid)); + ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -1193,7 +1211,8 @@ static HRESULT WINAPI Binding_QueryInterface(IBinding *iface, REFIID riid, void return E_NOINTERFACE; } - ok(0, "unexpected call %s\n", debugstr_guid(riid)); + trace("Binding::QI(%s)\n", wine_dbgstr_guid(riid)); + *ppv = NULL; return E_NOINTERFACE; } @@ -1211,7 +1230,7 @@ static HRESULT WINAPI Binding_Abort(IBinding *iface) { CHECK_EXPECT(Abort); if(asynchronous_binding) - PeekMessage(NULL, container_hwnd, WM_CONTINUE_BINDING, WM_CONTINUE_BINDING, PM_REMOVE); + PeekMessageA(NULL, container_hwnd, WM_CONTINUE_BINDING, WM_CONTINUE_BINDING, PM_REMOVE); return S_OK; } @@ -1272,7 +1291,7 @@ static HRESULT WINAPI Moniker_QueryInterface(IMoniker *iface, REFIID riid, void if(IsEqualGUID(&IID_IMoniker_unk2, riid)) return E_NOINTERFACE; /* TODO */ - ok(0, "unexpected riid: %s\n", debugstr_guid(riid)); + ok(0, "unexpected riid: %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -1289,7 +1308,7 @@ static ULONG WINAPI Moniker_Release(IMoniker *iface) static HRESULT WINAPI Moniker_GetClassID(IMoniker *iface, CLSID *pClassID) { CHECK_EXPECT(GetClassID); - ok(IsEqualGUID(pClassID, &IID_NULL), "pClassID = %s\n", debugstr_guid(pClassID)); + ok(IsEqualGUID(pClassID, &IID_NULL), "pClassID = %s\n", wine_dbgstr_guid(pClassID)); return E_FAIL; } @@ -1709,7 +1728,7 @@ static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, REFII static const GUID undocumented_frame_iid = {0xfbece6c9,0x48d7,0x4a37,{0x8f,0xe3,0x6a,0xd4,0x27,0x2f,0xdd,0xac}}; if(!IsEqualGUID(&undocumented_frame_iid, riid)) - ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); *ppv = NULL; return E_NOINTERFACE; @@ -1821,7 +1840,8 @@ static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hm static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText) { - CHECK_EXPECT2(SetStatusText); + if(!resetting_document) + CHECK_EXPECT2(SetStatusText); if(!expect_status_text) ok(pszStatusText == NULL, "pszStatusText=%p, expected NULL\n", pszStatusText); return S_OK; @@ -2457,7 +2477,8 @@ static HRESULT WINAPI DocHostUIHandler_ShowContextMenu(IDocHostUIHandler2 *iface static HRESULT WINAPI DocHostUIHandler_GetHostInfo(IDocHostUIHandler2 *iface, DOCHOSTUIINFO *pInfo) { - CHECK_EXPECT(GetHostInfo); + if(!resetting_document) + CHECK_EXPECT(GetHostInfo); ok(iface == expect_uihandler_iface, "called on unexpected iface\n"); ok(pInfo != NULL, "pInfo=NULL\n"); if(pInfo) { @@ -2646,13 +2667,15 @@ static HRESULT WINAPI CustomDocHostUIHandler_QueryInterface(IDocHostUIHandler2 * return S_OK; } + *ppv = NULL; + if(IsEqualGUID(&IID_IOleCommandTarget, riid)) return E_NOINTERFACE; - else if(IsEqualGUID(&IID_IDocHostShowUI, riid)) + if(IsEqualGUID(&IID_IDocHostShowUI, riid)) return E_NOINTERFACE; /* TODO */ - ok(0, "unexpected call %s\n", debugstr_guid(riid)); + trace("CustomDocHostUIHandler::QI(%s)\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -2749,6 +2772,9 @@ static void test_save_history(IUnknown *unk) static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) { + if(resetting_document) + return E_FAIL; + if(!pguidCmdGroup) { test_readyState(NULL); @@ -2854,11 +2880,11 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID load_state = LD_LOADING; }else { if(nav_url) - test_GetCurMoniker(doc_unk, NULL, nav_serv_url); + test_GetCurMoniker(doc_unk, NULL, nav_serv_url, FALSE); else if(load_from_stream) - test_GetCurMoniker(doc_unk, NULL, "about:blank"); + test_GetCurMoniker(doc_unk, NULL, "about:blank", FALSE); else if(!editmode) - test_GetCurMoniker(doc_unk, doc_mon, NULL); + test_GetCurMoniker(doc_unk, doc_mon, NULL, FALSE); } ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut); @@ -2869,6 +2895,12 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID } return S_OK; + case 62: + CHECK_EXPECT(Exec_ShellDocView_62); + ok(!pvaIn, "pvaIn != NULL\n"); + ok(!pvaOut, "pvaOut != NULL\n"); + return S_OK; + case 63: { IHTMLPrivateWindow *priv_window; HRESULT hres; @@ -2942,11 +2974,15 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID return E_NOTIMPL; + case 83: + case 102: case 134: /* TODO */ + case 135: case 136: /* TODO */ case 139: /* TODO */ case 143: /* TODO */ case 144: /* TODO */ + case 178: return E_NOTIMPL; default: @@ -2973,14 +3009,16 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID if(IsEqualGUID(&CGID_DocHostCmdPriv, pguidCmdGroup)) { switch(nCmdID) { case DOCHOST_DOCCANNAVIGATE: - CHECK_EXPECT(Exec_DOCCANNAVIGATE); + if(pvaIn) { + CHECK_EXPECT(Exec_DOCCANNAVIGATE); + ok(V_VT(pvaIn) == VT_UNKNOWN, "V_VT(pvaIn) != VT_UNKNOWN\n"); + /* FIXME: test V_UNKNOWN(pvaIn) == window */ + }else { + CHECK_EXPECT(Exec_DOCCANNAVIGATE_NULL); + } test_readyState(NULL); - - ok(pvaIn != NULL, "pvaIn == NULL\n"); ok(pvaOut == NULL, "pvaOut != NULL\n"); - ok(V_VT(pvaIn) == VT_UNKNOWN, "V_VT(pvaIn) != VT_UNKNOWN\n"); - /* FIXME: test V_UNKNOWN(pvaIn) == window */ return S_OK; case 1: { SAFEARRAY *sa; @@ -3005,7 +3043,7 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID ok(ind == 0, "Lower bound = %d\n", ind); hres = SafeArrayGetUBound(sa, 1, &ind); ok(hres == S_OK, "SafeArrayGetUBound failed: %x\n", hres); - ok(ind == 7 || broken(ind == 5), "Upper bound = %d\n", ind); + ok(ind == 7 || ind == 8 /* IE11 */ ||broken(ind == 5), "Upper bound = %d\n", ind); ind = 0; SafeArrayGetElement(sa, &ind, &var); @@ -3092,7 +3130,7 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID } } - ok(0, "unexpected pguidCmdGroup: %s\n", debugstr_guid(pguidCmdGroup)); + ok(0, "unexpected pguidCmdGroup: %s\n", wine_dbgstr_guid(pguidCmdGroup)); return E_NOTIMPL; } @@ -3115,6 +3153,9 @@ static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REF LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { + if(resetting_document) + return E_FAIL; + ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n"); ok(pDispParams != NULL, "pDispParams == NULL\n"); ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo); @@ -3183,7 +3224,10 @@ static HRESULT WINAPI EventDispatch_Invoke(IDispatch *iface, DISPID dispIdMember IHTMLDocument2 *doc; BSTR state; - ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", debugstr_guid(riid)); + if(resetting_document) + return E_FAIL; + + ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", wine_dbgstr_guid(riid)); ok(pDispParams != NULL, "pDispParams == NULL\n"); ok(pExcepInfo != NULL, "pExcepInfo == NULL\n"); ok(puArgErr != NULL, "puArgErr == NULL\n"); @@ -3253,7 +3297,7 @@ static HRESULT WINAPI TravelLog_QueryInterface(ITravelLog *iface, REFIID riid, v } if(!IsEqualGUID(&IID_IIETravelLog2, riid) && !IsEqualGUID(&IID_unk_travellog, riid)) - ok(0, "unexpected call %s\n", debugstr_guid(riid)); + ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid)); *ppv = NULL; return E_NOINTERFACE; @@ -3388,9 +3432,17 @@ static HRESULT WINAPI DocObjectService_FireBeforeNavigate2(IDocObjectService *i ok(!strcmp_wa(lpszUrl, nav_url), "lpszUrl = %s, expected %s\n", wine_dbgstr_w(lpszUrl), nav_url); ok(dwFlags == 0x40 || !dwFlags || dwFlags == 0x50, "dwFlags = %x\n", dwFlags); ok(!lpszFrameName, "lpszFrameName = %s\n", wine_dbgstr_w(lpszFrameName)); - ok(!pPostData, "pPostData = %p\n", pPostData); - ok(!cbPostData, "cbPostData = %d\n", cbPostData); - ok(!lpszHeaders, "lpszHeaders = %s\n", wine_dbgstr_w(lpszHeaders)); + if(!testing_submit) { + ok(!pPostData, "pPostData = %p\n", pPostData); + ok(!cbPostData, "cbPostData = %d\n", cbPostData); + ok(!lpszHeaders, "lpszHeaders = %s\n", wine_dbgstr_w(lpszHeaders)); + }else { + ok(cbPostData == 9, "cbPostData = %d\n", cbPostData); + ok(!memcmp(pPostData, "cmd=TEST", cbPostData), "pPostData = %p\n", pPostData); + ok(wstr_contains(lpszHeaders, "Content-Type: application/x-www-form-urlencoded\r\n"), + "lpszHeaders = %s\n", wine_dbgstr_w(lpszHeaders)); + + } ok(fPlayNavSound, "fPlayNavSound = %x\n", fPlayNavSound); ok(pfCancel != NULL, "pfCancel = NULL\n"); ok(!*pfCancel, "*pfCancel = %x\n", *pfCancel); @@ -3455,7 +3507,8 @@ static HRESULT WINAPI DocObjectService_GetPendingUrl( IDocObjectService* This, BSTR *pbstrPendingUrl) { - CHECK_EXPECT(GetPendingUrl); + if(!resetting_document) + CHECK_EXPECT(GetPendingUrl); return E_NOTIMPL; } @@ -3984,7 +4037,7 @@ static HRESULT WINAPI WBE2Sink_QueryInterface(IDispatch *iface, REFIID riid, voi } *ppv = NULL; - ok(0, "unexpected riid: %s\n", debugstr_guid(riid)); + ok(0, "unexpected riid: %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -4200,7 +4253,7 @@ static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPo return S_OK; } - ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); return E_NOTIMPL; } @@ -4214,26 +4267,205 @@ static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl = { static IConnectionPointContainer ConnectionPointContainer = { &ConnectionPointContainerVtbl }; +static void test_NavigateWithBindCtx(BSTR uri, VARIANT *flags, VARIANT *target_frame, VARIANT *post_data, + VARIANT *headers, IBindCtx *bind_ctx, LPOLESTR url_fragment) +{ + ok(!strcmp_wa(uri, nav_url), "uri = %s\n", wine_dbgstr_w(uri)); + ok(V_VT(flags) == VT_I4, "V_VT(flags) = %d\n", V_VT(flags)); + ok(V_I4(flags) == navHyperlink, "V_I4(flags) = %x\n", V_I4(flags)); + ok(!target_frame, "target_frame != NULL\n"); + ok(!post_data, "post_data != NULL\n"); + ok(!headers, "headers != NULL\n"); + ok(bind_ctx != NULL, "bind_ctx == NULL\n"); + ok(!url_fragment, "url_dragment = %s\n", wine_dbgstr_w(url_fragment)); +} + +static HRESULT wb_qi(REFIID riid, void **ppv); + +static HRESULT WINAPI WebBrowserPriv_QueryInterface(IWebBrowserPriv *iface, REFIID riid, void **ppv) +{ + return wb_qi(riid, ppv); +} + +static ULONG WINAPI WebBrowserPriv_AddRef(IWebBrowserPriv *iface) +{ + return 2; +} + +static ULONG WINAPI WebBrowserPriv_Release(IWebBrowserPriv *iface) +{ + return 1; +} + +static HRESULT WINAPI WebBrowserPriv_NavigateWithBindCtx(IWebBrowserPriv *iface, VARIANT *uri, VARIANT *flags, + VARIANT *target_frame, VARIANT *post_data, VARIANT *headers, IBindCtx *bind_ctx, LPOLESTR url_fragment) +{ + trace("NavigateWithBindCtx\n"); + + CHECK_EXPECT(NavigateWithBindCtx); + + ok(V_VT(uri) == VT_BSTR, "V_VT(uri) = %d\n", V_VT(uri)); + test_NavigateWithBindCtx(V_BSTR(uri), flags, target_frame, post_data, headers, bind_ctx, url_fragment); + return S_OK; +} + +static HRESULT WINAPI WebBrowserPriv_OnClose(IWebBrowserPriv *iface) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static const IWebBrowserPrivVtbl WebBrowserPrivVtbl = { + WebBrowserPriv_QueryInterface, + WebBrowserPriv_AddRef, + WebBrowserPriv_Release, + WebBrowserPriv_NavigateWithBindCtx, + WebBrowserPriv_OnClose +}; + +static IWebBrowserPriv WebBrowserPriv = { &WebBrowserPrivVtbl }; + +static HRESULT WINAPI WebBrowserPriv2IE8_QueryInterface(IWebBrowserPriv2IE8 *iface, REFIID riid, void **ppv) +{ + return wb_qi(riid, ppv); +} + +static ULONG WINAPI WebBrowserPriv2IE8_AddRef(IWebBrowserPriv2IE8 *iface) +{ + return 2; +} + +static ULONG WINAPI WebBrowserPriv2IE8_Release(IWebBrowserPriv2IE8 *iface) +{ + return 1; +} + +static HRESULT WINAPI WebBrowserPriv2IE8_NavigateWithBindCtx2(IWebBrowserPriv2IE8 *iface, IUri *uri, VARIANT *flags, + VARIANT *target_frame, VARIANT *post_data, VARIANT *headers, IBindCtx *bind_ctx, LPOLESTR url_fragment) +{ + BSTR str; + HRESULT hres; + + trace("IE8: NavigateWithBindCtx2\n"); + + CHECK_EXPECT(NavigateWithBindCtx); + + hres = IUri_GetDisplayUri(uri, &str); + ok(hres == S_OK, "GetDisplayUri failed: %08x\n", hres); + test_NavigateWithBindCtx(str, flags, target_frame, post_data, headers, bind_ctx, url_fragment); + SysFreeString(str); + return S_OK; +} + +static HRESULT WINAPI WebBrowserPriv2IE8_SetBrowserFrameOptions(IWebBrowserPriv2IE8 *iface, DWORD opt1, DWORD opt2) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI WebBrowserPriv2IE8_DetachConnectionPoints(IWebBrowserPriv2IE8 *iface) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI WebBrowserPriv2IE8_GetProcessId(IWebBrowserPriv2IE8 *iface, DWORD *pid) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI WebBrowserPriv2IE8_CompatAttachEditEvents(IWebBrowserPriv2IE8 *iface) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI WebBrowserPriv2IE8_HandleOpenOptions(IWebBrowserPriv2IE8 *iface, IUnknown *obj, BSTR bstr, int options) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI WebBrowserPriv2IE8_SetSearchTerm(IWebBrowserPriv2IE8 *iface, BSTR term) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI WebBrowserPriv2IE8_GetSearchTerm(IWebBrowserPriv2IE8 *iface, BSTR *term) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI WebBrowserPriv2IE8_GetCurrentDocument(IWebBrowserPriv2IE8 *iface, IDispatch **doc) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static const IWebBrowserPriv2IE8Vtbl WebBrowserPriv2IE8Vtbl = { + WebBrowserPriv2IE8_QueryInterface, + WebBrowserPriv2IE8_AddRef, + WebBrowserPriv2IE8_Release, + WebBrowserPriv2IE8_NavigateWithBindCtx2, + WebBrowserPriv2IE8_SetBrowserFrameOptions, + WebBrowserPriv2IE8_DetachConnectionPoints, + WebBrowserPriv2IE8_GetProcessId, + WebBrowserPriv2IE8_CompatAttachEditEvents, + WebBrowserPriv2IE8_HandleOpenOptions, + WebBrowserPriv2IE8_SetSearchTerm, + WebBrowserPriv2IE8_GetSearchTerm, + WebBrowserPriv2IE8_GetCurrentDocument +}; + +static IWebBrowserPriv2IE8 WebBrowserPriv2IE8 = { &WebBrowserPriv2IE8Vtbl }; + +static HRESULT WINAPI WebBrowserPriv2IE9_QueryInterface(IWebBrowserPriv2IE9 *iface, REFIID riid, void **ppv) +{ + return wb_qi(riid, ppv); +} + +static ULONG WINAPI WebBrowserPriv2IE9_AddRef(IWebBrowserPriv2IE9 *iface) +{ + return 2; +} + +static ULONG WINAPI WebBrowserPriv2IE9_Release(IWebBrowserPriv2IE9 *iface) +{ + return 1; +} + +static HRESULT WINAPI WebBrowserPriv2IE9_NavigateWithBindCtx2(IWebBrowserPriv2IE9 *iface, IUri *uri, VARIANT *flags, + VARIANT *target_frame, VARIANT *post_data, VARIANT *headers, IBindCtx *bind_ctx, LPOLESTR url_fragment, DWORD unknown) +{ + BSTR str; + HRESULT hres; + + trace("IE9: NavigateWithBindCtx2\n"); + + CHECK_EXPECT(NavigateWithBindCtx); + + hres = IUri_GetDisplayUri(uri, &str); + ok(hres == S_OK, "GetDisplayUri failed: %08x\n", hres); + test_NavigateWithBindCtx(str, flags, target_frame, post_data, headers, bind_ctx, url_fragment); + SysFreeString(str); + return S_OK; +} + +static const IWebBrowserPriv2IE9Vtbl WebBrowserPriv2IE9Vtbl = { + WebBrowserPriv2IE9_QueryInterface, + WebBrowserPriv2IE9_AddRef, + WebBrowserPriv2IE9_Release, + WebBrowserPriv2IE9_NavigateWithBindCtx2 +}; + +static IWebBrowserPriv2IE9 WebBrowserPriv2IE9 = { &WebBrowserPriv2IE9Vtbl }; + static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid, void **ppv) { - *ppv = NULL; - - if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IWebBrowser, riid) - || IsEqualGUID(&IID_IWebBrowserApp, riid) || IsEqualGUID(&IID_IWebBrowser2, riid)) { - *ppv = iface; - return S_OK; - } - - if(IsEqualGUID(riid, &IID_IOleObject)) - return E_NOINTERFACE; /* TODO */ - - if(IsEqualGUID(riid, &IID_IConnectionPointContainer)) { - *ppv = &ConnectionPointContainer; - return S_OK; - } - - ok(0, "unexpected call %s\n", debugstr_guid(riid)); - return E_NOINTERFACE; + return wb_qi(riid, ppv); } static ULONG WINAPI WebBrowser_AddRef(IWebBrowser2 *iface) @@ -4644,7 +4876,7 @@ static HRESULT WINAPI WebBrowser_put_TheaterMode(IWebBrowser2 *iface, VARIANT_BO static HRESULT WINAPI WebBrowser_get_AddressBar(IWebBrowser2 *iface, VARIANT_BOOL *Value) { - ok(0, "unexpected call\n"); + trace("get_AddressBar: ignoring\n"); /* Some old IEs call it */ return E_NOTIMPL; } @@ -4743,6 +4975,52 @@ static const IWebBrowser2Vtbl WebBrowser2Vtbl = static IWebBrowser2 WebBrowser2 = { &WebBrowser2Vtbl }; +static HRESULT wb_qi(REFIID riid, void **ppv) +{ + static const IID IID_IWebBrowserPriv2IE7 = {0x1af32b6c, 0xa3ba,0x48b9,{0xb2,0x4e,0x8a,0xa9,0xc4,0x1f,0x6e,0xcd}}; + static const IID IID_IWebBrowserPriv2IE8XP = {0x486f6159,0x9f3f,0x4827,{0x82,0xd4,0x28,0x3c,0xef,0x39,0x77,0x33}}; + + *ppv = NULL; + + if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IWebBrowser, riid) + || IsEqualGUID(&IID_IWebBrowserApp, riid) || IsEqualGUID(&IID_IWebBrowser2, riid)) { + *ppv = &WebBrowser2; + return S_OK; + } + + if(IsEqualGUID(riid, &IID_IOleObject)) + return E_NOINTERFACE; /* TODO */ + + if(IsEqualGUID(riid, &IID_IConnectionPointContainer)) { + *ppv = &ConnectionPointContainer; + return S_OK; + } + + if(IsEqualGUID(riid, &IID_IWebBrowserPriv)) { + *ppv = &WebBrowserPriv; + return S_OK; + } + + if(IsEqualGUID(riid, &IID_IWebBrowserPriv2IE8)) { + /* IE8 and IE9 versions use the same IID, but have different declarations. */ + *ppv = is_ie9plus ? (void*)&WebBrowserPriv2IE9 : (void*)&WebBrowserPriv2IE8; + return S_OK; + } + + if(IsEqualGUID(riid, &IID_IWebBrowserPriv2IE7)) { + trace("QI(IID_IWebBrowserPriv2IE7)\n"); + return E_NOINTERFACE; + } + + if(IsEqualGUID(riid, &IID_IWebBrowserPriv2IE8XP)) { + trace("QI(IID_IWebBrowserPriv2IE8XP)\n"); + return E_NOINTERFACE; + } + + ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid)); + return E_NOINTERFACE; +} + static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv) { @@ -4809,7 +5087,7 @@ static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFG *ppv = &WebBrowser2; return S_OK; } - ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); } return E_NOINTERFACE; @@ -4899,7 +5177,7 @@ static HRESULT WINAPI ViewAdviseSink_QueryInterface(IAdviseSinkEx *iface, return S_OK; } - ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); *ppv = NULL; return E_NOINTERFACE; } @@ -4977,7 +5255,7 @@ static HRESULT QueryInterface(REFIID riid, void **ppv) else if(IsEqualGUID(&IID_IDocHostUIHandlerPriv, riid)) return E_NOINTERFACE; /* ? */ else - ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + trace("QI(%s)\n", wine_dbgstr_guid(riid)); if(*ppv) return S_OK; @@ -4991,7 +5269,7 @@ static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam continue_binding(callback); } - return DefWindowProc(hwnd, msg, wParam, lParam); + return DefWindowProcW(hwnd, msg, wParam, lParam); } static void test_doscroll(IUnknown *unk) @@ -5060,7 +5338,7 @@ static void _test_readyState(unsigned line, IUnknown *unk) "uninitialized" }; - if(open_call) + if(open_call || resetting_document) return; /* FIXME */ if(!unk) @@ -5320,7 +5598,7 @@ static void test_Load(IPersistMoniker *persist, IMoniker *mon) set_clientsite = container_locked = TRUE; - test_GetCurMoniker((IUnknown*)persist, mon, NULL); + test_GetCurMoniker((IUnknown*)persist, mon, NULL, FALSE); IBindCtx_Release(bind); @@ -5338,15 +5616,22 @@ static void test_Load(IPersistMoniker *persist, IMoniker *mon) #define DWL_FROM_HISTORY 0x0100 #define DWL_REFRESH 0x0200 #define DWL_EX_GETHOSTINFO 0x0400 +#define DWL_EXTERNAL 0x0800 static void test_download(DWORD flags) { + const BOOL is_extern = (flags & DWL_EXTERNAL) != 0; const BOOL is_js = (flags & DWL_JAVASCRIPT) != 0; HWND hwnd; BOOL *b; MSG msg; - b = is_js ? &called_Exec_SETDOWNLOADSTATE_0 : &called_Exec_HTTPEQUIV_DONE; + if(is_js) + b = &called_Exec_SETDOWNLOADSTATE_0; + else if(is_extern) + b = &called_NavigateWithBindCtx; + else + b = &called_Exec_HTTPEQUIV_DONE; is_refresh = (flags & DWL_REFRESH) != 0; hwnd = FindWindowA("Internet Explorer_Hidden", NULL); @@ -5383,14 +5668,14 @@ static void test_download(DWORD flags) SET_EXPECT(Invoke_OnReadyStateChange_Loading); if(!(flags & (DWL_EMPTY|DWL_JAVASCRIPT))) SET_EXPECT(Invoke_OnReadyStateChange_Interactive); - if(!is_js) + if(!is_js && !is_extern) SET_EXPECT(Invoke_OnReadyStateChange_Complete); SET_EXPECT(Exec_Explorer_69); SET_EXPECT(EnableModeless_TRUE); /* IE7 */ SET_EXPECT(Frame_EnableModeless_TRUE); /* IE7 */ SET_EXPECT(EnableModeless_FALSE); /* IE7 */ SET_EXPECT(Frame_EnableModeless_FALSE); /* IE7 */ - if((nav_url && !is_js) || (flags & (DWL_CSS|DWL_HTTP))) + if((nav_url && !is_js && !is_extern) || (flags & (DWL_CSS|DWL_HTTP))) SET_EXPECT(Exec_ShellDocView_37); if(flags & DWL_HTTP) { if(!(flags & DWL_FROM_HISTORY)) @@ -5398,7 +5683,7 @@ static void test_download(DWORD flags) SET_EXPECT(Exec_HTTPEQUIV); SET_EXPECT(Exec_SETTITLE); } - if(!is_js) + if(!is_js && !is_extern) SET_EXPECT(OnChanged_1005); SET_EXPECT(OnChanged_READYSTATE); SET_EXPECT(Exec_SETPROGRESSPOS); @@ -5407,7 +5692,7 @@ static void test_download(DWORD flags) SET_EXPECT(Exec_ShellDocView_103); SET_EXPECT(Exec_ShellDocView_105); SET_EXPECT(Exec_ShellDocView_140); - if(!is_js) { + if(!is_js && !is_extern) { SET_EXPECT(Exec_MSHTML_PARSECOMPLETE); if(support_wbapp) /* Called on some Vista installations */ SET_EXPECT(CountEntries); @@ -5422,7 +5707,7 @@ static void test_download(DWORD flags) SET_EXPECT(Exec_Explorer_38); SET_EXPECT(UpdateBackForwardState); } - if(!is_js) { + if(!is_js && !is_extern) { if(!editmode && !(flags & DWL_REFRESH)) { if(!(flags & DWL_EMPTY)) SET_EXPECT(FireNavigateComplete2); @@ -5431,11 +5716,17 @@ static void test_download(DWORD flags) SET_EXPECT(ActiveElementChanged); } SET_EXPECT(IsErrorUrl); + if(is_extern) { + SET_EXPECT(Exec_ShellDocView_62); + SET_EXPECT(Exec_DOCCANNAVIGATE_NULL); + SET_EXPECT(NavigateWithBindCtx); + SET_EXPECT(Exec_Explorer_38); /* todo_wine */ + } expect_status_text = (LPWSTR)0xdeadbeef; /* TODO */ - while(!*b && GetMessage(&msg, NULL, 0, 0)) { + while(!*b && GetMessageW(&msg, NULL, 0, 0)) { TranslateMessage(&msg); - DispatchMessage(&msg); + DispatchMessageA(&msg); } if(flags & DWL_REFRESH) { @@ -5471,16 +5762,20 @@ static void test_download(DWORD flags) } if(flags & DWL_ONREADY_LOADING) CHECK_CALLED(Invoke_OnReadyStateChange_Loading); - if(!(flags & (DWL_EMPTY|DWL_JAVASCRIPT))) - CHECK_CALLED(Invoke_OnReadyStateChange_Interactive); - if(!is_js) + if(!(flags & (DWL_EMPTY|DWL_JAVASCRIPT))) { + if(!is_extern) + CHECK_CALLED(Invoke_OnReadyStateChange_Interactive); + else + todo_wine CHECK_CALLED(Invoke_OnReadyStateChange_Interactive); + } + if(!is_js && !is_extern) CHECK_CALLED(Invoke_OnReadyStateChange_Complete); SET_CALLED(Exec_Explorer_69); SET_CALLED(EnableModeless_TRUE); /* IE7 */ SET_CALLED(Frame_EnableModeless_TRUE); /* IE7 */ SET_CALLED(EnableModeless_FALSE); /* IE7 */ SET_CALLED(Frame_EnableModeless_FALSE); /* IE7 */ - if(nav_url && !is_js && !(flags & DWL_REFRESH)) + if(nav_url && !is_js && !is_extern && !(flags & DWL_REFRESH)) todo_wine CHECK_CALLED(Exec_ShellDocView_37); else if(flags & (DWL_CSS|DWL_HTTP)) CLEAR_CALLED(Exec_ShellDocView_37); /* Called by IE9 */ @@ -5494,19 +5789,24 @@ static void test_download(DWORD flags) CHECK_CALLED(Exec_SETTITLE); } if(!is_js) { - CHECK_CALLED(OnChanged_1005); + if(!is_extern) + CHECK_CALLED(OnChanged_1005); CHECK_CALLED(OnChanged_READYSTATE); CHECK_CALLED(Exec_SETPROGRESSPOS); }else { CLEAR_CALLED(OnChanged_READYSTATE); /* sometimes called */ todo_wine CHECK_CALLED(Exec_SETPROGRESSPOS); } - if(!(flags & DWL_EMPTY)) - CHECK_CALLED(Exec_SETDOWNLOADSTATE_0); + if(!(flags & DWL_EMPTY)) { + if(!is_extern) + CHECK_CALLED(Exec_SETDOWNLOADSTATE_0); + else + todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0); + } CLEAR_CALLED(Exec_ShellDocView_103); CLEAR_CALLED(Exec_ShellDocView_105); CLEAR_CALLED(Exec_ShellDocView_140); - if(!is_js) { + if(!is_js && !is_extern) { CHECK_CALLED(Exec_MSHTML_PARSECOMPLETE); if(support_wbapp) /* Called on some Vista installations */ CLEAR_CALLED(CountEntries); @@ -5517,11 +5817,15 @@ static void test_download(DWORD flags) CLEAR_CALLED(UpdateUI); CLEAR_CALLED(Exec_UPDATECOMMANDS); CLEAR_CALLED(Exec_SETTITLE); - if(flags & DWL_EXPECT_HISTUPDATE) - CHECK_CALLED(Exec_Explorer_38); + if(flags & DWL_EXPECT_HISTUPDATE) { + if(flags & DWL_FROM_HISTORY) + CHECK_CALLED_BROKEN(Exec_Explorer_38); /* Some old IEs don't call it. */ + else + CHECK_CALLED(Exec_Explorer_38); + } todo_wine CHECK_CALLED_BROKEN(UpdateBackForwardState); } - if(!is_js) { + if(!is_js && !is_extern) { if(!editmode && !(flags & DWL_REFRESH)) { if(!(flags & DWL_EMPTY)) { if(support_wbapp) @@ -5534,8 +5838,15 @@ static void test_download(DWORD flags) todo_wine CHECK_CALLED(ActiveElementChanged); } todo_wine CHECK_CALLED_BROKEN(IsErrorUrl); + if(is_extern) { + CHECK_CALLED(Exec_ShellDocView_62); + CHECK_CALLED(Exec_DOCCANNAVIGATE_NULL); + CHECK_CALLED(NavigateWithBindCtx); + todo_wine CHECK_NOT_CALLED(Exec_Explorer_38); + } - load_state = LD_COMPLETE; + if(!is_extern) + load_state = LD_COMPLETE; test_readyState(NULL); } @@ -5712,7 +6023,7 @@ static void test_put_href(IHTMLDocument2 *doc, BOOL use_replace, const char *hre } if(doc_mon) { - test_GetCurMoniker(doc_unk, doc_mon, NULL); + test_GetCurMoniker(doc_unk, doc_mon, NULL, FALSE); doc_mon = NULL; } @@ -5722,9 +6033,15 @@ static void test_put_href(IHTMLDocument2 *doc, BOOL use_replace, const char *hre ok(!strcmp_wa(str2, prev_nav_url), "unexpected address bar url: %s, expected %s\n", wine_dbgstr_w(str2), prev_nav_url); SysFreeString(str2); - if(is_js) + if(is_js) { ignore_external_qi = TRUE; - test_download(DWL_VERBDONE | (is_js ? DWL_JAVASCRIPT : DWL_ONREADY_LOADING|DWL_EX_GETHOSTINFO) | dwl_flags); + dwl_flags |= DWL_JAVASCRIPT; + }else { + if(!(dwl_flags & DWL_EXTERNAL)) + dwl_flags |= DWL_EX_GETHOSTINFO; + dwl_flags |= DWL_ONREADY_LOADING; + } + test_download(DWL_VERBDONE | dwl_flags); if(is_js) ignore_external_qi = FALSE; @@ -5734,6 +6051,8 @@ static void test_put_href(IHTMLDocument2 *doc, BOOL use_replace, const char *hre ok(hres == S_OK, "GetAddressBarUrl failed: %08x\n", hres); if(is_js) ok(!strcmp_wa(str2, prev_nav_url), "unexpected address bar url: %s\n", wine_dbgstr_w(str2)); + else if (dwl_flags & DWL_EXTERNAL) + todo_wine ok(!strcmp_wa(str2, prev_nav_url), "unexpected address bar url: %s\n", wine_dbgstr_w(str2)); else ok(!strcmp_wa(str2, nav_url), "unexpected address bar url: %s\n", wine_dbgstr_w(str2)); SysFreeString(str2); @@ -6936,6 +7255,7 @@ static void test_travellog(IHTMLDocument2 *doc) IHTMLWindow2_Release(top_window); if(hres == E_NOINTERFACE) { win_skip("ITravelLogClient not supported\n"); + no_travellog = TRUE; return; } ok(hres == S_OK, "Could not get ITraveLogClient iface: %08x\n", hres); @@ -6979,7 +7299,7 @@ static void test_StreamLoad(IHTMLDocument2 *doc) todo_wine CHECK_CALLED(GetPendingUrl); test_timer(EXPECT_SETTITLE); - test_GetCurMoniker((IUnknown*)doc, NULL, "about:blank"); + test_GetCurMoniker((IUnknown*)doc, NULL, "about:blank", FALSE); IPersistStreamInit_Release(init); } @@ -7013,7 +7333,7 @@ static void test_StreamInitNew(IHTMLDocument2 *doc) todo_wine CHECK_CALLED(GetPendingUrl); test_timer(EXPECT_SETTITLE); - test_GetCurMoniker((IUnknown*)doc, NULL, "about:blank"); + test_GetCurMoniker((IUnknown*)doc, NULL, "about:blank", FALSE); IPersistStreamInit_Release(init); } @@ -7091,6 +7411,7 @@ static void init_test(enum load_state_t ls) { ipsex = FALSE; inplace_deactivated = FALSE; complete = FALSE; + testing_submit = FALSE; expect_uihandler_iface = &DocHostUIHandler; } @@ -7114,7 +7435,7 @@ static void test_HTMLDocument(BOOL do_load, BOOL mime) test_external(doc, FALSE); test_ViewAdviseSink(doc); test_ConnectionPointContainer(doc); - test_GetCurMoniker((IUnknown*)doc, NULL, NULL); + test_GetCurMoniker((IUnknown*)doc, NULL, NULL, FALSE); test_Persist(doc, &Moniker); if(!do_load) test_OnAmbientPropertyChange2(doc); @@ -7124,7 +7445,7 @@ static void test_HTMLDocument(BOOL do_load, BOOL mime) if(do_load) { set_custom_uihandler(doc, &CustomDocHostUIHandler); test_download(DWL_CSS|DWL_TRYCSS); - test_GetCurMoniker((IUnknown*)doc, &Moniker, NULL); + test_GetCurMoniker((IUnknown*)doc, &Moniker, NULL, FALSE); test_elem_from_point(doc); } @@ -7173,7 +7494,7 @@ static void test_HTMLDocument(BOOL do_load, BOOL mime) test_CloseView(); test_Close(doc, TRUE); test_OnAmbientPropertyChange2(doc); - test_GetCurMoniker((IUnknown*)doc, do_load ? &Moniker : NULL, NULL); + test_GetCurMoniker((IUnknown*)doc, do_load ? &Moniker : NULL, NULL, FALSE); if(!do_load) { /* Activate HTMLDocument again, calling UIActivate after showing the window */ @@ -7211,7 +7532,7 @@ static void test_HTMLDocument_hlink(DWORD status) set_custom_uihandler(doc, &CustomDocHostUIHandler); test_ViewAdviseSink(doc); test_ConnectionPointContainer(doc); - test_GetCurMoniker((IUnknown*)doc, NULL, NULL); + test_GetCurMoniker((IUnknown*)doc, NULL, NULL, FALSE); test_Persist(doc, &Moniker); test_Navigate(doc); @@ -7227,9 +7548,9 @@ static void test_HTMLDocument_hlink(DWORD status) test_InPlaceDeactivate(doc, TRUE); test_Close(doc, FALSE); test_IsDirty(doc, S_FALSE); - test_GetCurMoniker((IUnknown*)doc, &Moniker, NULL); + test_GetCurMoniker((IUnknown*)doc, &Moniker, NULL, FALSE); test_clear(doc); - test_GetCurMoniker((IUnknown*)doc, &Moniker, NULL); + test_GetCurMoniker((IUnknown*)doc, &Moniker, NULL, FALSE); if(view) IOleDocumentView_Release(view); @@ -7268,7 +7589,8 @@ static void test_cookies(IHTMLDocument2 *doc) b = InternetGetCookieW(http_urlW, NULL, buf, &size); ok(b, "InternetGetCookieW failed: %08x\n", GetLastError()); ok(!lstrcmpW(buf, str2), "cookie = %s, expected %s\n", wine_dbgstr_w(str2), wine_dbgstr_w(buf)); - ok(strstrW(str2, str) != NULL, "could not find %s in %s\n", wine_dbgstr_w(str), wine_dbgstr_w(str2)); + if(str2) + ok(strstrW(str2, str) != NULL, "could not find %s in %s\n", wine_dbgstr_w(str), wine_dbgstr_w(str2)); SysFreeString(str); SysFreeString(str2); @@ -7284,7 +7606,8 @@ static void test_cookies(IHTMLDocument2 *doc) b = InternetGetCookieW(http_urlW, NULL, buf, &size); ok(b, "InternetGetCookieW failed: %08x\n", GetLastError()); ok(!lstrcmpW(buf, str2), "cookie = %s, expected %s\n", wine_dbgstr_w(str2), wine_dbgstr_w(buf)); - ok(strstrW(str2, str) != NULL, "could not find %s in %s\n", wine_dbgstr_w(str), wine_dbgstr_w(str2)); + if(str2) + ok(strstrW(str2, str) != NULL, "could not find %s in %s\n", wine_dbgstr_w(str), wine_dbgstr_w(str2)); SysFreeString(str); SysFreeString(str2); } @@ -7316,14 +7639,14 @@ static void test_HTMLDocument_http(BOOL with_wbapp) test_ViewAdviseSink(doc); test_ConnectionPointContainer(doc); - test_GetCurMoniker((IUnknown*)doc, NULL, NULL); + test_GetCurMoniker((IUnknown*)doc, NULL, NULL, FALSE); test_Persist(doc, http_mon); test_Navigate(doc); test_download(DWL_HTTP); test_cookies(doc); test_IsDirty(doc, S_FALSE); test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED); - test_GetCurMoniker((IUnknown*)doc, http_mon, NULL); + test_GetCurMoniker((IUnknown*)doc, http_mon, NULL, FALSE); test_travellog(doc); test_binding_ui((IUnknown*)doc); @@ -7346,13 +7669,15 @@ static void test_HTMLDocument_http(BOOL with_wbapp) test_open_window(doc, TRUE); if(!support_wbapp) /* FIXME */ test_open_window(doc, FALSE); - if(support_wbapp) + if(support_wbapp) { + test_put_href(doc, FALSE, NULL, "http://test.winehq.org/tests/file.winetest", FALSE, FALSE, DWL_EXTERNAL); test_window_close(doc); + } test_InPlaceDeactivate(doc, TRUE); test_Close(doc, FALSE); test_IsDirty(doc, S_FALSE); - test_GetCurMoniker((IUnknown*)doc, NULL, prev_url); + test_GetCurMoniker((IUnknown*)doc, NULL, prev_url, support_wbapp); if(view) IOleDocumentView_Release(view); @@ -7364,6 +7689,161 @@ static void test_HTMLDocument_http(BOOL with_wbapp) ok(!ref, "ref=%d, expected 0\n", ref); } +static void put_inner_html(IHTMLElement *elem, const char *html) +{ + BSTR str = a2bstr(html); + HRESULT hres; + + hres = IHTMLElement_put_innerHTML(elem, str); + ok(hres == S_OK, "put_innerHTML failed: %08x\n", hres); + + SysFreeString(str); +} + +static IHTMLElement *get_elem_by_id(IHTMLDocument2 *doc, const char *id) +{ + IHTMLDocument3 *doc3; + BSTR str = a2bstr(id); + IHTMLElement *ret; + HRESULT hres; + + hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3); + ok(hres == S_OK, "Could not get IHTMLDocument3 iface: %08x\n", hres); + + hres = IHTMLDocument3_getElementById(doc3, str, &ret); + ok(hres == S_OK, "getElementById failed: %08x\n", hres); + + IHTMLDocument3_Release(doc3); + return ret; +} + +static void reset_document(IHTMLDocument2 *doc) +{ + IPersistStreamInit *init; + HRESULT hres; + + hres = IHTMLDocument2_QueryInterface(doc, &IID_IPersistStreamInit, (void**)&init); + ok(hres == S_OK, "QueryInterface(IID_IPersistStreamInit) failed: %08x\n", hres); + if(FAILED(hres)) + return; + + resetting_document = TRUE; + + hres = IPersistStreamInit_InitNew(init); + ok(hres == S_OK, "Load failed: %08x\n", hres); + + resetting_document = FALSE; + + test_GetCurMoniker((IUnknown*)doc, NULL, "about:blank", FALSE); + + IPersistStreamInit_Release(init); +} + +static void test_submit(void) +{ + IHTMLElement *body, *form_elem; + IHTMLFormElement *form; + IHTMLDocument2 *doc; + HRESULT hres; + + if(no_travellog) + return; + + trace("Testing submit...\n"); + + support_wbapp = TRUE; + + if(!winetest_interactive && is_ie_hardened()) { + win_skip("IE running in Enhanced Security Configuration\n"); + return; + } + + init_test(LD_DOLOAD); + ipsex = TRUE; + + doc = create_document(); + doc_unk = (IUnknown*)doc; + + test_ConnectionPointContainer(doc); + test_ViewAdviseSink(doc); + test_Persist(doc, &Moniker); + test_Navigate(doc); + test_download(DWL_CSS|DWL_TRYCSS); + + hres = IHTMLDocument2_get_body(doc, &body); + ok(hres == S_OK, "get_body failed: %08x\n", hres); + ok(body != NULL, "body = NULL\n"); + + put_inner_html(body, "
"); + IHTMLElement_Release(body); + + form_elem = get_elem_by_id(doc, "fid"); + ok(form_elem != NULL, "form = NULL\n"); + + hres = IHTMLElement_QueryInterface(form_elem, &IID_IHTMLFormElement, (void**)&form); + ok(hres == S_OK, "Could not get IHTMLFormElement: %08x\n", hres); + IHTMLElement_Release(form_elem); + + nav_url = nav_serv_url = "winetest:test_submit"; + testing_submit = TRUE; + + SET_EXPECT(TranslateUrl); + SET_EXPECT(FireBeforeNavigate2); + SET_EXPECT(Exec_ShellDocView_67); + SET_EXPECT(Invoke_AMBIENT_SILENT); + SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); + SET_EXPECT(Exec_ShellDocView_63); + SET_EXPECT(Exec_ShellDocView_84); + SET_EXPECT(CreateInstance); + SET_EXPECT(Start); + SET_EXPECT(Protocol_Read); + SET_EXPECT(LockRequest); + SET_EXPECT(GetClassID); + SET_EXPECT(Exec_ShellDocView_138); + SET_EXPECT(OnViewChange); + + SET_EXPECT(UnlockRequest); + SET_EXPECT(Terminate); + + hres = IHTMLFormElement_submit(form); + ok(hres == S_OK, "submit failed: %08x\n", hres); + + CHECK_CALLED(TranslateUrl); + CHECK_CALLED(FireBeforeNavigate2); + CHECK_CALLED(Exec_ShellDocView_67); + CHECK_CALLED(Invoke_AMBIENT_SILENT); + CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); + CHECK_CALLED(Exec_ShellDocView_63); + todo_wine CHECK_CALLED(Exec_ShellDocView_84); + CHECK_CALLED(CreateInstance); + CHECK_CALLED(Start); + CHECK_CALLED(Protocol_Read); + CHECK_CALLED(LockRequest); + todo_wine CHECK_CALLED(GetClassID); + CLEAR_CALLED(Exec_ShellDocView_138); /* called only by some versions */ + CLEAR_CALLED(OnViewChange); /* called only by some versions */ + + todo_wine CHECK_NOT_CALLED(UnlockRequest); + todo_wine CHECK_NOT_CALLED(Terminate); + + IHTMLFormElement_Release(form); + + test_GetCurMoniker((IUnknown*)doc, &Moniker, NULL, FALSE); + + SET_EXPECT(UnlockRequest); + reset_document(doc); + todo_wine CHECK_CALLED(UnlockRequest); + + test_InPlaceDeactivate(doc, TRUE); + test_Close(doc, FALSE); + + if(view) + IOleDocumentView_Release(view); + view = NULL; + + release_document(doc); +} + static void test_QueryService(IHTMLDocument2 *doc, BOOL success) { IHTMLWindow2 *window, *sp_window; @@ -7438,7 +7918,7 @@ static void test_HTMLDocument_StreamLoad(void) test_DoVerb(oleobj); test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED); - test_GetCurMoniker((IUnknown*)doc, NULL, NULL); + test_GetCurMoniker((IUnknown*)doc, NULL, NULL, FALSE); test_StreamLoad(doc); test_download(DWL_VERBDONE|DWL_TRYCSS); test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED); @@ -7499,7 +7979,7 @@ static void test_HTMLDocument_StreamInitNew(void) IOleObject_Release(oleobj); - test_GetCurMoniker((IUnknown*)doc, NULL, NULL); + test_GetCurMoniker((IUnknown*)doc, NULL, NULL, FALSE); test_StreamInitNew(doc); SET_EXPECT(Invoke_OnReadyStateChange_Interactive); @@ -7892,12 +8372,21 @@ static BOOL check_ie(void) { IHTMLDocument2 *doc; IHTMLDocument5 *doc5; + IHTMLDocument7 *doc7; HRESULT hres; doc = create_document(); if(!doc) return FALSE; + hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument7, (void**)&doc7); + if(SUCCEEDED(hres)) { + is_ie9plus = TRUE; + IHTMLDocument7_Release(doc7); + } + + trace("is_ie9plus %x\n", is_ie9plus); + hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5); if(SUCCEEDED(hres)) IHTMLDocument5_Release(doc5); @@ -7986,6 +8475,7 @@ START_TEST(htmldoc) skip("Skipping test_HTMLDocument_http(TRUE). ROSTESTS-113.\n"); } + test_submit(); test_UIActivate(FALSE, FALSE, FALSE); test_UIActivate(FALSE, TRUE, FALSE); test_UIActivate(FALSE, TRUE, TRUE); diff --git a/rostests/winetests/mshtml/mshtml_test.h b/rostests/winetests/mshtml/mshtml_test.h index 7f2cdf2eef3..c0844958dc9 100644 --- a/rostests/winetests/mshtml/mshtml_test.h +++ b/rostests/winetests/mshtml/mshtml_test.h @@ -24,10 +24,10 @@ static BOOL is_ie_hardened(void) DWORD ie_harden, type, size; ie_harden = 0; - if(RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap", + if(RegOpenKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap", 0, KEY_QUERY_VALUE, &zone_map) == ERROR_SUCCESS) { size = sizeof(DWORD); - if (RegQueryValueEx(zone_map, "IEHarden", NULL, &type, (LPBYTE) &ie_harden, &size) != ERROR_SUCCESS || + if (RegQueryValueExA(zone_map, "IEHarden", NULL, &type, (LPBYTE) &ie_harden, &size) != ERROR_SUCCESS || type != REG_DWORD) { ie_harden = 0; } diff --git a/rostests/winetests/mshtml/nav_test.html b/rostests/winetests/mshtml/nav_test.html new file mode 100644 index 00000000000..d106dfc2412 --- /dev/null +++ b/rostests/winetests/mshtml/nav_test.html @@ -0,0 +1,42 @@ + + + + + + + diff --git a/rostests/winetests/mshtml/protocol.c b/rostests/winetests/mshtml/protocol.c index ec6521655d1..86dff350cd7 100644 --- a/rostests/winetests/mshtml/protocol.c +++ b/rostests/winetests/mshtml/protocol.c @@ -25,7 +25,7 @@ //#include "windef.h" //#include "winbase.h" //#include "ole2.h" -//#include "urlmon.h" +#include #include #include @@ -77,18 +77,6 @@ static const WCHAR javascript_test_url[] = {'j','a','v','a','s','c','r','i','p', static WCHAR res_url_base[INTERNET_MAX_URL_LENGTH] = {'r','e','s',':','/','/'}; static unsigned res_url_base_len; -static const char *debugstr_guid(REFIID riid) -{ - static char buf[50]; - - sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", - riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], - riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], - riid->Data4[5], riid->Data4[6], riid->Data4[7]); - - return buf; -} - static HRESULT WINAPI ProtocolSink_QueryInterface(IInternetProtocolSink *iface, REFIID riid, void **ppv) { if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IInternetProtocolSink, riid)) { @@ -97,7 +85,7 @@ static HRESULT WINAPI ProtocolSink_QueryInterface(IInternetProtocolSink *iface, } *ppv = NULL; - ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -184,7 +172,7 @@ static HRESULT WINAPI BindInfo_QueryInterface(IInternetBindInfo *iface, REFIID r } *ppv = NULL; - ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } diff --git a/rostests/winetests/mshtml/rsrc.rc b/rostests/winetests/mshtml/rsrc.rc index 07d816d388c..d498b8295f3 100644 --- a/rostests/winetests/mshtml/rsrc.rc +++ b/rostests/winetests/mshtml/rsrc.rc @@ -31,6 +31,15 @@ events.html HTML "events.html" /* @makedep: externscr.js */ externscr.js HTML "externscr.js" +/* @makedep: nav_test.html */ +nav_test.html HTML "nav_test.html" + +/* @makedep: blank.html */ +blank.html HTML "blank.html" + +/* @makedep: blank.html */ +blank2.html HTML "blank.html" + /* @makedep: test_tlb.tlb */ 1 TYPELIB test_tlb.tlb diff --git a/rostests/winetests/mshtml/script.c b/rostests/winetests/mshtml/script.c index ac84e30e241..7337942259a 100644 --- a/rostests/winetests/mshtml/script.c +++ b/rostests/winetests/mshtml/script.c @@ -150,6 +150,7 @@ static const GUID CLSID_TestScript = static const GUID CLSID_TestActiveX = {0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x06,0x46}}; +static BOOL is_ie9plus; static IHTMLDocument2 *notif_doc; static IOleDocumentView *view; static IDispatchEx *window_dispex; @@ -161,18 +162,6 @@ static HRESULT ax_getopt_hres = S_OK, ax_setopt_dispex_hres = S_OK; static HRESULT ax_setopt_disp_caller_hres = S_OK, ax_setopt_disp_data_hres = S_OK; static BOOL skip_loadobject_tests; -static const char *debugstr_guid(REFIID riid) -{ - static char buf[50]; - - sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", - riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], - riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], - riid->Data4[5], riid->Data4[6], riid->Data4[7]); - - return buf; -} - static int strcmp_wa(LPCWSTR strw, const char *stra) { CHAR buf[512]; @@ -201,7 +190,7 @@ static BOOL init_key(const char *key_name, const char *def_value, BOOL init) DWORD res; if(!init) { - RegDeleteKey(HKEY_CLASSES_ROOT, key_name); + RegDeleteKeyA(HKEY_CLASSES_ROOT, key_name); return TRUE; } @@ -276,7 +265,7 @@ static IPropertyNotifySink PropertyNotifySink = { &PropertyNotifySinkVtbl }; static HRESULT WINAPI VariantChangeType_QueryInterface(IVariantChangeType *iface, REFIID riid, void **ppv) { - ok(0, "unexpected call %s\n", debugstr_guid(riid)); + ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid)); *ppv = NULL; return E_NOINTERFACE; } @@ -338,12 +327,12 @@ static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFG { if(IsEqualGUID(guidService, &SID_VariantConversion)) { CHECK_EXPECT(QS_VariantConversion); - ok(IsEqualGUID(riid, &IID_IVariantChangeType), "uenxpected riid %s\n", debugstr_guid(riid)); + ok(IsEqualGUID(riid, &IID_IVariantChangeType), "uenxpected riid %s\n", wine_dbgstr_guid(riid)); *ppv = &VChangeType; return S_OK; } - ok(0, "unexpected service %s\n", debugstr_guid(guidService)); + ok(0, "unexpected service %s\n", wine_dbgstr_guid(guidService)); return E_NOINTERFACE; } @@ -1177,23 +1166,12 @@ static HRESULT QueryInterface(REFIID riid, void **ppv) static IHTMLDocument2 *create_document(void) { IHTMLDocument2 *doc; - IHTMLDocument5 *doc5; HRESULT hres; hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IHTMLDocument2, (void**)&doc); ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres); - if (hres != S_OK) return NULL; - - hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5); - if(FAILED(hres)) { - win_skip("Could not get IHTMLDocument5, probably too old IE\n"); - IHTMLDocument2_Release(doc); - return NULL; - } - - IHTMLDocument5_Release(doc5); - return doc; + return SUCCEEDED(hres) ? doc : NULL; } static void load_string(IHTMLDocument2 *doc, const char *str) @@ -1285,9 +1263,9 @@ static void load_doc(IHTMLDocument2 *doc, const char *str) load_string(doc, str); do_advise(doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink); - while(!doc_complete && GetMessage(&msg, NULL, 0, 0)) { + while(!doc_complete && GetMessageW(&msg, NULL, 0, 0)) { TranslateMessage(&msg); - DispatchMessage(&msg); + DispatchMessageW(&msg); } hres = IHTMLDocument2_get_body(doc, &body); @@ -1308,7 +1286,7 @@ static SCRIPTSTATE state; static HRESULT WINAPI ObjectSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv) { *ppv = NULL; - ok(0, "unexpected call %s\n", debugstr_guid(riid)); + ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -1327,7 +1305,7 @@ static HRESULT WINAPI ObjectSafety_GetInterfaceSafetyOptions(IObjectSafety *ifac { CHECK_EXPECT(GetInterfaceSafetyOptions); - ok(IsEqualGUID(&IID_IActiveScriptParse, riid), "unexpected riid %s\n", debugstr_guid(riid)); + ok(IsEqualGUID(&IID_IActiveScriptParse, riid), "unexpected riid %s\n", wine_dbgstr_guid(riid)); ok(pdwSupportedOptions != NULL, "pdwSupportedOptions == NULL\n"); ok(pdwEnabledOptions != NULL, "pdwEnabledOptions == NULL\n"); @@ -1342,7 +1320,7 @@ static HRESULT WINAPI ObjectSafety_SetInterfaceSafetyOptions(IObjectSafety *ifac { CHECK_EXPECT(SetInterfaceSafetyOptions); - ok(IsEqualGUID(&IID_IActiveScriptParse, riid), "unexpected riid %s\n", debugstr_guid(riid)); + ok(IsEqualGUID(&IID_IActiveScriptParse, riid), "unexpected riid %s\n", wine_dbgstr_guid(riid)); ok(dwOptionSetMask == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), "dwOptionSetMask=%x\n", dwOptionSetMask); @@ -1379,7 +1357,7 @@ static HRESULT WINAPI AXObjectSafety_QueryInterface(IObjectSafety *iface, REFIID return S_OK; } - ok(0, "unexpected call %s\n", debugstr_guid(riid)); + ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -1388,7 +1366,7 @@ static HRESULT WINAPI AXObjectSafety_GetInterfaceSafetyOptions(IObjectSafety *if { CHECK_EXPECT(AXGetInterfaceSafetyOptions); - ok(IsEqualGUID(&IID_IDispatchEx, riid), "unexpected riid %s\n", debugstr_guid(riid)); + ok(IsEqualGUID(&IID_IDispatchEx, riid), "unexpected riid %s\n", wine_dbgstr_guid(riid)); ok(pdwSupportedOptions != NULL, "pdwSupportedOptions == NULL\n"); ok(pdwEnabledOptions != NULL, "pdwEnabledOptions == NULL\n"); @@ -1439,7 +1417,7 @@ static HRESULT WINAPI AXObjectSafety_SetInterfaceSafetyOptions(IObjectSafety *if return hres; } - ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -2424,7 +2402,7 @@ static HRESULT WINAPI ActiveScript_QueryInterface(IActiveScript *iface, REFIID r if(IsEqualGUID(&IID_IActiveScriptDebug, riid)) return E_NOINTERFACE; - trace("QI(%s)\n", debugstr_guid(riid)); + trace("QI(%s)\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -2653,7 +2631,7 @@ static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID r if(IsEqualGUID(&CLSID_IdentityUnmarshal, riid)) return E_NOINTERFACE; - ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); return E_NOTIMPL; } @@ -2672,7 +2650,7 @@ static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown CHECK_EXPECT(CreateInstance); ok(!outer, "outer = %p\n", outer); - ok(IsEqualGUID(&IID_IActiveScript, riid), "unexpected riid %s\n", debugstr_guid(riid)); + ok(IsEqualGUID(&IID_IActiveScript, riid), "unexpected riid %s\n", wine_dbgstr_guid(riid)); *ppv = &ActiveScript; return S_OK; } @@ -2826,9 +2804,9 @@ static void run_js_script(const char *test_name) SET_EXPECT(external_success); - while(!called_external_success && GetMessage(&msg, NULL, 0, 0)) { + while(!called_external_success && GetMessageW(&msg, NULL, 0, 0)) { TranslateMessage(&msg); - DispatchMessage(&msg); + DispatchMessageW(&msg); } CHECK_CALLED(external_success); @@ -2843,6 +2821,10 @@ static void run_js_tests(void) run_js_script("exectest.html"); run_js_script("vbtest.html"); run_js_script("events.html"); + if(is_ie9plus) + run_js_script("nav_test.html"); + else + win_skip("Skipping nav_test.html on IE older than 9 (for broken ieframe onload).\n"); } static BOOL init_registry(BOOL init) @@ -2873,7 +2855,7 @@ static BOOL register_script_engine(void) static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - return DefWindowProc(hwnd, msg, wParam, lParam); + return DefWindowProcA(hwnd, msg, wParam, lParam); } static HWND create_container_window(void) @@ -2894,21 +2876,52 @@ static HWND create_container_window(void) 300, 300, NULL, NULL, NULL, NULL); } +static BOOL check_ie(void) +{ + IHTMLDocument2 *doc; + IHTMLDocument5 *doc5; + IHTMLDocument7 *doc7; + HRESULT hres; + + doc = create_document(); + if(!doc) + return FALSE; + + hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument7, (void**)&doc7); + if(SUCCEEDED(hres)) { + is_ie9plus = TRUE; + IHTMLDocument7_Release(doc7); + } + + trace("is_ie9plus %x\n", is_ie9plus); + + hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5); + if(SUCCEEDED(hres)) + IHTMLDocument5_Release(doc5); + + IHTMLDocument2_Release(doc); + return SUCCEEDED(hres); +} + START_TEST(script) { CoInitialize(NULL); container_hwnd = create_container_window(); - if(winetest_interactive || ! is_ie_hardened()) { - if(register_script_engine()) { - test_simple_script(); - init_registry(FALSE); + if(check_ie()) { + if(winetest_interactive || ! is_ie_hardened()) { + if(register_script_engine()) { + test_simple_script(); + init_registry(FALSE); + }else { + skip("Could not register TestScript engine\n"); + } + run_js_tests(); }else { - skip("Could not register TestScript engine\n"); + skip("IE running in Enhanced Security Configuration\n"); } - run_js_tests(); }else { - skip("IE running in Enhanced Security Configuration\n"); + win_skip("Too old IE.\n"); } DestroyWindow(container_hwnd); diff --git a/rostests/winetests/mshtml/style.c b/rostests/winetests/mshtml/style.c index a8c56d49180..3cab20065a9 100644 --- a/rostests/winetests/mshtml/style.c +++ b/rostests/winetests/mshtml/style.c @@ -37,6 +37,13 @@ static int strcmp_wa(LPCWSTR strw, const char *stra) return lstrcmpA(stra, buf); } +static BOOL wstr_contains(const WCHAR *strw, const char *stra) +{ + CHAR buf[512]; + WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL); + return strstr(buf, stra) != NULL; +} + static BSTR a2bstr(const char *str) { BSTR ret; @@ -464,11 +471,52 @@ static void test_style4(IHTMLStyle4 *style4) VariantClear(&vdefault); } +static void test_style6(IHTMLStyle6 *style) +{ + BSTR str; + HRESULT hres; + + str = (void*)0xdeadbeef; + hres = IHTMLStyle6_get_outline(style, &str); + ok(hres == S_OK, "get_outline failed: %08x\n", hres); + ok(str && !*str, "outline = %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + str = a2bstr("1px"); + hres = IHTMLStyle6_put_outline(style, str); + ok(hres == S_OK, "put_outline failed: %08x\n", hres); + SysFreeString(str); + + str = (void*)0xdeadbeef; + hres = IHTMLStyle6_get_outline(style, &str); + ok(hres == S_OK, "get_outline failed: %08x\n", hres); + ok(wstr_contains(str, "1px"), "outline = %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + str = (void*)0xdeadbeef; + hres = IHTMLStyle6_get_boxSizing(style, &str); + ok(hres == S_OK, "get_boxSizing failed: %08x\n", hres); + ok(!str, "boxSizing = %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + str = a2bstr("border-box"); + hres = IHTMLStyle6_put_boxSizing(style, str); + ok(hres == S_OK, "put_boxSizing failed: %08x\n", hres); + SysFreeString(str); + + str = NULL; + hres = IHTMLStyle6_get_boxSizing(style, &str); + ok(hres == S_OK, "get_boxSizing failed: %08x\n", hres); + ok(!strcmp_wa(str, "border-box"), "boxSizing = %s\n", wine_dbgstr_w(str)); + SysFreeString(str); +} + static void test_body_style(IHTMLStyle *style) { IHTMLStyle2 *style2; IHTMLStyle3 *style3; IHTMLStyle4 *style4; + IHTMLStyle6 *style6; VARIANT_BOOL b; VARIANT v; BSTR str; @@ -2044,6 +2092,22 @@ static void test_body_style(IHTMLStyle *style) ok(!strcmp_wa(str, "nowrap"), "whiteSpace = %s\n", wine_dbgstr_w(str)); SysFreeString(str); + /* listStyleType */ + hres = IHTMLStyle_get_listStyleType(style, &str); + ok(hres == S_OK, "get_listStyleType failed: %08x\n", hres); + ok(!str, "listStyleType = %s\n", wine_dbgstr_w(str)); + + str = a2bstr("square"); + hres = IHTMLStyle_put_listStyleType(style, str); + ok(hres == S_OK, "put_listStyleType failed: %08x\n", hres); + SysFreeString(str); + + str = NULL; + hres = IHTMLStyle_get_listStyleType(style, &str); + ok(hres == S_OK, "get_listStyleType failed: %08x\n", hres); + ok(!strcmp_wa(str, "square"), "listStyleType = %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + hres = IHTMLStyle_QueryInterface(style, &IID_IHTMLStyle2, (void**)&style2); ok(hres == S_OK, "Could not get IHTMLStyle2 iface: %08x\n", hres); if(SUCCEEDED(hres)) { @@ -2064,6 +2128,14 @@ static void test_body_style(IHTMLStyle *style) test_style4(style4); IHTMLStyle4_Release(style4); } + + hres = IHTMLStyle_QueryInterface(style, &IID_IHTMLStyle6, (void**)&style6); + if(SUCCEEDED(hres)) { + test_style6(style6); + IHTMLStyle6_Release(style6); + }else { + win_skip("IHTMLStyle6 not available\n"); + } } #define test_style_filter(a,b) _test_style_filter(__LINE__,a,b) @@ -2647,9 +2719,9 @@ static void run_test(const char *str, style_test_t test) do_advise((IUnknown*)doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink); - while(!doc_complete && GetMessage(&msg, NULL, 0, 0)) { + while(!doc_complete && GetMessageW(&msg, NULL, 0, 0)) { TranslateMessage(&msg); - DispatchMessage(&msg); + DispatchMessageW(&msg); } test(doc); diff --git a/rostests/winetests/mshtml/test_tlb.idl b/rostests/winetests/mshtml/test_tlb.idl index 362b7b401cd..34964cba51b 100644 --- a/rostests/winetests/mshtml/test_tlb.idl +++ b/rostests/winetests/mshtml/test_tlb.idl @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#pragma makedep typelib + import "oaidl.idl"; [