Module: wine Branch: master Commit: 015cfd9ec68554ad24a493be45e1dfba293d5032 URL: https://gitlab.winehq.org/wine/wine/-/commit/015cfd9ec68554ad24a493be45e1dfb...
Author: Gabriel Ivăncescu gabrielopcode@gmail.com Date: Wed Sep 13 18:12:38 2023 +0300
mshtml: Traverse and unlink FrameElements using the dispex.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
---
dlls/mshtml/htmlframe.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-)
diff --git a/dlls/mshtml/htmlframe.c b/dlls/mshtml/htmlframe.c index a97040d270d..c39e11c4cd7 100644 --- a/dlls/mshtml/htmlframe.c +++ b/dlls/mshtml/htmlframe.c @@ -981,17 +981,24 @@ static HRESULT HTMLFrameElement_bind_to_tree(HTMLDOMNode *iface) return hres; }
-static void HTMLFrameElement_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb) +static inline HTMLFrameElement *frame_from_DispatchEx(DispatchEx *iface) { - HTMLFrameElement *This = frame_from_HTMLDOMNode(iface); + return CONTAINING_RECORD(iface, HTMLFrameElement, framebase.element.node.event_target.dispex); +} + +static void HTMLFrameElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) +{ + HTMLFrameElement *This = frame_from_DispatchEx(dispex); + HTMLDOMNode_traverse(dispex, cb);
if(This->framebase.nsframe) - note_cc_edge((nsISupports*)This->framebase.nsframe, "This->nsframe", cb); + note_cc_edge((nsISupports*)This->framebase.nsframe, "nsframe", cb); }
-static void HTMLFrameElement_unlink(HTMLDOMNode *iface) +static void HTMLFrameElement_unlink(DispatchEx *dispex) { - HTMLFrameElement *This = frame_from_HTMLDOMNode(iface); + HTMLFrameElement *This = frame_from_DispatchEx(dispex); + HTMLDOMNode_unlink(dispex); unlink_ref(&This->framebase.nsframe); }
@@ -1009,8 +1016,15 @@ static const NodeImplVtbl HTMLFrameElementImplVtbl = { .get_name = HTMLFrameElement_get_name, .invoke = HTMLFrameElement_invoke, .bind_to_tree = HTMLFrameElement_bind_to_tree, - .traverse = HTMLFrameElement_traverse, - .unlink = HTMLFrameElement_unlink +}; + +static const event_target_vtbl_t HTMLFrameElement_event_target_vtbl = { + { + HTMLELEMENT_DISPEX_VTBL_ENTRIES, + .traverse = HTMLFrameElement_traverse, + .unlink = HTMLFrameElement_unlink + }, + HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, };
static const tid_t HTMLFrameElement_iface_tids[] = { @@ -1023,7 +1037,7 @@ static const tid_t HTMLFrameElement_iface_tids[] = {
static dispex_static_data_t HTMLFrameElement_dispex = { "HTMLFrameElement", - &HTMLElement_event_target_vtbl.dispex_vtbl, + &HTMLFrameElement_event_target_vtbl.dispex_vtbl, DispHTMLFrameElement_tid, HTMLFrameElement_iface_tids, HTMLElement_init_dispex_info