From d5b0c1d77c7d3e329e2da7ba013bd0f505a752ca Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Fri, 20 Oct 2017 15:08:59 +0200 Subject: [PATCH] mshtml: Implement IDOMEvent::preventDefault and use it where appropriate. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- 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 00b9524b084..0e1946bd544 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 2230608d978..1528f913320 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 228aa047926..cc1da62c107 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); -- 2.11.4.GIT