mshtml/tests: Run events tests in IE9 mode.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
fd10004e31
commit
5a9209d7e9
dlls/mshtml/tests
|
@ -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[] =
|
||||
"<html></html>";
|
||||
|
||||
static const char click_doc_str[] =
|
||||
"<html><body>"
|
||||
"<div id=\"clickdiv\" style=\"text-align: center; background: red; font-size: 32\">click here</div>"
|
||||
"</body></html>";
|
||||
static const char empty_doc_ie9_str[] =
|
||||
"<html>"
|
||||
"<head><meta http-equiv=\"x-ua-compatible\" content=\"IE=9\" /></head>"
|
||||
"</html>";
|
||||
|
||||
static const char readystate_doc_str[] =
|
||||
"<html><body><iframe id=\"iframe\"></iframe></body></html>";
|
||||
|
||||
static const char readystate_doc_ie9_str[] =
|
||||
"<html>"
|
||||
"<head><meta http-equiv=\"x-ua-compatible\" content=\"IE=9\" /></head>"
|
||||
"<body><iframe id=\"iframe\"></iframe></body></html>";
|
||||
|
||||
static const char img_doc_str[] =
|
||||
"<html><body><img id=\"imgid\"></img></body></html>";
|
||||
|
||||
|
@ -125,12 +131,6 @@ static const char input_doc_str[] =
|
|||
static const char iframe_doc_str[] =
|
||||
"<html><body><iframe id=\"ifr\">Testing</iframe></body></html>";
|
||||
|
||||
static const char form_doc_str[] =
|
||||
"<html><body><form id=\"formid\" method=\"post\" action=\"about:blank\">"
|
||||
"<input type=\"text\" value=\"test\" name=\"i\"/>"
|
||||
"<input type=\"submit\" id=\"submitid\" />"
|
||||
"</form></body></html>";
|
||||
|
||||
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, "<div id=\"clickdiv\""
|
||||
" style=\"text-align: center; background: red; font-size: 32\">"
|
||||
"click here"
|
||||
"</div>");
|
||||
|
||||
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,
|
||||
"<form id=\"formid\" method=\"post\" action=\"about:blank\">"
|
||||
"<input type=\"text\" value=\"test\" name=\"i\"/>"
|
||||
"<input type=\"submit\" id=\"submitid\" />"
|
||||
"</form>");
|
||||
|
||||
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();
|
||||
|
|
Loading…
Reference in New Issue