mshtml: Added support for pure IDispatch event handlers.

This commit is contained in:
Jacek Caban 2010-01-24 21:37:52 +01:00 committed by Alexandre Julliard
parent 8571bf6f0e
commit 089d54f1f4
2 changed files with 56 additions and 8 deletions

View File

@ -400,18 +400,19 @@ HRESULT call_disp_func(IDispatch *disp, DISPPARAMS *dp)
VARIANT res; VARIANT res;
HRESULT hres; HRESULT hres;
hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
if(FAILED(hres)) {
FIXME("Could not get IDispatchEx interface: %08x\n", hres);
return hres;
}
VariantInit(&res); VariantInit(&res);
memset(&ei, 0, sizeof(ei)); memset(&ei, 0, sizeof(ei));
hres = IDispatchEx_InvokeEx(dispex, 0, GetUserDefaultLCID(), DISPATCH_METHOD, dp, &res, &ei, NULL); hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
if(SUCCEEDED(hres)) {
hres = IDispatchEx_InvokeEx(dispex, 0, GetUserDefaultLCID(), DISPATCH_METHOD, dp, &res, &ei, NULL);
IDispatchEx_Release(dispex);
}else {
TRACE("Could not get IDispatchEx interface: %08x\n", hres);
hres = IDispatch_Invoke(disp, 0, &IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD,
dp, &res, &ei, NULL);
}
IDispatchEx_Release(dispex);
VariantClear(&res); VariantClear(&res);
return hres; return hres;
} }

View File

@ -63,6 +63,7 @@ DEFINE_EXPECT(div_onclick);
DEFINE_EXPECT(div_onclick_attached); DEFINE_EXPECT(div_onclick_attached);
DEFINE_EXPECT(timeout); DEFINE_EXPECT(timeout);
DEFINE_EXPECT(doccp_onclick); DEFINE_EXPECT(doccp_onclick);
DEFINE_EXPECT(div_onclick_disp);
DEFINE_EXPECT(iframe_onreadystatechange_loading); DEFINE_EXPECT(iframe_onreadystatechange_loading);
DEFINE_EXPECT(iframe_onreadystatechange_interactive); DEFINE_EXPECT(iframe_onreadystatechange_interactive);
DEFINE_EXPECT(iframe_onreadystatechange_complete); DEFINE_EXPECT(iframe_onreadystatechange_complete);
@ -690,6 +691,23 @@ static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid,
return S_OK; return S_OK;
} }
static HRESULT WINAPI Dispatch_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
{
*ppv = NULL;
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", debugstr_guid(riid));
return E_NOINTERFACE;
}
return S_OK;
}
static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface) static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
{ {
return 2; return 2;
@ -1015,6 +1033,32 @@ static IDispatchExVtbl timeoutFuncVtbl = {
static IDispatchEx timeoutFunc = { &timeoutFuncVtbl }; static IDispatchEx timeoutFunc = { &timeoutFuncVtbl };
static HRESULT WINAPI div_onclick_disp_Invoke(IDispatchEx *iface, DISPID id,
REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
VARIANT *pvarRes, EXCEPINFO *pei, UINT *puArgErr)
{
CHECK_EXPECT(div_onclick_disp);
test_attached_event_args(id, wFlags, pdp, pvarRes, pei);
ok(IsEqualGUID(&IID_NULL, riid), "riid = %s\n", debugstr_guid(riid));
ok(!puArgErr, "puArgErr = %p\n", puArgErr);
return S_OK;
}
static IDispatchExVtbl div_onclick_dispVtbl = {
Dispatch_QueryInterface,
DispatchEx_AddRef,
DispatchEx_Release,
DispatchEx_GetTypeInfoCount,
DispatchEx_GetTypeInfo,
DispatchEx_GetIDsOfNames,
div_onclick_disp_Invoke,
};
static IDispatchEx div_onclick_disp = { &div_onclick_dispVtbl };
static void pump_msgs(BOOL *b) static void pump_msgs(BOOL *b)
{ {
MSG msg; MSG msg;
@ -1163,8 +1207,10 @@ static void test_onclick(IHTMLDocument2 *doc)
CHECK_CALLED(document_onclick); CHECK_CALLED(document_onclick);
cp_cookie = register_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents, (IUnknown*)&doccp_obj); cp_cookie = register_cp((IUnknown*)doc, &DIID_HTMLDocumentEvents, (IUnknown*)&doccp_obj);
elem_attach_event((IUnknown*)div, "onclick", (IDispatch*)&div_onclick_disp);
SET_EXPECT(div_onclick); SET_EXPECT(div_onclick);
SET_EXPECT(div_onclick_disp);
SET_EXPECT(div_onclick_attached); SET_EXPECT(div_onclick_attached);
SET_EXPECT(body_onclick); SET_EXPECT(body_onclick);
SET_EXPECT(document_onclick); SET_EXPECT(document_onclick);
@ -1174,6 +1220,7 @@ static void test_onclick(IHTMLDocument2 *doc)
ok(hres == S_OK, "click failed: %08x\n", hres); ok(hres == S_OK, "click failed: %08x\n", hres);
CHECK_CALLED(div_onclick); CHECK_CALLED(div_onclick);
CHECK_CALLED(div_onclick_disp);
CHECK_CALLED(div_onclick_attached); CHECK_CALLED(div_onclick_attached);
CHECK_CALLED(body_onclick); CHECK_CALLED(body_onclick);
CHECK_CALLED(document_onclick); CHECK_CALLED(document_onclick);