Don't reuse cached stylesheet with failed or canceled resource loads
[WebKit-https.git] / Source / WebCore / css / CSSValue.h
1 /*
2  * (C) 1999-2003 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2004, 2005, 2006, 2007, 2008 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 CSSValue_h
22 #define CSSValue_h
23
24 #include "ExceptionCode.h"
25 #include "KURLHash.h"
26 #include <wtf/ListHashSet.h>
27 #include <wtf/RefCounted.h>
28 #include <wtf/RefPtr.h>
29
30 namespace WebCore {
31
32 class StyleSheetContents;
33     
34 // FIXME: The current CSSValue and subclasses should be turned into internal types (StyleValue).
35 // The few subtypes that are actually exposed in CSSOM can be seen in the cloneForCSSOM() function.
36 // They should be handled by separate wrapper classes.
37
38 // Please don't expose more CSSValue types to the web.
39 class CSSValue : public RefCounted<CSSValue> {
40 public:
41     enum Type {
42         CSS_INHERIT = 0,
43         CSS_PRIMITIVE_VALUE = 1,
44         CSS_VALUE_LIST = 2,
45         CSS_CUSTOM = 3,
46         CSS_INITIAL = 4
47
48     };
49
50     // Override RefCounted's deref() to ensure operator delete is called on
51     // the appropriate subclass type.
52     void deref()
53     {
54         if (derefBase())
55             destroy();
56     }
57
58     Type cssValueType() const;
59
60     String cssText() const;
61     void setCssText(const String&, ExceptionCode&) { } // FIXME: Not implemented.
62 #if ENABLE(CSS_VARIABLES)
63     String serializeResolvingVariables(const HashMap<AtomicString, String>&) const;
64 #endif
65
66     bool isPrimitiveValue() const { return m_classType == PrimitiveClass; }
67     bool isValueList() const { return m_classType >= ValueListClass; }
68
69     bool isAspectRatioValue() const { return m_classType == AspectRatioClass; }
70     bool isBorderImageSliceValue() const { return m_classType == BorderImageSliceClass; }
71     bool isCursorImageValue() const { return m_classType == CursorImageClass; }
72     bool isFontFeatureValue() const { return m_classType == FontFeatureClass; }
73     bool isFontValue() const { return m_classType == FontClass; }
74     bool isImageGeneratorValue() const { return m_classType >= CanvasClass && m_classType <= RadialGradientClass; }
75     bool isGradientValue() const { return m_classType >= LinearGradientClass && m_classType <= RadialGradientClass; }
76 #if ENABLE(CSS_IMAGE_SET)
77     bool isImageSetValue() const { return m_classType == ImageSetClass; }
78 #endif
79     bool isImageValue() const { return m_classType == ImageClass || m_classType == CursorImageClass; }
80     bool isImplicitInitialValue() const;
81     bool isInheritedValue() const { return m_classType == InheritedClass; }
82     bool isInitialValue() const { return m_classType == InitialClass; }
83     bool isReflectValue() const { return m_classType == ReflectClass; }
84     bool isShadowValue() const { return m_classType == ShadowClass; }
85     bool isCubicBezierTimingFunctionValue() const { return m_classType == CubicBezierTimingFunctionClass; }
86     bool isLinearTimingFunctionValue() const { return m_classType == LinearTimingFunctionClass; }
87     bool isStepsTimingFunctionValue() const { return m_classType == StepsTimingFunctionClass; }
88     bool isWebKitCSSTransformValue() const { return m_classType == WebKitCSSTransformClass; }
89     bool isCSSLineBoxContainValue() const { return m_classType == LineBoxContainClass; }
90     bool isCalculationValue() const {return m_classType == CalculationClass; }
91 #if ENABLE(CSS_FILTERS)
92     bool isWebKitCSSFilterValue() const { return m_classType == WebKitCSSFilterClass; }
93 #if ENABLE(CSS_SHADERS)
94     bool isWebKitCSSShaderValue() const { return m_classType == WebKitCSSShaderClass; }
95 #endif
96 #endif // ENABLE(CSS_FILTERS)
97 #if ENABLE(CSS_VARIABLES)
98     bool isVariableValue() const { return m_classType == VariableClass; }
99 #endif
100 #if ENABLE(SVG)
101     bool isSVGColor() const { return m_classType == SVGColorClass || m_classType == SVGPaintClass; }
102     bool isSVGPaint() const { return m_classType == SVGPaintClass; }
103     bool isWebKitCSSSVGDocumentValue() const { return m_classType == WebKitCSSSVGDocumentClass; }
104 #endif
105     
106     bool isCSSOMSafe() const { return m_isCSSOMSafe; }
107     bool isSubtypeExposedToCSSOM() const
108     { 
109         return isPrimitiveValue() 
110 #if ENABLE(SVG)
111             || isSVGColor()
112 #endif
113             || isValueList();
114     }
115
116     PassRefPtr<CSSValue> cloneForCSSOM() const;
117
118     void addSubresourceStyleURLs(ListHashSet<KURL>&, const StyleSheetContents*) const;
119
120     bool hasFailedOrCanceledSubresources() const;
121
122 protected:
123
124     static const size_t ClassTypeBits = 5;
125     enum ClassType {
126         PrimitiveClass,
127
128         // Image classes.
129         ImageClass,
130         CursorImageClass,
131
132         // Image generator classes.
133         CanvasClass,
134         CrossfadeClass,
135         LinearGradientClass,
136         RadialGradientClass,
137
138         // Timing function classes.
139         CubicBezierTimingFunctionClass,
140         LinearTimingFunctionClass,
141         StepsTimingFunctionClass,
142
143         // Other class types.
144         AspectRatioClass,
145         BorderImageSliceClass,
146         FontFeatureClass,
147         FontClass,
148         FontFaceSrcClass,
149         FunctionClass,
150
151         InheritedClass,
152         InitialClass,
153
154         ReflectClass,
155         ShadowClass,
156         UnicodeRangeClass,
157         LineBoxContainClass,
158         CalculationClass,
159 #if ENABLE(CSS_FILTERS) && ENABLE(CSS_SHADERS)
160         WebKitCSSShaderClass,
161 #endif
162 #if ENABLE(CSS_VARIABLES)
163         VariableClass,
164 #endif
165 #if ENABLE(SVG)
166         SVGColorClass,
167         SVGPaintClass,
168         WebKitCSSSVGDocumentClass,
169 #endif
170
171         // List class types must appear after ValueListClass.
172         ValueListClass,
173 #if ENABLE(CSS_IMAGE_SET)
174         ImageSetClass,
175 #endif
176 #if ENABLE(CSS_FILTERS)
177         WebKitCSSFilterClass,
178 #endif
179         WebKitCSSTransformClass,
180         // Do not append non-list class types here.
181     };
182
183     static const size_t ValueListSeparatorBits = 2;
184     enum ValueListSeparator {
185         SpaceSeparator,
186         CommaSeparator,
187         SlashSeparator
188     };
189
190     ClassType classType() const { return static_cast<ClassType>(m_classType); }
191
192     explicit CSSValue(ClassType classType, bool isCSSOMSafe = false)
193         : m_isCSSOMSafe(isCSSOMSafe)
194         , m_isTextClone(false)
195         , m_primitiveUnitType(0)
196         , m_hasCachedCSSText(false)
197         , m_isQuirkValue(false)
198         , m_valueListSeparator(SpaceSeparator)
199         , m_classType(classType)
200     {
201     }
202
203     // NOTE: This class is non-virtual for memory and performance reasons.
204     // Don't go making it virtual again unless you know exactly what you're doing!
205
206     ~CSSValue() { }
207
208 private:
209     void destroy();
210
211 protected:
212     unsigned m_isCSSOMSafe : 1;
213     unsigned m_isTextClone : 1;
214     // The bits in this section are only used by specific subclasses but kept here
215     // to maximize struct packing.
216
217     // CSSPrimitiveValue bits:
218     unsigned m_primitiveUnitType : 7; // CSSPrimitiveValue::UnitTypes
219     mutable unsigned m_hasCachedCSSText : 1;
220     unsigned m_isQuirkValue : 1;
221
222     unsigned m_valueListSeparator : ValueListSeparatorBits;
223
224 private:
225     unsigned m_classType : ClassTypeBits; // ClassType
226 };
227
228 } // namespace WebCore
229
230 #endif // CSSValue_h