[CSS Parser] Fix transform parsing
authorhyatt@apple.com <hyatt@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 19 Oct 2016 17:40:27 +0000 (17:40 +0000)
committerhyatt@apple.com <hyatt@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 19 Oct 2016 17:40:27 +0000 (17:40 +0000)
https://bugs.webkit.org/show_bug.cgi?id=163671

Reviewed by Dean Jackson.

The new parser turned function names into CSSValueIDs and made CSSFunctionValue store them. This
meant it could be used to handle transform values, with the function name representing the
transform operation efficiently as a CSSValueID.

The old parser, however, creates WebKitCSSTransformValues. This value does not exist in the new
parser. Rather than forcing the old and new parser over to CSSFunctionValues, I opted to
just make the new parser build WebkitCSSTransformValues too.

The main reason I did this is that WebkitCSSTransformValue is actually exposed to the Web via
IDL. To be safe, I am not eliminating it (even though Blink has).

* css/parser/CSSPropertyParser.cpp:
(WebCore::consumeTranslate3d):
(WebCore::consumeNumbers):
(WebCore::consumePerspective):
(WebCore::transformOperationForCSSValueID):
(WebCore::consumeTransformValue):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207543 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/css/parser/CSSPropertyParser.cpp

index 3fd0e86..7fc9608 100644 (file)
@@ -1,3 +1,28 @@
+2016-10-19  Dave Hyatt  <hyatt@apple.com>
+
+        [CSS Parser] Fix transform parsing
+        https://bugs.webkit.org/show_bug.cgi?id=163671
+
+        Reviewed by Dean Jackson.
+
+        The new parser turned function names into CSSValueIDs and made CSSFunctionValue store them. This
+        meant it could be used to handle transform values, with the function name representing the
+        transform operation efficiently as a CSSValueID.
+
+        The old parser, however, creates WebKitCSSTransformValues. This value does not exist in the new
+        parser. Rather than forcing the old and new parser over to CSSFunctionValues, I opted to
+        just make the new parser build WebkitCSSTransformValues too.
+
+        The main reason I did this is that WebkitCSSTransformValue is actually exposed to the Web via
+        IDL. To be safe, I am not eliminating it (even though Blink has).
+
+        * css/parser/CSSPropertyParser.cpp:
+        (WebCore::consumeTranslate3d):
+        (WebCore::consumeNumbers):
+        (WebCore::consumePerspective):
+        (WebCore::transformOperationForCSSValueID):
+        (WebCore::consumeTransformValue):
+
 2016-10-19  Darin Adler  <darin@apple.com>
 
         Move XPath from ExceptionCode to Exception
index 45cfbc1..a38f0ac 100644 (file)
@@ -68,6 +68,7 @@
 #include "SVGPathUtilities.h"
 #include "StylePropertyShorthand.h"
 #include "StylePropertyShorthandFunctions.h"
+#include "WebkitCSSTransformValue.h"
 #include <memory>
 #include <wtf/text/StringBuilder.h>
 
@@ -1451,7 +1452,7 @@ static RefPtr<CSSPrimitiveValue> consumeColumnRuleWidth(CSSParserTokenRange& ran
     return consumeLineWidth(range, cssParserMode, UnitlessQuirk::Forbid);
 }
 
-static bool consumeTranslate3d(CSSParserTokenRange& args, CSSParserMode cssParserMode, RefPtr<CSSFunctionValue>& transformValue)
+static bool consumeTranslate3d(CSSParserTokenRange& args, CSSParserMode cssParserMode, RefPtr<WebKitCSSTransformValue>& transformValue)
 {
     unsigned numberOfArguments = 2;
     RefPtr<CSSValue> parsedValue;
@@ -1470,7 +1471,7 @@ static bool consumeTranslate3d(CSSParserTokenRange& args, CSSParserMode cssParse
     return true;
 }
 
-static bool consumeNumbers(CSSParserTokenRange& args, RefPtr<CSSFunctionValue>& transformValue, unsigned numberOfArguments)
+static bool consumeNumbers(CSSParserTokenRange& args, RefPtr<WebKitCSSTransformValue>& transformValue, unsigned numberOfArguments)
 {
     do {
         RefPtr<CSSPrimitiveValue> parsedValue = consumeNumber(args, ValueRangeAll);
@@ -1483,7 +1484,7 @@ static bool consumeNumbers(CSSParserTokenRange& args, RefPtr<CSSFunctionValue>&
     return true;
 }
 
-static bool consumePerspective(CSSParserTokenRange& args, CSSParserMode cssParserMode, RefPtr<CSSFunctionValue>& transformValue)
+static bool consumePerspective(CSSParserTokenRange& args, CSSParserMode cssParserMode, RefPtr<WebKitCSSTransformValue>& transformValue)
 {
     RefPtr<CSSPrimitiveValue> parsedValue = consumeLength(args, cssParserMode, ValueRangeNonNegative);
     if (!parsedValue) {
@@ -1498,6 +1499,58 @@ static bool consumePerspective(CSSParserTokenRange& args, CSSParserMode cssParse
     return true;
 }
 
+// FIXME-NEWPARSER: This has no reason to exist once we eliminate WebkitCSSTransformValue in favor
+// of CSSFunctionValue.
+static WebKitCSSTransformValue::TransformOperationType transformOperationForCSSValueID(CSSValueID functionId)
+{
+    switch (functionId) {
+    case CSSValueRotate:
+        return WebKitCSSTransformValue::RotateTransformOperation;
+    case CSSValueRotatex:
+        return WebKitCSSTransformValue::RotateXTransformOperation;
+    case CSSValueRotatey:
+        return WebKitCSSTransformValue::RotateYTransformOperation;
+    case CSSValueRotatez:
+        return WebKitCSSTransformValue::RotateZTransformOperation;
+    case CSSValueSkewx:
+        return WebKitCSSTransformValue::SkewXTransformOperation;
+    case CSSValueSkewy:
+        return WebKitCSSTransformValue::SkewYTransformOperation;
+    case CSSValueSkew:
+        return WebKitCSSTransformValue::SkewTransformOperation;
+    case CSSValueScalex:
+        return WebKitCSSTransformValue::ScaleXTransformOperation;
+    case CSSValueScaley:
+        return WebKitCSSTransformValue::ScaleYTransformOperation;
+    case CSSValueScalez:
+        return WebKitCSSTransformValue::ScaleZTransformOperation;
+    case CSSValueScale:
+        return WebKitCSSTransformValue::ScaleTransformOperation;
+    case CSSValuePerspective:
+        return WebKitCSSTransformValue::PerspectiveTransformOperation;
+    case CSSValueTranslatex:
+        return WebKitCSSTransformValue::TranslateXTransformOperation;
+    case CSSValueTranslatey:
+        return WebKitCSSTransformValue::TranslateYTransformOperation;
+    case CSSValueTranslate:
+        return WebKitCSSTransformValue::TranslateTransformOperation;
+    case CSSValueTranslatez:
+        return WebKitCSSTransformValue::TranslateZTransformOperation;
+    case CSSValueMatrix:
+        return WebKitCSSTransformValue::MatrixTransformOperation;
+    case CSSValueMatrix3d:
+        return WebKitCSSTransformValue::Matrix3DTransformOperation;
+    case CSSValueScale3d:
+        return WebKitCSSTransformValue::Scale3DTransformOperation;
+    case CSSValueRotate3d:
+        return WebKitCSSTransformValue::Rotate3DTransformOperation;
+    case CSSValueTranslate3d:
+        return WebKitCSSTransformValue::Translate3DTransformOperation;
+    default:
+        return WebKitCSSTransformValue::UnknownTransformOperation;
+    }
+}
+
 static RefPtr<CSSValue> consumeTransformValue(CSSParserTokenRange& range, CSSParserMode cssParserMode)
 {
     CSSValueID functionId = range.peek().functionId();
@@ -1506,7 +1559,10 @@ static RefPtr<CSSValue> consumeTransformValue(CSSParserTokenRange& range, CSSPar
     CSSParserTokenRange args = consumeFunction(range);
     if (args.atEnd())
         return nullptr;
-    RefPtr<CSSFunctionValue> transformValue = CSSFunctionValue::create(functionId);
+    
+    // FIXME-NEWPARSER: Do we really need WebkitCSSTransformValue? A CSSFunctionValue is good
+    // enough and has the CSSValueID as the operation type. Blink has eliminated it.
+    RefPtr<WebKitCSSTransformValue> transformValue = WebKitCSSTransformValue::create(transformOperationForCSSValueID(functionId));
     RefPtr<CSSValue> parsedValue;
     switch (functionId) {
     case CSSValueRotate: