brightness() filter should default to 1, and not allow negative values
authorsimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 25 Apr 2018 23:24:47 +0000 (23:24 +0000)
committersimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 25 Apr 2018 23:24:47 +0000 (23:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=184937

Reviewed by Dean Jackson.
Source/WebCore:

Remove the special-casing for brightness() in consumeFilterFunction(), so it now
follows the same logic as the other color-related filters in not allowing negative
values.

Removed the special-casing for brightness() in createFilterOperations() so its default
value is now 1.

Modified existing tests.

* css/StyleResolver.cpp:
(WebCore::StyleResolver::createFilterOperations):
* css/parser/CSSPropertyParserHelpers.cpp:
(WebCore::CSSPropertyParserHelpers::allowsValuesGreaterThanOne):
(WebCore::CSSPropertyParserHelpers::consumeFilterFunction):

LayoutTests:

Added negative value tests to filter-property-parsing.html and backdropfilter-property-parsing.html,
and made these tests more similar.

Fixed expected computed value for brightness() to be brightness(1) in the tests.

The effect-brightness* test results failed because elements with invalid brightness values now
no longer create a RenderLayer.

* css3/color-filters/color-filter-parsing-expected.txt:
* css3/color-filters/color-filter-parsing.html:
* css3/filters/backdrop/backdropfilter-property-computed-style-expected.txt:
* css3/filters/backdrop/backdropfilter-property-computed-style.html:
* css3/filters/backdrop/backdropfilter-property-parsing-expected.txt:
* css3/filters/backdrop/backdropfilter-property-parsing.html:
* css3/filters/effect-brightness-expected.txt:
* css3/filters/filter-property-computed-style-expected.txt:
* css3/filters/filter-property-computed-style.html:
* css3/filters/filter-property-parsing-expected.txt:
* css3/filters/filter-property-parsing.html:
* css3/filters/unprefixed-expected.txt:
* css3/filters/unprefixed.html:
* fast/filter-image/parse-filter-image-expected.txt:
* fast/filter-image/parse-filter-image.html:
* platform/mac/css3/filters/effect-brightness-clamping-expected.txt:

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

22 files changed:
LayoutTests/ChangeLog
LayoutTests/css3/color-filters/color-filter-parsing-expected.txt
LayoutTests/css3/color-filters/color-filter-parsing.html
LayoutTests/css3/filters/backdrop/backdropfilter-property-computed-style-expected.txt
LayoutTests/css3/filters/backdrop/backdropfilter-property-computed-style.html
LayoutTests/css3/filters/backdrop/backdropfilter-property-parsing-expected.txt
LayoutTests/css3/filters/backdrop/backdropfilter-property-parsing.html
LayoutTests/css3/filters/effect-brightness-expected.txt
LayoutTests/css3/filters/filter-property-computed-style-expected.txt
LayoutTests/css3/filters/filter-property-computed-style.html
LayoutTests/css3/filters/filter-property-parsing-expected.txt
LayoutTests/css3/filters/filter-property-parsing.html
LayoutTests/css3/filters/unprefixed-expected.txt
LayoutTests/css3/filters/unprefixed.html
LayoutTests/fast/filter-image/parse-filter-image-expected.txt
LayoutTests/fast/filter-image/parse-filter-image.html
LayoutTests/platform/ios/css3/filters/effect-brightness-clamping-expected.txt
LayoutTests/platform/ios/css3/filters/effect-brightness-expected.txt
LayoutTests/platform/mac/css3/filters/effect-brightness-clamping-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/css/StyleResolver.cpp
Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp

index cd96f02..c30df38 100644 (file)
@@ -1,3 +1,35 @@
+2018-04-25  Simon Fraser  <simon.fraser@apple.com>
+
+        brightness() filter should default to 1, and not allow negative values
+        https://bugs.webkit.org/show_bug.cgi?id=184937
+
+        Reviewed by Dean Jackson.
+        
+        Added negative value tests to filter-property-parsing.html and backdropfilter-property-parsing.html,
+        and made these tests more similar.
+        
+        Fixed expected computed value for brightness() to be brightness(1) in the tests.
+        
+        The effect-brightness* test results failed because elements with invalid brightness values now
+        no longer create a RenderLayer.
+
+        * css3/color-filters/color-filter-parsing-expected.txt:
+        * css3/color-filters/color-filter-parsing.html:
+        * css3/filters/backdrop/backdropfilter-property-computed-style-expected.txt:
+        * css3/filters/backdrop/backdropfilter-property-computed-style.html:
+        * css3/filters/backdrop/backdropfilter-property-parsing-expected.txt:
+        * css3/filters/backdrop/backdropfilter-property-parsing.html:
+        * css3/filters/effect-brightness-expected.txt:
+        * css3/filters/filter-property-computed-style-expected.txt:
+        * css3/filters/filter-property-computed-style.html:
+        * css3/filters/filter-property-parsing-expected.txt:
+        * css3/filters/filter-property-parsing.html:
+        * css3/filters/unprefixed-expected.txt:
+        * css3/filters/unprefixed.html:
+        * fast/filter-image/parse-filter-image-expected.txt:
+        * fast/filter-image/parse-filter-image.html:
+        * platform/mac/css3/filters/effect-brightness-clamping-expected.txt:
+
 2018-04-25  Carlos Alberto Lopez Perez  <clopez@igalia.com>
 
         [WPE][Debug] Test gardening of EME related tests.
index 28f6810..ceb397e 100644 (file)
@@ -3,7 +3,7 @@ PASS Parse none
 PASS Parse auto 
 PASS Parsing garbage value returns none 
 PASS Parsing garbage function returns none 
-FAIL Parse brightness() assert_equals: expected "brightness(1)" but got "brightness(0)"
+PASS Parse brightness() 
 PASS Parse contrast() 
 PASS Parse grayscale() 
 PASS Parse hue-rotate() 
@@ -15,7 +15,7 @@ PASS drop-shadow() is not allowed in color-filter
 PASS blur() is not allowed in color-filter 
 PASS Canonicalize grayscale() argument 
 PASS Canonicalize hue-rotate() argument 
-FAIL Negative value for brightness() is invalid assert_equals: expected "none" but got "brightness(-0.4)"
+PASS Negative value for brightness() is invalid 
 PASS Negative value for contrast() is invalid 
 PASS Negative value for grayscale() is invalid 
 PASS Negative value allowed for hue-rotate() 
index 2672a11..526d510 100644 (file)
@@ -25,7 +25,7 @@ testColorFilterParsing("garbage", "none", "Parsing garbage value returns none");
 testColorFilterParsing("garbage()", "none", "Parsing garbage function returns none");
 
 // Argument-free funtions.
-testColorFilterParsing("brightness()", "brightness(1)", "Parse brightness()"); // webkit.org/b/184937
+testColorFilterParsing("brightness()", "brightness(1)", "Parse brightness()");
 testColorFilterParsing("contrast()", "contrast(1)", "Parse contrast()");
 testColorFilterParsing("grayscale()", "grayscale(1)", "Parse grayscale()");
 testColorFilterParsing("hue-rotate()", "hue-rotate(0deg)", "Parse hue-rotate()");
@@ -43,7 +43,7 @@ testColorFilterParsing("grayscale(30%)", "grayscale(0.3)", "Canonicalize graysca
 testColorFilterParsing("hue-rotate(1.2rad)", "hue-rotate(68.75493541569878deg)", "Canonicalize hue-rotate() argument");
 
 // Negative values.
-testColorFilterParsing("brightness(-0.4)", "none", "Negative value for brightness() is invalid"); // webkit.org/b/184937
+testColorFilterParsing("brightness(-0.4)", "none", "Negative value for brightness() is invalid");
 testColorFilterParsing("contrast(-0.6)", "none", "Negative value for contrast() is invalid");
 testColorFilterParsing("grayscale(-0.)", "none", "Negative value for grayscale() is invalid");
 testColorFilterParsing("hue-rotate(-20deg)", "hue-rotate(-20deg)", "Negative value allowed for hue-rotate()");
index 7775f48..5e025b6 100644 (file)
@@ -194,7 +194,7 @@ PASS subRule.cssText is "brightness(0)"
 
 No values : brightness()
 PASS filterStyle.length is 1
-PASS subRule.cssText is "brightness(0)"
+PASS subRule.cssText is "brightness(1)"
 
 Multiple values : brightness(0.5) brightness(0.25)
 PASS filterStyle.length is 2
index 470f429..b121508 100644 (file)
@@ -209,7 +209,7 @@ testComputedFilterRule("Zero value",
 
 testComputedFilterRule("No values",
                       "brightness()", 1,
-                      ["brightness(0)"]);
+                      ["brightness(1)"]);
 
 testComputedFilterRule("Multiple values",
                       "brightness(0.5) brightness(0.25)", 2,
index 677e789..378efe0 100644 (file)
@@ -76,6 +76,26 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "grayscale(1)"
 
+Values over 1 are clamped : grayscale(1.5)
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is "grayscale(1)"
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'Function'
+PASS filterRule.length is 1
+PASS subRule.cssText is "grayscale(1)"
+
+Percentages over 100 are clamped : grayscale(320%)
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is "grayscale(100%)"
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'Function'
+PASS filterRule.length is 1
+PASS subRule.cssText is "grayscale(100%)"
+
 Zero value : grayscale(0)
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -137,6 +157,31 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "sepia(1)"
 
+Values over 1 are clamped : sepia(8)
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is "sepia(1)"
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'Function'
+PASS filterRule.length is 1
+PASS subRule.cssText is "sepia(1)"
+
+Percentages over 100 are clamped : sepia(101%)
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is "sepia(100%)"
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'Function'
+PASS filterRule.length is 1
+PASS subRule.cssText is "sepia(100%)"
+
+Negative value : sepia(-0.5)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is ''
+
 Zero value : sepia(0)
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -157,6 +202,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "sepia()"
 
+Negative value : grayscale(-0.2)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is ''
+
 Multiple values : sepia(0.5) sepia(0.25)
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -229,6 +279,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "saturate(5.5)"
 
+Negative value : saturate(-0.5)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is ''
+
 Zero value : saturate(0)
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -321,6 +376,16 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "hue-rotate(0.5turn)"
 
+Negative value : hue-rotate(-370.2deg)
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is "hue-rotate(-370.2deg)"
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'Function'
+PASS filterRule.length is 1
+PASS subRule.cssText is "hue-rotate(-370.2deg)"
+
 Zero value : hue-rotate(0)
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -382,6 +447,26 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "invert(1)"
 
+Values over 1 are clamped : invert(1.01)
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is "invert(1)"
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'Function'
+PASS filterRule.length is 1
+PASS subRule.cssText is "invert(1)"
+
+Percentages over 100 are clamped : invert(500000%)
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is "invert(100%)"
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'Function'
+PASS filterRule.length is 1
+PASS subRule.cssText is "invert(100%)"
+
 Zero value : invert(0)
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -392,6 +477,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "invert(0)"
 
+Negative value : invert(-0.5)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is ''
+
 No values : invert()
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -454,6 +544,31 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "opacity(1)"
 
+Values over 1 are clamped : opacity(2134687326)
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is "opacity(1)"
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'Function'
+PASS filterRule.length is 1
+PASS subRule.cssText is "opacity(1)"
+
+Percentages over 100 are clamped : opacity(500%)
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is "opacity(100%)"
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'Function'
+PASS filterRule.length is 1
+PASS subRule.cssText is "opacity(100%)"
+
+Negative value : opacity(-0.5)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is ''
+
 Zero value : opacity(0)
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -536,6 +651,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "brightness(0)"
 
+Negative value : brightness(-2)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is ''
+
 No values : brightness()
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -568,15 +688,15 @@ PASS filterRule.length is 2
 PASS subRule.cssText is "brightness(0.5)"
 PASS subRule.cssText is "grayscale(0.25)"
 
-Parameter less than -100% : brightness(-1.1)
+Value less than -100% : brightness(-1.1)
 PASS cssRule.type is 1
-PASS declaration.length is 1
-PASS declaration.getPropertyValue('-webkit-backdrop-filter') is "brightness(-1.1)"
-PASS jsWrapperClass(filterRule) is 'CSSValueList'
-PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
-PASS jsWrapperClass(filterRule.constructor) is 'Function'
-PASS filterRule.length is 1
-PASS subRule.cssText is "brightness(-1.1)"
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is ''
+
+Negative value : brightness(-0.6)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is ''
 
 Parameter more than 100% : brightness(101%)
 PASS cssRule.type is 1
@@ -649,6 +769,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "contrast(0)"
 
+Negative value : contrast(-0.2)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is ''
+
 No values : contrast()
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -669,6 +794,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "contrast(2)"
 
+Negative value : contrast(-0.8)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is ''
+
 Multiple values : contrast(0.5) contrast(0.25)
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -732,6 +862,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "blur()"
 
+Negative value : blur(-2px)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-backdrop-filter') is ''
+
 Color then three values : drop-shadow(red 1px 2px 3px)
 PASS cssRule.type is 1
 PASS declaration.length is 1
index 94daf03..2c82698 100644 (file)
@@ -59,6 +59,25 @@ function testFilterRule(description, rule, expectedLength, expectedValue, expect
             shouldBe("subRule.cssText", `"${expectedTexts[i]}"`);
         }
     }
+    
+    stylesheet.deleteRule(0);
+}
+
+function testInvalidFilterRule(description, rule)
+{
+    debug("");
+    debug(`${description} : ${rule}`);
+
+    stylesheet.insertRule("body { -webkit-backdrop-filter: " + rule + "; }", 0);
+    cssRule = stylesheet.cssRules.item(0);
+
+    shouldBe("cssRule.type", "1");
+
+    declaration = cssRule.style;
+    shouldBe("declaration.length", "0");
+    shouldBe("declaration.getPropertyValue('-webkit-backdrop-filter')", "''");
+
+    stylesheet.deleteRule(0);
 }
 
 testFilterRule("Basic reference",
@@ -89,6 +108,14 @@ testFilterRule("Float value converts to integer",
                "grayscale(1.0)", 1, "grayscale(1)",
                ["grayscale(1)"]);
 
+testFilterRule("Values over 1 are clamped",
+               "grayscale(1.5)", 1, "grayscale(1)",
+               ["grayscale(1)"]);
+
+testFilterRule("Percentages over 100 are clamped",
+               "grayscale(320%)", 1, "grayscale(100%)",
+               ["grayscale(100%)"]);
+
 testFilterRule("Zero value",
                "grayscale(0)", 1, "grayscale(0)",
                ["grayscale(0)"]);
@@ -113,6 +140,16 @@ testFilterRule("Float value converts to integer",
                "sepia(1.0)", 1, "sepia(1)",
                ["sepia(1)"]);
 
+testFilterRule("Values over 1 are clamped",
+               "sepia(8)", 1, "sepia(1)",
+               ["sepia(1)"]);
+
+testFilterRule("Percentages over 100 are clamped",
+               "sepia(101%)", 1, "sepia(100%)",
+               ["sepia(100%)"]);
+
+testInvalidFilterRule("Negative value", "sepia(-0.5)");
+
 testFilterRule("Zero value",
                "sepia(0)", 1, "sepia(0)",
                ["sepia(0)"]);
@@ -121,6 +158,8 @@ testFilterRule("No values",
                "sepia()", 1, "sepia()",
                ["sepia()"]);
 
+testInvalidFilterRule("Negative value", "grayscale(-0.2)");
+
 testFilterRule("Multiple values",
                "sepia(0.5) sepia(0.25)", 2, "sepia(0.5) sepia(0.25)",
                ["sepia(0.5)", "sepia(0.25)"]);
@@ -149,6 +188,8 @@ testFilterRule("Input value > 1",
                "saturate(5.5)", 1, "saturate(5.5)",
                ["saturate(5.5)"]);
 
+testInvalidFilterRule("Negative value", "saturate(-0.5)");
+
 testFilterRule("Zero value",
                "saturate(0)", 1, "saturate(0)",
                ["saturate(0)"]);
@@ -185,6 +226,10 @@ testFilterRule("Turns value",
                "hue-rotate(0.5turn)", 1, "hue-rotate(0.5turn)",
                ["hue-rotate(0.5turn)"]);
 
+testFilterRule("Negative value",
+              "hue-rotate(-370.2deg)", 1, "hue-rotate(-370.2deg)",
+              ["hue-rotate(-370.2deg)"]);
+
 testFilterRule("Zero value",
                "hue-rotate(0)", 1, "hue-rotate(0deg)",
                ["hue-rotate(0deg)"]);
@@ -209,10 +254,20 @@ testFilterRule("Float value converts to integer",
                "invert(1.0)", 1, "invert(1)",
                ["invert(1)"]);
 
+testFilterRule("Values over 1 are clamped",
+               "invert(1.01)", 1, "invert(1)",
+               ["invert(1)"]);
+
+testFilterRule("Percentages over 100 are clamped",
+               "invert(500000%)", 1, "invert(100%)",
+               ["invert(100%)"]);
+
 testFilterRule("Zero value",
                "invert(0)", 1, "invert(0)",
                ["invert(0)"]);
 
+testInvalidFilterRule("Negative value", "invert(-0.5)");
+
 testFilterRule("No values",
                "invert()", 1, "invert()",
                ["invert()"]);
@@ -237,6 +292,16 @@ testFilterRule("Float value converts to integer",
                "opacity(1.0)", 1, "opacity(1)",
                ["opacity(1)"]);
 
+testFilterRule("Values over 1 are clamped",
+               "opacity(2134687326)", 1, "opacity(1)",
+               ["opacity(1)"]);
+
+testFilterRule("Percentages over 100 are clamped",
+               "opacity(500%)", 1, "opacity(100%)",
+               ["opacity(100%)"]);
+
+testInvalidFilterRule("Negative value", "opacity(-0.5)");
+
 testFilterRule("Zero value",
                "opacity(0)", 1, "opacity(0)",
                ["opacity(0)"]);
@@ -269,6 +334,8 @@ testFilterRule("Zero value",
               "brightness(0)", 1, "brightness(0)",
               ["brightness(0)"]);
 
+testInvalidFilterRule("Negative value", "brightness(-2)");
+
 testFilterRule("No values",
               "brightness()", 1, "brightness()",
               ["brightness()"]);
@@ -281,9 +348,8 @@ testFilterRule("Rule combinations",
               "brightness(0.5) grayscale(0.25)", 2, "brightness(0.5) grayscale(0.25)",
               ["brightness(0.5)", "grayscale(0.25)"]);
 
-testFilterRule("Parameter less than -100%",
-              "brightness(-1.1)", 1, "brightness(-1.1)",
-              ["brightness(-1.1)"]);
+testInvalidFilterRule("Value less than -100%", "brightness(-1.1)");
+testInvalidFilterRule("Negative value", "brightness(-0.6)");
 
 testFilterRule("Parameter more than 100%",
               "brightness(101%)", 1, "brightness(101%)",
@@ -313,6 +379,8 @@ testFilterRule("Zero value",
               "contrast(0)", 1, "contrast(0)",
               ["contrast(0)"]);
 
+testInvalidFilterRule("Negative value", "contrast(-0.2)");
+
 testFilterRule("No values",
               "contrast()", 1, "contrast()",
               ["contrast()"]);
@@ -321,6 +389,8 @@ testFilterRule("Value greater than one",
               "contrast(2)", 1, "contrast(2)",
               ["contrast(2)"]);
 
+testInvalidFilterRule("Negative value", "contrast(-0.8)");
+
 testFilterRule("Multiple values",
               "contrast(0.5) contrast(0.25)", 2, "contrast(0.5) contrast(0.25)",
               ["contrast(0.5)", "contrast(0.25)"]);
@@ -345,6 +415,8 @@ testFilterRule("No values",
                "blur()", 1, "blur()",
                ["blur()"]);
 
+testInvalidFilterRule("Negative value", "blur(-2px)");
+
 testFilterRule("Color then three values",
               "drop-shadow(red 1px 2px 3px)", 1, "drop-shadow(red 1px 2px 3px)",
               ["drop-shadow(red 1px 2px 3px)"]);
index 94a1869..798f330 100644 (file)
@@ -3,10 +3,13 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
+      RenderImage {IMG} at (0,0) size 160x90
       RenderText {#text} at (160,76) size 4x18
         text run at (160,76) width 4: " "
+      RenderImage {IMG} at (164,0) size 160x90
       RenderText {#text} at (324,76) size 4x18
         text run at (324,76) width 4: " "
+      RenderImage {IMG} at (328,0) size 160x90
       RenderText {#text} at (488,76) size 4x18
         text run at (488,76) width 4: " "
       RenderText {#text} at (652,76) size 4x18
@@ -16,12 +19,6 @@ layer at (0,0) size 800x600
       RenderText {#text} at (324,170) size 4x18
         text run at (324,170) width 4: " "
       RenderText {#text} at (0,0) size 0x0
-layer at (8,8) size 160x90
-  RenderImage {IMG} at (0,0) size 160x90
-layer at (172,8) size 160x90
-  RenderImage {IMG} at (164,0) size 160x90
-layer at (336,8) size 160x90
-  RenderImage {IMG} at (328,0) size 160x90
 layer at (500,8) size 160x90
   RenderImage {IMG} at (492,0) size 160x90
 layer at (8,102) size 160x90
index 58ff806..eb41ff9 100644 (file)
@@ -194,7 +194,7 @@ PASS subRule.cssText is "brightness(0)"
 
 No values : brightness()
 PASS filterStyle.length is 1
-PASS subRule.cssText is "brightness(0)"
+PASS subRule.cssText is "brightness(1)"
 
 Multiple values : brightness(0.5) brightness(0.25)
 PASS filterStyle.length is 2
index 8e87da3..6482001 100644 (file)
@@ -209,7 +209,7 @@ testComputedFilterRule("Zero value",
 
 testComputedFilterRule("No values",
                       "brightness()", 1,
-                      ["brightness(0)"]);
+                      ["brightness(1)"]);
 
 testComputedFilterRule("Multiple values",
                       "brightness(0.5) brightness(0.25)", 2,
index 9ca9c5c..24a8d1c 100644 (file)
@@ -177,6 +177,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "sepia(100%)"
 
+Negative value : sepia(-0.5)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('filter') is ''
+
 Zero value : sepia(0)
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -197,6 +202,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "sepia()"
 
+Negative value : grayscale(-0.2)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('filter') is ''
+
 Multiple values : sepia(0.5) sepia(0.25)
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -269,6 +279,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "saturate(5.5)"
 
+Negative value : saturate(-0.5)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('filter') is ''
+
 Zero value : saturate(0)
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -361,6 +376,16 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "hue-rotate(0.5turn)"
 
+Negative value : hue-rotate(-370.2deg)
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS declaration.getPropertyValue('filter') is "hue-rotate(-370.2deg)"
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'Function'
+PASS filterRule.length is 1
+PASS subRule.cssText is "hue-rotate(-370.2deg)"
+
 Zero value : hue-rotate(0)
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -452,6 +477,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "invert(0)"
 
+Negative value : invert(-0.5)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('filter') is ''
+
 No values : invert()
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -534,6 +564,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "opacity(100%)"
 
+Negative value : opacity(-0.5)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('filter') is ''
+
 Zero value : opacity(0)
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -616,6 +651,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "brightness(0)"
 
+Negative value : brightness(-2)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('filter') is ''
+
 No values : brightness()
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -648,15 +688,15 @@ PASS filterRule.length is 2
 PASS subRule.cssText is "brightness(0.5)"
 PASS subRule.cssText is "grayscale(0.25)"
 
-Parameter less than -100% : brightness(-1.1)
+Value less than -100% : brightness(-1.1)
 PASS cssRule.type is 1
-PASS declaration.length is 1
-PASS declaration.getPropertyValue('filter') is "brightness(-1.1)"
-PASS jsWrapperClass(filterRule) is 'CSSValueList'
-PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
-PASS jsWrapperClass(filterRule.constructor) is 'Function'
-PASS filterRule.length is 1
-PASS subRule.cssText is "brightness(-1.1)"
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('filter') is ''
+
+Negative value : brightness(-0.6)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('filter') is ''
 
 Parameter more than 100% : brightness(101%)
 PASS cssRule.type is 1
@@ -729,6 +769,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "contrast(0)"
 
+Negative value : contrast(-0.2)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('filter') is ''
+
 No values : contrast()
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -749,6 +794,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "contrast(2)"
 
+Negative value : contrast(-0.8)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('filter') is ''
+
 Multiple values : contrast(0.5) contrast(0.25)
 PASS cssRule.type is 1
 PASS declaration.length is 1
@@ -812,6 +862,11 @@ PASS jsWrapperClass(filterRule.constructor) is 'Function'
 PASS filterRule.length is 1
 PASS subRule.cssText is "blur()"
 
+Negative value : blur(-2px)
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('filter') is ''
+
 Color then three values : drop-shadow(red 1px 2px 3px)
 PASS cssRule.type is 1
 PASS declaration.length is 1
index 70280d3..8eb5a1f 100644 (file)
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<!DOCTYPE>
 <html>
 <head>
 <script src="../../resources/js-test-pre.js"></script>
@@ -59,6 +59,24 @@ function testFilterRule(description, rule, expectedLength, expectedValue, expect
             shouldBe("subRule.cssText", `"${expectedTexts[i]}"`);
         }
     }
+    
+    stylesheet.deleteRule(0);
+}
+
+function testInvalidFilterRule(description, rule)
+{
+    debug("");
+    debug(`${description} : ${rule}`);
+
+    stylesheet.insertRule(`body { filter: ${rule}; }`, 0);
+    cssRule = stylesheet.cssRules.item(0);
+
+    shouldBe("cssRule.type", "1");
+
+    declaration = cssRule.style;
+    shouldBe("declaration.length", "0");
+    shouldBe("declaration.getPropertyValue('filter')", "''");
+
     stylesheet.deleteRule(0);
 }
 
@@ -130,6 +148,8 @@ testFilterRule("Percentages over 100 are clamped",
                "sepia(101%)", 1, "sepia(100%)",
                ["sepia(100%)"]);
 
+testInvalidFilterRule("Negative value", "sepia(-0.5)");
+
 testFilterRule("Zero value",
                "sepia(0)", 1, "sepia(0)",
                ["sepia(0)"]);
@@ -138,6 +158,8 @@ testFilterRule("No values",
                "sepia()", 1, "sepia()",
                ["sepia()"]);
 
+testInvalidFilterRule("Negative value", "grayscale(-0.2)");
+
 testFilterRule("Multiple values",
                "sepia(0.5) sepia(0.25)", 2, "sepia(0.5) sepia(0.25)",
                ["sepia(0.5)", "sepia(0.25)"]);
@@ -166,6 +188,8 @@ testFilterRule("Input value > 1",
                "saturate(5.5)", 1, "saturate(5.5)",
                ["saturate(5.5)"]);
 
+testInvalidFilterRule("Negative value", "saturate(-0.5)");
+
 testFilterRule("Zero value",
                "saturate(0)", 1, "saturate(0)",
                ["saturate(0)"]);
@@ -202,9 +226,13 @@ testFilterRule("Turns value",
                "hue-rotate(0.5turn)", 1, "hue-rotate(0.5turn)",
                ["hue-rotate(0.5turn)"]);
 
+testFilterRule("Negative value",
+              "hue-rotate(-370.2deg)", 1, "hue-rotate(-370.2deg)",
+              ["hue-rotate(-370.2deg)"]);
+
 testFilterRule("Zero value",
                "hue-rotate(0)", 1, "hue-rotate(0deg)",
-              ["hue-rotate(0deg)"]);
+               ["hue-rotate(0deg)"]);
 
 testFilterRule("No values",
                "hue-rotate()", 1, "hue-rotate()",
@@ -238,6 +266,8 @@ testFilterRule("Zero value",
                "invert(0)", 1, "invert(0)",
                ["invert(0)"]);
 
+testInvalidFilterRule("Negative value", "invert(-0.5)");
+
 testFilterRule("No values",
                "invert()", 1, "invert()",
                ["invert()"]);
@@ -270,6 +300,8 @@ testFilterRule("Percentages over 100 are clamped",
                "opacity(500%)", 1, "opacity(100%)",
                ["opacity(100%)"]);
 
+testInvalidFilterRule("Negative value", "opacity(-0.5)");
+
 testFilterRule("Zero value",
                "opacity(0)", 1, "opacity(0)",
                ["opacity(0)"]);
@@ -302,6 +334,8 @@ testFilterRule("Zero value",
               "brightness(0)", 1, "brightness(0)",
               ["brightness(0)"]);
 
+testInvalidFilterRule("Negative value", "brightness(-2)");
+
 testFilterRule("No values",
               "brightness()", 1, "brightness()",
               ["brightness()"]);
@@ -314,9 +348,8 @@ testFilterRule("Rule combinations",
               "brightness(0.5) grayscale(0.25)", 2, "brightness(0.5) grayscale(0.25)",
               ["brightness(0.5)", "grayscale(0.25)"]);
 
-testFilterRule("Parameter less than -100%",
-              "brightness(-1.1)", 1, "brightness(-1.1)",
-              ["brightness(-1.1)"]);
+testInvalidFilterRule("Value less than -100%", "brightness(-1.1)");
+testInvalidFilterRule("Negative value", "brightness(-0.6)");
 
 testFilterRule("Parameter more than 100%",
               "brightness(101%)", 1, "brightness(101%)",
@@ -346,6 +379,8 @@ testFilterRule("Zero value",
               "contrast(0)", 1, "contrast(0)",
               ["contrast(0)"]);
 
+testInvalidFilterRule("Negative value", "contrast(-0.2)");
+
 testFilterRule("No values",
               "contrast()", 1, "contrast()",
               ["contrast()"]);
@@ -354,6 +389,8 @@ testFilterRule("Value greater than one",
               "contrast(2)", 1, "contrast(2)",
               ["contrast(2)"]);
 
+testInvalidFilterRule("Negative value", "contrast(-0.8)");
+
 testFilterRule("Multiple values",
               "contrast(0.5) contrast(0.25)", 2, "contrast(0.5) contrast(0.25)",
               ["contrast(0.5)", "contrast(0.25)"]);
@@ -378,6 +415,8 @@ testFilterRule("No values",
                "blur()", 1, "blur()",
                ["blur()"]);
 
+testInvalidFilterRule("Negative value", "blur(-2px)");
+
 testFilterRule("Color then three values",
               "drop-shadow(red 1px 2px 3px)", 1, "drop-shadow(red 1px 2px 3px)",
               ["drop-shadow(red 1px 2px 3px)"]);
index 40a9a9a..8cb6561 100644 (file)
@@ -194,7 +194,7 @@ PASS subRule.cssText is "brightness(0)"
 
 No values : brightness()
 PASS filterStyle.length is 1
-PASS subRule.cssText is "brightness(0)"
+PASS subRule.cssText is "brightness(1)"
 
 Multiple values : brightness(0.5) brightness(0.25)
 PASS filterStyle.length is 2
index 987f9eb..287b073 100644 (file)
@@ -209,7 +209,7 @@ testComputedFilterRule("Zero value",
 
 testComputedFilterRule("No values",
                       "brightness()", 1,
-                      ["brightness(0)"]);
+                      ["brightness(1)"]);
 
 testComputedFilterRule("Multiple values",
                       "brightness(0.5) brightness(0.25)", 2,
index 9927ca9..f529078 100644 (file)
@@ -52,7 +52,7 @@ PASS innerStyle("background-image", "filter(none, brightness(1.0))") is "filter(
 PASS innerStyle("background-image", "filter(none, brightness(0))") is "filter(none, brightness(0))"
 PASS innerStyle("background-image", "filter(none, brightness(0.5) brightness(0.25))") is "filter(none, brightness(0.5) brightness(0.25))"
 PASS innerStyle("background-image", "filter(none, brightness(0.5) grayscale(0.25))") is "filter(none, brightness(0.5) grayscale(0.25))"
-PASS innerStyle("background-image", "filter(none, brightness(-1.1))") is "filter(none, brightness(-1.1))"
+PASS innerStyle("background-image", "filter(none, brightness(-1.1))") is ""
 PASS innerStyle("background-image", "filter(none, brightness(101%))") is "filter(none, brightness(101%))"
 PASS innerStyle("background-image", "filter(none, grayscale(0.25) brightness(0.5))") is "filter(none, grayscale(0.25) brightness(0.5))"
 PASS innerStyle("background-image", "filter(none, contrast(1))") is "filter(none, contrast(1))"
index ad9faa8..eab5317 100644 (file)
@@ -240,7 +240,7 @@ testInner(
 testInner(
     "background-image",
     "filter(none, brightness(-1.1))",
-    "filter(none, brightness(-1.1))");
+    "");
 testInner(
     "background-image",
     "filter(none, brightness(101%))",
index 37e485b..9e434bb 100644 (file)
@@ -3,20 +3,28 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
+      RenderImage {IMG} at (0,0) size 160x90
       RenderText {#text} at (160,75) size 4x19
         text run at (160,75) width 4: " "
+      RenderImage {IMG} at (164,0) size 160x90
       RenderText {#text} at (324,75) size 4x19
         text run at (324,75) width 4: " "
+      RenderImage {IMG} at (328,0) size 160x90
       RenderText {#text} at (488,75) size 4x19
         text run at (488,75) width 4: " "
+      RenderImage {IMG} at (492,0) size 160x90
       RenderText {#text} at (652,75) size 4x19
         text run at (652,75) width 4: " "
+      RenderImage {IMG} at (0,95) size 160x90
       RenderText {#text} at (160,170) size 4x19
         text run at (160,170) width 4: " "
+      RenderImage {IMG} at (164,95) size 160x90
       RenderText {#text} at (324,170) size 4x19
         text run at (324,170) width 4: " "
+      RenderImage {IMG} at (328,95) size 160x90
       RenderText {#text} at (488,170) size 4x19
         text run at (488,170) width 4: " "
+      RenderImage {IMG} at (492,95) size 160x90
       RenderText {#text} at (652,170) size 4x19
         text run at (652,170) width 4: " "
       RenderText {#text} at (160,265) size 4x19
@@ -26,22 +34,6 @@ layer at (0,0) size 800x600
       RenderText {#text} at (488,265) size 4x19
         text run at (488,265) width 4: " "
       RenderText {#text} at (0,0) size 0x0
-layer at (8,8) size 160x90
-  RenderImage {IMG} at (0,0) size 160x90
-layer at (172,8) size 160x90
-  RenderImage {IMG} at (164,0) size 160x90
-layer at (336,8) size 160x90
-  RenderImage {IMG} at (328,0) size 160x90
-layer at (500,8) size 160x90
-  RenderImage {IMG} at (492,0) size 160x90
-layer at (8,103) size 160x90
-  RenderImage {IMG} at (0,95) size 160x90
-layer at (172,103) size 160x90
-  RenderImage {IMG} at (164,95) size 160x90
-layer at (336,103) size 160x90
-  RenderImage {IMG} at (328,95) size 160x90
-layer at (500,103) size 160x90
-  RenderImage {IMG} at (492,95) size 160x90
 layer at (8,198) size 160x90
   RenderImage {IMG} at (0,190) size 160x90
 layer at (172,198) size 160x90
index 9060a20..55764a6 100644 (file)
@@ -3,10 +3,13 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
+      RenderImage {IMG} at (0,0) size 160x90
       RenderText {#text} at (160,75) size 4x19
         text run at (160,75) width 4: " "
+      RenderImage {IMG} at (164,0) size 160x90
       RenderText {#text} at (324,75) size 4x19
         text run at (324,75) width 4: " "
+      RenderImage {IMG} at (328,0) size 160x90
       RenderText {#text} at (488,75) size 4x19
         text run at (488,75) width 4: " "
       RenderText {#text} at (652,75) size 4x19
@@ -16,12 +19,6 @@ layer at (0,0) size 800x600
       RenderText {#text} at (324,170) size 4x19
         text run at (324,170) width 4: " "
       RenderText {#text} at (0,0) size 0x0
-layer at (8,8) size 160x90
-  RenderImage {IMG} at (0,0) size 160x90
-layer at (172,8) size 160x90
-  RenderImage {IMG} at (164,0) size 160x90
-layer at (336,8) size 160x90
-  RenderImage {IMG} at (328,0) size 160x90
 layer at (500,8) size 160x90
   RenderImage {IMG} at (492,0) size 160x90
 layer at (8,103) size 160x90
index 523aee6..77db28c 100644 (file)
@@ -3,20 +3,28 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
+      RenderImage {IMG} at (0,0) size 160x90
       RenderText {#text} at (160,76) size 4x18
         text run at (160,76) width 4: " "
+      RenderImage {IMG} at (164,0) size 160x90
       RenderText {#text} at (324,76) size 4x18
         text run at (324,76) width 4: " "
+      RenderImage {IMG} at (328,0) size 160x90
       RenderText {#text} at (488,76) size 4x18
         text run at (488,76) width 4: " "
+      RenderImage {IMG} at (492,0) size 160x90
       RenderText {#text} at (652,76) size 4x18
         text run at (652,76) width 4: " "
+      RenderImage {IMG} at (0,94) size 160x90
       RenderText {#text} at (160,170) size 4x18
         text run at (160,170) width 4: " "
+      RenderImage {IMG} at (164,94) size 160x90
       RenderText {#text} at (324,170) size 4x18
         text run at (324,170) width 4: " "
+      RenderImage {IMG} at (328,94) size 160x90
       RenderText {#text} at (488,170) size 4x18
         text run at (488,170) width 4: " "
+      RenderImage {IMG} at (492,94) size 160x90
       RenderText {#text} at (652,170) size 4x18
         text run at (652,170) width 4: " "
       RenderText {#text} at (160,264) size 4x18
@@ -26,22 +34,6 @@ layer at (0,0) size 800x600
       RenderText {#text} at (488,264) size 4x18
         text run at (488,264) width 4: " "
       RenderText {#text} at (0,0) size 0x0
-layer at (8,8) size 160x90
-  RenderImage {IMG} at (0,0) size 160x90
-layer at (172,8) size 160x90
-  RenderImage {IMG} at (164,0) size 160x90
-layer at (336,8) size 160x90
-  RenderImage {IMG} at (328,0) size 160x90
-layer at (500,8) size 160x90
-  RenderImage {IMG} at (492,0) size 160x90
-layer at (8,102) size 160x90
-  RenderImage {IMG} at (0,94) size 160x90
-layer at (172,102) size 160x90
-  RenderImage {IMG} at (164,94) size 160x90
-layer at (336,102) size 160x90
-  RenderImage {IMG} at (328,94) size 160x90
-layer at (500,102) size 160x90
-  RenderImage {IMG} at (492,94) size 160x90
 layer at (8,196) size 160x90
   RenderImage {IMG} at (0,188) size 160x90
 layer at (172,196) size 160x90
index f0c4b07..5ccacf3 100644 (file)
@@ -1,3 +1,25 @@
+2018-04-25  Simon Fraser  <simon.fraser@apple.com>
+
+        brightness() filter should default to 1, and not allow negative values
+        https://bugs.webkit.org/show_bug.cgi?id=184937
+
+        Reviewed by Dean Jackson.
+
+        Remove the special-casing for brightness() in consumeFilterFunction(), so it now
+        follows the same logic as the other color-related filters in not allowing negative
+        values.
+
+        Removed the special-casing for brightness() in createFilterOperations() so its default
+        value is now 1.
+
+        Modified existing tests.
+
+        * css/StyleResolver.cpp:
+        (WebCore::StyleResolver::createFilterOperations):
+        * css/parser/CSSPropertyParserHelpers.cpp:
+        (WebCore::CSSPropertyParserHelpers::allowsValuesGreaterThanOne):
+        (WebCore::CSSPropertyParserHelpers::consumeFilterFunction):
+
 2018-04-25  Wenson Hsieh  <wenson_hsieh@apple.com>
 
         Missing closing parenthesis when determining INSTALL_PATH build setting in WebCore.xcconfig
index 1318d65..6bab457 100644 (file)
@@ -1981,7 +1981,7 @@ bool StyleResolver::createFilterOperations(const CSSValue& inValue, FilterOperat
         case FilterOperation::BRIGHTNESS:
         case FilterOperation::CONTRAST:
         case FilterOperation::OPACITY: {
-            double amount = (operationType == FilterOperation::BRIGHTNESS) ? 0 : 1;
+            double amount = 1;
             if (filterValue.length() == 1) {
                 amount = firstValue->doubleValue();
                 if (firstValue->isPercentage())
index 217172b..87f58e8 100644 (file)
@@ -1421,6 +1421,18 @@ static bool isColorFilterFunction(CSSValueID filterFunction)
     }
 }
 
+static bool allowsValuesGreaterThanOne(CSSValueID filterFunction)
+{
+    switch (filterFunction) {
+    case CSSValueBrightness:
+    case CSSValueContrast:
+    case CSSValueSaturate:
+        return true;
+    default:
+        return false;
+    }
+}
+
 static RefPtr<CSSFunctionValue> consumeFilterFunction(CSSParserTokenRange& range, const CSSParserContext& context, AllowedFilterFunctions allowedFunctions)
 {
     CSSValueID filterType = range.peek().functionId();
@@ -1439,11 +1451,8 @@ static RefPtr<CSSFunctionValue> consumeFilterFunction(CSSParserTokenRange& range
     else {
         if (args.atEnd())
             return filterValue;
-        if (filterType == CSSValueBrightness) {
-            parsedValue = consumePercent(args, ValueRangeAll);
-            if (!parsedValue)
-                parsedValue = consumeNumber(args, ValueRangeAll);
-        } else if (filterType == CSSValueHueRotate)
+
+        if (filterType == CSSValueHueRotate)
             parsedValue = consumeAngle(args, context.mode, UnitlessQuirk::Forbid);
         else if (filterType == CSSValueBlur)
             parsedValue = consumeLength(args, HTMLStandardMode, ValueRangeNonNegative);
@@ -1451,7 +1460,7 @@ static RefPtr<CSSFunctionValue> consumeFilterFunction(CSSParserTokenRange& range
             parsedValue = consumePercent(args, ValueRangeNonNegative);
             if (!parsedValue)
                 parsedValue = consumeNumber(args, ValueRangeNonNegative);
-            if (parsedValue && filterType != CSSValueSaturate && filterType != CSSValueContrast) {
+            if (parsedValue && !allowsValuesGreaterThanOne(filterType)) {
                 bool isPercentage = downcast<CSSPrimitiveValue>(*parsedValue).isPercentage();
                 double maxAllowed = isPercentage ? 100.0 : 1.0;
                 if (downcast<CSSPrimitiveValue>(*parsedValue).doubleValue() > maxAllowed)