mirror of
https://github.com/reactos/wine.git
synced 2024-11-29 06:30:37 +00:00
mshtml: Added support for pure IDispatch event handlers.
This commit is contained in:
parent
8571bf6f0e
commit
089d54f1f4
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user