diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 02c15386bce..db4b8e70d88 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -1679,6 +1679,8 @@ HRESULT HTMLElement_handle_event(HTMLDOMNode *iface, DWORD eid, nsIDOMEvent *eve return S_OK; } +cp_static_data_t HTMLElementEvents2_data = { HTMLElementEvents2_tid, NULL /* FIXME */, TRUE }; + const cpc_entry_t HTMLElement_cpc[] = { HTMLELEMENT_CPC, {NULL} diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 19446ad6f66..9ea17082062 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -883,12 +883,20 @@ static HRESULT call_disp_func(IDispatch *disp, DISPPARAMS *dp, VARIANT *retv) return hres; } -static HRESULT call_cp_func(IDispatch *disp, DISPID dispid, VARIANT *retv) +static HRESULT call_cp_func(IDispatch *disp, DISPID dispid, HTMLEventObj *event_obj, VARIANT *retv) { DISPPARAMS dp = {NULL,NULL,0,0}; + VARIANT event_arg; ULONG argerr; EXCEPINFO ei; + if(event_obj) { + V_VT(&event_arg) = VT_DISPATCH; + V_DISPATCH(&event_arg) = (IDispatch*)&event_obj->IHTMLEventObj_iface; + dp.rgvarg = &event_arg; + dp.cArgs = 1; + } + memset(&ei, 0, sizeof(ei)); return IDispatch_Invoke(disp, dispid, &IID_NULL, 0, DISPATCH_METHOD, &dp, retv, &ei, &argerr); } @@ -1019,7 +1027,8 @@ static void call_event_handlers(HTMLDocumentNode *doc, HTMLEventObj *event_obj, V_VT(&v) = VT_EMPTY; TRACE("cp %s [%u] >>>\n", debugstr_w(event_info[eid].name), i); - hres = call_cp_func(cp->sinks[i].disp, event_info[eid].dispid, &v); + hres = call_cp_func(cp->sinks[i].disp, event_info[eid].dispid, + cp->data->pass_event_arg ? event_obj : NULL, &v); if(hres == S_OK) { TRACE("cp %s [%u] <<<\n", debugstr_w(event_info[eid].name), i); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index a2a9436ff12..d0bb68e4760 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -114,6 +114,7 @@ typedef struct event_target_t event_target_t; XDIID(DispHTMLUnknownElement) \ XDIID(DispHTMLWindow2) \ XDIID(HTMLDocumentEvents) \ + XDIID(HTMLElementEvents2) \ XIID(IHTMLAnchorElement) \ XIID(IHTMLAttributeCollection) \ XIID(IHTMLAttributeCollection2) \ @@ -430,6 +431,7 @@ typedef enum { typedef struct _cp_static_data_t { tid_t tid; void (*on_advise)(IUnknown*,struct _cp_static_data_t*); + BOOL pass_event_arg; DWORD id_cnt; DISPID *ids; } cp_static_data_t; @@ -666,7 +668,8 @@ typedef struct { IHTMLElement3_tid, \ IHTMLElement4_tid -#define HTMLELEMENT_CPC {NULL} +extern cp_static_data_t HTMLElementEvents2_data; +#define HTMLELEMENT_CPC {&DIID_HTMLElementEvents2, &HTMLElementEvents2_data} extern const cpc_entry_t HTMLElement_cpc[]; typedef struct {