Title: [209006] trunk/Source/WebCore
Revision
209006
Author
hy...@apple.com
Date
2016-11-28 12:28:15 -0800 (Mon, 28 Nov 2016)

Log Message

[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.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (209005 => 209006)


--- trunk/Source/WebCore/ChangeLog	2016-11-28 20:27:39 UTC (rev 209005)
+++ trunk/Source/WebCore/ChangeLog	2016-11-28 20:28:15 UTC (rev 209006)
@@ -1,3 +1,20 @@
+2016-11-28  Dave Hyatt  <hy...@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  <bfulg...@apple.com>
 
         ImageData does not match specification

Modified: trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp (209005 => 209006)


--- trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp	2016-11-28 20:27:39 UTC (rev 209005)
+++ trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp	2016-11-28 20:28:15 UTC (rev 209006)
@@ -2620,6 +2620,9 @@
 
 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;

Modified: trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp (209005 => 209006)


--- trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp	2016-11-28 20:27:39 UTC (rev 209005)
+++ trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp	2016-11-28 20:28:15 UTC (rev 209006)
@@ -1182,14 +1182,33 @@
         || 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)
@@ -1196,7 +1215,7 @@
         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 @@
     }
     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)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to