OLD | NEW |
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 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 public: | 185 public: |
186 | 186 |
187 static PassRefPtrWillBeRawPtr<CSSCalcPrimitiveValue> create(PassRefPtrWillBe
RawPtr<CSSPrimitiveValue> value, bool isInteger) | 187 static PassRefPtrWillBeRawPtr<CSSCalcPrimitiveValue> create(PassRefPtrWillBe
RawPtr<CSSPrimitiveValue> value, bool isInteger) |
188 { | 188 { |
189 return adoptRefWillBeNoop(new CSSCalcPrimitiveValue(value, isInteger)); | 189 return adoptRefWillBeNoop(new CSSCalcPrimitiveValue(value, isInteger)); |
190 } | 190 } |
191 | 191 |
192 static PassRefPtrWillBeRawPtr<CSSCalcPrimitiveValue> create(double value, CS
SPrimitiveValue::UnitTypes type, bool isInteger) | 192 static PassRefPtrWillBeRawPtr<CSSCalcPrimitiveValue> create(double value, CS
SPrimitiveValue::UnitTypes type, bool isInteger) |
193 { | 193 { |
194 if (std::isnan(value) || std::isinf(value)) | 194 if (std::isnan(value) || std::isinf(value)) |
195 return 0; | 195 return nullptr; |
196 return adoptRefWillBeNoop(new CSSCalcPrimitiveValue(CSSPrimitiveValue::c
reate(value, type).get(), isInteger)); | 196 return adoptRefWillBeNoop(new CSSCalcPrimitiveValue(CSSPrimitiveValue::c
reate(value, type).get(), isInteger)); |
197 } | 197 } |
198 | 198 |
199 virtual bool isZero() const OVERRIDE | 199 virtual bool isZero() const OVERRIDE |
200 { | 200 { |
201 return !m_value->getDoubleValue(); | 201 return !m_value->getDoubleValue(); |
202 } | 202 } |
203 | 203 |
204 virtual String customCSSText() const OVERRIDE | 204 virtual String customCSSText() const OVERRIDE |
205 { | 205 { |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 } | 326 } |
327 | 327 |
328 class CSSCalcBinaryOperation FINAL : public CSSCalcExpressionNode { | 328 class CSSCalcBinaryOperation FINAL : public CSSCalcExpressionNode { |
329 public: | 329 public: |
330 static PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> create(PassRefPtrWillBe
RawPtr<CSSCalcExpressionNode> leftSide, PassRefPtrWillBeRawPtr<CSSCalcExpression
Node> rightSide, CalcOperator op) | 330 static PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> create(PassRefPtrWillBe
RawPtr<CSSCalcExpressionNode> leftSide, PassRefPtrWillBeRawPtr<CSSCalcExpression
Node> rightSide, CalcOperator op) |
331 { | 331 { |
332 ASSERT(leftSide->category() != CalcOther && rightSide->category() != Cal
cOther); | 332 ASSERT(leftSide->category() != CalcOther && rightSide->category() != Cal
cOther); |
333 | 333 |
334 CalculationCategory newCategory = determineCategory(*leftSide, *rightSid
e, op); | 334 CalculationCategory newCategory = determineCategory(*leftSide, *rightSid
e, op); |
335 if (newCategory == CalcOther) | 335 if (newCategory == CalcOther) |
336 return 0; | 336 return nullptr; |
337 | 337 |
338 return adoptRefWillBeNoop(new CSSCalcBinaryOperation(leftSide, rightSide
, op, newCategory)); | 338 return adoptRefWillBeNoop(new CSSCalcBinaryOperation(leftSide, rightSide
, op, newCategory)); |
339 } | 339 } |
340 | 340 |
341 static PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> createSimplified(PassRe
fPtrWillBeRawPtr<CSSCalcExpressionNode> leftSide, PassRefPtrWillBeRawPtr<CSSCalc
ExpressionNode> rightSide, CalcOperator op) | 341 static PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> createSimplified(PassRe
fPtrWillBeRawPtr<CSSCalcExpressionNode> leftSide, PassRefPtrWillBeRawPtr<CSSCalc
ExpressionNode> rightSide, CalcOperator op) |
342 { | 342 { |
343 CalculationCategory leftCategory = leftSide->category(); | 343 CalculationCategory leftCategory = leftSide->category(); |
344 CalculationCategory rightCategory = rightSide->category(); | 344 CalculationCategory rightCategory = rightSide->category(); |
345 ASSERT(leftCategory != CalcOther && rightCategory != CalcOther); | 345 ASSERT(leftCategory != CalcOther && rightCategory != CalcOther); |
346 | 346 |
(...skipping 24 matching lines...) Expand all Loading... |
371 } | 371 } |
372 } | 372 } |
373 } | 373 } |
374 } else { | 374 } else { |
375 // Simplify multiplying or dividing by a number for simplifiable typ
es. | 375 // Simplify multiplying or dividing by a number for simplifiable typ
es. |
376 ASSERT(op == CalcMultiply || op == CalcDivide); | 376 ASSERT(op == CalcMultiply || op == CalcDivide); |
377 CSSCalcExpressionNode* numberSide = getNumberSide(leftSide.get(), ri
ghtSide.get()); | 377 CSSCalcExpressionNode* numberSide = getNumberSide(leftSide.get(), ri
ghtSide.get()); |
378 if (!numberSide) | 378 if (!numberSide) |
379 return create(leftSide, rightSide, op); | 379 return create(leftSide, rightSide, op); |
380 if (numberSide == leftSide && op == CalcDivide) | 380 if (numberSide == leftSide && op == CalcDivide) |
381 return 0; | 381 return nullptr; |
382 CSSCalcExpressionNode* otherSide = leftSide == numberSide ? rightSid
e.get() : leftSide.get(); | 382 CSSCalcExpressionNode* otherSide = leftSide == numberSide ? rightSid
e.get() : leftSide.get(); |
383 | 383 |
384 double number = numberSide->doubleValue(); | 384 double number = numberSide->doubleValue(); |
385 if (std::isnan(number) || std::isinf(number)) | 385 if (std::isnan(number) || std::isinf(number)) |
386 return 0; | 386 return nullptr; |
387 if (op == CalcDivide && !number) | 387 if (op == CalcDivide && !number) |
388 return 0; | 388 return nullptr; |
389 | 389 |
390 CSSPrimitiveValue::UnitTypes otherType = otherSide->primitiveType(); | 390 CSSPrimitiveValue::UnitTypes otherType = otherSide->primitiveType(); |
391 if (hasDoubleValue(otherType)) | 391 if (hasDoubleValue(otherType)) |
392 return CSSCalcPrimitiveValue::create(evaluateOperator(otherSide-
>doubleValue(), number, op), otherType, isInteger); | 392 return CSSCalcPrimitiveValue::create(evaluateOperator(otherSide-
>doubleValue(), number, op), otherType, isInteger); |
393 } | 393 } |
394 | 394 |
395 return create(leftSide, rightSide, op); | 395 return create(leftSide, rightSide, op); |
396 } | 396 } |
397 | 397 |
398 virtual bool isZero() const OVERRIDE | 398 virtual bool isZero() const OVERRIDE |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 class CSSCalcExpressionNodeParser { | 548 class CSSCalcExpressionNodeParser { |
549 DISALLOW_ALLOCATION(); // Is only ever stack allocated. | 549 DISALLOW_ALLOCATION(); // Is only ever stack allocated. |
550 public: | 550 public: |
551 PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> parseCalc(CSSParserValueList*
tokens) | 551 PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> parseCalc(CSSParserValueList*
tokens) |
552 { | 552 { |
553 unsigned index = 0; | 553 unsigned index = 0; |
554 Value result; | 554 Value result; |
555 bool ok = parseValueExpression(tokens, 0, &index, &result); | 555 bool ok = parseValueExpression(tokens, 0, &index, &result); |
556 ASSERT_WITH_SECURITY_IMPLICATION(index <= tokens->size()); | 556 ASSERT_WITH_SECURITY_IMPLICATION(index <= tokens->size()); |
557 if (!ok || index != tokens->size()) | 557 if (!ok || index != tokens->size()) |
558 return 0; | 558 return nullptr; |
559 return result.value; | 559 return result.value; |
560 } | 560 } |
561 | 561 |
562 private: | 562 private: |
563 struct Value { | 563 struct Value { |
564 DISALLOW_ALLOCATION(); // Is only ever stack allocated. | 564 DISALLOW_ALLOCATION(); // Is only ever stack allocated. |
565 public: | 565 public: |
566 RefPtrWillBeRawPtr<CSSCalcExpressionNode> value; | 566 RefPtrWillBeRawPtr<CSSCalcExpressionNode> value; |
567 }; | 567 }; |
568 | 568 |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
706 createExpressionNode(CSSPrimitiveValue::create(1 - progress, CSS
PrimitiveValue::CSS_NUMBER), isInteger), | 706 createExpressionNode(CSSPrimitiveValue::create(1 - progress, CSS
PrimitiveValue::CSS_NUMBER), isInteger), |
707 CalcMultiply), | 707 CalcMultiply), |
708 createExpressionNode( | 708 createExpressionNode( |
709 createExpressionNode(blendNode->to(), zoom), | 709 createExpressionNode(blendNode->to(), zoom), |
710 createExpressionNode(CSSPrimitiveValue::create(progress, CSSPrim
itiveValue::CSS_NUMBER), isInteger), | 710 createExpressionNode(CSSPrimitiveValue::create(progress, CSSPrim
itiveValue::CSS_NUMBER), isInteger), |
711 CalcMultiply), | 711 CalcMultiply), |
712 CalcAdd); | 712 CalcAdd); |
713 } | 713 } |
714 case CalcExpressionNodeUndefined: | 714 case CalcExpressionNodeUndefined: |
715 ASSERT_NOT_REACHED(); | 715 ASSERT_NOT_REACHED(); |
716 return 0; | 716 return nullptr; |
717 } | 717 } |
718 ASSERT_NOT_REACHED(); | 718 ASSERT_NOT_REACHED(); |
719 return 0; | 719 return nullptr; |
720 } | 720 } |
721 | 721 |
722 PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> CSSCalcValue::createExpressionNode
(const Length& length, float zoom) | 722 PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> CSSCalcValue::createExpressionNode
(const Length& length, float zoom) |
723 { | 723 { |
724 switch (length.type()) { | 724 switch (length.type()) { |
725 case Percent: | 725 case Percent: |
726 case Fixed: | 726 case Fixed: |
727 return createExpressionNode(CSSPrimitiveValue::create(length, zoom), len
gth.value() == trunc(length.value())); | 727 return createExpressionNode(CSSPrimitiveValue::create(length, zoom), len
gth.value() == trunc(length.value())); |
728 case Calculated: | 728 case Calculated: |
729 return createExpressionNode(length.calculationValue()->expression(), zoo
m); | 729 return createExpressionNode(length.calculationValue()->expression(), zoo
m); |
730 case Auto: | 730 case Auto: |
731 case Intrinsic: | 731 case Intrinsic: |
732 case MinIntrinsic: | 732 case MinIntrinsic: |
733 case MinContent: | 733 case MinContent: |
734 case MaxContent: | 734 case MaxContent: |
735 case FillAvailable: | 735 case FillAvailable: |
736 case FitContent: | 736 case FitContent: |
737 case ExtendToZoom: | 737 case ExtendToZoom: |
738 case DeviceWidth: | 738 case DeviceWidth: |
739 case DeviceHeight: | 739 case DeviceHeight: |
740 case Undefined: | 740 case Undefined: |
741 ASSERT_NOT_REACHED(); | 741 ASSERT_NOT_REACHED(); |
742 return 0; | 742 return nullptr; |
743 } | 743 } |
744 ASSERT_NOT_REACHED(); | 744 ASSERT_NOT_REACHED(); |
745 return 0; | 745 return nullptr; |
746 } | 746 } |
747 | 747 |
748 PassRefPtrWillBeRawPtr<CSSCalcValue> CSSCalcValue::create(CSSParserString name,
CSSParserValueList* parserValueList, ValueRange range) | 748 PassRefPtrWillBeRawPtr<CSSCalcValue> CSSCalcValue::create(CSSParserString name,
CSSParserValueList* parserValueList, ValueRange range) |
749 { | 749 { |
750 CSSCalcExpressionNodeParser parser; | 750 CSSCalcExpressionNodeParser parser; |
751 RefPtrWillBeRawPtr<CSSCalcExpressionNode> expression; | 751 RefPtrWillBeRawPtr<CSSCalcExpressionNode> expression; |
752 | 752 |
753 if (equalIgnoringCase(name, "calc(") || equalIgnoringCase(name, "-webkit-cal
c(")) | 753 if (equalIgnoringCase(name, "calc(") || equalIgnoringCase(name, "-webkit-cal
c(")) |
754 expression = parser.parseCalc(parserValueList); | 754 expression = parser.parseCalc(parserValueList); |
755 // FIXME calc (http://webkit.org/b/16662) Add parsing for min and max here | 755 // FIXME calc (http://webkit.org/b/16662) Add parsing for min and max here |
756 | 756 |
757 return expression ? adoptRefCountedWillBeRefCountedGarbageCollected(new CSSC
alcValue(expression, range)) : 0; | 757 return expression ? adoptRefCountedWillBeRefCountedGarbageCollected(new CSSC
alcValue(expression, range)) : nullptr; |
758 } | 758 } |
759 | 759 |
760 PassRefPtrWillBeRawPtr<CSSCalcValue> CSSCalcValue::create(PassRefPtrWillBeRawPtr
<CSSCalcExpressionNode> expression, ValueRange range) | 760 PassRefPtrWillBeRawPtr<CSSCalcValue> CSSCalcValue::create(PassRefPtrWillBeRawPtr
<CSSCalcExpressionNode> expression, ValueRange range) |
761 { | 761 { |
762 return adoptRefCountedWillBeRefCountedGarbageCollected(new CSSCalcValue(expr
ession, range)); | 762 return adoptRefCountedWillBeRefCountedGarbageCollected(new CSSCalcValue(expr
ession, range)); |
763 } | 763 } |
764 | 764 |
765 void CSSCalcValue::traceAfterDispatch(Visitor* visitor) | 765 void CSSCalcValue::traceAfterDispatch(Visitor* visitor) |
766 { | 766 { |
767 visitor->trace(m_expression); | 767 visitor->trace(m_expression); |
768 CSSValue::traceAfterDispatch(visitor); | 768 CSSValue::traceAfterDispatch(visitor); |
769 } | 769 } |
770 | 770 |
771 } // namespace WebCore | 771 } // namespace WebCore |
OLD | NEW |