4d69c189ffd3b3f10b49914e5e0d8efdc8be4463
[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 "MemoryInstrumentation.h"
29 #include <wtf/ListHashSet.h>
30 #include <wtf/Vector.h>
31 #include <wtf/text/WTFString.h>
32
33 namespace WebCore {
34
35 class CSSRule;
36 class CSSStyleDeclaration;
37 class KURL;
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     CSSStyleDeclaration* ensureCSSStyleDeclaration() const;
107     CSSStyleDeclaration* ensureInlineCSSStyleDeclaration(const StyledElement* parentElement) const;
108
109     bool isMutable() const { return m_isMutable; }
110
111     static unsigned averageSizeInBytes();
112
113 #ifndef NDEBUG
114     void showStyle();
115 #endif
116     
117     void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
118     {
119         memoryObjectInfo->reportObjectInfo(this, MemoryInstrumentation::CSS);
120         if (m_isMutable)
121             memoryObjectInfo->reportPointer(m_mutablePropertyVector, MemoryInstrumentation::CSS);
122     }
123
124 private:
125     StylePropertySet(CSSParserMode);
126     StylePropertySet(const CSSProperty* properties, unsigned count, CSSParserMode, bool makeMutable);
127     StylePropertySet(const StylePropertySet&);
128
129     void setNeedsStyleRecalc();
130
131     String getShorthandValue(const StylePropertyShorthand&) const;
132     String getCommonValue(const StylePropertyShorthand&) const;
133     enum CommonValueMode { OmitUncommonValues, ReturnNullOnUncommonValues };
134     String borderPropertyValue(CommonValueMode) const;
135     String getLayeredShorthandValue(const StylePropertyShorthand&) const;
136     String get4Values(const StylePropertyShorthand&) const;
137     String borderSpacingValue(const StylePropertyShorthand&) const;
138     String fontValue() const;
139     bool appendFontLonghandValueIfExplicit(CSSPropertyID, StringBuilder& result) const;
140
141     bool removeShorthandProperty(CSSPropertyID);
142     bool propertyMatches(const CSSProperty*) const;
143
144     const CSSProperty* findPropertyWithId(CSSPropertyID) const;
145     CSSProperty* findPropertyWithId(CSSPropertyID);
146
147     void append(const CSSProperty&);
148     CSSProperty* array();
149     const CSSProperty* array() const;
150
151     unsigned m_cssParserMode : 2;
152     mutable unsigned m_ownsCSSOMWrapper : 1;
153     mutable unsigned m_isMutable : 1;
154     unsigned m_arraySize : 28;
155
156     union {
157         Vector<CSSProperty>* m_mutablePropertyVector;
158         void* m_properties;
159     };
160     
161     friend class PropertySetCSSStyleDeclaration;
162 };
163
164 inline CSSProperty& StylePropertySet::propertyAt(unsigned index)
165 {
166     if (isMutable())
167         return m_mutablePropertyVector->at(index);
168     return array()[index];
169 }
170
171 inline const CSSProperty& StylePropertySet::propertyAt(unsigned index) const
172 {
173     if (isMutable())
174         return m_mutablePropertyVector->at(index);
175     return array()[index];
176 }
177
178 inline unsigned StylePropertySet::propertyCount() const
179 {
180     if (isMutable())
181         return m_mutablePropertyVector->size();
182     return m_arraySize;
183 }
184
185 inline bool StylePropertySet::isEmpty() const
186 {
187     return !propertyCount();
188 }
189
190 inline CSSProperty* StylePropertySet::array()
191 {
192     ASSERT(!isMutable());
193     return reinterpret_cast<CSSProperty*>(&m_properties);
194 }
195
196 inline const CSSProperty* StylePropertySet::array() const
197 {
198     ASSERT(!isMutable());
199     return reinterpret_cast<const CSSProperty*>(&m_properties);
200 }
201
202 } // namespace WebCore
203
204 #endif // StylePropertySet_h