Title: [168685] trunk
Revision
168685
Author
[email protected]
Date
2014-05-13 10:08:43 -0700 (Tue, 13 May 2014)

Log Message

ASSERTION FAILED: leftCategory != CalcOther && rightCategory != CalcOther
in WebCore::CSSCalcBinaryOperation::createSimplified
https://bugs.webkit.org/show_bug.cgi?id=132870

Source/WebCore:
According to the standard, calc() should be able to handle angle, time
and frequency values as well: http://www.w3.org/TR/css3-values/#calc

Patch by Martin Hodovan <[email protected]> on 2014-05-13
Reviewed by Darin Adler.

Test: fast/css/calc-with-angle-time-frequency.html

* css/CSSCalculationValue.cpp:
(WebCore::unitCategory):
(WebCore::CSSCalcPrimitiveValue::createCalcExpression):
(WebCore::CSSCalcPrimitiveValue::computeLengthPx):
(WebCore::CSSCalcPrimitiveValue::addSubtractResult):
(WebCore::CSSCalcPrimitiveValue::determineCategory):
(WebCore::CSSCalcBinaryOperation::primitiveType)
* css/CSSCalculationValue.h: extending CalculationCategory
* css/CSSParser.cpp:
(WebCore::CSSParser::validCalculationUnit):
* css/CSSPrimitiveValue.cpp:
(WebCore::CSSPrimitiveValue::primitiveType):

LayoutTests:
Added test contains calc() expressions with angle, time and frequency values,
covering all the newly introduced unit types, each of which used to fail.

Patch by Martin Hodovan <[email protected]> on 2014-05-13
Reviewed by Darin Adler.

* fast/css/calc-with-angle-time-frequency-expected.txt: Added.
* fast/css/calc-with-angle-time-frequency.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (168684 => 168685)


--- trunk/LayoutTests/ChangeLog	2014-05-13 16:26:16 UTC (rev 168684)
+++ trunk/LayoutTests/ChangeLog	2014-05-13 17:08:43 UTC (rev 168685)
@@ -1,3 +1,17 @@
+2014-05-13  Martin Hodovan  <[email protected]>
+
+        ASSERTION FAILED: leftCategory != CalcOther && rightCategory != CalcOther
+        in WebCore::CSSCalcBinaryOperation::createSimplified
+        https://bugs.webkit.org/show_bug.cgi?id=132870
+
+        Added test contains calc() expressions with angle, time and frequency values,
+        covering all the newly introduced unit types, each of which used to fail. 
+
+        Reviewed by Darin Adler.
+
+        * fast/css/calc-with-angle-time-frequency-expected.txt: Added.
+        * fast/css/calc-with-angle-time-frequency.html: Added.
+
 2014-05-13  Krzysztof Wolanski  <[email protected]>
 
         [EFL] Rebaseline after r168575

Added: trunk/LayoutTests/fast/css/calc-with-angle-time-frequency-expected.txt (0 => 168685)


--- trunk/LayoutTests/fast/css/calc-with-angle-time-frequency-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/css/calc-with-angle-time-frequency-expected.txt	2014-05-13 17:08:43 UTC (rev 168685)
@@ -0,0 +1 @@
+This test passes if it does not crash.

Added: trunk/LayoutTests/fast/css/calc-with-angle-time-frequency.html (0 => 168685)


--- trunk/LayoutTests/fast/css/calc-with-angle-time-frequency.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css/calc-with-angle-time-frequency.html	2014-05-13 17:08:43 UTC (rev 168685)
@@ -0,0 +1,25 @@
+<html>
+    <head>
+        <script>
+            if (window.testRunner)
+                testRunner.dumpAsText();
+        </script>
+        <style>
+            * {
+                width: calc(300deg/2);
+                width: calc(300rad/2);
+                width: calc(300grad/2);
+                width: calc(300turn/2);
+
+                width: calc(300ms/2);
+                width: calc(300s/2);
+
+                width: calc(300hz/2);
+                width: calc(300khz/2);
+            }
+        </style>
+    </head>
+    <body>
+        This test passes if it does not crash.
+    </body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (168684 => 168685)


--- trunk/Source/WebCore/ChangeLog	2014-05-13 16:26:16 UTC (rev 168684)
+++ trunk/Source/WebCore/ChangeLog	2014-05-13 17:08:43 UTC (rev 168685)
@@ -1,3 +1,29 @@
+2014-05-13  Martin Hodovan  <[email protected]>
+
+        ASSERTION FAILED: leftCategory != CalcOther && rightCategory != CalcOther
+        in WebCore::CSSCalcBinaryOperation::createSimplified
+        https://bugs.webkit.org/show_bug.cgi?id=132870
+
+        According to the standard, calc() should be able to handle angle, time
+        and frequency values as well: http://www.w3.org/TR/css3-values/#calc
+
+        Reviewed by Darin Adler.
+
+        Test: fast/css/calc-with-angle-time-frequency.html
+
+        * css/CSSCalculationValue.cpp:
+        (WebCore::unitCategory):
+        (WebCore::CSSCalcPrimitiveValue::createCalcExpression):
+        (WebCore::CSSCalcPrimitiveValue::computeLengthPx):
+        (WebCore::CSSCalcPrimitiveValue::addSubtractResult):
+        (WebCore::CSSCalcPrimitiveValue::determineCategory):
+        (WebCore::CSSCalcBinaryOperation::primitiveType)
+        * css/CSSCalculationValue.h: extending CalculationCategory
+        * css/CSSParser.cpp:
+        (WebCore::CSSParser::validCalculationUnit):
+        * css/CSSPrimitiveValue.cpp:
+        (WebCore::CSSPrimitiveValue::primitiveType):
+
 2014-05-13  Darin Adler  <[email protected]>
 
         Try to fix the !ENABLE(ICONDATABASE) build

Modified: trunk/Source/WebCore/css/CSSCalculationValue.cpp (168684 => 168685)


--- trunk/Source/WebCore/css/CSSCalculationValue.cpp	2014-05-13 16:26:16 UTC (rev 168684)
+++ trunk/Source/WebCore/css/CSSCalculationValue.cpp	2014-05-13 17:08:43 UTC (rev 168685)
@@ -56,8 +56,6 @@
     case CSSPrimitiveValue::CSS_NUMBER:
     case CSSPrimitiveValue::CSS_PARSER_INTEGER:
         return CalcNumber;
-    case CSSPrimitiveValue::CSS_PERCENTAGE:
-        return CalcPercent;
     case CSSPrimitiveValue::CSS_EMS:
     case CSSPrimitiveValue::CSS_EXS:
     case CSSPrimitiveValue::CSS_PX:
@@ -69,6 +67,19 @@
     case CSSPrimitiveValue::CSS_REMS:
     case CSSPrimitiveValue::CSS_CHS:
         return CalcLength;
+    case CSSPrimitiveValue::CSS_PERCENTAGE:
+        return CalcPercent;
+    case CSSPrimitiveValue::CSS_DEG:
+    case CSSPrimitiveValue::CSS_RAD:
+    case CSSPrimitiveValue::CSS_GRAD:
+    case CSSPrimitiveValue::CSS_TURN:
+        return CalcAngle;
+    case CSSPrimitiveValue::CSS_MS:
+    case CSSPrimitiveValue::CSS_S:
+        return CalcTime;
+    case CSSPrimitiveValue::CSS_HZ:
+    case CSSPrimitiveValue::CSS_KHZ:
+        return CalcFrequency;
     default:
         return CalcOther;
     }
@@ -218,6 +229,9 @@
         // Only types that could be part of a Length _expression_ can be converted
         // to a CalcExpressionNode. CalcPercentNumber makes no sense as a Length.
         case CalcPercentNumber:
+        case CalcAngle:
+        case CalcTime:
+        case CalcFrequency:
         case CalcOther:
             ASSERT_NOT_REACHED();
         }
@@ -242,6 +256,9 @@
             return m_value->getDoubleValue();
         case CalcPercentLength:
         case CalcPercentNumber:
+        case CalcAngle:
+        case CalcTime:
+        case CalcFrequency:
         case CalcOther:
             ASSERT_NOT_REACHED();
             break;
@@ -274,7 +291,7 @@
     RefPtr<CSSPrimitiveValue> m_value;
 };
 
-static const CalculationCategory addSubtractResult[CalcOther][CalcOther] = {
+static const CalculationCategory addSubtractResult[CalcAngle][CalcAngle] = {
 //    CalcNumber         CalcLength         CalcPercent        CalcPercentNumber  CalcPercentLength
     { CalcNumber,        CalcOther,         CalcPercentNumber, CalcPercentNumber, CalcOther }, //         CalcNumber
     { CalcOther,         CalcLength,        CalcPercentLength, CalcOther,         CalcPercentLength }, // CalcLength
@@ -294,7 +311,11 @@
     switch (op) {
     case CalcAdd:
     case CalcSubtract:
-        return addSubtractResult[leftCategory][rightCategory];
+        if (leftCategory < CalcAngle || rightCategory < CalcAngle)
+            return addSubtractResult[leftCategory][rightCategory];
+        if (leftCategory == rightCategory)
+            return leftCategory;
+        return CalcOther;
     case CalcMultiply:
         if (leftCategory != CalcNumber && rightCategory != CalcNumber)
             return CalcOther;
@@ -470,6 +491,12 @@
         }
         case CalcPercentLength:
         case CalcPercentNumber:
+        case CalcAngle:
+            return CSSPrimitiveValue::CSS_DEG;
+        case CalcTime:
+            return CSSPrimitiveValue::CSS_MS;
+        case CalcFrequency:
+            return CSSPrimitiveValue::CSS_HZ;
         case CalcOther:
             return CSSPrimitiveValue::CSS_UNKNOWN;
         }

Modified: trunk/Source/WebCore/css/CSSCalculationValue.h (168684 => 168685)


--- trunk/Source/WebCore/css/CSSCalculationValue.h	2014-05-13 16:26:16 UTC (rev 168684)
+++ trunk/Source/WebCore/css/CSSCalculationValue.h	2014-05-13 17:08:43 UTC (rev 168685)
@@ -46,6 +46,9 @@
     CalcPercent,
     CalcPercentNumber,
     CalcPercentLength,
+    CalcAngle,
+    CalcTime,
+    CalcFrequency,
     CalcOther
 };
 

Modified: trunk/Source/WebCore/css/CSSParser.cpp (168684 => 168685)


--- trunk/Source/WebCore/css/CSSParser.cpp	2014-05-13 16:26:16 UTC (rev 168684)
+++ trunk/Source/WebCore/css/CSSParser.cpp	2014-05-13 17:08:43 UTC (rev 168685)
@@ -1558,6 +1558,13 @@
 
     bool b = false;
     switch (m_parsedCalculation->category()) {
+    case CalcNumber:
+        b = (unitflags & FNumber);
+        if (!b && (unitflags & FInteger) && m_parsedCalculation->isInt())
+            b = true;
+        if (b && mustBeNonNegative && m_parsedCalculation->isNegative())
+            b = false;
+        break;
     case CalcLength:
         b = (unitflags & FLength);
         break;
@@ -1566,19 +1573,21 @@
         if (b && mustBeNonNegative && m_parsedCalculation->isNegative())
             b = false;
         break;
-    case CalcNumber:
-        b = (unitflags & FNumber);
-        if (!b && (unitflags & FInteger) && m_parsedCalculation->isInt())
-            b = true;
-        if (b && mustBeNonNegative && m_parsedCalculation->isNegative())
-            b = false;
-        break;
     case CalcPercentLength:
         b = (unitflags & FPercent) && (unitflags & FLength);
         break;
     case CalcPercentNumber:
         b = (unitflags & FPercent) && (unitflags & FNumber);
         break;
+    case CalcAngle:
+        b = (unitflags & FAngle);
+        break;
+    case CalcTime:
+        b = (unitflags & FTime);
+        break;
+    case CalcFrequency:
+        b = (unitflags & FFrequency);
+        break;
     case CalcOther:
         break;
     }

Modified: trunk/Source/WebCore/css/CSSPrimitiveValue.cpp (168684 => 168685)


--- trunk/Source/WebCore/css/CSSPrimitiveValue.cpp	2014-05-13 16:26:16 UTC (rev 168684)
+++ trunk/Source/WebCore/css/CSSPrimitiveValue.cpp	2014-05-13 17:08:43 UTC (rev 168685)
@@ -193,14 +193,20 @@
     switch (m_value.calc->category()) {
     case CalcNumber:
         return CSSPrimitiveValue::CSS_NUMBER;
+    case CalcLength:
+        return CSSPrimitiveValue::CSS_PX;
     case CalcPercent:
         return CSSPrimitiveValue::CSS_PERCENTAGE;
-    case CalcLength:
-        return CSSPrimitiveValue::CSS_PX;
     case CalcPercentNumber:
         return CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_NUMBER;
     case CalcPercentLength:
         return CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_LENGTH;
+    case CalcAngle:
+        return CSSPrimitiveValue::CSS_DEG;
+    case CalcTime:
+        return CSSPrimitiveValue::CSS_MS;
+    case CalcFrequency:
+        return CSSPrimitiveValue::CSS_HZ;
     case CalcOther:
         return CSSPrimitiveValue::CSS_UNKNOWN;
     }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to