1 /* 2 * Copyright (C) 2011 Andreas Kling (kling (at) 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 30 #include "core/css/CSSAspectRatioValue.h" 31 #include "core/css/CSSBorderImageSliceValue.h" 32 #include "core/css/CSSCalculationValue.h" 33 #include "core/css/CSSCanvasValue.h" 34 #include "core/css/CSSCrossfadeValue.h" 35 #include "core/css/CSSCursorImageValue.h" 36 #include "core/css/CSSFilterValue.h" 37 #include "core/css/CSSFontFaceSrcValue.h" 38 #include "core/css/CSSFontFeatureValue.h" 39 #include "core/css/CSSFontValue.h" 40 #include "core/css/CSSFunctionValue.h" 41 #include "core/css/CSSGradientValue.h" 42 #include "core/css/CSSGridLineNamesValue.h" 43 #include "core/css/CSSGridTemplateAreasValue.h" 44 #include "core/css/CSSImageSetValue.h" 45 #include "core/css/CSSImageValue.h" 46 #include "core/css/CSSInheritedValue.h" 47 #include "core/css/CSSInitialValue.h" 48 #include "core/css/CSSLineBoxContainValue.h" 49 #include "core/css/CSSPrimitiveValue.h" 50 #include "core/css/CSSReflectValue.h" 51 #include "core/css/CSSSVGDocumentValue.h" 52 #include "core/css/CSSShadowValue.h" 53 #include "core/css/CSSTimingFunctionValue.h" 54 #include "core/css/CSSTransformValue.h" 55 #include "core/css/CSSUnicodeRangeValue.h" 56 #include "core/css/CSSValueList.h" 57 58 namespace blink { 59 60 struct SameSizeAsCSSValue : public RefCountedWillBeGarbageCollectedFinalized<SameSizeAsCSSValue> 61 // VC++ 2013 doesn't support EBCO (Empty Base Class Optimization), and having 62 // multiple empty base classes makes the size of CSSValue bloat (Note that both 63 // of GarbageCollectedFinalized and ScriptWrappableBase are empty classes). 64 // See the following article for details. 65 // http://social.msdn.microsoft.com/forums/vstudio/en-US/504c6598-6076-4acf-96b6-e6acb475d302/vc-multiple-inheritance-empty-base-classes-bloats-object-size 66 // 67 // FIXME: Remove this #if directive once VC++'s issue gets fixed. 68 // Note that we're going to split CSSValue class into two classes; CSSOMValue 69 // (assumed name) which derives ScriptWrappable and CSSValue (new one) which 70 // doesn't derive ScriptWrappable or ScriptWrappableBase. Then, we can safely 71 // remove this #if directive. 72 #if ENABLE(OILPAN) && COMPILER(MSVC) 73 , public ScriptWrappableBase 74 #endif 75 { 76 uint32_t bitfields; 77 }; 78 79 COMPILE_ASSERT(sizeof(CSSValue) <= sizeof(SameSizeAsCSSValue), CSS_value_should_stay_small); 80 81 class TextCloneCSSValue : public CSSValue { 82 public: 83 static PassRefPtrWillBeRawPtr<TextCloneCSSValue> create(ClassType classType, const String& text) 84 { 85 return adoptRefWillBeNoop(new TextCloneCSSValue(classType, text)); 86 } 87 88 String cssText() const { return m_cssText; } 89 90 void traceAfterDispatch(Visitor* visitor) { CSSValue::traceAfterDispatch(visitor); } 91 92 private: 93 TextCloneCSSValue(ClassType classType, const String& text) 94 : CSSValue(classType, /*isCSSOMSafe*/ true) 95 , m_cssText(text) 96 { 97 m_isTextClone = true; 98 } 99 100 String m_cssText; 101 }; 102 103 DEFINE_CSS_VALUE_TYPE_CASTS(TextCloneCSSValue, isTextCloneCSSValue()); 104 105 bool CSSValue::isImplicitInitialValue() const 106 { 107 return m_classType == InitialClass && toCSSInitialValue(this)->isImplicit(); 108 } 109 110 CSSValue::Type CSSValue::cssValueType() const 111 { 112 if (isInheritedValue()) 113 return CSS_INHERIT; 114 if (isPrimitiveValue()) 115 return CSS_PRIMITIVE_VALUE; 116 if (isValueList()) 117 return CSS_VALUE_LIST; 118 if (isInitialValue()) 119 return CSS_INITIAL; 120 return CSS_CUSTOM; 121 } 122 123 bool CSSValue::hasFailedOrCanceledSubresources() const 124 { 125 // This should get called for internal instances only. 126 ASSERT(!isCSSOMSafe()); 127 128 if (isValueList()) 129 return toCSSValueList(this)->hasFailedOrCanceledSubresources(); 130 if (classType() == FontFaceSrcClass) 131 return toCSSFontFaceSrcValue(this)->hasFailedOrCanceledSubresources(); 132 if (classType() == ImageClass) 133 return toCSSImageValue(this)->hasFailedOrCanceledSubresources(); 134 if (classType() == CrossfadeClass) 135 return toCSSCrossfadeValue(this)->hasFailedOrCanceledSubresources(); 136 if (classType() == ImageSetClass) 137 return toCSSImageSetValue(this)->hasFailedOrCanceledSubresources(); 138 139 return false; 140 } 141 142 template<class ChildClassType> 143 inline static bool compareCSSValues(const CSSValue& first, const CSSValue& second) 144 { 145 return static_cast<const ChildClassType&>(first).equals(static_cast<const ChildClassType&>(second)); 146 } 147 148 bool CSSValue::equals(const CSSValue& other) const 149 { 150 if (m_isTextClone) { 151 ASSERT(isCSSOMSafe()); 152 return toTextCloneCSSValue(this)->cssText() == other.cssText(); 153 } 154 155 if (m_classType == other.m_classType) { 156 switch (m_classType) { 157 case AspectRatioClass: 158 return compareCSSValues<CSSAspectRatioValue>(*this, other); 159 case BorderImageSliceClass: 160 return compareCSSValues<CSSBorderImageSliceValue>(*this, other); 161 case CanvasClass: 162 return compareCSSValues<CSSCanvasValue>(*this, other); 163 case CursorImageClass: 164 return compareCSSValues<CSSCursorImageValue>(*this, other); 165 case FontClass: 166 return compareCSSValues<CSSFontValue>(*this, other); 167 case FontFaceSrcClass: 168 return compareCSSValues<CSSFontFaceSrcValue>(*this, other); 169 case FontFeatureClass: 170 return compareCSSValues<CSSFontFeatureValue>(*this, other); 171 case FunctionClass: 172 return compareCSSValues<CSSFunctionValue>(*this, other); 173 case LinearGradientClass: 174 return compareCSSValues<CSSLinearGradientValue>(*this, other); 175 case RadialGradientClass: 176 return compareCSSValues<CSSRadialGradientValue>(*this, other); 177 case CrossfadeClass: 178 return compareCSSValues<CSSCrossfadeValue>(*this, other); 179 case ImageClass: 180 return compareCSSValues<CSSImageValue>(*this, other); 181 case InheritedClass: 182 return compareCSSValues<CSSInheritedValue>(*this, other); 183 case InitialClass: 184 return compareCSSValues<CSSInitialValue>(*this, other); 185 case GridLineNamesClass: 186 return compareCSSValues<CSSGridLineNamesValue>(*this, other); 187 case GridTemplateAreasClass: 188 return compareCSSValues<CSSGridTemplateAreasValue>(*this, other); 189 case PrimitiveClass: 190 return compareCSSValues<CSSPrimitiveValue>(*this, other); 191 case ReflectClass: 192 return compareCSSValues<CSSReflectValue>(*this, other); 193 case ShadowClass: 194 return compareCSSValues<CSSShadowValue>(*this, other); 195 case CubicBezierTimingFunctionClass: 196 return compareCSSValues<CSSCubicBezierTimingFunctionValue>(*this, other); 197 case StepsTimingFunctionClass: 198 return compareCSSValues<CSSStepsTimingFunctionValue>(*this, other); 199 case UnicodeRangeClass: 200 return compareCSSValues<CSSUnicodeRangeValue>(*this, other); 201 case ValueListClass: 202 return compareCSSValues<CSSValueList>(*this, other); 203 case CSSTransformClass: 204 return compareCSSValues<CSSTransformValue>(*this, other); 205 case LineBoxContainClass: 206 return compareCSSValues<CSSLineBoxContainValue>(*this, other); 207 case CalculationClass: 208 return compareCSSValues<CSSCalcValue>(*this, other); 209 case ImageSetClass: 210 return compareCSSValues<CSSImageSetValue>(*this, other); 211 case CSSFilterClass: 212 return compareCSSValues<CSSFilterValue>(*this, other); 213 case CSSSVGDocumentClass: 214 return compareCSSValues<CSSSVGDocumentValue>(*this, other); 215 default: 216 ASSERT_NOT_REACHED(); 217 return false; 218 } 219 } else if (m_classType == ValueListClass && other.m_classType != ValueListClass) 220 return toCSSValueList(this)->equals(other); 221 else if (m_classType != ValueListClass && other.m_classType == ValueListClass) 222 return static_cast<const CSSValueList&>(other).equals(*this); 223 return false; 224 } 225 226 String CSSValue::cssText() const 227 { 228 if (m_isTextClone) { 229 ASSERT(isCSSOMSafe()); 230 return toTextCloneCSSValue(this)->cssText(); 231 } 232 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM()); 233 234 switch (classType()) { 235 case AspectRatioClass: 236 return toCSSAspectRatioValue(this)->customCSSText(); 237 case BorderImageSliceClass: 238 return toCSSBorderImageSliceValue(this)->customCSSText(); 239 case CanvasClass: 240 return toCSSCanvasValue(this)->customCSSText(); 241 case CursorImageClass: 242 return toCSSCursorImageValue(this)->customCSSText(); 243 case FontClass: 244 return toCSSFontValue(this)->customCSSText(); 245 case FontFaceSrcClass: 246 return toCSSFontFaceSrcValue(this)->customCSSText(); 247 case FontFeatureClass: 248 return toCSSFontFeatureValue(this)->customCSSText(); 249 case FunctionClass: 250 return toCSSFunctionValue(this)->customCSSText(); 251 case LinearGradientClass: 252 return toCSSLinearGradientValue(this)->customCSSText(); 253 case RadialGradientClass: 254 return toCSSRadialGradientValue(this)->customCSSText(); 255 case CrossfadeClass: 256 return toCSSCrossfadeValue(this)->customCSSText(); 257 case ImageClass: 258 return toCSSImageValue(this)->customCSSText(); 259 case InheritedClass: 260 return toCSSInheritedValue(this)->customCSSText(); 261 case InitialClass: 262 return toCSSInitialValue(this)->customCSSText(); 263 case GridLineNamesClass: 264 return toCSSGridLineNamesValue(this)->customCSSText(); 265 case GridTemplateAreasClass: 266 return toCSSGridTemplateAreasValue(this)->customCSSText(); 267 case PrimitiveClass: 268 return toCSSPrimitiveValue(this)->customCSSText(); 269 case ReflectClass: 270 return toCSSReflectValue(this)->customCSSText(); 271 case ShadowClass: 272 return toCSSShadowValue(this)->customCSSText(); 273 case CubicBezierTimingFunctionClass: 274 return toCSSCubicBezierTimingFunctionValue(this)->customCSSText(); 275 case StepsTimingFunctionClass: 276 return toCSSStepsTimingFunctionValue(this)->customCSSText(); 277 case UnicodeRangeClass: 278 return toCSSUnicodeRangeValue(this)->customCSSText(); 279 case ValueListClass: 280 return toCSSValueList(this)->customCSSText(); 281 case CSSTransformClass: 282 return toCSSTransformValue(this)->customCSSText(); 283 case LineBoxContainClass: 284 return toCSSLineBoxContainValue(this)->customCSSText(); 285 case CalculationClass: 286 return toCSSCalcValue(this)->customCSSText(); 287 case ImageSetClass: 288 return toCSSImageSetValue(this)->customCSSText(); 289 case CSSFilterClass: 290 return toCSSFilterValue(this)->customCSSText(); 291 case CSSSVGDocumentClass: 292 return toCSSSVGDocumentValue(this)->customCSSText(); 293 } 294 ASSERT_NOT_REACHED(); 295 return String(); 296 } 297 298 void CSSValue::destroy() 299 { 300 if (m_isTextClone) { 301 ASSERT(isCSSOMSafe()); 302 delete toTextCloneCSSValue(this); 303 return; 304 } 305 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM()); 306 307 switch (classType()) { 308 case AspectRatioClass: 309 delete toCSSAspectRatioValue(this); 310 return; 311 case BorderImageSliceClass: 312 delete toCSSBorderImageSliceValue(this); 313 return; 314 case CanvasClass: 315 delete toCSSCanvasValue(this); 316 return; 317 case CursorImageClass: 318 delete toCSSCursorImageValue(this); 319 return; 320 case FontClass: 321 delete toCSSFontValue(this); 322 return; 323 case FontFaceSrcClass: 324 delete toCSSFontFaceSrcValue(this); 325 return; 326 case FontFeatureClass: 327 delete toCSSFontFeatureValue(this); 328 return; 329 case FunctionClass: 330 delete toCSSFunctionValue(this); 331 return; 332 case LinearGradientClass: 333 delete toCSSLinearGradientValue(this); 334 return; 335 case RadialGradientClass: 336 delete toCSSRadialGradientValue(this); 337 return; 338 case CrossfadeClass: 339 delete toCSSCrossfadeValue(this); 340 return; 341 case ImageClass: 342 delete toCSSImageValue(this); 343 return; 344 case InheritedClass: 345 delete toCSSInheritedValue(this); 346 return; 347 case InitialClass: 348 delete toCSSInitialValue(this); 349 return; 350 case GridLineNamesClass: 351 delete toCSSGridLineNamesValue(this); 352 return; 353 case GridTemplateAreasClass: 354 delete toCSSGridTemplateAreasValue(this); 355 return; 356 case PrimitiveClass: 357 delete toCSSPrimitiveValue(this); 358 return; 359 case ReflectClass: 360 delete toCSSReflectValue(this); 361 return; 362 case ShadowClass: 363 delete toCSSShadowValue(this); 364 return; 365 case CubicBezierTimingFunctionClass: 366 delete toCSSCubicBezierTimingFunctionValue(this); 367 return; 368 case StepsTimingFunctionClass: 369 delete toCSSStepsTimingFunctionValue(this); 370 return; 371 case UnicodeRangeClass: 372 delete toCSSUnicodeRangeValue(this); 373 return; 374 case ValueListClass: 375 delete toCSSValueList(this); 376 return; 377 case CSSTransformClass: 378 delete toCSSTransformValue(this); 379 return; 380 case LineBoxContainClass: 381 delete toCSSLineBoxContainValue(this); 382 return; 383 case CalculationClass: 384 delete toCSSCalcValue(this); 385 return; 386 case ImageSetClass: 387 delete toCSSImageSetValue(this); 388 return; 389 case CSSFilterClass: 390 delete toCSSFilterValue(this); 391 return; 392 case CSSSVGDocumentClass: 393 delete toCSSSVGDocumentValue(this); 394 return; 395 } 396 ASSERT_NOT_REACHED(); 397 } 398 399 void CSSValue::finalizeGarbageCollectedObject() 400 { 401 if (m_isTextClone) { 402 ASSERT(isCSSOMSafe()); 403 toTextCloneCSSValue(this)->~TextCloneCSSValue(); 404 return; 405 } 406 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM()); 407 408 switch (classType()) { 409 case AspectRatioClass: 410 toCSSAspectRatioValue(this)->~CSSAspectRatioValue(); 411 return; 412 case BorderImageSliceClass: 413 toCSSBorderImageSliceValue(this)->~CSSBorderImageSliceValue(); 414 return; 415 case CanvasClass: 416 toCSSCanvasValue(this)->~CSSCanvasValue(); 417 return; 418 case CursorImageClass: 419 toCSSCursorImageValue(this)->~CSSCursorImageValue(); 420 return; 421 case FontClass: 422 toCSSFontValue(this)->~CSSFontValue(); 423 return; 424 case FontFaceSrcClass: 425 toCSSFontFaceSrcValue(this)->~CSSFontFaceSrcValue(); 426 return; 427 case FontFeatureClass: 428 toCSSFontFeatureValue(this)->~CSSFontFeatureValue(); 429 return; 430 case FunctionClass: 431 toCSSFunctionValue(this)->~CSSFunctionValue(); 432 return; 433 case LinearGradientClass: 434 toCSSLinearGradientValue(this)->~CSSLinearGradientValue(); 435 return; 436 case RadialGradientClass: 437 toCSSRadialGradientValue(this)->~CSSRadialGradientValue(); 438 return; 439 case CrossfadeClass: 440 toCSSCrossfadeValue(this)->~CSSCrossfadeValue(); 441 return; 442 case ImageClass: 443 toCSSImageValue(this)->~CSSImageValue(); 444 return; 445 case InheritedClass: 446 toCSSInheritedValue(this)->~CSSInheritedValue(); 447 return; 448 case InitialClass: 449 toCSSInitialValue(this)->~CSSInitialValue(); 450 return; 451 case GridLineNamesClass: 452 toCSSGridLineNamesValue(this)->~CSSGridLineNamesValue(); 453 return; 454 case GridTemplateAreasClass: 455 toCSSGridTemplateAreasValue(this)->~CSSGridTemplateAreasValue(); 456 return; 457 case PrimitiveClass: 458 toCSSPrimitiveValue(this)->~CSSPrimitiveValue(); 459 return; 460 case ReflectClass: 461 toCSSReflectValue(this)->~CSSReflectValue(); 462 return; 463 case ShadowClass: 464 toCSSShadowValue(this)->~CSSShadowValue(); 465 return; 466 case CubicBezierTimingFunctionClass: 467 toCSSCubicBezierTimingFunctionValue(this)->~CSSCubicBezierTimingFunctionValue(); 468 return; 469 case StepsTimingFunctionClass: 470 toCSSStepsTimingFunctionValue(this)->~CSSStepsTimingFunctionValue(); 471 return; 472 case UnicodeRangeClass: 473 toCSSUnicodeRangeValue(this)->~CSSUnicodeRangeValue(); 474 return; 475 case ValueListClass: 476 toCSSValueList(this)->~CSSValueList(); 477 return; 478 case CSSTransformClass: 479 toCSSTransformValue(this)->~CSSTransformValue(); 480 return; 481 case LineBoxContainClass: 482 toCSSLineBoxContainValue(this)->~CSSLineBoxContainValue(); 483 return; 484 case CalculationClass: 485 toCSSCalcValue(this)->~CSSCalcValue(); 486 return; 487 case ImageSetClass: 488 toCSSImageSetValue(this)->~CSSImageSetValue(); 489 return; 490 case CSSFilterClass: 491 toCSSFilterValue(this)->~CSSFilterValue(); 492 return; 493 case CSSSVGDocumentClass: 494 toCSSSVGDocumentValue(this)->~CSSSVGDocumentValue(); 495 return; 496 } 497 ASSERT_NOT_REACHED(); 498 } 499 500 void CSSValue::trace(Visitor* visitor) 501 { 502 if (m_isTextClone) { 503 ASSERT(isCSSOMSafe()); 504 toTextCloneCSSValue(this)->traceAfterDispatch(visitor); 505 return; 506 } 507 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM()); 508 509 switch (classType()) { 510 case AspectRatioClass: 511 toCSSAspectRatioValue(this)->traceAfterDispatch(visitor); 512 return; 513 case BorderImageSliceClass: 514 toCSSBorderImageSliceValue(this)->traceAfterDispatch(visitor); 515 return; 516 case CanvasClass: 517 toCSSCanvasValue(this)->traceAfterDispatch(visitor); 518 return; 519 case CursorImageClass: 520 toCSSCursorImageValue(this)->traceAfterDispatch(visitor); 521 return; 522 case FontClass: 523 toCSSFontValue(this)->traceAfterDispatch(visitor); 524 return; 525 case FontFaceSrcClass: 526 toCSSFontFaceSrcValue(this)->traceAfterDispatch(visitor); 527 return; 528 case FontFeatureClass: 529 toCSSFontFeatureValue(this)->traceAfterDispatch(visitor); 530 return; 531 case FunctionClass: 532 toCSSFunctionValue(this)->traceAfterDispatch(visitor); 533 return; 534 case LinearGradientClass: 535 toCSSLinearGradientValue(this)->traceAfterDispatch(visitor); 536 return; 537 case RadialGradientClass: 538 toCSSRadialGradientValue(this)->traceAfterDispatch(visitor); 539 return; 540 case CrossfadeClass: 541 toCSSCrossfadeValue(this)->traceAfterDispatch(visitor); 542 return; 543 case ImageClass: 544 toCSSImageValue(this)->traceAfterDispatch(visitor); 545 return; 546 case InheritedClass: 547 toCSSInheritedValue(this)->traceAfterDispatch(visitor); 548 return; 549 case InitialClass: 550 toCSSInitialValue(this)->traceAfterDispatch(visitor); 551 return; 552 case GridLineNamesClass: 553 toCSSGridLineNamesValue(this)->traceAfterDispatch(visitor); 554 return; 555 case GridTemplateAreasClass: 556 toCSSGridTemplateAreasValue(this)->traceAfterDispatch(visitor); 557 return; 558 case PrimitiveClass: 559 toCSSPrimitiveValue(this)->traceAfterDispatch(visitor); 560 return; 561 case ReflectClass: 562 toCSSReflectValue(this)->traceAfterDispatch(visitor); 563 return; 564 case ShadowClass: 565 toCSSShadowValue(this)->traceAfterDispatch(visitor); 566 return; 567 case CubicBezierTimingFunctionClass: 568 toCSSCubicBezierTimingFunctionValue(this)->traceAfterDispatch(visitor); 569 return; 570 case StepsTimingFunctionClass: 571 toCSSStepsTimingFunctionValue(this)->traceAfterDispatch(visitor); 572 return; 573 case UnicodeRangeClass: 574 toCSSUnicodeRangeValue(this)->traceAfterDispatch(visitor); 575 return; 576 case ValueListClass: 577 toCSSValueList(this)->traceAfterDispatch(visitor); 578 return; 579 case CSSTransformClass: 580 toCSSTransformValue(this)->traceAfterDispatch(visitor); 581 return; 582 case LineBoxContainClass: 583 toCSSLineBoxContainValue(this)->traceAfterDispatch(visitor); 584 return; 585 case CalculationClass: 586 toCSSCalcValue(this)->traceAfterDispatch(visitor); 587 return; 588 case ImageSetClass: 589 toCSSImageSetValue(this)->traceAfterDispatch(visitor); 590 return; 591 case CSSFilterClass: 592 toCSSFilterValue(this)->traceAfterDispatch(visitor); 593 return; 594 case CSSSVGDocumentClass: 595 toCSSSVGDocumentValue(this)->traceAfterDispatch(visitor); 596 return; 597 } 598 ASSERT_NOT_REACHED(); 599 } 600 601 PassRefPtrWillBeRawPtr<CSSValue> CSSValue::cloneForCSSOM() const 602 { 603 switch (classType()) { 604 case PrimitiveClass: 605 return toCSSPrimitiveValue(this)->cloneForCSSOM(); 606 case ValueListClass: 607 return toCSSValueList(this)->cloneForCSSOM(); 608 case ImageClass: 609 case CursorImageClass: 610 return toCSSImageValue(this)->cloneForCSSOM(); 611 case CSSFilterClass: 612 return toCSSFilterValue(this)->cloneForCSSOM(); 613 case CSSTransformClass: 614 return toCSSTransformValue(this)->cloneForCSSOM(); 615 case ImageSetClass: 616 return toCSSImageSetValue(this)->cloneForCSSOM(); 617 default: 618 ASSERT(!isSubtypeExposedToCSSOM()); 619 return TextCloneCSSValue::create(classType(), cssText()); 620 } 621 } 622 623 } 624