2 * Copyright (C) 2011 Andreas Kling (kling@webkit.org)
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
28 #include "core/css/CSSValue.h"
30 #include "core/css/CSSArrayFunctionValue.h"
31 #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"
37 #include "core/css/CSSFilterValue.h"
38 #include "core/css/CSSFontFaceSrcValue.h"
39 #include "core/css/CSSFontFeatureValue.h"
40 #include "core/css/CSSFontValue.h"
41 #include "core/css/CSSFunctionValue.h"
42 #include "core/css/CSSGradientValue.h"
43 #include "core/css/CSSGridLineNamesValue.h"
44 #include "core/css/CSSGridTemplateAreasValue.h"
45 #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"
52 #include "core/css/CSSSVGDocumentValue.h"
53 #include "core/css/CSSShadowValue.h"
54 #include "core/css/CSSTimingFunctionValue.h"
55 #include "core/css/CSSTransformValue.h"
56 #include "core/css/CSSUnicodeRangeValue.h"
57 #include "core/css/CSSValueList.h"
58 #include "core/svg/SVGPaint.h"
62 struct SameSizeAsCSSValue : public RefCountedWillBeGarbageCollectedFinalized<SameSizeAsCSSValue> {
66 COMPILE_ASSERT(sizeof(CSSValue) <= sizeof(SameSizeAsCSSValue), CSS_value_should_stay_small);
68 class TextCloneCSSValue : public CSSValue {
70 static PassRefPtrWillBeRawPtr<TextCloneCSSValue> create(ClassType classType, const String& text)
72 return adoptRefWillBeNoop(new TextCloneCSSValue(classType, text));
75 String cssText() const { return m_cssText; }
77 void traceAfterDispatch(Visitor* visitor) { CSSValue::traceAfterDispatch(visitor); }
80 TextCloneCSSValue(ClassType classType, const String& text)
81 : CSSValue(classType, /*isCSSOMSafe*/ true)
90 DEFINE_CSS_VALUE_TYPE_CASTS(TextCloneCSSValue, isTextCloneCSSValue());
92 bool CSSValue::isImplicitInitialValue() const
94 return m_classType == InitialClass && toCSSInitialValue(this)->isImplicit();
97 CSSValue::Type CSSValue::cssValueType() const
99 if (isInheritedValue())
101 if (isPrimitiveValue())
102 return CSS_PRIMITIVE_VALUE;
104 return CSS_VALUE_LIST;
105 if (isInitialValue())
110 bool CSSValue::hasFailedOrCanceledSubresources() const
112 // This should get called for internal instances only.
113 ASSERT(!isCSSOMSafe());
116 return toCSSValueList(this)->hasFailedOrCanceledSubresources();
117 if (classType() == FontFaceSrcClass)
118 return toCSSFontFaceSrcValue(this)->hasFailedOrCanceledSubresources();
119 if (classType() == ImageClass)
120 return toCSSImageValue(this)->hasFailedOrCanceledSubresources();
121 if (classType() == CrossfadeClass)
122 return toCSSCrossfadeValue(this)->hasFailedOrCanceledSubresources();
123 if (classType() == ImageSetClass)
124 return toCSSImageSetValue(this)->hasFailedOrCanceledSubresources();
129 template<class ChildClassType>
130 inline static bool compareCSSValues(const CSSValue& first, const CSSValue& second)
132 return static_cast<const ChildClassType&>(first).equals(static_cast<const ChildClassType&>(second));
135 bool CSSValue::equals(const CSSValue& other) const
138 ASSERT(isCSSOMSafe());
139 return toTextCloneCSSValue(this)->cssText() == other.cssText();
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);
149 return compareCSSValues<CSSCanvasValue>(*this, other);
150 case CursorImageClass:
151 return compareCSSValues<CSSCursorImageValue>(*this, other);
153 return compareCSSValues<CSSFontValue>(*this, other);
154 case FontFaceSrcClass:
155 return compareCSSValues<CSSFontFaceSrcValue>(*this, other);
156 case FontFeatureClass:
157 return compareCSSValues<CSSFontFeatureValue>(*this, other);
159 return compareCSSValues<CSSFunctionValue>(*this, other);
160 case LinearGradientClass:
161 return compareCSSValues<CSSLinearGradientValue>(*this, other);
162 case RadialGradientClass:
163 return compareCSSValues<CSSRadialGradientValue>(*this, other);
165 return compareCSSValues<CSSCrossfadeValue>(*this, other);
167 return compareCSSValues<CSSImageValue>(*this, other);
169 return compareCSSValues<CSSInheritedValue>(*this, other);
171 return compareCSSValues<CSSInitialValue>(*this, other);
172 case GridLineNamesClass:
173 return compareCSSValues<CSSGridLineNamesValue>(*this, other);
174 case GridTemplateAreasClass:
175 return compareCSSValues<CSSGridTemplateAreasValue>(*this, other);
177 return compareCSSValues<CSSPrimitiveValue>(*this, other);
179 return compareCSSValues<CSSReflectValue>(*this, other);
181 return compareCSSValues<CSSShadowValue>(*this, other);
182 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);
189 return compareCSSValues<CSSValueList>(*this, other);
190 case CSSTransformClass:
191 return compareCSSValues<CSSTransformValue>(*this, other);
192 case LineBoxContainClass:
193 return compareCSSValues<CSSLineBoxContainValue>(*this, other);
194 case CalculationClass:
195 return compareCSSValues<CSSCalcValue>(*this, other);
197 return compareCSSValues<CSSImageSetValue>(*this, other);
199 return compareCSSValues<CSSFilterValue>(*this, other);
200 case CSSArrayFunctionValueClass:
201 return compareCSSValues<CSSArrayFunctionValue>(*this, other);
203 return compareCSSValues<SVGPaint>(*this, other);
204 case CSSSVGDocumentClass:
205 return compareCSSValues<CSSSVGDocumentValue>(*this, other);
207 ASSERT_NOT_REACHED();
210 } else if (m_classType == ValueListClass && other.m_classType != ValueListClass)
211 return toCSSValueList(this)->equals(other);
212 else if (m_classType != ValueListClass && other.m_classType == ValueListClass)
213 return static_cast<const CSSValueList&>(other).equals(*this);
217 String CSSValue::cssText() const
220 ASSERT(isCSSOMSafe());
221 return toTextCloneCSSValue(this)->cssText();
223 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
225 switch (classType()) {
226 case AspectRatioClass:
227 return toCSSAspectRatioValue(this)->customCSSText();
228 case BorderImageSliceClass:
229 return toCSSBorderImageSliceValue(this)->customCSSText();
231 return toCSSCanvasValue(this)->customCSSText();
232 case CursorImageClass:
233 return toCSSCursorImageValue(this)->customCSSText();
235 return toCSSFontValue(this)->customCSSText();
236 case FontFaceSrcClass:
237 return toCSSFontFaceSrcValue(this)->customCSSText();
238 case FontFeatureClass:
239 return toCSSFontFeatureValue(this)->customCSSText();
241 return toCSSFunctionValue(this)->customCSSText();
242 case LinearGradientClass:
243 return toCSSLinearGradientValue(this)->customCSSText();
244 case RadialGradientClass:
245 return toCSSRadialGradientValue(this)->customCSSText();
247 return toCSSCrossfadeValue(this)->customCSSText();
249 return toCSSImageValue(this)->customCSSText();
251 return toCSSInheritedValue(this)->customCSSText();
253 return toCSSInitialValue(this)->customCSSText();
254 case GridLineNamesClass:
255 return toCSSGridLineNamesValue(this)->customCSSText();
256 case GridTemplateAreasClass:
257 return toCSSGridTemplateAreasValue(this)->customCSSText();
259 return toCSSPrimitiveValue(this)->customCSSText();
261 return toCSSReflectValue(this)->customCSSText();
263 return toCSSShadowValue(this)->customCSSText();
264 case CubicBezierTimingFunctionClass:
265 return toCSSCubicBezierTimingFunctionValue(this)->customCSSText();
266 case StepsTimingFunctionClass:
267 return toCSSStepsTimingFunctionValue(this)->customCSSText();
268 case UnicodeRangeClass:
269 return toCSSUnicodeRangeValue(this)->customCSSText();
271 return toCSSValueList(this)->customCSSText();
272 case CSSTransformClass:
273 return toCSSTransformValue(this)->customCSSText();
274 case LineBoxContainClass:
275 return toCSSLineBoxContainValue(this)->customCSSText();
276 case CalculationClass:
277 return toCSSCalcValue(this)->customCSSText();
279 return toCSSImageSetValue(this)->customCSSText();
281 return toCSSFilterValue(this)->customCSSText();
282 case CSSArrayFunctionValueClass:
283 return toCSSArrayFunctionValue(this)->customCSSText();
285 return toSVGPaint(this)->customCSSText();
286 case CSSSVGDocumentClass:
287 return toCSSSVGDocumentValue(this)->customCSSText();
289 ASSERT_NOT_REACHED();
293 void CSSValue::destroy()
296 ASSERT(isCSSOMSafe());
297 delete toTextCloneCSSValue(this);
300 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
302 switch (classType()) {
303 case AspectRatioClass:
304 delete toCSSAspectRatioValue(this);
306 case BorderImageSliceClass:
307 delete toCSSBorderImageSliceValue(this);
310 delete toCSSCanvasValue(this);
312 case CursorImageClass:
313 delete toCSSCursorImageValue(this);
316 delete toCSSFontValue(this);
318 case FontFaceSrcClass:
319 delete toCSSFontFaceSrcValue(this);
321 case FontFeatureClass:
322 delete toCSSFontFeatureValue(this);
325 delete toCSSFunctionValue(this);
327 case LinearGradientClass:
328 delete toCSSLinearGradientValue(this);
330 case RadialGradientClass:
331 delete toCSSRadialGradientValue(this);
334 delete toCSSCrossfadeValue(this);
337 delete toCSSImageValue(this);
340 delete toCSSInheritedValue(this);
343 delete toCSSInitialValue(this);
345 case GridLineNamesClass:
346 delete toCSSGridLineNamesValue(this);
348 case GridTemplateAreasClass:
349 delete toCSSGridTemplateAreasValue(this);
352 delete toCSSPrimitiveValue(this);
355 delete toCSSReflectValue(this);
358 delete toCSSShadowValue(this);
360 case CubicBezierTimingFunctionClass:
361 delete toCSSCubicBezierTimingFunctionValue(this);
363 case StepsTimingFunctionClass:
364 delete toCSSStepsTimingFunctionValue(this);
366 case UnicodeRangeClass:
367 delete toCSSUnicodeRangeValue(this);
370 delete toCSSValueList(this);
372 case CSSTransformClass:
373 delete toCSSTransformValue(this);
375 case LineBoxContainClass:
376 delete toCSSLineBoxContainValue(this);
378 case CalculationClass:
379 delete toCSSCalcValue(this);
382 delete toCSSImageSetValue(this);
385 delete toCSSFilterValue(this);
387 case CSSArrayFunctionValueClass:
388 delete toCSSArrayFunctionValue(this);
391 delete toSVGPaint(this);
393 case CSSSVGDocumentClass:
394 delete toCSSSVGDocumentValue(this);
397 ASSERT_NOT_REACHED();
400 void CSSValue::finalizeGarbageCollectedObject()
403 ASSERT(isCSSOMSafe());
404 static_cast<TextCloneCSSValue*>(this)->~TextCloneCSSValue();
407 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
409 switch (classType()) {
410 case AspectRatioClass:
411 toCSSAspectRatioValue(this)->~CSSAspectRatioValue();
413 case BorderImageSliceClass:
414 toCSSBorderImageSliceValue(this)->~CSSBorderImageSliceValue();
417 toCSSCanvasValue(this)->~CSSCanvasValue();
419 case CursorImageClass:
420 toCSSCursorImageValue(this)->~CSSCursorImageValue();
423 toCSSFontValue(this)->~CSSFontValue();
425 case FontFaceSrcClass:
426 toCSSFontFaceSrcValue(this)->~CSSFontFaceSrcValue();
428 case FontFeatureClass:
429 toCSSFontFeatureValue(this)->~CSSFontFeatureValue();
432 toCSSFunctionValue(this)->~CSSFunctionValue();
434 case LinearGradientClass:
435 toCSSLinearGradientValue(this)->~CSSLinearGradientValue();
437 case RadialGradientClass:
438 toCSSRadialGradientValue(this)->~CSSRadialGradientValue();
441 toCSSCrossfadeValue(this)->~CSSCrossfadeValue();
444 toCSSImageValue(this)->~CSSImageValue();
447 toCSSInheritedValue(this)->~CSSInheritedValue();
450 toCSSInitialValue(this)->~CSSInitialValue();
452 case GridLineNamesClass:
453 toCSSGridLineNamesValue(this)->~CSSGridLineNamesValue();
455 case GridTemplateAreasClass:
456 toCSSGridTemplateAreasValue(this)->~CSSGridTemplateAreasValue();
459 toCSSPrimitiveValue(this)->~CSSPrimitiveValue();
462 toCSSReflectValue(this)->~CSSReflectValue();
465 toCSSShadowValue(this)->~CSSShadowValue();
467 case CubicBezierTimingFunctionClass:
468 toCSSCubicBezierTimingFunctionValue(this)->~CSSCubicBezierTimingFunctionValue();
470 case StepsTimingFunctionClass:
471 toCSSStepsTimingFunctionValue(this)->~CSSStepsTimingFunctionValue();
473 case UnicodeRangeClass:
474 toCSSUnicodeRangeValue(this)->~CSSUnicodeRangeValue();
477 toCSSValueList(this)->~CSSValueList();
479 case CSSTransformClass:
480 toCSSTransformValue(this)->~CSSTransformValue();
482 case LineBoxContainClass:
483 toCSSLineBoxContainValue(this)->~CSSLineBoxContainValue();
485 case CalculationClass:
486 toCSSCalcValue(this)->~CSSCalcValue();
489 toCSSImageSetValue(this)->~CSSImageSetValue();
492 toCSSFilterValue(this)->~CSSFilterValue();
494 case CSSArrayFunctionValueClass:
495 toCSSArrayFunctionValue(this)->~CSSArrayFunctionValue();
498 toSVGPaint(this)->~SVGPaint();
500 case CSSSVGDocumentClass:
501 toCSSSVGDocumentValue(this)->~CSSSVGDocumentValue();
504 ASSERT_NOT_REACHED();
507 void CSSValue::trace(Visitor* visitor)
510 ASSERT(isCSSOMSafe());
511 static_cast<TextCloneCSSValue*>(this)->traceAfterDispatch(visitor);
514 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
516 switch (classType()) {
517 case AspectRatioClass:
518 toCSSAspectRatioValue(this)->traceAfterDispatch(visitor);
520 case BorderImageSliceClass:
521 toCSSBorderImageSliceValue(this)->traceAfterDispatch(visitor);
524 toCSSCanvasValue(this)->traceAfterDispatch(visitor);
526 case CursorImageClass:
527 toCSSCursorImageValue(this)->traceAfterDispatch(visitor);
530 toCSSFontValue(this)->traceAfterDispatch(visitor);
532 case FontFaceSrcClass:
533 toCSSFontFaceSrcValue(this)->traceAfterDispatch(visitor);
535 case FontFeatureClass:
536 toCSSFontFeatureValue(this)->traceAfterDispatch(visitor);
539 toCSSFunctionValue(this)->traceAfterDispatch(visitor);
541 case LinearGradientClass:
542 toCSSLinearGradientValue(this)->traceAfterDispatch(visitor);
544 case RadialGradientClass:
545 toCSSRadialGradientValue(this)->traceAfterDispatch(visitor);
548 toCSSCrossfadeValue(this)->traceAfterDispatch(visitor);
551 toCSSImageValue(this)->traceAfterDispatch(visitor);
554 toCSSInheritedValue(this)->traceAfterDispatch(visitor);
557 toCSSInitialValue(this)->traceAfterDispatch(visitor);
559 case GridLineNamesClass:
560 toCSSGridLineNamesValue(this)->traceAfterDispatch(visitor);
562 case GridTemplateAreasClass:
563 toCSSGridTemplateAreasValue(this)->traceAfterDispatch(visitor);
566 toCSSPrimitiveValue(this)->traceAfterDispatch(visitor);
569 toCSSReflectValue(this)->traceAfterDispatch(visitor);
572 toCSSShadowValue(this)->traceAfterDispatch(visitor);
574 case CubicBezierTimingFunctionClass:
575 toCSSCubicBezierTimingFunctionValue(this)->traceAfterDispatch(visitor);
577 case StepsTimingFunctionClass:
578 toCSSStepsTimingFunctionValue(this)->traceAfterDispatch(visitor);
580 case UnicodeRangeClass:
581 toCSSUnicodeRangeValue(this)->traceAfterDispatch(visitor);
584 toCSSValueList(this)->traceAfterDispatch(visitor);
586 case CSSTransformClass:
587 toCSSTransformValue(this)->traceAfterDispatch(visitor);
589 case LineBoxContainClass:
590 toCSSLineBoxContainValue(this)->traceAfterDispatch(visitor);
592 case CalculationClass:
593 toCSSCalcValue(this)->traceAfterDispatch(visitor);
596 toCSSImageSetValue(this)->traceAfterDispatch(visitor);
599 toCSSFilterValue(this)->traceAfterDispatch(visitor);
601 case CSSArrayFunctionValueClass:
602 toCSSArrayFunctionValue(this)->traceAfterDispatch(visitor);
605 toSVGPaint(this)->traceAfterDispatch(visitor);
607 case CSSSVGDocumentClass:
608 toCSSSVGDocumentValue(this)->traceAfterDispatch(visitor);
611 ASSERT_NOT_REACHED();
614 PassRefPtrWillBeRawPtr<CSSValue> CSSValue::cloneForCSSOM() const
616 switch (classType()) {
618 return toCSSPrimitiveValue(this)->cloneForCSSOM();
620 return toCSSValueList(this)->cloneForCSSOM();
622 case CursorImageClass:
623 return toCSSImageValue(this)->cloneForCSSOM();
625 return toCSSFilterValue(this)->cloneForCSSOM();
626 case CSSArrayFunctionValueClass:
627 return toCSSArrayFunctionValue(this)->cloneForCSSOM();
628 case CSSTransformClass:
629 return toCSSTransformValue(this)->cloneForCSSOM();
631 return toCSSImageSetValue(this)->cloneForCSSOM();
633 return toSVGPaint(this)->cloneForCSSOM();
635 ASSERT(!isSubtypeExposedToCSSOM());
636 return TextCloneCSSValue::create(classType(), cssText());