From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/dispex.c | 4 ++++ dlls/mshtml/htmlattr.c | 1 + dlls/mshtml/htmldoc.c | 1 + dlls/mshtml/htmlelem.c | 6 ++++++ dlls/mshtml/htmlelemcol.c | 1 + dlls/mshtml/htmlevent.c | 9 +++++++++ dlls/mshtml/htmlimg.c | 1 + dlls/mshtml/htmllocation.c | 1 + dlls/mshtml/htmlnode.c | 2 ++ dlls/mshtml/htmlselect.c | 1 + dlls/mshtml/htmlstorage.c | 1 + dlls/mshtml/htmlstyle.c | 1 + dlls/mshtml/htmlstylesheet.c | 4 ++++ dlls/mshtml/htmltextnode.c | 1 + dlls/mshtml/htmlwindow.c | 33 +++++++++++++++++++++++++++++++++ dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/mutation.c | 2 ++ dlls/mshtml/omnavigator.c | 8 ++++++++ dlls/mshtml/range.c | 2 ++ dlls/mshtml/selection.c | 1 + dlls/mshtml/xmlhttprequest.c | 2 ++ 21 files changed, 83 insertions(+)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index d0019c63168..966a47dc9cd 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -906,6 +906,7 @@ static HRESULT function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR static const dispex_static_data_vtbl_t function_dispex_vtbl = { function_destructor, NULL, + NULL, function_value, NULL, NULL, @@ -2005,6 +2006,9 @@ static nsresult NSAPI dispex_traverse(void *ccp, void *p, nsCycleCollectionTrave
describe_cc_node(&This->ccref, This->info->desc->name, cb);
+ if(This->info->desc->vtbl->traverse) + This->info->desc->vtbl->traverse(This, cb); + if(!This->dynamic_data) return NS_OK;
diff --git a/dlls/mshtml/htmlattr.c b/dlls/mshtml/htmlattr.c index bb8a0b1e3f3..1bceaef43bb 100644 --- a/dlls/mshtml/htmlattr.c +++ b/dlls/mshtml/htmlattr.c @@ -494,6 +494,7 @@ static void HTMLDOMAttribute_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t HTMLDOMAttribute_dispex_vtbl = { HTMLDOMAttribute_destructor, + NULL, HTMLDOMAttribute_unlink };
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index e48b80efa79..9264562b319 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -6099,6 +6099,7 @@ static const event_target_vtbl_t HTMLDocumentNode_event_target_vtbl = { NULL, NULL, NULL, + NULL, HTMLDocumentNode_get_name, HTMLDocumentNode_invoke, NULL, diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 902e4c9f3e7..52145c0a4c0 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -855,6 +855,7 @@ void HTMLRect_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
static const dispex_static_data_vtbl_t HTMLRect_dispex_vtbl = { HTMLRect_destructor, + NULL, HTMLRect_unlink };
@@ -1283,6 +1284,7 @@ static HRESULT HTMLRectCollection_invoke(DispatchEx *dispex, DISPID id, LCID lci
static const dispex_static_data_vtbl_t HTMLRectCollection_dispex_vtbl = { HTMLRectCollection_destructor, + NULL, HTMLRectCollection_unlink, NULL, HTMLRectCollection_get_dispid, @@ -7349,6 +7351,7 @@ const event_target_vtbl_t HTMLElement_event_target_vtbl = { HTMLElement_dispex_destructor, NULL, NULL, + NULL, HTMLElement_get_dispid, HTMLElement_get_name, HTMLElement_invoke, @@ -7820,6 +7823,7 @@ static HRESULT token_list_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD
static const dispex_static_data_vtbl_t token_list_dispex_vtbl = { token_list_destructor, + NULL, token_list_unlink, token_list_value, token_list_get_dispid, @@ -8245,6 +8249,7 @@ static const dispex_static_data_vtbl_t HTMLFiltersCollection_dispex_vtbl = { HTMLFiltersCollection_destructor, NULL, NULL, + NULL, HTMLFiltersCollection_get_dispid, HTMLFiltersCollection_get_name, HTMLFiltersCollection_invoke, @@ -9006,6 +9011,7 @@ static HRESULT HTMLAttributeCollection_invoke(DispatchEx *dispex, DISPID id, LCI
static const dispex_static_data_vtbl_t HTMLAttributeCollection_dispex_vtbl = { HTMLAttributeCollection_destructor, + NULL, HTMLAttributeCollection_unlink, NULL, HTMLAttributeCollection_get_dispid, diff --git a/dlls/mshtml/htmlelemcol.c b/dlls/mshtml/htmlelemcol.c index c9448adbe09..58460c7f8d9 100644 --- a/dlls/mshtml/htmlelemcol.c +++ b/dlls/mshtml/htmlelemcol.c @@ -629,6 +629,7 @@ static HRESULT HTMLElementCollection_invoke(DispatchEx *dispex, DISPID id, LCID
static const dispex_static_data_vtbl_t HTMLElementColection_dispex_vtbl = { HTMLElementCollection_destructor, + NULL, HTMLElementCollection_unlink, NULL, HTMLElementCollection_get_dispid, diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 79dc58bb57d..222496273d6 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -886,6 +886,7 @@ static void HTMLEventObj_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t HTMLEventObj_dispex_vtbl = { HTMLEventObj_destructor, + NULL, HTMLEventObj_unlink };
@@ -2957,6 +2958,7 @@ static void DOMStorageEvent_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t DOMEvent_dispex_vtbl = { DOMEvent_destructor, + NULL, DOMEvent_unlink };
@@ -2974,6 +2976,7 @@ static dispex_static_data_t DOMEvent_dispex = {
static const dispex_static_data_vtbl_t DOMUIEvent_dispex_vtbl = { DOMEvent_destructor, + NULL, DOMUIEvent_unlink };
@@ -2992,6 +2995,7 @@ static dispex_static_data_t DOMUIEvent_dispex = {
static const dispex_static_data_vtbl_t DOMMouseEvent_dispex_vtbl = { DOMEvent_destructor, + NULL, DOMMouseEvent_unlink };
@@ -3011,6 +3015,7 @@ static dispex_static_data_t DOMMouseEvent_dispex = {
static const dispex_static_data_vtbl_t DOMKeyboardEvent_dispex_vtbl = { DOMEvent_destructor, + NULL, DOMKeyboardEvent_unlink };
@@ -3044,6 +3049,7 @@ static dispex_static_data_t DOMPageTransitionEvent_dispex = {
static const dispex_static_data_vtbl_t DOMCustomEvent_dispex_vtbl = { DOMCustomEvent_destructor, + NULL, DOMCustomEvent_unlink };
@@ -3062,6 +3068,7 @@ static dispex_static_data_t DOMCustomEvent_dispex = {
static const dispex_static_data_vtbl_t DOMMessageEvent_dispex_vtbl = { DOMMessageEvent_destructor, + NULL, DOMMessageEvent_unlink };
@@ -3080,6 +3087,7 @@ static dispex_static_data_t DOMMessageEvent_dispex = {
static const dispex_static_data_vtbl_t DOMProgressEvent_dispex_vtbl = { DOMEvent_destructor, + NULL, DOMProgressEvent_unlink };
@@ -3098,6 +3106,7 @@ static dispex_static_data_t DOMProgressEvent_dispex = {
static const dispex_static_data_vtbl_t DOMStorageEvent_dispex_vtbl = { DOMStorageEvent_destructor, + NULL, DOMEvent_unlink };
diff --git a/dlls/mshtml/htmlimg.c b/dlls/mshtml/htmlimg.c index fac0a56ab74..effcd2af591 100644 --- a/dlls/mshtml/htmlimg.c +++ b/dlls/mshtml/htmlimg.c @@ -978,6 +978,7 @@ static const tid_t HTMLImageElementFactory_iface_tids[] = { static const dispex_static_data_vtbl_t HTMLImageElementFactory_dispex_vtbl = { HTMLImageElementFactory_destructor, NULL, + NULL, HTMLImageElementFactory_value, NULL, NULL, diff --git a/dlls/mshtml/htmllocation.c b/dlls/mshtml/htmllocation.c index 216ebf44d9a..49327ef56a8 100644 --- a/dlls/mshtml/htmllocation.c +++ b/dlls/mshtml/htmllocation.c @@ -633,6 +633,7 @@ static void HTMLLocation_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t HTMLLocation_dispex_vtbl = { HTMLLocation_destructor, + NULL, HTMLLocation_unlink };
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index ad292fbae90..9b7220606cc 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -439,6 +439,7 @@ static HRESULT HTMLDOMChildrenCollection_invoke(DispatchEx *dispex, DISPID id, L
static const dispex_static_data_vtbl_t HTMLDOMChildrenCollection_dispex_vtbl = { HTMLDOMChildrenCollection_destructor, + NULL, HTMLDOMChildrenCollection_unlink, NULL, HTMLDOMChildrenCollection_get_dispid, @@ -1507,6 +1508,7 @@ void HTMLDOMNode_Init(HTMLDocumentNode *doc, HTMLDOMNode *node, nsIDOMNode *nsno
static const dispex_static_data_vtbl_t HTMLDOMNode_dispex_vtbl = { HTMLDOMNode_dispex_destructor, + NULL, };
static const tid_t HTMLDOMNode_iface_tids[] = { diff --git a/dlls/mshtml/htmlselect.c b/dlls/mshtml/htmlselect.c index ac9c4ea8f5b..3490c639e41 100644 --- a/dlls/mshtml/htmlselect.c +++ b/dlls/mshtml/htmlselect.c @@ -632,6 +632,7 @@ static const tid_t HTMLOptionElementFactory_iface_tids[] = { static const dispex_static_data_vtbl_t HTMLOptionElementFactory_dispex_vtbl = { HTMLOptionElementFactory_destructor, NULL, + NULL, HTMLOptionElementFactory_value, NULL, NULL, diff --git a/dlls/mshtml/htmlstorage.c b/dlls/mshtml/htmlstorage.c index 3c3259c3804..fefb38fbd95 100644 --- a/dlls/mshtml/htmlstorage.c +++ b/dlls/mshtml/htmlstorage.c @@ -1311,6 +1311,7 @@ static const dispex_static_data_vtbl_t HTMLStorage_dispex_vtbl = { HTMLStorage_destructor, NULL, NULL, + NULL, HTMLStorage_get_dispid, HTMLStorage_get_name, HTMLStorage_invoke, diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c index f302de0cf8c..439ec010a14 100644 --- a/dlls/mshtml/htmlstyle.c +++ b/dlls/mshtml/htmlstyle.c @@ -10003,6 +10003,7 @@ void CSSStyle_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
const dispex_static_data_vtbl_t CSSStyle_dispex_vtbl = { CSSStyle_destructor, + NULL, CSSStyle_unlink, NULL, CSSStyle_get_dispid, diff --git a/dlls/mshtml/htmlstylesheet.c b/dlls/mshtml/htmlstylesheet.c index fd43e68949e..0d8466350b2 100644 --- a/dlls/mshtml/htmlstylesheet.c +++ b/dlls/mshtml/htmlstylesheet.c @@ -210,6 +210,7 @@ static void HTMLStyleSheetRule_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t HTMLStyleSheetRule_dispex_vtbl = { HTMLStyleSheetRule_destructor, + NULL, HTMLStyleSheetRule_unlink };
@@ -478,6 +479,7 @@ static HRESULT HTMLStyleSheetRulesCollection_invoke(DispatchEx *dispex, DISPID i
static const dispex_static_data_vtbl_t HTMLStyleSheetRulesCollection_dispex_vtbl = { HTMLStyleSheetRulesCollection_destructor, + NULL, HTMLStyleSheetRulesCollection_unlink, NULL, HTMLStyleSheetRulesCollection_get_dispid, @@ -911,6 +913,7 @@ static HRESULT HTMLStyleSheetsCollection_invoke(DispatchEx *dispex, DISPID id, L
static const dispex_static_data_vtbl_t HTMLStyleSheetsCollection_dispex_vtbl = { HTMLStyleSheetsCollection_destructor, + NULL, HTMLStyleSheetsCollection_unlink, NULL, HTMLStyleSheetsCollection_get_dispid, @@ -1498,6 +1501,7 @@ static void HTMLStyleSheet_init_dispex_info(dispex_data_t *info, compat_mode_t m
static const dispex_static_data_vtbl_t HTMLStyleSheet_dispex_vtbl = { HTMLStyleSheet_destructor, + NULL, HTMLStyleSheet_unlink };
diff --git a/dlls/mshtml/htmltextnode.c b/dlls/mshtml/htmltextnode.c index 1bae5994c14..1d455b4b323 100644 --- a/dlls/mshtml/htmltextnode.c +++ b/dlls/mshtml/htmltextnode.c @@ -364,6 +364,7 @@ static const NodeImplVtbl HTMLDOMTextNodeImplVtbl = {
static const dispex_static_data_vtbl_t HTMLDOMTextNode_dispex_vtbl = { HTMLDOMTextNode_destructor, + NULL, };
static const tid_t HTMLDOMTextNode_iface_tids[] = { diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index e3e54abcbf1..41caff749cb 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3818,6 +3818,38 @@ static inline HTMLInnerWindow *impl_from_DispatchEx(DispatchEx *iface) return CONTAINING_RECORD(iface, HTMLInnerWindow, event_target.dispex); }
+static void HTMLWindow_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) +{ + HTMLInnerWindow *This = impl_from_DispatchEx(dispex); + HTMLOuterWindow *child; + + LIST_FOR_EACH_ENTRY(child, &This->children, HTMLOuterWindow, sibling_entry) + note_cc_edge((nsISupports*)&child->base.IHTMLWindow2_iface, "child", cb); + if(This->doc) + note_cc_edge((nsISupports*)&This->doc->node.IHTMLDOMNode_iface, "doc", cb); + if(This->console) + note_cc_edge((nsISupports*)This->console, "console", cb); + if(This->image_factory) + note_cc_edge((nsISupports*)&This->image_factory->IHTMLImageElementFactory_iface, "image_factory", cb); + if(This->option_factory) + note_cc_edge((nsISupports*)&This->option_factory->IHTMLOptionElementFactory_iface, "option_factory", cb); + if(This->xhr_factory) + note_cc_edge((nsISupports*)&This->xhr_factory->IHTMLXMLHttpRequestFactory_iface, "xhr_factory", cb); + if(This->mutation_observer_ctor) + note_cc_edge((nsISupports*)This->mutation_observer_ctor, "mutation_observer_ctor", cb); + if(This->screen) + note_cc_edge((nsISupports*)This->screen, "screen", cb); + if(This->history) + note_cc_edge((nsISupports*)&This->history->IOmHistory_iface, "history", cb); + if(This->navigator) + note_cc_edge((nsISupports*)This->navigator, "navigator", cb); + if(This->session_storage) + note_cc_edge((nsISupports*)This->session_storage, "session_storage", cb); + if(This->local_storage) + note_cc_edge((nsISupports*)This->local_storage, "local_storage", cb); + traverse_variant(&This->performance, "performance", cb); +} + static void HTMLWindow_unlink(DispatchEx *dispex) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); @@ -4141,6 +4173,7 @@ static IHTMLEventObj *HTMLWindow_set_current_event(DispatchEx *dispex, IHTMLEven static const event_target_vtbl_t HTMLWindow_event_target_vtbl = { { HTMLWindow_destructor, + HTMLWindow_traverse, HTMLWindow_unlink, NULL, NULL, diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index d12a9fd28ad..4b53a4e1927 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -355,6 +355,7 @@ typedef struct { /* Used to implement Cycle Collection callbacks; note that the destructor is not optional! Unlike delete_cycle_collectable, unlink is called before the destructor (if available). */ void (*destructor)(DispatchEx*); + void (*traverse)(DispatchEx*,nsCycleCollectionTraversalCallback*); void (*unlink)(DispatchEx*);
/* Called when the object wants to handle DISPID_VALUE invocations */ diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c index 4d1078cce81..e9c4019de69 100644 --- a/dlls/mshtml/mutation.c +++ b/dlls/mshtml/mutation.c @@ -1225,6 +1225,7 @@ static void mutation_observer_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t mutation_observer_dispex_vtbl = { mutation_observer_destructor, + NULL, mutation_observer_unlink };
@@ -1380,6 +1381,7 @@ static HRESULT mutation_observer_ctor_value(DispatchEx *dispex, LCID lcid, static dispex_static_data_vtbl_t mutation_observer_ctor_dispex_vtbl = { mutation_observer_ctor_destructor, NULL, + NULL, mutation_observer_ctor_value };
diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index 4ba7991ab05..7cc6ef6e94b 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -302,6 +302,7 @@ static void HTMLDOMImplementation_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t HTMLDOMImplementation_dispex_vtbl = { HTMLDOMImplementation_destructor, + NULL, HTMLDOMImplementation_unlink };
@@ -913,6 +914,7 @@ static void HTMLPluginsCollection_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t HTMLPluginsCollection_dispex_vtbl = { HTMLPluginsCollection_destructor, + NULL, HTMLPluginsCollection_unlink };
@@ -1073,6 +1075,7 @@ static void HTMLMimeTypesCollection_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t HTMLMimeTypesCollection_dispex_vtbl = { HTMLMimeTypesCollection_destructor, + NULL, HTMLMimeTypesCollection_unlink };
@@ -1520,6 +1523,7 @@ static void OmNavigator_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t OmNavigator_dispex_vtbl = { OmNavigator_destructor, + NULL, OmNavigator_unlink };
@@ -1948,6 +1952,7 @@ static void HTMLPerformanceTiming_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t HTMLPerformanceTiming_dispex_vtbl = { HTMLPerformanceTiming_destructor, + NULL, HTMLPerformanceTiming_unlink };
@@ -2124,6 +2129,7 @@ static void HTMLPerformanceNavigation_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t HTMLPerformanceNavigation_dispex_vtbl = { HTMLPerformanceNavigation_destructor, + NULL, HTMLPerformanceNavigation_unlink };
@@ -2339,6 +2345,7 @@ static void HTMLPerformance_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t HTMLPerformance_dispex_vtbl = { HTMLPerformance_destructor, + NULL, HTMLPerformance_unlink };
@@ -3111,6 +3118,7 @@ static void media_query_list_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t media_query_list_dispex_vtbl = { media_query_list_destructor, + NULL, media_query_list_unlink };
diff --git a/dlls/mshtml/range.c b/dlls/mshtml/range.c index 4c7bd710265..b733b4ff0ad 100644 --- a/dlls/mshtml/range.c +++ b/dlls/mshtml/range.c @@ -1728,6 +1728,7 @@ static void HTMLTxtRange_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t HTMLTxtRange_dispex_vtbl = { HTMLTxtRange_destructor, + NULL, HTMLTxtRange_unlink };
@@ -2087,6 +2088,7 @@ static void HTMLDOMRange_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t HTMLDOMRange_dispex_vtbl = { HTMLDOMRange_destructor, + NULL, HTMLDOMRange_unlink };
diff --git a/dlls/mshtml/selection.c b/dlls/mshtml/selection.c index 3b840d526d2..78aa55e8c6b 100644 --- a/dlls/mshtml/selection.c +++ b/dlls/mshtml/selection.c @@ -341,6 +341,7 @@ static void HTMLSelectionObject_destructor(DispatchEx *dispex)
static const dispex_static_data_vtbl_t HTMLSelectionObject_dispex_vtbl = { HTMLSelectionObject_destructor, + NULL, HTMLSelectionObject_unlink };
diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c index ba18bd419fa..3ee7c1681a0 100644 --- a/dlls/mshtml/xmlhttprequest.c +++ b/dlls/mshtml/xmlhttprequest.c @@ -1596,6 +1596,7 @@ static void HTMLXMLHttpRequest_init_dispex_info(dispex_data_t *info, compat_mode static event_target_vtbl_t HTMLXMLHttpRequest_event_target_vtbl = { { HTMLXMLHttpRequest_destructor, + NULL, HTMLXMLHttpRequest_unlink }, HTMLXMLHttpRequest_get_gecko_target, @@ -1814,6 +1815,7 @@ static HRESULT HTMLXMLHttpRequestFactory_value(DispatchEx *iface, LCID lcid, WOR static const dispex_static_data_vtbl_t HTMLXMLHttpRequestFactory_dispex_vtbl = { HTMLXMLHttpRequestFactory_destructor, NULL, + NULL, HTMLXMLHttpRequestFactory_value };