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:
parent
9a5e0bdb3d
commit
e5c0759c0c
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue