| 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 14 matching lines...) Expand all Loading... |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "core/css/CSSCalculationValue.h" | 31 #include "core/css/CSSCalculationValue.h" |
| 32 | 32 |
| 33 #include "core/css/CSSPrimitiveValueMappings.h" | 33 #include "core/css/CSSPrimitiveValueMappings.h" |
| 34 #include "core/css/resolver/StyleResolver.h" | 34 #include "core/css/resolver/StyleResolver.h" |
| 35 #include "core/css/serializer/CSSDeserializeStream.h" |
| 36 #include "core/css/serializer/CSSSerializeStream.h" |
| 35 #include "wtf/MathExtras.h" | 37 #include "wtf/MathExtras.h" |
| 36 #include "wtf/OwnPtr.h" | 38 #include "wtf/OwnPtr.h" |
| 37 #include "wtf/text/StringBuilder.h" | 39 #include "wtf/text/StringBuilder.h" |
| 38 | 40 |
| 39 static const int maxExpressionDepth = 100; | 41 static const int maxExpressionDepth = 100; |
| 40 | 42 |
| 41 enum ParseState { | 43 enum ParseState { |
| 42 OK, | 44 OK, |
| 43 TooDeep, | 45 TooDeep, |
| 44 NoMoreTokens | 46 NoMoreTokens |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 | 257 |
| 256 return compareCSSValuePtr(m_value, static_cast<const CSSCalcPrimitiveVal
ue&>(other).m_value); | 258 return compareCSSValuePtr(m_value, static_cast<const CSSCalcPrimitiveVal
ue&>(other).m_value); |
| 257 } | 259 } |
| 258 | 260 |
| 259 Type type() const override { return CssCalcPrimitiveValue; } | 261 Type type() const override { return CssCalcPrimitiveValue; } |
| 260 CSSPrimitiveValue::UnitType typeWithCalcResolved() const override | 262 CSSPrimitiveValue::UnitType typeWithCalcResolved() const override |
| 261 { | 263 { |
| 262 return m_value->typeWithCalcResolved(); | 264 return m_value->typeWithCalcResolved(); |
| 263 } | 265 } |
| 264 | 266 |
| 267 void serialize(CSSSerializeStream* stream) const override |
| 268 { |
| 269 CSSCalcExpressionNode::serialize(stream); |
| 270 m_value->serialize(stream); |
| 271 } |
| 272 |
| 273 static PassRefPtrWillBeRawPtr<CSSCalcPrimitiveValue> deserializeAfterDispatc
h(CalculationCategory category, bool isInteger, CSSDeserializeStream* stream) |
| 274 { |
| 275 RefPtrWillBeRawPtr<CSSPrimitiveValue> value = stream->readNullableRef<CS
SPrimitiveValue>(); |
| 276 return create(value.release(), isInteger); |
| 277 } |
| 265 | 278 |
| 266 DEFINE_INLINE_VIRTUAL_TRACE() | 279 DEFINE_INLINE_VIRTUAL_TRACE() |
| 267 { | 280 { |
| 268 visitor->trace(m_value); | 281 visitor->trace(m_value); |
| 269 CSSCalcExpressionNode::trace(visitor); | 282 CSSCalcExpressionNode::trace(visitor); |
| 270 } | 283 } |
| 271 | 284 |
| 272 private: | 285 private: |
| 273 CSSCalcPrimitiveValue(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> value, bool
isInteger) | 286 CSSCalcPrimitiveValue(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> value, bool
isInteger) |
| 274 : CSSCalcExpressionNode(unitCategory(value->typeWithCalcResolved()), isI
nteger) | 287 : CSSCalcExpressionNode(unitCategory(value->typeWithCalcResolved()), isI
nteger) |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 return CSSPrimitiveValue::UnitType::Hertz; | 535 return CSSPrimitiveValue::UnitType::Hertz; |
| 523 case CalcPercentLength: | 536 case CalcPercentLength: |
| 524 case CalcPercentNumber: | 537 case CalcPercentNumber: |
| 525 case CalcOther: | 538 case CalcOther: |
| 526 return CSSPrimitiveValue::UnitType::Unknown; | 539 return CSSPrimitiveValue::UnitType::Unknown; |
| 527 } | 540 } |
| 528 ASSERT_NOT_REACHED(); | 541 ASSERT_NOT_REACHED(); |
| 529 return CSSPrimitiveValue::UnitType::Unknown; | 542 return CSSPrimitiveValue::UnitType::Unknown; |
| 530 } | 543 } |
| 531 | 544 |
| 545 void serialize(CSSSerializeStream* stream) const override |
| 546 { |
| 547 CSSCalcExpressionNode::serialize(stream); |
| 548 m_leftSide->serialize(stream); |
| 549 m_rightSide->serialize(stream); |
| 550 stream->writeEnumAsInt<CalcOperator>(m_operator); |
| 551 } |
| 552 |
| 553 static PassRefPtrWillBeRawPtr<CSSCalcBinaryOperation> deserializeAfterDispat
ch(CalculationCategory category, bool isInteger, CSSDeserializeStream* stream) |
| 554 { |
| 555 RefPtrWillBeRawPtr<CSSCalcExpressionNode> leftSide = CSSCalcExpressionNo
de::deserialize(stream); |
| 556 RefPtrWillBeRawPtr<CSSCalcExpressionNode> rightSide = CSSCalcExpressionN
ode::deserialize(stream); |
| 557 CalcOperator calcOperator = stream->readIntAsEnum<CalcOperator>(); |
| 558 return adoptRefWillBeNoop(new CSSCalcBinaryOperation(leftSide.release(),
rightSide.release(), calcOperator, category)); |
| 559 } |
| 560 |
| 532 DEFINE_INLINE_VIRTUAL_TRACE() | 561 DEFINE_INLINE_VIRTUAL_TRACE() |
| 533 { | 562 { |
| 534 visitor->trace(m_leftSide); | 563 visitor->trace(m_leftSide); |
| 535 visitor->trace(m_rightSide); | 564 visitor->trace(m_rightSide); |
| 536 CSSCalcExpressionNode::trace(visitor); | 565 CSSCalcExpressionNode::trace(visitor); |
| 537 } | 566 } |
| 538 | 567 |
| 539 private: | 568 private: |
| 540 CSSCalcBinaryOperation(PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> leftSid
e, PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> rightSide, CalcOperator op, Cal
culationCategory category) | 569 CSSCalcBinaryOperation(PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> leftSid
e, PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> rightSide, CalcOperator op, Cal
culationCategory category) |
| 541 : CSSCalcExpressionNode(category, isIntegerResult(leftSide.get(), rightS
ide.get(), op)) | 570 : CSSCalcExpressionNode(category, isIntegerResult(leftSide.get(), rightS
ide.get(), op)) |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 723 } | 752 } |
| 724 | 753 |
| 725 PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> CSSCalcValue::createExpressionNode
(double pixels, double percent) | 754 PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> CSSCalcValue::createExpressionNode
(double pixels, double percent) |
| 726 { | 755 { |
| 727 return createExpressionNode( | 756 return createExpressionNode( |
| 728 createExpressionNode(CSSPrimitiveValue::create(pixels, CSSPrimitiveValue
::UnitType::Pixels), pixels == trunc(pixels)), | 757 createExpressionNode(CSSPrimitiveValue::create(pixels, CSSPrimitiveValue
::UnitType::Pixels), pixels == trunc(pixels)), |
| 729 createExpressionNode(CSSPrimitiveValue::create(percent, CSSPrimitiveValu
e::UnitType::Percentage), percent == trunc(percent)), | 758 createExpressionNode(CSSPrimitiveValue::create(percent, CSSPrimitiveValu
e::UnitType::Percentage), percent == trunc(percent)), |
| 730 CalcAdd); | 759 CalcAdd); |
| 731 } | 760 } |
| 732 | 761 |
| 762 void CSSCalcExpressionNode::serialize(CSSSerializeStream* stream) const |
| 763 { |
| 764 stream->writeEnumAsInt<Type>(type()); |
| 765 stream->writeEnumAsInt<CalculationCategory>(m_category); |
| 766 stream->writeBool(m_isInteger); |
| 767 } |
| 768 |
| 769 PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> CSSCalcExpressionNode::deserialize
(CSSDeserializeStream* stream) |
| 770 { |
| 771 Type type = stream->readIntAsEnum<Type>(); |
| 772 CalculationCategory category = stream->readIntAsEnum<CalculationCategory>();
|
| 773 bool isInteger = stream->readBool(); |
| 774 |
| 775 switch (type) { |
| 776 case CssCalcPrimitiveValue: |
| 777 return CSSCalcPrimitiveValue::deserializeAfterDispatch(category, isInteg
er, stream); |
| 778 case CssCalcBinaryOperation: |
| 779 return CSSCalcBinaryOperation::deserializeAfterDispatch(category, isInte
ger, stream); |
| 780 default: |
| 781 ASSERT_NOT_REACHED(); |
| 782 } |
| 783 } |
| 784 |
| 733 PassRefPtrWillBeRawPtr<CSSCalcValue> CSSCalcValue::create(const CSSParserTokenRa
nge& tokens, ValueRange range) | 785 PassRefPtrWillBeRawPtr<CSSCalcValue> CSSCalcValue::create(const CSSParserTokenRa
nge& tokens, ValueRange range) |
| 734 { | 786 { |
| 735 CSSCalcExpressionNodeParser parser; | 787 CSSCalcExpressionNodeParser parser; |
| 736 RefPtrWillBeRawPtr<CSSCalcExpressionNode> expression = parser.parseCalc(toke
ns); | 788 RefPtrWillBeRawPtr<CSSCalcExpressionNode> expression = parser.parseCalc(toke
ns); |
| 737 | 789 |
| 738 return expression ? adoptRefWillBeNoop(new CSSCalcValue(expression, range))
: nullptr; | 790 return expression ? adoptRefWillBeNoop(new CSSCalcValue(expression, range))
: nullptr; |
| 739 } | 791 } |
| 740 | 792 |
| 741 PassRefPtrWillBeRawPtr<CSSCalcValue> CSSCalcValue::create(PassRefPtrWillBeRawPtr
<CSSCalcExpressionNode> expression, ValueRange range) | 793 PassRefPtrWillBeRawPtr<CSSCalcValue> CSSCalcValue::create(PassRefPtrWillBeRawPtr
<CSSCalcExpressionNode> expression, ValueRange range) |
| 742 { | 794 { |
| 743 return adoptRefWillBeNoop(new CSSCalcValue(expression, range)); | 795 return adoptRefWillBeNoop(new CSSCalcValue(expression, range)); |
| 744 } | 796 } |
| 745 | 797 |
| 798 void CSSCalcValue::serialize(CSSSerializeStream* stream) const |
| 799 { |
| 800 m_expression->serialize(stream); |
| 801 stream->writeBool(m_nonNegative); |
| 802 } |
| 803 |
| 804 PassRefPtrWillBeRawPtr<CSSCalcValue> CSSCalcValue::deserialize(CSSDeserializeStr
eam* stream) |
| 805 { |
| 806 RefPtrWillBeRawPtr<CSSCalcExpressionNode> expression = CSSCalcExpressionNode
::deserialize(stream); |
| 807 bool nonNegative = stream->readBool(); |
| 808 return create(expression.release(), nonNegative ? ValueRangeNonNegative : Va
lueRangeAll); |
| 809 } |
| 810 |
| 746 } // namespace blink | 811 } // namespace blink |
| OLD | NEW |