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