Changeset 108750 in webkit
- Timestamp:
- Feb 24, 2012 1:33:28 AM (12 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r108749 r108750 1 2012-02-24 Mike Lawther <mikelawther@chromium.org> 2 3 CSS3 calc(): handle non-negative values 4 https://bugs.webkit.org/show_bug.cgi?id=79188 5 6 Reviewed by Daniel Bates. 7 8 * css3/calc/negative-padding-expected.html: Added. 9 * css3/calc/negative-padding.html: Added. 10 1 11 2012-02-22 Vsevolod Vlasov <vsevik@chromium.org> 2 12 -
trunk/Source/WebCore/ChangeLog
r108749 r108750 1 2012-02-24 Mike Lawther <mikelawther@chromium.org> 2 3 CSS3 calc(): handle non-negative values 4 https://bugs.webkit.org/show_bug.cgi?id=79188 5 6 Reviewed by Daniel Bates. 7 8 Some CSS properties (e.g. padding) are required to be non-negative. These 9 are now restricted to the correct range. 10 11 Tests: css3/calc/negative-padding-expected.html 12 css3/calc/negative-padding.html 13 14 * css/CSSCalculationValue.cpp: 15 (WebCore): 16 (WebCore::CSSCalcValue::clampToPermittedRange): Added 17 (WebCore::CSSCalcValue::doubleValue): 18 (WebCore::CSSCalcValue::isNegative): Added 19 (WebCore::CSSCalcValue::computeLengthPx): 20 (WebCore::CSSCalcValue::create): 21 * css/CSSCalculationValue.h: 22 (CSSCalcValue): 23 (WebCore::CSSCalcValue::CSSCalcValue): 24 * css/CSSParser.cpp: 25 (WebCore::CSSParser::validCalculationUnit): 26 (WebCore::CSSParser::parseCalculation): 27 * css/CSSParser.h: 28 * platform/CalculationValue.h: 29 1 30 2012-02-22 Vsevolod Vlasov <vsevik@chromium.org> 2 31 -
trunk/Source/WebCore/css/CSSCalculationValue.cpp
r107724 r108750 77 77 return ""; 78 78 } 79 79 80 double CSSCalcValue::clampToPermittedRange(double value) const 81 { 82 return m_nonNegative && value < 0 ? 0 : value; 83 } 84 80 85 double CSSCalcValue::doubleValue() const 81 86 { 82 return m_expression->doubleValue();83 } 84 87 return clampToPermittedRange(m_expression->doubleValue()); 88 } 89 85 90 double CSSCalcValue::computeLengthPx(RenderStyle* currentStyle, RenderStyle* rootStyle, double multiplier, bool computingFontSize) const 86 91 { 87 return m_expression->computeLengthPx(currentStyle, rootStyle, multiplier, computingFontSize);92 return clampToPermittedRange(m_expression->computeLengthPx(currentStyle, rootStyle, multiplier, computingFontSize)); 88 93 } 89 94 … … 382 387 }; 383 388 384 PassRefPtr<CSSCalcValue> CSSCalcValue::create(CSSParserString name, CSSParserValueList* parserValueList )389 PassRefPtr<CSSCalcValue> CSSCalcValue::create(CSSParserString name, CSSParserValueList* parserValueList, CalculationPermittedValueRange range) 385 390 { 386 391 CSSCalcExpressionNodeParser parser; … … 391 396 // FIXME calc (http://webkit.org/b/16662) Add parsing for min and max here 392 397 393 return expression ? adoptRef(new CSSCalcValue(expression )) : 0;398 return expression ? adoptRef(new CSSCalcValue(expression, range)) : 0; 394 399 } 395 400 -
trunk/Source/WebCore/css/CSSCalculationValue.h
r107724 r108750 61 61 virtual ~CSSCalcExpressionNode() = 0; 62 62 virtual bool isZero() const = 0; 63 virtual double doubleValue() const = 0; 63 virtual double doubleValue() const = 0; 64 64 virtual double computeLengthPx(RenderStyle* currentStyle, RenderStyle* rootStyle, double multiplier = 1.0, bool computingFontSize = false) const = 0; 65 65 … … 80 80 class CSSCalcValue : public CSSValue { 81 81 public: 82 static PassRefPtr<CSSCalcValue> create(CSSParserString name, CSSParserValueList* );82 static PassRefPtr<CSSCalcValue> create(CSSParserString name, CSSParserValueList*, CalculationPermittedValueRange); 83 83 84 84 CalculationCategory category() const { return m_expression->category(); } 85 85 bool isInt() const { return m_expression->isInteger(); } 86 86 double doubleValue() const; 87 bool isNegative() const { return m_expression->doubleValue() < 0; } 87 88 double computeLengthPx(RenderStyle* currentStyle, RenderStyle* rootStyle, double multiplier = 1.0, bool computingFontSize = false) const; 88 89 … … 90 91 91 92 private: 92 CSSCalcValue(PassRefPtr<CSSCalcExpressionNode> expression )93 CSSCalcValue(PassRefPtr<CSSCalcExpressionNode> expression, CalculationPermittedValueRange range) 93 94 : CSSValue(CalculationClass) 94 95 , m_expression(expression) 96 , m_nonNegative(range == CalculationRangeNonNegative) 95 97 { 96 98 } 97 99 100 double clampToPermittedRange(double) const; 101 98 102 const RefPtr<CSSCalcExpressionNode> m_expression; 103 const bool m_nonNegative; 99 104 }; 100 105 -
trunk/Source/WebCore/css/CSSParser.cpp
r108451 r108750 712 712 bool CSSParser::validCalculationUnit(CSSParserValue* value, Units unitflags) 713 713 { 714 if (!parseCalculation(value)) 714 bool mustBeNonNegative = unitflags & FNonNeg; 715 716 if (!parseCalculation(value, mustBeNonNegative ? CalculationRangeNonNegative : CalculationRangeAll)) 715 717 return false; 716 718 … … 722 724 case CalcPercent: 723 725 b = (unitflags & FPercent); 724 // FIXME calc (http://webkit.org/b/16662): test FNonNeg here, eg 725 // if (b && (unitflags & FNonNeg) && m_parsedCalculation->doubleValue() < 0) 726 // b = false; 726 if (b && mustBeNonNegative && m_parsedCalculation->isNegative()) 727 b = false; 727 728 break; 728 729 case CalcNumber: … … 730 731 if (!b && (unitflags & FInteger) && m_parsedCalculation->isInt()) 731 732 b = true; 732 // FIXME calc (http://webkit.org/b/16662): test FNonNeg here, eg 733 // if (b && (unitflags & FNonNeg) && m_parsedCalculation->doubleValue() < 0) 734 // b = false; 733 if (b && mustBeNonNegative && m_parsedCalculation->isNegative()) 734 b = false; 735 735 break; 736 736 case CalcPercentLength: … … 7420 7420 } 7421 7421 7422 bool CSSParser::parseCalculation(CSSParserValue* value )7422 bool CSSParser::parseCalculation(CSSParserValue* value, CalculationPermittedValueRange range) 7423 7423 { 7424 7424 ASSERT(isCalculation(value)); … … 7429 7429 7430 7430 ASSERT(!m_parsedCalculation); 7431 m_parsedCalculation = CSSCalcValue::create(value->function->name, args );7431 m_parsedCalculation = CSSCalcValue::create(value->function->name, args, range); 7432 7432 7433 7433 if (!m_parsedCalculation) -
trunk/Source/WebCore/css/CSSParser.h
r108451 r108750 210 210 211 211 bool parseLineBoxContain(bool important); 212 bool parseCalculation(CSSParserValue* );212 bool parseCalculation(CSSParserValue*, CalculationPermittedValueRange); 213 213 214 214 bool parseFontFeatureTag(CSSValueList*); -
trunk/Source/WebCore/platform/CalculationValue.h
r107259 r108750 44 44 CalcSubtract = '-', 45 45 CalcMultiply = '*', 46 CalcDivide = '/', 46 CalcDivide = '/' 47 }; 48 49 enum CalculationPermittedValueRange { 50 CalculationRangeAll, 51 CalculationRangeNonNegative 47 52 }; 48 53
Note: See TracChangeset
for help on using the changeset viewer.