Jacek Caban : mshtml: Added IDOMEvent::addEventListener implementation.

Alexandre Julliard julliard at winehq.org
Wed Oct 25 13:58:43 CDT 2017


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Oct 25 18:13:35 2017 +0200

mshtml: Added IDOMEvent::addEventListener implementation.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/htmlevent.c | 46 +++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 43 insertions(+), 3 deletions(-)

diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 88282c0..3334324 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -36,6 +36,8 @@
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
 typedef enum {
+    LISTENER_TYPE_CAPTURE,
+    LISTENER_TYPE_BUBBLE,
     LISTENER_TYPE_ONEVENT,
     LISTENER_TYPE_ATTACHED
 } listener_type_t;
@@ -1344,6 +1346,14 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event)
                 if(use_quirks || event->phase == DEP_CAPTURING_PHASE)
                     continue;
                 break;
+            case LISTENER_TYPE_CAPTURE:
+                if(event->phase == DEP_BUBBLING_PHASE || event->in_fire_event)
+                    continue;
+                break;
+            case LISTENER_TYPE_BUBBLE:
+                if(event->in_fire_event)
+                    continue;
+                /* fallthrough */
             case LISTENER_TYPE_ATTACHED:
                 if(event->phase == DEP_CAPTURING_PHASE)
                     continue;
@@ -2074,11 +2084,41 @@ static HRESULT WINAPI EventTarget_Invoke(IEventTarget *iface, DISPID dispIdMembe
 }
 
 static HRESULT WINAPI EventTarget_addEventListener(IEventTarget *iface, BSTR type,
-                                                   IDispatch *listener, VARIANT_BOOL capture)
+                                                   IDispatch *function, VARIANT_BOOL capture)
 {
     EventTarget *This = impl_from_IEventTarget(iface);
-    FIXME("(%p)->(%s %p %x)\n", This, debugstr_w(type), listener, capture);
-    return E_NOTIMPL;
+    listener_type_t listener_type = capture ? LISTENER_TYPE_CAPTURE : LISTENER_TYPE_BUBBLE;
+    listener_container_t *container;
+    event_listener_t *listener;
+    eventid_t eid;
+
+    TRACE("(%p)->(%s %p %x)\n", This, debugstr_w(type), function, capture);
+
+    eid = str_to_eid(type);
+    if(eid == EVENTID_LAST) {
+        FIXME("Unsupported on event %s\n", debugstr_w(type));
+        return E_NOTIMPL;
+    }
+
+
+    container = get_listener_container(This, eid, TRUE);
+    if(!container)
+        return E_OUTOFMEMORY;
+
+    /* check for duplicates */
+    LIST_FOR_EACH_ENTRY(listener, &container->listeners, event_listener_t, entry) {
+        if(listener->type == listener_type && listener->function == function)
+            return S_OK;
+    }
+
+    listener = heap_alloc(sizeof(*listener));
+    if(!listener)
+        return E_OUTOFMEMORY;
+
+    listener->type = listener_type;
+    IDispatch_AddRef(listener->function = function);
+    list_add_tail(&container->listeners, &listener->entry);
+    return S_OK;
 }
 
 static HRESULT WINAPI EventTarget_removeEventListener(IEventTarget *iface, BSTR type,




More information about the wine-cvs mailing list