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

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


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

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

mshtml: Implement IDOMEvent::preventDefault 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    | 33 +++++++++++++++------------------
 dlls/mshtml/htmlevent.h    |  1 +
 dlls/mshtml/tests/events.c |  3 +++
 3 files changed, 19 insertions(+), 18 deletions(-)

diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 00b9524..0e1946b 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 prevent_default;
     BOOL cancel_bubble;
 };
 
@@ -435,8 +434,8 @@ static HRESULT WINAPI HTMLEventObj_put_returnValue(IHTMLEventObj *iface, VARIANT
     }
 
     This->return_value = v;
-    if(!V_BOOL(&v))
-        This->prevent_default = TRUE;
+    if(!V_BOOL(&v) && This->event)
+        IDOMEvent_preventDefault(&This->event->IDOMEvent_iface);
     return S_OK;
 }
 
@@ -974,8 +973,12 @@ static HRESULT WINAPI DOMEvent_initEvent(IDOMEvent *iface, BSTR type, VARIANT_BO
 static HRESULT WINAPI DOMEvent_preventDefault(IDOMEvent *iface)
 {
     DOMEvent *This = impl_from_IDOMEvent(iface);
-    FIXME("(%p)\n", This);
-    return E_NOTIMPL;
+
+    TRACE("(%p)\n", This);
+
+    This->prevent_default = TRUE;
+    nsIDOMEvent_PreventDefault(This->nsevent);
+    return S_OK;
 }
 
 static HRESULT WINAPI DOMEvent_stopPropagation(IDOMEvent *iface)
@@ -1274,7 +1277,7 @@ void call_event_handlers(HTMLEventObj *event_obj, EventTarget *event_target, DOM
             if(cancelable) {
                 if(V_VT(&v) == VT_BOOL) {
                     if(!V_BOOL(&v))
-                        event_obj->prevent_default = TRUE;
+                        IDOMEvent_preventDefault(&event->IDOMEvent_iface);
                 }else if(V_VT(&v) != VT_EMPTY) {
                     FIXME("unhandled result %s\n", debugstr_variant(&v));
                 }
@@ -1306,7 +1309,7 @@ void call_event_handlers(HTMLEventObj *event_obj, EventTarget *event_target, DOM
                     if(cancelable) {
                         if(V_VT(&v) == VT_BOOL) {
                             if(!V_BOOL(&v))
-                                event_obj->prevent_default = TRUE;
+                                IDOMEvent_preventDefault(&event->IDOMEvent_iface);
                         }else if(V_VT(&v) != VT_EMPTY) {
                             FIXME("unhandled result %s\n", debugstr_variant(&v));
                         }
@@ -1346,7 +1349,7 @@ void call_event_handlers(HTMLEventObj *event_obj, EventTarget *event_target, DOM
                         if(cancelable) {
                             if(V_VT(&v) == VT_BOOL) {
                                 if(!V_BOOL(&v))
-                                    event_obj->prevent_default = TRUE;
+                                    IDOMEvent_preventDefault(&event->IDOMEvent_iface);
                             }else if(V_VT(&v) != VT_EMPTY) {
                                 FIXME("unhandled result %s\n", debugstr_variant(&v));
                             }
@@ -1368,7 +1371,6 @@ static void fire_event_obj(EventTarget *event_target, DOMEvent *event, HTMLEvent
     unsigned chain_cnt, chain_buf_size, i;
     const event_target_vtbl_t *vtbl, *target_vtbl;
     IHTMLEventObj *prev_event = NULL;
-    BOOL prevent_default = FALSE;
     EventTarget *iter;
     DWORD event_flags;
     HRESULT hres;
@@ -1430,11 +1432,9 @@ static void fire_event_obj(EventTarget *event_target, DOMEvent *event, HTMLEvent
             IHTMLEventObj_Release(prev_event);
     }
 
-    if(event_obj && event_obj->prevent_default)
-        prevent_default = TRUE;
-
     if(event_flags & EVENT_HASDEFAULTHANDLERS) {
-        for(i = 0; !prevent_default && i < chain_cnt; i++) {
+        for(i = 0; !event->prevent_default && i < chain_cnt; i++) {
+            BOOL prevent_default = FALSE;
             vtbl = dispex_get_vtbl(&target_chain[i]->dispex);
             if(!vtbl || !vtbl->handle_event_default)
                 continue;
@@ -1442,6 +1442,8 @@ static void fire_event_obj(EventTarget *event_target, DOMEvent *event, HTMLEvent
                     event->nsevent, &prevent_default);
             if(FAILED(hres) || (event_obj && event_obj->cancel_bubble))
                 break;
+            if(prevent_default)
+                IDOMEvent_preventDefault(&event->IDOMEvent_iface);
         }
     }
 
@@ -1449,11 +1451,6 @@ static void fire_event_obj(EventTarget *event_target, DOMEvent *event, HTMLEvent
         IDispatchEx_Release(&target_chain[i]->dispex.IDispatchEx_iface);
     if(target_chain != target_chain_buf)
         heap_free(target_chain);
-
-    if(prevent_default) {
-        TRACE("calling PreventDefault\n");
-        nsIDOMEvent_PreventDefault(event->nsevent);
-    }
 }
 
 void fire_event(HTMLDocumentNode *doc, eventid_t eid, BOOL set_event, EventTarget *target, nsIDOMEvent *nsevent)
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h
index 2230608..1528f91 100644
--- a/dlls/mshtml/htmlevent.h
+++ b/dlls/mshtml/htmlevent.h
@@ -64,6 +64,7 @@ typedef struct {
     nsIDOMEvent *nsevent;
     eventid_t event_id;
     EventTarget *target;
+    BOOL prevent_default;
 } DOMEvent;
 
 eventid_t str_to_eid(LPCWSTR) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/tests/events.c b/dlls/mshtml/tests/events.c
index 228aa04..cc1da62 100644
--- a/dlls/mshtml/tests/events.c
+++ b/dlls/mshtml/tests/events.c
@@ -2547,6 +2547,9 @@ static void test_create_event(IHTMLDocument2 *doc)
     SysFreeString(str);
     ok(hres == S_OK, "createEvent failed: %08x\n", hres);
 
+    hres = IDOMEvent_preventDefault(event);
+    ok(hres == S_OK, "preventDefault failed: %08x\n", hres);
+
     IDOMEvent_Release(event);
 
     IDocumentEvent_Release(doc_event);




More information about the wine-cvs mailing list