blob: 8db94f4d3b2a206927c2680db0683dee2f7d9947 [file] [log] [blame]
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +01001/*
2 * Copyright (C) 2011 Andreas Kling (kling@webkit.org)
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 *
25 */
26
27#include "config.h"
28#include "core/css/CSSValue.h"
29
Torne (Richard Coles)5267f702013-06-11 10:57:24 +010030#include "core/css/CSSArrayFunctionValue.h"
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010031#include "core/css/CSSAspectRatioValue.h"
32#include "core/css/CSSBorderImageSliceValue.h"
33#include "core/css/CSSCalculationValue.h"
34#include "core/css/CSSCanvasValue.h"
35#include "core/css/CSSCrossfadeValue.h"
36#include "core/css/CSSCursorImageValue.h"
Torne (Richard Coles)5267f702013-06-11 10:57:24 +010037#include "core/css/CSSFilterValue.h"
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010038#include "core/css/CSSFontFaceSrcValue.h"
Torne (Richard Coles)1e202182013-10-18 15:46:42 +010039#include "core/css/CSSFontFeatureValue.h"
40#include "core/css/CSSFontValue.h"
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010041#include "core/css/CSSFunctionValue.h"
42#include "core/css/CSSGradientValue.h"
Torne (Richard Coles)51b29062013-11-28 11:56:03 +000043#include "core/css/CSSGridLineNamesValue.h"
Torne (Richard Coles)09380292014-02-21 12:17:33 +000044#include "core/css/CSSGridTemplateAreasValue.h"
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010045#include "core/css/CSSImageSetValue.h"
46#include "core/css/CSSImageValue.h"
47#include "core/css/CSSInheritedValue.h"
48#include "core/css/CSSInitialValue.h"
49#include "core/css/CSSLineBoxContainValue.h"
50#include "core/css/CSSPrimitiveValue.h"
51#include "core/css/CSSReflectValue.h"
Torne (Richard Coles)5267f702013-06-11 10:57:24 +010052#include "core/css/CSSSVGDocumentValue.h"
Torne (Richard Coles)1e202182013-10-18 15:46:42 +010053#include "core/css/CSSShadowValue.h"
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010054#include "core/css/CSSTimingFunctionValue.h"
Torne (Richard Coles)5267f702013-06-11 10:57:24 +010055#include "core/css/CSSTransformValue.h"
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010056#include "core/css/CSSUnicodeRangeValue.h"
57#include "core/css/CSSValueList.h"
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010058#include "core/svg/SVGPaint.h"
59
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010060namespace WebCore {
61
Torne (Richard Coles)09380292014-02-21 12:17:33 +000062struct SameSizeAsCSSValue : public RefCountedWillBeRefCountedGarbageCollected<SameSizeAsCSSValue> {
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010063 uint32_t bitfields;
64};
65
Torne (Richard Coles)1e202182013-10-18 15:46:42 +010066COMPILE_ASSERT(sizeof(CSSValue) <= sizeof(SameSizeAsCSSValue), CSS_value_should_stay_small);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010067
68class TextCloneCSSValue : public CSSValue {
69public:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +000070 static PassRefPtrWillBeRawPtr<TextCloneCSSValue> create(ClassType classType, const String& text)
71 {
72 return adoptRefWillBeRefCountedGarbageCollected(new TextCloneCSSValue(classType, text));
73 }
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010074
75 String cssText() const { return m_cssText; }
76
Torne (Richard Coles)09380292014-02-21 12:17:33 +000077 void traceAfterDispatch(Visitor* visitor) { CSSValue::traceAfterDispatch(visitor); }
78
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010079private:
Ben Murdoch02772c62013-07-26 10:21:05 +010080 TextCloneCSSValue(ClassType classType, const String& text)
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010081 : CSSValue(classType, /*isCSSOMSafe*/ true)
82 , m_cssText(text)
83 {
84 m_isTextClone = true;
85 }
86
87 String m_cssText;
88};
89
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +010090DEFINE_CSS_VALUE_TYPE_CASTS(TextCloneCSSValue, isTextCloneCSSValue());
91
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010092bool CSSValue::isImplicitInitialValue() const
93{
Torne (Richard Coles)1e202182013-10-18 15:46:42 +010094 return m_classType == InitialClass && toCSSInitialValue(this)->isImplicit();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010095}
96
97CSSValue::Type CSSValue::cssValueType() const
98{
99 if (isInheritedValue())
100 return CSS_INHERIT;
101 if (isPrimitiveValue())
102 return CSS_PRIMITIVE_VALUE;
103 if (isValueList())
104 return CSS_VALUE_LIST;
105 if (isInitialValue())
106 return CSS_INITIAL;
107 return CSS_CUSTOM;
108}
109
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100110bool CSSValue::hasFailedOrCanceledSubresources() const
111{
112 // This should get called for internal instances only.
113 ASSERT(!isCSSOMSafe());
114
115 if (isValueList())
Torne (Richard Coles)e5249552013-05-15 11:35:13 +0100116 return toCSSValueList(this)->hasFailedOrCanceledSubresources();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100117 if (classType() == FontFaceSrcClass)
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100118 return toCSSFontFaceSrcValue(this)->hasFailedOrCanceledSubresources();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100119 if (classType() == ImageClass)
Torne (Richard Coles)e5249552013-05-15 11:35:13 +0100120 return toCSSImageValue(this)->hasFailedOrCanceledSubresources();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100121 if (classType() == CrossfadeClass)
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100122 return toCSSCrossfadeValue(this)->hasFailedOrCanceledSubresources();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100123 if (classType() == ImageSetClass)
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100124 return toCSSImageSetValue(this)->hasFailedOrCanceledSubresources();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100125
126 return false;
127}
128
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100129template<class ChildClassType>
130inline static bool compareCSSValues(const CSSValue& first, const CSSValue& second)
131{
132 return static_cast<const ChildClassType&>(first).equals(static_cast<const ChildClassType&>(second));
133}
134
135bool CSSValue::equals(const CSSValue& other) const
136{
137 if (m_isTextClone) {
138 ASSERT(isCSSOMSafe());
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100139 return toTextCloneCSSValue(this)->cssText() == other.cssText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100140 }
141
142 if (m_classType == other.m_classType) {
143 switch (m_classType) {
144 case AspectRatioClass:
145 return compareCSSValues<CSSAspectRatioValue>(*this, other);
146 case BorderImageSliceClass:
147 return compareCSSValues<CSSBorderImageSliceValue>(*this, other);
148 case CanvasClass:
149 return compareCSSValues<CSSCanvasValue>(*this, other);
150 case CursorImageClass:
151 return compareCSSValues<CSSCursorImageValue>(*this, other);
152 case FontClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100153 return compareCSSValues<CSSFontValue>(*this, other);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100154 case FontFaceSrcClass:
155 return compareCSSValues<CSSFontFaceSrcValue>(*this, other);
156 case FontFeatureClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100157 return compareCSSValues<CSSFontFeatureValue>(*this, other);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100158 case FunctionClass:
159 return compareCSSValues<CSSFunctionValue>(*this, other);
160 case LinearGradientClass:
161 return compareCSSValues<CSSLinearGradientValue>(*this, other);
162 case RadialGradientClass:
163 return compareCSSValues<CSSRadialGradientValue>(*this, other);
164 case CrossfadeClass:
165 return compareCSSValues<CSSCrossfadeValue>(*this, other);
166 case ImageClass:
167 return compareCSSValues<CSSImageValue>(*this, other);
168 case InheritedClass:
169 return compareCSSValues<CSSInheritedValue>(*this, other);
170 case InitialClass:
171 return compareCSSValues<CSSInitialValue>(*this, other);
Torne (Richard Coles)51b29062013-11-28 11:56:03 +0000172 case GridLineNamesClass:
173 return compareCSSValues<CSSGridLineNamesValue>(*this, other);
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000174 case GridTemplateAreasClass:
175 return compareCSSValues<CSSGridTemplateAreasValue>(*this, other);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100176 case PrimitiveClass:
177 return compareCSSValues<CSSPrimitiveValue>(*this, other);
178 case ReflectClass:
179 return compareCSSValues<CSSReflectValue>(*this, other);
180 case ShadowClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100181 return compareCSSValues<CSSShadowValue>(*this, other);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100182 case CubicBezierTimingFunctionClass:
183 return compareCSSValues<CSSCubicBezierTimingFunctionValue>(*this, other);
184 case StepsTimingFunctionClass:
185 return compareCSSValues<CSSStepsTimingFunctionValue>(*this, other);
186 case UnicodeRangeClass:
187 return compareCSSValues<CSSUnicodeRangeValue>(*this, other);
188 case ValueListClass:
189 return compareCSSValues<CSSValueList>(*this, other);
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100190 case CSSTransformClass:
191 return compareCSSValues<CSSTransformValue>(*this, other);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100192 case LineBoxContainClass:
193 return compareCSSValues<CSSLineBoxContainValue>(*this, other);
194 case CalculationClass:
195 return compareCSSValues<CSSCalcValue>(*this, other);
196 case ImageSetClass:
197 return compareCSSValues<CSSImageSetValue>(*this, other);
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100198 case CSSFilterClass:
199 return compareCSSValues<CSSFilterValue>(*this, other);
200 case CSSArrayFunctionValueClass:
201 return compareCSSValues<CSSArrayFunctionValue>(*this, other);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100202 case SVGPaintClass:
203 return compareCSSValues<SVGPaint>(*this, other);
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100204 case CSSSVGDocumentClass:
205 return compareCSSValues<CSSSVGDocumentValue>(*this, other);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100206 default:
207 ASSERT_NOT_REACHED();
208 return false;
209 }
210 } else if (m_classType == ValueListClass && other.m_classType != ValueListClass)
Torne (Richard Coles)e5249552013-05-15 11:35:13 +0100211 return toCSSValueList(this)->equals(other);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100212 else if (m_classType != ValueListClass && other.m_classType == ValueListClass)
213 return static_cast<const CSSValueList&>(other).equals(*this);
214 return false;
215}
216
217String CSSValue::cssText() const
218{
219 if (m_isTextClone) {
220 ASSERT(isCSSOMSafe());
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100221 return toTextCloneCSSValue(this)->cssText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100222 }
223 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
224
225 switch (classType()) {
226 case AspectRatioClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100227 return toCSSAspectRatioValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100228 case BorderImageSliceClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100229 return toCSSBorderImageSliceValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100230 case CanvasClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100231 return toCSSCanvasValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100232 case CursorImageClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100233 return toCSSCursorImageValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100234 case FontClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100235 return toCSSFontValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100236 case FontFaceSrcClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100237 return toCSSFontFaceSrcValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100238 case FontFeatureClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100239 return toCSSFontFeatureValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100240 case FunctionClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100241 return toCSSFunctionValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100242 case LinearGradientClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100243 return toCSSLinearGradientValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100244 case RadialGradientClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100245 return toCSSRadialGradientValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100246 case CrossfadeClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100247 return toCSSCrossfadeValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100248 case ImageClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100249 return toCSSImageValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100250 case InheritedClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100251 return toCSSInheritedValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100252 case InitialClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100253 return toCSSInitialValue(this)->customCSSText();
Torne (Richard Coles)51b29062013-11-28 11:56:03 +0000254 case GridLineNamesClass:
255 return toCSSGridLineNamesValue(this)->customCSSText();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000256 case GridTemplateAreasClass:
257 return toCSSGridTemplateAreasValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100258 case PrimitiveClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100259 return toCSSPrimitiveValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100260 case ReflectClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100261 return toCSSReflectValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100262 case ShadowClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100263 return toCSSShadowValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100264 case CubicBezierTimingFunctionClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100265 return toCSSCubicBezierTimingFunctionValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100266 case StepsTimingFunctionClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100267 return toCSSStepsTimingFunctionValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100268 case UnicodeRangeClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100269 return toCSSUnicodeRangeValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100270 case ValueListClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100271 return toCSSValueList(this)->customCSSText();
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100272 case CSSTransformClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100273 return toCSSTransformValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100274 case LineBoxContainClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100275 return toCSSLineBoxContainValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100276 case CalculationClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100277 return toCSSCalcValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100278 case ImageSetClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100279 return toCSSImageSetValue(this)->customCSSText();
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100280 case CSSFilterClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100281 return toCSSFilterValue(this)->customCSSText();
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100282 case CSSArrayFunctionValueClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100283 return toCSSArrayFunctionValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100284 case SVGPaintClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100285 return toSVGPaint(this)->customCSSText();
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100286 case CSSSVGDocumentClass:
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100287 return toCSSSVGDocumentValue(this)->customCSSText();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100288 }
289 ASSERT_NOT_REACHED();
290 return String();
291}
292
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100293void CSSValue::destroy()
294{
295 if (m_isTextClone) {
296 ASSERT(isCSSOMSafe());
Torne (Richard Coles)bfe35902013-10-22 16:41:51 +0100297 delete toTextCloneCSSValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100298 return;
299 }
300 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
301
302 switch (classType()) {
303 case AspectRatioClass:
Torne (Richard Coles)06f816c2013-09-26 13:25:12 +0100304 delete toCSSAspectRatioValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100305 return;
306 case BorderImageSliceClass:
Torne (Richard Coles)06f816c2013-09-26 13:25:12 +0100307 delete toCSSBorderImageSliceValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100308 return;
309 case CanvasClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100310 delete toCSSCanvasValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100311 return;
312 case CursorImageClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100313 delete toCSSCursorImageValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100314 return;
315 case FontClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100316 delete toCSSFontValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100317 return;
318 case FontFaceSrcClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100319 delete toCSSFontFaceSrcValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100320 return;
321 case FontFeatureClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100322 delete toCSSFontFeatureValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100323 return;
324 case FunctionClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100325 delete toCSSFunctionValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100326 return;
327 case LinearGradientClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100328 delete toCSSLinearGradientValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100329 return;
330 case RadialGradientClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100331 delete toCSSRadialGradientValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100332 return;
333 case CrossfadeClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100334 delete toCSSCrossfadeValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100335 return;
336 case ImageClass:
Torne (Richard Coles)e5249552013-05-15 11:35:13 +0100337 delete toCSSImageValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100338 return;
339 case InheritedClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100340 delete toCSSInheritedValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100341 return;
342 case InitialClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100343 delete toCSSInitialValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100344 return;
Torne (Richard Coles)51b29062013-11-28 11:56:03 +0000345 case GridLineNamesClass:
346 delete toCSSGridLineNamesValue(this);
347 return;
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000348 case GridTemplateAreasClass:
349 delete toCSSGridTemplateAreasValue(this);
Torne (Richard Coles)f5e4ad52013-08-05 13:57:57 +0100350 return;
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100351 case PrimitiveClass:
Torne (Richard Coles)e5249552013-05-15 11:35:13 +0100352 delete toCSSPrimitiveValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100353 return;
354 case ReflectClass:
Torne (Richard Coles)06f816c2013-09-26 13:25:12 +0100355 delete toCSSReflectValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100356 return;
357 case ShadowClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100358 delete toCSSShadowValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100359 return;
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100360 case CubicBezierTimingFunctionClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100361 delete toCSSCubicBezierTimingFunctionValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100362 return;
363 case StepsTimingFunctionClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100364 delete toCSSStepsTimingFunctionValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100365 return;
366 case UnicodeRangeClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100367 delete toCSSUnicodeRangeValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100368 return;
369 case ValueListClass:
Torne (Richard Coles)e5249552013-05-15 11:35:13 +0100370 delete toCSSValueList(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100371 return;
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100372 case CSSTransformClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100373 delete toCSSTransformValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100374 return;
375 case LineBoxContainClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100376 delete toCSSLineBoxContainValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100377 return;
378 case CalculationClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100379 delete toCSSCalcValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100380 return;
381 case ImageSetClass:
Torne (Richard Coles)06f816c2013-09-26 13:25:12 +0100382 delete toCSSImageSetValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100383 return;
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100384 case CSSFilterClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100385 delete toCSSFilterValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100386 return;
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100387 case CSSArrayFunctionValueClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100388 delete toCSSArrayFunctionValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100389 return;
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100390 case SVGPaintClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100391 delete toSVGPaint(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100392 return;
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100393 case CSSSVGDocumentClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100394 delete toCSSSVGDocumentValue(this);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100395 return;
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100396 }
397 ASSERT_NOT_REACHED();
398}
399
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000400void CSSValue::finalize()
401{
402 if (m_isTextClone) {
403 ASSERT(isCSSOMSafe());
404 static_cast<TextCloneCSSValue*>(this)->~TextCloneCSSValue();
405 return;
406 }
407 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
408
409 switch (classType()) {
410 case AspectRatioClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000411 toCSSAspectRatioValue(this)->~CSSAspectRatioValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000412 return;
413 case BorderImageSliceClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000414 toCSSBorderImageSliceValue(this)->~CSSBorderImageSliceValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000415 return;
416 case CanvasClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000417 toCSSCanvasValue(this)->~CSSCanvasValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000418 return;
419 case CursorImageClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000420 toCSSCursorImageValue(this)->~CSSCursorImageValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000421 return;
422 case FontClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000423 toCSSFontValue(this)->~CSSFontValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000424 return;
425 case FontFaceSrcClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000426 toCSSFontFaceSrcValue(this)->~CSSFontFaceSrcValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000427 return;
428 case FontFeatureClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000429 toCSSFontFeatureValue(this)->~CSSFontFeatureValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000430 return;
431 case FunctionClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000432 toCSSFunctionValue(this)->~CSSFunctionValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000433 return;
434 case LinearGradientClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000435 toCSSLinearGradientValue(this)->~CSSLinearGradientValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000436 return;
437 case RadialGradientClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000438 toCSSRadialGradientValue(this)->~CSSRadialGradientValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000439 return;
440 case CrossfadeClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000441 toCSSCrossfadeValue(this)->~CSSCrossfadeValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000442 return;
443 case ImageClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000444 toCSSImageValue(this)->~CSSImageValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000445 return;
446 case InheritedClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000447 toCSSInheritedValue(this)->~CSSInheritedValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000448 return;
449 case InitialClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000450 toCSSInitialValue(this)->~CSSInitialValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000451 return;
452 case GridLineNamesClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000453 toCSSGridLineNamesValue(this)->~CSSGridLineNamesValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000454 return;
455 case GridTemplateAreasClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000456 toCSSGridTemplateAreasValue(this)->~CSSGridTemplateAreasValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000457 return;
458 case PrimitiveClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000459 toCSSPrimitiveValue(this)->~CSSPrimitiveValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000460 return;
461 case ReflectClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000462 toCSSReflectValue(this)->~CSSReflectValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000463 return;
464 case ShadowClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000465 toCSSShadowValue(this)->~CSSShadowValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000466 return;
467 case CubicBezierTimingFunctionClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000468 toCSSCubicBezierTimingFunctionValue(this)->~CSSCubicBezierTimingFunctionValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000469 return;
470 case StepsTimingFunctionClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000471 toCSSStepsTimingFunctionValue(this)->~CSSStepsTimingFunctionValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000472 return;
473 case UnicodeRangeClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000474 toCSSUnicodeRangeValue(this)->~CSSUnicodeRangeValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000475 return;
476 case ValueListClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000477 toCSSValueList(this)->~CSSValueList();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000478 return;
479 case CSSTransformClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000480 toCSSTransformValue(this)->~CSSTransformValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000481 return;
482 case LineBoxContainClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000483 toCSSLineBoxContainValue(this)->~CSSLineBoxContainValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000484 return;
485 case CalculationClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000486 toCSSCalcValue(this)->~CSSCalcValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000487 return;
488 case ImageSetClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000489 toCSSImageSetValue(this)->~CSSImageSetValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000490 return;
491 case CSSFilterClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000492 toCSSFilterValue(this)->~CSSFilterValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000493 return;
494 case CSSArrayFunctionValueClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000495 toCSSArrayFunctionValue(this)->~CSSArrayFunctionValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000496 return;
497 case SVGPaintClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000498 toSVGPaint(this)->~SVGPaint();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000499 return;
500 case CSSSVGDocumentClass:
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000501 toCSSSVGDocumentValue(this)->~CSSSVGDocumentValue();
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000502 return;
503 }
504 ASSERT_NOT_REACHED();
505}
506
507void CSSValue::trace(Visitor* visitor)
508{
509 if (m_isTextClone) {
510 ASSERT(isCSSOMSafe());
511 static_cast<TextCloneCSSValue*>(this)->traceAfterDispatch(visitor);
512 return;
513 }
514 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
515
516 switch (classType()) {
517 case AspectRatioClass:
518 static_cast<CSSAspectRatioValue*>(this)->traceAfterDispatch(visitor);
519 return;
520 case BorderImageSliceClass:
521 static_cast<CSSBorderImageSliceValue*>(this)->traceAfterDispatch(visitor);
522 return;
523 case CanvasClass:
524 static_cast<CSSCanvasValue*>(this)->traceAfterDispatch(visitor);
525 return;
526 case CursorImageClass:
527 static_cast<CSSCursorImageValue*>(this)->traceAfterDispatch(visitor);
528 return;
529 case FontClass:
530 static_cast<CSSFontValue*>(this)->traceAfterDispatch(visitor);
531 return;
532 case FontFaceSrcClass:
533 static_cast<CSSFontFaceSrcValue*>(this)->traceAfterDispatch(visitor);
534 return;
535 case FontFeatureClass:
536 static_cast<CSSFontFeatureValue*>(this)->traceAfterDispatch(visitor);
537 return;
538 case FunctionClass:
539 static_cast<CSSFunctionValue*>(this)->traceAfterDispatch(visitor);
540 return;
541 case LinearGradientClass:
542 static_cast<CSSLinearGradientValue*>(this)->traceAfterDispatch(visitor);
543 return;
544 case RadialGradientClass:
545 static_cast<CSSRadialGradientValue*>(this)->traceAfterDispatch(visitor);
546 return;
547 case CrossfadeClass:
548 static_cast<CSSCrossfadeValue*>(this)->traceAfterDispatch(visitor);
549 return;
550 case ImageClass:
551 static_cast<CSSImageValue*>(this)->traceAfterDispatch(visitor);
552 return;
553 case InheritedClass:
554 static_cast<CSSInheritedValue*>(this)->traceAfterDispatch(visitor);
555 return;
556 case InitialClass:
557 static_cast<CSSInitialValue*>(this)->traceAfterDispatch(visitor);
558 return;
559 case GridLineNamesClass:
560 static_cast<CSSGridLineNamesValue*>(this)->traceAfterDispatch(visitor);
561 return;
562 case GridTemplateAreasClass:
563 static_cast<CSSGridTemplateAreasValue*>(this)->traceAfterDispatch(visitor);
564 return;
565 case PrimitiveClass:
566 static_cast<CSSPrimitiveValue*>(this)->traceAfterDispatch(visitor);
567 return;
568 case ReflectClass:
569 static_cast<CSSReflectValue*>(this)->traceAfterDispatch(visitor);
570 return;
571 case ShadowClass:
572 static_cast<CSSShadowValue*>(this)->traceAfterDispatch(visitor);
573 return;
574 case CubicBezierTimingFunctionClass:
575 static_cast<CSSCubicBezierTimingFunctionValue*>(this)->traceAfterDispatch(visitor);
576 return;
577 case StepsTimingFunctionClass:
578 static_cast<CSSStepsTimingFunctionValue*>(this)->traceAfterDispatch(visitor);
579 return;
580 case UnicodeRangeClass:
581 static_cast<CSSUnicodeRangeValue*>(this)->traceAfterDispatch(visitor);
582 return;
583 case ValueListClass:
584 static_cast<CSSValueList*>(this)->traceAfterDispatch(visitor);
585 return;
586 case CSSTransformClass:
587 static_cast<CSSTransformValue*>(this)->traceAfterDispatch(visitor);
588 return;
589 case LineBoxContainClass:
590 static_cast<CSSLineBoxContainValue*>(this)->traceAfterDispatch(visitor);
591 return;
592 case CalculationClass:
593 static_cast<CSSCalcValue*>(this)->traceAfterDispatch(visitor);
594 return;
595 case ImageSetClass:
596 static_cast<CSSImageSetValue*>(this)->traceAfterDispatch(visitor);
597 return;
598 case CSSFilterClass:
599 static_cast<CSSFilterValue*>(this)->traceAfterDispatch(visitor);
600 return;
601 case CSSArrayFunctionValueClass:
602 static_cast<CSSArrayFunctionValue*>(this)->traceAfterDispatch(visitor);
603 return;
Torne (Richard Coles)09380292014-02-21 12:17:33 +0000604 case SVGPaintClass:
605 static_cast<SVGPaint*>(this)->traceAfterDispatch(visitor);
606 return;
607 case CSSSVGDocumentClass:
608 static_cast<CSSSVGDocumentValue*>(this)->traceAfterDispatch(visitor);
609 return;
610 }
611 ASSERT_NOT_REACHED();
612}
613
Torne (Richard Coles)d5428f32014-03-18 10:21:16 +0000614PassRefPtrWillBeRawPtr<CSSValue> CSSValue::cloneForCSSOM() const
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100615{
616 switch (classType()) {
617 case PrimitiveClass:
Torne (Richard Coles)e5249552013-05-15 11:35:13 +0100618 return toCSSPrimitiveValue(this)->cloneForCSSOM();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100619 case ValueListClass:
Torne (Richard Coles)e5249552013-05-15 11:35:13 +0100620 return toCSSValueList(this)->cloneForCSSOM();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100621 case ImageClass:
622 case CursorImageClass:
Torne (Richard Coles)e5249552013-05-15 11:35:13 +0100623 return toCSSImageValue(this)->cloneForCSSOM();
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100624 case CSSFilterClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100625 return toCSSFilterValue(this)->cloneForCSSOM();
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100626 case CSSArrayFunctionValueClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100627 return toCSSArrayFunctionValue(this)->cloneForCSSOM();
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100628 case CSSTransformClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100629 return toCSSTransformValue(this)->cloneForCSSOM();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100630 case ImageSetClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100631 return toCSSImageSetValue(this)->cloneForCSSOM();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100632 case SVGPaintClass:
Torne (Richard Coles)1e202182013-10-18 15:46:42 +0100633 return toSVGPaint(this)->cloneForCSSOM();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100634 default:
635 ASSERT(!isSubtypeExposedToCSSOM());
636 return TextCloneCSSValue::create(classType(), cssText());
637 }
638}
639
640}