diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 4ab2944d935..7c40d47358d 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1736,6 +1736,11 @@ void dispex_unlink(DispatchEx *This) } } +const dispex_static_data_vtbl_t *dispex_get_vtbl(DispatchEx *dispex) +{ + return dispex->data->vtbl; +} + void release_dispex(DispatchEx *This) { dynamic_prop_t *prop; diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 05ed66bae02..5fdbab09ba6 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -5093,7 +5093,7 @@ static void HTMLElement_bind_event(DispatchEx *dispex, int eid) add_nsevent_listener(This->node.doc, This->node.nsnode, loadW); return; default: - This->node.doc->node.event_target.dispex.data->vtbl->bind_event(&This->node.doc->node.event_target.dispex, eid); + dispex_get_vtbl(&This->node.doc->node.event_target.dispex)->bind_event(&This->node.doc->node.event_target.dispex, eid); } } diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 4bf168f67ed..c2eeb7d8fc2 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -901,10 +901,11 @@ HRESULT create_event_obj(IHTMLEventObj **ret) static inline event_target_t *get_event_target_data(EventTarget *event_target, BOOL alloc) { + const dispex_static_data_vtbl_t *vtbl = dispex_get_vtbl(&event_target->dispex); event_target_t **ptr; - ptr = event_target->dispex.data->vtbl && event_target->dispex.data->vtbl->get_event_target_ptr - ? event_target->dispex.data->vtbl->get_event_target_ptr(&event_target->dispex) + ptr = vtbl && vtbl->get_event_target_ptr + ? vtbl->get_event_target_ptr(&event_target->dispex) : &event_target->ptr; if(*ptr || !alloc) return *ptr; @@ -1394,8 +1395,9 @@ void detach_events(HTMLDocumentNode *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) { - if(event_target->dispex.data->vtbl->bind_event) - event_target->dispex.data->vtbl->bind_event(&event_target->dispex, 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); } diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 7484681e228..b75c9bad6ff 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -2933,7 +2933,7 @@ static event_target_t **HTMLWindow_get_event_target_ptr(DispatchEx *dispex) static void HTMLWindow_bind_event(DispatchEx *dispex, int eid) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); - This->doc->node.event_target.dispex.data->vtbl->bind_event(&This->doc->node.event_target.dispex, eid); + dispex_get_vtbl(&This->doc->node.event_target.dispex)->bind_event(&This->doc->node.event_target.dispex, eid); } static const dispex_static_data_vtbl_t HTMLWindow_dispex_vtbl = { diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index f6cf1a06b24..0e75c2f491f 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -303,6 +303,7 @@ void dispex_traverse(DispatchEx*,nsCycleCollectionTraversalCallback*) DECLSPEC_H void dispex_unlink(DispatchEx*) DECLSPEC_HIDDEN; void release_typelib(void) DECLSPEC_HIDDEN; HRESULT get_htmldoc_classinfo(ITypeInfo **typeinfo) DECLSPEC_HIDDEN; +const dispex_static_data_vtbl_t *dispex_get_vtbl(DispatchEx*) DECLSPEC_HIDDEN; typedef enum { DISPEXPROP_CUSTOM,