Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: Source/core/css/CSSValue.cpp

Issue 717933002: Clean up after getPropertyCSSValue (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: rebase / fix debug compile? Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/css/CSSValue.h ('k') | Source/core/css/CSSValue.idl » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 #include "core/css/CSSSVGDocumentValue.h" 51 #include "core/css/CSSSVGDocumentValue.h"
52 #include "core/css/CSSShadowValue.h" 52 #include "core/css/CSSShadowValue.h"
53 #include "core/css/CSSTimingFunctionValue.h" 53 #include "core/css/CSSTimingFunctionValue.h"
54 #include "core/css/CSSTransformValue.h" 54 #include "core/css/CSSTransformValue.h"
55 #include "core/css/CSSUnicodeRangeValue.h" 55 #include "core/css/CSSUnicodeRangeValue.h"
56 #include "core/css/CSSValueList.h" 56 #include "core/css/CSSValueList.h"
57 57
58 namespace blink { 58 namespace blink {
59 59
60 struct SameSizeAsCSSValue : public RefCountedWillBeGarbageCollectedFinalized<Sam eSizeAsCSSValue> 60 struct SameSizeAsCSSValue : public RefCountedWillBeGarbageCollectedFinalized<Sam eSizeAsCSSValue>
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 { 61 {
76 uint32_t bitfields; 62 uint32_t bitfields;
77 }; 63 };
78 64
79 COMPILE_ASSERT(sizeof(CSSValue) <= sizeof(SameSizeAsCSSValue), CSS_value_should_ stay_small); 65 COMPILE_ASSERT(sizeof(CSSValue) <= sizeof(SameSizeAsCSSValue), CSS_value_should_ stay_small);
80 66
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(vis itor); }
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 67 bool CSSValue::isImplicitInitialValue() const
106 { 68 {
107 return m_classType == InitialClass && toCSSInitialValue(this)->isImplicit(); 69 return m_classType == InitialClass && toCSSInitialValue(this)->isImplicit();
108 } 70 }
109 71
110 CSSValue::Type CSSValue::cssValueType() const 72 CSSValue::Type CSSValue::cssValueType() const
111 { 73 {
112 if (isInheritedValue()) 74 if (isInheritedValue())
113 return CSS_INHERIT; 75 return CSS_INHERIT;
114 if (isPrimitiveValue()) 76 if (isPrimitiveValue())
115 return CSS_PRIMITIVE_VALUE; 77 return CSS_PRIMITIVE_VALUE;
116 if (isValueList()) 78 if (isValueList())
117 return CSS_VALUE_LIST; 79 return CSS_VALUE_LIST;
118 if (isInitialValue()) 80 if (isInitialValue())
119 return CSS_INITIAL; 81 return CSS_INITIAL;
120 return CSS_CUSTOM; 82 return CSS_CUSTOM;
121 } 83 }
122 84
123 bool CSSValue::hasFailedOrCanceledSubresources() const 85 bool CSSValue::hasFailedOrCanceledSubresources() const
124 { 86 {
125 // This should get called for internal instances only.
126 ASSERT(!isCSSOMSafe());
127
128 if (isValueList()) 87 if (isValueList())
129 return toCSSValueList(this)->hasFailedOrCanceledSubresources(); 88 return toCSSValueList(this)->hasFailedOrCanceledSubresources();
130 if (classType() == FontFaceSrcClass) 89 if (classType() == FontFaceSrcClass)
131 return toCSSFontFaceSrcValue(this)->hasFailedOrCanceledSubresources(); 90 return toCSSFontFaceSrcValue(this)->hasFailedOrCanceledSubresources();
132 if (classType() == ImageClass) 91 if (classType() == ImageClass)
133 return toCSSImageValue(this)->hasFailedOrCanceledSubresources(); 92 return toCSSImageValue(this)->hasFailedOrCanceledSubresources();
134 if (classType() == CrossfadeClass) 93 if (classType() == CrossfadeClass)
135 return toCSSCrossfadeValue(this)->hasFailedOrCanceledSubresources(); 94 return toCSSCrossfadeValue(this)->hasFailedOrCanceledSubresources();
136 if (classType() == ImageSetClass) 95 if (classType() == ImageSetClass)
137 return toCSSImageSetValue(this)->hasFailedOrCanceledSubresources(); 96 return toCSSImageSetValue(this)->hasFailedOrCanceledSubresources();
138 97
139 return false; 98 return false;
140 } 99 }
141 100
142 template<class ChildClassType> 101 template<class ChildClassType>
143 inline static bool compareCSSValues(const CSSValue& first, const CSSValue& secon d) 102 inline static bool compareCSSValues(const CSSValue& first, const CSSValue& secon d)
144 { 103 {
145 return static_cast<const ChildClassType&>(first).equals(static_cast<const Ch ildClassType&>(second)); 104 return static_cast<const ChildClassType&>(first).equals(static_cast<const Ch ildClassType&>(second));
146 } 105 }
147 106
148 bool CSSValue::equals(const CSSValue& other) const 107 bool CSSValue::equals(const CSSValue& other) const
149 { 108 {
150 if (m_isTextClone) {
151 ASSERT(isCSSOMSafe());
152 return toTextCloneCSSValue(this)->cssText() == other.cssText();
153 }
154
155 if (m_classType == other.m_classType) { 109 if (m_classType == other.m_classType) {
156 switch (m_classType) { 110 switch (m_classType) {
157 case BorderImageSliceClass: 111 case BorderImageSliceClass:
158 return compareCSSValues<CSSBorderImageSliceValue>(*this, other); 112 return compareCSSValues<CSSBorderImageSliceValue>(*this, other);
159 case CanvasClass: 113 case CanvasClass:
160 return compareCSSValues<CSSCanvasValue>(*this, other); 114 return compareCSSValues<CSSCanvasValue>(*this, other);
161 case CursorImageClass: 115 case CursorImageClass:
162 return compareCSSValues<CSSCursorImageValue>(*this, other); 116 return compareCSSValues<CSSCursorImageValue>(*this, other);
163 case FontClass: 117 case FontClass:
164 return compareCSSValues<CSSFontValue>(*this, other); 118 return compareCSSValues<CSSFontValue>(*this, other);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 } 172 }
219 } else if (m_classType == ValueListClass && other.m_classType != ValueListCl ass) 173 } else if (m_classType == ValueListClass && other.m_classType != ValueListCl ass)
220 return toCSSValueList(this)->equals(other); 174 return toCSSValueList(this)->equals(other);
221 else if (m_classType != ValueListClass && other.m_classType == ValueListClas s) 175 else if (m_classType != ValueListClass && other.m_classType == ValueListClas s)
222 return static_cast<const CSSValueList&>(other).equals(*this); 176 return static_cast<const CSSValueList&>(other).equals(*this);
223 return false; 177 return false;
224 } 178 }
225 179
226 String CSSValue::cssText() const 180 String CSSValue::cssText() const
227 { 181 {
228 if (m_isTextClone) {
229 ASSERT(isCSSOMSafe());
230 return toTextCloneCSSValue(this)->cssText();
231 }
232 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
233
234 switch (classType()) { 182 switch (classType()) {
235 case BorderImageSliceClass: 183 case BorderImageSliceClass:
236 return toCSSBorderImageSliceValue(this)->customCSSText(); 184 return toCSSBorderImageSliceValue(this)->customCSSText();
237 case CanvasClass: 185 case CanvasClass:
238 return toCSSCanvasValue(this)->customCSSText(); 186 return toCSSCanvasValue(this)->customCSSText();
239 case CursorImageClass: 187 case CursorImageClass:
240 return toCSSCursorImageValue(this)->customCSSText(); 188 return toCSSCursorImageValue(this)->customCSSText();
241 case FontClass: 189 case FontClass:
242 return toCSSFontValue(this)->customCSSText(); 190 return toCSSFontValue(this)->customCSSText();
243 case FontFaceSrcClass: 191 case FontFaceSrcClass:
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 return toCSSSVGDocumentValue(this)->customCSSText(); 238 return toCSSSVGDocumentValue(this)->customCSSText();
291 case CSSContentDistributionClass: 239 case CSSContentDistributionClass:
292 return toCSSContentDistributionValue(this)->customCSSText(); 240 return toCSSContentDistributionValue(this)->customCSSText();
293 } 241 }
294 ASSERT_NOT_REACHED(); 242 ASSERT_NOT_REACHED();
295 return String(); 243 return String();
296 } 244 }
297 245
298 void CSSValue::destroy() 246 void CSSValue::destroy()
299 { 247 {
300 if (m_isTextClone) {
301 ASSERT(isCSSOMSafe());
302 delete toTextCloneCSSValue(this);
303 return;
304 }
305 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
306
307 switch (classType()) { 248 switch (classType()) {
308 case BorderImageSliceClass: 249 case BorderImageSliceClass:
309 delete toCSSBorderImageSliceValue(this); 250 delete toCSSBorderImageSliceValue(this);
310 return; 251 return;
311 case CanvasClass: 252 case CanvasClass:
312 delete toCSSCanvasValue(this); 253 delete toCSSCanvasValue(this);
313 return; 254 return;
314 case CursorImageClass: 255 case CursorImageClass:
315 delete toCSSCursorImageValue(this); 256 delete toCSSCursorImageValue(this);
316 return; 257 return;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 return; 332 return;
392 case CSSContentDistributionClass: 333 case CSSContentDistributionClass:
393 delete toCSSContentDistributionValue(this); 334 delete toCSSContentDistributionValue(this);
394 return; 335 return;
395 } 336 }
396 ASSERT_NOT_REACHED(); 337 ASSERT_NOT_REACHED();
397 } 338 }
398 339
399 void CSSValue::finalizeGarbageCollectedObject() 340 void CSSValue::finalizeGarbageCollectedObject()
400 { 341 {
401 if (m_isTextClone) {
402 ASSERT(isCSSOMSafe());
403 toTextCloneCSSValue(this)->~TextCloneCSSValue();
404 return;
405 }
406 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
407
408 switch (classType()) { 342 switch (classType()) {
409 case BorderImageSliceClass: 343 case BorderImageSliceClass:
410 toCSSBorderImageSliceValue(this)->~CSSBorderImageSliceValue(); 344 toCSSBorderImageSliceValue(this)->~CSSBorderImageSliceValue();
411 return; 345 return;
412 case CanvasClass: 346 case CanvasClass:
413 toCSSCanvasValue(this)->~CSSCanvasValue(); 347 toCSSCanvasValue(this)->~CSSCanvasValue();
414 return; 348 return;
415 case CursorImageClass: 349 case CursorImageClass:
416 toCSSCursorImageValue(this)->~CSSCursorImageValue(); 350 toCSSCursorImageValue(this)->~CSSCursorImageValue();
417 return; 351 return;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 return; 426 return;
493 case CSSContentDistributionClass: 427 case CSSContentDistributionClass:
494 toCSSContentDistributionValue(this)->~CSSContentDistributionValue(); 428 toCSSContentDistributionValue(this)->~CSSContentDistributionValue();
495 return; 429 return;
496 } 430 }
497 ASSERT_NOT_REACHED(); 431 ASSERT_NOT_REACHED();
498 } 432 }
499 433
500 void CSSValue::trace(Visitor* visitor) 434 void CSSValue::trace(Visitor* visitor)
501 { 435 {
502 if (m_isTextClone) {
503 ASSERT(isCSSOMSafe());
504 toTextCloneCSSValue(this)->traceAfterDispatch(visitor);
505 return;
506 }
507 ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
508
509 switch (classType()) { 436 switch (classType()) {
510 case BorderImageSliceClass: 437 case BorderImageSliceClass:
511 toCSSBorderImageSliceValue(this)->traceAfterDispatch(visitor); 438 toCSSBorderImageSliceValue(this)->traceAfterDispatch(visitor);
512 return; 439 return;
513 case CanvasClass: 440 case CanvasClass:
514 toCSSCanvasValue(this)->traceAfterDispatch(visitor); 441 toCSSCanvasValue(this)->traceAfterDispatch(visitor);
515 return; 442 return;
516 case CursorImageClass: 443 case CursorImageClass:
517 toCSSCursorImageValue(this)->traceAfterDispatch(visitor); 444 toCSSCursorImageValue(this)->traceAfterDispatch(visitor);
518 return; 445 return;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
591 case CSSSVGDocumentClass: 518 case CSSSVGDocumentClass:
592 toCSSSVGDocumentValue(this)->traceAfterDispatch(visitor); 519 toCSSSVGDocumentValue(this)->traceAfterDispatch(visitor);
593 return; 520 return;
594 case CSSContentDistributionClass: 521 case CSSContentDistributionClass:
595 toCSSContentDistributionValue(this)->traceAfterDispatch(visitor); 522 toCSSContentDistributionValue(this)->traceAfterDispatch(visitor);
596 return; 523 return;
597 } 524 }
598 ASSERT_NOT_REACHED(); 525 ASSERT_NOT_REACHED();
599 } 526 }
600 527
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 } 528 }
622
623 }
OLDNEW
« no previous file with comments | « Source/core/css/CSSValue.h ('k') | Source/core/css/CSSValue.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698