OLD | NEW |
1 /* | 1 /* |
2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) | 2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 23 matching lines...) Expand all Loading... |
34 // CSSValueObject. | 34 // CSSValueObject. |
35 class CORE_EXPORT CSSValue { | 35 class CORE_EXPORT CSSValue { |
36 ALLOW_ONLY_INLINE_ALLOCATION(); | 36 ALLOW_ONLY_INLINE_ALLOCATION(); |
37 friend class NullableCSSValue; | 37 friend class NullableCSSValue; |
38 public: | 38 public: |
39 // Not explicit to allow for casting. | 39 // Not explicit to allow for casting. |
40 CSSValue(const CSSValueObject& cssValueObject) | 40 CSSValue(const CSSValueObject& cssValueObject) |
41 : m_data(const_cast<CSSValueObject*>(&cssValueObject)) | 41 : m_data(const_cast<CSSValueObject*>(&cssValueObject)) |
42 { | 42 { |
43 ASSERT(m_data); | 43 ASSERT(m_data); |
| 44 ASSERT(isObject()); |
44 ref(); | 45 ref(); |
45 } | 46 } |
46 | 47 |
47 // TODO(sashab): Remove these; construction should only be available with | 48 // TODO(sashab): Remove these; construction should only be available with |
48 // CSSValueObject&. | 49 // CSSValueObject&. |
49 template<class T> CSSValue(PassRefPtrWillBeRawPtr<T> cssValueObject) | 50 template<class T> CSSValue(PassRefPtrWillBeRawPtr<T> cssValueObject) |
50 : m_data(cssValueObject.leakRef()) | 51 : m_data(cssValueObject.leakRef()) |
51 { | 52 { |
52 static_assert(WTF::IsSubclass<T, CSSValueObject>::value, "Parameter must
be a container for CSSValueObject"); | 53 static_assert(WTF::IsSubclass<T, CSSValueObject>::value, "Parameter must
be a container for CSSValueObject"); |
| 54 ASSERT(isObject()); |
53 ASSERT(m_data); | 55 ASSERT(m_data); |
54 } | 56 } |
55 | 57 |
56 #if !ENABLE(OILPAN) | 58 #if !ENABLE(OILPAN) |
57 template<class T> CSSValue(RefPtrWillBeRawPtr<T> cssValueObject) | 59 template<class T> CSSValue(RefPtrWillBeRawPtr<T> cssValueObject) |
58 : m_data(cssValueObject.release().leakRef()) | 60 : m_data(cssValueObject.release().leakRef()) |
59 { | 61 { |
60 static_assert(WTF::IsSubclass<T, CSSValueObject>::value, "Parameter must
be a container for CSSValueObject"); | 62 static_assert(WTF::IsSubclass<T, CSSValueObject>::value, "Parameter must
be a container for CSSValueObject"); |
| 63 ASSERT(isObject()); |
61 ASSERT(m_data); | 64 ASSERT(m_data); |
62 } | 65 } |
63 #endif | 66 #endif |
64 | 67 |
65 CSSValue(const CSSValue& cssValue) | 68 CSSValue(const CSSValue& cssValue) |
66 : m_data(cssValue.m_data) | 69 : m_data(cssValue.m_data) |
67 { | 70 { |
68 ref(); | 71 ref(); |
69 } | 72 } |
70 | 73 |
(...skipping 12 matching lines...) Expand all Loading... |
83 CSSValue& operator=(const CSSValue& rhs) | 86 CSSValue& operator=(const CSSValue& rhs) |
84 { | 87 { |
85 rhs.ref(); | 88 rhs.ref(); |
86 deref(); | 89 deref(); |
87 m_data = rhs.m_data; | 90 m_data = rhs.m_data; |
88 return *this; | 91 return *this; |
89 } | 92 } |
90 | 93 |
91 bool operator==(const CSSValue& other) const | 94 bool operator==(const CSSValue& other) const |
92 { | 95 { |
| 96 if (m_data == other.m_data) |
| 97 return true; |
| 98 if (!isObject() || !other.isObject()) |
| 99 return false; |
93 return m_data->equals(*other.m_data); | 100 return m_data->equals(*other.m_data); |
94 } | 101 } |
95 | 102 |
96 // TODO: Remove this and update callsites to use operator== instead. | 103 // TODO: Remove this and update callsites to use operator== instead. |
97 bool equals(const CSSValue& other) const | 104 bool equals(const CSSValue& other) const |
98 { | 105 { |
| 106 if (m_data == other.m_data) |
| 107 return true; |
| 108 if (!isObject() || !other.isObject()) |
| 109 return false; |
99 return m_data->equals(*other.m_data); | 110 return m_data->equals(*other.m_data); |
100 } | 111 } |
101 | 112 |
102 bool ptrEquals(const CSSValue& other) const | 113 bool ptrEquals(const CSSValue& other) const |
103 { | 114 { |
104 return m_data == other.m_data; | 115 return m_data == other.m_data; |
105 } | 116 } |
106 | 117 |
107 // Methods that proxy to CSSValueObject. | 118 // Methods that proxy to CSSValueObject. |
108 String cssText() const { return m_data->cssText(); } | 119 String cssText() const |
109 bool hasFailedOrCanceledSubresources() const { return m_data->hasFailedOrCan
celedSubresources(); }; | 120 { |
110 bool isPrimitiveValue() const { return m_data->isPrimitiveValue(); } | 121 if (isObject()) |
111 bool isValueList() const { return m_data->isValueList(); } | 122 return m_data->cssText(); |
112 bool isBaseValueList() const { return m_data->isBaseValueList(); } | 123 return CSSPrimitiveValue(reinterpret_cast<CSSPrimitiveValue::CSSLargePri
mitiveValue*>(m_data.get())).cssText(); |
113 bool isBorderImageSliceValue() const { return m_data->isBorderImageSliceValu
e(); } | 124 } |
114 bool isCanvasValue() const { return m_data->isCanvasValue(); } | 125 |
115 bool isCursorImageValue() const { return m_data->isCursorImageValue(); } | 126 bool hasFailedOrCanceledSubresources() const { return isObject() ? m_data->h
asFailedOrCanceledSubresources() : false; }; |
116 bool isCrossfadeValue() const { return m_data->isCrossfadeValue(); } | 127 bool isPrimitiveValue() const { return isObject() ? m_data->isPrimitiveValue
() : true; } |
117 bool isFontFeatureValue() const { return m_data->isFontFeatureValue(); } | 128 bool isValueList() const { return isObject() ? m_data->isValueList() : false
; } |
118 bool isFontFaceSrcValue() const { return m_data->isFontFaceSrcValue(); } | 129 bool isBaseValueList() const { return isObject() ? m_data->isBaseValueList()
: false; } |
119 bool isFunctionValue() const { return m_data->isFunctionValue(); } | 130 bool isBorderImageSliceValue() const { return isObject() ? m_data->isBorderI
mageSliceValue() : false; } |
120 bool isImageGeneratorValue() const { return m_data->isImageGeneratorValue();
} | 131 bool isCanvasValue() const { return isObject() ? m_data->isCanvasValue() : f
alse; } |
121 bool isGradientValue() const { return m_data->isGradientValue(); } | 132 bool isCursorImageValue() const { return isObject() ? m_data->isCursorImageV
alue() : false; } |
122 bool isImageSetValue() const { return m_data->isImageSetValue(); } | 133 bool isCrossfadeValue() const { return isObject() ? m_data->isCrossfadeValue
() : false; } |
123 bool isImageValue() const { return m_data->isImageValue(); } | 134 bool isFontFeatureValue() const { return isObject() ? m_data->isFontFeatureV
alue(): false; } |
124 bool isImplicitInitialValue() const { return m_data->isImplicitInitialValue(
); }; | 135 bool isFontFaceSrcValue() const { return isObject() ? m_data->isFontFaceSrcV
alue(): false; } |
125 bool isInheritedValue() const { return m_data->isInheritedValue(); }; | 136 bool isFunctionValue() const { return isObject() ? m_data->isFunctionValue()
: false; } |
126 bool isInitialValue() const { return m_data->isInitialValue(); }; | 137 bool isImageGeneratorValue() const { return isObject() ? m_data->isImageGene
ratorValue(): false; } |
127 bool isUnsetValue() const { return m_data->isUnsetValue(); }; | 138 bool isGradientValue() const { return isObject() ? m_data->isGradientValue()
: false; } |
128 bool isCSSWideKeyword() const { return m_data->isCSSWideKeyword(); }; | 139 bool isImageSetValue() const { return isObject() ? m_data->isImageSetValue()
: false; } |
129 bool isLinearGradientValue() const { return m_data->isLinearGradientValue();
}; | 140 bool isImageValue() const { return isObject() ? m_data->isImageValue(): fals
e; } |
130 bool isPathValue() const { return m_data->isPathValue(); }; | 141 bool isImplicitInitialValue() const { return isObject() ? m_data->isImplicit
InitialValue(): false; } |
131 bool isRadialGradientValue() const { return m_data->isRadialGradientValue();
}; | 142 bool isInheritedValue() const { return isObject() ? m_data->isInheritedValue
(): false; } |
132 bool isReflectValue() const { return m_data->isReflectValue(); }; | 143 bool isInitialValue() const { return isObject() ? m_data->isInitialValue():
false; } |
133 bool isShadowValue() const { return m_data->isShadowValue(); }; | 144 bool isUnsetValue() const { return isObject() ? m_data->isUnsetValue(): fals
e; } |
134 bool isCubicBezierTimingFunctionValue() const { return m_data->isCubicBezier
TimingFunctionValue(); }; | 145 bool isCSSWideKeyword() const { return isObject() ? m_data->isCSSWideKeyword
(): false; } |
135 bool isStepsTimingFunctionValue() const { return m_data->isStepsTimingFuncti
onValue(); }; | 146 bool isLinearGradientValue() const { return isObject() ? m_data->isLinearGra
dientValue(): false; } |
136 bool isLineBoxContainValue() const { return m_data->isLineBoxContainValue();
}; | 147 bool isPathValue() const { return isObject() ? m_data->isPathValue(): false;
} |
137 bool isCalcValue() const { return m_data->isCalcValue(); }; | 148 bool isRadialGradientValue() const { return isObject() ? m_data->isRadialGra
dientValue(): false; } |
138 bool isGridTemplateAreasValue() const { return m_data->isGridTemplateAreasVa
lue(); }; | 149 bool isReflectValue() const { return isObject() ? m_data->isReflectValue():
false; } |
139 bool isSVGDocumentValue() const { return m_data->isSVGDocumentValue(); }; | 150 bool isShadowValue() const { return isObject() ? m_data->isShadowValue(): fa
lse; } |
140 bool isContentDistributionValue() const { return m_data->isContentDistributi
onValue(); }; | 151 bool isCubicBezierTimingFunctionValue() const { return isObject() ? m_data->
isCubicBezierTimingFunctionValue(): false; } |
141 bool isUnicodeRangeValue() const { return m_data->isUnicodeRangeValue(); }; | 152 bool isStepsTimingFunctionValue() const { return isObject() ? m_data->isStep
sTimingFunctionValue(): false; } |
142 bool isGridLineNamesValue() const { return m_data->isGridLineNamesValue(); }
; | 153 bool isLineBoxContainValue() const { return isObject() ? m_data->isLineBoxCo
ntainValue(): false; } |
| 154 bool isCalcValue() const { return isObject() ? m_data->isCalcValue(): false;
} |
| 155 bool isGridTemplateAreasValue() const { return isObject() ? m_data->isGridTe
mplateAreasValue(): false; } |
| 156 bool isSVGDocumentValue() const { return isObject() ? m_data->isSVGDocumentV
alue(): false; } |
| 157 bool isContentDistributionValue() const { return isObject() ? m_data->isCont
entDistributionValue(): false; } |
| 158 bool isUnicodeRangeValue() const { return isObject() ? m_data->isUnicodeRang
eValue(): false; } |
| 159 bool isGridLineNamesValue() const { return isObject() ? m_data->isGridLineNa
mesValue(): false; } |
143 | 160 |
144 DEFINE_INLINE_TRACE() | 161 DEFINE_INLINE_TRACE() |
145 { | 162 { |
146 ASSERT(m_data); | 163 ASSERT(m_data); |
147 visitor->trace(m_data); | 164 if (isObject()) |
| 165 visitor->trace(m_data); |
148 } | 166 } |
149 | 167 |
150 // Only for use by the toFooCSSValue() macros. Don't use this. | 168 // Only for use by the toFooCSSValue() macros. Don't use this. |
151 // TODO(sashab): Remove this and use value.to<Type> and value.isValid<Type> | 169 // TODO(sashab): Remove this and use value.to<Type> and value.isValid<Type> |
152 // like WebNode. | 170 // like WebNode. |
153 CSSValueObject* get() const | 171 CSSValueObject* get() const |
154 { | 172 { |
155 return m_data.get(); | 173 return m_data.get(); |
156 } | 174 } |
157 | 175 |
158 private: | 176 private: |
159 CSSValue() = delete; // compile-time guard | 177 CSSValue() = delete; // compile-time guard |
160 CSSValue(std::nullptr_t) = delete; // compile-time guard | 178 CSSValue(std::nullptr_t) = delete; // compile-time guard |
161 | 179 |
162 void ref() const | 180 void ref() const |
163 { | 181 { |
164 #if !ENABLE(OILPAN) | 182 #if !ENABLE(OILPAN) |
165 if (m_data) | 183 if (m_data && isObject()) |
166 m_data->ref(); | 184 m_data->ref(); |
167 #endif | 185 #endif |
168 } | 186 } |
169 | 187 |
170 void deref() const | 188 void deref() const |
171 { | 189 { |
172 #if !ENABLE(OILPAN) | 190 #if !ENABLE(OILPAN) |
173 if (m_data) | 191 if (m_data && isObject()) |
174 m_data->deref(); | 192 m_data->deref(); |
175 #endif | 193 #endif |
176 } | 194 } |
177 | 195 |
| 196 bool isObject() const |
| 197 { |
| 198 return !(*reinterpret_cast<const uintptr_t*>(&m_data) & 1); |
| 199 } |
| 200 |
178 RawPtrWillBeMember<CSSValueObject> m_data; | 201 RawPtrWillBeMember<CSSValueObject> m_data; |
179 }; | 202 }; |
180 | 203 |
181 // A nullable container for CSSValueObject. Contents are the same as CSSValue. | 204 // A nullable container for CSSValueObject. Contents are the same as CSSValue. |
182 // Behavior is similar to a CSSValue*. | 205 // Behavior is similar to a CSSValue*. |
183 class CORE_EXPORT NullableCSSValue { | 206 class CORE_EXPORT NullableCSSValue { |
184 ALLOW_ONLY_INLINE_ALLOCATION(); | 207 ALLOW_ONLY_INLINE_ALLOCATION(); |
185 public: | 208 public: |
186 // Not explicit to allow for casting. | 209 // Not explicit to allow for casting. |
187 NullableCSSValue() | 210 NullableCSSValue() |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 NullableCSSValue& operator=(const NullableCSSValue& rhs) | 272 NullableCSSValue& operator=(const NullableCSSValue& rhs) |
250 { | 273 { |
251 rhs.ref(); | 274 rhs.ref(); |
252 deref(); | 275 deref(); |
253 m_data = rhs.m_data; | 276 m_data = rhs.m_data; |
254 return *this; | 277 return *this; |
255 } | 278 } |
256 | 279 |
257 bool operator==(const NullableCSSValue& rhs) const | 280 bool operator==(const NullableCSSValue& rhs) const |
258 { | 281 { |
| 282 if (m_data == rhs.m_data) |
| 283 return true; |
| 284 if (!isObject() || (rhs && !rhs.isObject())) |
| 285 return false; |
259 return m_data ? rhs.m_data && m_data->equals(*rhs.m_data) : !bool(rhs.m_
data); | 286 return m_data ? rhs.m_data && m_data->equals(*rhs.m_data) : !bool(rhs.m_
data); |
260 } | 287 } |
261 | 288 |
262 bool operator!=(const NullableCSSValue& rhs) const | 289 bool operator!=(const NullableCSSValue& rhs) const |
263 { | 290 { |
264 return !(*this == rhs); | 291 return !(*this == rhs); |
265 } | 292 } |
266 | 293 |
267 CSSValue& operator*() | 294 CSSValue& operator*() |
268 { | 295 { |
(...skipping 20 matching lines...) Expand all Loading... |
289 return reinterpret_cast<const CSSValue*>(this); | 316 return reinterpret_cast<const CSSValue*>(this); |
290 } | 317 } |
291 | 318 |
292 void swap(NullableCSSValue& rhs) | 319 void swap(NullableCSSValue& rhs) |
293 { | 320 { |
294 std::swap(this->m_data, rhs.m_data); | 321 std::swap(this->m_data, rhs.m_data); |
295 } | 322 } |
296 | 323 |
297 DEFINE_INLINE_TRACE() | 324 DEFINE_INLINE_TRACE() |
298 { | 325 { |
299 visitor->trace(m_data); | 326 if (isObject()) |
| 327 visitor->trace(m_data); |
300 } | 328 } |
301 | 329 |
302 // Only for use by the toFooCSSValue() macros. Don't use this. | 330 // Only for use by the toFooCSSValue() macros. Don't use this. |
303 // TODO(sashab): Remove this and use value.to<Type> and value.isValid<Type> | 331 // TODO(sashab): Remove this and use value.to<Type> and value.isValid<Type> |
304 // like WebNode. | 332 // like WebNode. |
305 CSSValueObject* get() const | 333 CSSValueObject* get() const |
306 { | 334 { |
307 return m_data.get(); | 335 return m_data.get(); |
308 } | 336 } |
309 | 337 |
310 private: | 338 private: |
311 void ref() const | 339 void ref() const |
312 { | 340 { |
313 #if !ENABLE(OILPAN) | 341 #if !ENABLE(OILPAN) |
314 if (m_data) | 342 if (m_data && isObject()) |
315 m_data->ref(); | 343 m_data->ref(); |
316 #endif | 344 #endif |
317 } | 345 } |
318 | 346 |
319 void deref() const | 347 void deref() const |
320 { | 348 { |
321 #if !ENABLE(OILPAN) | 349 #if !ENABLE(OILPAN) |
322 if (m_data) | 350 if (m_data && isObject()) |
323 m_data->deref(); | 351 m_data->deref(); |
324 #endif | 352 #endif |
325 } | 353 } |
326 | 354 |
| 355 bool isObject() const |
| 356 { |
| 357 return !(*reinterpret_cast<const uintptr_t*>(&m_data) & 1); |
| 358 } |
| 359 |
327 RawPtrWillBeMember<CSSValueObject> m_data; | 360 RawPtrWillBeMember<CSSValueObject> m_data; |
328 }; | 361 }; |
329 | 362 |
330 static_assert(sizeof(CSSValue) == sizeof(void*), "CSSValue should be pointer-siz
ed"); | 363 static_assert(sizeof(CSSValue) == sizeof(void*), "CSSValue should be pointer-siz
ed"); |
331 static_assert(sizeof(NullableCSSValue) == sizeof(void*), "CSSValue should be poi
nter-sized"); | 364 static_assert(sizeof(NullableCSSValue) == sizeof(void*), "CSSValue should be poi
nter-sized"); |
332 static_assert(sizeof(CSSValue) == sizeof(NullableCSSValue), "Both CSSValue conta
iners must contain the same data"); | 365 static_assert(sizeof(CSSValue) == sizeof(NullableCSSValue), "Both CSSValue conta
iners must contain the same data"); |
333 | 366 |
334 template<size_t inlineCapacity> | 367 template<size_t inlineCapacity> |
335 inline bool compareCSSValueVector(const WillBeHeapVector<CSSValue, inlineCapacit
y>& firstVector, const WillBeHeapVector<CSSValue, inlineCapacity>& secondVector) | 368 inline bool compareCSSValueVector(const WillBeHeapVector<CSSValue, inlineCapacit
y>& firstVector, const WillBeHeapVector<CSSValue, inlineCapacity>& secondVector) |
336 { | 369 { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 ASSERT_WITH_SECURITY_IMPLICATION(value.isPrimitiveValue()); | 402 ASSERT_WITH_SECURITY_IMPLICATION(value.isPrimitiveValue()); |
370 return CSSPrimitiveValue(static_cast<CSSPrimitiveValue::CSSLargePrimitiveVal
ue*>(value.get())); | 403 return CSSPrimitiveValue(static_cast<CSSPrimitiveValue::CSSLargePrimitiveVal
ue*>(value.get())); |
371 } | 404 } |
372 | 405 |
373 } // namespace blink | 406 } // namespace blink |
374 | 407 |
375 WTF_ALLOW_CLEAR_UNUSED_SLOTS_WITH_MEM_FUNCTIONS(blink::CSSValue); | 408 WTF_ALLOW_CLEAR_UNUSED_SLOTS_WITH_MEM_FUNCTIONS(blink::CSSValue); |
376 WTF_ALLOW_CLEAR_UNUSED_SLOTS_WITH_MEM_FUNCTIONS(blink::NullableCSSValue); | 409 WTF_ALLOW_CLEAR_UNUSED_SLOTS_WITH_MEM_FUNCTIONS(blink::NullableCSSValue); |
377 | 410 |
378 #endif // CSSValue_h | 411 #endif // CSSValue_h |
OLD | NEW |