Title: [107030] trunk
Revision
107030
Author
mikelawt...@chromium.org
Date
2012-02-07 19:40:33 -0800 (Tue, 07 Feb 2012)

Log Message

CSS3 calc() - simple parse time evaluation
https://bugs.webkit.org/show_bug.cgi?id=77960

Source/WebCore:

Adds simple number/percent _expression_ evaluation. rgb() and hsl() functions now
allow simple calc() expressions.

Reviewed by Ojan Vafai.

* css/CSSCalculationValue.cpp:
(WebCore):
(WebCore::CSSCalcValue::doubleValue):
(WebCore::CSSCalcPrimitiveValue::doubleValue):
(WebCore::CSSCalcBinaryOperation::doubleValue):
(CSSCalcBinaryOperation):
(WebCore::CSSCalcBinaryOperation::evaluate):
* css/CSSCalculationValue.h:
(CSSCalcExpressionNode):
(WebCore::CSSCalcValue::isInt):
(CSSCalcValue):
* css/CSSParser.cpp:
(WebCore::CSSParser::parsedDouble):

LayoutTests:

Reviewed by Ojan Vafai.

* css3/calc/color-hsl-expected.txt:
* css3/calc/color-rgb-expected.txt:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (107029 => 107030)


--- trunk/LayoutTests/ChangeLog	2012-02-08 03:26:18 UTC (rev 107029)
+++ trunk/LayoutTests/ChangeLog	2012-02-08 03:40:33 UTC (rev 107030)
@@ -1,3 +1,13 @@
+2012-02-07  Mike Lawther  <mikelawt...@chromium.org>
+
+        CSS3 calc() - simple parse time evaluation
+        https://bugs.webkit.org/show_bug.cgi?id=77960
+
+        Reviewed by Ojan Vafai.
+
+        * css3/calc/color-hsl-expected.txt:
+        * css3/calc/color-rgb-expected.txt:
+
 2012-02-07  Chris Palmer  <pal...@google.com>
 
         Resolve crash in FrameLoader::checkTimerFired.

Modified: trunk/LayoutTests/css3/calc/color-hsl-expected.txt (107029 => 107030)


--- trunk/LayoutTests/css3/calc/color-hsl-expected.txt	2012-02-08 03:26:18 UTC (rev 107029)
+++ trunk/LayoutTests/css3/calc/color-hsl-expected.txt	2012-02-08 03:40:33 UTC (rev 107030)
@@ -2,4 +2,4 @@
 These two sentences should be the same color (simple)
 These two sentences should be the same color (alpha)
 These two sentences should be the same color (alpha)
-FAIL
+PASS

Modified: trunk/LayoutTests/css3/calc/color-rgb-expected.txt (107029 => 107030)


--- trunk/LayoutTests/css3/calc/color-rgb-expected.txt	2012-02-08 03:26:18 UTC (rev 107029)
+++ trunk/LayoutTests/css3/calc/color-rgb-expected.txt	2012-02-08 03:40:33 UTC (rev 107030)
@@ -6,4 +6,4 @@
 C. These two sentences should be the same color (alpha)
 These two sentences should be the same color (percent alpha)
 These two sentences should be the same color (percent alpha)
-FAIL
+PASS

Modified: trunk/Source/WebCore/ChangeLog (107029 => 107030)


--- trunk/Source/WebCore/ChangeLog	2012-02-08 03:26:18 UTC (rev 107029)
+++ trunk/Source/WebCore/ChangeLog	2012-02-08 03:40:33 UTC (rev 107030)
@@ -1,3 +1,27 @@
+2012-02-07  Mike Lawther  <mikelawt...@chromium.org>
+
+        CSS3 calc() - simple parse time evaluation
+        https://bugs.webkit.org/show_bug.cgi?id=77960
+
+        Adds simple number/percent _expression_ evaluation. rgb() and hsl() functions now
+        allow simple calc() expressions.
+
+        Reviewed by Ojan Vafai.
+
+        * css/CSSCalculationValue.cpp:
+        (WebCore):
+        (WebCore::CSSCalcValue::doubleValue):
+        (WebCore::CSSCalcPrimitiveValue::doubleValue):
+        (WebCore::CSSCalcBinaryOperation::doubleValue):
+        (CSSCalcBinaryOperation):
+        (WebCore::CSSCalcBinaryOperation::evaluate):
+        * css/CSSCalculationValue.h:
+        (CSSCalcExpressionNode):
+        (WebCore::CSSCalcValue::isInt):
+        (CSSCalcValue):
+        * css/CSSParser.cpp:
+        (WebCore::CSSParser::parsedDouble):
+
 2012-02-07  Andreas Kling  <awesomekl...@apple.com>
 
         REGRESSION(r106668-r106889): Chromium page cycler tests (Intl2) performance regressions.

Modified: trunk/Source/WebCore/css/CSSCalculationValue.cpp (107029 => 107030)


--- trunk/Source/WebCore/css/CSSCalculationValue.cpp	2012-02-08 03:26:18 UTC (rev 107029)
+++ trunk/Source/WebCore/css/CSSCalculationValue.cpp	2012-02-08 03:40:33 UTC (rev 107030)
@@ -76,6 +76,11 @@
 {
     return "";
 }
+
+double CSSCalcValue::doubleValue() const 
+{ 
+    return m_expression->doubleValue();
+}
     
 CSSCalcExpressionNode::~CSSCalcExpressionNode() 
 {
@@ -94,7 +99,21 @@
         return m_value->cssText();
     }
 
-    
+    virtual double doubleValue() const
+    {
+        switch (m_category) {
+        case CalcNumber:
+        case CalcPercent:                
+            return m_value->getDoubleValue();
+        case CalcLength:
+        case CalcPercentLength:
+        case CalcPercentNumber:
+        case CalcOther:
+            ASSERT_NOT_REACHED();
+            break;
+        }
+        return 0;
+    }    
 private:
     explicit CSSCalcPrimitiveValue(CSSPrimitiveValue* value, bool isInteger)
         : CSSCalcExpressionNode(unitCategory((CSSPrimitiveValue::UnitTypes)value->primitiveType()), isInteger)
@@ -152,6 +171,11 @@
         return adoptRef(new CSSCalcBinaryOperation(leftSide, rightSide, op, newCategory));
     }
     
+    virtual double doubleValue() const 
+    {
+        return evaluate(m_leftSide->doubleValue(), m_rightSide->doubleValue());
+    }
+
 private:
     CSSCalcBinaryOperation(PassRefPtr<CSSCalcExpressionNode> leftSide, PassRefPtr<CSSCalcExpressionNode> rightSide, CalcOperator op, CalculationCategory category)
         : CSSCalcExpressionNode(category, leftSide->isInteger() && rightSide->isInteger())
@@ -161,6 +185,27 @@
     {
     }
     
+    double evaluate(double leftValue, double rightValue) const
+    {
+        switch (m_operator) {
+        case CalcAdd:
+            return leftValue + rightValue;
+        case CalcSubtract:
+            return leftValue - rightValue;
+        case CalcMultiply:
+            return leftValue * rightValue;
+        case CalcDivide:
+            if (rightValue)
+                return leftValue / rightValue;
+            return std::numeric_limits<double>::quiet_NaN();
+        case CalcMod:
+            // FIXME calc() : mod has been removed from the spec, need to remove
+            // this enum value
+            return 0;
+        }
+        return 0;
+    }
+    
     const RefPtr<CSSCalcExpressionNode> m_leftSide;
     const RefPtr<CSSCalcExpressionNode> m_rightSide;
     const CalcOperator m_operator;

Modified: trunk/Source/WebCore/css/CSSCalculationValue.h (107029 => 107030)


--- trunk/Source/WebCore/css/CSSCalculationValue.h	2012-02-08 03:26:18 UTC (rev 107029)
+++ trunk/Source/WebCore/css/CSSCalculationValue.h	2012-02-08 03:40:33 UTC (rev 107030)
@@ -58,7 +58,8 @@
 class CSSCalcExpressionNode : public RefCounted<CSSCalcExpressionNode> {
 public:
     
-    virtual ~CSSCalcExpressionNode() = 0;    
+    virtual ~CSSCalcExpressionNode() = 0;  
+    virtual double doubleValue() const = 0;  
     
     CalculationCategory category() const { return m_category; }    
     bool isInteger() const { return m_isInteger; }
@@ -80,7 +81,8 @@
     static PassRefPtr<CSSCalcValue> create(CSSParserString name, CSSParserValueList*);
 
     CalculationCategory category() const { return m_expression->category(); }
-    bool isInt() const { return m_expression->isInteger(); }
+    bool isInt() const { return m_expression->isInteger(); }    
+    double doubleValue() const;
         
     String customCssText() const;
     

Modified: trunk/Source/WebCore/css/CSSParser.cpp (107029 => 107030)


--- trunk/Source/WebCore/css/CSSParser.cpp	2012-02-08 03:26:18 UTC (rev 107029)
+++ trunk/Source/WebCore/css/CSSParser.cpp	2012-02-08 03:40:33 UTC (rev 107030)
@@ -4949,9 +4949,7 @@
     
 inline double CSSParser::parsedDouble(CSSParserValue *v, ReleaseParsedCalcValueCondition releaseCalc)
 {
-    // FIXME calc (http://webkit.org/b/16662): evaluate calc here, eg
-    // const double result = m_parsedCalculation ? m_parsedCalculation->doubleValue() : v->fValue;
-    const double result = m_parsedCalculation ? 0 : v->fValue;
+    const double result = m_parsedCalculation ? m_parsedCalculation->doubleValue() : v->fValue;
     if (releaseCalc == ReleaseParsedCalcValue)
         m_parsedCalculation.release();
     return result;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to