a6d5819a347a5acb72b7c47e952d50fbbbf5c5a8
[WebKit-https.git] / Source / WebCore / css / StylePropertySet.h
1 /*
2  * (C) 1999-2003 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2004, 2005, 2006, 2008, 2012 Apple Inc. All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #ifndef StylePropertySet_h
22 #define StylePropertySet_h
23
24 #include "CSSParserMode.h"
25 #include "CSSPrimitiveValue.h"
26 #include "CSSProperty.h"
27 #include "CSSPropertyNames.h"
28 #include <wtf/ListHashSet.h>
29 #include <wtf/Vector.h>
30 #include <wtf/text/WTFString.h>
31
32 namespace WebCore {
33
34 class CSSRule;
35 class CSSStyleDeclaration;
36 class KURL;
37 class MemoryObjectInfo;
38 class PropertySetCSSStyleDeclaration;
39 class StyledElement;
40 class StylePropertyShorthand;
41 class StyleSheetContents;
42
43 class StylePropertySet : public RefCounted<StylePropertySet> {
44 public:
45     ~StylePropertySet();
46
47     static PassRefPtr<StylePropertySet> create(CSSParserMode cssParserMode = CSSQuirksMode)
48     {
49         return adoptRef(new StylePropertySet(cssParserMode));
50     }
51     static PassRefPtr<StylePropertySet> create(const CSSProperty* properties, unsigned count)
52     {
53         return adoptRef(new StylePropertySet(properties, count, CSSStrictMode, /* makeMutable */ true));
54     }
55     static PassRefPtr<StylePropertySet> createImmutable(const CSSProperty* properties, unsigned count, CSSParserMode);
56
57     unsigned propertyCount() const;
58     bool isEmpty() const;
59     const CSSProperty& propertyAt(unsigned index) const;
60     CSSProperty& propertyAt(unsigned index);
61
62     PassRefPtr<CSSValue> getPropertyCSSValue(CSSPropertyID) const;
63     String getPropertyValue(CSSPropertyID) const;
64     bool propertyIsImportant(CSSPropertyID) const;
65     CSSPropertyID getPropertyShorthand(CSSPropertyID) const;
66     bool isPropertyImplicit(CSSPropertyID) const;
67
68     // These expand shorthand properties into multiple properties.
69     bool setProperty(CSSPropertyID, const String& value, bool important = false, StyleSheetContents* contextStyleSheet = 0);
70     void setProperty(CSSPropertyID, PassRefPtr<CSSValue>, bool important = false);
71
72     // These do not. FIXME: This is too messy, we can do better.
73     bool setProperty(CSSPropertyID, int identifier, bool important = false);
74     void setProperty(const CSSProperty&, CSSProperty* slot = 0);
75     
76     bool removeProperty(CSSPropertyID, String* returnText = 0);
77
78     void parseDeclaration(const String& styleDeclaration, StyleSheetContents* contextStyleSheet);
79
80     void addParsedProperties(const Vector<CSSProperty>&);
81     void addParsedProperty(const CSSProperty&);
82
83     PassRefPtr<StylePropertySet> copyBlockProperties() const;
84     void removeBlockProperties();
85     bool removePropertiesInSet(const CSSPropertyID* set, unsigned length);
86
87     void mergeAndOverrideOnConflict(const StylePropertySet*);
88
89     void setCSSParserMode(CSSParserMode);
90     CSSParserMode cssParserMode() const { return static_cast<CSSParserMode>(m_cssParserMode); }
91
92     void addSubresourceStyleURLs(ListHashSet<KURL>&, StyleSheetContents* contextStyleSheet) const;
93
94     PassRefPtr<StylePropertySet> copy() const;
95
96     // Used by StyledElement::copyNonAttributeProperties().
97     void copyPropertiesFrom(const StylePropertySet&);
98
99     void removeEquivalentProperties(const StylePropertySet*);
100     void removeEquivalentProperties(const CSSStyleDeclaration*);
101
102     PassRefPtr<StylePropertySet> copyPropertiesInSet(const CSSPropertyID* set, unsigned length) const;
103     
104     String asText() const;
105     
106     void clearParentElement(StyledElement*);
107
108     CSSStyleDeclaration* ensureCSSStyleDeclaration() const;
109     CSSStyleDeclaration* ensureInlineCSSStyleDeclaration(const StyledElement* parentElement) const;
110
111     bool isMutable() const { return m_isMutable; }
112
113     static unsigned averageSizeInBytes();
114     void reportMemoryUsage(MemoryObjectInfo*) const;
115
116 #ifndef NDEBUG
117     void showStyle();
118 #endif
119     
120 private:
121     StylePropertySet(CSSParserMode);
122     StylePropertySet(const CSSProperty* properties, unsigned count, CSSParserMode, bool makeMutable);
123     StylePropertySet(const StylePropertySet&);
124
125     void setNeedsStyleRecalc();
126
127     String getShorthandValue(const StylePropertyShorthand&) const;
128     String getCommonValue(const StylePropertyShorthand&) const;
129     enum CommonValueMode { OmitUncommonValues, ReturnNullOnUncommonValues };
130     String borderPropertyValue(CommonValueMode) const;
131     String getLayeredShorthandValue(const StylePropertyShorthand&) const;
132     String get4Values(const StylePropertyShorthand&) const;
133     String borderSpacingValue(const StylePropertyShorthand&) const;
134     String fontValue() const;
135     bool appendFontLonghandValueIfExplicit(CSSPropertyID, StringBuilder& result) const;
136
137     bool removeShorthandProperty(CSSPropertyID);
138     bool propertyMatches(const CSSProperty*) const;
139
140     const CSSProperty* findPropertyWithId(CSSPropertyID) const;
141     CSSProperty* findPropertyWithId(CSSPropertyID);
142
143     void append(const CSSProperty&);
144     CSSProperty* array();
145     const CSSProperty* array() const;
146
147     unsigned m_cssParserMode : 2;
148     mutable unsigned m_ownsCSSOMWrapper : 1;
149     mutable unsigned m_isMutable : 1;
150     unsigned m_arraySize : 28;
151
152     union {
153         Vector<CSSProperty>* m_mutablePropertyVector;
154         void* m_properties;
155     };
156     
157     friend class PropertySetCSSStyleDeclaration;
158 };
159
160 inline CSSProperty& StylePropertySet::propertyAt(unsigned index)
161 {
162     if (isMutable())
163         return m_mutablePropertyVector->at(index);
164     return array()[index];
165 }
166
167 inline const CSSProperty& StylePropertySet::propertyAt(unsigned index) const
168 {
169     if (isMutable())
170         return m_mutablePropertyVector->at(index);
171     return array()[index];
172 }
173
174 inline unsigned StylePropertySet::propertyCount() const
175 {
176     if (isMutable())
177         return m_mutablePropertyVector->size();
178     return m_arraySize;
179 }
180
181 inline bool StylePropertySet::isEmpty() const
182 {
183     return !propertyCount();
184 }
185
186 inline CSSProperty* StylePropertySet::array()
187 {
188     ASSERT(!isMutable());
189     return reinterpret_cast<CSSProperty*>(&m_properties);
190 }
191
192 inline const CSSProperty* StylePropertySet::array() const
193 {
194     ASSERT(!isMutable());
195     return reinterpret_cast<const CSSProperty*>(&m_properties);
196 }
197
198 } // namespace WebCore
199
200 #endif // StylePropertySet_h