Web Inspector: NMI: migrate core instrumentation code to WTF namespace
[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 isBaseValueList() const { return m_classType == ValueListClass; }
70         
71
72     bool isAspectRatioValue() const { return m_classType == AspectRatioClass; }
73     bool isBorderImageSliceValue() const { return m_classType == BorderImageSliceClass; }
74     bool isCursorImageValue() const { return m_classType == CursorImageClass; }
75     bool isFontFeatureValue() const { return m_classType == FontFeatureClass; }
76     bool isFontValue() const { return m_classType == FontClass; }
77     bool isImageGeneratorValue() const { return m_classType >= CanvasClass && m_classType <= RadialGradientClass; }
78     bool isGradientValue() const { return m_classType >= LinearGradientClass && m_classType <= RadialGradientClass; }
79 #if ENABLE(CSS_IMAGE_SET)
80     bool isImageSetValue() const { return m_classType == ImageSetClass; }
81 #endif
82     bool isImageValue() const { return m_classType == ImageClass || m_classType == CursorImageClass; }
83     bool isImplicitInitialValue() const;
84     bool isInheritedValue() const { return m_classType == InheritedClass; }
85     bool isInitialValue() const { return m_classType == InitialClass; }
86     bool isReflectValue() const { return m_classType == ReflectClass; }
87     bool isShadowValue() const { return m_classType == ShadowClass; }
88     bool isCubicBezierTimingFunctionValue() const { return m_classType == CubicBezierTimingFunctionClass; }
89     bool isLinearTimingFunctionValue() const { return m_classType == LinearTimingFunctionClass; }
90     bool isStepsTimingFunctionValue() const { return m_classType == StepsTimingFunctionClass; }
91     bool isWebKitCSSTransformValue() const { return m_classType == WebKitCSSTransformClass; }
92     bool isCSSLineBoxContainValue() const { return m_classType == LineBoxContainClass; }
93     bool isCalculationValue() const {return m_classType == CalculationClass; }
94 #if ENABLE(CSS_FILTERS)
95     bool isWebKitCSSFilterValue() const { return m_classType == WebKitCSSFilterClass; }
96 #if ENABLE(CSS_SHADERS)
97     bool isWebKitCSSArrayFunctionValue() const { return m_classType == WebKitCSSArrayFunctionValueClass; }
98     bool isWebKitCSSMixFunctionValue() const { return m_classType == WebKitCSSMixFunctionValueClass; }
99     bool isWebKitCSSShaderValue() const { return m_classType == WebKitCSSShaderClass; }
100 #endif
101 #endif // ENABLE(CSS_FILTERS)
102 #if ENABLE(CSS_VARIABLES)
103     bool isVariableValue() const { return m_classType == VariableClass; }
104 #endif
105 #if ENABLE(SVG)
106     bool isSVGColor() const { return m_classType == SVGColorClass || m_classType == SVGPaintClass; }
107     bool isSVGPaint() const { return m_classType == SVGPaintClass; }
108     bool isWebKitCSSSVGDocumentValue() const { return m_classType == WebKitCSSSVGDocumentClass; }
109 #endif
110     
111     bool isCSSOMSafe() const { return m_isCSSOMSafe; }
112     bool isSubtypeExposedToCSSOM() const
113     { 
114         return isPrimitiveValue() 
115 #if ENABLE(SVG)
116             || isSVGColor()
117 #endif
118             || isValueList();
119     }
120
121     PassRefPtr<CSSValue> cloneForCSSOM() const;
122
123     void addSubresourceStyleURLs(ListHashSet<KURL>&, const StyleSheetContents*) const;
124
125     bool hasFailedOrCanceledSubresources() const;
126
127     void reportMemoryUsage(MemoryObjectInfo*) const;
128
129 protected:
130
131     static const size_t ClassTypeBits = 6;
132     enum ClassType {
133         PrimitiveClass,
134
135         // Image classes.
136         ImageClass,
137         CursorImageClass,
138
139         // Image generator classes.
140         CanvasClass,
141         CrossfadeClass,
142         LinearGradientClass,
143         RadialGradientClass,
144
145         // Timing function classes.
146         CubicBezierTimingFunctionClass,
147         LinearTimingFunctionClass,
148         StepsTimingFunctionClass,
149
150         // Other class types.
151         AspectRatioClass,
152         BorderImageSliceClass,
153         FontFeatureClass,
154         FontClass,
155         FontFaceSrcClass,
156         FunctionClass,
157
158         InheritedClass,
159         InitialClass,
160
161         ReflectClass,
162         ShadowClass,
163         UnicodeRangeClass,
164         LineBoxContainClass,
165         CalculationClass,
166 #if ENABLE(CSS_FILTERS) && ENABLE(CSS_SHADERS)
167         WebKitCSSShaderClass,
168 #endif
169 #if ENABLE(CSS_VARIABLES)
170         VariableClass,
171 #endif
172 #if ENABLE(SVG)
173         SVGColorClass,
174         SVGPaintClass,
175         WebKitCSSSVGDocumentClass,
176 #endif
177
178         // List class types must appear after ValueListClass.
179         ValueListClass,
180 #if ENABLE(CSS_IMAGE_SET)
181         ImageSetClass,
182 #endif
183 #if ENABLE(CSS_FILTERS)
184         WebKitCSSFilterClass,
185 #if ENABLE(CSS_SHADERS)
186         WebKitCSSArrayFunctionValueClass,
187         WebKitCSSMixFunctionValueClass,
188 #endif
189 #endif
190         WebKitCSSTransformClass,
191         // Do not append non-list class types here.
192     };
193
194     static const size_t ValueListSeparatorBits = 2;
195     enum ValueListSeparator {
196         SpaceSeparator,
197         CommaSeparator,
198         SlashSeparator
199     };
200
201     ClassType classType() const { return static_cast<ClassType>(m_classType); }
202
203     explicit CSSValue(ClassType classType, bool isCSSOMSafe = false)
204         : m_isCSSOMSafe(isCSSOMSafe)
205         , m_isTextClone(false)
206         , m_primitiveUnitType(0)
207         , m_hasCachedCSSText(false)
208         , m_isQuirkValue(false)
209         , m_valueListSeparator(SpaceSeparator)
210         , m_classType(classType)
211     {
212     }
213
214     // NOTE: This class is non-virtual for memory and performance reasons.
215     // Don't go making it virtual again unless you know exactly what you're doing!
216
217     ~CSSValue() { }
218
219 private:
220     void destroy();
221
222 protected:
223     unsigned m_isCSSOMSafe : 1;
224     unsigned m_isTextClone : 1;
225     // The bits in this section are only used by specific subclasses but kept here
226     // to maximize struct packing.
227
228     // CSSPrimitiveValue bits:
229     unsigned m_primitiveUnitType : 7; // CSSPrimitiveValue::UnitTypes
230     mutable unsigned m_hasCachedCSSText : 1;
231     unsigned m_isQuirkValue : 1;
232
233     unsigned m_valueListSeparator : ValueListSeparatorBits;
234
235 private:
236     unsigned m_classType : ClassTypeBits; // ClassType
237 };
238
239 } // namespace WebCore
240
241 #endif // CSSValue_h