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[] = "" "