Jacek Caban : mshtml: Always set valid IEventTarget vtbl.
Alexandre Julliard
julliard at winehq.org
Thu Feb 8 15:33:08 CST 2018
Module: wine
Branch: master
Commit: a25d8c342fbe4eed4e9909cd503ac7e3073ba978
URL: https://source.winehq.org/git/wine.git/?a=commit;h=a25d8c342fbe4eed4e9909cd503ac7e3073ba978
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Feb 8 20:53:28 2018 +0100
mshtml: Always set valid IEventTarget vtbl.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mshtml/htmlevent.c | 44 +++++++++++---------------------------------
1 file changed, 11 insertions(+), 33 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 2931318..69c9444 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -213,8 +213,6 @@ static const event_info_t event_info[] = {
EVENT_FIXME}
};
-static BOOL use_event_quirks(EventTarget*);
-
static eventid_t str_to_eid(const WCHAR *str)
{
int i;
@@ -859,7 +857,7 @@ static ULONG WINAPI DOMEvent_Release(IDOMEvent *iface)
if(This->mouse_event)
nsIDOMMouseEvent_Release(This->mouse_event);
if(This->target)
- IDispatchEx_Release(&This->target->dispex.IDispatchEx_iface);
+ IEventTarget_Release(&This->target->IEventTarget_iface);
nsIDOMEvent_Release(This->nsevent);
release_dispex(&This->dispex);
heap_free(This->type);
@@ -2085,6 +2083,11 @@ static HRESULT call_cp_func(IDispatch *disp, DISPID dispid, IHTMLEventObj *event
return IDispatch_Invoke(disp, dispid, &IID_NULL, 0, DISPATCH_METHOD, &dp, retv, &ei, &argerr);
}
+static BOOL use_event_quirks(EventTarget *event_target)
+{
+ return dispex_compat_mode(&event_target->dispex) < COMPAT_MODE_IE9;
+}
+
static BOOL is_cp_event(cp_static_data_t *data, DISPID dispid)
{
int min, max, i;
@@ -2342,7 +2345,7 @@ static HRESULT dispatch_event_object(EventTarget *event_target, DOMEvent *event,
}
iter = event_target;
- IDispatchEx_AddRef(&event_target->dispex.IDispatchEx_iface);
+ IEventTarget_AddRef(&event_target->IEventTarget_iface);
chain_cnt = 0;
chain_buf_size = sizeof(target_chain_buf)/sizeof(*target_chain_buf);
@@ -2382,9 +2385,9 @@ static HRESULT dispatch_event_object(EventTarget *event_target, DOMEvent *event,
prev_event = target_vtbl->set_current_event(&event_target->dispex, event->event_obj);
if(event->target)
- IDispatchEx_Release(&event->target->dispex.IDispatchEx_iface);
+ IEventTarget_Release(&event->target->IEventTarget_iface);
event->target = event_target;
- IDispatchEx_AddRef(&event_target->dispex.IDispatchEx_iface);
+ IEventTarget_AddRef(&event_target->IEventTarget_iface);
event->phase = DEP_CAPTURING_PHASE;
i = chain_cnt-1;
@@ -2433,7 +2436,7 @@ static HRESULT dispatch_event_object(EventTarget *event_target, DOMEvent *event,
}
for(i = 0; i < chain_cnt; i++)
- IDispatchEx_Release(&target_chain[i]->dispex.IDispatchEx_iface);
+ IEventTarget_Release(&target_chain[i]->IEventTarget_iface);
if(target_chain != target_chain_buf)
heap_free(target_chain);
@@ -3044,18 +3047,6 @@ static const IEventTargetVtbl EventTargetVtbl = {
EventTarget_dispatchEvent
};
-#define DELAY_INIT_VTBL ((const IEventTargetVtbl*)1)
-
-static BOOL use_event_quirks(EventTarget *event_target)
-{
- if(event_target->IEventTarget_iface.lpVtbl == DELAY_INIT_VTBL) {
- event_target->IEventTarget_iface.lpVtbl =
- dispex_compat_mode(&event_target->dispex) >= COMPAT_MODE_IE9
- ? &EventTargetVtbl : NULL;
- }
- return !event_target->IEventTarget_iface.lpVtbl;
-}
-
HRESULT EventTarget_QI(EventTarget *event_target, REFIID riid, void **ppv)
{
if(IsEqualGUID(riid, &IID_IEventTarget)) {
@@ -3098,21 +3089,8 @@ void EventTarget_Init(EventTarget *event_target, IUnknown *outer, dispex_static_
compat_mode_t compat_mode)
{
init_dispex_with_compat_mode(&event_target->dispex, outer, dispex_data, compat_mode);
+ event_target->IEventTarget_iface.lpVtbl = &EventTargetVtbl;
wine_rb_init(&event_target->handler_map, event_id_cmp);
-
- /*
- * IEventTarget is supported by the object or not depending on compatibility mode.
- * We use NULL vtbl for objects in compatibility mode not supporting the interface.
- * For targets that don't know compatibility mode at creation time, we set vtbl
- * to special DELAY_INIT_VTBL value so that vtbl will be set to proper value
- * when it's needed.
- */
- if(compat_mode == COMPAT_MODE_QUIRKS && dispex_data->vtbl && dispex_data->vtbl->get_compat_mode)
- event_target->IEventTarget_iface.lpVtbl = DELAY_INIT_VTBL;
- else if(compat_mode < COMPAT_MODE_IE9)
- event_target->IEventTarget_iface.lpVtbl = NULL;
- else
- event_target->IEventTarget_iface.lpVtbl = &EventTargetVtbl;
}
void release_event_target(EventTarget *event_target)
More information about the wine-cvs
mailing list