Don't reuse cached stylesheet with failed or canceled resource loads
[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     bool hasFailedOrCanceledSubresources() const;
114
115     static unsigned averageSizeInBytes();
116     void reportMemoryUsage(MemoryObjectInfo*) const;
117
118 #ifndef NDEBUG
119     void showStyle();
120 #endif
121     
122 private:
123     StylePropertySet(CSSParserMode);
124     StylePropertySet(const CSSProperty* properties, unsigned count, CSSParserMode, bool makeMutable);
125     StylePropertySet(const StylePropertySet&);
126
127     void setNeedsStyleRecalc();
128
129     String getShorthandValue(const StylePropertyShorthand&) const;
130     String getCommonValue(const StylePropertyShorthand&) const;
131     enum CommonValueMode { OmitUncommonValues, ReturnNullOnUncommonValues };
132     String borderPropertyValue(CommonValueMode) const;
133     String getLayeredShorthandValue(const StylePropertyShorthand&) const;
134     String get4Values(const StylePropertyShorthand&) const;
135     String borderSpacingValue(const StylePropertyShorthand&) const;
136     String fontValue() const;
137     bool appendFontLonghandValueIfExplicit(CSSPropertyID, StringBuilder& result) const;
138
139     bool removeShorthandProperty(CSSPropertyID);
140     bool propertyMatches(const CSSProperty*) const;
141
142     const CSSProperty* findPropertyWithId(CSSPropertyID) const;
143     CSSProperty* findPropertyWithId(CSSPropertyID);
144
145     void append(const CSSProperty&);
146     CSSProperty* array();
147     const CSSProperty* array() const;
148
149     unsigned m_cssParserMode : 2;
150     mutable unsigned m_ownsCSSOMWrapper : 1;
151     mutable unsigned m_isMutable : 1;
152     unsigned m_arraySize : 28;
153
154     union {
155         Vector<CSSProperty>* m_mutablePropertyVector;
156         void* m_properties;
157     };
158     
159     friend class PropertySetCSSStyleDeclaration;
160 };
161
162 inline CSSProperty& StylePropertySet::propertyAt(unsigned index)
163 {
164     if (isMutable())
165         return m_mutablePropertyVector->at(index);
166     return array()[index];
167 }
168
169 inline const CSSProperty& StylePropertySet::propertyAt(unsigned index) const
170 {
171     if (isMutable())
172         return m_mutablePropertyVector->at(index);
173     return array()[index];
174 }
175
176 inline unsigned StylePropertySet::propertyCount() const
177 {
178     if (isMutable())
179         return m_mutablePropertyVector->size();
180     return m_arraySize;
181 }
182
183 inline bool StylePropertySet::isEmpty() const
184 {
185     return !propertyCount();
186 }
187
188 inline CSSProperty* StylePropertySet::array()
189 {
190     ASSERT(!isMutable());
191     return reinterpret_cast<CSSProperty*>(&m_properties);
192 }
193
194 inline const CSSProperty* StylePropertySet::array() const
195 {
196     ASSERT(!isMutable());
197     return reinterpret_cast<const CSSProperty*>(&m_properties);
198 }
199
200 } // namespace WebCore
201
202 #endif // StylePropertySet_h