[CSS Parser] Get all the properties turned on
[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 #pragma once
22
23 #include "ExceptionOr.h"
24 #include "URLHash.h"
25 #include <wtf/HashMap.h>
26 #include <wtf/ListHashSet.h>
27 #include <wtf/RefCounted.h>
28 #include <wtf/RefPtr.h>
29 #include <wtf/TypeCasts.h>
30
31 namespace WebCore {
32
33 class CachedResource;
34 class StyleSheetContents;
35
36 enum CSSPropertyID : uint16_t;
37
38 // FIXME: The current CSSValue and subclasses should be turned into internal types (StyleValue).
39 // The few subtypes that are actually exposed in CSSOM can be seen in the cloneForCSSOM() function.
40 // They should be handled by separate wrapper classes.
41
42 // Please don't expose more CSSValue types to the web.
43 class CSSValue : public RefCounted<CSSValue> {
44 public:
45     enum Type {
46         CSS_INHERIT = 0,
47         CSS_PRIMITIVE_VALUE = 1,
48         CSS_VALUE_LIST = 2,
49         CSS_CUSTOM = 3,
50         CSS_INITIAL = 4,
51         CSS_UNSET = 5,
52         CSS_REVERT = 6
53     };
54
55     // Override RefCounted's deref() to ensure operator delete is called on
56     // the appropriate subclass type.
57     void deref()
58     {
59         if (derefBase())
60             destroy();
61     }
62
63     WEBCORE_EXPORT Type cssValueType() const;
64
65     WEBCORE_EXPORT String cssText() const;
66
67     ExceptionOr<void> setCssText(const String&) { return { }; } // FIXME: Not implemented.
68
69     bool isPrimitiveValue() const { return m_classType == PrimitiveClass; }
70     bool isValueList() const { return m_classType >= ValueListClass; }
71     
72     bool isBaseValueList() const { return m_classType == ValueListClass; }
73         
74
75     bool isAspectRatioValue() const { return m_classType == AspectRatioClass; }
76     bool isBorderImageSliceValue() const { return m_classType == BorderImageSliceClass; }
77     bool isCanvasValue() const { return m_classType == CanvasClass; }
78     bool isCrossfadeValue() const { return m_classType == CrossfadeClass; }
79     bool isCursorImageValue() const { return m_classType == CursorImageClass; }
80     bool isCustomPropertyValue() const { return m_classType == CustomPropertyClass; }
81     bool isInvalidCustomPropertyValue() const;
82     bool isVariableDependentValue() const { return m_classType == VariableDependentClass; }
83     bool isVariableValue() const { return m_classType == VariableClass; }
84     bool isFunctionValue() const { return m_classType == FunctionClass; }
85     bool isFontFeatureValue() const { return m_classType == FontFeatureClass; }
86 #if ENABLE(VARIATION_FONTS)
87     bool isFontVariationValue() const { return m_classType == FontVariationClass; }
88 #endif
89     bool isFontFaceSrcValue() const { return m_classType == FontFaceSrcClass; }
90     bool isFontValue() const { return m_classType == FontClass; }
91     bool isImageGeneratorValue() const { return m_classType >= CanvasClass && m_classType <= RadialGradientClass; }
92     bool isGradientValue() const { return m_classType >= LinearGradientClass && m_classType <= RadialGradientClass; }
93     bool isNamedImageValue() const { return m_classType == NamedImageClass; }
94     bool isImageSetValue() const { return m_classType == ImageSetClass; }
95     bool isImageValue() const { return m_classType == ImageClass; }
96     bool isImplicitInitialValue() const;
97     bool isInheritedValue() const { return m_classType == InheritedClass; }
98     bool isInitialValue() const { return m_classType == InitialClass; }
99     bool isUnsetValue() const { return m_classType == UnsetClass; }
100     bool isRevertValue() const { return m_classType == RevertClass; }
101     bool treatAsInitialValue(CSSPropertyID) const;
102     bool treatAsInheritedValue(CSSPropertyID) const;
103     bool isLinearGradientValue() const { return m_classType == LinearGradientClass; }
104     bool isRadialGradientValue() const { return m_classType == RadialGradientClass; }
105     bool isReflectValue() const { return m_classType == ReflectClass; }
106     bool isShadowValue() const { return m_classType == ShadowClass; }
107     bool isCubicBezierTimingFunctionValue() const { return m_classType == CubicBezierTimingFunctionClass; }
108     bool isStepsTimingFunctionValue() const { return m_classType == StepsTimingFunctionClass; }
109     bool isSpringTimingFunctionValue() const { return m_classType == SpringTimingFunctionClass; }
110     bool isWebKitCSSTransformValue() const { return m_classType == WebKitCSSTransformClass; }
111     bool isLineBoxContainValue() const { return m_classType == LineBoxContainClass; }
112     bool isCalcValue() const {return m_classType == CalculationClass; }
113     bool isFilterImageValue() const { return m_classType == FilterImageClass; }
114     bool isWebKitCSSFilterValue() const { return m_classType == WebKitCSSFilterClass; }
115     bool isContentDistributionValue() const { return m_classType == CSSContentDistributionClass; }
116 #if ENABLE(CSS_GRID_LAYOUT)
117     bool isGridAutoRepeatValue() const { return m_classType == GridAutoRepeatClass; }
118     bool isGridTemplateAreasValue() const { return m_classType == GridTemplateAreasClass; }
119     bool isGridLineNamesValue() const { return m_classType == GridLineNamesClass; }
120 #endif
121     bool isSVGColor() const { return m_classType == SVGColorClass || m_classType == SVGPaintClass; }
122     bool isSVGPaint() const { return m_classType == SVGPaintClass; }
123     bool isUnicodeRangeValue() const { return m_classType == UnicodeRangeClass; }
124
125 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
126     bool isAnimationTriggerScrollValue() const { return m_classType == AnimationTriggerScrollClass; }
127 #endif
128
129     bool isCustomPropertyDeclaration() const { return m_classType == CustomPropertyDeclarationClass; }
130     bool isCustomIdentValue() const { return m_classType == CustomIdentClass; }
131     bool isVariableReferenceValue() const { return m_classType == VariableReferenceClass; }
132     bool isPendingSubstitutionValue() const { return m_classType == PendingSubstitutionValueClass; }
133
134     bool isCSSOMSafe() const { return m_isCSSOMSafe; }
135     bool isSubtypeExposedToCSSOM() const
136     { 
137         return isPrimitiveValue() 
138             || isSVGColor()
139             || isValueList();
140     }
141
142     RefPtr<CSSValue> cloneForCSSOM() const;
143
144     bool traverseSubresources(const std::function<bool (const CachedResource&)>& handler) const;
145
146     bool equals(const CSSValue&) const;
147     bool operator==(const CSSValue& other) const { return equals(other); }
148
149 protected:
150
151     static const size_t ClassTypeBits = 6;
152     enum ClassType {
153         PrimitiveClass,
154
155         // Image classes.
156         ImageClass,
157         CursorImageClass,
158
159         // Image generator classes.
160         CanvasClass,
161         NamedImageClass,
162         CrossfadeClass,
163         FilterImageClass,
164         LinearGradientClass,
165         RadialGradientClass,
166
167         // Timing function classes.
168         CubicBezierTimingFunctionClass,
169         StepsTimingFunctionClass,
170         SpringTimingFunctionClass,
171
172         // Other class types.
173         AspectRatioClass,
174         BorderImageSliceClass,
175         FontFeatureClass,
176 #if ENABLE(VARIATION_FONTS)
177         FontVariationClass,
178 #endif
179         FontClass,
180         FontFaceSrcClass,
181         FunctionClass,
182
183         InheritedClass,
184         InitialClass,
185         UnsetClass,
186         RevertClass,
187
188         ReflectClass,
189         ShadowClass,
190         UnicodeRangeClass,
191         LineBoxContainClass,
192         CalculationClass,
193 #if ENABLE(CSS_GRID_LAYOUT)
194         GridTemplateAreasClass,
195 #endif
196         SVGColorClass,
197         SVGPaintClass,
198
199 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
200         AnimationTriggerScrollClass,
201 #endif
202
203         CSSContentDistributionClass,
204         
205         // FIXME-NEWPARSER: Remove in favor of new variables implementation.
206         CustomPropertyClass,
207         VariableDependentClass,
208         VariableClass,
209
210         // New variables implementation.
211         CustomPropertyDeclarationClass,
212         CustomIdentClass,
213         VariableReferenceClass,
214         PendingSubstitutionValueClass,
215
216         // List class types must appear after ValueListClass.
217         ValueListClass,
218         ImageSetClass,
219         WebKitCSSFilterClass,
220         WebKitCSSTransformClass,
221 #if ENABLE(CSS_GRID_LAYOUT)
222         GridLineNamesClass,
223         GridAutoRepeatClass,
224 #endif
225         // Do not append non-list class types here.
226     };
227
228     static const size_t ValueListSeparatorBits = 2;
229     enum ValueListSeparator {
230         SpaceSeparator,
231         CommaSeparator,
232         SlashSeparator
233     };
234
235     ClassType classType() const { return static_cast<ClassType>(m_classType); }
236
237     explicit CSSValue(ClassType classType, bool isCSSOMSafe = false)
238         : m_isCSSOMSafe(isCSSOMSafe)
239         , m_isTextClone(false)
240         , m_primitiveUnitType(0)
241         , m_hasCachedCSSText(false)
242         , m_isQuirkValue(false)
243         , m_valueListSeparator(SpaceSeparator)
244         , m_classType(classType)
245     {
246     }
247
248     // NOTE: This class is non-virtual for memory and performance reasons.
249     // Don't go making it virtual again unless you know exactly what you're doing!
250
251     ~CSSValue() { }
252
253 private:
254     WEBCORE_EXPORT void destroy();
255
256 protected:
257     unsigned m_isCSSOMSafe : 1;
258     unsigned m_isTextClone : 1;
259     // The bits in this section are only used by specific subclasses but kept here
260     // to maximize struct packing.
261
262     // CSSPrimitiveValue bits:
263     unsigned m_primitiveUnitType : 7; // CSSPrimitiveValue::UnitTypes
264     mutable unsigned m_hasCachedCSSText : 1;
265     unsigned m_isQuirkValue : 1;
266
267     unsigned m_valueListSeparator : ValueListSeparatorBits;
268
269 private:
270     unsigned m_classType : ClassTypeBits; // ClassType
271     
272 friend class CSSValueList;
273 };
274
275 template<typename CSSValueType>
276 inline bool compareCSSValueVector(const Vector<Ref<CSSValueType>>& firstVector, const Vector<Ref<CSSValueType>>& secondVector)
277 {
278     size_t size = firstVector.size();
279     if (size != secondVector.size())
280         return false;
281
282     for (size_t i = 0; i < size; ++i) {
283         auto& firstPtr = firstVector[i];
284         auto& secondPtr = secondVector[i];
285         if (firstPtr.ptr() == secondPtr.ptr() || firstPtr->equals(secondPtr))
286             continue;
287         return false;
288     }
289     return true;
290 }
291
292 template<typename CSSValueType>
293 inline bool compareCSSValuePtr(const RefPtr<CSSValueType>& first, const RefPtr<CSSValueType>& second)
294 {
295     return first ? second && first->equals(*second) : !second;
296 }
297
298 template<typename CSSValueType>
299 inline bool compareCSSValue(const Ref<CSSValueType>& first, const Ref<CSSValueType>& second)
300 {
301     return first.get().equals(second);
302 }
303
304 typedef HashMap<AtomicString, RefPtr<CSSValue>> CustomPropertyValueMap;
305
306 } // namespace WebCore
307
308 #define SPECIALIZE_TYPE_TRAITS_CSS_VALUE(ToValueTypeName, predicate) \
309 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
310     static bool isType(const WebCore::CSSValue& value) { return value.predicate; } \
311 SPECIALIZE_TYPE_TRAITS_END()