[PATCH 4/6] mshtml: Delegate event construction to functions by type.

Gabriel Ivăncescu gabrielopcode at gmail.com
Mon May 23 10:22:09 CDT 2022


Instead of hardcoding it, which will be necessary as the amount of event
types implemented grows.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
 dlls/mshtml/htmlevent.c | 33 ++++++++++++++++++++++++---------
 1 file changed, 24 insertions(+), 9 deletions(-)

diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index f28dd63..c25b85f 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -2373,6 +2373,26 @@ static BOOL check_event_iface(nsIDOMEvent *event, REFIID riid)
     return TRUE;
 }
 
+static DOMEvent *message_event_ctor(nsIDOMEvent *nsevent, dispex_static_data_t **dispex_data)
+{
+    DOMMessageEvent *message_event = heap_alloc_zero(sizeof(*message_event));
+    if(!message_event)
+        return NULL;
+
+    message_event->IDOMMessageEvent_iface.lpVtbl = &DOMMessageEventVtbl;
+    message_event->event.query_interface = DOMMessageEvent_query_interface;
+    message_event->event.destroy = DOMMessageEvent_destroy;
+    *dispex_data = &DOMMessageEvent_dispex;
+    return &message_event->event;
+}
+
+static const struct {
+    DOMEvent* (*proc)(nsIDOMEvent*,dispex_static_data_t**);
+    compat_mode_t min_mode;
+} event_type_ctors[ARRAY_SIZE(event_types)] = {
+    [EVENT_TYPE_MESSAGE]        = { message_event_ctor, COMPAT_MODE_QUIRKS },
+};
+
 static DOMEvent *alloc_event(nsIDOMEvent *nsevent, compat_mode_t compat_mode, eventid_t event_id)
 {
     dispex_static_data_t *dispex_data = &DOMEvent_dispex;
@@ -2389,16 +2409,11 @@ static DOMEvent *alloc_event(nsIDOMEvent *nsevent, compat_mode_t compat_mode, ev
         custom_event->event.destroy = DOMCustomEvent_destroy;
         event = &custom_event->event;
         dispex_data = &DOMCustomEvent_dispex;
-    }else if(event_id == EVENTID_MESSAGE) {
-        DOMMessageEvent *message_event = heap_alloc_zero(sizeof(*message_event));
-        if(!message_event)
+    }else if(event_id != EVENTID_LAST && event_type_ctors[event_info[event_id].type].proc &&
+             compat_mode >= event_type_ctors[event_info[event_id].type].min_mode) {
+        event = event_type_ctors[event_info[event_id].type].proc(nsevent, &dispex_data);
+        if(!event)
             return NULL;
-
-        message_event->IDOMMessageEvent_iface.lpVtbl = &DOMMessageEventVtbl;
-        message_event->event.query_interface = DOMMessageEvent_query_interface;
-        message_event->event.destroy = DOMMessageEvent_destroy;
-        event = &message_event->event;
-        dispex_data = &DOMMessageEvent_dispex;
     }else {
         event = heap_alloc_zero(sizeof(*event));
         if(!event)
-- 
2.34.1




More information about the wine-devel mailing list