From 3b7958787e9f892c238146573af4a6250338dbfa Mon Sep 17 00:00:00 2001 From: "mikelawther@chromium.org" Date: Fri, 24 Feb 2012 09:33:28 +0000 Subject: [PATCH] CSS3 calc(): handle non-negative values https://bugs.webkit.org/show_bug.cgi?id=79188 Reviewed by Daniel Bates. Source/WebCore: Some CSS properties (e.g. padding) are required to be non-negative. These are now restricted to the correct range. Tests: css3/calc/negative-padding-expected.html css3/calc/negative-padding.html * css/CSSCalculationValue.cpp: (WebCore): (WebCore::CSSCalcValue::clampToPermittedRange): Added (WebCore::CSSCalcValue::doubleValue): (WebCore::CSSCalcValue::isNegative): Added (WebCore::CSSCalcValue::computeLengthPx): (WebCore::CSSCalcValue::create): * css/CSSCalculationValue.h: (CSSCalcValue): (WebCore::CSSCalcValue::CSSCalcValue): * css/CSSParser.cpp: (WebCore::CSSParser::validCalculationUnit): (WebCore::CSSParser::parseCalculation): * css/CSSParser.h: * platform/CalculationValue.h: LayoutTests: * css3/calc/negative-padding-expected.html: Added. * css3/calc/negative-padding.html: Added. git-svn-id: http://svn.webkit.org/repository/webkit/trunk@108750 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- LayoutTests/ChangeLog | 10 ++++++++ .../css3/calc/negative-padding-expected.html | 11 ++++++++ LayoutTests/css3/calc/negative-padding.html | 13 ++++++++++ Source/WebCore/ChangeLog | 29 ++++++++++++++++++++++ Source/WebCore/css/CSSCalculationValue.cpp | 17 ++++++++----- Source/WebCore/css/CSSCalculationValue.h | 11 +++++--- Source/WebCore/css/CSSParser.cpp | 18 +++++++------- Source/WebCore/css/CSSParser.h | 2 +- Source/WebCore/platform/CalculationValue.h | 7 +++++- 9 files changed, 98 insertions(+), 20 deletions(-) create mode 100644 LayoutTests/css3/calc/negative-padding-expected.html create mode 100644 LayoutTests/css3/calc/negative-padding.html diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog index 1af3146..261d3c5 100644 --- a/LayoutTests/ChangeLog +++ b/LayoutTests/ChangeLog @@ -1,3 +1,13 @@ +2012-02-24 Mike Lawther + + CSS3 calc(): handle non-negative values + https://bugs.webkit.org/show_bug.cgi?id=79188 + + Reviewed by Daniel Bates. + + * css3/calc/negative-padding-expected.html: Added. + * css3/calc/negative-padding.html: Added. + 2012-02-22 Vsevolod Vlasov Web Inspector: [Regression] xhr tests are crashing after r108506. diff --git a/LayoutTests/css3/calc/negative-padding-expected.html b/LayoutTests/css3/calc/negative-padding-expected.html new file mode 100644 index 0000000..b99bcd7 --- /dev/null +++ b/LayoutTests/css3/calc/negative-padding-expected.html @@ -0,0 +1,11 @@ + + + +
+

This element should have zero padding.

+

This element should have zero padding.

+

This element should have zero padding.

+
diff --git a/LayoutTests/css3/calc/negative-padding.html b/LayoutTests/css3/calc/negative-padding.html new file mode 100644 index 0000000..075e828 --- /dev/null +++ b/LayoutTests/css3/calc/negative-padding.html @@ -0,0 +1,13 @@ + + + +
+

This element should have zero padding.

+

This element should have zero padding.

+

This element should have zero padding.

+
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index 75912f6..d2c28dd 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,32 @@ +2012-02-24 Mike Lawther + + CSS3 calc(): handle non-negative values + https://bugs.webkit.org/show_bug.cgi?id=79188 + + Reviewed by Daniel Bates. + + Some CSS properties (e.g. padding) are required to be non-negative. These + are now restricted to the correct range. + + Tests: css3/calc/negative-padding-expected.html + css3/calc/negative-padding.html + + * css/CSSCalculationValue.cpp: + (WebCore): + (WebCore::CSSCalcValue::clampToPermittedRange): Added + (WebCore::CSSCalcValue::doubleValue): + (WebCore::CSSCalcValue::isNegative): Added + (WebCore::CSSCalcValue::computeLengthPx): + (WebCore::CSSCalcValue::create): + * css/CSSCalculationValue.h: + (CSSCalcValue): + (WebCore::CSSCalcValue::CSSCalcValue): + * css/CSSParser.cpp: + (WebCore::CSSParser::validCalculationUnit): + (WebCore::CSSParser::parseCalculation): + * css/CSSParser.h: + * platform/CalculationValue.h: + 2012-02-22 Vsevolod Vlasov Web Inspector: [Regression] xhr tests are crashing after r108506. diff --git a/Source/WebCore/css/CSSCalculationValue.cpp b/Source/WebCore/css/CSSCalculationValue.cpp index 8dd0c8e..87fa737 100755 --- a/Source/WebCore/css/CSSCalculationValue.cpp +++ b/Source/WebCore/css/CSSCalculationValue.cpp @@ -76,15 +76,20 @@ String CSSCalcValue::customCssText() const { return ""; } - + +double CSSCalcValue::clampToPermittedRange(double value) const +{ + return m_nonNegative && value < 0 ? 0 : value; +} + double CSSCalcValue::doubleValue() const { - return m_expression->doubleValue(); + return clampToPermittedRange(m_expression->doubleValue()); } - + double CSSCalcValue::computeLengthPx(RenderStyle* currentStyle, RenderStyle* rootStyle, double multiplier, bool computingFontSize) const { - return m_expression->computeLengthPx(currentStyle, rootStyle, multiplier, computingFontSize); + return clampToPermittedRange(m_expression->computeLengthPx(currentStyle, rootStyle, multiplier, computingFontSize)); } CSSCalcExpressionNode::~CSSCalcExpressionNode() @@ -381,7 +386,7 @@ private: } }; -PassRefPtr CSSCalcValue::create(CSSParserString name, CSSParserValueList* parserValueList) +PassRefPtr CSSCalcValue::create(CSSParserString name, CSSParserValueList* parserValueList, CalculationPermittedValueRange range) { CSSCalcExpressionNodeParser parser; RefPtr expression; @@ -390,7 +395,7 @@ PassRefPtr CSSCalcValue::create(CSSParserString name, CSSParserVal expression = parser.parseCalc(parserValueList); // FIXME calc (http://webkit.org/b/16662) Add parsing for min and max here - return expression ? adoptRef(new CSSCalcValue(expression)) : 0; + return expression ? adoptRef(new CSSCalcValue(expression, range)) : 0; } } // namespace WebCore diff --git a/Source/WebCore/css/CSSCalculationValue.h b/Source/WebCore/css/CSSCalculationValue.h index 2dbf429..7c36671 100755 --- a/Source/WebCore/css/CSSCalculationValue.h +++ b/Source/WebCore/css/CSSCalculationValue.h @@ -60,7 +60,7 @@ public: virtual ~CSSCalcExpressionNode() = 0; virtual bool isZero() const = 0; - virtual double doubleValue() const = 0; + virtual double doubleValue() const = 0; virtual double computeLengthPx(RenderStyle* currentStyle, RenderStyle* rootStyle, double multiplier = 1.0, bool computingFontSize = false) const = 0; CalculationCategory category() const { return m_category; } @@ -79,23 +79,28 @@ protected: class CSSCalcValue : public CSSValue { public: - static PassRefPtr create(CSSParserString name, CSSParserValueList*); + static PassRefPtr create(CSSParserString name, CSSParserValueList*, CalculationPermittedValueRange); CalculationCategory category() const { return m_expression->category(); } bool isInt() const { return m_expression->isInteger(); } double doubleValue() const; + bool isNegative() const { return m_expression->doubleValue() < 0; } double computeLengthPx(RenderStyle* currentStyle, RenderStyle* rootStyle, double multiplier = 1.0, bool computingFontSize = false) const; String customCssText() const; private: - CSSCalcValue(PassRefPtr expression) + CSSCalcValue(PassRefPtr expression, CalculationPermittedValueRange range) : CSSValue(CalculationClass) , m_expression(expression) + , m_nonNegative(range == CalculationRangeNonNegative) { } + double clampToPermittedRange(double) const; + const RefPtr m_expression; + const bool m_nonNegative; }; } // namespace WebCore diff --git a/Source/WebCore/css/CSSParser.cpp b/Source/WebCore/css/CSSParser.cpp index 03f91b3..40c05a7 100644 --- a/Source/WebCore/css/CSSParser.cpp +++ b/Source/WebCore/css/CSSParser.cpp @@ -711,7 +711,9 @@ Document* CSSParser::findDocument() const bool CSSParser::validCalculationUnit(CSSParserValue* value, Units unitflags) { - if (!parseCalculation(value)) + bool mustBeNonNegative = unitflags & FNonNeg; + + if (!parseCalculation(value, mustBeNonNegative ? CalculationRangeNonNegative : CalculationRangeAll)) return false; bool b = false; @@ -721,17 +723,15 @@ bool CSSParser::validCalculationUnit(CSSParserValue* value, Units unitflags) break; case CalcPercent: b = (unitflags & FPercent); - // FIXME calc (http://webkit.org/b/16662): test FNonNeg here, eg - // if (b && (unitflags & FNonNeg) && m_parsedCalculation->doubleValue() < 0) - // b = false; + if (b && mustBeNonNegative && m_parsedCalculation->isNegative()) + b = false; break; case CalcNumber: b = (unitflags & FNumber); if (!b && (unitflags & FInteger) && m_parsedCalculation->isInt()) b = true; - // FIXME calc (http://webkit.org/b/16662): test FNonNeg here, eg - // if (b && (unitflags & FNonNeg) && m_parsedCalculation->doubleValue() < 0) - // b = false; + if (b && mustBeNonNegative && m_parsedCalculation->isNegative()) + b = false; break; case CalcPercentLength: b = (unitflags & FPercent) && (unitflags & FLength); @@ -7419,7 +7419,7 @@ bool CSSParser::parseFontVariantLigatures(bool important) return true; } -bool CSSParser::parseCalculation(CSSParserValue* value) +bool CSSParser::parseCalculation(CSSParserValue* value, CalculationPermittedValueRange range) { ASSERT(isCalculation(value)); @@ -7428,7 +7428,7 @@ bool CSSParser::parseCalculation(CSSParserValue* value) return false; ASSERT(!m_parsedCalculation); - m_parsedCalculation = CSSCalcValue::create(value->function->name, args); + m_parsedCalculation = CSSCalcValue::create(value->function->name, args, range); if (!m_parsedCalculation) return false; diff --git a/Source/WebCore/css/CSSParser.h b/Source/WebCore/css/CSSParser.h index 05e6e0e..5d766be 100644 --- a/Source/WebCore/css/CSSParser.h +++ b/Source/WebCore/css/CSSParser.h @@ -209,7 +209,7 @@ public: bool parseTextEmphasisStyle(bool important); bool parseLineBoxContain(bool important); - bool parseCalculation(CSSParserValue*); + bool parseCalculation(CSSParserValue*, CalculationPermittedValueRange); bool parseFontFeatureTag(CSSValueList*); bool parseFontFeatureSettings(bool important); diff --git a/Source/WebCore/platform/CalculationValue.h b/Source/WebCore/platform/CalculationValue.h index 7621794..d89445e 100755 --- a/Source/WebCore/platform/CalculationValue.h +++ b/Source/WebCore/platform/CalculationValue.h @@ -43,7 +43,12 @@ enum CalcOperator { CalcAdd = '+', CalcSubtract = '-', CalcMultiply = '*', - CalcDivide = '/', + CalcDivide = '/' +}; + +enum CalculationPermittedValueRange { + CalculationRangeAll, + CalculationRangeNonNegative }; } // namespace WebCore -- 2.7.4