Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Andreas Kling (kling@webkit.org) | 2 * Copyright (C) 2011 Andreas Kling (kling@webkit.org) |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 24 * | 24 * |
| 25 */ | 25 */ |
| 26 | 26 |
| 27 #include "config.h" | 27 #include "config.h" |
| 28 #include "core/css/CSSValue.h" | 28 #include "core/css/CSSValue.h" |
| 29 | 29 |
| 30 #include "core/css/CSSBorderImageSliceValue.h" | 30 #include "core/css/CSSBorderImageSliceValue.h" |
| 31 #include "core/css/CSSCanvasValue.h" | 31 #include "core/css/CSSCanvasValue.h" |
| 32 #include "core/css/CSSContentDistributionValue.h" | 32 #include "core/css/CSSContentDistributionValue.h" |
| 33 #include "core/css/CSSCounterValue.h" | |
| 33 #include "core/css/CSSCrossfadeValue.h" | 34 #include "core/css/CSSCrossfadeValue.h" |
| 34 #include "core/css/CSSCursorImageValue.h" | 35 #include "core/css/CSSCursorImageValue.h" |
| 35 #include "core/css/CSSFontFaceSrcValue.h" | 36 #include "core/css/CSSFontFaceSrcValue.h" |
| 36 #include "core/css/CSSFontFeatureValue.h" | 37 #include "core/css/CSSFontFeatureValue.h" |
| 37 #include "core/css/CSSFunctionValue.h" | 38 #include "core/css/CSSFunctionValue.h" |
| 38 #include "core/css/CSSGradientValue.h" | 39 #include "core/css/CSSGradientValue.h" |
| 39 #include "core/css/CSSGridLineNamesValue.h" | 40 #include "core/css/CSSGridLineNamesValue.h" |
| 40 #include "core/css/CSSGridTemplateAreasValue.h" | 41 #include "core/css/CSSGridTemplateAreasValue.h" |
| 41 #include "core/css/CSSImageSetValue.h" | 42 #include "core/css/CSSImageSetValue.h" |
| 42 #include "core/css/CSSImageValue.h" | 43 #include "core/css/CSSImageValue.h" |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 54 #include "core/css/CSSValueList.h" | 55 #include "core/css/CSSValueList.h" |
| 55 | 56 |
| 56 namespace blink { | 57 namespace blink { |
| 57 | 58 |
| 58 struct SameSizeAsCSSValue : public RefCountedWillBeGarbageCollectedFinalized<Sam eSizeAsCSSValue> { | 59 struct SameSizeAsCSSValue : public RefCountedWillBeGarbageCollectedFinalized<Sam eSizeAsCSSValue> { |
| 59 uint32_t bitfields; | 60 uint32_t bitfields; |
| 60 }; | 61 }; |
| 61 | 62 |
| 62 static_assert(sizeof(CSSValue) <= sizeof(SameSizeAsCSSValue), "CSSValue should s tay small"); | 63 static_assert(sizeof(CSSValue) <= sizeof(SameSizeAsCSSValue), "CSSValue should s tay small"); |
| 63 | 64 |
| 65 typedef HashMap<const CSSValue*, String> CSSTextCache; | |
| 66 static CSSTextCache& cssTextCache() | |
| 67 { | |
| 68 AtomicallyInitializedStaticReference(ThreadSpecific<CSSTextCache>, cache, ne w ThreadSpecific<CSSTextCache>()); | |
| 69 return *cache; | |
| 70 } | |
| 71 | |
| 64 bool CSSValue::isImplicitInitialValue() const | 72 bool CSSValue::isImplicitInitialValue() const |
| 65 { | 73 { |
| 66 return m_classType == InitialClass && toCSSInitialValue(this)->isImplicit(); | 74 return m_classType == InitialClass && toCSSInitialValue(this)->isImplicit(); |
| 67 } | 75 } |
| 68 | 76 |
| 69 bool CSSValue::hasFailedOrCanceledSubresources() const | 77 bool CSSValue::hasFailedOrCanceledSubresources() const |
| 70 { | 78 { |
| 71 if (isValueList()) | 79 if (isValueList()) |
| 72 return toCSSValueList(this)->hasFailedOrCanceledSubresources(); | 80 return toCSSValueList(this)->hasFailedOrCanceledSubresources(); |
| 73 if (classType() == FontFaceSrcClass) | 81 if (classType() == FontFaceSrcClass) |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 89 } | 97 } |
| 90 | 98 |
| 91 bool CSSValue::equals(const CSSValue& other) const | 99 bool CSSValue::equals(const CSSValue& other) const |
| 92 { | 100 { |
| 93 if (m_classType == other.m_classType) { | 101 if (m_classType == other.m_classType) { |
| 94 switch (m_classType) { | 102 switch (m_classType) { |
| 95 case BorderImageSliceClass: | 103 case BorderImageSliceClass: |
| 96 return compareCSSValues<CSSBorderImageSliceValue>(*this, other); | 104 return compareCSSValues<CSSBorderImageSliceValue>(*this, other); |
| 97 case CanvasClass: | 105 case CanvasClass: |
| 98 return compareCSSValues<CSSCanvasValue>(*this, other); | 106 return compareCSSValues<CSSCanvasValue>(*this, other); |
| 107 case CounterClass: | |
| 108 return compareCSSValues<CSSCounterValue>(*this, other); | |
| 99 case CursorImageClass: | 109 case CursorImageClass: |
| 100 return compareCSSValues<CSSCursorImageValue>(*this, other); | 110 return compareCSSValues<CSSCursorImageValue>(*this, other); |
| 101 case FontFaceSrcClass: | 111 case FontFaceSrcClass: |
| 102 return compareCSSValues<CSSFontFaceSrcValue>(*this, other); | 112 return compareCSSValues<CSSFontFaceSrcValue>(*this, other); |
| 103 case FontFeatureClass: | 113 case FontFeatureClass: |
| 104 return compareCSSValues<CSSFontFeatureValue>(*this, other); | 114 return compareCSSValues<CSSFontFeatureValue>(*this, other); |
| 105 case FunctionClass: | 115 case FunctionClass: |
| 106 return compareCSSValues<CSSFunctionValue>(*this, other); | 116 return compareCSSValues<CSSFunctionValue>(*this, other); |
| 107 case LinearGradientClass: | 117 case LinearGradientClass: |
| 108 return compareCSSValues<CSSLinearGradientValue>(*this, other); | 118 return compareCSSValues<CSSLinearGradientValue>(*this, other); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 149 default: | 159 default: |
| 150 ASSERT_NOT_REACHED(); | 160 ASSERT_NOT_REACHED(); |
| 151 return false; | 161 return false; |
| 152 } | 162 } |
| 153 } | 163 } |
| 154 return false; | 164 return false; |
| 155 } | 165 } |
| 156 | 166 |
| 157 String CSSValue::cssText() const | 167 String CSSValue::cssText() const |
| 158 { | 168 { |
| 169 if (m_hasCachedCSSText) { | |
| 170 ASSERT(cssTextCache().contains(this)); | |
| 171 return cssTextCache().get(this); | |
| 172 } | |
| 173 | |
| 174 String text; | |
|
Timothy Loh
2015/08/21 07:33:12
String CSSValue::uncachedCSSText() const { .. }?
sashab
2015/08/24 01:36:11
Should I do this in CSSPrimitiveValue? Not sure ho
| |
| 159 switch (classType()) { | 175 switch (classType()) { |
| 160 case BorderImageSliceClass: | 176 case BorderImageSliceClass: |
| 161 return toCSSBorderImageSliceValue(this)->customCSSText(); | 177 text = toCSSBorderImageSliceValue(this)->customCSSText(); |
| 178 break; | |
| 162 case CanvasClass: | 179 case CanvasClass: |
| 163 return toCSSCanvasValue(this)->customCSSText(); | 180 text = toCSSCanvasValue(this)->customCSSText(); |
| 181 break; | |
| 182 case CounterClass: | |
| 183 text = toCSSCounterValue(this)->customCSSText(); | |
| 184 break; | |
| 164 case CursorImageClass: | 185 case CursorImageClass: |
| 165 return toCSSCursorImageValue(this)->customCSSText(); | 186 text = toCSSCursorImageValue(this)->customCSSText(); |
| 187 break; | |
| 166 case FontFaceSrcClass: | 188 case FontFaceSrcClass: |
| 167 return toCSSFontFaceSrcValue(this)->customCSSText(); | 189 text = toCSSFontFaceSrcValue(this)->customCSSText(); |
| 190 break; | |
| 168 case FontFeatureClass: | 191 case FontFeatureClass: |
| 169 return toCSSFontFeatureValue(this)->customCSSText(); | 192 text = toCSSFontFeatureValue(this)->customCSSText(); |
| 193 break; | |
| 170 case FunctionClass: | 194 case FunctionClass: |
| 171 return toCSSFunctionValue(this)->customCSSText(); | 195 text = toCSSFunctionValue(this)->customCSSText(); |
| 196 break; | |
| 172 case LinearGradientClass: | 197 case LinearGradientClass: |
| 173 return toCSSLinearGradientValue(this)->customCSSText(); | 198 text = toCSSLinearGradientValue(this)->customCSSText(); |
| 199 break; | |
| 174 case RadialGradientClass: | 200 case RadialGradientClass: |
| 175 return toCSSRadialGradientValue(this)->customCSSText(); | 201 text = toCSSRadialGradientValue(this)->customCSSText(); |
| 202 break; | |
| 176 case CrossfadeClass: | 203 case CrossfadeClass: |
| 177 return toCSSCrossfadeValue(this)->customCSSText(); | 204 text = toCSSCrossfadeValue(this)->customCSSText(); |
| 205 break; | |
| 178 case ImageClass: | 206 case ImageClass: |
| 179 return toCSSImageValue(this)->customCSSText(); | 207 text = toCSSImageValue(this)->customCSSText(); |
| 208 break; | |
| 180 case InheritedClass: | 209 case InheritedClass: |
| 181 return toCSSInheritedValue(this)->customCSSText(); | 210 text = toCSSInheritedValue(this)->customCSSText(); |
| 211 break; | |
| 182 case UnsetClass: | 212 case UnsetClass: |
| 183 return toCSSUnsetValue(this)->customCSSText(); | 213 text = toCSSUnsetValue(this)->customCSSText(); |
| 214 break; | |
| 184 case InitialClass: | 215 case InitialClass: |
| 185 return toCSSInitialValue(this)->customCSSText(); | 216 text = toCSSInitialValue(this)->customCSSText(); |
| 217 break; | |
| 186 case GridLineNamesClass: | 218 case GridLineNamesClass: |
| 187 return toCSSGridLineNamesValue(this)->customCSSText(); | 219 text = toCSSGridLineNamesValue(this)->customCSSText(); |
| 220 break; | |
| 188 case GridTemplateAreasClass: | 221 case GridTemplateAreasClass: |
| 189 return toCSSGridTemplateAreasValue(this)->customCSSText(); | 222 text = toCSSGridTemplateAreasValue(this)->customCSSText(); |
| 223 break; | |
| 190 case PathClass: | 224 case PathClass: |
| 191 return toCSSPathValue(this)->customCSSText(); | 225 text = toCSSPathValue(this)->customCSSText(); |
| 226 break; | |
| 192 case PrimitiveClass: | 227 case PrimitiveClass: |
| 193 return toCSSPrimitiveValue(this)->customCSSText(); | 228 text = toCSSPrimitiveValue(this)->customCSSText(); |
| 229 break; | |
| 194 case ReflectClass: | 230 case ReflectClass: |
| 195 return toCSSReflectValue(this)->customCSSText(); | 231 text = toCSSReflectValue(this)->customCSSText(); |
| 232 break; | |
| 196 case ShadowClass: | 233 case ShadowClass: |
| 197 return toCSSShadowValue(this)->customCSSText(); | 234 text = toCSSShadowValue(this)->customCSSText(); |
| 235 break; | |
| 198 case CubicBezierTimingFunctionClass: | 236 case CubicBezierTimingFunctionClass: |
| 199 return toCSSCubicBezierTimingFunctionValue(this)->customCSSText(); | 237 text = toCSSCubicBezierTimingFunctionValue(this)->customCSSText(); |
| 238 break; | |
| 200 case StepsTimingFunctionClass: | 239 case StepsTimingFunctionClass: |
| 201 return toCSSStepsTimingFunctionValue(this)->customCSSText(); | 240 text = toCSSStepsTimingFunctionValue(this)->customCSSText(); |
| 241 break; | |
| 202 case UnicodeRangeClass: | 242 case UnicodeRangeClass: |
| 203 return toCSSUnicodeRangeValue(this)->customCSSText(); | 243 text = toCSSUnicodeRangeValue(this)->customCSSText(); |
| 244 break; | |
| 204 case ValueListClass: | 245 case ValueListClass: |
| 205 return toCSSValueList(this)->customCSSText(); | 246 text = toCSSValueList(this)->customCSSText(); |
| 247 break; | |
| 206 case LineBoxContainClass: | 248 case LineBoxContainClass: |
| 207 return toCSSLineBoxContainValue(this)->customCSSText(); | 249 text = toCSSLineBoxContainValue(this)->customCSSText(); |
| 250 break; | |
| 208 case ImageSetClass: | 251 case ImageSetClass: |
| 209 return toCSSImageSetValue(this)->customCSSText(); | 252 text = toCSSImageSetValue(this)->customCSSText(); |
| 253 break; | |
| 210 case CSSSVGDocumentClass: | 254 case CSSSVGDocumentClass: |
| 211 return toCSSSVGDocumentValue(this)->customCSSText(); | 255 text = toCSSSVGDocumentValue(this)->customCSSText(); |
| 256 break; | |
| 212 case CSSContentDistributionClass: | 257 case CSSContentDistributionClass: |
| 213 return toCSSContentDistributionValue(this)->customCSSText(); | 258 text = toCSSContentDistributionValue(this)->customCSSText(); |
| 259 break; | |
| 214 } | 260 } |
| 215 ASSERT_NOT_REACHED(); | 261 |
| 216 return String(); | 262 ASSERT(!cssTextCache().contains(this)); |
| 263 cssTextCache().set(this, text); | |
| 264 m_hasCachedCSSText = true; | |
| 265 return text; | |
| 217 } | 266 } |
| 218 | 267 |
| 219 void CSSValue::destroy() | 268 void CSSValue::destroy() |
| 220 { | 269 { |
| 270 if (m_hasCachedCSSText) { | |
| 271 cssTextCache().remove(this); | |
| 272 m_hasCachedCSSText = false; | |
| 273 } | |
| 274 | |
| 221 switch (classType()) { | 275 switch (classType()) { |
| 222 case BorderImageSliceClass: | 276 case BorderImageSliceClass: |
| 223 delete toCSSBorderImageSliceValue(this); | 277 delete toCSSBorderImageSliceValue(this); |
| 224 return; | 278 return; |
| 225 case CanvasClass: | 279 case CanvasClass: |
| 226 delete toCSSCanvasValue(this); | 280 delete toCSSCanvasValue(this); |
| 227 return; | 281 return; |
| 282 case CounterClass: | |
| 283 delete toCSSCounterValue(this); | |
| 284 return; | |
| 228 case CursorImageClass: | 285 case CursorImageClass: |
| 229 delete toCSSCursorImageValue(this); | 286 delete toCSSCursorImageValue(this); |
| 230 return; | 287 return; |
| 231 case FontFaceSrcClass: | 288 case FontFaceSrcClass: |
| 232 delete toCSSFontFaceSrcValue(this); | 289 delete toCSSFontFaceSrcValue(this); |
| 233 return; | 290 return; |
| 234 case FontFeatureClass: | 291 case FontFeatureClass: |
| 235 delete toCSSFontFeatureValue(this); | 292 delete toCSSFontFeatureValue(this); |
| 236 return; | 293 return; |
| 237 case FunctionClass: | 294 case FunctionClass: |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 306 | 363 |
| 307 void CSSValue::finalizeGarbageCollectedObject() | 364 void CSSValue::finalizeGarbageCollectedObject() |
| 308 { | 365 { |
| 309 switch (classType()) { | 366 switch (classType()) { |
| 310 case BorderImageSliceClass: | 367 case BorderImageSliceClass: |
| 311 toCSSBorderImageSliceValue(this)->~CSSBorderImageSliceValue(); | 368 toCSSBorderImageSliceValue(this)->~CSSBorderImageSliceValue(); |
| 312 return; | 369 return; |
| 313 case CanvasClass: | 370 case CanvasClass: |
| 314 toCSSCanvasValue(this)->~CSSCanvasValue(); | 371 toCSSCanvasValue(this)->~CSSCanvasValue(); |
| 315 return; | 372 return; |
| 373 case CounterClass: | |
| 374 toCSSCounterValue(this)->~CSSCounterValue(); | |
| 375 return; | |
| 316 case CursorImageClass: | 376 case CursorImageClass: |
| 317 toCSSCursorImageValue(this)->~CSSCursorImageValue(); | 377 toCSSCursorImageValue(this)->~CSSCursorImageValue(); |
| 318 return; | 378 return; |
| 319 case FontFaceSrcClass: | 379 case FontFaceSrcClass: |
| 320 toCSSFontFaceSrcValue(this)->~CSSFontFaceSrcValue(); | 380 toCSSFontFaceSrcValue(this)->~CSSFontFaceSrcValue(); |
| 321 return; | 381 return; |
| 322 case FontFeatureClass: | 382 case FontFeatureClass: |
| 323 toCSSFontFeatureValue(this)->~CSSFontFeatureValue(); | 383 toCSSFontFeatureValue(this)->~CSSFontFeatureValue(); |
| 324 return; | 384 return; |
| 325 case FunctionClass: | 385 case FunctionClass: |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 394 | 454 |
| 395 DEFINE_TRACE(CSSValue) | 455 DEFINE_TRACE(CSSValue) |
| 396 { | 456 { |
| 397 switch (classType()) { | 457 switch (classType()) { |
| 398 case BorderImageSliceClass: | 458 case BorderImageSliceClass: |
| 399 toCSSBorderImageSliceValue(this)->traceAfterDispatch(visitor); | 459 toCSSBorderImageSliceValue(this)->traceAfterDispatch(visitor); |
| 400 return; | 460 return; |
| 401 case CanvasClass: | 461 case CanvasClass: |
| 402 toCSSCanvasValue(this)->traceAfterDispatch(visitor); | 462 toCSSCanvasValue(this)->traceAfterDispatch(visitor); |
| 403 return; | 463 return; |
| 464 case CounterClass: | |
| 465 toCSSCounterValue(this)->traceAfterDispatch(visitor); | |
| 466 return; | |
| 404 case CursorImageClass: | 467 case CursorImageClass: |
| 405 toCSSCursorImageValue(this)->traceAfterDispatch(visitor); | 468 toCSSCursorImageValue(this)->traceAfterDispatch(visitor); |
| 406 return; | 469 return; |
| 407 case FontFaceSrcClass: | 470 case FontFaceSrcClass: |
| 408 toCSSFontFaceSrcValue(this)->traceAfterDispatch(visitor); | 471 toCSSFontFaceSrcValue(this)->traceAfterDispatch(visitor); |
| 409 return; | 472 return; |
| 410 case FontFeatureClass: | 473 case FontFeatureClass: |
| 411 toCSSFontFeatureValue(this)->traceAfterDispatch(visitor); | 474 toCSSFontFeatureValue(this)->traceAfterDispatch(visitor); |
| 412 return; | 475 return; |
| 413 case FunctionClass: | 476 case FunctionClass: |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 474 toCSSSVGDocumentValue(this)->traceAfterDispatch(visitor); | 537 toCSSSVGDocumentValue(this)->traceAfterDispatch(visitor); |
| 475 return; | 538 return; |
| 476 case CSSContentDistributionClass: | 539 case CSSContentDistributionClass: |
| 477 toCSSContentDistributionValue(this)->traceAfterDispatch(visitor); | 540 toCSSContentDistributionValue(this)->traceAfterDispatch(visitor); |
| 478 return; | 541 return; |
| 479 } | 542 } |
| 480 ASSERT_NOT_REACHED(); | 543 ASSERT_NOT_REACHED(); |
| 481 } | 544 } |
| 482 | 545 |
| 483 } | 546 } |
| OLD | NEW |