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

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

Issue 345903005: calc expressions should support time, angle and frequency values. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix build warrning. Created 6 years, 5 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 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved.
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 are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 case CSSPrimitiveValue::CSS_IN: 63 case CSSPrimitiveValue::CSS_IN:
64 case CSSPrimitiveValue::CSS_PT: 64 case CSSPrimitiveValue::CSS_PT:
65 case CSSPrimitiveValue::CSS_PC: 65 case CSSPrimitiveValue::CSS_PC:
66 case CSSPrimitiveValue::CSS_REMS: 66 case CSSPrimitiveValue::CSS_REMS:
67 case CSSPrimitiveValue::CSS_CHS: 67 case CSSPrimitiveValue::CSS_CHS:
68 case CSSPrimitiveValue::CSS_VW: 68 case CSSPrimitiveValue::CSS_VW:
69 case CSSPrimitiveValue::CSS_VH: 69 case CSSPrimitiveValue::CSS_VH:
70 case CSSPrimitiveValue::CSS_VMIN: 70 case CSSPrimitiveValue::CSS_VMIN:
71 case CSSPrimitiveValue::CSS_VMAX: 71 case CSSPrimitiveValue::CSS_VMAX:
72 return CalcLength; 72 return CalcLength;
73 // FIXME: Support angle, time and frequency units. 73 case CSSPrimitiveValue::CSS_DEG:
74 // http://www.w3.org/TR/css3-values/#calc-notation 74 case CSSPrimitiveValue::CSS_GRAD:
75 case CSSPrimitiveValue::CSS_RAD:
76 case CSSPrimitiveValue::CSS_TURN:
77 return CalcAngle;
78 case CSSPrimitiveValue::CSS_MS:
79 case CSSPrimitiveValue::CSS_S:
80 return CalcTime;
81 case CSSPrimitiveValue::CSS_HZ:
82 case CSSPrimitiveValue::CSS_KHZ:
83 return CalcFrequency;
75 default: 84 default:
85 ASSERT_NOT_REACHED();
76 return CalcOther; 86 return CalcOther;
77 } 87 }
78 } 88 }
79 89
80 static bool hasDoubleValue(CSSPrimitiveValue::UnitType type) 90 static bool hasDoubleValue(CSSPrimitiveValue::UnitType type)
81 { 91 {
82 switch (type) { 92 switch (type) {
83 case CSSPrimitiveValue::CSS_NUMBER: 93 case CSSPrimitiveValue::CSS_NUMBER:
84 case CSSPrimitiveValue::CSS_PARSER_INTEGER: 94 case CSSPrimitiveValue::CSS_PARSER_INTEGER:
85 case CSSPrimitiveValue::CSS_PERCENTAGE: 95 case CSSPrimitiveValue::CSS_PERCENTAGE:
86 case CSSPrimitiveValue::CSS_EMS: 96 case CSSPrimitiveValue::CSS_EMS:
87 case CSSPrimitiveValue::CSS_EXS: 97 case CSSPrimitiveValue::CSS_EXS:
88 case CSSPrimitiveValue::CSS_CHS: 98 case CSSPrimitiveValue::CSS_CHS:
89 case CSSPrimitiveValue::CSS_REMS: 99 case CSSPrimitiveValue::CSS_REMS:
90 case CSSPrimitiveValue::CSS_PX: 100 case CSSPrimitiveValue::CSS_PX:
91 case CSSPrimitiveValue::CSS_CM: 101 case CSSPrimitiveValue::CSS_CM:
92 case CSSPrimitiveValue::CSS_MM: 102 case CSSPrimitiveValue::CSS_MM:
93 case CSSPrimitiveValue::CSS_IN: 103 case CSSPrimitiveValue::CSS_IN:
94 case CSSPrimitiveValue::CSS_PT: 104 case CSSPrimitiveValue::CSS_PT:
95 case CSSPrimitiveValue::CSS_PC: 105 case CSSPrimitiveValue::CSS_PC:
96 case CSSPrimitiveValue::CSS_DEG: 106 case CSSPrimitiveValue::CSS_DEG:
97 case CSSPrimitiveValue::CSS_RAD: 107 case CSSPrimitiveValue::CSS_RAD:
98 case CSSPrimitiveValue::CSS_GRAD: 108 case CSSPrimitiveValue::CSS_GRAD:
109 case CSSPrimitiveValue::CSS_TURN:
99 case CSSPrimitiveValue::CSS_MS: 110 case CSSPrimitiveValue::CSS_MS:
100 case CSSPrimitiveValue::CSS_S: 111 case CSSPrimitiveValue::CSS_S:
101 case CSSPrimitiveValue::CSS_HZ: 112 case CSSPrimitiveValue::CSS_HZ:
102 case CSSPrimitiveValue::CSS_KHZ: 113 case CSSPrimitiveValue::CSS_KHZ:
103 case CSSPrimitiveValue::CSS_DIMENSION: 114 case CSSPrimitiveValue::CSS_DIMENSION:
104 case CSSPrimitiveValue::CSS_VW: 115 case CSSPrimitiveValue::CSS_VW:
105 case CSSPrimitiveValue::CSS_VH: 116 case CSSPrimitiveValue::CSS_VH:
106 case CSSPrimitiveValue::CSS_VMIN: 117 case CSSPrimitiveValue::CSS_VMIN:
107 case CSSPrimitiveValue::CSS_VMAX: 118 case CSSPrimitiveValue::CSS_VMAX:
108 case CSSPrimitiveValue::CSS_DPPX: 119 case CSSPrimitiveValue::CSS_DPPX:
109 case CSSPrimitiveValue::CSS_DPI: 120 case CSSPrimitiveValue::CSS_DPI:
110 case CSSPrimitiveValue::CSS_DPCM: 121 case CSSPrimitiveValue::CSS_DPCM:
111 case CSSPrimitiveValue::CSS_FR: 122 case CSSPrimitiveValue::CSS_FR:
112 return true; 123 return true;
113 case CSSPrimitiveValue::CSS_UNKNOWN: 124 case CSSPrimitiveValue::CSS_UNKNOWN:
114 case CSSPrimitiveValue::CSS_STRING: 125 case CSSPrimitiveValue::CSS_STRING:
115 case CSSPrimitiveValue::CSS_URI: 126 case CSSPrimitiveValue::CSS_URI:
116 case CSSPrimitiveValue::CSS_IDENT: 127 case CSSPrimitiveValue::CSS_IDENT:
117 case CSSPrimitiveValue::CSS_ATTR: 128 case CSSPrimitiveValue::CSS_ATTR:
118 case CSSPrimitiveValue::CSS_COUNTER: 129 case CSSPrimitiveValue::CSS_COUNTER:
119 case CSSPrimitiveValue::CSS_RECT: 130 case CSSPrimitiveValue::CSS_RECT:
120 case CSSPrimitiveValue::CSS_RGBCOLOR: 131 case CSSPrimitiveValue::CSS_RGBCOLOR:
121 case CSSPrimitiveValue::CSS_PAIR: 132 case CSSPrimitiveValue::CSS_PAIR:
122 case CSSPrimitiveValue::CSS_UNICODE_RANGE: 133 case CSSPrimitiveValue::CSS_UNICODE_RANGE:
123 case CSSPrimitiveValue::CSS_PARSER_OPERATOR: 134 case CSSPrimitiveValue::CSS_PARSER_OPERATOR:
124 case CSSPrimitiveValue::CSS_PARSER_HEXCOLOR: 135 case CSSPrimitiveValue::CSS_PARSER_HEXCOLOR:
125 case CSSPrimitiveValue::CSS_PARSER_IDENTIFIER: 136 case CSSPrimitiveValue::CSS_PARSER_IDENTIFIER:
126 case CSSPrimitiveValue::CSS_TURN:
127 case CSSPrimitiveValue::CSS_COUNTER_NAME: 137 case CSSPrimitiveValue::CSS_COUNTER_NAME:
128 case CSSPrimitiveValue::CSS_SHAPE: 138 case CSSPrimitiveValue::CSS_SHAPE:
129 case CSSPrimitiveValue::CSS_QUAD: 139 case CSSPrimitiveValue::CSS_QUAD:
130 case CSSPrimitiveValue::CSS_CALC: 140 case CSSPrimitiveValue::CSS_CALC:
131 case CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_NUMBER: 141 case CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_NUMBER:
132 case CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_LENGTH: 142 case CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_LENGTH:
133 case CSSPrimitiveValue::CSS_PROPERTY_ID: 143 case CSSPrimitiveValue::CSS_PROPERTY_ID:
134 case CSSPrimitiveValue::CSS_VALUE_ID: 144 case CSSPrimitiveValue::CSS_VALUE_ID:
135 return false; 145 return false;
136 }; 146 };
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 return m_value->getDoubleValue(); 235 return m_value->getDoubleValue();
226 ASSERT_NOT_REACHED(); 236 ASSERT_NOT_REACHED();
227 return 0; 237 return 0;
228 } 238 }
229 239
230 virtual double computeLengthPx(const CSSToLengthConversionData& conversionDa ta) const OVERRIDE 240 virtual double computeLengthPx(const CSSToLengthConversionData& conversionDa ta) const OVERRIDE
231 { 241 {
232 switch (m_category) { 242 switch (m_category) {
233 case CalcLength: 243 case CalcLength:
234 return m_value->computeLength<double>(conversionData); 244 return m_value->computeLength<double>(conversionData);
245 case CalcNumber:
235 case CalcPercent: 246 case CalcPercent:
236 case CalcNumber:
237 return m_value->getDoubleValue(); 247 return m_value->getDoubleValue();
248 case CalcAngle:
249 case CalcFrequency:
238 case CalcPercentLength: 250 case CalcPercentLength:
239 case CalcPercentNumber: 251 case CalcPercentNumber:
252 case CalcTime:
240 case CalcOther: 253 case CalcOther:
241 ASSERT_NOT_REACHED(); 254 ASSERT_NOT_REACHED();
242 break; 255 break;
243 } 256 }
244 ASSERT_NOT_REACHED(); 257 ASSERT_NOT_REACHED();
245 return 0; 258 return 0;
246 } 259 }
247 260
248 virtual void accumulateLengthArray(CSSLengthArray& lengthArray, double multi plier) const 261 virtual void accumulateLengthArray(CSSLengthArray& lengthArray, double multi plier) const
249 { 262 {
(...skipping 26 matching lines...) Expand all
276 CSSCalcPrimitiveValue(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> value, bool isInteger) 289 CSSCalcPrimitiveValue(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> value, bool isInteger)
277 : CSSCalcExpressionNode(unitCategory(value->primitiveType()), isInteger) 290 : CSSCalcExpressionNode(unitCategory(value->primitiveType()), isInteger)
278 , m_value(value) 291 , m_value(value)
279 { 292 {
280 } 293 }
281 294
282 RefPtrWillBeMember<CSSPrimitiveValue> m_value; 295 RefPtrWillBeMember<CSSPrimitiveValue> m_value;
283 }; 296 };
284 297
285 static const CalculationCategory addSubtractResult[CalcOther][CalcOther] = { 298 static const CalculationCategory addSubtractResult[CalcOther][CalcOther] = {
286 // CalcNumber CalcLength CalcPercent CalcPercentNumber CalcPercentLength 299 // CalcNumber CalcLength CalcPercent CalcPercentNumber CalcPercentLength CalcAngle CalcTime CalcFrequency
287 /* CalcNumber */ { CalcNumber, CalcOther, CalcPercentNumbe r, CalcPercentNumber, CalcOther }, 300 /* CalcNumber */ { CalcNumber, CalcOther, CalcPercentNumbe r, CalcPercentNumber, CalcOther, CalcOther, CalcOther, CalcOther },
288 /* CalcLength */ { CalcOther, CalcLength, CalcPercentLengt h, CalcOther, CalcPercentLength }, 301 /* CalcLength */ { CalcOther, CalcLength, CalcPercentLengt h, CalcOther, CalcPercentLength, CalcOther, CalcOther, CalcOther },
289 /* CalcPercent */ { CalcPercentNumber, CalcPercentLength, CalcPercent, CalcPercentNumber, CalcPercentLength }, 302 /* CalcPercent */ { CalcPercentNumber, CalcPercentLength, CalcPercent, CalcPercentNumber, CalcPercentLength, CalcOther, CalcOther, CalcOther },
290 /* CalcPercentNumber */ { CalcPercentNumber, CalcOther, CalcPercentNumbe r, CalcPercentNumber, CalcOther }, 303 /* CalcPercentNumber */ { CalcPercentNumber, CalcOther, CalcPercentNumbe r, CalcPercentNumber, CalcOther, CalcOther, CalcOther, CalcOther },
291 /* CalcPercentLength */ { CalcOther, CalcPercentLength, CalcPercentLengt h, CalcOther, CalcPercentLength }, 304 /* CalcPercentLength */ { CalcOther, CalcPercentLength, CalcPercentLengt h, CalcOther, CalcPercentLength, CalcOther, CalcOther, CalcOther },
305 /* CalcAngle */ { CalcOther, CalcOther, CalcOther, CalcOther, CalcOther, CalcAngle, CalcOther, CalcOther },
306 /* CalcTime */ { CalcOther, CalcOther, CalcOther, CalcOther, CalcOther, CalcOther, CalcTime, CalcOther },
307 /* CalcFrequency */ { CalcOther, CalcOther, CalcOther, CalcOther, CalcOther, CalcOther, CalcOther, CalcFrequency }
292 }; 308 };
293 309
294 static CalculationCategory determineCategory(const CSSCalcExpressionNode& leftSi de, const CSSCalcExpressionNode& rightSide, CalcOperator op) 310 static CalculationCategory determineCategory(const CSSCalcExpressionNode& leftSi de, const CSSCalcExpressionNode& rightSide, CalcOperator op)
295 { 311 {
296 CalculationCategory leftCategory = leftSide.category(); 312 CalculationCategory leftCategory = leftSide.category();
297 CalculationCategory rightCategory = rightSide.category(); 313 CalculationCategory rightCategory = rightSide.category();
298 314
299 if (leftCategory == CalcOther || rightCategory == CalcOther) 315 if (leftCategory == CalcOther || rightCategory == CalcOther)
300 return CalcOther; 316 return CalcOther;
301 317
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 case CalcPercent: { 526 case CalcPercent: {
511 if (m_leftSide->category() == CalcNumber) 527 if (m_leftSide->category() == CalcNumber)
512 return m_rightSide->primitiveType(); 528 return m_rightSide->primitiveType();
513 if (m_rightSide->category() == CalcNumber) 529 if (m_rightSide->category() == CalcNumber)
514 return m_leftSide->primitiveType(); 530 return m_leftSide->primitiveType();
515 CSSPrimitiveValue::UnitType leftType = m_leftSide->primitiveType(); 531 CSSPrimitiveValue::UnitType leftType = m_leftSide->primitiveType();
516 if (leftType == m_rightSide->primitiveType()) 532 if (leftType == m_rightSide->primitiveType())
517 return leftType; 533 return leftType;
518 return CSSPrimitiveValue::CSS_UNKNOWN; 534 return CSSPrimitiveValue::CSS_UNKNOWN;
519 } 535 }
536 case CalcAngle:
537 return CSSPrimitiveValue::CSS_DEG;
538 case CalcTime:
539 return CSSPrimitiveValue::CSS_MS;
540 case CalcFrequency:
541 return CSSPrimitiveValue::CSS_HZ;
520 case CalcPercentLength: 542 case CalcPercentLength:
521 case CalcPercentNumber: 543 case CalcPercentNumber:
522 case CalcOther: 544 case CalcOther:
523 return CSSPrimitiveValue::CSS_UNKNOWN; 545 return CSSPrimitiveValue::CSS_UNKNOWN;
524 } 546 }
525 ASSERT_NOT_REACHED(); 547 ASSERT_NOT_REACHED();
526 return CSSPrimitiveValue::CSS_UNKNOWN; 548 return CSSPrimitiveValue::CSS_UNKNOWN;
527 } 549 }
528 550
529 virtual void trace(Visitor* visitor) 551 virtual void trace(Visitor* visitor)
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 bool parseValue(CSSParserValueList* tokens, unsigned* index, Value* result) 645 bool parseValue(CSSParserValueList* tokens, unsigned* index, Value* result)
624 { 646 {
625 CSSParserValue* parserValue = tokens->valueAt(*index); 647 CSSParserValue* parserValue = tokens->valueAt(*index);
626 if (parserValue->unit == CSSParserValue::Operator) 648 if (parserValue->unit == CSSParserValue::Operator)
627 return false; 649 return false;
628 650
629 RefPtrWillBeRawPtr<CSSValue> value = parserValue->createCSSValue(); 651 RefPtrWillBeRawPtr<CSSValue> value = parserValue->createCSSValue();
630 if (!value || !value->isPrimitiveValue()) 652 if (!value || !value->isPrimitiveValue())
631 return false; 653 return false;
632 654
633 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value.get()); 655 result->value = CSSCalcPrimitiveValue::create(toCSSPrimitiveValue(value. get()), parserValue->isInt);
alancutter (OOO until 2018) 2014/07/21 14:03:47 The unitCategory check could be turned into an ASS
reni 2014/07/25 08:44:43 Good point! calc(42fr) showed that we have to coun
634 if (unitCategory(primitiveValue->primitiveType()) == CalcOther)
635 return false;
636
637 result->value = CSSCalcPrimitiveValue::create(primitiveValue, parserValu e->isInt);
638 656
639 ++*index; 657 ++*index;
640 return true; 658 return true;
641 } 659 }
642 660
643 bool parseValueTerm(CSSParserValueList* tokens, int depth, unsigned* index, Value* result) 661 bool parseValueTerm(CSSParserValueList* tokens, int depth, unsigned* index, Value* result)
644 { 662 {
645 if (checkDepthAndIndex(&depth, *index, tokens) != OK) 663 if (checkDepthAndIndex(&depth, *index, tokens) != OK)
646 return false; 664 return false;
647 665
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 return adoptRefWillBeNoop(new CSSCalcValue(expression, range)); 772 return adoptRefWillBeNoop(new CSSCalcValue(expression, range));
755 } 773 }
756 774
757 void CSSCalcValue::traceAfterDispatch(Visitor* visitor) 775 void CSSCalcValue::traceAfterDispatch(Visitor* visitor)
758 { 776 {
759 visitor->trace(m_expression); 777 visitor->trace(m_expression);
760 CSSValue::traceAfterDispatch(visitor); 778 CSSValue::traceAfterDispatch(visitor);
761 } 779 }
762 780
763 } // namespace WebCore 781 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698