Module: wine Branch: master Commit: 49abeb63cb88ea2efa6ad599047745bd8794f03c URL: http://source.winehq.org/git/wine.git/?a=commit;h=49abeb63cb88ea2efa6ad59904...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Dec 1 17:02:59 2017 +0100
mshtml: Added IDOMEvent::get_currentTarget implementation.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/mshtml/htmlevent.c | 32 +++++++++++++++++++++++--------- dlls/mshtml/htmlevent.h | 1 + 2 files changed, 24 insertions(+), 9 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 85f8fe7..0d45b0b 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -996,8 +996,14 @@ static HRESULT WINAPI DOMEvent_get_cancelable(IDOMEvent *iface, VARIANT_BOOL *p) static HRESULT WINAPI DOMEvent_get_currentTarget(IDOMEvent *iface, IEventTarget **p) { DOMEvent *This = impl_from_IDOMEvent(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + if(This->current_target) + IEventTarget_AddRef(*p = &This->current_target->IEventTarget_iface); + else + *p = NULL; + return S_OK; }
static HRESULT WINAPI DOMEvent_get_defaultPrevented(IDOMEvent *iface, VARIANT_BOOL *p) @@ -1326,7 +1332,6 @@ static BOOL is_cp_event(cp_static_data_t *data, DISPID dispid)
static void call_event_handlers(EventTarget *event_target, DOMEvent *event) { - const eventid_t eid = event->event_id; const listener_container_t *container = get_listener_container(event_target, event->type, FALSE); const BOOL use_quirks = use_event_quirks(event_target); event_listener_t *listener, listeners_buf[8], *listeners = listeners_buf; @@ -1336,6 +1341,9 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event) VARIANT v; HRESULT hres;
+ assert(!event->current_target); + event->current_target = event_target; + if(use_quirks && container && !list_empty(&container->listeners) && event->phase != DEP_CAPTURING_PHASE) { listener = LIST_ENTRY(list_tail(&container->listeners), event_listener_t, entry); @@ -1477,10 +1485,9 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event) IDispatch_Release(listener->function); if(listeners != listeners_buf) heap_free(listeners); - if(event->phase == DEP_CAPTURING_PHASE) - return;
- if(event_info[eid].dispid && (vtbl = dispex_get_vtbl(&event_target->dispex)) + if(event->phase != DEP_CAPTURING_PHASE && event->event_id != EVENTID_LAST + && event_info[event->event_id].dispid && (vtbl = dispex_get_vtbl(&event_target->dispex)) && vtbl->get_cp_container) cp_container = vtbl->get_cp_container(&event_target->dispex); if(cp_container) { @@ -1490,7 +1497,7 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event)
for(j=0; cp_container->cp_entries[j].riid; j++) { cp = cp_container->cps + j; - if(!cp->sinks_size || !is_cp_event(cp->data, event_info[eid].dispid)) + if(!cp->sinks_size || !is_cp_event(cp->data, event_info[event->event_id].dispid)) continue;
for(i=0; i < cp->sinks_size; i++) { @@ -1500,7 +1507,7 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event) V_VT(&v) = VT_EMPTY;
TRACE("cp %s [%u] >>>\n", debugstr_w(event->type), i); - hres = call_cp_func(cp->sinks[i].disp, event_info[eid].dispid, + hres = call_cp_func(cp->sinks[i].disp, event_info[event->event_id].dispid, cp->data->pass_event_arg ? event->event_obj : NULL, &v); if(hres == S_OK) { TRACE("cp %s [%u] <<<\n", debugstr_w(event->type), i); @@ -1522,6 +1529,8 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event) } IConnectionPointContainer_Release(&cp_container->IConnectionPointContainer_iface); } + + event->current_target = NULL; }
void dispatch_event(EventTarget *event_target, DOMEvent *event) @@ -1534,12 +1543,17 @@ void dispatch_event(EventTarget *event_target, DOMEvent *event) EventTarget *iter; HRESULT hres;
+ TRACE("(%p) %s\n", event_target, debugstr_w(event->type)); + if(event->event_id == EVENTID_LAST) { FIXME("Unsupported on unknown events\n"); return; }
- TRACE("(%p) %s\n", event_target, debugstr_w(event->type)); + if(event->current_target) { + FIXME("event is being dispatched.\n"); + return; + }
iter = event_target; IDispatchEx_AddRef(&event_target->dispex.IDispatchEx_iface); diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index 38499d3..f99c893 100644 --- a/dlls/mshtml/htmlevent.h +++ b/dlls/mshtml/htmlevent.h @@ -66,6 +66,7 @@ typedef struct { eventid_t event_id; WCHAR *type; EventTarget *target; + EventTarget *current_target; BOOL bubbles; BOOL cancelable; BOOL prevent_default;