Jacek Caban : mshtml: Added new get_handler_vector helper for creating handle_vector_t.
Alexandre Julliard
julliard at winehq.org
Tue Feb 14 16:24:51 CST 2017
Module: wine
Branch: master
Commit: db67232ce25b0c197afb8e2506b9e6335bd0d536
URL: http://source.winehq.org/git/wine.git/?a=commit;h=db67232ce25b0c197afb8e2506b9e6335bd0d536
Author: Jacek Caban <jacek at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
More information about the wine-cvs
mailing list