Module: wine Branch: master Commit: db67232ce25b0c197afb8e2506b9e6335bd0d536 URL: http://source.winehq.org/git/wine.git/?a=commit;h=db67232ce25b0c197afb8e2506...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Feb 13 21:11:15 2017 +0100
mshtml: Added new get_handler_vector helper for creating handle_vector_t.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/mshtml/htmlevent.c | 88 ++++++++++++++++++++++--------------------------- 1 file changed, 39 insertions(+), 49 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 96885b0..44a5df0 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -911,6 +911,27 @@ static inline event_target_t *get_event_target_data(EventTarget *event_target, B return event_target->ptr = heap_alloc_zero(sizeof(event_target_t)); }
+static handler_vector_t *get_handler_vector(EventTarget *event_target, eventid_t eid, BOOL alloc) +{ + event_target_t *data; + + data = get_event_target_data(event_target, alloc); + if(!data) + return NULL; + + if(alloc && !data->event_table[eid]) { + data->event_table[eid] = heap_alloc_zero(sizeof(*data->event_table[eid])); + if(data->event_table[eid]) { + const dispex_static_data_vtbl_t *vtbl = dispex_get_vtbl(&event_target->dispex); + if(vtbl->bind_event) + vtbl->bind_event(&event_target->dispex, eid); + else + FIXME("Unsupported event binding on target %p\n", event_target); + } + } + return data->event_table[eid]; +} + static HRESULT call_disp_func(IDispatch *disp, DISPPARAMS *dp, VARIANT *retv) { IDispatchEx *dispex; @@ -1315,15 +1336,6 @@ HRESULT call_fire_event(HTMLDOMNode *node, eventid_t eid) return S_OK; }
-static BOOL alloc_handler_vector(event_target_t *event_target, eventid_t eid) -{ - if(event_target->event_table[eid]) - return TRUE; - - event_target->event_table[eid] = heap_alloc_zero(sizeof(*event_target->event_table[eid])); - return event_target->event_table[eid] != NULL; -} - HRESULT ensure_doc_nsevent_handler(HTMLDocumentNode *doc, eventid_t eid) { nsIDOMNode *nsnode = NULL; @@ -1378,16 +1390,6 @@ void detach_events(HTMLDocumentNode *doc) release_nsevents(doc); }
-/* Caller should ensure that it's called only once for given event in the target. */ -static void bind_event(EventTarget *event_target, eventid_t eid) -{ - const dispex_static_data_vtbl_t *vtbl = dispex_get_vtbl(&event_target->dispex); - if(vtbl->bind_event) - vtbl->bind_event(&event_target->dispex, eid); - else - FIXME("Unsupported event binding on target %p\n", event_target); -} - static void remove_event_handler(EventTarget *event_target, eventid_t eid) { event_target_t *data; @@ -1407,7 +1409,7 @@ static void remove_event_handler(EventTarget *event_target, eventid_t eid)
static HRESULT set_event_handler_disp(EventTarget *event_target, eventid_t eid, IDispatch *disp) { - event_target_t *data; + handler_vector_t *handler_vector;
if(event_info[eid].flags & EVENT_FIXME) FIXME("unimplemented event %s\n", debugstr_w(event_info[eid].name)); @@ -1416,20 +1418,14 @@ static HRESULT set_event_handler_disp(EventTarget *event_target, eventid_t eid, if(!disp) return S_OK;
- data = get_event_target_data(event_target, TRUE); - if(!data) + handler_vector = get_handler_vector(event_target, eid, TRUE); + if(!handler_vector) return E_OUTOFMEMORY;
- if(!data->event_table[eid]) { - if(!alloc_handler_vector(data, eid)) - return E_OUTOFMEMORY; + if(handler_vector->handler_prop) + IDispatch_Release(handler_vector->handler_prop);
- bind_event(event_target, eid); - }else if(data->event_table[eid]->handler_prop) { - IDispatch_Release(data->event_table[eid]->handler_prop); - } - - data->event_table[eid]->handler_prop = disp; + handler_vector->handler_prop = disp; IDispatch_AddRef(disp); return S_OK; } @@ -1503,7 +1499,7 @@ HRESULT get_event_handler(EventTarget *event_target, eventid_t eid, VARIANT *var
HRESULT attach_event(EventTarget *event_target, BSTR name, IDispatch *disp, VARIANT_BOOL *res) { - event_target_t *data; + handler_vector_t *handler_vector; eventid_t eid; DWORD i = 0;
@@ -1517,31 +1513,25 @@ HRESULT attach_event(EventTarget *event_target, BSTR name, IDispatch *disp, VARI if(event_info[eid].flags & EVENT_FIXME) FIXME("unimplemented event %s\n", debugstr_w(event_info[eid].name));
- data = get_event_target_data(event_target, TRUE); - if(!data) + handler_vector = get_handler_vector(event_target, eid, TRUE); + if(!handler_vector) return E_OUTOFMEMORY;
- if(data->event_table[eid]) { - while(i < data->event_table[eid]->handler_cnt && data->event_table[eid]->handlers[i]) - i++; - }else if(alloc_handler_vector(data, eid)) { - bind_event(event_target, eid); - }else { - return E_OUTOFMEMORY; - } - if(i == data->event_table[eid]->handler_cnt) { + while(i < handler_vector->handler_cnt && handler_vector->handlers[i]) + i++; + if(i == handler_vector->handler_cnt) { if(i) - data->event_table[eid]->handlers = heap_realloc_zero(data->event_table[eid]->handlers, - (i + 1) * sizeof(*data->event_table[eid]->handlers)); + handler_vector->handlers = heap_realloc_zero(handler_vector->handlers, + (i + 1) * sizeof(*handler_vector->handlers)); else - data->event_table[eid]->handlers = heap_alloc_zero(sizeof(*data->event_table[eid]->handlers)); - if(!data->event_table[eid]->handlers) + handler_vector->handlers = heap_alloc_zero(sizeof(*handler_vector->handlers)); + if(!handler_vector->handlers) return E_OUTOFMEMORY; - data->event_table[eid]->handler_cnt++; + handler_vector->handler_cnt++; }
IDispatch_AddRef(disp); - data->event_table[eid]->handlers[i] = disp; + handler_vector->handlers[i] = disp;
*res = VARIANT_TRUE; return S_OK;