Module: wine Branch: master Commit: 35a6c314d4cf5098ed61aa8da43b146ba2d0bd16 URL: https://gitlab.winehq.org/wine/wine/-/commit/35a6c314d4cf5098ed61aa8da43b146...
Author: Gabriel Ivăncescu gabrielopcode@gmail.com Date: Mon Oct 2 21:39:22 2023 +0300
mshtml: Traverse EventTarget listeners.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
---
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)