Jacek Caban : mshtml: Added IHTMLElement3::fireEvent implementation.

Alexandre Julliard julliard at winehq.org
Tue Oct 13 10:52:53 CDT 2009


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Oct 13 00:42:02 2009 +0200

mshtml: Added IHTMLElement3::fireEvent implementation.

---

 dlls/mshtml/htmlelem3.c |    8 ++++++--
 dlls/mshtml/htmlevent.c |   24 ++++++++++++++++++++++++
 dlls/mshtml/htmlevent.h |    1 +
 3 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/dlls/mshtml/htmlelem3.c b/dlls/mshtml/htmlelem3.c
index 22c93a9..30c8546 100644
--- a/dlls/mshtml/htmlelem3.c
+++ b/dlls/mshtml/htmlelem3.c
@@ -29,6 +29,7 @@
 #include "wine/unicode.h"
 
 #include "mshtml_private.h"
+#include "htmlevent.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
@@ -292,8 +293,11 @@ static HRESULT WINAPI HTMLElement3_fireEvent(IHTMLElement3 *iface, BSTR bstrEven
         VARIANT *pvarEventObject, VARIANT_BOOL *pfCancelled)
 {
     HTMLElement *This = HTMLELEM3_THIS(iface);
-    FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(bstrEventName), pvarEventObject, pfCancelled);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(bstrEventName), debugstr_variant(pvarEventObject),
+          pfCancelled);
+
+    return dispatch_event(&This->node, bstrEventName, pvarEventObject, pfCancelled);
 }
 
 static HRESULT WINAPI HTMLElement3_put_onresizestart(IHTMLElement3 *iface, VARIANT v)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 73e0540..b006478 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -853,6 +853,30 @@ void fire_event(HTMLDocumentNode *doc, eventid_t eid, nsIDOMNode *target, nsIDOM
     doc->basedoc.window->event = prev_event;
 }
 
+HRESULT dispatch_event(HTMLDOMNode *node, const WCHAR *event_name, VARIANT *event_obj, VARIANT_BOOL *cancelled)
+{
+    eventid_t eid;
+
+    eid = attr_to_eid(event_name);
+    if(eid == EVENTID_LAST) {
+        WARN("unknown event %s\n", debugstr_w(event_name));
+        return E_INVALIDARG;
+    }
+
+    if(event_obj && V_VT(event_obj) != VT_EMPTY && V_VT(event_obj) != VT_ERROR)
+        FIXME("event_obj not implemented\n");
+
+    if(!(event_info[eid].flags & EVENT_DEFAULTLISTENER)) {
+        FIXME("not EVENT_DEFAULTEVENTHANDLER\n");
+        return E_NOTIMPL;
+    }
+
+    fire_event(node->doc, eid, node->nsnode, NULL);
+
+    *cancelled = VARIANT_TRUE; /* FIXME */
+    return S_OK;
+}
+
 static inline event_target_t *get_event_target(event_target_t **event_target_ptr)
 {
     if(!*event_target_ptr)
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h
index 4446aa9..6c716a8 100644
--- a/dlls/mshtml/htmlevent.h
+++ b/dlls/mshtml/htmlevent.h
@@ -45,6 +45,7 @@ void fire_event(HTMLDocumentNode*,eventid_t,nsIDOMNode*,nsIDOMEvent*);
 HRESULT set_event_handler(event_target_t**,HTMLDocument*,eventid_t,VARIANT*);
 HRESULT get_event_handler(event_target_t**,eventid_t,VARIANT*);
 HRESULT attach_event(event_target_t**,HTMLDocument*,BSTR,IDispatch*,VARIANT_BOOL*);
+HRESULT dispatch_event(HTMLDOMNode*,const WCHAR*,VARIANT*,VARIANT_BOOL*);
 
 static inline event_target_t **get_node_event_target(HTMLDOMNode *node)
 {




More information about the wine-cvs mailing list