diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index 7084105420d..1eab2cdaaaf 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -507,7 +507,7 @@ static HRESULT WINAPI HTMLElement_get_style(IHTMLElement *iface, IHTMLStyle **p)
return E_FAIL;
}
- hres = HTMLStyle_Create(nsstyle, &This->style);
+ hres = HTMLStyle_Create(This, nsstyle, &This->style);
nsIDOMCSSStyleDeclaration_Release(nsstyle);
if(FAILED(hres))
return hres;
@@ -1648,8 +1648,10 @@ void HTMLElement_destructor(HTMLDOMNode *iface)
if(This->nselem)
nsIDOMHTMLElement_Release(This->nselem);
- if(This->style)
+ if(This->style) {
+ This->style->elem = NULL;
IHTMLStyle_Release(&This->style->IHTMLStyle_iface);
+ }
if(This->attrs) {
HTMLDOMAttribute *attr;
@@ -1660,6 +1662,8 @@ void HTMLElement_destructor(HTMLDOMNode *iface)
IHTMLAttributeCollection_Release(&This->attrs->IHTMLAttributeCollection_iface);
}
+ heap_free(This->filter);
+
HTMLDOMNode_destructor(&This->node);
}
diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c
index 0487992a5ec..06a9a5382b9 100644
--- a/dlls/mshtml/htmlstyle.c
+++ b/dlls/mshtml/htmlstyle.c
@@ -694,7 +694,6 @@ static ULONG WINAPI HTMLStyle_Release(IHTMLStyle *iface)
if(!ref) {
if(This->nsstyle)
nsIDOMCSSStyleDeclaration_Release(This->nsstyle);
- heap_free(This->filter);
release_dispex(&This->dispex);
heap_free(This);
}
@@ -2597,7 +2596,7 @@ static void set_opacity(HTMLStyle *This, const WCHAR *val)
static void update_filter(HTMLStyle *This)
{
- const WCHAR *ptr = This->filter, *ptr2;
+ const WCHAR *ptr = This->elem->filter, *ptr2;
static const WCHAR alphaW[] = {'a','l','p','h','a'};
@@ -2683,14 +2682,19 @@ static HRESULT WINAPI HTMLStyle_put_filter(IHTMLStyle *iface, BSTR v)
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
+ if(!This->elem) {
+ FIXME("Element already destroyed\n");
+ return E_UNEXPECTED;
+ }
+
if(v) {
new_filter = heap_strdupW(v);
if(!new_filter)
return E_OUTOFMEMORY;
}
- heap_free(This->filter);
- This->filter = new_filter;
+ heap_free(This->elem->filter);
+ This->elem->filter = new_filter;
update_filter(This);
return S_OK;
@@ -2702,8 +2706,13 @@ static HRESULT WINAPI HTMLStyle_get_filter(IHTMLStyle *iface, BSTR *p)
TRACE("(%p)->(%p)\n", This, p);
- if(This->filter) {
- *p = SysAllocString(This->filter);
+ if(!This->elem) {
+ FIXME("Element already destroyed\n");
+ return E_UNEXPECTED;
+ }
+
+ if(This->elem->filter) {
+ *p = SysAllocString(This->elem->filter);
if(!*p)
return E_OUTOFMEMORY;
}else {
@@ -3038,7 +3047,7 @@ static dispex_static_data_t HTMLStyle_dispex = {
HTMLStyle_iface_tids
};
-HRESULT HTMLStyle_Create(nsIDOMCSSStyleDeclaration *nsstyle, HTMLStyle **ret)
+HRESULT HTMLStyle_Create(HTMLElement *elem, nsIDOMCSSStyleDeclaration *nsstyle, HTMLStyle **ret)
{
HTMLStyle *style;
@@ -3049,6 +3058,7 @@ HRESULT HTMLStyle_Create(nsIDOMCSSStyleDeclaration *nsstyle, HTMLStyle **ret)
style->IHTMLStyle_iface.lpVtbl = &HTMLStyleVtbl;
style->ref = 1;
style->nsstyle = nsstyle;
+ style->elem = elem;
HTMLStyle2_Init(style);
HTMLStyle3_Init(style);
diff --git a/dlls/mshtml/htmlstyle.h b/dlls/mshtml/htmlstyle.h
index a11161eb8ef..ef4f2a256aa 100644
--- a/dlls/mshtml/htmlstyle.h
+++ b/dlls/mshtml/htmlstyle.h
@@ -28,7 +28,7 @@ struct HTMLStyle {
LONG ref;
nsIDOMCSSStyleDeclaration *nsstyle;
- WCHAR *filter;
+ HTMLElement *elem;
};
/* NOTE: Make sure to keep in sync with style_tbl in htmlstyle.c */
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 75591f2e959..9e3046434d6 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -556,6 +556,7 @@ typedef struct {
nsIDOMHTMLElement *nselem;
HTMLStyle *style;
HTMLAttributeCollection *attrs;
+ WCHAR *filter;
} HTMLElement;
#define HTMLELEMENT_TIDS \
@@ -722,7 +723,7 @@ void set_ready_state(HTMLWindow*,READYSTATE) DECLSPEC_HIDDEN;
HRESULT HTMLSelectionObject_Create(HTMLDocumentNode*,nsISelection*,IHTMLSelectionObject**) DECLSPEC_HIDDEN;
HRESULT HTMLTxtRange_Create(HTMLDocumentNode*,nsIDOMRange*,IHTMLTxtRange**) DECLSPEC_HIDDEN;
-HRESULT HTMLStyle_Create(nsIDOMCSSStyleDeclaration*,HTMLStyle**) DECLSPEC_HIDDEN;
+HRESULT HTMLStyle_Create(HTMLElement*,nsIDOMCSSStyleDeclaration*,HTMLStyle**) DECLSPEC_HIDDEN;
IHTMLStyleSheet *HTMLStyleSheet_Create(nsIDOMStyleSheet*) DECLSPEC_HIDDEN;
IHTMLStyleSheetsCollection *HTMLStyleSheetsCollection_Create(nsIDOMStyleSheetList*) DECLSPEC_HIDDEN;