Module: wine Branch: master Commit: d5b0c1d77c7d3e329e2da7ba013bd0f505a752ca URL: http://source.winehq.org/git/wine.git/?a=commit;h=d5b0c1d77c7d3e329e2da7ba01...
Author: Jacek Caban jacek@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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);