From: Gabriel Ivăncescu gabrielopcode@gmail.com
And get rid of the destroy method. This especially simplifies it when traversal and unlinking is implemented.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlevent.c | 124 +++++++++++++++++++++++++++------------- dlls/mshtml/htmlevent.h | 1 - 2 files changed, 83 insertions(+), 42 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 5d38188d289..f36bcc977cc 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -1241,8 +1241,6 @@ static inline DOMEvent *DOMEvent_from_DispatchEx(DispatchEx *iface) static void DOMEvent_destructor(DispatchEx *dispex) { DOMEvent *This = DOMEvent_from_DispatchEx(dispex); - if(This->destroy) - This->destroy(This); if(This->target) IEventTarget_Release(&This->target->IEventTarget_iface); nsIDOMEvent_Release(This->nsevent); @@ -1398,10 +1396,21 @@ static void *DOMUIEvent_query_interface(DOMEvent *event, REFIID riid) return NULL; }
-static void DOMUIEvent_destroy(DOMEvent *event) +static void DOMUIEvent_unlink(DispatchEx *dispex) { - DOMUIEvent *This = DOMUIEvent_from_DOMEvent(event); - nsIDOMUIEvent_Release(This->nsevent); + DOMUIEvent *This = DOMUIEvent_from_DOMEvent(DOMEvent_from_DispatchEx(dispex)); + if(This->nsevent) { + nsIDOMUIEvent *nsevent = This->nsevent; + This->nsevent = NULL; + nsIDOMUIEvent_Release(nsevent); + } +} + +static void DOMUIEvent_destructor(DispatchEx *dispex) +{ + DOMUIEvent *This = DOMUIEvent_from_DOMEvent(DOMEvent_from_DispatchEx(dispex)); + DOMUIEvent_unlink(&This->event.dispex); + DOMEvent_destructor(dispex); }
typedef struct { @@ -1929,11 +1938,12 @@ static void *DOMMouseEvent_query_interface(DOMEvent *event, REFIID riid) return NULL; }
-static void DOMMouseEvent_destroy(DOMEvent *event) +static void DOMMouseEvent_destructor(DispatchEx *dispex) { - DOMMouseEvent *This = DOMMouseEvent_from_DOMEvent(event); - DOMUIEvent_destroy(&This->ui_event.event); + DOMMouseEvent *This = DOMMouseEvent_from_DOMEvent(DOMEvent_from_DispatchEx(dispex)); + DOMUIEvent_unlink(&This->ui_event.event.dispex); nsIDOMMouseEvent_Release(This->nsevent); + DOMEvent_destructor(dispex); }
typedef struct { @@ -2228,11 +2238,12 @@ static void *DOMKeyboardEvent_query_interface(DOMEvent *event, REFIID riid) return NULL; }
-static void DOMKeyboardEvent_destroy(DOMEvent *event) +static void DOMKeyboardEvent_destructor(DispatchEx *dispex) { - DOMKeyboardEvent *This = DOMKeyboardEvent_from_DOMEvent(event); - DOMUIEvent_destroy(&This->ui_event.event); + DOMKeyboardEvent *This = DOMKeyboardEvent_from_DOMEvent(DOMEvent_from_DispatchEx(dispex)); + DOMUIEvent_unlink(&This->ui_event.event.dispex); nsIDOMKeyEvent_Release(This->nsevent); + DOMEvent_destructor(dispex); }
typedef struct { @@ -2436,10 +2447,11 @@ static void *DOMCustomEvent_query_interface(DOMEvent *event, REFIID riid) return NULL; }
-static void DOMCustomEvent_destroy(DOMEvent *event) +static void DOMCustomEvent_destructor(DispatchEx *dispex) { - DOMCustomEvent *custom_event = DOMCustomEvent_from_DOMEvent(event); + DOMCustomEvent *custom_event = DOMCustomEvent_from_DOMEvent(DOMEvent_from_DispatchEx(dispex)); VariantClear(&custom_event->detail); + DOMEvent_destructor(dispex); }
typedef struct { @@ -2580,10 +2592,11 @@ static void *DOMMessageEvent_query_interface(DOMEvent *event, REFIID riid) return NULL; }
-static void DOMMessageEvent_destroy(DOMEvent *event) +static void DOMMessageEvent_destructor(DispatchEx *dispex) { - DOMMessageEvent *message_event = DOMMessageEvent_from_DOMEvent(event); + DOMMessageEvent *message_event = DOMMessageEvent_from_DOMEvent(DOMEvent_from_DispatchEx(dispex)); VariantClear(&message_event->data); + DOMEvent_destructor(dispex); }
static void DOMMessageEvent_init_dispex_info(dispex_data_t *info, compat_mode_t compat_mode) @@ -2753,10 +2766,11 @@ static void *DOMProgressEvent_query_interface(DOMEvent *event, REFIID riid) return NULL; }
-static void DOMProgressEvent_destroy(DOMEvent *event) +static void DOMProgressEvent_destructor(DispatchEx *dispex) { - DOMProgressEvent *This = DOMProgressEvent_from_DOMEvent(event); + DOMProgressEvent *This = DOMProgressEvent_from_DOMEvent(DOMEvent_from_DispatchEx(dispex)); nsIDOMProgressEvent_Release(This->nsevent); + DOMEvent_destructor(dispex); }
typedef struct { @@ -2915,13 +2929,14 @@ static void *DOMStorageEvent_query_interface(DOMEvent *event, REFIID riid) return NULL; }
-static void DOMStorageEvent_destroy(DOMEvent *event) +static void DOMStorageEvent_destructor(DispatchEx *dispex) { - DOMStorageEvent *storage_event = DOMStorageEvent_from_DOMEvent(event); + DOMStorageEvent *storage_event = DOMStorageEvent_from_DOMEvent(DOMEvent_from_DispatchEx(dispex)); SysFreeString(storage_event->key); SysFreeString(storage_event->old_value); SysFreeString(storage_event->new_value); SysFreeString(storage_event->url); + DOMEvent_destructor(dispex); }
static const dispex_static_data_vtbl_t DOMEvent_dispex_vtbl = { @@ -2940,6 +2955,10 @@ static dispex_static_data_t DOMEvent_dispex = { DOMEvent_iface_tids };
+static const dispex_static_data_vtbl_t DOMUIEvent_dispex_vtbl = { + DOMUIEvent_destructor, +}; + static const tid_t DOMUIEvent_iface_tids[] = { IDOMEvent_tid, IDOMUIEvent_tid, @@ -2948,11 +2967,15 @@ static const tid_t DOMUIEvent_iface_tids[] = {
static dispex_static_data_t DOMUIEvent_dispex = { L"UIEvent", - &DOMEvent_dispex_vtbl, + &DOMUIEvent_dispex_vtbl, DispDOMUIEvent_tid, DOMUIEvent_iface_tids };
+static const dispex_static_data_vtbl_t DOMMouseEvent_dispex_vtbl = { + DOMMouseEvent_destructor, +}; + static const tid_t DOMMouseEvent_iface_tids[] = { IDOMEvent_tid, IDOMUIEvent_tid, @@ -2962,11 +2985,15 @@ static const tid_t DOMMouseEvent_iface_tids[] = {
static dispex_static_data_t DOMMouseEvent_dispex = { L"MouseEvent", - &DOMEvent_dispex_vtbl, + &DOMMouseEvent_dispex_vtbl, DispDOMMouseEvent_tid, DOMMouseEvent_iface_tids };
+static const dispex_static_data_vtbl_t DOMKeyboardEvent_dispex_vtbl = { + DOMKeyboardEvent_destructor, +}; + static const tid_t DOMKeyboardEvent_iface_tids[] = { IDOMEvent_tid, IDOMUIEvent_tid, @@ -2976,7 +3003,7 @@ static const tid_t DOMKeyboardEvent_iface_tids[] = {
static dispex_static_data_t DOMKeyboardEvent_dispex = { L"KeyboardEvent", - &DOMEvent_dispex_vtbl, + &DOMKeyboardEvent_dispex_vtbl, DispDOMKeyboardEvent_tid, DOMKeyboardEvent_iface_tids }; @@ -2987,7 +3014,7 @@ static void DOMPageTransitionEvent_init_dispex_info(dispex_data_t *info, compat_ dispex_info_add_interface(info, IWinePageTransitionEvent_tid, NULL); }
-dispex_static_data_t DOMPageTransitionEvent_dispex = { +static dispex_static_data_t DOMPageTransitionEvent_dispex = { L"PageTransitionEvent", &DOMEvent_dispex_vtbl, DispDOMEvent_tid, @@ -2995,6 +3022,10 @@ dispex_static_data_t DOMPageTransitionEvent_dispex = { DOMPageTransitionEvent_init_dispex_info };
+static const dispex_static_data_vtbl_t DOMCustomEvent_dispex_vtbl = { + DOMCustomEvent_destructor, +}; + static const tid_t DOMCustomEvent_iface_tids[] = { IDOMEvent_tid, IDOMCustomEvent_tid, @@ -3003,52 +3034,64 @@ static const tid_t DOMCustomEvent_iface_tids[] = {
static dispex_static_data_t DOMCustomEvent_dispex = { L"CustomEvent", - &DOMEvent_dispex_vtbl, + &DOMCustomEvent_dispex_vtbl, DispDOMCustomEvent_tid, DOMCustomEvent_iface_tids };
+static const dispex_static_data_vtbl_t DOMMessageEvent_dispex_vtbl = { + DOMMessageEvent_destructor, +}; + static const tid_t DOMMessageEvent_iface_tids[] = { IDOMEvent_tid, 0 };
-dispex_static_data_t DOMMessageEvent_dispex = { +static dispex_static_data_t DOMMessageEvent_dispex = { L"MessageEvent", - &DOMEvent_dispex_vtbl, + &DOMMessageEvent_dispex_vtbl, DispDOMMessageEvent_tid, DOMMessageEvent_iface_tids, DOMMessageEvent_init_dispex_info };
+static const dispex_static_data_vtbl_t DOMProgressEvent_dispex_vtbl = { + DOMProgressEvent_destructor, +}; + static const tid_t DOMProgressEvent_iface_tids[] = { IDOMEvent_tid, IDOMProgressEvent_tid, 0 };
-dispex_static_data_t DOMProgressEvent_dispex = { +static dispex_static_data_t DOMProgressEvent_dispex = { L"ProgressEvent", - &DOMEvent_dispex_vtbl, + &DOMProgressEvent_dispex_vtbl, DispDOMProgressEvent_tid, DOMProgressEvent_iface_tids };
+static const dispex_static_data_vtbl_t DOMStorageEvent_dispex_vtbl = { + DOMStorageEvent_destructor, +}; + static const tid_t DOMStorageEvent_iface_tids[] = { IDOMEvent_tid, IDOMStorageEvent_tid, 0 };
-dispex_static_data_t DOMStorageEvent_dispex = { +static dispex_static_data_t DOMStorageEvent_dispex = { L"StorageEvent", - &DOMEvent_dispex_vtbl, + &DOMStorageEvent_dispex_vtbl, DispDOMStorageEvent_tid, DOMStorageEvent_iface_tids };
static void *event_ctor(unsigned size, dispex_static_data_t *dispex_data, void *(*query_interface)(DOMEvent*,REFIID), - void (*destroy)(DOMEvent*), nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) + nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { DOMEvent *event = calloc(1, size);
@@ -3056,7 +3099,6 @@ static void *event_ctor(unsigned size, dispex_static_data_t *dispex_data, void * return NULL; event->IDOMEvent_iface.lpVtbl = &DOMEventVtbl; event->query_interface = query_interface; - event->destroy = destroy; event->event_id = event_id; if(event_id != EVENTID_LAST) { event->type = wcsdup(event_info[event_id].name); @@ -3084,13 +3126,13 @@ static void fill_parent_ui_event(nsIDOMEvent *nsevent, DOMUIEvent *ui_event)
static DOMEvent *generic_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { - return event_ctor(sizeof(DOMEvent), &DOMEvent_dispex, NULL, NULL, nsevent, event_id, compat_mode); + return event_ctor(sizeof(DOMEvent), &DOMEvent_dispex, NULL, nsevent, event_id, compat_mode); }
static DOMEvent *ui_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { DOMUIEvent *ui_event = event_ctor(sizeof(DOMUIEvent), &DOMUIEvent_dispex, - DOMUIEvent_query_interface, DOMUIEvent_destroy, nsevent, event_id, compat_mode); + DOMUIEvent_query_interface, nsevent, event_id, compat_mode); if(!ui_event) return NULL; ui_event->IDOMUIEvent_iface.lpVtbl = &DOMUIEventVtbl; ui_event->nsevent = iface; @@ -3100,7 +3142,7 @@ static DOMEvent *ui_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t even static DOMEvent *mouse_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { DOMMouseEvent *mouse_event = event_ctor(sizeof(DOMMouseEvent), &DOMMouseEvent_dispex, - DOMMouseEvent_query_interface, DOMMouseEvent_destroy, nsevent, event_id, compat_mode); + DOMMouseEvent_query_interface, nsevent, event_id, compat_mode); if(!mouse_event) return NULL; mouse_event->IDOMMouseEvent_iface.lpVtbl = &DOMMouseEventVtbl; mouse_event->nsevent = iface; @@ -3111,7 +3153,7 @@ static DOMEvent *mouse_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t e static DOMEvent *keyboard_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { DOMKeyboardEvent *keyboard_event = event_ctor(sizeof(DOMKeyboardEvent), &DOMKeyboardEvent_dispex, - DOMKeyboardEvent_query_interface, DOMKeyboardEvent_destroy, nsevent, event_id, compat_mode); + DOMKeyboardEvent_query_interface, nsevent, event_id, compat_mode); if(!keyboard_event) return NULL; keyboard_event->IDOMKeyboardEvent_iface.lpVtbl = &DOMKeyboardEventVtbl; keyboard_event->nsevent = iface; @@ -3122,7 +3164,7 @@ static DOMEvent *keyboard_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_ static DOMEvent *page_transition_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { DOMPageTransitionEvent *page_transition_event = event_ctor(sizeof(DOMCustomEvent), &DOMPageTransitionEvent_dispex, - DOMPageTransitionEvent_query_interface, NULL, nsevent, event_id, compat_mode); + DOMPageTransitionEvent_query_interface, nsevent, event_id, compat_mode); if(!page_transition_event) return NULL; page_transition_event->IWinePageTransitionEvent_iface.lpVtbl = &DOMPageTransitionEventVtbl; return &page_transition_event->event; @@ -3131,7 +3173,7 @@ static DOMEvent *page_transition_event_ctor(void *iface, nsIDOMEvent *nsevent, e static DOMEvent *custom_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { DOMCustomEvent *custom_event = event_ctor(sizeof(DOMCustomEvent), &DOMCustomEvent_dispex, - DOMCustomEvent_query_interface, DOMCustomEvent_destroy, nsevent, event_id, compat_mode); + DOMCustomEvent_query_interface, nsevent, event_id, compat_mode); if(!custom_event) return NULL; custom_event->IDOMCustomEvent_iface.lpVtbl = &DOMCustomEventVtbl; nsIDOMCustomEvent_Release(iface); @@ -3143,7 +3185,7 @@ static DOMEvent *progress_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_ DOMProgressEvent *progress_event;
if(!(progress_event = event_ctor(sizeof(DOMProgressEvent), &DOMProgressEvent_dispex, - DOMProgressEvent_query_interface, DOMProgressEvent_destroy, nsevent, event_id, compat_mode))) + DOMProgressEvent_query_interface, nsevent, event_id, compat_mode))) return NULL; progress_event->IDOMProgressEvent_iface.lpVtbl = &DOMProgressEventVtbl; progress_event->nsevent = iface; @@ -3153,7 +3195,7 @@ static DOMEvent *progress_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_ static DOMEvent *message_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { DOMMessageEvent *message_event = event_ctor(sizeof(DOMMessageEvent), &DOMMessageEvent_dispex, - DOMMessageEvent_query_interface, DOMMessageEvent_destroy, nsevent, event_id, compat_mode); + DOMMessageEvent_query_interface, nsevent, event_id, compat_mode); if(!message_event) return NULL; message_event->IDOMMessageEvent_iface.lpVtbl = &DOMMessageEventVtbl; return &message_event->event; @@ -3162,7 +3204,7 @@ static DOMEvent *message_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t static DOMEvent *storage_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { DOMStorageEvent *storage_event = event_ctor(sizeof(DOMStorageEvent), &DOMStorageEvent_dispex, - DOMStorageEvent_query_interface, DOMStorageEvent_destroy, nsevent, event_id, compat_mode); + DOMStorageEvent_query_interface, nsevent, event_id, compat_mode); if(!storage_event) return NULL; storage_event->IDOMStorageEvent_iface.lpVtbl = &DOMStorageEventVtbl; return &storage_event->event; diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index 8b8c06999a1..d3a35c883dd 100644 --- a/dlls/mshtml/htmlevent.h +++ b/dlls/mshtml/htmlevent.h @@ -78,7 +78,6 @@ typedef struct DOMEvent {
nsCycleCollectingAutoRefCnt ccref; void *(*query_interface)(struct DOMEvent*,REFIID); - void (*destroy)(struct DOMEvent*);
nsIDOMEvent *nsevent;