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;
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);
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);
return hres;
}

View File

@ -63,6 +63,7 @@ DEFINE_EXPECT(div_onclick);
DEFINE_EXPECT(div_onclick_attached);
DEFINE_EXPECT(timeout);
DEFINE_EXPECT(doccp_onclick);
DEFINE_EXPECT(div_onclick_disp);
DEFINE_EXPECT(iframe_onreadystatechange_loading);
DEFINE_EXPECT(iframe_onreadystatechange_interactive);
DEFINE_EXPECT(iframe_onreadystatechange_complete);
@ -690,6 +691,23 @@ static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid,
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)
{
return 2;
@ -1015,6 +1033,32 @@ static IDispatchExVtbl 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)
{
MSG msg;
@ -1163,8 +1207,10 @@ static void test_onclick(IHTMLDocument2 *doc)
CHECK_CALLED(document_onclick);
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_disp);
SET_EXPECT(div_onclick_attached);
SET_EXPECT(body_onclick);
SET_EXPECT(document_onclick);
@ -1174,6 +1220,7 @@ static void test_onclick(IHTMLDocument2 *doc)
ok(hres == S_OK, "click failed: %08x\n", hres);
CHECK_CALLED(div_onclick);
CHECK_CALLED(div_onclick_disp);
CHECK_CALLED(div_onclick_attached);
CHECK_CALLED(body_onclick);
CHECK_CALLED(document_onclick);