diff --git a/dlls/mshtml/tests/events.c b/dlls/mshtml/tests/events.c index 2bd85fcd1e7..5e2f8c7573b 100644 --- a/dlls/mshtml/tests/events.c +++ b/dlls/mshtml/tests/events.c @@ -92,6 +92,7 @@ static HWND container_hwnd = NULL; static IHTMLWindow2 *window; static IOleDocumentView *view; static BOOL is_ie9plus; +static int document_mode; typedef struct { LONG x; @@ -105,14 +106,19 @@ static const xy_test_t no_xy = {-10,-10,-10,-10}; static const char empty_doc_str[] = ""; -static const char click_doc_str[] = - "" - "
click here
" - ""; +static const char empty_doc_ie9_str[] = + "" + "" + ""; static const char readystate_doc_str[] = ""; +static const char readystate_doc_ie9_str[] = + "" + "" + ""; + static const char img_doc_str[] = ""; @@ -125,12 +131,6 @@ static const char input_doc_str[] = static const char iframe_doc_str[] = ""; -static const char form_doc_str[] = - "
" - "" - "" - "
"; - static int strcmp_wa(LPCWSTR strw, const char *stra) { CHAR buf[512]; @@ -191,8 +191,9 @@ 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", - wine_dbgstr_guid(&type_attr->guid)); + if(diid) + ok_(__FILE__,line) (IsEqualGUID(&type_attr->guid, diid), "unexpected guid %s\n", + wine_dbgstr_guid(&type_attr->guid)); ITypeInfo_ReleaseTypeAttr(typeinfo, type_attr); ITypeInfo_Release(typeinfo); @@ -328,11 +329,25 @@ static IHTMLEventObj *_get_event_obj(unsigned line) hres = IHTMLWindow2_get_event(window, &event); ok_(__FILE__,line) (hres == S_OK, "get_event failed: %08x\n", hres); ok_(__FILE__,line) (event != NULL, "event = NULL\n"); - _test_disp(line, (IUnknown*)event, &DIID_DispCEventObj); + + /* Native IE uses an undocumented DIID in IE9+ mode */ + _test_disp(line, (IUnknown*)event, document_mode < 9 ? &DIID_DispCEventObj : NULL); return event; } +#define set_elem_innerhtml(e,t) _set_elem_innerhtml(__LINE__,e,t) +static void _set_elem_innerhtml(unsigned line, IHTMLElement *elem, const char *inner_html) +{ + BSTR html; + HRESULT hres; + + html = a2bstr(inner_html); + hres = IHTMLElement_put_innerHTML(elem, html); + ok_(__FILE__,line)(hres == S_OK, "put_innerHTML failed: %08x\n", hres); + SysFreeString(html); +} + #define elem_fire_event(a,b,c) _elem_fire_event(__LINE__,a,b,c) static void _elem_fire_event(unsigned line, IUnknown *unk, const char *event, VARIANT *evobj) { @@ -356,11 +371,14 @@ static void _test_event_args(unsigned line, const IID *dispiid, DISPID id, WORD ok_(__FILE__,line) (id == DISPID_VALUE, "id = %d\n", id); ok_(__FILE__,line) (wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags); ok_(__FILE__,line) (pdp != NULL, "pdp == NULL\n"); - ok_(__FILE__,line) (pdp->cArgs == 1, "pdp->cArgs = %d\n", pdp->cArgs); + todo_wine_if(document_mode >= 9) + ok_(__FILE__,line) (pdp->cArgs == (document_mode < 9 ? 1 : 2), "pdp->cArgs = %d\n", pdp->cArgs); ok_(__FILE__,line) (pdp->cNamedArgs == 1, "pdp->cNamedArgs = %d\n", pdp->cNamedArgs); ok_(__FILE__,line) (pdp->rgdispidNamedArgs[0] == DISPID_THIS, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]); ok_(__FILE__,line) (V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(rgvarg) = %d\n", V_VT(pdp->rgvarg)); + if(pdp->cArgs > 1) + ok_(__FILE__,line) (V_VT(pdp->rgvarg+1) == VT_DISPATCH, "V_VT(rgvarg) = %d\n", V_VT(pdp->rgvarg)); ok_(__FILE__,line) (pvarRes != NULL, "pvarRes == NULL\n"); ok_(__FILE__,line) (pei != NULL, "pei == NULL"); ok_(__FILE__,line) (!pspCaller, "pspCaller != NULL\n"); @@ -674,7 +692,11 @@ static void _test_event_obj(unsigned line, const char *type, const xy_test_t *xy V_VT(&v) = VT_NULL; hres = IHTMLEventObj_get_returnValue(event, &v); ok_(__FILE__,line)(hres == S_OK, "get_returnValue failed: %08x\n", hres); - ok_(__FILE__,line)(V_VT(&v) == VT_EMPTY, "V_VT(returnValue) = %d\n", V_VT(&v)); + /* Depending on source of event, returnValue may be true bool in IE9+ mode */ + ok_(__FILE__,line)(V_VT(&v) == VT_EMPTY || (document_mode >= 9 && V_VT(&v) == VT_BOOL), + "V_VT(returnValue) = %d\n", V_VT(&v)); + if(V_VT(&v) == VT_BOOL) + ok_(__FILE__,line)(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(returnValue) = %x\n", V_BOOL(&v)); IHTMLEventObj_Release(event); } @@ -741,14 +763,12 @@ static void _doc_detach_event(unsigned line, IHTMLDocument2 *doc, const char *na static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) { - *ppv = NULL; - if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDispatch) || IsEqualGUID(riid, &IID_IDispatchEx)) *ppv = iface; else { - ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); + *ppv = NULL; return E_NOINTERFACE; } @@ -757,15 +777,11 @@ static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, static HRESULT WINAPI Dispatch_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) { - *ppv = NULL; - - if(IsEqualGUID(riid, &IID_IUnknown) + if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDispatch)) { *ppv = iface; - }else if(IsEqualGUID(riid, &IID_IDispatchEx)) { - return E_NOINTERFACE; }else { - ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); + *ppv = NULL; return E_NOINTERFACE; } @@ -901,6 +917,7 @@ static HRESULT WINAPI div_onclick(IDispatchEx *iface, DISPID id, LCID lcid, WORD CHECK_EXPECT(div_onclick); test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller); test_event_src("DIV"); + test_event_obj("click", &no_xy); return S_OK; } @@ -934,7 +951,8 @@ static HRESULT WINAPI body_onclick(IDispatchEx *iface, DISPID id, LCID lcid, WOR VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { CHECK_EXPECT(body_onclick); - test_event_args(&DIID_DispHTMLBody, id, wFlags, pdp, pvarRes, pei, pspCaller); + /* Native IE returns undocumented DIID in IE9+ mode */ + test_event_args(document_mode < 9 ? &DIID_DispHTMLBody : NULL, id, wFlags, pdp, pvarRes, pei, pspCaller); test_event_src("DIV"); return S_OK; } @@ -1142,7 +1160,12 @@ static HRESULT WINAPI submit_onclick_setret(IDispatchEx *iface, DISPID id, LCID V_VT(&v) = VT_ERROR; hres = IHTMLEventObj_get_returnValue(event, &v); ok(hres == S_OK, "get_returnValue failed: %08x\n", hres); - ok(V_VT(&v) == VT_EMPTY, "V_VT(returnValue) = %d\n", V_VT(&v)); + if(document_mode < 9) { + ok(V_VT(&v) == VT_EMPTY, "V_VT(returnValue) = %d\n", V_VT(&v)); + }else todo_wine { + ok(V_VT(&v) == VT_BOOL, "V_VT(returnValue) = %d\n", V_VT(&v)); + ok(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(returnValue) = %x\n", V_BOOL(&v)); + } hres = IHTMLEventObj_put_returnValue(event, onclick_event_retval); ok(hres == S_OK, "put_returnValue failed: %08x\n", hres); @@ -1193,7 +1216,7 @@ static HRESULT WINAPI iframedoc_onreadystatechange(IDispatchEx *iface, DISPID id HRESULT hres; CHECK_EXPECT2(iframedoc_onreadystatechange); - test_event_args(&DIID_DispHTMLDocument, id, wFlags, pdp, pvarRes, pei, pspCaller); + test_event_args(document_mode < 9 ? &DIID_DispHTMLDocument : NULL, id, wFlags, pdp, pvarRes, pei, pspCaller); event = (void*)0xdeadbeef; hres = IHTMLWindow2_get_event(window, &event); @@ -1217,7 +1240,7 @@ static HRESULT WINAPI iframe_onreadystatechange(IDispatchEx *iface, DISPID id, L BSTR str, str2; HRESULT hres; - test_event_args(&DIID_DispHTMLIFrame, id, wFlags, pdp, pvarRes, pei, pspCaller); + test_event_args(document_mode < 9 ? &DIID_DispHTMLIFrame : NULL, id, wFlags, pdp, pvarRes, pei, pspCaller); test_event_src("IFRAME"); elem = get_event_src(); @@ -1654,6 +1677,13 @@ static const IDispatchVtbl EventDispatchVtbl = { static IDispatch EventDispatch = { &EventDispatchVtbl }; +static void set_body_html(IHTMLDocument2 *doc, const char *html) +{ + IHTMLElement *body = doc_get_body(doc); + set_elem_innerhtml(body, html); + IHTMLElement_Release(body); +} + static void test_onclick(IHTMLDocument2 *doc) { DWORD cp_cookie, elem2_cp_cookie; @@ -1661,6 +1691,13 @@ static void test_onclick(IHTMLDocument2 *doc) VARIANT v; HRESULT hres; + trace("onclick tests in document mode %d\n", document_mode); + + set_body_html(doc, "
" + "click here" + "
"); + register_cp((IUnknown*)doc, &IID_IDispatch, (IUnknown*)&EventDispatch); div = get_elem_id(doc, "clickdiv"); @@ -1675,19 +1712,28 @@ static void test_onclick(IHTMLDocument2 *doc) V_VT(&v) = VT_EMPTY; hres = IHTMLElement_put_onclick(div, v); - ok(hres == E_NOTIMPL, "put_onclick failed: %08x\n", hres); + ok(hres == (document_mode < 9 ? E_NOTIMPL : S_OK), "put_onclick failed: %08x\n", hres); + + V_VT(&v) = VT_EMPTY; + hres = IHTMLElement_get_onclick(div, &v); + ok(hres == S_OK, "get_onclick failed: %08x\n", hres); + ok(V_VT(&v) == VT_NULL, "V_VT(onclick) = %d\n", V_VT(&v)); V_VT(&v) = VT_BSTR; V_BSTR(&v) = a2bstr("function();"); hres = IHTMLElement_put_onclick(div, v); ok(hres == S_OK, "put_onclick failed: %08x\n", hres); + SysFreeString(V_BSTR(&v)); - if(hres == S_OK) { - V_VT(&v) = VT_EMPTY; - hres = IHTMLElement_get_onclick(div, &v); - ok(hres == S_OK, "get_onclick failed: %08x\n", hres); + V_VT(&v) = VT_EMPTY; + hres = IHTMLElement_get_onclick(div, &v); + ok(hres == S_OK, "get_onclick failed: %08x\n", hres); + if(document_mode < 9) { ok(V_VT(&v) == VT_BSTR, "V_VT(onclick) = %d\n", V_VT(&v)); ok(!strcmp_wa(V_BSTR(&v), "function();"), "V_BSTR(onclick) = %s\n", wine_dbgstr_w(V_BSTR(&v))); + }else { + todo_wine + ok(V_VT(&v) == VT_NULL, "V_VT(onclick) = %d\n", V_VT(&v)); } VariantClear(&v); @@ -2164,6 +2210,12 @@ static void test_submit(IHTMLDocument2 *doc) DWORD cp_cookie; HRESULT hres; + set_body_html(doc, + "
" + "" + "" + "
"); + elem = get_elem_id(doc, "formid"); V_VT(&v) = VT_DISPATCH; @@ -3014,8 +3066,22 @@ static void run_test(const char *str, testfunc_t test) ok(hres == S_OK, "get_body failed: %08x\n", hres); if(body) { + IHTMLDocument6 *doc6; + IHTMLElement_Release(body); + hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument6, (void**)&doc6); + if(SUCCEEDED(hres)) { + VARIANT v; + hres = IHTMLDocument6_get_documentMode(doc6, &v); + ok(hres == S_OK, "get_documentMode failed: %08x\n", hres); + ok(V_VT(&v) == VT_R4, "V_VT(documentMode) = %u\n", V_VT(&v)); + document_mode = V_R4(&v); + IHTMLDocument6_Release(doc6); + }else { + document_mode = 0; + } + hres = IHTMLDocument2_get_parentWindow(doc, &window); ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres); ok(window != NULL, "window == NULL\n"); @@ -3123,12 +3189,15 @@ START_TEST(events) ShowWindow(container_hwnd, SW_SHOW); run_test(empty_doc_str, test_timeout); - run_test(click_doc_str, test_onclick); + run_test(empty_doc_str, test_onclick); + run_test(empty_doc_ie9_str, test_onclick); run_test(readystate_doc_str, test_onreadystatechange); + run_test(readystate_doc_ie9_str, test_onreadystatechange); run_test(img_doc_str, test_imgload); run_test(link_doc_str, test_link_load); run_test(input_doc_str, test_focus); - run_test(form_doc_str, test_submit); + run_test(empty_doc_str, test_submit); + run_test(empty_doc_ie9_str, test_submit); run_test(iframe_doc_str, test_iframe_connections); test_empty_document();