mshtml: Store style object in element object.
This commit is contained in:
parent
0131e0472f
commit
1745abfa26
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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*);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue