From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlanchor.c | 4 +-- dlls/mshtml/htmlarea.c | 4 +-- dlls/mshtml/htmlattr.c | 12 +++++++- dlls/mshtml/htmlbody.c | 4 +-- dlls/mshtml/htmlcomment.c | 4 +-- dlls/mshtml/htmlelem.c | 54 +++++++++++++++++++++--------------- dlls/mshtml/htmlform.c | 4 +-- dlls/mshtml/htmlframe.c | 4 +-- dlls/mshtml/htmlgeneric.c | 4 +-- dlls/mshtml/htmlhead.c | 16 +++++------ dlls/mshtml/htmlimg.c | 4 +-- dlls/mshtml/htmlinput.c | 12 ++++---- dlls/mshtml/htmllink.c | 4 +-- dlls/mshtml/htmlobject.c | 8 +++--- dlls/mshtml/htmlscript.c | 4 +-- dlls/mshtml/htmlselect.c | 8 +++--- dlls/mshtml/htmlstyleelem.c | 4 +-- dlls/mshtml/htmltable.c | 12 ++++---- dlls/mshtml/htmltextarea.c | 4 +-- dlls/mshtml/mshtml_private.h | 2 ++ dlls/mshtml/svg.c | 16 +++++------ 21 files changed, 105 insertions(+), 83 deletions(-)
diff --git a/dlls/mshtml/htmlanchor.c b/dlls/mshtml/htmlanchor.c index 8fc333f5bf4..5398f87ce55 100644 --- a/dlls/mshtml/htmlanchor.c +++ b/dlls/mshtml/htmlanchor.c @@ -810,7 +810,7 @@ static void *HTMLAnchorElement_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLAnchorElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLAnchorElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nsanchor) note_cc_edge((nsISupports*)This->nsanchor, "nsanchor", cb); @@ -819,7 +819,7 @@ static void HTMLAnchorElement_traverse(DispatchEx *dispex, nsCycleCollectionTrav static void HTMLAnchorElement_unlink(DispatchEx *dispex) { HTMLAnchorElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nsanchor); }
diff --git a/dlls/mshtml/htmlarea.c b/dlls/mshtml/htmlarea.c index 2223bb58617..aa13ee997d2 100644 --- a/dlls/mshtml/htmlarea.c +++ b/dlls/mshtml/htmlarea.c @@ -426,7 +426,7 @@ static void *HTMLAreaElement_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLAreaElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLAreaElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nsarea) note_cc_edge((nsISupports*)This->nsarea, "nsarea", cb); @@ -435,7 +435,7 @@ static void HTMLAreaElement_traverse(DispatchEx *dispex, nsCycleCollectionTraver static void HTMLAreaElement_unlink(DispatchEx *dispex) { HTMLAreaElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nsarea); }
diff --git a/dlls/mshtml/htmlattr.c b/dlls/mshtml/htmlattr.c index 4d9e9908c22..cbd847038d6 100644 --- a/dlls/mshtml/htmlattr.c +++ b/dlls/mshtml/htmlattr.c @@ -466,19 +466,27 @@ static void *HTMLDOMAttribute_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLDOMAttribute_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLDOMAttribute *This = impl_from_DispatchEx(dispex); + + if(This->elem) + note_cc_edge((nsISupports*)&This->elem->node.IHTMLDOMNode_iface, "elem", cb); traverse_variant(&This->value, "value", cb); }
static void HTMLDOMAttribute_unlink(DispatchEx *dispex) { HTMLDOMAttribute *This = impl_from_DispatchEx(dispex); + + if(This->elem) { + HTMLElement *elem = This->elem; + This->elem = NULL; + IHTMLDOMNode_Release(&elem->node.IHTMLDOMNode_iface); + } unlink_variant(&This->value); }
static void HTMLDOMAttribute_destructor(DispatchEx *dispex) { HTMLDOMAttribute *This = impl_from_DispatchEx(dispex); - assert(!This->elem); VariantClear(&This->value); free(This->name); free(This); @@ -527,6 +535,8 @@ HRESULT HTMLDOMAttribute_Create(const WCHAR *name, HTMLElement *elem, DISPID dis
/* For attributes attached to an element, (elem,dispid) pair should be valid used for its operation. */ if(elem) { + IHTMLDOMNode_AddRef(&elem->node.IHTMLDOMNode_iface); + hres = HTMLElement_get_attr_col(&elem->node, &col); if(FAILED(hres)) { IHTMLDOMAttribute_Release(&ret->IHTMLDOMAttribute_iface); diff --git a/dlls/mshtml/htmlbody.c b/dlls/mshtml/htmlbody.c index e6e8c900b71..fa4284da8cc 100644 --- a/dlls/mshtml/htmlbody.c +++ b/dlls/mshtml/htmlbody.c @@ -943,7 +943,7 @@ static void *HTMLBodyElement_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLBodyElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLBodyElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nsbody) note_cc_edge((nsISupports*)This->nsbody, "nsbody", cb); @@ -952,7 +952,7 @@ static void HTMLBodyElement_traverse(DispatchEx *dispex, nsCycleCollectionTraver static void HTMLBodyElement_unlink(DispatchEx *dispex) { HTMLBodyElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nsbody); }
diff --git a/dlls/mshtml/htmlcomment.c b/dlls/mshtml/htmlcomment.c index fab79642e70..398e59cc04f 100644 --- a/dlls/mshtml/htmlcomment.c +++ b/dlls/mshtml/htmlcomment.c @@ -187,8 +187,8 @@ static const event_target_vtbl_t HTMLCommentElement_event_target_vtbl = { HTMLELEMENT_DISPEX_VTBL_ENTRIES, .query_interface= HTMLCommentElement_query_interface, .destructor = HTMLElement_destructor, - .traverse = HTMLDOMNode_traverse, - .unlink = HTMLDOMNode_unlink + .traverse = HTMLElement_traverse, + .unlink = HTMLElement_unlink }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, .handle_event = HTMLElement_handle_event diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 61a405357e0..e3010d3f059 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -4792,6 +4792,7 @@ static HRESULT WINAPI HTMLElement4_setAttributeNode(IHTMLElement4 *iface, IHTMLD replace->elem = NULL; }else { list_add_tail(&attrs->attrs, &attr->entry); + IHTMLDOMNode_AddRef(&This->node.IHTMLDOMNode_iface); }
IHTMLDOMAttribute_AddRef(&attr->IHTMLDOMAttribute_iface); @@ -6857,6 +6858,27 @@ void *HTMLElement_query_interface(DispatchEx *dispex, REFIID riid) return HTMLDOMNode_query_interface(&This->node.event_target.dispex, riid); }
+void HTMLElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) +{ + HTMLElement *This = impl_from_DispatchEx(dispex); + HTMLDOMNode_traverse(&This->node.event_target.dispex, cb); + + if(This->attrs) + note_cc_edge((nsISupports*)&This->attrs->IHTMLAttributeCollection_iface, "attrs", cb); +} + +void HTMLElement_unlink(DispatchEx *dispex) +{ + HTMLElement *This = impl_from_DispatchEx(dispex); + HTMLDOMNode_unlink(&This->node.event_target.dispex); + + if(This->attrs) { + HTMLAttributeCollection *attrs = This->attrs; + This->attrs = NULL; + IHTMLAttributeCollection_Release(&attrs->IHTMLAttributeCollection_iface); + } +} + void HTMLElement_destructor(DispatchEx *dispex) { HTMLElement *This = impl_from_DispatchEx(dispex); @@ -6871,15 +6893,6 @@ void HTMLElement_destructor(DispatchEx *dispex) This->runtime_style->elem = NULL; IHTMLStyle_Release(&This->runtime_style->IHTMLStyle_iface); } - if(This->attrs) { - HTMLDOMAttribute *attr; - - LIST_FOR_EACH_ENTRY(attr, &This->attrs->attrs, HTMLDOMAttribute, entry) - attr->elem = NULL; - - This->attrs->elem = NULL; - IHTMLAttributeCollection_Release(&This->attrs->IHTMLAttributeCollection_iface); - }
free(This->filter); HTMLDOMNode_destructor(&This->node.event_target.dispex); @@ -7278,8 +7291,8 @@ static const event_target_vtbl_t HTMLElement_event_target_vtbl = { HTMLELEMENT_DISPEX_VTBL_ENTRIES, .query_interface = HTMLElement_query_interface, .destructor = HTMLElement_destructor, - .traverse = HTMLDOMNode_traverse, - .unlink = HTMLDOMNode_unlink, + .traverse = HTMLElement_traverse, + .unlink = HTMLElement_unlink, }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, .handle_event = HTMLElement_handle_event @@ -8226,11 +8239,6 @@ static inline HRESULT get_attr_dispid_by_name(HTMLAttributeCollection *This, BST } }
- if(!This->elem) { - WARN("NULL elem\n"); - return E_UNEXPECTED; - } - hres = IDispatchEx_GetDispID(&This->elem->node.event_target.dispex.IDispatchEx_iface, name, fdexNameCaseInsensitive, id); return hres; @@ -8252,11 +8260,6 @@ static inline HRESULT get_domattr(HTMLAttributeCollection *This, DISPID id, LONG }
if(!*attr) { - if(!This->elem) { - WARN("NULL elem\n"); - return E_UNEXPECTED; - } - hres = HTMLDOMAttribute_Create(NULL, This->elem, id, dispex_compat_mode(&This->elem->node.event_target.dispex), attr); if(FAILED(hres)) return hres; @@ -8811,6 +8814,8 @@ static void HTMLAttributeCollection_traverse(DispatchEx *dispex, nsCycleCollecti
LIST_FOR_EACH_ENTRY(attr, &This->attrs, HTMLDOMAttribute, entry) note_cc_edge((nsISupports*)&attr->IHTMLDOMAttribute_iface, "attr", cb); + if(This->elem) + note_cc_edge((nsISupports*)&This->elem->node.IHTMLDOMNode_iface, "elem", cb); }
static void HTMLAttributeCollection_unlink(DispatchEx *dispex) @@ -8820,9 +8825,13 @@ static void HTMLAttributeCollection_unlink(DispatchEx *dispex) HTMLDOMAttribute *attr = LIST_ENTRY(list_head(&This->attrs), HTMLDOMAttribute, entry);
list_remove(&attr->entry); - attr->elem = NULL; IHTMLDOMAttribute_Release(&attr->IHTMLDOMAttribute_iface); } + if(This->elem) { + HTMLElement *elem = This->elem; + This->elem = NULL; + IHTMLDOMNode_Release(&elem->node.IHTMLDOMNode_iface); + } }
static void HTMLAttributeCollection_destructor(DispatchEx *dispex) @@ -8938,6 +8947,7 @@ HRESULT HTMLElement_get_attr_col(HTMLDOMNode *iface, HTMLAttributeCollection **a This->attrs->IHTMLAttributeCollection2_iface.lpVtbl = &HTMLAttributeCollection2Vtbl; This->attrs->IHTMLAttributeCollection3_iface.lpVtbl = &HTMLAttributeCollection3Vtbl;
+ IHTMLDOMNode_AddRef(&This->node.IHTMLDOMNode_iface); This->attrs->elem = This; list_init(&This->attrs->attrs); init_dispatch(&This->attrs->dispex, &HTMLAttributeCollection_dispex, dispex_compat_mode(&iface->event_target.dispex)); diff --git a/dlls/mshtml/htmlform.c b/dlls/mshtml/htmlform.c index 61bf686865f..fc30742d540 100644 --- a/dlls/mshtml/htmlform.c +++ b/dlls/mshtml/htmlform.c @@ -788,7 +788,7 @@ static void *HTMLFormElement_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLFormElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLFormElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nsform) note_cc_edge((nsISupports*)This->nsform, "nsform", cb); @@ -797,7 +797,7 @@ static void HTMLFormElement_traverse(DispatchEx *dispex, nsCycleCollectionTraver static void HTMLFormElement_unlink(DispatchEx *dispex) { HTMLFormElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nsform); }
diff --git a/dlls/mshtml/htmlframe.c b/dlls/mshtml/htmlframe.c index 5dab4e44bc5..1a78dc3cc07 100644 --- a/dlls/mshtml/htmlframe.c +++ b/dlls/mshtml/htmlframe.c @@ -944,7 +944,7 @@ static void *HTMLFrameElement_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLFrameElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLFrameElement *This = frame_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->framebase.nsframe) note_cc_edge((nsISupports*)This->framebase.nsframe, "nsframe", cb); @@ -1534,7 +1534,7 @@ static void *HTMLIFrame_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLIFrame_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLIFrame *This = iframe_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->framebase.nsiframe) note_cc_edge((nsISupports*)This->framebase.nsiframe, "nsiframe", cb); diff --git a/dlls/mshtml/htmlgeneric.c b/dlls/mshtml/htmlgeneric.c index b6746f60407..2174a8f3ba2 100644 --- a/dlls/mshtml/htmlgeneric.c +++ b/dlls/mshtml/htmlgeneric.c @@ -150,8 +150,8 @@ static const event_target_vtbl_t HTMLGenericElement_event_target_vtbl = { HTMLELEMENT_DISPEX_VTBL_ENTRIES, .query_interface= HTMLGenericElement_query_interface, .destructor = HTMLElement_destructor, - .traverse = HTMLDOMNode_traverse, - .unlink = HTMLDOMNode_unlink + .traverse = HTMLElement_traverse, + .unlink = HTMLElement_unlink }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, .handle_event = HTMLElement_handle_event diff --git a/dlls/mshtml/htmlhead.c b/dlls/mshtml/htmlhead.c index 138d919310f..2b2dc34e0ce 100644 --- a/dlls/mshtml/htmlhead.c +++ b/dlls/mshtml/htmlhead.c @@ -168,8 +168,8 @@ static const event_target_vtbl_t HTMLTitleElement_event_target_vtbl = { HTMLELEMENT_DISPEX_VTBL_ENTRIES, .query_interface= HTMLTitleElement_query_interface, .destructor = HTMLElement_destructor, - .traverse = HTMLDOMNode_traverse, - .unlink = HTMLDOMNode_unlink + .traverse = HTMLElement_traverse, + .unlink = HTMLElement_unlink }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, .handle_event = HTMLElement_handle_event @@ -338,8 +338,8 @@ static const event_target_vtbl_t HTMLHtmlElement_event_target_vtbl = { HTMLELEMENT_DISPEX_VTBL_ENTRIES, .query_interface= HTMLHtmlElement_query_interface, .destructor = HTMLElement_destructor, - .traverse = HTMLDOMNode_traverse, - .unlink = HTMLDOMNode_unlink + .traverse = HTMLElement_traverse, + .unlink = HTMLElement_unlink }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, .handle_event = HTMLElement_handle_event @@ -565,8 +565,8 @@ static const event_target_vtbl_t HTMLMetaElement_event_target_vtbl = { HTMLELEMENT_DISPEX_VTBL_ENTRIES, .query_interface= HTMLMetaElement_query_interface, .destructor = HTMLElement_destructor, - .traverse = HTMLDOMNode_traverse, - .unlink = HTMLDOMNode_unlink + .traverse = HTMLElement_traverse, + .unlink = HTMLElement_unlink }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, .handle_event = HTMLElement_handle_event @@ -727,8 +727,8 @@ static const event_target_vtbl_t HTMLHeadElement_event_target_vtbl = { HTMLELEMENT_DISPEX_VTBL_ENTRIES, .query_interface= HTMLHeadElement_query_interface, .destructor = HTMLElement_destructor, - .traverse = HTMLDOMNode_traverse, - .unlink = HTMLDOMNode_unlink + .traverse = HTMLElement_traverse, + .unlink = HTMLElement_unlink }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, .handle_event = HTMLElement_handle_event diff --git a/dlls/mshtml/htmlimg.c b/dlls/mshtml/htmlimg.c index 07ce5643ad1..f037578e5d4 100644 --- a/dlls/mshtml/htmlimg.c +++ b/dlls/mshtml/htmlimg.c @@ -683,7 +683,7 @@ static void *HTMLImgElement_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLImgElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLImg *This = HTMLImg_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nsimg) note_cc_edge((nsISupports*)This->nsimg, "nsimg", cb); @@ -692,7 +692,7 @@ static void HTMLImgElement_traverse(DispatchEx *dispex, nsCycleCollectionTravers static void HTMLImgElement_unlink(DispatchEx *dispex) { HTMLImg *This = HTMLImg_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nsimg); }
diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c index ee703e0dadc..8c7f738a298 100644 --- a/dlls/mshtml/htmlinput.c +++ b/dlls/mshtml/htmlinput.c @@ -1397,7 +1397,7 @@ static void *HTMLInputElement_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLInputElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLInputElement *This = input_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nsinput) note_cc_edge((nsISupports*)This->nsinput, "nsinput", cb); @@ -1406,7 +1406,7 @@ static void HTMLInputElement_traverse(DispatchEx *dispex, nsCycleCollectionTrave static void HTMLInputElement_unlink(DispatchEx *dispex) { HTMLInputElement *This = input_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nsinput); }
@@ -1621,8 +1621,8 @@ static const event_target_vtbl_t HTMLLabelElement_event_target_vtbl = { HTMLELEMENT_DISPEX_VTBL_ENTRIES, .query_interface= HTMLLabelElement_query_interface, .destructor = HTMLElement_destructor, - .traverse = HTMLDOMNode_traverse, - .unlink = HTMLDOMNode_unlink + .traverse = HTMLElement_traverse, + .unlink = HTMLElement_unlink }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, .handle_event = HTMLElement_handle_event @@ -1932,7 +1932,7 @@ static void *HTMLButtonElement_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLButtonElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLButtonElement *This = button_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nsbutton) note_cc_edge((nsISupports*)This->nsbutton, "nsbutton", cb); @@ -1941,7 +1941,7 @@ static void HTMLButtonElement_traverse(DispatchEx *dispex, nsCycleCollectionTrav static void HTMLButtonElement_unlink(DispatchEx *dispex) { HTMLButtonElement *This = button_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nsbutton); }
diff --git a/dlls/mshtml/htmllink.c b/dlls/mshtml/htmllink.c index 83e3b876fcc..f936c9dcfe3 100644 --- a/dlls/mshtml/htmllink.c +++ b/dlls/mshtml/htmllink.c @@ -404,7 +404,7 @@ static void *HTMLLinkElement_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLLinkElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLLinkElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nslink) note_cc_edge((nsISupports*)This->nslink, "nslink", cb); @@ -413,7 +413,7 @@ static void HTMLLinkElement_traverse(DispatchEx *dispex, nsCycleCollectionTraver static void HTMLLinkElement_unlink(DispatchEx *dispex) { HTMLLinkElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nslink); } static const NodeImplVtbl HTMLLinkElementImplVtbl = { diff --git a/dlls/mshtml/htmlobject.c b/dlls/mshtml/htmlobject.c index b5c3d3677bd..d6b1799f674 100644 --- a/dlls/mshtml/htmlobject.c +++ b/dlls/mshtml/htmlobject.c @@ -687,7 +687,7 @@ static void *HTMLObjectElement_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLObjectElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLObjectElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nsobject) note_cc_edge((nsISupports*)This->nsobject, "nsobject", cb); @@ -696,7 +696,7 @@ static void HTMLObjectElement_traverse(DispatchEx *dispex, nsCycleCollectionTrav static void HTMLObjectElement_unlink(DispatchEx *dispex) { HTMLObjectElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nsobject); }
@@ -1010,8 +1010,8 @@ static const event_target_vtbl_t HTMLEmbedElement_event_target_vtbl = { HTMLELEMENT_DISPEX_VTBL_ENTRIES, .query_interface= HTMLEmbedElement_query_interface, .destructor = HTMLElement_destructor, - .traverse = HTMLDOMNode_traverse, - .unlink = HTMLDOMNode_unlink + .traverse = HTMLElement_traverse, + .unlink = HTMLElement_unlink }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, .handle_event = HTMLElement_handle_event diff --git a/dlls/mshtml/htmlscript.c b/dlls/mshtml/htmlscript.c index e77419c3ef3..2e008d9a95b 100644 --- a/dlls/mshtml/htmlscript.c +++ b/dlls/mshtml/htmlscript.c @@ -398,7 +398,7 @@ static void *HTMLScriptElement_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLScriptElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLScriptElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nsscript) note_cc_edge((nsISupports*)This->nsscript, "nsscript", cb); @@ -407,7 +407,7 @@ static void HTMLScriptElement_traverse(DispatchEx *dispex, nsCycleCollectionTrav static void HTMLScriptElement_unlink(DispatchEx *dispex) { HTMLScriptElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nsscript); }
diff --git a/dlls/mshtml/htmlselect.c b/dlls/mshtml/htmlselect.c index 1b867195595..88bec85597b 100644 --- a/dlls/mshtml/htmlselect.c +++ b/dlls/mshtml/htmlselect.c @@ -359,7 +359,7 @@ static void *HTMLOptionElement_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLOptionElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLOptionElement *This = HTMLOptionElement_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nsoption) note_cc_edge((nsISupports*)This->nsoption, "nsoption", cb); @@ -368,7 +368,7 @@ static void HTMLOptionElement_traverse(DispatchEx *dispex, nsCycleCollectionTrav static void HTMLOptionElement_unlink(DispatchEx *dispex) { HTMLOptionElement *This = HTMLOptionElement_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nsoption); }
@@ -1351,7 +1351,7 @@ static void *HTMLSelectElement_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLSelectElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLSelectElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nsselect) note_cc_edge((nsISupports*)This->nsselect, "nsselect", cb); @@ -1360,7 +1360,7 @@ static void HTMLSelectElement_traverse(DispatchEx *dispex, nsCycleCollectionTrav static void HTMLSelectElement_unlink(DispatchEx *dispex) { HTMLSelectElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nsselect); }
diff --git a/dlls/mshtml/htmlstyleelem.c b/dlls/mshtml/htmlstyleelem.c index 7deed937fe5..c69b0df505d 100644 --- a/dlls/mshtml/htmlstyleelem.c +++ b/dlls/mshtml/htmlstyleelem.c @@ -380,7 +380,7 @@ static void *HTMLStyleElement_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLStyleElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLStyleElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nsstyle) note_cc_edge((nsISupports*)This->nsstyle, "nsstyle", cb); @@ -389,7 +389,7 @@ static void HTMLStyleElement_traverse(DispatchEx *dispex, nsCycleCollectionTrave static void HTMLStyleElement_unlink(DispatchEx *dispex) { HTMLStyleElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nsstyle); }
diff --git a/dlls/mshtml/htmltable.c b/dlls/mshtml/htmltable.c index 85d1858fed7..2c18f840c0a 100644 --- a/dlls/mshtml/htmltable.c +++ b/dlls/mshtml/htmltable.c @@ -459,7 +459,7 @@ static void *HTMLTableCell_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLTableCell_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLTableCell *This = HTMLTableCell_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nscell) note_cc_edge((nsISupports*)This->nscell, "nstablecell", cb); @@ -468,7 +468,7 @@ static void HTMLTableCell_traverse(DispatchEx *dispex, nsCycleCollectionTraversa static void HTMLTableCell_unlink(DispatchEx *dispex) { HTMLTableCell *This = HTMLTableCell_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nscell); }
@@ -884,7 +884,7 @@ static void *HTMLTableRow_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLTableRow_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLTableRow *This = HTMLTableRow_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nsrow) note_cc_edge((nsISupports*)This->nsrow, "nstablerow", cb); @@ -893,7 +893,7 @@ static void HTMLTableRow_traverse(DispatchEx *dispex, nsCycleCollectionTraversal static void HTMLTableRow_unlink(DispatchEx *dispex) { HTMLTableRow *This = HTMLTableRow_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nsrow); }
@@ -1887,7 +1887,7 @@ static void *HTMLTable_query_interface(DispatchEx *dispex, REFIID riid) static void HTMLTable_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLTable *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nstable) note_cc_edge((nsISupports*)This->nstable, "nstable", cb); @@ -1896,7 +1896,7 @@ static void HTMLTable_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCal static void HTMLTable_unlink(DispatchEx *dispex) { HTMLTable *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nstable); }
diff --git a/dlls/mshtml/htmltextarea.c b/dlls/mshtml/htmltextarea.c index 8ecaefe246c..6964c1c06a0 100644 --- a/dlls/mshtml/htmltextarea.c +++ b/dlls/mshtml/htmltextarea.c @@ -425,7 +425,7 @@ static void *HTMLTextAreaElement_query_interface(DispatchEx *dispex, REFIID riid static void HTMLTextAreaElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLTextAreaElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_traverse(dispex, cb); + HTMLElement_traverse(dispex, cb);
if(This->nstextarea) note_cc_edge((nsISupports*)This->nstextarea, "nstextarea", cb); @@ -434,7 +434,7 @@ static void HTMLTextAreaElement_traverse(DispatchEx *dispex, nsCycleCollectionTr static void HTMLTextAreaElement_unlink(DispatchEx *dispex) { HTMLTextAreaElement *This = impl_from_DispatchEx(dispex); - HTMLDOMNode_unlink(dispex); + HTMLElement_unlink(dispex); unlink_ref(&This->nstextarea); }
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 504504dd1d4..23e1decc68b 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1204,6 +1204,8 @@ void HTMLDOMNode_init_dispex_info(dispex_data_t*,compat_mode_t);
void *HTMLElement_query_interface(DispatchEx*,REFIID); void HTMLElement_destructor(DispatchEx*); +void HTMLElement_traverse(DispatchEx*,nsCycleCollectionTraversalCallback*); +void HTMLElement_unlink(DispatchEx*); HRESULT HTMLElement_populate_props(DispatchEx*); HRESULT HTMLElement_clone(HTMLDOMNode*,nsIDOMNode*,HTMLDOMNode**); HRESULT HTMLElement_get_attr_col(HTMLDOMNode*,HTMLAttributeCollection**); diff --git a/dlls/mshtml/svg.c b/dlls/mshtml/svg.c index 1b9cf81c1cc..45b5c60063d 100644 --- a/dlls/mshtml/svg.c +++ b/dlls/mshtml/svg.c @@ -200,8 +200,8 @@ static const event_target_vtbl_t SVGElement_event_target_vtbl = { HTMLELEMENT_DISPEX_VTBL_ENTRIES, .query_interface= SVGElement_query_interface, .destructor = HTMLElement_destructor, - .traverse = HTMLDOMNode_traverse, - .unlink = HTMLDOMNode_unlink + .traverse = HTMLElement_traverse, + .unlink = HTMLElement_unlink }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, .handle_event = HTMLElement_handle_event @@ -751,8 +751,8 @@ static const event_target_vtbl_t SVGSVGElement_event_target_vtbl = { HTMLELEMENT_DISPEX_VTBL_ENTRIES, .query_interface= SVGSVGElement_query_interface, .destructor = HTMLElement_destructor, - .traverse = HTMLDOMNode_traverse, - .unlink = HTMLDOMNode_unlink + .traverse = HTMLElement_traverse, + .unlink = HTMLElement_unlink }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, .handle_event = HTMLElement_handle_event @@ -932,8 +932,8 @@ static const event_target_vtbl_t SVGCircleElement_event_target_vtbl = { HTMLELEMENT_DISPEX_VTBL_ENTRIES, .query_interface= SVGCircleElement_query_interface, .destructor = HTMLElement_destructor, - .traverse = HTMLDOMNode_traverse, - .unlink = HTMLDOMNode_unlink + .traverse = HTMLElement_traverse, + .unlink = HTMLElement_unlink }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, .handle_event = HTMLElement_handle_event @@ -1188,8 +1188,8 @@ static const event_target_vtbl_t SVGTSpanElement_event_target_vtbl = { HTMLELEMENT_DISPEX_VTBL_ENTRIES, .query_interface= SVGTSpanElement_query_interface, .destructor = HTMLElement_destructor, - .traverse = HTMLDOMNode_traverse, - .unlink = HTMLDOMNode_unlink + .traverse = HTMLElement_traverse, + .unlink = HTMLElement_unlink }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, .handle_event = HTMLElement_handle_event
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlcurstyle.c | 4 +++- dlls/mshtml/htmlelem.c | 24 ++++++++++++---------- dlls/mshtml/htmlstyle.c | 41 +++++++++++++++++++++++++++++++++----- dlls/mshtml/htmlstyle.h | 2 -- 4 files changed, 53 insertions(+), 18 deletions(-)
diff --git a/dlls/mshtml/htmlcurstyle.c b/dlls/mshtml/htmlcurstyle.c index 27ad42410c1..07f67d5cbf6 100644 --- a/dlls/mshtml/htmlcurstyle.c +++ b/dlls/mshtml/htmlcurstyle.c @@ -1295,7 +1295,9 @@ static void *HTMLCurrentStyle_query_interface(DispatchEx *dispex, REFIID riid)
static const dispex_static_data_vtbl_t HTMLCurrentStyle_dispex_vtbl = { CSSSTYLE_DISPEX_VTBL_ENTRIES, - .query_interface = HTMLCurrentStyle_query_interface + .query_interface = HTMLCurrentStyle_query_interface, + .traverse = CSSStyle_traverse, + .unlink = CSSStyle_unlink };
static const tid_t HTMLCurrentStyle_iface_tids[] = { diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index e3010d3f059..cfc84523436 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -6863,6 +6863,10 @@ void HTMLElement_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback HTMLElement *This = impl_from_DispatchEx(dispex); HTMLDOMNode_traverse(&This->node.event_target.dispex, cb);
+ if(This->style) + note_cc_edge((nsISupports*)&This->style->IHTMLStyle_iface, "style", cb); + if(This->runtime_style) + note_cc_edge((nsISupports*)&This->runtime_style->IHTMLStyle_iface, "runtime_style", cb); if(This->attrs) note_cc_edge((nsISupports*)&This->attrs->IHTMLAttributeCollection_iface, "attrs", cb); } @@ -6872,6 +6876,16 @@ void HTMLElement_unlink(DispatchEx *dispex) HTMLElement *This = impl_from_DispatchEx(dispex); HTMLDOMNode_unlink(&This->node.event_target.dispex);
+ if(This->style) { + HTMLStyle *style = This->style; + This->style = NULL; + IHTMLStyle_Release(&style->IHTMLStyle_iface); + } + if(This->runtime_style) { + HTMLStyle *runtime_style = This->runtime_style; + This->runtime_style = NULL; + IHTMLStyle_Release(&runtime_style->IHTMLStyle_iface); + } if(This->attrs) { HTMLAttributeCollection *attrs = This->attrs; This->attrs = NULL; @@ -6884,16 +6898,6 @@ void HTMLElement_destructor(DispatchEx *dispex) HTMLElement *This = impl_from_DispatchEx(dispex);
ConnectionPointContainer_Destroy(&This->cp_container); - - if(This->style) { - This->style->elem = NULL; - IHTMLStyle_Release(&This->style->IHTMLStyle_iface); - } - if(This->runtime_style) { - This->runtime_style->elem = NULL; - IHTMLStyle_Release(&This->runtime_style->IHTMLStyle_iface); - } - free(This->filter); HTMLDOMNode_destructor(&This->node.event_target.dispex); } diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c index 8c4af46836f..6dfa9744df3 100644 --- a/dlls/mshtml/htmlstyle.c +++ b/dlls/mshtml/htmlstyle.c @@ -9967,9 +9967,14 @@ HRESULT CSSStyle_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID * return DISP_E_UNKNOWNNAME; }
+static inline HTMLStyle *HTMLStyle_from_DispatchEx(DispatchEx *dispex) +{ + return CONTAINING_RECORD(dispex, HTMLStyle, css_style.dispex); +} + static void *HTMLStyle_query_interface(DispatchEx *dispex, REFIID riid) { - HTMLStyle *This = CONTAINING_RECORD(dispex, HTMLStyle, css_style.dispex); + HTMLStyle *This = HTMLStyle_from_DispatchEx(dispex);
if(IsEqualGUID(&IID_IHTMLStyle, riid)) return &This->IHTMLStyle_iface; @@ -9986,6 +9991,27 @@ static void *HTMLStyle_query_interface(DispatchEx *dispex, REFIID riid) return CSSStyle_query_interface(&This->css_style.dispex, riid); }
+static void HTMLStyle_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) +{ + HTMLStyle *This = HTMLStyle_from_DispatchEx(dispex); + CSSStyle_traverse(&This->css_style.dispex, cb); + + if(This->elem) + note_cc_edge((nsISupports*)&This->elem->node.IHTMLDOMNode_iface, "elem", cb); +} + +static void HTMLStyle_unlink(DispatchEx *dispex) +{ + HTMLStyle *This = HTMLStyle_from_DispatchEx(dispex); + CSSStyle_unlink(&This->css_style.dispex); + + if(This->elem) { + HTMLElement *elem = This->elem; + This->elem = NULL; + IHTMLDOMNode_Release(&elem->node.IHTMLDOMNode_iface); + } +} + void CSSStyle_init_dispex_info(dispex_data_t *info, compat_mode_t mode) { if(mode >= COMPAT_MODE_IE9) @@ -9994,9 +10020,11 @@ void CSSStyle_init_dispex_info(dispex_data_t *info, compat_mode_t mode) dispex_info_add_interface(info, IHTMLCSSStyleDeclaration2_tid, NULL); }
-static const dispex_static_data_vtbl_t CSSStyle_dispex_vtbl = { +static const dispex_static_data_vtbl_t HTMLStyle_dispex_vtbl = { CSSSTYLE_DISPEX_VTBL_ENTRIES, - .query_interface = HTMLStyle_query_interface + .query_interface = HTMLStyle_query_interface, + .traverse = HTMLStyle_traverse, + .unlink = HTMLStyle_unlink };
static const tid_t HTMLStyle_iface_tids[] = { @@ -10010,7 +10038,7 @@ static const tid_t HTMLStyle_iface_tids[] = { }; static dispex_static_data_t HTMLStyle_dispex = { "MSStyleCSSProperties", - &CSSStyle_dispex_vtbl, + &HTMLStyle_dispex_vtbl, DispHTMLStyle_tid, HTMLStyle_iface_tids, CSSStyle_init_dispex_info @@ -10088,6 +10116,7 @@ HRESULT HTMLStyle_Create(HTMLElement *elem, HTMLStyle **ret) style->IHTMLStyle6_iface.lpVtbl = &HTMLStyle6Vtbl;
style->elem = elem; + IHTMLDOMNode_AddRef(&elem->node.IHTMLDOMNode_iface);
init_css_style(&style->css_style, nsstyle, &HTMLStyle_dispex, dispex_compat_mode(&elem->node.event_target.dispex)); nsIDOMCSSStyleDeclaration_Release(nsstyle); @@ -10098,7 +10127,9 @@ HRESULT HTMLStyle_Create(HTMLElement *elem, HTMLStyle **ret)
static const dispex_static_data_vtbl_t HTMLW3CComputedStyle_dispex_vtbl = { CSSSTYLE_DISPEX_VTBL_ENTRIES, - .query_interface = CSSStyle_query_interface + .query_interface = CSSStyle_query_interface, + .traverse = CSSStyle_traverse, + .unlink = CSSStyle_unlink };
static const tid_t HTMLW3CComputedStyle_iface_tids[] = { diff --git a/dlls/mshtml/htmlstyle.h b/dlls/mshtml/htmlstyle.h index 5246e799ce5..f6d5ea7c5bb 100644 --- a/dlls/mshtml/htmlstyle.h +++ b/dlls/mshtml/htmlstyle.h @@ -166,6 +166,4 @@ HRESULT set_elem_style(HTMLElement*,styleid_t,const WCHAR*);
#define CSSSTYLE_DISPEX_VTBL_ENTRIES \ .destructor = CSSStyle_destructor, \ - .traverse = CSSStyle_traverse, \ - .unlink = CSSStyle_unlink, \ .get_dispid = CSSStyle_get_dispid
From: Gabriel Ivăncescu gabrielopcode@gmail.com
This was actually leaking even before the Cycle Collection was implemented.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlcurstyle.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/htmlcurstyle.c b/dlls/mshtml/htmlcurstyle.c index 07f67d5cbf6..29543eb4a18 100644 --- a/dlls/mshtml/htmlcurstyle.c +++ b/dlls/mshtml/htmlcurstyle.c @@ -1278,9 +1278,14 @@ static const IHTMLCurrentStyle4Vtbl HTMLCurrentStyle4Vtbl = { HTMLCurrentStyle4_get_maxWidth };
+static inline HTMLCurrentStyle *impl_from_DispatchEx(DispatchEx *dispex) +{ + return CONTAINING_RECORD(dispex, HTMLCurrentStyle, css_style.dispex); +} + static void *HTMLCurrentStyle_query_interface(DispatchEx *dispex, REFIID riid) { - HTMLCurrentStyle *This = CONTAINING_RECORD(dispex, HTMLCurrentStyle, css_style.dispex); + HTMLCurrentStyle *This = impl_from_DispatchEx(dispex);
if(IsEqualGUID(&IID_IHTMLCurrentStyle, riid)) return &This->IHTMLCurrentStyle_iface; @@ -1293,11 +1298,32 @@ static void *HTMLCurrentStyle_query_interface(DispatchEx *dispex, REFIID riid) return CSSStyle_query_interface(&This->css_style.dispex, riid); }
+static void HTMLCurrentStyle_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) +{ + HTMLCurrentStyle *This = impl_from_DispatchEx(dispex); + CSSStyle_traverse(&This->css_style.dispex, cb); + + if(This->elem) + note_cc_edge((nsISupports*)&This->elem->node.IHTMLDOMNode_iface, "elem", cb); +} + +static void HTMLCurrentStyle_unlink(DispatchEx *dispex) +{ + HTMLCurrentStyle *This = impl_from_DispatchEx(dispex); + CSSStyle_unlink(&This->css_style.dispex); + + if(This->elem) { + HTMLElement *elem = This->elem; + This->elem = NULL; + IHTMLDOMNode_Release(&elem->node.IHTMLDOMNode_iface); + } +} + static const dispex_static_data_vtbl_t HTMLCurrentStyle_dispex_vtbl = { CSSSTYLE_DISPEX_VTBL_ENTRIES, .query_interface = HTMLCurrentStyle_query_interface, - .traverse = CSSStyle_traverse, - .unlink = CSSStyle_unlink + .traverse = HTMLCurrentStyle_traverse, + .unlink = HTMLCurrentStyle_unlink };
static const tid_t HTMLCurrentStyle_iface_tids[] = {
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlstyleelem.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/dlls/mshtml/htmlstyleelem.c b/dlls/mshtml/htmlstyleelem.c index c69b0df505d..5b3d9165964 100644 --- a/dlls/mshtml/htmlstyleelem.c +++ b/dlls/mshtml/htmlstyleelem.c @@ -382,6 +382,8 @@ static void HTMLStyleElement_traverse(DispatchEx *dispex, nsCycleCollectionTrave HTMLStyleElement *This = impl_from_DispatchEx(dispex); HTMLElement_traverse(dispex, cb);
+ if(This->style_sheet) + note_cc_edge((nsISupports*)This->style_sheet, "style_sheet", cb); if(This->nsstyle) note_cc_edge((nsISupports*)This->nsstyle, "nsstyle", cb); } @@ -390,15 +392,8 @@ static void HTMLStyleElement_unlink(DispatchEx *dispex) { HTMLStyleElement *This = impl_from_DispatchEx(dispex); HTMLElement_unlink(dispex); - unlink_ref(&This->nsstyle); -} - -static void HTMLStyleElement_destructor(DispatchEx *dispex) -{ - HTMLStyleElement *This = impl_from_DispatchEx(dispex); - unlink_ref(&This->style_sheet); - HTMLElement_destructor(dispex); + unlink_ref(&This->nsstyle); }
static void HTMLStyleElement_init_dispex_info(dispex_data_t *info, compat_mode_t mode) @@ -429,7 +424,7 @@ static const event_target_vtbl_t HTMLStyleElement_event_target_vtbl = { { HTMLELEMENT_DISPEX_VTBL_ENTRIES, .query_interface= HTMLStyleElement_query_interface, - .destructor = HTMLStyleElement_destructor, + .destructor = HTMLElement_destructor, .traverse = HTMLStyleElement_traverse, .unlink = HTMLStyleElement_unlink },
This merge request was approved by Jacek Caban.