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