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 |