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

Side by Side Diff: third_party/WebKit/Source/core/css/CSSPrimitiveValue.h

Issue 2346193002: Split CSSPrimitiveValue into CSSPrimitiveValue and CSSIdentifierValue (Closed)
Patch Set: Rebase Created 4 years, 2 months 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
OLDNEW
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, 2008 Apple Inc. All rights reserved. 3 * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
4 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> 4 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 11 matching lines...) Expand all
22 #ifndef CSSPrimitiveValue_h 22 #ifndef CSSPrimitiveValue_h
23 #define CSSPrimitiveValue_h 23 #define CSSPrimitiveValue_h
24 24
25 #include "core/CSSPropertyNames.h" 25 #include "core/CSSPropertyNames.h"
26 #include "core/CSSValueKeywords.h" 26 #include "core/CSSValueKeywords.h"
27 #include "core/CoreExport.h" 27 #include "core/CoreExport.h"
28 #include "core/css/CSSValue.h" 28 #include "core/css/CSSValue.h"
29 #include "wtf/BitVector.h" 29 #include "wtf/BitVector.h"
30 #include "wtf/Forward.h" 30 #include "wtf/Forward.h"
31 #include "wtf/MathExtras.h" 31 #include "wtf/MathExtras.h"
32 #include "wtf/TypeTraits.h"
33 #include "wtf/text/StringHash.h" 32 #include "wtf/text/StringHash.h"
34 #include "wtf/text/StringView.h" 33 #include "wtf/text/StringView.h"
35 34
36 namespace blink { 35 namespace blink {
37 36
38 class CSSCalcValue; 37 class CSSCalcValue;
39 class CSSToLengthConversionData; 38 class CSSToLengthConversionData;
40 class Length; 39 class Length;
41 40
42 // Dimension calculations are imprecise, often resulting in values of e.g. 41 // Dimension calculations are imprecise, often resulting in values of e.g.
43 // 44.99998. We need to go ahead and round if we're really close to the next 42 // 44.99998. We need to go ahead and round if we're really close to the next
44 // integer value. 43 // integer value.
45 template<typename T> inline T roundForImpreciseConversion(double value) 44 template<typename T> inline T roundForImpreciseConversion(double value)
46 { 45 {
47 value += (value < 0) ? -0.01 : +0.01; 46 value += (value < 0) ? -0.01 : +0.01;
48 return ((value > std::numeric_limits<T>::max()) || (value < std::numeric_lim its<T>::min())) ? 0 : static_cast<T>(value); 47 return ((value > std::numeric_limits<T>::max()) || (value < std::numeric_lim its<T>::min())) ? 0 : static_cast<T>(value);
49 } 48 }
50 49
51 template<> inline float roundForImpreciseConversion(double value) 50 template<> inline float roundForImpreciseConversion(double value)
52 { 51 {
53 double ceiledValue = ceil(value); 52 double ceiledValue = ceil(value);
54 double proximityToNextInt = ceiledValue - value; 53 double proximityToNextInt = ceiledValue - value;
55 if (proximityToNextInt <= 0.01 && value > 0) 54 if (proximityToNextInt <= 0.01 && value > 0)
56 return static_cast<float>(ceiledValue); 55 return static_cast<float>(ceiledValue);
57 if (proximityToNextInt >= 0.99 && value < 0) 56 if (proximityToNextInt >= 0.99 && value < 0)
58 return static_cast<float>(floor(value)); 57 return static_cast<float>(floor(value));
59 return static_cast<float>(value); 58 return static_cast<float>(value);
60 } 59 }
61 60
62 // CSSPrimitiveValues are immutable. This class has manual ref-counting 61 // CSSPrimitiveValue stores both numbers/lengths (e.g. 1, 10px, 4%) and calc()
Timothy Loh 2016/09/30 05:44:35 4% isn't a length, also it stores other values lik
sashab 2016/09/30 06:45:48 Done
63 // of unioned types and does not have the code necessary 62 // values (e.g. calc(3px + 2em)).
64 // to handle any kind of mutations. 63 // TODO(sashab): Split calc functionality out of CSSPrimitiveValue.
Timothy Loh 2016/09/30 05:44:35 I think calc makes sense to be in CSSPrimtiveValue
sashab 2016/09/30 06:45:48 Done
65 class CORE_EXPORT CSSPrimitiveValue : public CSSValue { 64 class CORE_EXPORT CSSPrimitiveValue : public CSSValue {
66 public: 65 public:
67 // These units are iterated through, so be careful when adding or changing t he order. 66 // These units are iterated through, so be careful when adding or changing t he order.
68 enum class UnitType { 67 enum class UnitType {
69 Unknown, 68 Unknown,
70 Number, 69 Number,
71 Percentage, 70 Percentage,
72 // Length units 71 // Length units
73 Ems, 72 Ems,
74 Exs, 73 Exs,
(...skipping 25 matching lines...) Expand all
100 DotsPerInch, 99 DotsPerInch,
101 DotsPerCentimeter, 100 DotsPerCentimeter,
102 // Other units 101 // Other units
103 Fraction, 102 Fraction,
104 Integer, 103 Integer,
105 Calc, 104 Calc,
106 CalcPercentageWithNumber, 105 CalcPercentageWithNumber,
107 CalcPercentageWithLength, 106 CalcPercentageWithLength,
108 CalcLengthWithNumber, 107 CalcLengthWithNumber,
109 CalcPercentageWithLengthAndNumber, 108 CalcPercentageWithLengthAndNumber,
110 ValueID,
111 109
112 // This value is used to handle quirky margins in reflow roots (body, td , and th) like WinIE. 110 // This value is used to handle quirky margins in reflow roots (body, td , and th) like WinIE.
113 // The basic idea is that a stylesheet can use the value __qem (for quir ky em) instead of em. 111 // The basic idea is that a stylesheet can use the value __qem (for quir ky em) instead of em.
114 // When the quirky value is used, if you're in quirks mode, the margin w ill collapse away 112 // When the quirky value is used, if you're in quirks mode, the margin w ill collapse away
115 // inside a table cell. This quirk is specified in the HTML spec but our impl is different. 113 // inside a table cell. This quirk is specified in the HTML spec but our impl is different.
116 // TODO: Remove this. crbug.com/443952 114 // TODO: Remove this. crbug.com/443952
117 QuirkyEms, 115 QuirkyEms,
118 }; 116 };
119 117
120 enum LengthUnitType { 118 enum LengthUnitType {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 bool isLength() const { return isLength(typeWithCalcResolved()); } 193 bool isLength() const { return isLength(typeWithCalcResolved()); }
196 bool isNumber() const { return typeWithCalcResolved() == UnitType::Number || typeWithCalcResolved() == UnitType::Integer; } 194 bool isNumber() const { return typeWithCalcResolved() == UnitType::Number || typeWithCalcResolved() == UnitType::Integer; }
197 bool isPercentage() const { return typeWithCalcResolved() == UnitType::Perce ntage; } 195 bool isPercentage() const { return typeWithCalcResolved() == UnitType::Perce ntage; }
198 bool isPx() const { return typeWithCalcResolved() == UnitType::Pixels; } 196 bool isPx() const { return typeWithCalcResolved() == UnitType::Pixels; }
199 bool isTime() const { return type() == UnitType::Seconds || type() == UnitTy pe::Milliseconds; } 197 bool isTime() const { return type() == UnitType::Seconds || type() == UnitTy pe::Milliseconds; }
200 bool isCalculated() const { return type() == UnitType::Calc; } 198 bool isCalculated() const { return type() == UnitType::Calc; }
201 bool isCalculatedPercentageWithNumber() const { return typeWithCalcResolved( ) == UnitType::CalcPercentageWithNumber; } 199 bool isCalculatedPercentageWithNumber() const { return typeWithCalcResolved( ) == UnitType::CalcPercentageWithNumber; }
202 bool isCalculatedPercentageWithLength() const { return typeWithCalcResolved( ) == UnitType::CalcPercentageWithLength; } 200 bool isCalculatedPercentageWithLength() const { return typeWithCalcResolved( ) == UnitType::CalcPercentageWithLength; }
203 static bool isResolution(UnitType type) { return type >= UnitType::DotsPerPi xel && type <= UnitType::DotsPerCentimeter; } 201 static bool isResolution(UnitType type) { return type >= UnitType::DotsPerPi xel && type <= UnitType::DotsPerCentimeter; }
204 bool isFlex() const { return typeWithCalcResolved() == UnitType::Fraction; } 202 bool isFlex() const { return typeWithCalcResolved() == UnitType::Fraction; }
205 bool isValueID() const { return type() == UnitType::ValueID; }
206 bool colorIsDerivedFromElement() const;
207 203
208 static CSSPrimitiveValue* createIdentifier(CSSValueID);
209 static CSSPrimitiveValue* create(double value, UnitType); 204 static CSSPrimitiveValue* create(double value, UnitType);
210 static CSSPrimitiveValue* create(const Length& value, float zoom) 205 static CSSPrimitiveValue* create(const Length& value, float zoom)
211 { 206 {
212 return new CSSPrimitiveValue(value, zoom); 207 return new CSSPrimitiveValue(value, zoom);
213 } 208 }
209
210 // TODO(sashab): Remove this.
214 template<typename T> static CSSPrimitiveValue* create(T value) 211 template<typename T> static CSSPrimitiveValue* create(T value)
215 { 212 {
216 static_assert(!std::is_same<T, CSSValueID>::value, "Do not call create() with a CSSValueID; call createIdentifier() instead");
217 return new CSSPrimitiveValue(value); 213 return new CSSPrimitiveValue(value);
218 } 214 }
219 215
220 ~CSSPrimitiveValue(); 216 ~CSSPrimitiveValue();
221 217
222 UnitType typeWithCalcResolved() const; 218 UnitType typeWithCalcResolved() const;
223 219
224 double computeDegrees() const; 220 double computeDegrees() const;
225 double computeSeconds() const; 221 double computeSeconds() const;
226 222
227 // Computes a length in pixels, resolving relative lengths 223 // Computes a length in pixels, resolving relative lengths
228 template<typename T> T computeLength(const CSSToLengthConversionData&) const ; 224 template<typename T> T computeLength(const CSSToLengthConversionData&) const ;
229 225
230 // Converts to a Length (Fixed, Percent or Calculated) 226 // Converts to a Length (Fixed, Percent or Calculated)
231 Length convertToLength(const CSSToLengthConversionData&) const; 227 Length convertToLength(const CSSToLengthConversionData&) const;
232 228
233 double getDoubleValue() const; 229 double getDoubleValue() const;
234 float getFloatValue() const { return getValue<float>(); } 230 float getFloatValue() const { return getValue<float>(); }
235 int getIntValue() const { return getValue<int>(); } 231 int getIntValue() const { return getValue<int>(); }
236 template<typename T> inline T getValue() const { return clampTo<T>(getDouble Value()); } 232 template<typename T> inline T getValue() const { return clampTo<T>(getDouble Value()); }
237 233
238 CSSCalcValue* cssCalcValue() const { ASSERT(isCalculated()); return m_value. calc; } 234 CSSCalcValue* cssCalcValue() const { ASSERT(isCalculated()); return m_value. calc; }
239 235
240 CSSValueID getValueID() const { return type() == UnitType::ValueID ? m_value .valueID : CSSValueInvalid; }
241
242 template<typename T> inline T convertTo() const; // Defined in CSSPrimitiveV alueMappings.h 236 template<typename T> inline T convertTo() const; // Defined in CSSPrimitiveV alueMappings.h
243 237
244 static const char* unitTypeToString(UnitType); 238 static const char* unitTypeToString(UnitType);
245 static UnitType stringToUnitType(StringView string) 239 static UnitType stringToUnitType(StringView string)
246 { 240 {
247 if (string.is8Bit()) 241 if (string.is8Bit())
248 return stringToUnitType(string.characters8(), string.length()); 242 return stringToUnitType(string.characters8(), string.length());
249 return stringToUnitType(string.characters16(), string.length()); 243 return stringToUnitType(string.characters16(), string.length());
250 } 244 }
251 245
252 String customCSSText() const; 246 String customCSSText() const;
253 247
254 bool equals(const CSSPrimitiveValue&) const; 248 bool equals(const CSSPrimitiveValue&) const;
255 249
256 DECLARE_TRACE_AFTER_DISPATCH(); 250 DECLARE_TRACE_AFTER_DISPATCH();
257 251
258 static UnitType canonicalUnitTypeForCategory(UnitCategory); 252 static UnitType canonicalUnitTypeForCategory(UnitCategory);
259 static double conversionToCanonicalUnitsScaleFactor(UnitType); 253 static double conversionToCanonicalUnitsScaleFactor(UnitType);
260 254
261 // Returns true and populates lengthUnitType, if unitType is a length unit. Otherwise, returns false. 255 // Returns true and populates lengthUnitType, if unitType is a length unit. Otherwise, returns false.
262 static bool unitTypeToLengthUnitType(UnitType, LengthUnitType&); 256 static bool unitTypeToLengthUnitType(UnitType, LengthUnitType&);
263 static UnitType lengthUnitTypeToUnitType(LengthUnitType); 257 static UnitType lengthUnitTypeToUnitType(LengthUnitType);
264 258
265 private: 259 private:
266 CSSPrimitiveValue(CSSValueID);
267 CSSPrimitiveValue(const Length&, float zoom); 260 CSSPrimitiveValue(const Length&, float zoom);
268 CSSPrimitiveValue(double, UnitType); 261 CSSPrimitiveValue(double, UnitType);
269 262
270 template<typename T> CSSPrimitiveValue(T); // Defined in CSSPrimitiveValueMa ppings.h 263 template<typename T> CSSPrimitiveValue(T); // Defined in CSSPrimitiveValueMa ppings.h
271 264
272 template<typename T> CSSPrimitiveValue(T* val) 265 template<typename T> CSSPrimitiveValue(T* val)
273 : CSSValue(PrimitiveClass) 266 : CSSValue(PrimitiveClass)
274 { 267 {
275 init(val); 268 init(val);
276 } 269 }
277 270
278 static void create(int); // compile-time guard 271 static void create(int); // compile-time guard
279 static void create(unsigned); // compile-time guard 272 static void create(unsigned); // compile-time guard
280 template<typename T> operator T*(); // compile-time guard 273 template<typename T> operator T*(); // compile-time guard
281 274
282 // Code generated by CSSPrimitiveValueUnitTrie.cpp.tmpl 275 // Code generated by CSSPrimitiveValueUnitTrie.cpp.tmpl
283 static UnitType stringToUnitType(const LChar*, unsigned length); 276 static UnitType stringToUnitType(const LChar*, unsigned length);
284 static UnitType stringToUnitType(const UChar*, unsigned length); 277 static UnitType stringToUnitType(const UChar*, unsigned length);
285 278
286 void init(UnitType); 279 void init(UnitType);
287 void init(const Length&); 280 void init(const Length&);
288 void init(CSSCalcValue*); 281 void init(CSSCalcValue*);
289 282
290 double computeLengthDouble(const CSSToLengthConversionData&) const; 283 double computeLengthDouble(const CSSToLengthConversionData&) const;
291 284
292 inline UnitType type() const { return static_cast<UnitType>(m_primitiveUnitT ype); } 285 inline UnitType type() const { return static_cast<UnitType>(m_primitiveUnitT ype); }
293 286
294 union { 287 union {
295 CSSValueID valueID;
296 double num; 288 double num;
297 // FIXME: oilpan: Should be a member, but no support for members in unio ns. Just trace the raw ptr for now. 289 // FIXME: oilpan: Should be a member, but no support for members in unio ns. Just trace the raw ptr for now.
298 CSSCalcValue* calc; 290 CSSCalcValue* calc;
299 } m_value; 291 } m_value;
300 }; 292 };
301 293
302 using CSSLengthArray = CSSPrimitiveValue::CSSLengthArray; 294 using CSSLengthArray = CSSPrimitiveValue::CSSLengthArray;
303 295
304 DEFINE_CSS_VALUE_TYPE_CASTS(CSSPrimitiveValue, isPrimitiveValue()); 296 DEFINE_CSS_VALUE_TYPE_CASTS(CSSPrimitiveValue, isPrimitiveValue());
305 297
306 } // namespace blink 298 } // namespace blink
307 299
308 #endif // CSSPrimitiveValue_h 300 #endif // CSSPrimitiveValue_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698