From 35a6c314d4cf5098ed61aa8da43b146ba2d0bd16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Iv=C4=83ncescu?= Date: Mon, 2 Oct 2023 21:39:22 +0300 Subject: [PATCH] mshtml: Traverse EventTarget listeners. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Gabriel Ivăncescu --- dlls/mshtml/htmlevent.c | 11 +++++++++++ dlls/mshtml/htmlevent.h | 1 + dlls/mshtml/htmlnode.c | 1 + dlls/mshtml/htmlwindow.c | 1 + dlls/mshtml/xmlhttprequest.c | 1 + 5 files changed, 15 insertions(+) diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 800ec30cbad..d6ad65b1d0b 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -4587,6 +4587,17 @@ void EventTarget_Init(EventTarget *event_target, dispex_static_data_t *dispex_da wine_rb_init(&event_target->handler_map, event_id_cmp); } +void traverse_event_target(EventTarget *event_target, nsCycleCollectionTraversalCallback *cb) +{ + listener_container_t *iter; + event_listener_t *listener; + + RB_FOR_EACH_ENTRY(iter, &event_target->handler_map, listener_container_t, entry) + LIST_FOR_EACH_ENTRY(listener, &iter->listeners, event_listener_t, entry) + if(listener->function) + note_cc_edge((nsISupports*)listener->function, "EventTarget.listener", cb); +} + void release_event_target(EventTarget *event_target) { listener_container_t *iter, *iter2; diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index c072b159a56..b50c74c029f 100644 --- a/dlls/mshtml/htmlevent.h +++ b/dlls/mshtml/htmlevent.h @@ -97,6 +97,7 @@ typedef struct DOMEvent { const WCHAR *get_event_name(eventid_t); void check_event_attr(HTMLDocumentNode*,nsIDOMElement*); +void traverse_event_target(EventTarget*,nsCycleCollectionTraversalCallback*); void release_event_target(EventTarget*); HRESULT set_event_handler(EventTarget*,eventid_t,VARIANT*); HRESULT get_event_handler(EventTarget*,eventid_t,VARIANT*); diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index 6ece8435f1f..cc458c82e32 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -1425,6 +1425,7 @@ void HTMLDOMNode_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback { HTMLDOMNode *This = HTMLDOMNode_from_DispatchEx(dispex); + traverse_event_target(&This->event_target, cb); if(This->nsnode) note_cc_edge((nsISupports*)This->nsnode, "nsnode", cb); if(This->doc && &This->doc->node != This) diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index ebdde0abe2b..398fef9bde7 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3922,6 +3922,7 @@ static void HTMLWindow_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCa HTMLInnerWindow *This = impl_from_DispatchEx(dispex); HTMLOuterWindow *child; + traverse_event_target(&This->event_target, cb); LIST_FOR_EACH_ENTRY(child, &This->children, HTMLOuterWindow, sibling_entry) note_cc_edge((nsISupports*)&child->base.IHTMLWindow2_iface, "child", cb); if(This->doc) diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c index a76532e972f..44f83dd8809 100644 --- a/dlls/mshtml/xmlhttprequest.c +++ b/dlls/mshtml/xmlhttprequest.c @@ -1514,6 +1514,7 @@ static void HTMLXMLHttpRequest_traverse(DispatchEx *dispex, nsCycleCollectionTra note_cc_edge((nsISupports*)&This->pending_progress_event->IDOMEvent_iface, "pending_progress_event", cb); if(This->nsxhr) note_cc_edge((nsISupports*)This->nsxhr, "nsxhr", cb); + traverse_event_target(&This->event_target, cb); } static void HTMLXMLHttpRequest_unlink(DispatchEx *dispex)