mshtml: Use separated struct for event target vtbl.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2017-10-18 16:38:51 +02:00 committed by Alexandre Julliard
parent 9a5e0bdb3d
commit e5c0759c0c
8 changed files with 46 additions and 40 deletions

View File

@ -1767,7 +1767,7 @@ void dispex_unlink(DispatchEx *This)
}
}
const dispex_static_data_vtbl_t *dispex_get_vtbl(DispatchEx *dispex)
const void *dispex_get_vtbl(DispatchEx *dispex)
{
return dispex->info->desc->vtbl;
}

View File

@ -5024,18 +5024,20 @@ static compat_mode_t HTMLDocumentNode_get_compat_mode(DispatchEx *dispex)
return This->document_mode;
}
static void HTMLDocumentNode_bind_event(DispatchEx *dispex, int eid)
static void HTMLDocumentNode_bind_event(DispatchEx *dispex, eventid_t eid)
{
HTMLDocumentNode *This = impl_from_DispatchEx(dispex);
ensure_doc_nsevent_handler(This, eid);
}
static const dispex_static_data_vtbl_t HTMLDocumentNode_dispex_vtbl = {
NULL,
NULL,
HTMLDocumentNode_invoke,
HTMLDocumentNode_get_compat_mode,
NULL,
static const event_target_vtbl_t HTMLDocumentNode_event_target_vtbl = {
{
NULL,
NULL,
HTMLDocumentNode_invoke,
HTMLDocumentNode_get_compat_mode,
NULL
},
HTMLDocumentNode_bind_event
};
@ -5076,7 +5078,7 @@ static void HTMLDocumentNode_init_dispex_info(dispex_data_t *info, compat_mode_t
}
static dispex_static_data_t HTMLDocumentNode_dispex = {
&HTMLDocumentNode_dispex_vtbl,
&HTMLDocumentNode_event_target_vtbl.dispex_vtbl,
DispHTMLDocument_tid,
HTMLDocumentNode_iface_tids,
HTMLDocumentNode_init_dispex_info

View File

@ -5332,7 +5332,7 @@ static HRESULT HTMLElement_populate_props(DispatchEx *dispex)
return S_OK;
}
static void HTMLElement_bind_event(DispatchEx *dispex, int eid)
static void HTMLElement_bind_event(DispatchEx *dispex, eventid_t eid)
{
HTMLElement *This = impl_from_DispatchEx(dispex);
@ -5343,7 +5343,7 @@ static void HTMLElement_bind_event(DispatchEx *dispex, int eid)
add_nsevent_listener(This->node.doc, This->node.nsnode, loadW);
return;
default:
dispex_get_vtbl(&This->node.doc->node.event_target.dispex)->bind_event(&This->node.doc->node.event_target.dispex, eid);
ensure_doc_nsevent_handler(This->node.doc, eid);
}
}
@ -5369,17 +5369,19 @@ static const tid_t HTMLElement_iface_tids[] = {
0
};
static dispex_static_data_vtbl_t HTMLElement_dispex_vtbl = {
NULL,
HTMLElement_get_dispid,
HTMLElement_invoke,
NULL,
HTMLElement_populate_props,
static event_target_vtbl_t HTMLElement_event_target_vtbl = {
{
NULL,
HTMLElement_get_dispid,
HTMLElement_invoke,
NULL,
HTMLElement_populate_props
},
HTMLElement_bind_event
};
static dispex_static_data_t HTMLElement_dispex = {
&HTMLElement_dispex_vtbl,
&HTMLElement_event_target_vtbl.dispex_vtbl,
DispHTMLUnknownElement_tid,
HTMLElement_iface_tids,
HTMLElement_init_dispex_info
@ -5398,7 +5400,7 @@ void HTMLElement_Init(HTMLElement *This, HTMLDocumentNode *doc, nsIDOMHTMLElemen
This->IProvideMultipleClassInfo_iface.lpVtbl = &ProvideMultipleClassInfoVtbl;
if(dispex_data && !dispex_data->vtbl)
dispex_data->vtbl = &HTMLElement_dispex_vtbl;
dispex_data->vtbl = &HTMLElement_event_target_vtbl.dispex_vtbl;
if(nselem) {
HTMLDOMNode_Init(doc, &This->node, (nsIDOMNode*)nselem, dispex_data ? dispex_data : &HTMLElement_dispex);

View File

@ -843,7 +843,7 @@ HRESULT create_event_obj(IHTMLEventObj **ret)
static handler_vector_t *get_handler_vector(EventTarget *event_target, eventid_t eid, BOOL alloc)
{
const dispex_static_data_vtbl_t *vtbl;
const event_target_vtbl_t *vtbl;
handler_vector_t *handler_vector;
struct wine_rb_entry *entry;

View File

@ -79,6 +79,12 @@ void release_nsevents(HTMLDocumentNode*) DECLSPEC_HIDDEN;
void add_nsevent_listener(HTMLDocumentNode*,nsIDOMNode*,LPCWSTR) DECLSPEC_HIDDEN;
void detach_nsevent(HTMLDocumentNode*,const WCHAR*) DECLSPEC_HIDDEN;
/* We extend dispex vtbl for EventTarget functions to avoid separated vtbl. */
typedef struct {
dispex_static_data_vtbl_t dispex_vtbl;
void (*bind_event)(DispatchEx*,eventid_t);
} event_target_vtbl_t;
static inline EventTarget *get_node_event_prop_target(HTMLDOMNode *node, eventid_t eid)
{
return node->vtbl->get_event_prop_target ? node->vtbl->get_event_prop_target(node, eid) : &node->event_target;

View File

@ -2995,10 +2995,10 @@ static HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD
return hres;
}
static void HTMLWindow_bind_event(DispatchEx *dispex, int eid)
static void HTMLWindow_bind_event(DispatchEx *dispex, eventid_t eid)
{
HTMLInnerWindow *This = impl_from_DispatchEx(dispex);
dispex_get_vtbl(&This->doc->node.event_target.dispex)->bind_event(&This->doc->node.event_target.dispex, eid);
ensure_doc_nsevent_handler(This->doc, eid);
}
static void HTMLWindow_init_dispex_info(dispex_data_t *info, compat_mode_t compat_mode)
@ -3006,12 +3006,14 @@ static void HTMLWindow_init_dispex_info(dispex_data_t *info, compat_mode_t compa
dispex_info_add_interface(info, IHTMLWindow5_tid, NULL);
}
static const dispex_static_data_vtbl_t HTMLWindow_dispex_vtbl = {
NULL,
NULL,
HTMLWindow_invoke,
NULL,
NULL,
static const event_target_vtbl_t HTMLWindow_event_target_vtbl = {
{
NULL,
NULL,
HTMLWindow_invoke,
NULL,
NULL
},
HTMLWindow_bind_event
};
@ -3024,7 +3026,7 @@ static const tid_t HTMLWindow_iface_tids[] = {
};
static dispex_static_data_t HTMLWindow_dispex = {
&HTMLWindow_dispex_vtbl,
&HTMLWindow_event_target_vtbl.dispex_vtbl,
DispHTMLWindow2_tid,
HTMLWindow_iface_tids,
HTMLWindow_init_dispex_info

View File

@ -270,8 +270,6 @@ typedef struct {
HRESULT (*invoke)(DispatchEx*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
compat_mode_t (*get_compat_mode)(DispatchEx*);
HRESULT (*populate_props)(DispatchEx*);
/* We abuse this vtbl for EventTarget functions to avoid separated vtbl. */
void (*bind_event)(DispatchEx*,int);
} dispex_static_data_vtbl_t;
typedef struct {
@ -330,7 +328,7 @@ void dispex_traverse(DispatchEx*,nsCycleCollectionTraversalCallback*) DECLSPEC_H
void dispex_unlink(DispatchEx*) DECLSPEC_HIDDEN;
void release_typelib(void) DECLSPEC_HIDDEN;
HRESULT get_class_typeinfo(const CLSID*,ITypeInfo**) DECLSPEC_HIDDEN;
const dispex_static_data_vtbl_t *dispex_get_vtbl(DispatchEx*) DECLSPEC_HIDDEN;
const void *dispex_get_vtbl(DispatchEx*) DECLSPEC_HIDDEN;
void dispex_info_add_interface(dispex_data_t*,tid_t,const DISPID*) DECLSPEC_HIDDEN;
compat_mode_t dispex_compat_mode(DispatchEx*) DECLSPEC_HIDDEN;

View File

@ -733,7 +733,7 @@ static inline HTMLXMLHttpRequest *impl_from_DispatchEx(DispatchEx *iface)
return CONTAINING_RECORD(iface, HTMLXMLHttpRequest, event_target.dispex);
}
static void HTMLXMLHttpRequest_bind_event(DispatchEx *dispex, int eid)
static void HTMLXMLHttpRequest_bind_event(DispatchEx *dispex, eventid_t eid)
{
HTMLXMLHttpRequest *This = impl_from_DispatchEx(dispex);
nsIDOMEventTarget *nstarget;
@ -768,12 +768,8 @@ static void HTMLXMLHttpRequest_bind_event(DispatchEx *dispex, int eid)
ERR("AddEventListener failed: %08x\n", nsres);
}
static dispex_static_data_vtbl_t HTMLXMLHttpRequest_dispex_vtbl = {
NULL,
NULL,
NULL,
NULL,
NULL,
static event_target_vtbl_t HTMLXMLHttpRequest_event_target_vtbl = {
{NULL},
HTMLXMLHttpRequest_bind_event
};
@ -782,7 +778,7 @@ static const tid_t HTMLXMLHttpRequest_iface_tids[] = {
0
};
static dispex_static_data_t HTMLXMLHttpRequest_dispex = {
&HTMLXMLHttpRequest_dispex_vtbl,
&HTMLXMLHttpRequest_event_target_vtbl.dispex_vtbl,
DispHTMLXMLHttpRequest_tid,
HTMLXMLHttpRequest_iface_tids
};