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

Alexandre Julliard julliard at winehq.org
Fri Dec 1 14:08:19 CST 2017


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Dec  1 17:02:22 2017 +0100

mshtml: Added IDOMEvent::get_bubbles implementation.

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

---

 dlls/mshtml/htmlevent.c    | 14 ++++++++------
 dlls/mshtml/htmlevent.h    |  1 +
 dlls/mshtml/tests/events.c |  6 ++++++
 3 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 940fccc..ddce8b3 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -976,8 +976,11 @@ static HRESULT WINAPI DOMEvent_Invoke(IDOMEvent *iface, DISPID dispIdMember,
 static HRESULT WINAPI DOMEvent_get_bubbles(IDOMEvent *iface, VARIANT_BOOL *p)
 {
     DOMEvent *This = impl_from_IDOMEvent(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    *p = variant_bool(This->bubbles);
+    return S_OK;
 }
 
 static HRESULT WINAPI DOMEvent_get_cancelable(IDOMEvent *iface, VARIANT_BOOL *p)
@@ -1164,6 +1167,7 @@ static DOMEvent *alloc_event(nsIDOMEvent *nsevent, eventid_t event_id)
             IDOMEvent_Release(&event->IDOMEvent_iface);
             return NULL;
         }
+        event->bubbles = (event_info[event_id].flags & EVENT_BUBBLES) != 0;
     }
     nsIDOMEvent_AddRef(event->nsevent = nsevent);
     return event;
@@ -1523,7 +1527,6 @@ void dispatch_event(EventTarget *event_target, DOMEvent *event)
     HTMLEventObj *event_obj_ref = NULL;
     IHTMLEventObj *prev_event = NULL;
     EventTarget *iter;
-    DWORD event_flags;
     HRESULT hres;
 
     if(event->event_id == EVENTID_LAST) {
@@ -1533,7 +1536,6 @@ void dispatch_event(EventTarget *event_target, DOMEvent *event)
 
     TRACE("(%p) %s\n", event_target, debugstr_w(event->type));
 
-    event_flags = event_info[event->event_id].flags;
     iter = event_target;
     IDispatchEx_AddRef(&event_target->dispex.IDispatchEx_iface);
 
@@ -1587,7 +1589,7 @@ void dispatch_event(EventTarget *event_target, DOMEvent *event)
         call_event_handlers(target_chain[0], event);
     }
 
-    if(event_flags & EVENT_BUBBLES) {
+    if(event->bubbles) {
         event->phase = DEP_BUBBLING_PHASE;
         for(i = 1; !event->stop_propagation && i < chain_cnt; i++)
             call_event_handlers(target_chain[i], event);
@@ -1599,7 +1601,7 @@ void dispatch_event(EventTarget *event_target, DOMEvent *event)
             IHTMLEventObj_Release(prev_event);
     }
 
-    if(event_flags & EVENT_HASDEFAULTHANDLERS) {
+    if(event->event_id != EVENTID_LAST && (event_info[event->event_id].flags & EVENT_HASDEFAULTHANDLERS)) {
         for(i = 0; !event->prevent_default && i < chain_cnt; i++) {
             BOOL prevent_default = FALSE;
             vtbl = dispex_get_vtbl(&target_chain[i]->dispex);
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h
index 33eea21..4f106d2 100644
--- a/dlls/mshtml/htmlevent.h
+++ b/dlls/mshtml/htmlevent.h
@@ -66,6 +66,7 @@ typedef struct {
     eventid_t event_id;
     WCHAR *type;
     EventTarget *target;
+    BOOL bubbles;
     BOOL prevent_default;
     BOOL stop_propagation;
     DOM_EVENT_PHASE phase;
diff --git a/dlls/mshtml/tests/events.c b/dlls/mshtml/tests/events.c
index 7719dc1..864d7d4 100644
--- a/dlls/mshtml/tests/events.c
+++ b/dlls/mshtml/tests/events.c
@@ -2668,6 +2668,7 @@ static void test_create_event(IHTMLDocument2 *doc)
 {
     IDocumentEvent *doc_event;
     IDOMEvent *event;
+    VARIANT_BOOL b;
     USHORT phase;
     BSTR str;
     HRESULT hres;
@@ -2698,6 +2699,11 @@ static void test_create_event(IHTMLDocument2 *doc)
     ok(hres == S_OK, "get_type failed: %08x\n", hres);
     ok(!str, "type = %s\n", wine_dbgstr_w(str));
 
+    b = 0xdead;
+    hres = IDOMEvent_get_bubbles(event, &b);
+    ok(hres == S_OK, "get_bubbles failed: %08x\n", hres);
+    ok(!b, "bubbles = %x\n", b);
+
     IDOMEvent_Release(event);
 
     IDocumentEvent_Release(doc_event);




More information about the wine-cvs mailing list