#ifndef StyledElement_h
#define StyledElement_h
#include "Element.h"
#include "StylePropertySet.h"
namespace WebCore {
class Attribute;
struct PresentationAttributeCacheKey;
class StyledElement : public Element {
public:
virtual ~StyledElement();
virtual StylePropertySet* additionalAttributeStyle() { return 0; }
void invalidateStyleAttribute();
const StylePropertySet* inlineStyle() const { return attributeData() ? attributeData()->inlineStyle() : 0; }
const StylePropertySet* ensureInlineStyle() { return ensureAttributeData()->ensureInlineStyle(this); }
bool setInlineStyleProperty(CSSPropertyID, int identifier, bool important = false);
bool setInlineStyleProperty(CSSPropertyID, double value, CSSPrimitiveValue::UnitTypes, bool important = false);
bool setInlineStyleProperty(CSSPropertyID, const String& value, bool important = false);
bool removeInlineStyleProperty(CSSPropertyID);
virtual CSSStyleDeclaration* style() OVERRIDE;
StylePropertySet* attributeStyle();
const SpaceSplitString& classNames() const;
virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) { }
protected:
StyledElement(const QualifiedName& name, Document* document, ConstructionType type)
: Element(name, document, type)
{
}
virtual void attributeChanged(Attribute*) OVERRIDE;
virtual void parseAttribute(Attribute*);
virtual void copyNonAttributeProperties(const Element*);
virtual bool isPresentationAttribute(const QualifiedName&) const { return false; }
void addPropertyToAttributeStyle(StylePropertySet*, CSSPropertyID, int identifier);
void addPropertyToAttributeStyle(StylePropertySet*, CSSPropertyID, double value, CSSPrimitiveValue::UnitTypes);
void addPropertyToAttributeStyle(StylePropertySet*, CSSPropertyID, const String& value);
virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const;
void classAttributeChanged(const AtomicString& newClassString);
private:
virtual void updateStyleAttribute() const;
void inlineStyleChanged();
void makePresentationAttributeCacheKey(PresentationAttributeCacheKey&) const;
void updateAttributeStyle();
void destroyInlineStyle()
{
if (attributeData())
attributeData()->destroyInlineStyle(this);
}
};
inline const SpaceSplitString& StyledElement::classNames() const
{
ASSERT(hasClass());
ASSERT(attributeData());
return attributeData()->classNames();
}
inline void StyledElement::invalidateStyleAttribute()
{
clearIsStyleAttributeValid();
}
inline StylePropertySet* StyledElement::attributeStyle()
{
if (attributeStyleDirty())
updateAttributeStyle();
return attributeData() ? attributeData()->attributeStyle() : 0;
}
}
#endif