[CSS Parser] Filters and Reflections Fixes
authorhyatt@apple.com <hyatt@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Nov 2016 20:28:15 +0000 (20:28 +0000)
committerhyatt@apple.com <hyatt@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Nov 2016 20:28:15 +0000 (20:28 +0000)
https://bugs.webkit.org/show_bug.cgi?id=165103

Reviewed by Zalan Bujtas.

* css/parser/CSSPropertyParser.cpp:
(WebCore::consumeReflect):
Support the "none" keyword for box-reflect.

* css/parser/CSSPropertyParserHelpers.cpp:
(WebCore::CSSPropertyParserHelpers::isValidPrimitiveFilterFunction):
(WebCore::CSSPropertyParserHelpers::consumeFilterFunction):
Don't rely on range checking, since invert isn't grouped with the other
function values. Actually check every keyword.

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

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

index 800b6b9..3765907 100644 (file)
@@ -1,3 +1,20 @@
+2016-11-28  Dave Hyatt  <hyatt@apple.com>
+
+        [CSS Parser] Filters and Reflections Fixes
+        https://bugs.webkit.org/show_bug.cgi?id=165103
+
+        Reviewed by Zalan Bujtas.
+
+        * css/parser/CSSPropertyParser.cpp:
+        (WebCore::consumeReflect):
+        Support the "none" keyword for box-reflect.
+
+        * css/parser/CSSPropertyParserHelpers.cpp:
+        (WebCore::CSSPropertyParserHelpers::isValidPrimitiveFilterFunction):
+        (WebCore::CSSPropertyParserHelpers::consumeFilterFunction):
+        Don't rely on range checking, since invert isn't grouped with the other
+        function values. Actually check every keyword.
+
 2016-11-28  Brent Fulgham  <bfulgham@apple.com>
 
         ImageData does not match specification
index 950f92e..e2b2081 100644 (file)
@@ -2620,6 +2620,9 @@ static RefPtr<CSSValue> consumeWebkitBorderImage(CSSPropertyID property, CSSPars
 
 static RefPtr<CSSValue> consumeReflect(CSSParserTokenRange& range, const CSSParserContext& context)
 {
+    if (range.peek().id() == CSSValueNone)
+        return consumeIdent(range);
+    
     RefPtr<CSSPrimitiveValue> direction = consumeIdent<CSSValueAbove, CSSValueBelow, CSSValueLeft, CSSValueRight>(range);
     if (!direction)
         return nullptr;
index cc9c86a..df58567 100644 (file)
@@ -1182,21 +1182,40 @@ static bool isGeneratedImage(CSSValueID id)
         || id == CSSValueWebkitGradient || id == CSSValueWebkitCrossFade || id == CSSValueWebkitCanvas
         || id == CSSValueCrossFade || id == CSSValueWebkitNamedImage || id == CSSValueWebkitFilter || id == CSSValueFilter;
 }
+    
+static bool isValidPrimitiveFilterFunction(CSSValueID filterFunction)
+{
+    switch (filterFunction) {
+    case CSSValueBlur:
+    case CSSValueBrightness:
+    case CSSValueContrast:
+    case CSSValueDropShadow:
+    case CSSValueGrayscale:
+    case CSSValueHueRotate:
+    case CSSValueInvert:
+    case CSSValueOpacity:
+    case CSSValueSaturate:
+    case CSSValueSepia:
+        return true;
+    default:
+        return false;
+    }
+}
 
 RefPtr<CSSFunctionValue> consumeFilterFunction(CSSParserTokenRange& range, const CSSParserContext& context)
 {
     CSSValueID filterType = range.peek().functionId();
-    if (filterType < CSSValueInvert || filterType > CSSValueDropShadow)
+    if (!isValidPrimitiveFilterFunction(filterType))
         return nullptr;
     CSSParserTokenRange args = consumeFunction(range);
-    auto filterValue = CSSFunctionValue::create(filterType);
+    RefPtr<CSSFunctionValue> filterValue = CSSFunctionValue::create(filterType);
     RefPtr<CSSValue> parsedValue;
 
     if (filterType == CSSValueDropShadow)
         parsedValue = consumeSingleShadow(args, context.mode, false, false);
     else {
         if (args.atEnd())
-            return filterValue.ptr();
+            return filterValue;
         if (filterType == CSSValueBrightness) {
             parsedValue = consumePercent(args, ValueRangeAll);
             if (!parsedValue)
@@ -1219,8 +1238,8 @@ RefPtr<CSSFunctionValue> consumeFilterFunction(CSSParserTokenRange& range, const
     }
     if (!parsedValue || !args.atEnd())
         return nullptr;
-    filterValue->append(*parsedValue);
-    return filterValue.ptr();
+    filterValue->append(parsedValue.releaseNonNull());
+    return filterValue;
 }
 
 RefPtr<CSSValue> consumeFilter(CSSParserTokenRange& range, const CSSParserContext& context)