Parse the array() function for custom filters
authormichelangelo@webkit.org <michelangelo@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Sep 2012 02:54:53 +0000 (02:54 +0000)
committermichelangelo@webkit.org <michelangelo@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Sep 2012 02:54:53 +0000 (02:54 +0000)
https://bugs.webkit.org/show_bug.cgi?id=94226

Reviewed by Dirk Schulze.

Source/WebCore:

The patch adds the support for the array() function parsing;
according to the specs this function - to be used within custom
filters - accepts number (float) values. This patch parses array()
arguments using comma as separator: the spec will be updated
accordingly shortly.

* GNUmakefile.list.am:
* Target.pri:
* WebCore.gypi:
* WebCore.vcproj/WebCore.vcproj:
* WebCore.xcodeproj/project.pbxproj:
* css/CSSParser.cpp:
(WebCore::CSSParser::parseCustomFilterArrayFunction): New method to
parse the content of array() function.
(WebCore):
(WebCore::CSSParser::parseCustomFilter): parseCustomFilterArrayFunction is
called whenever a "array(" function is encountered.
* css/CSSParser.h:
(WebCore):
* css/CSSValue.cpp:
(WebCore::CSSValue::reportMemoryUsage):
(WebCore::CSSValue::cssText):
(WebCore::CSSValue::destroy):
(WebCore::CSSValue::cloneForCSSOM):
* css/CSSValue.h:
(WebCore::CSSValue::isWebKitCSSArrayFunctionValue):
* css/WebKitCSSArrayFunctionValue.cpp: Added.
(WebCore):
(WebCore::WebKitCSSArrayFunctionValue::WebKitCSSArrayFunctionValue):
(WebCore::WebKitCSSArrayFunctionValue::customCssText):
(WebCore::WebKitCSSArrayFunctionValue::cloneForCSSOM):
(WebCore::WebKitCSSArrayFunctionValue::reportDescendantMemoryUsage):
* css/WebKitCSSArrayFunctionValue.h: Added.
(WebCore):
(WebKitCSSArrayFunctionValue):
(WebCore::WebKitCSSArrayFunctionValue::create):

LayoutTests:

New negative and positive test cases have been added for the array()
function parsing.

Also a new test case has been added to further test multiple 3d-transforms.

* css3/filters/custom/custom-filter-property-parsing-expected.txt:
* css3/filters/custom/custom-filter-property-parsing-invalid-expected.txt:
* css3/filters/script-tests/custom-filter-property-parsing-invalid.js:
* css3/filters/script-tests/custom-filter-property-parsing.js:
* platform/chromium/css3/filters/custom/custom-filter-property-parsing-expected.txt:

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

18 files changed:
LayoutTests/ChangeLog
LayoutTests/css3/filters/custom/custom-filter-property-parsing-expected.txt
LayoutTests/css3/filters/custom/custom-filter-property-parsing-invalid-expected.txt
LayoutTests/css3/filters/script-tests/custom-filter-property-parsing-invalid.js
LayoutTests/css3/filters/script-tests/custom-filter-property-parsing.js
LayoutTests/platform/chromium/css3/filters/custom/custom-filter-property-parsing-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/GNUmakefile.list.am
Source/WebCore/Target.pri
Source/WebCore/WebCore.gypi
Source/WebCore/WebCore.vcproj/WebCore.vcproj
Source/WebCore/WebCore.xcodeproj/project.pbxproj
Source/WebCore/css/CSSParser.cpp
Source/WebCore/css/CSSParser.h
Source/WebCore/css/CSSValue.cpp
Source/WebCore/css/CSSValue.h
Source/WebCore/css/WebKitCSSArrayFunctionValue.cpp [new file with mode: 0644]
Source/WebCore/css/WebKitCSSArrayFunctionValue.h [new file with mode: 0644]

index ddf6aee..863f031 100644 (file)
@@ -1,3 +1,21 @@
+2012-09-05  Michelangelo De Simone  <michelangelo@webkit.org>
+
+        Parse the array() function for custom filters
+        https://bugs.webkit.org/show_bug.cgi?id=94226
+
+        Reviewed by Dirk Schulze.
+
+        New negative and positive test cases have been added for the array()
+        function parsing.
+
+        Also a new test case has been added to further test multiple 3d-transforms.
+
+        * css3/filters/custom/custom-filter-property-parsing-expected.txt:
+        * css3/filters/custom/custom-filter-property-parsing-invalid-expected.txt:
+        * css3/filters/script-tests/custom-filter-property-parsing-invalid.js:
+        * css3/filters/script-tests/custom-filter-property-parsing.js:
+        * platform/chromium/css3/filters/custom/custom-filter-property-parsing-expected.txt:
+
 2012-09-05  Matt Falkenhagen  <falken@chromium.org>
 
         Vertically center non-anchored <dialog> elements
index f3bfaf1..7fa0096 100644 (file)
@@ -535,6 +535,72 @@ PASS jsWrapperClass(filterRule.constructor) is 'CSSValueListConstructor'
 PASS filterRule.length is 1
 PASS subRule.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
 PASS removeBaseURL(subRule.cssText) is 'custom(none url(fragment.shader), multipleTransform rotate(0deg) perspective(0) scale(0, 0) translate(0px, 0px))'
+
+Custom with two separate transforms : custom(none url(fragment.shader), firstTransform rotate(0deg), secondTransform rotate(0deg))
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS removeBaseURL(declaration.getPropertyValue('-webkit-filter')) is 'custom(none url(fragment.shader), firstTransform rotate(0deg), secondTransform rotate(0deg))'
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'CSSValueListConstructor'
+PASS filterRule.length is 1
+PASS subRule.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS removeBaseURL(subRule.cssText) is 'custom(none url(fragment.shader), firstTransform rotate(0deg), secondTransform rotate(0deg))'
+
+Custom with a single element array() : custom(none url(fragment.shader), t0 array(1))
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS removeBaseURL(declaration.getPropertyValue('-webkit-filter')) is 'custom(none url(fragment.shader), t0 array(1))'
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'CSSValueListConstructor'
+PASS filterRule.length is 1
+PASS subRule.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS removeBaseURL(subRule.cssText) is 'custom(none url(fragment.shader), t0 array(1))'
+
+Custom with a single negative element array() : custom(none url(fragment.shader), t1 array(-1.01))
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS removeBaseURL(declaration.getPropertyValue('-webkit-filter')) is 'custom(none url(fragment.shader), t1 array(-1.01))'
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'CSSValueListConstructor'
+PASS filterRule.length is 1
+PASS subRule.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS removeBaseURL(subRule.cssText) is 'custom(none url(fragment.shader), t1 array(-1.01))'
+
+Custom with multiple elements array() : custom(none url(fragment.shader), t2 array(1, 2, 3, 4, 5))
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS removeBaseURL(declaration.getPropertyValue('-webkit-filter')) is 'custom(none url(fragment.shader), t2 array(1, 2, 3, 4, 5))'
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'CSSValueListConstructor'
+PASS filterRule.length is 1
+PASS subRule.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS removeBaseURL(subRule.cssText) is 'custom(none url(fragment.shader), t2 array(1, 2, 3, 4, 5))'
+
+Custom with multiple signed float elements array() : custom(none url(fragment.shader), t3 array(1, -2.2, 3.14, 0.4, 5))
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS removeBaseURL(declaration.getPropertyValue('-webkit-filter')) is 'custom(none url(fragment.shader), t3 array(1, -2.2, 3.14, 0.4, 5))'
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'CSSValueListConstructor'
+PASS filterRule.length is 1
+PASS subRule.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS removeBaseURL(subRule.cssText) is 'custom(none url(fragment.shader), t3 array(1, -2.2, 3.14, 0.4, 5))'
+
+Multiple array() : custom(none url(fragment.shader), t4 array(1, -2.2, 3.14, 0.4, 5), t5 array(1, 2, 3))
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS removeBaseURL(declaration.getPropertyValue('-webkit-filter')) is 'custom(none url(fragment.shader), t4 array(1, -2.2, 3.14, 0.4, 5), t5 array(1, 2, 3))'
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+PASS jsWrapperClass(filterRule.__proto__) is 'CSSValueListPrototype'
+PASS jsWrapperClass(filterRule.constructor) is 'CSSValueListConstructor'
+PASS filterRule.length is 1
+PASS subRule.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS removeBaseURL(subRule.cssText) is 'custom(none url(fragment.shader), t4 array(1, -2.2, 3.14, 0.4, 5), t5 array(1, 2, 3))'
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 82743f1..42cf7c8 100644 (file)
@@ -288,6 +288,106 @@ Valid transform with invalid characters : custom(none url(shader),someId rotate(
 PASS cssRule.type is 1
 PASS declaration.length is 0
 PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Empty array() : custom(none url(shader), id array())
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+One comma in array() : custom(none url(shader), id array(,))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Multile commas in array() : custom(none url(shader), id array(,,,))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Multiple commas with a value in array() : custom(none url(shader), id array(,,1,))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+One comma followed by a negative value in array() : custom(none url(shader), id array(,-4))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+One comma followed by a value in array() : custom(none url(shader), id array(,4))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+One negative value followed by a comma in array() : custom(none url(shader), id array(-4,))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+One value followed by a comma in array() : custom(none url(shader), id array(4,))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+A series of correct values followed by a comma in array() : custom(none url(shader), id array(1, 2, 3, 4,))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+A series of correct values followed by a letter in array() : custom(none url(shader), id array(1, 2, 3, 4, x))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Two commas as separator between values in array() : custom(none url(shader), id array(1, 2, , 4))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Leading comma in array() : custom(none url(shader), id array(,1, 2, 3, 4))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Semicolon separated values in array() : custom(none url(shader), id array(1; 2; 3; 4))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Space separated values in array() : custom(none url(shader), id array(1 2 3 4))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Space separated values with comma terminator in array() : custom(none url(shader), id array(1 2 3 4,))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Space separated values with leading comma in array() : custom(none url(shader), id array(, 1 2 3 4))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Invalid unit value in array() : custom(none url(shader), id array(1px))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Invalid unit value in array(), second : custom(none url(shader), id array(none))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Invalid unit value in array(), third : custom(none url(shader), id array(1deg))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Invalid unit value in array(), at the end of a partially valid value list : custom(none url(shader), id array(1, 2, 3, 4px))
+PASS cssRule.type is 1
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 1f6a27c..9a5e87b 100644 (file)
@@ -90,3 +90,24 @@ testInvalidFilterRule("Empty transform (only the id)", "custom(none url(shader),
 testInvalidFilterRule("Empty transform (without the id)", "custom(none url(shader),)");
 testInvalidFilterRule("Empty transform (two empty commas)", "custom(none url(shader),,)");
 testInvalidFilterRule("Valid transform with invalid characters", "custom(none url(shader),someId rotate(0deg) *.-,)");
+
+testInvalidFilterRule("Empty array()", "custom(none url(shader), id array())");
+testInvalidFilterRule("One comma in array()", "custom(none url(shader), id array(,))");
+testInvalidFilterRule("Multile commas in array()", "custom(none url(shader), id array(,,,))");
+testInvalidFilterRule("Multiple commas with a value in array()", "custom(none url(shader), id array(,,1,))");
+testInvalidFilterRule("One comma followed by a negative value in array()", "custom(none url(shader), id array(,-4))");
+testInvalidFilterRule("One comma followed by a value in array()", "custom(none url(shader), id array(,4))");
+testInvalidFilterRule("One negative value followed by a comma in array()", "custom(none url(shader), id array(-4,))");
+testInvalidFilterRule("One value followed by a comma in array()", "custom(none url(shader), id array(4,))");
+testInvalidFilterRule("A series of correct values followed by a comma in array()", "custom(none url(shader), id array(1, 2, 3, 4,))");
+testInvalidFilterRule("A series of correct values followed by a letter in array()", "custom(none url(shader), id array(1, 2, 3, 4, x))");
+testInvalidFilterRule("Two commas as separator between values in array()", "custom(none url(shader), id array(1, 2, , 4))");
+testInvalidFilterRule("Leading comma in array()", "custom(none url(shader), id array(,1, 2, 3, 4))");
+testInvalidFilterRule("Semicolon separated values in array()", "custom(none url(shader), id array(1; 2; 3; 4))");
+testInvalidFilterRule("Space separated values in array()", "custom(none url(shader), id array(1 2 3 4))");
+testInvalidFilterRule("Space separated values with comma terminator in array()", "custom(none url(shader), id array(1 2 3 4,))");
+testInvalidFilterRule("Space separated values with leading comma in array()", "custom(none url(shader), id array(, 1 2 3 4))");
+testInvalidFilterRule("Invalid unit value in array()", "custom(none url(shader), id array(1px))");
+testInvalidFilterRule("Invalid unit value in array(), second", "custom(none url(shader), id array(none))");
+testInvalidFilterRule("Invalid unit value in array(), third", "custom(none url(shader), id array(1deg))");
+testInvalidFilterRule("Invalid unit value in array(), at the end of a partially valid value list", "custom(none url(shader), id array(1, 2, 3, 4px))");
index ffbe57d..da5e156 100644 (file)
@@ -163,3 +163,28 @@ testFilterRule("Custom with one transform",
 testFilterRule("Custom with multiple transforms",
             "custom(none url(fragment.shader), multipleTransform rotate(0deg) perspective(0) scale(0, 0) translate(0px, 0px))",
             "custom(none url(fragment.shader), multipleTransform rotate(0deg) perspective(0) scale(0, 0) translate(0px, 0px))");
+
+testFilterRule("Custom with two separate transforms",
+            "custom(none url(fragment.shader), firstTransform rotate(0deg), secondTransform rotate(0deg))",
+            "custom(none url(fragment.shader), firstTransform rotate(0deg), secondTransform rotate(0deg))");
+
+testFilterRule("Custom with a single element array()",
+            "custom(none url(fragment.shader), t0 array(1))",
+            "custom(none url(fragment.shader), t0 array(1))");
+
+
+testFilterRule("Custom with a single negative element array()",
+            "custom(none url(fragment.shader), t1 array(-1.01))",
+            "custom(none url(fragment.shader), t1 array(-1.01))");
+
+testFilterRule("Custom with multiple elements array()",
+            "custom(none url(fragment.shader), t2 array(1, 2, 3, 4, 5))",
+            "custom(none url(fragment.shader), t2 array(1, 2, 3, 4, 5))");
+
+testFilterRule("Custom with multiple signed float elements array()",
+            "custom(none url(fragment.shader), t3 array(1, -2.2, 3.14, 0.4, 5))",
+            "custom(none url(fragment.shader), t3 array(1, -2.2, 3.14, 0.4, 5))");
+
+testFilterRule("Multiple array()",
+            "custom(none url(fragment.shader), t4 array(1, -2.2, 3.14, 0.4, 5), t5 array(1, 2, 3))",
+            "custom(none url(fragment.shader), t4 array(1, -2.2, 3.14, 0.4, 5), t5 array(1, 2, 3))");
index 52267b7..185db4a 100644 (file)
@@ -535,6 +535,72 @@ FAIL jsWrapperClass(filterRule.constructor) should be CSSValueListConstructor. W
 PASS filterRule.length is 1
 PASS subRule.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
 PASS removeBaseURL(subRule.cssText) is 'custom(none url(fragment.shader), multipleTransform rotate(0deg) perspective(0) scale(0, 0) translate(0px, 0px))'
+
+Custom with two separate transforms : custom(none url(fragment.shader), firstTransform rotate(0deg), secondTransform rotate(0deg))
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS removeBaseURL(declaration.getPropertyValue('-webkit-filter')) is 'custom(none url(fragment.shader), firstTransform rotate(0deg), secondTransform rotate(0deg))'
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+FAIL jsWrapperClass(filterRule.__proto__) should be CSSValueListPrototype. Was Object.
+FAIL jsWrapperClass(filterRule.constructor) should be CSSValueListConstructor. Was Function.
+PASS filterRule.length is 1
+PASS subRule.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS removeBaseURL(subRule.cssText) is 'custom(none url(fragment.shader), firstTransform rotate(0deg), secondTransform rotate(0deg))'
+
+Custom with a single element array() : custom(none url(fragment.shader), t0 array(1))
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS removeBaseURL(declaration.getPropertyValue('-webkit-filter')) is 'custom(none url(fragment.shader), t0 array(1))'
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+FAIL jsWrapperClass(filterRule.__proto__) should be CSSValueListPrototype. Was Object.
+FAIL jsWrapperClass(filterRule.constructor) should be CSSValueListConstructor. Was Function.
+PASS filterRule.length is 1
+PASS subRule.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS removeBaseURL(subRule.cssText) is 'custom(none url(fragment.shader), t0 array(1))'
+
+Custom with a single negative element array() : custom(none url(fragment.shader), t1 array(-1.01))
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS removeBaseURL(declaration.getPropertyValue('-webkit-filter')) is 'custom(none url(fragment.shader), t1 array(-1.01))'
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+FAIL jsWrapperClass(filterRule.__proto__) should be CSSValueListPrototype. Was Object.
+FAIL jsWrapperClass(filterRule.constructor) should be CSSValueListConstructor. Was Function.
+PASS filterRule.length is 1
+PASS subRule.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS removeBaseURL(subRule.cssText) is 'custom(none url(fragment.shader), t1 array(-1.01))'
+
+Custom with multiple elements array() : custom(none url(fragment.shader), t2 array(1, 2, 3, 4, 5))
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS removeBaseURL(declaration.getPropertyValue('-webkit-filter')) is 'custom(none url(fragment.shader), t2 array(1, 2, 3, 4, 5))'
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+FAIL jsWrapperClass(filterRule.__proto__) should be CSSValueListPrototype. Was Object.
+FAIL jsWrapperClass(filterRule.constructor) should be CSSValueListConstructor. Was Function.
+PASS filterRule.length is 1
+PASS subRule.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS removeBaseURL(subRule.cssText) is 'custom(none url(fragment.shader), t2 array(1, 2, 3, 4, 5))'
+
+Custom with multiple signed float elements array() : custom(none url(fragment.shader), t3 array(1, -2.2, 3.14, 0.4, 5))
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS removeBaseURL(declaration.getPropertyValue('-webkit-filter')) is 'custom(none url(fragment.shader), t3 array(1, -2.2, 3.14, 0.4, 5))'
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+FAIL jsWrapperClass(filterRule.__proto__) should be CSSValueListPrototype. Was Object.
+FAIL jsWrapperClass(filterRule.constructor) should be CSSValueListConstructor. Was Function.
+PASS filterRule.length is 1
+PASS subRule.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS removeBaseURL(subRule.cssText) is 'custom(none url(fragment.shader), t3 array(1, -2.2, 3.14, 0.4, 5))'
+
+Multiple array() : custom(none url(fragment.shader), t4 array(1, -2.2, 3.14, 0.4, 5), t5 array(1, 2, 3))
+PASS cssRule.type is 1
+PASS declaration.length is 1
+PASS removeBaseURL(declaration.getPropertyValue('-webkit-filter')) is 'custom(none url(fragment.shader), t4 array(1, -2.2, 3.14, 0.4, 5), t5 array(1, 2, 3))'
+PASS jsWrapperClass(filterRule) is 'CSSValueList'
+FAIL jsWrapperClass(filterRule.__proto__) should be CSSValueListPrototype. Was Object.
+FAIL jsWrapperClass(filterRule.constructor) should be CSSValueListConstructor. Was Function.
+PASS filterRule.length is 1
+PASS subRule.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS removeBaseURL(subRule.cssText) is 'custom(none url(fragment.shader), t4 array(1, -2.2, 3.14, 0.4, 5), t5 array(1, 2, 3))'
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 1bd226a..4b19cc9 100644 (file)
@@ -1,3 +1,47 @@
+2012-09-05  Michelangelo De Simone  <michelangelo@webkit.org>
+
+        Parse the array() function for custom filters
+        https://bugs.webkit.org/show_bug.cgi?id=94226
+
+        Reviewed by Dirk Schulze.
+
+        The patch adds the support for the array() function parsing;
+        according to the specs this function - to be used within custom
+        filters - accepts number (float) values. This patch parses array()
+        arguments using comma as separator: the spec will be updated
+        accordingly shortly.
+
+        * GNUmakefile.list.am:
+        * Target.pri:
+        * WebCore.gypi:
+        * WebCore.vcproj/WebCore.vcproj:
+        * WebCore.xcodeproj/project.pbxproj:
+        * css/CSSParser.cpp:
+        (WebCore::CSSParser::parseCustomFilterArrayFunction): New method to
+        parse the content of array() function.
+        (WebCore):
+        (WebCore::CSSParser::parseCustomFilter): parseCustomFilterArrayFunction is
+        called whenever a "array(" function is encountered.
+        * css/CSSParser.h:
+        (WebCore):
+        * css/CSSValue.cpp:
+        (WebCore::CSSValue::reportMemoryUsage):
+        (WebCore::CSSValue::cssText):
+        (WebCore::CSSValue::destroy):
+        (WebCore::CSSValue::cloneForCSSOM):
+        * css/CSSValue.h:
+        (WebCore::CSSValue::isWebKitCSSArrayFunctionValue):
+        * css/WebKitCSSArrayFunctionValue.cpp: Added.
+        (WebCore):
+        (WebCore::WebKitCSSArrayFunctionValue::WebKitCSSArrayFunctionValue):
+        (WebCore::WebKitCSSArrayFunctionValue::customCssText):
+        (WebCore::WebKitCSSArrayFunctionValue::cloneForCSSOM):
+        (WebCore::WebKitCSSArrayFunctionValue::reportDescendantMemoryUsage):
+        * css/WebKitCSSArrayFunctionValue.h: Added.
+        (WebCore):
+        (WebKitCSSArrayFunctionValue):
+        (WebCore::WebKitCSSArrayFunctionValue::create):
+
 2012-09-05  Matt Falkenhagen  <falken@chromium.org>
 
         Vertically center non-anchored <dialog> elements
index 7774aca..0ef4da3 100644 (file)
@@ -2627,6 +2627,8 @@ webcore_sources += \
        Source/WebCore/css/SVGCSSComputedStyleDeclaration.cpp \
        Source/WebCore/css/SVGCSSParser.cpp \
        Source/WebCore/css/SVGCSSStyleSelector.cpp \
+    Source/WebCore/css/WebKitCSSArrayFunctionValue.cpp \
+    Source/WebCore/css/WebKitCSSArrayFunctionValue.h \
        Source/WebCore/css/WebKitCSSFilterValue.cpp \
        Source/WebCore/css/WebKitCSSFilterValue.h \
        Source/WebCore/css/WebKitCSSKeyframeRule.cpp \
index ebf1711..022fe97 100644 (file)
@@ -327,6 +327,7 @@ SOURCES += \
     css/StyleSheet.cpp \
     css/StyleSheetContents.cpp \
     css/StyleSheetList.cpp \
+    css/WebKitCSSArrayFunctionValue.cpp \
     css/WebKitCSSFilterValue.cpp \
     css/WebKitCSSKeyframeRule.cpp \
     css/WebKitCSSKeyframesRule.cpp \
@@ -1478,6 +1479,7 @@ HEADERS += \
     css/StyleSheet.h \
     css/StyleSheetContents.h \
     css/StyleSheetList.h \
+    css/WebKitCSSArrayFunctionValue.h \
     css/WebKitCSSFilterValue.h \
     css/WebKitCSSKeyframeRule.h \
     css/WebKitCSSKeyframesRule.h \
index 4b8358a..5714728 100644 (file)
             'css/StyleSheetContents.h',
             'css/StyleSheetList.cpp',
             'css/StyleSheetList.h',
+            'css/WebKitCSSArrayFunctionValue.cpp',
+            'css/WebKitCSSArrayFunctionValue.h',
             'css/WebKitCSSFilterValue.cpp',
             'css/WebKitCSSKeyframeRule.cpp',
             'css/WebKitCSSKeyframeRule.h',
index 98422be..98749e0 100755 (executable)
                                >
                        </File>
                        <File
+                               RelativePath="..\css\WebKitCSSArrayFunctionValue.cpp"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\css\WebKitCSSArrayFunctionValue.h"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\css\WebKitCSSFilterValue.cpp"
                                >
                        </File>
index e4288fe..e9ff0fe 100644 (file)
                14E8378E09F85D4F00B85AE4 /* JSEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 14E8378D09F85D4F00B85AE4 /* JSEvent.h */; };
                14FFE31D0AE1963300136BF5 /* HTMLFrameElementBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 14FFE31B0AE1963300136BF5 /* HTMLFrameElementBase.h */; settings = {ATTRIBUTES = (Private, ); }; };
                14FFE31E0AE1963300136BF5 /* HTMLFrameElementBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14FFE31C0AE1963300136BF5 /* HTMLFrameElementBase.cpp */; };
+               150B923915F08DC400E10986 /* WebKitCSSArrayFunctionValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 150B923715F08DC400E10986 /* WebKitCSSArrayFunctionValue.cpp */; };
+               150B923A15F08DC400E10986 /* WebKitCSSArrayFunctionValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 150B923815F08DC400E10986 /* WebKitCSSArrayFunctionValue.h */; };
                15C7708D100D3C6B005BA267 /* ValidityState.h in Headers */ = {isa = PBXBuildFile; fileRef = 15C7708A100D3C6A005BA267 /* ValidityState.h */; };
                15C7708E100D3C6B005BA267 /* ValidityState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 15C7708B100D3C6A005BA267 /* ValidityState.cpp */; };
                15C77093100D3CA8005BA267 /* JSValidityState.h in Headers */ = {isa = PBXBuildFile; fileRef = 15C77091100D3CA8005BA267 /* JSValidityState.h */; };
                14E8378D09F85D4F00B85AE4 /* JSEvent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JSEvent.h; sourceTree = "<group>"; };
                14FFE31B0AE1963300136BF5 /* HTMLFrameElementBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLFrameElementBase.h; sourceTree = "<group>"; };
                14FFE31C0AE1963300136BF5 /* HTMLFrameElementBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLFrameElementBase.cpp; sourceTree = "<group>"; };
+               150B923715F08DC400E10986 /* WebKitCSSArrayFunctionValue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebKitCSSArrayFunctionValue.cpp; sourceTree = "<group>"; };
+               150B923815F08DC400E10986 /* WebKitCSSArrayFunctionValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebKitCSSArrayFunctionValue.h; sourceTree = "<group>"; };
                15C77089100D3C6A005BA267 /* ValidityState.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ValidityState.idl; sourceTree = "<group>"; };
                15C7708A100D3C6A005BA267 /* ValidityState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ValidityState.h; sourceTree = "<group>"; };
                15C7708B100D3C6A005BA267 /* ValidityState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ValidityState.cpp; sourceTree = "<group>"; };
                                B2227B030D00BFF10071B782 /* SVGCSSStyleSelector.cpp */,
                                B2227B040D00BFF10071B782 /* SVGCSSValueKeywords.in */,
                                BC5EC1760A507E3E006007F5 /* view-source.css */,
+                               150B923715F08DC400E10986 /* WebKitCSSArrayFunctionValue.cpp */,
+                               150B923815F08DC400E10986 /* WebKitCSSArrayFunctionValue.h */,
                                3106036C14327D2E00ABF4BA /* WebKitCSSFilterValue.cpp */,
                                3106036D14327D2E00ABF4BA /* WebKitCSSFilterValue.h */,
                                3106036E14327D2E00ABF4BA /* WebKitCSSFilterValue.idl */,
                                31C0FF220E4CEB6E007D6FE5 /* WebKitAnimationEvent.h in Headers */,
                                319E69B613299BBD004AC91A /* WebKitAnimationList.h in Headers */,
                                976D6C7C122B8A3D001FD1F7 /* WebKitBlobBuilder.h in Headers */,
+                               150B923A15F08DC400E10986 /* WebKitCSSArrayFunctionValue.h in Headers */,
                                3106037014327D2E00ABF4BA /* WebKitCSSFilterValue.h in Headers */,
                                31288E730E3005D6003619AE /* WebKitCSSKeyframeRule.h in Headers */,
                                31288E750E3005D6003619AE /* WebKitCSSKeyframesRule.h in Headers */,
                                31C0FF210E4CEB6E007D6FE5 /* WebKitAnimationEvent.cpp in Sources */,
                                319E69B513299BBD004AC91A /* WebKitAnimationList.cpp in Sources */,
                                976D6C7B122B8A3D001FD1F7 /* WebKitBlobBuilder.cpp in Sources */,
+                               150B923915F08DC400E10986 /* WebKitCSSArrayFunctionValue.cpp in Sources */,
                                3106036F14327D2E00ABF4BA /* WebKitCSSFilterValue.cpp in Sources */,
                                31288E720E3005D6003619AE /* WebKitCSSKeyframeRule.cpp in Sources */,
                                31288E740E3005D6003619AE /* WebKitCSSKeyframesRule.cpp in Sources */,
index 7d96d65..e006aad 100644 (file)
 #endif
 
 #if ENABLE(CSS_SHADERS)
+#include "WebKitCSSArrayFunctionValue.h"
 #include "WebKitCSSMixFunctionValue.h"
 #include "WebKitCSSShaderValue.h"
 #endif
@@ -7503,6 +7504,41 @@ static bool acceptCommaOperator(CSSParserValueList* argsList)
     return true;
 }
 
+PassRefPtr<WebKitCSSArrayFunctionValue> CSSParser::parseCustomFilterArrayFunction(CSSParserValue* value)
+{
+    ASSERT(value->unit == CSSParserValue::Function && value->function);
+
+    if (!equalIgnoringCase(value->function->name, "array("))
+        return 0;
+
+    CSSParserValueList* arrayArgsParserValueList = value->function->args.get();
+    if (!arrayArgsParserValueList || !arrayArgsParserValueList->size())
+        return 0;
+
+    // array() values are comma separated.
+    RefPtr<WebKitCSSArrayFunctionValue> arrayFunction = WebKitCSSArrayFunctionValue::create();
+    while (true) {
+        // We parse pairs <Value, Comma> at each step.
+        CSSParserValue* currentParserValue = arrayArgsParserValueList->current();
+        if (!currentParserValue || !validUnit(currentParserValue, FNumber, CSSStrictMode))
+            return 0;
+
+        RefPtr<CSSValue> arrayValue = cssValuePool().createValue(currentParserValue->fValue, CSSPrimitiveValue::CSS_NUMBER);
+        arrayFunction->append(arrayValue.release());
+
+        CSSParserValue* nextParserValue = arrayArgsParserValueList->next();
+        if (!nextParserValue)
+            break;
+
+        if (!isComma(nextParserValue))
+            return 0;
+
+        arrayArgsParserValueList->next();
+    }
+
+    return arrayFunction;
+}
+
 PassRefPtr<WebKitCSSMixFunctionValue> CSSParser::parseMixFunction(CSSParserValue* value)
 {
     ASSERT(value->unit == CSSParserValue::Function && value->function);
@@ -7671,13 +7707,19 @@ PassRefPtr<WebKitCSSFilterValue> CSSParser::parseCustomFilter(CSSParserValue* va
 
         RefPtr<CSSValue> parameterValue;
 
-        if (arg->unit == CSSParserValue::Function && arg->function)
+        if (arg->unit == CSSParserValue::Function && arg->function) {
             // TODO: Implement other parameters types parsing.
             // textures: https://bugs.webkit.org/show_bug.cgi?id=71442
             // mat2, mat3, mat4: https://bugs.webkit.org/show_bug.cgi?id=71444
-            // array: https://bugs.webkit.org/show_bug.cgi?id=94226
             // 3d-transform shall be the last to be checked
-            parameterValue = parseCustomFilterTransform(argsList);
+            if (equalIgnoringCase(arg->function->name, "array(")) {
+                parameterValue = parseCustomFilterArrayFunction(arg);
+                // This parsing step only consumes function arguments,
+                // argsList is therefore moved forward explicitely.
+                argsList->next();
+            } else
+                parameterValue = parseCustomFilterTransform(argsList);
+        }
         else {
             RefPtr<CSSValueList> paramValueList = CSSValueList::createSpaceSeparated();
             while ((arg = argsList->current())) {
index 5ec3265..e33090f 100644 (file)
@@ -66,6 +66,7 @@ class StyleSheetContents;
 class StyledElement;
 
 #if ENABLE(CSS_SHADERS)
+class WebKitCSSArrayFunctionValue;
 class WebKitCSSMixFunctionValue;
 #endif
 
@@ -221,6 +222,7 @@ public:
     PassRefPtr<CSSValueList> parseFilter();
     PassRefPtr<WebKitCSSFilterValue> parseBuiltinFilterArguments(CSSParserValueList*, WebKitCSSFilterValue::FilterOperationType);
 #if ENABLE(CSS_SHADERS)
+    PassRefPtr<WebKitCSSArrayFunctionValue> parseCustomFilterArrayFunction(CSSParserValue*);
     PassRefPtr<WebKitCSSMixFunctionValue> parseMixFunction(CSSParserValue*);
     PassRefPtr<WebKitCSSFilterValue> parseCustomFilter(CSSParserValue*);
     PassRefPtr<CSSValueList> parseCustomFilterTransform(CSSParserValueList*);
index 042e102..16768a7 100644 (file)
@@ -56,6 +56,7 @@
 #include "ShadowValue.h"
 #include "SVGColor.h"
 #include "SVGPaint.h"
+#include "WebKitCSSArrayFunctionValue.h"
 #include "WebKitCSSFilterValue.h"
 #include "WebKitCSSMixFunctionValue.h"
 #include "WebKitCSSShaderValue.h"
@@ -229,6 +230,9 @@ void CSSValue::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
         static_cast<const CSSCalcValue*>(this)->reportDescendantMemoryUsage(memoryObjectInfo);
         return;
 #if ENABLE(CSS_FILTERS) && ENABLE(CSS_SHADERS)
+    case WebKitCSSArrayFunctionValueClass:
+        static_cast<const WebKitCSSArrayFunctionValue*>(this)->reportDescendantMemoryUsage(memoryObjectInfo);
+        return;
     case WebKitCSSMixFunctionValueClass:
         static_cast<const WebKitCSSMixFunctionValue*>(this)->reportDescendantMemoryUsage(memoryObjectInfo);
         return;
@@ -339,6 +343,8 @@ String CSSValue::cssText() const
     case WebKitCSSFilterClass:
         return static_cast<const WebKitCSSFilterValue*>(this)->customCssText();
 #if ENABLE(CSS_SHADERS)
+    case WebKitCSSArrayFunctionValueClass:
+        return static_cast<const WebKitCSSArrayFunctionValue*>(this)->customCssText();
     case WebKitCSSMixFunctionValueClass:
         return static_cast<const WebKitCSSMixFunctionValue*>(this)->customCssText();
     case WebKitCSSShaderClass:
@@ -473,6 +479,9 @@ void CSSValue::destroy()
         delete static_cast<WebKitCSSFilterValue*>(this);
         return;
 #if ENABLE(CSS_SHADERS)
+    case WebKitCSSArrayFunctionValueClass:
+        delete static_cast<WebKitCSSArrayFunctionValue*>(this);
+        return;
     case WebKitCSSMixFunctionValueClass:
         delete static_cast<WebKitCSSMixFunctionValue*>(this);
         return;
@@ -515,6 +524,8 @@ PassRefPtr<CSSValue> CSSValue::cloneForCSSOM() const
     case WebKitCSSFilterClass:
         return static_cast<const WebKitCSSFilterValue*>(this)->cloneForCSSOM();
 #if ENABLE(CSS_SHADERS)
+    case WebKitCSSArrayFunctionValueClass:
+        return static_cast<const WebKitCSSArrayFunctionValue*>(this)->cloneForCSSOM();
     case WebKitCSSMixFunctionValueClass:
         return static_cast<const WebKitCSSMixFunctionValue*>(this)->cloneForCSSOM();
 #endif
index 1f36513..25a0095 100644 (file)
@@ -95,6 +95,7 @@ public:
 #if ENABLE(CSS_FILTERS)
     bool isWebKitCSSFilterValue() const { return m_classType == WebKitCSSFilterClass; }
 #if ENABLE(CSS_SHADERS)
+    bool isWebKitCSSArrayFunctionValue() const { return m_classType == WebKitCSSArrayFunctionValueClass; }
     bool isWebKitCSSMixFunctionValue() const { return m_classType == WebKitCSSMixFunctionValueClass; }
     bool isWebKitCSSShaderValue() const { return m_classType == WebKitCSSShaderClass; }
 #endif
@@ -183,6 +184,7 @@ protected:
 #if ENABLE(CSS_FILTERS)
         WebKitCSSFilterClass,
 #if ENABLE(CSS_SHADERS)
+        WebKitCSSArrayFunctionValueClass,
         WebKitCSSMixFunctionValueClass,
 #endif
 #endif
diff --git a/Source/WebCore/css/WebKitCSSArrayFunctionValue.cpp b/Source/WebCore/css/WebKitCSSArrayFunctionValue.cpp
new file mode 100644 (file)
index 0000000..a2cb981
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials
+ *    provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WebKitCSSArrayFunctionValue.h"
+
+#include "MemoryInstrumentation.h"
+
+#if ENABLE(CSS_SHADERS)
+
+namespace WebCore {
+
+WebKitCSSArrayFunctionValue::WebKitCSSArrayFunctionValue()
+    : CSSValueList(WebKitCSSArrayFunctionValueClass, CommaSeparator)
+{
+}
+
+WebKitCSSArrayFunctionValue::WebKitCSSArrayFunctionValue(const WebKitCSSArrayFunctionValue& cloneFrom)
+    : CSSValueList(cloneFrom)
+{
+}
+
+String WebKitCSSArrayFunctionValue::customCssText() const
+{
+    return "array(" + CSSValueList::customCssText() + ')';
+}
+
+PassRefPtr<WebKitCSSArrayFunctionValue> WebKitCSSArrayFunctionValue::cloneForCSSOM() const
+{
+    return adoptRef(new WebKitCSSArrayFunctionValue(*this));
+}
+
+void WebKitCSSArrayFunctionValue::reportDescendantMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
+{
+    MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CSS);
+    CSSValueList::reportDescendantMemoryUsage(memoryObjectInfo);
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(CSS_SHADERS)
diff --git a/Source/WebCore/css/WebKitCSSArrayFunctionValue.h b/Source/WebCore/css/WebKitCSSArrayFunctionValue.h
new file mode 100644 (file)
index 0000000..baf2782
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials
+ *    provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef WebKitCSSArrayFunctionValue_h
+#define WebKitCSSArrayFunctionValue_h
+
+#if ENABLE(CSS_SHADERS)
+
+#include "CSSValueList.h"
+#include <wtf/PassRefPtr.h>
+
+namespace WebCore {
+
+class WebKitCSSArrayFunctionValue : public CSSValueList {
+public:
+    static PassRefPtr<WebKitCSSArrayFunctionValue> create()
+    {
+        return adoptRef(new WebKitCSSArrayFunctionValue());
+    }
+
+    String customCssText() const;
+
+    PassRefPtr<WebKitCSSArrayFunctionValue> cloneForCSSOM() const;
+
+    void reportDescendantMemoryUsage(MemoryObjectInfo*) const;
+
+private:
+    WebKitCSSArrayFunctionValue();
+    WebKitCSSArrayFunctionValue(const WebKitCSSArrayFunctionValue& cloneFrom);
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(CSS_SHADERS)
+
+#endif