Jacek Caban : mshtml: Added HTMLElementEvents2 support.

Alexandre Julliard julliard at winehq.org
Fri Mar 15 11:51:34 CDT 2013


Module: wine
Branch: master
Commit: d3e8d44e9c0535b8ff520917163cec9b5eae823f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d3e8d44e9c0535b8ff520917163cec9b5eae823f

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Mar 15 15:02:15 2013 +0100

mshtml: Added HTMLElementEvents2 support.

---

 dlls/mshtml/htmlelem.c       |    2 ++
 dlls/mshtml/htmlevent.c      |   13 +++++++++++--
 dlls/mshtml/mshtml_private.h |    5 ++++-
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index 02c1538..db4b8e7 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 19446ad..9ea1708 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 a2a9436..d0bb68e 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 {




More information about the wine-cvs mailing list