mshtml: Don't reallocate handler_vector_t when handlers are added.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
c12b4b4846
commit
72ee409e7f
|
@ -38,7 +38,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
|
||||||
typedef struct {
|
typedef struct {
|
||||||
IDispatch *handler_prop;
|
IDispatch *handler_prop;
|
||||||
DWORD handler_cnt;
|
DWORD handler_cnt;
|
||||||
IDispatch *handlers[0];
|
IDispatch **handlers;
|
||||||
} handler_vector_t;
|
} handler_vector_t;
|
||||||
|
|
||||||
struct event_target_t {
|
struct event_target_t {
|
||||||
|
@ -1315,25 +1315,13 @@ HRESULT call_fire_event(HTMLDOMNode *node, eventid_t eid)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL alloc_handler_vector(event_target_t *event_target, eventid_t eid, int cnt)
|
static BOOL alloc_handler_vector(event_target_t *event_target, eventid_t eid)
|
||||||
{
|
{
|
||||||
handler_vector_t *new_vector, *handler_vector = event_target->event_table[eid];
|
if(event_target->event_table[eid])
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
if(handler_vector) {
|
event_target->event_table[eid] = heap_alloc_zero(sizeof(*event_target->event_table[eid]));
|
||||||
if(cnt <= handler_vector->handler_cnt)
|
return event_target->event_table[eid] != NULL;
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
new_vector = heap_realloc_zero(handler_vector, sizeof(handler_vector_t) + sizeof(IDispatch*)*cnt);
|
|
||||||
}else {
|
|
||||||
new_vector = heap_alloc_zero(sizeof(handler_vector_t) + sizeof(IDispatch*)*cnt);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!new_vector)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
new_vector->handler_cnt = cnt;
|
|
||||||
event_target->event_table[eid] = new_vector;
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT ensure_doc_nsevent_handler(HTMLDocumentNode *doc, eventid_t eid)
|
HRESULT ensure_doc_nsevent_handler(HTMLDocumentNode *doc, eventid_t eid)
|
||||||
|
@ -1433,7 +1421,7 @@ static HRESULT set_event_handler_disp(EventTarget *event_target, eventid_t eid,
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
if(!data->event_table[eid]) {
|
if(!data->event_table[eid]) {
|
||||||
if(!alloc_handler_vector(data, eid, 0))
|
if(!alloc_handler_vector(data, eid))
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
bind_event(event_target, eid);
|
bind_event(event_target, eid);
|
||||||
|
@ -1536,13 +1524,21 @@ HRESULT attach_event(EventTarget *event_target, BSTR name, IDispatch *disp, VARI
|
||||||
if(data->event_table[eid]) {
|
if(data->event_table[eid]) {
|
||||||
while(i < data->event_table[eid]->handler_cnt && data->event_table[eid]->handlers[i])
|
while(i < data->event_table[eid]->handler_cnt && data->event_table[eid]->handlers[i])
|
||||||
i++;
|
i++;
|
||||||
if(i == data->event_table[eid]->handler_cnt && !alloc_handler_vector(data, eid, i+1))
|
}else if(alloc_handler_vector(data, eid)) {
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
}else if(alloc_handler_vector(data, eid, i+1)) {
|
|
||||||
bind_event(event_target, eid);
|
bind_event(event_target, eid);
|
||||||
}else {
|
}else {
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
|
if(i == data->event_table[eid]->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));
|
||||||
|
else
|
||||||
|
data->event_table[eid]->handlers = heap_alloc_zero(sizeof(*data->event_table[eid]->handlers));
|
||||||
|
if(!data->event_table[eid]->handlers)
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
data->event_table[eid]->handler_cnt++;
|
||||||
|
}
|
||||||
|
|
||||||
IDispatch_AddRef(disp);
|
IDispatch_AddRef(disp);
|
||||||
data->event_table[eid]->handlers[i] = disp;
|
data->event_table[eid]->handlers[i] = disp;
|
||||||
|
|
Loading…
Reference in New Issue