mshtml: Store style object in element object.

This commit is contained in:
Jacek Caban 2011-02-28 13:13:12 +01:00 committed by Alexandre Julliard
parent 0131e0472f
commit 1745abfa26
4 changed files with 57 additions and 34 deletions

View File

@ -33,6 +33,7 @@
#include "mshtml_private.h" #include "mshtml_private.h"
#include "htmlevent.h" #include "htmlevent.h"
#include "htmlstyle.h"
static const WCHAR aW[] = {'A',0}; static const WCHAR aW[] = {'A',0};
static const WCHAR bodyW[] = {'B','O','D','Y',0}; static const WCHAR bodyW[] = {'B','O','D','Y',0};
@ -423,35 +424,42 @@ static HRESULT WINAPI HTMLElement_get_parentElement(IHTMLElement *iface, IHTMLEl
static HRESULT WINAPI HTMLElement_get_style(IHTMLElement *iface, IHTMLStyle **p) static HRESULT WINAPI HTMLElement_get_style(IHTMLElement *iface, IHTMLStyle **p)
{ {
HTMLElement *This = impl_from_IHTMLElement(iface); HTMLElement *This = impl_from_IHTMLElement(iface);
nsIDOMElementCSSInlineStyle *nselemstyle;
nsIDOMCSSStyleDeclaration *nsstyle;
nsresult nsres;
TRACE("(%p)->(%p)\n", This, p); TRACE("(%p)->(%p)\n", This, p);
if(!This->nselem) { if(!This->style) {
FIXME("NULL nselem\n"); nsIDOMElementCSSInlineStyle *nselemstyle;
return E_NOTIMPL; nsIDOMCSSStyleDeclaration *nsstyle;
nsresult nsres;
HRESULT hres;
if(!This->nselem) {
FIXME("NULL nselem\n");
return E_NOTIMPL;
}
nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMElementCSSInlineStyle,
(void**)&nselemstyle);
if(NS_FAILED(nsres)) {
ERR("Coud not get nsIDOMCSSStyleDeclaration interface: %08x\n", nsres);
return E_FAIL;
}
nsres = nsIDOMElementCSSInlineStyle_GetStyle(nselemstyle, &nsstyle);
nsIDOMElementCSSInlineStyle_Release(nselemstyle);
if(NS_FAILED(nsres)) {
ERR("GetStyle failed: %08x\n", nsres);
return E_FAIL;
}
hres = HTMLStyle_Create(nsstyle, &This->style);
nsIDOMCSSStyleDeclaration_Release(nsstyle);
if(FAILED(hres))
return hres;
} }
nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMElementCSSInlineStyle, *p = &This->style->IHTMLStyle_iface;
(void**)&nselemstyle); IHTMLStyle_AddRef(*p);
if(NS_FAILED(nsres)) {
ERR("Coud not get nsIDOMCSSStyleDeclaration interface: %08x\n", nsres);
return E_FAIL;
}
nsres = nsIDOMElementCSSInlineStyle_GetStyle(nselemstyle, &nsstyle);
nsIDOMElementCSSInlineStyle_Release(nselemstyle);
if(NS_FAILED(nsres)) {
ERR("GetStyle failed: %08x\n", nsres);
return E_FAIL;
}
/* FIXME: Store style instead of creating a new instance in each call */
*p = HTMLStyle_Create(nsstyle);
nsIDOMCSSStyleDeclaration_Release(nsstyle);
return S_OK; return S_OK;
} }
@ -1644,6 +1652,8 @@ void HTMLElement_destructor(HTMLDOMNode *iface)
if(This->nselem) if(This->nselem)
nsIDOMHTMLElement_Release(This->nselem); nsIDOMHTMLElement_Release(This->nselem);
if(This->style)
IHTMLStyle_Release(&This->style->IHTMLStyle_iface);
HTMLDOMNode_destructor(&This->node); HTMLDOMNode_destructor(&This->node);
} }

View File

@ -2902,19 +2902,24 @@ static dispex_static_data_t HTMLStyle_dispex = {
HTMLStyle_iface_tids HTMLStyle_iface_tids
}; };
IHTMLStyle *HTMLStyle_Create(nsIDOMCSSStyleDeclaration *nsstyle) HRESULT HTMLStyle_Create(nsIDOMCSSStyleDeclaration *nsstyle, HTMLStyle **ret)
{ {
HTMLStyle *ret = heap_alloc_zero(sizeof(HTMLStyle)); HTMLStyle *style;
ret->IHTMLStyle_iface.lpVtbl = &HTMLStyleVtbl; style = heap_alloc_zero(sizeof(HTMLStyle));
ret->ref = 1; if(!style)
ret->nsstyle = nsstyle; return E_OUTOFMEMORY;
HTMLStyle2_Init(ret);
HTMLStyle3_Init(ret); style->IHTMLStyle_iface.lpVtbl = &HTMLStyleVtbl;
style->ref = 1;
style->nsstyle = nsstyle;
HTMLStyle2_Init(style);
HTMLStyle3_Init(style);
nsIDOMCSSStyleDeclaration_AddRef(nsstyle); nsIDOMCSSStyleDeclaration_AddRef(nsstyle);
init_dispex(&ret->dispex, (IUnknown*)&ret->IHTMLStyle_iface, &HTMLStyle_dispex); init_dispex(&style->dispex, (IUnknown*)&style->IHTMLStyle_iface, &HTMLStyle_dispex);
return &ret->IHTMLStyle_iface; *ret = style;
return S_OK;
} }

View File

@ -560,6 +560,7 @@ typedef struct {
IHTMLElement4 IHTMLElement4_iface; IHTMLElement4 IHTMLElement4_iface;
nsIDOMHTMLElement *nselem; nsIDOMHTMLElement *nselem;
HTMLStyle *style;
} HTMLElement; } HTMLElement;
#define HTMLELEMENT_TIDS \ #define HTMLELEMENT_TIDS \
@ -730,7 +731,7 @@ void set_ready_state(HTMLWindow*,READYSTATE);
HRESULT HTMLSelectionObject_Create(HTMLDocumentNode*,nsISelection*,IHTMLSelectionObject**); HRESULT HTMLSelectionObject_Create(HTMLDocumentNode*,nsISelection*,IHTMLSelectionObject**);
HRESULT HTMLTxtRange_Create(HTMLDocumentNode*,nsIDOMRange*,IHTMLTxtRange**); HRESULT HTMLTxtRange_Create(HTMLDocumentNode*,nsIDOMRange*,IHTMLTxtRange**);
IHTMLStyle *HTMLStyle_Create(nsIDOMCSSStyleDeclaration*); HRESULT HTMLStyle_Create(nsIDOMCSSStyleDeclaration*,HTMLStyle**);
IHTMLStyleSheet *HTMLStyleSheet_Create(nsIDOMStyleSheet*); IHTMLStyleSheet *HTMLStyleSheet_Create(nsIDOMStyleSheet*);
IHTMLStyleSheetsCollection *HTMLStyleSheetsCollection_Create(nsIDOMStyleSheetList*); IHTMLStyleSheetsCollection *HTMLStyleSheetsCollection_Create(nsIDOMStyleSheetList*);

View File

@ -5610,6 +5610,13 @@ static void test_style_filters(IHTMLElement *elem)
test_style_filter(style, NULL); test_style_filter(style, NULL);
set_style_filter(style, "alpha(opacity=50.00000)"); set_style_filter(style, "alpha(opacity=50.00000)");
set_style_filter(style, "alpha(opacity=100)"); set_style_filter(style, "alpha(opacity=100)");
IHTMLStyle_Release(style);
hres = IHTMLElement_get_style(elem, &style);
ok(hres == S_OK, "get_style failed: %08x\n", hres);
test_style_filter(style, "alpha(opacity=100)");
set_style_filter(style, "xxx(a,b,c) alpha(opacity=100)"); set_style_filter(style, "xxx(a,b,c) alpha(opacity=100)");
set_style_filter(style, NULL); set_style_filter(style, NULL);