Jacek Caban : mshtml: Implement IDOMEvent:: stopPropagation and use it where appropriate.

Alexandre Julliard julliard at winehq.org
Fri Oct 20 15:09:36 CDT 2017


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Oct 20 15:09:05 2017 +0200

mshtml: Implement IDOMEvent::stopPropagation and use it where appropriate.

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

---

 dlls/mshtml/htmlevent.c    | 19 ++++++++++++-------
 dlls/mshtml/htmlevent.h    |  1 +
 dlls/mshtml/tests/events.c |  3 +++
 3 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 0e1946b..02e4363 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -232,7 +232,6 @@ struct HTMLEventObj {
     const event_info_t *type;
     DOMEvent *event;
     VARIANT return_value;
-    BOOL cancel_bubble;
 };
 
 static inline HTMLEventObj *impl_from_IHTMLEventObj(IHTMLEventObj *iface)
@@ -455,7 +454,8 @@ static HRESULT WINAPI HTMLEventObj_put_cancelBubble(IHTMLEventObj *iface, VARIAN
 
     TRACE("(%p)->(%x)\n", This, v);
 
-    This->cancel_bubble = !!v;
+    if(This->event)
+        IDOMEvent_stopPropagation(&This->event->IDOMEvent_iface);
     return S_OK;
 }
 
@@ -465,7 +465,7 @@ static HRESULT WINAPI HTMLEventObj_get_cancelBubble(IHTMLEventObj *iface, VARIAN
 
     TRACE("(%p)->(%p)\n", This, p);
 
-    *p = This->cancel_bubble ? VARIANT_TRUE : VARIANT_FALSE;
+    *p = This->event && This->event->stop_propagation ? VARIANT_TRUE : VARIANT_FALSE;
     return S_OK;
 }
 
@@ -984,8 +984,13 @@ static HRESULT WINAPI DOMEvent_preventDefault(IDOMEvent *iface)
 static HRESULT WINAPI DOMEvent_stopPropagation(IDOMEvent *iface)
 {
     DOMEvent *This = impl_from_IDOMEvent(iface);
-    FIXME("(%p)\n", This);
-    return E_NOTIMPL;
+
+    TRACE("(%p)\n", This);
+
+    This->stop_propagation = TRUE;
+    nsIDOMEvent_StopPropagation(This->nsevent);
+    IDOMEvent_preventDefault(&This->IDOMEvent_iface);
+    return S_OK;
 }
 
 static HRESULT WINAPI DOMEvent_stopImmediatePropagation(IDOMEvent *iface)
@@ -1422,7 +1427,7 @@ static void fire_event_obj(EventTarget *event_target, DOMEvent *event, HTMLEvent
 
     for(i = 0; i < chain_cnt; i++) {
         call_event_handlers(event_obj, target_chain[i], event);
-        if(!(event_flags & EVENT_BUBBLES) || (event_obj && event_obj->cancel_bubble))
+        if(!(event_flags & EVENT_BUBBLES) || event->stop_propagation)
             break;
     }
 
@@ -1440,7 +1445,7 @@ static void fire_event_obj(EventTarget *event_target, DOMEvent *event, HTMLEvent
                 continue;
             hres = vtbl->handle_event_default(&event_target->dispex, event->event_id,
                     event->nsevent, &prevent_default);
-            if(FAILED(hres) || (event_obj && event_obj->cancel_bubble))
+            if(FAILED(hres) || event->stop_propagation)
                 break;
             if(prevent_default)
                 IDOMEvent_preventDefault(&event->IDOMEvent_iface);
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h
index 1528f91..76b971f 100644
--- a/dlls/mshtml/htmlevent.h
+++ b/dlls/mshtml/htmlevent.h
@@ -65,6 +65,7 @@ typedef struct {
     eventid_t event_id;
     EventTarget *target;
     BOOL prevent_default;
+    BOOL stop_propagation;
 } DOMEvent;
 
 eventid_t str_to_eid(LPCWSTR) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/tests/events.c b/dlls/mshtml/tests/events.c
index cc1da62..84a35f3 100644
--- a/dlls/mshtml/tests/events.c
+++ b/dlls/mshtml/tests/events.c
@@ -2550,6 +2550,9 @@ static void test_create_event(IHTMLDocument2 *doc)
     hres = IDOMEvent_preventDefault(event);
     ok(hres == S_OK, "preventDefault failed: %08x\n", hres);
 
+    hres = IDOMEvent_stopPropagation(event);
+    ok(hres == S_OK, "stopPropagation failed: %08x\n", hres);
+
     IDOMEvent_Release(event);
 
     IDocumentEvent_Release(doc_event);




More information about the wine-cvs mailing list