From 7bf4cd17ea8fb8c3487f31c093f00c78f619b554 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Iv=C4=83ncescu?= Date: Fri, 4 Aug 2023 17:30:14 +0300 Subject: [PATCH] mshtml: Use unlink and destructor in the vtbl for MediaQueryList. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Gabriel Ivăncescu --- dlls/mshtml/omnavigator.c | 45 ++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index 71beb3cc41c..2e098bf2d09 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -2890,21 +2890,11 @@ static ULONG WINAPI media_query_list_Release(IWineMSHTMLMediaQueryList *iface) { struct media_query_list *media_query_list = impl_from_IWineMSHTMLMediaQueryList(iface); LONG ref = InterlockedDecrement(&media_query_list->ref); - struct media_query_list_listener *listener, *listener2; TRACE("(%p) ref=%ld\n", media_query_list, ref); - if(!ref) { - media_query_list->callback->media_query_list = NULL; - LIST_FOR_EACH_ENTRY_SAFE(listener, listener2, &media_query_list->listeners, struct media_query_list_listener, entry) { - IDispatch_Release(listener->function); - free(listener); - } - nsIDOMMediaQueryListListener_Release(&media_query_list->callback->nsIDOMMediaQueryListListener_iface); - nsIDOMMediaQueryList_Release(media_query_list->nsquerylist); + if(!ref) release_dispex(&media_query_list->dispex); - free(media_query_list); - } return ref; } @@ -3125,13 +3115,44 @@ static const nsIDOMMediaQueryListListenerVtbl media_query_list_callback_vtbl = { media_query_list_callback_HandleChange }; +static inline struct media_query_list *media_query_list_from_DispatchEx(DispatchEx *iface) +{ + return CONTAINING_RECORD(iface, struct media_query_list, dispex); +} + +static void media_query_list_unlink(DispatchEx *dispex) +{ + struct media_query_list *media_query_list = media_query_list_from_DispatchEx(dispex); + + media_query_list->callback->media_query_list = NULL; + while(!list_empty(&media_query_list->listeners)) { + struct media_query_list_listener *listener = LIST_ENTRY(list_head(&media_query_list->listeners), struct media_query_list_listener, entry); + list_remove(&listener->entry); + IDispatch_Release(listener->function); + free(listener); + } + unlink_ref(&media_query_list->nsquerylist); +} + +static void media_query_list_destructor(DispatchEx *dispex) +{ + struct media_query_list *media_query_list = media_query_list_from_DispatchEx(dispex); + nsIDOMMediaQueryListListener_Release(&media_query_list->callback->nsIDOMMediaQueryListListener_iface); + free(media_query_list); +} + +static const dispex_static_data_vtbl_t media_query_list_dispex_vtbl = { + media_query_list_destructor, + media_query_list_unlink +}; + static const tid_t media_query_list_iface_tids[] = { IWineMSHTMLMediaQueryList_tid, 0 }; static dispex_static_data_t media_query_list_dispex = { L"MediaQueryList", - NULL, + &media_query_list_dispex_vtbl, IWineMSHTMLMediaQueryList_tid, media_query_list_iface_tids };