[Part 4] Parse the custom() function in -webkit-filter: parse the matN() functions
authorkrit@webkit.org <krit@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 22 Apr 2013 04:39:07 +0000 (04:39 +0000)
committerkrit@webkit.org <krit@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 22 Apr 2013 04:39:07 +0000 (04:39 +0000)
https://bugs.webkit.org/show_bug.cgi?id=71444

Reviewed by Dean Jackson.

Source/WebCore:

Custom filter parameters should support mat2 to mat4 value functions. Added parsing
and style resolving bits to support the matrix function values. A later patch will
add the matrices to the shader program.

https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html#custom-filter-parameters

Modified existing tests to cover changes.

* GNUmakefile.list.am: Added WebKitCSSMatFunctionValue to individual build systems.
* Target.pri:
* WebCore.vcproj/WebCore.vcproj:
* WebCore.vcxproj/WebCore.vcxproj:
* WebCore.vcxproj/WebCore.vcxproj.filters:
* WebCore.xcodeproj/project.pbxproj:
* css/CSSComputedStyleDeclaration.cpp:
(WebCore::valueForCustomFilterMatParameter):
(WebCore):
(WebCore::valueForCustomFilterParameter):
* css/CSSParser.cpp:
(WebCore::CSSParser::parseTransform):
(WebCore::CSSParser::parseMatValue):
(WebCore):
(WebCore::CSSParser::parseCustomFilterParameters):
* css/CSSParser.h:
(WebCore):
* css/CSSValue.cpp:
(WebCore::CSSValue::reportMemoryUsage):
(WebCore::CSSValue::equals):
(WebCore::CSSValue::cssText):
(WebCore::CSSValue::destroy):
(WebCore::CSSValue::cloneForCSSOM):
* css/CSSValue.h:
(WebCore::CSSValue::isWebKitCSSMatFunctionValue):
* css/StyleResolver.cpp:
(WebCore::StyleResolver::parseCustomFilterArrayParameter):
(WebCore::StyleResolver::parseCustomFilterParameter):
* css/StyleResolver.h:
(StyleResolver):
* css/WebKitCSSMatFunctionValue.cpp:
(WebCore::WebKitCSSMatFunctionValue::WebKitCSSMatFunctionValue):
(WebCore::WebKitCSSMatFunctionValue::customCssText):
(WebCore::WebKitCSSMatFunctionValue::cloneForCSSOM):
(WebCore::WebKitCSSMatFunctionValue::equals):
(WebCore::WebKitCSSMatFunctionValue::reportDescendantMemoryUsage):
* css/WebKitCSSMatFunctionValue.h:
(WebKitCSSMatFunctionValue):
(WebCore::WebKitCSSMatFunctionValue::create):
* platform/graphics/filters/CustomFilterArrayParameter.h:
(WebCore::CustomFilterArrayParameter::create):
(WebCore::CustomFilterArrayParameter::CustomFilterArrayParameter):
* platform/graphics/filters/CustomFilterParameter.h:
(CustomFilterParameter):
* platform/graphics/filters/CustomFilterRenderer.cpp:
(WebCore::CustomFilterRenderer::bindProgramParameters):

LayoutTests:

Added tests for mat2 to mat4 parameter functions on custom fiter function and
parameter descriptor.

* css3/filters/custom-with-at-rule-syntax/parsing-custom-function-invalid-expected.txt:
* css3/filters/custom-with-at-rule-syntax/parsing-custom-function-valid-expected.txt:
* css3/filters/custom-with-at-rule-syntax/parsing-parameters-property-invalid-expected.txt:
* css3/filters/custom-with-at-rule-syntax/parsing-parameters-property-valid-expected.txt:
* css3/filters/custom-with-at-rule-syntax/script-tests/parsing-custom-function-invalid.js:
* css3/filters/custom-with-at-rule-syntax/script-tests/parsing-custom-function-valid.js:
* css3/filters/custom-with-at-rule-syntax/script-tests/parsing-parameters-property-invalid.js:
* css3/filters/custom-with-at-rule-syntax/script-tests/parsing-parameters-property-valid.js:

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

28 files changed:
LayoutTests/ChangeLog
LayoutTests/css3/filters/custom-with-at-rule-syntax/parsing-custom-function-invalid-expected.txt
LayoutTests/css3/filters/custom-with-at-rule-syntax/parsing-custom-function-valid-expected.txt
LayoutTests/css3/filters/custom-with-at-rule-syntax/parsing-parameters-property-invalid-expected.txt
LayoutTests/css3/filters/custom-with-at-rule-syntax/parsing-parameters-property-valid-expected.txt
LayoutTests/css3/filters/custom-with-at-rule-syntax/script-tests/parsing-custom-function-invalid.js
LayoutTests/css3/filters/custom-with-at-rule-syntax/script-tests/parsing-custom-function-valid.js
LayoutTests/css3/filters/custom-with-at-rule-syntax/script-tests/parsing-parameters-property-invalid.js
LayoutTests/css3/filters/custom-with-at-rule-syntax/script-tests/parsing-parameters-property-valid.js
Source/WebCore/ChangeLog
Source/WebCore/GNUmakefile.list.am
Source/WebCore/Target.pri
Source/WebCore/WebCore.vcproj/WebCore.vcproj
Source/WebCore/WebCore.vcxproj/WebCore.vcxproj
Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters
Source/WebCore/WebCore.xcodeproj/project.pbxproj
Source/WebCore/css/CSSComputedStyleDeclaration.cpp
Source/WebCore/css/CSSParser.cpp
Source/WebCore/css/CSSParser.h
Source/WebCore/css/CSSValue.cpp
Source/WebCore/css/CSSValue.h
Source/WebCore/css/StyleResolver.cpp
Source/WebCore/css/StyleResolver.h
Source/WebCore/css/WebKitCSSMatFunctionValue.cpp [new file with mode: 0644]
Source/WebCore/css/WebKitCSSMatFunctionValue.h [new file with mode: 0644]
Source/WebCore/platform/graphics/filters/CustomFilterArrayParameter.h
Source/WebCore/platform/graphics/filters/CustomFilterParameter.h
Source/WebCore/platform/graphics/filters/CustomFilterRenderer.cpp

index ce5bb9c..a539108 100644 (file)
@@ -1,3 +1,22 @@
+2013-04-21  Dirk Schulze  <krit@webkit.org>
+
+        [Part 4] Parse the custom() function in -webkit-filter: parse the matN() functions
+        https://bugs.webkit.org/show_bug.cgi?id=71444
+
+        Reviewed by Dean Jackson.
+
+        Added tests for mat2 to mat4 parameter functions on custom fiter function and
+        parameter descriptor.
+
+        * css3/filters/custom-with-at-rule-syntax/parsing-custom-function-invalid-expected.txt:
+        * css3/filters/custom-with-at-rule-syntax/parsing-custom-function-valid-expected.txt:
+        * css3/filters/custom-with-at-rule-syntax/parsing-parameters-property-invalid-expected.txt:
+        * css3/filters/custom-with-at-rule-syntax/parsing-parameters-property-valid-expected.txt:
+        * css3/filters/custom-with-at-rule-syntax/script-tests/parsing-custom-function-invalid.js:
+        * css3/filters/custom-with-at-rule-syntax/script-tests/parsing-custom-function-valid.js:
+        * css3/filters/custom-with-at-rule-syntax/script-tests/parsing-parameters-property-invalid.js:
+        * css3/filters/custom-with-at-rule-syntax/script-tests/parsing-parameters-property-valid.js:
+
 2013-04-21  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
 
         Unreviewed, EFL gardening. Remove test cases which are expected failed, but passed now.
index 2e1b93a..848a9ff 100644 (file)
@@ -341,6 +341,234 @@ PASS declaration.length is 0
 PASS declaration.getPropertyValue('-webkit-filter') is null
 
 ========================================
+Mat2 parameter tests.
+========================================
+
+Empty mat2.
+custom(my-filter, a mat2())
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Too view arguments.
+custom(my-filter, a mat2(0, 0, 0))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+No arguments but commas.
+custom(my-filter, a mat2(,,,))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Ending commas.
+custom(my-filter, a mat2(0, 0,,))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Idents in mat2 function.
+custom(my-filter, a mat2(0, 0, a, b))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Too many arguments.
+custom(my-filter, a mat2(0, 0, 0, 0, 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+No commas.
+custom(my-filter, a mat2(1 0 0 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Some commas.
+custom(my-filter, a mat2(1, 0, 0 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Leading commas.
+custom(my-filter, a mat2(, 0, 0, 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+No length units.
+custom(my-filter, a mat2(1px, 0px, 0px, 1px))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+No degree units.
+custom(my-filter, a mat2(1deg, 0deg, 0deg, 1deg))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+NaN in mat2.
+custom(my-filter, a mat2(1, 0, 0, NaN))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+========================================
+Mat3 parameter tests.
+========================================
+
+Empty mat3.
+custom(my-filter, a mat3())
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Too view arguments.
+custom(my-filter, a mat3(0, 0, 0, 0))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+No arguments but commas.
+custom(my-filter, a mat3(,,,,,,,,,,,,,,,))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Ending commas.
+custom(my-filter, a mat3(1, 0, 0, 0, 1, 0, 0,,))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Idents in mat3 function.
+custom(my-filter, a mat3(1, 0, 0, 0, 1, 0, 0, a, b))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Too many arguments.
+custom(my-filter, a mat3(1, 0, 0, 0, 1, 0, 0, 0, 1, 0))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+No commas.
+custom(my-filter, a mat3(1 0 0 0 1 0 0 0 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Some commas.
+custom(my-filter, a mat3(1, 0, 0, 0, 1, 0 0 0 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Leading commas.
+custom(my-filter, a mat3(, 0, 0, 0, 1, 0, 0, 0, 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+No length units.
+custom(my-filter, a mat3(1px, 0, 0, 0, 1px, 0, 0, 0, 1px))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+No degree units.
+custom(my-filter, a mat3(1deg, 0, 0, 0, 1deg, 0, 0, 0, 1deg))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+NaN in mat3.
+custom(my-filter, a mat2(NaN, 0, 0, 0, 1, 0, 0, 0, 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+========================================
+Mat4 parameter tests.
+========================================
+
+Empty mat4.
+custom(my-filter, a mat4())
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Too view arguments.
+custom(my-filter, a mat4(1, 0, 0, 0, 1, 0, 0, 0, 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+No arguments but commas.
+custom(my-filter, a mat4(,,,,,,,,,,,,,,,))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Ending commas.
+custom(my-filter, a mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,,))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Idents in mat4 function.
+custom(my-filter, a mat4(1, 0, 0, 0, 1, 0, 0, a, b))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Too many arguments.
+custom(my-filter, a mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+No commas.
+custom(my-filter, a mat4(1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Some commas.
+custom(my-filter, a mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0 0 0 0 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Leading commas.
+custom(my-filter, a mat4(, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+No length units.
+custom(my-filter, a mat4(1px, 0, 0, 0, 0, 1px, 0, 0, 0, 0, 1px, 0, 0, 0, 0, 1px))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+No degree units.
+custom(my-filter, a mat4(1deg, 0, 0, 0, 0, 1deg, 0, 0, 0, 0, 1deg, 0, 0, 0, 0, 1deg))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+NaN in mat4.
+custom(my-filter, a mat4(NaN, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+========================================
 Mixing parameter types.
 ========================================
 
@@ -391,6 +619,18 @@ custom(my-filter, a rgb(255, 0, 0) rotate(45deg))
 PASS styleRule.type is CSSRule.STYLE_RULE
 PASS declaration.length is 0
 PASS declaration.getPropertyValue('-webkit-filter') is null
+
+Color with mat2.
+custom(my-filter, a rgb(255, 0, 0) mat2(0, 0, 0, 0))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
+
+mat2 with mat3.
+custom(my-filter, a mat2(1, 0, 0, 1) mat3(0, 0, 0, 0, 0, 0, 0, 0, 0))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS declaration.length is 0
+PASS declaration.getPropertyValue('-webkit-filter') is null
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 30d8d4a..ae45700 100644 (file)
@@ -301,20 +301,176 @@ PASS subValue.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
 PASS subValue.cssText is 'custom(my-filter, a1 array(1, -2.2, 3.14, 0.4, 5), a2 array(1, 2, 3))'
 
 ========================================
+Mat2 parameter tests.
+========================================
+
+Mat2 parameter.
+custom(my-filter, m mat2(1, 0, 0, 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS styleDeclaration.length is 1
+PASS styleDeclaration.getPropertyValue('-webkit-filter') is 'custom(my-filter, m mat2(1, 0, 0, 1))'
+PASS filterPropertyValue instanceof CSSValueList is true
+PASS filterPropertyValue.constructor === CSSValueList is true
+PASS filterPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS filterPropertyValue.length is 1
+PASS subValue.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS subValue.cssText is 'custom(my-filter, m mat2(1, 0, 0, 1))'
+
+Mat2 parameter with negative values.
+custom(my-filter, m mat2(-1, -1, -1, -1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS styleDeclaration.length is 1
+PASS styleDeclaration.getPropertyValue('-webkit-filter') is 'custom(my-filter, m mat2(-1, -1, -1, -1))'
+PASS filterPropertyValue instanceof CSSValueList is true
+PASS filterPropertyValue.constructor === CSSValueList is true
+PASS filterPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS filterPropertyValue.length is 1
+PASS subValue.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS subValue.cssText is 'custom(my-filter, m mat2(-1, -1, -1, -1))'
+
+Mat2 parameter with negative and positive values.
+custom(my-filter, m mat2(-1, 1, 1, -1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS styleDeclaration.length is 1
+PASS styleDeclaration.getPropertyValue('-webkit-filter') is 'custom(my-filter, m mat2(-1, 1, 1, -1))'
+PASS filterPropertyValue instanceof CSSValueList is true
+PASS filterPropertyValue.constructor === CSSValueList is true
+PASS filterPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS filterPropertyValue.length is 1
+PASS subValue.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS subValue.cssText is 'custom(my-filter, m mat2(-1, 1, 1, -1))'
+
+Mat2 parameter with multiple signed floats.
+custom(my-filter, m mat2(1, -2.2, 3.14, 0.4))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS styleDeclaration.length is 1
+PASS styleDeclaration.getPropertyValue('-webkit-filter') is 'custom(my-filter, m mat2(1, -2.2, 3.14, 0.4))'
+PASS filterPropertyValue instanceof CSSValueList is true
+PASS filterPropertyValue.constructor === CSSValueList is true
+PASS filterPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS filterPropertyValue.length is 1
+PASS subValue.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS subValue.cssText is 'custom(my-filter, m mat2(1, -2.2, 3.14, 0.4))'
+
+========================================
+Mat3 parameter tests.
+========================================
+
+Mat3 parameter.
+custom(my-filter, m mat3(1, 0, 0, 0, 1, 0, 0, 0, 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS styleDeclaration.length is 1
+PASS styleDeclaration.getPropertyValue('-webkit-filter') is 'custom(my-filter, m mat3(1, 0, 0, 0, 1, 0, 0, 0, 1))'
+PASS filterPropertyValue instanceof CSSValueList is true
+PASS filterPropertyValue.constructor === CSSValueList is true
+PASS filterPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS filterPropertyValue.length is 1
+PASS subValue.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS subValue.cssText is 'custom(my-filter, m mat3(1, 0, 0, 0, 1, 0, 0, 0, 1))'
+
+Mat3 parameter with negative values.
+custom(my-filter, m mat3(-1, -1, -1, -1, -1, -1, -1, -1, -1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS styleDeclaration.length is 1
+PASS styleDeclaration.getPropertyValue('-webkit-filter') is 'custom(my-filter, m mat3(-1, -1, -1, -1, -1, -1, -1, -1, -1))'
+PASS filterPropertyValue instanceof CSSValueList is true
+PASS filterPropertyValue.constructor === CSSValueList is true
+PASS filterPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS filterPropertyValue.length is 1
+PASS subValue.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS subValue.cssText is 'custom(my-filter, m mat3(-1, -1, -1, -1, -1, -1, -1, -1, -1))'
+
+Mat3 parameter with negative and positive values.
+custom(my-filter, m mat3(-1, 1, 1, -1, -1, 1, 1, -1, 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS styleDeclaration.length is 1
+PASS styleDeclaration.getPropertyValue('-webkit-filter') is 'custom(my-filter, m mat3(-1, 1, 1, -1, -1, 1, 1, -1, 1))'
+PASS filterPropertyValue instanceof CSSValueList is true
+PASS filterPropertyValue.constructor === CSSValueList is true
+PASS filterPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS filterPropertyValue.length is 1
+PASS subValue.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS subValue.cssText is 'custom(my-filter, m mat3(-1, 1, 1, -1, -1, 1, 1, -1, 1))'
+
+Mat3 parameter with multiple signed floats.
+custom(my-filter, m mat3(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS styleDeclaration.length is 1
+PASS styleDeclaration.getPropertyValue('-webkit-filter') is 'custom(my-filter, m mat3(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1))'
+PASS filterPropertyValue instanceof CSSValueList is true
+PASS filterPropertyValue.constructor === CSSValueList is true
+PASS filterPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS filterPropertyValue.length is 1
+PASS subValue.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS subValue.cssText is 'custom(my-filter, m mat3(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1))'
+
+========================================
+Mat4 parameter tests.
+========================================
+
+Mat4 parameter.
+custom(my-filter, m mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS styleDeclaration.length is 1
+PASS styleDeclaration.getPropertyValue('-webkit-filter') is 'custom(my-filter, m mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1))'
+PASS filterPropertyValue instanceof CSSValueList is true
+PASS filterPropertyValue.constructor === CSSValueList is true
+PASS filterPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS filterPropertyValue.length is 1
+PASS subValue.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS subValue.cssText is 'custom(my-filter, m mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1))'
+
+Mat4 parameter with negative values.
+custom(my-filter, m mat4(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS styleDeclaration.length is 1
+PASS styleDeclaration.getPropertyValue('-webkit-filter') is 'custom(my-filter, m mat4(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1))'
+PASS filterPropertyValue instanceof CSSValueList is true
+PASS filterPropertyValue.constructor === CSSValueList is true
+PASS filterPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS filterPropertyValue.length is 1
+PASS subValue.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS subValue.cssText is 'custom(my-filter, m mat4(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1))'
+
+Mat4 parameter with negative and positive values.
+custom(my-filter, m mat4(-1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS styleDeclaration.length is 1
+PASS styleDeclaration.getPropertyValue('-webkit-filter') is 'custom(my-filter, m mat4(-1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1))'
+PASS filterPropertyValue instanceof CSSValueList is true
+PASS filterPropertyValue.constructor === CSSValueList is true
+PASS filterPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS filterPropertyValue.length is 1
+PASS subValue.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS subValue.cssText is 'custom(my-filter, m mat4(-1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1))'
+
+Mat4 parameter with multiple signed floats.
+custom(my-filter, m mat4(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4))
+PASS styleRule.type is CSSRule.STYLE_RULE
+PASS styleDeclaration.length is 1
+PASS styleDeclaration.getPropertyValue('-webkit-filter') is 'custom(my-filter, m mat4(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4))'
+PASS filterPropertyValue instanceof CSSValueList is true
+PASS filterPropertyValue.constructor === CSSValueList is true
+PASS filterPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS filterPropertyValue.length is 1
+PASS subValue.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
+PASS subValue.cssText is 'custom(my-filter, m mat4(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4))'
+
+========================================
 Combined parameter tests.
 ========================================
 
-Number parameter, color parameter, transform parameter, and array parameter.
-custom(my-filter, n 1, c rgb(0, 128, 0), t rotate(0deg), a array(1))
+Number parameter, color parameter, transform parameter, matrix parameters and array parameter.
+custom(my-filter, n 1, c rgb(0, 128, 0), t rotate(0deg), m1 mat2(1, 0, 0, 1), m2 mat3(1, 0, 0, 0, 1, 0, 0, 0, 1), m3 mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), a array(1))
 PASS styleRule.type is CSSRule.STYLE_RULE
 PASS styleDeclaration.length is 1
-PASS styleDeclaration.getPropertyValue('-webkit-filter') is 'custom(my-filter, n 1, c rgb(0, 128, 0), t rotate(0deg), a array(1))'
+PASS styleDeclaration.getPropertyValue('-webkit-filter') is 'custom(my-filter, n 1, c rgb(0, 128, 0), t rotate(0deg), m1 mat2(1, 0, 0, 1), m2 mat3(1, 0, 0, 0, 1, 0, 0, 0, 1), m3 mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), a array(1))'
 PASS filterPropertyValue instanceof CSSValueList is true
 PASS filterPropertyValue.constructor === CSSValueList is true
 PASS filterPropertyValue.__proto__ === CSSValueList.prototype is true
 PASS filterPropertyValue.length is 1
 PASS subValue.operationType is WebKitCSSFilterValue.CSS_FILTER_CUSTOM
-PASS subValue.cssText is 'custom(my-filter, n 1, c rgb(0, 128, 0), t rotate(0deg), a array(1))'
+PASS subValue.cssText is 'custom(my-filter, n 1, c rgb(0, 128, 0), t rotate(0deg), m1 mat2(1, 0, 0, 1), m2 mat3(1, 0, 0, 0, 1, 0, 0, 0, 1), m3 mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), a array(1))'
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 059ab17..217ae42 100644 (file)
@@ -267,6 +267,234 @@ PASS styleDeclaration.length is 0
 PASS styleDeclaration.getPropertyValue('parameters') is null
 
 ========================================
+Mat2 parameter tests.
+========================================
+
+Empty mat2.
+parameters: a mat2();
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Too view arguments.
+parameters: a mat2(0, 0, 0);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+No arguments but commas.
+parameters: a mat2(,,,);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Ending commas.
+parameters: a mat2(0, 0,,);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Idents in mat2 function.
+parameters: a mat2(0, 0, a, b);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Too many arguments.
+parameters: a mat2(0, 0, 0, 0, 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+No commas.
+parameters: a mat2(1 0 0 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Some commas.
+parameters: a mat2(1, 0, 0 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Leading commas.
+parameters: a mat2(, 0, 0, 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+No length units.
+parameters: a mat2(1px, 0px, 0px, 1px);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+No degree units.
+parameters: a mat2(1deg, 0deg, 0deg, 1deg);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+NaN in mat2.
+parameters: a mat2(1, 0, 0, NaN);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+========================================
+Mat3 parameter tests.
+========================================
+
+Empty mat3.
+parameters: a mat3();
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Too view arguments.
+parameters: a mat3(0, 0, 0, 0);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+No arguments but commas.
+parameters: a mat3(,,,,,,,,,,,,,,,);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Ending commas.
+parameters: a mat3(1, 0, 0, 0, 1, 0, 0,,);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Idents in mat3 function.
+parameters: a mat3(1, 0, 0, 0, 1, 0, 0, a, b);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Too many arguments.
+parameters: a mat3(1, 0, 0, 0, 1, 0, 0, 0, 1, 0);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+No commas.
+parameters: a mat3(1 0 0 0 1 0 0 0 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Some commas.
+parameters: a mat3(1, 0, 0, 0, 1, 0 0 0 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Leading commas.
+parameters: a mat3(, 0, 0, 0, 1, 0, 0, 0, 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+No length units.
+parameters: a mat3(1px, 0, 0, 0, 1px, 0, 0, 0, 1px);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+No degree units.
+parameters: a mat3(1deg, 0, 0, 0, 1deg, 0, 0, 0, 1deg);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+NaN in mat3.
+parameters: a mat2(NaN, 0, 0, 0, 1, 0, 0, 0, 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+========================================
+Mat4 parameter tests.
+========================================
+
+Empty mat4.
+parameters: a mat4();
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Too view arguments.
+parameters: a mat4(1, 0, 0, 0, 1, 0, 0, 0, 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+No arguments but commas.
+parameters: a mat4(,,,,,,,,,,,,,,,);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Ending commas.
+parameters: a mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,,);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Idents in mat4 function.
+parameters: a mat4(1, 0, 0, 0, 1, 0, 0, a, b);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Too many arguments.
+parameters: a mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+No commas.
+parameters: a mat4(1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Some commas.
+parameters: a mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0 0 0 0 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Leading commas.
+parameters: a mat4(, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+No length units.
+parameters: a mat4(1px, 0, 0, 0, 0, 1px, 0, 0, 0, 0, 1px, 0, 0, 0, 0, 1px);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+No degree units.
+parameters: a mat4(1deg, 0, 0, 0, 0, 1deg, 0, 0, 0, 0, 1deg, 0, 0, 0, 0, 1deg);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+NaN in mat4.
+parameters: a mat4(NaN, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+========================================
 Mixing parameter types.
 ========================================
 
@@ -317,6 +545,24 @@ parameters: a rgb(255, 0, 0) rotate(45deg);
 PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
 PASS styleDeclaration.length is 0
 PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Color after array values.
+parameters: a array(0) rgb(255, 0, 0);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+Color with mat2.
+parameters: a rgb(255, 0, 0) mat2(0, 0, 0, 0);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
+
+mat2 with mat3.
+parameters: a mat2(1, 0, 0, 1) mat3(0, 0, 0, 0, 0, 0, 0, 0, 0);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 0
+PASS styleDeclaration.getPropertyValue('parameters') is null
 PASS successfullyParsed is true
 
 TEST COMPLETE
index b63da6f..7ee70ba 100644 (file)
@@ -253,18 +253,174 @@ PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
 PASS removeBaseURL(subValue.cssText) is "c rgba(0, 255, 0, 0.2)"
 
 ========================================
+Mat2 parameter tests.
+========================================
+
+Mat2 parameter.
+parameters: m mat2(1, 0, 0, 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 1
+PASS removeBaseURL(styleDeclaration.getPropertyValue('parameters')) is "m mat2(1, 0, 0, 1)"
+PASS parametersPropertyValue instanceof CSSValueList is true
+PASS parametersPropertyValue.constructor === CSSValueList is true
+PASS parametersPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS parametersPropertyValue.length is 1
+PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
+PASS removeBaseURL(subValue.cssText) is "m mat2(1, 0, 0, 1)"
+
+Mat2 parameter with negative values.
+parameters: m mat2(-1, -1, -1, -1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 1
+PASS removeBaseURL(styleDeclaration.getPropertyValue('parameters')) is "m mat2(-1, -1, -1, -1)"
+PASS parametersPropertyValue instanceof CSSValueList is true
+PASS parametersPropertyValue.constructor === CSSValueList is true
+PASS parametersPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS parametersPropertyValue.length is 1
+PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
+PASS removeBaseURL(subValue.cssText) is "m mat2(-1, -1, -1, -1)"
+
+Mat2 parameter with negative and positive values.
+parameters: m mat2(-1, 1, 1, -1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 1
+PASS removeBaseURL(styleDeclaration.getPropertyValue('parameters')) is "m mat2(-1, 1, 1, -1)"
+PASS parametersPropertyValue instanceof CSSValueList is true
+PASS parametersPropertyValue.constructor === CSSValueList is true
+PASS parametersPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS parametersPropertyValue.length is 1
+PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
+PASS removeBaseURL(subValue.cssText) is "m mat2(-1, 1, 1, -1)"
+
+Mat2 parameter with multiple signed floats.
+parameters: m mat2(1, -2.2, 3.14, 0.4);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 1
+PASS removeBaseURL(styleDeclaration.getPropertyValue('parameters')) is "m mat2(1, -2.2, 3.14, 0.4)"
+PASS parametersPropertyValue instanceof CSSValueList is true
+PASS parametersPropertyValue.constructor === CSSValueList is true
+PASS parametersPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS parametersPropertyValue.length is 1
+PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
+PASS removeBaseURL(subValue.cssText) is "m mat2(1, -2.2, 3.14, 0.4)"
+
+========================================
+Mat3 parameter tests.
+========================================
+
+Mat3 parameter.
+parameters: m mat3(1, 0, 0, 0, 1, 0, 0, 0, 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 1
+PASS removeBaseURL(styleDeclaration.getPropertyValue('parameters')) is "m mat3(1, 0, 0, 0, 1, 0, 0, 0, 1)"
+PASS parametersPropertyValue instanceof CSSValueList is true
+PASS parametersPropertyValue.constructor === CSSValueList is true
+PASS parametersPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS parametersPropertyValue.length is 1
+PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
+PASS removeBaseURL(subValue.cssText) is "m mat3(1, 0, 0, 0, 1, 0, 0, 0, 1)"
+
+Mat3 parameter with negative values.
+parameters: m mat3(-1, -1, -1, -1, -1, -1, -1, -1, -1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 1
+PASS removeBaseURL(styleDeclaration.getPropertyValue('parameters')) is "m mat3(-1, -1, -1, -1, -1, -1, -1, -1, -1)"
+PASS parametersPropertyValue instanceof CSSValueList is true
+PASS parametersPropertyValue.constructor === CSSValueList is true
+PASS parametersPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS parametersPropertyValue.length is 1
+PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
+PASS removeBaseURL(subValue.cssText) is "m mat3(-1, -1, -1, -1, -1, -1, -1, -1, -1)"
+
+Mat3 parameter with negative and positive values.
+parameters: m mat3(-1, 1, 1, -1, -1, 1, 1, -1, 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 1
+PASS removeBaseURL(styleDeclaration.getPropertyValue('parameters')) is "m mat3(-1, 1, 1, -1, -1, 1, 1, -1, 1)"
+PASS parametersPropertyValue instanceof CSSValueList is true
+PASS parametersPropertyValue.constructor === CSSValueList is true
+PASS parametersPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS parametersPropertyValue.length is 1
+PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
+PASS removeBaseURL(subValue.cssText) is "m mat3(-1, 1, 1, -1, -1, 1, 1, -1, 1)"
+
+Mat3 parameter with multiple signed floats.
+parameters: m mat3(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 1
+PASS removeBaseURL(styleDeclaration.getPropertyValue('parameters')) is "m mat3(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1)"
+PASS parametersPropertyValue instanceof CSSValueList is true
+PASS parametersPropertyValue.constructor === CSSValueList is true
+PASS parametersPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS parametersPropertyValue.length is 1
+PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
+PASS removeBaseURL(subValue.cssText) is "m mat3(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1)"
+
+========================================
+Mat4 parameter tests.
+========================================
+
+Mat4 parameter.
+parameters: m mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 1
+PASS removeBaseURL(styleDeclaration.getPropertyValue('parameters')) is "m mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)"
+PASS parametersPropertyValue instanceof CSSValueList is true
+PASS parametersPropertyValue.constructor === CSSValueList is true
+PASS parametersPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS parametersPropertyValue.length is 1
+PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
+PASS removeBaseURL(subValue.cssText) is "m mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)"
+
+Mat4 parameter with negative values.
+parameters: m mat4(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 1
+PASS removeBaseURL(styleDeclaration.getPropertyValue('parameters')) is "m mat4(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)"
+PASS parametersPropertyValue instanceof CSSValueList is true
+PASS parametersPropertyValue.constructor === CSSValueList is true
+PASS parametersPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS parametersPropertyValue.length is 1
+PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
+PASS removeBaseURL(subValue.cssText) is "m mat4(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)"
+
+Mat4 parameter with negative and positive values.
+parameters: m mat4(-1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 1
+PASS removeBaseURL(styleDeclaration.getPropertyValue('parameters')) is "m mat4(-1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1)"
+PASS parametersPropertyValue instanceof CSSValueList is true
+PASS parametersPropertyValue.constructor === CSSValueList is true
+PASS parametersPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS parametersPropertyValue.length is 1
+PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
+PASS removeBaseURL(subValue.cssText) is "m mat4(-1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1)"
+
+Mat4 parameter with multiple signed floats.
+parameters: m mat4(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4);
+PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
+PASS styleDeclaration.length is 1
+PASS removeBaseURL(styleDeclaration.getPropertyValue('parameters')) is "m mat4(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4)"
+PASS parametersPropertyValue instanceof CSSValueList is true
+PASS parametersPropertyValue.constructor === CSSValueList is true
+PASS parametersPropertyValue.__proto__ === CSSValueList.prototype is true
+PASS parametersPropertyValue.length is 1
+PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
+PASS removeBaseURL(subValue.cssText) is "m mat4(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4)"
+
+========================================
 Combined parameter tests.
 ========================================
 
-Number parameter, color parameter, transform parameter and array parameter.
-parameters: n 1, c rgb(0, 128, 0), t rotate(0deg), a array(1);
+Number parameter, color parameter, transform parameter, matrix parameters and array parameter.
+parameters: n 1, c rgb(0, 128, 0), t rotate(0deg), m1 mat2(1, 0, 0, 1), m2 mat3(1, 0, 0, 0, 1, 0, 0, 0, 1), m3 mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), a array(1);
 PASS filterAtRule.type is CSSRule.WEBKIT_FILTER_RULE
 PASS styleDeclaration.length is 1
-PASS removeBaseURL(styleDeclaration.getPropertyValue('parameters')) is "n 1, c rgb(0, 128, 0), t rotate(0deg), a array(1)"
+PASS removeBaseURL(styleDeclaration.getPropertyValue('parameters')) is "n 1, c rgb(0, 128, 0), t rotate(0deg), m1 mat2(1, 0, 0, 1), m2 mat3(1, 0, 0, 0, 1, 0, 0, 0, 1), m3 mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), a array(1)"
 PASS parametersPropertyValue instanceof CSSValueList is true
 PASS parametersPropertyValue.constructor === CSSValueList is true
 PASS parametersPropertyValue.__proto__ === CSSValueList.prototype is true
-PASS parametersPropertyValue.length is 4
+PASS parametersPropertyValue.length is 7
 PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
 PASS removeBaseURL(subValue.cssText) is "n 1"
 PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
@@ -272,6 +428,12 @@ PASS removeBaseURL(subValue.cssText) is "c rgb(0, 128, 0)"
 PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
 PASS removeBaseURL(subValue.cssText) is "t rotate(0deg)"
 PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
+PASS removeBaseURL(subValue.cssText) is "m1 mat2(1, 0, 0, 1)"
+PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
+PASS removeBaseURL(subValue.cssText) is "m2 mat3(1, 0, 0, 0, 1, 0, 0, 0, 1)"
+PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
+PASS removeBaseURL(subValue.cssText) is "m3 mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)"
+PASS subValue.cssValueType is CSSValue.CSS_VALUE_LIST
 PASS removeBaseURL(subValue.cssText) is "a array(1)"
 PASS successfullyParsed is true
 
index e9e84e9..d4faca3 100644 (file)
@@ -82,6 +82,50 @@ testInvalidFilterRule("Invalid value unit 'px' in array.", "custom(my-filter, a
 testInvalidFilterRule("Invalid value unit 'deg' in array.", "custom(my-filter, a array(1deg))");
 testInvalidFilterRule("Invalid value unit 'px' in array after valid values.", "custom(my-filter, a array(1, 2, 3, 4px))");
 
+
+heading("Mat2 parameter tests.");
+testInvalidFilterRule("Empty mat2.", "custom(my-filter, a mat2())");
+testInvalidFilterRule("Too view arguments.", "custom(my-filter, a mat2(0, 0, 0))");
+testInvalidFilterRule("No arguments but commas.", "custom(my-filter, a mat2(,,,))");
+testInvalidFilterRule("Ending commas.", "custom(my-filter, a mat2(0, 0,,))");
+testInvalidFilterRule("Idents in mat2 function.", "custom(my-filter, a mat2(0, 0, a, b))");
+testInvalidFilterRule("Too many arguments.", "custom(my-filter, a mat2(0, 0, 0, 0, 1))");
+testInvalidFilterRule("No commas.", "custom(my-filter, a mat2(1 0 0 1))");
+testInvalidFilterRule("Some commas.", "custom(my-filter, a mat2(1, 0, 0 1))");
+testInvalidFilterRule("Leading commas.", "custom(my-filter, a mat2(, 0, 0, 1))");
+testInvalidFilterRule("No length units.", "custom(my-filter, a mat2(1px, 0px, 0px, 1px))");
+testInvalidFilterRule("No degree units.", "custom(my-filter, a mat2(1deg, 0deg, 0deg, 1deg))");
+testInvalidFilterRule("NaN in mat2.", "custom(my-filter, a mat2(1, 0, 0, NaN))");
+
+heading("Mat3 parameter tests.");
+testInvalidFilterRule("Empty mat3.", "custom(my-filter, a mat3())");
+testInvalidFilterRule("Too view arguments.", "custom(my-filter, a mat3(0, 0, 0, 0))");
+testInvalidFilterRule("No arguments but commas.", "custom(my-filter, a mat3(,,,,,,,,,,,,,,,))");
+testInvalidFilterRule("Ending commas.", "custom(my-filter, a mat3(1, 0, 0, 0, 1, 0, 0,,))");
+testInvalidFilterRule("Idents in mat3 function.", "custom(my-filter, a mat3(1, 0, 0, 0, 1, 0, 0, a, b))");
+testInvalidFilterRule("Too many arguments.", "custom(my-filter, a mat3(1, 0, 0, 0, 1, 0, 0, 0, 1, 0))");
+testInvalidFilterRule("No commas.", "custom(my-filter, a mat3(1 0 0 0 1 0 0 0 1))");
+testInvalidFilterRule("Some commas.", "custom(my-filter, a mat3(1, 0, 0, 0, 1, 0 0 0 1))");
+testInvalidFilterRule("Leading commas.", "custom(my-filter, a mat3(, 0, 0, 0, 1, 0, 0, 0, 1))");
+testInvalidFilterRule("No length units.", "custom(my-filter, a mat3(1px, 0, 0, 0, 1px, 0, 0, 0, 1px))");
+testInvalidFilterRule("No degree units.", "custom(my-filter, a mat3(1deg, 0, 0, 0, 1deg, 0, 0, 0, 1deg))");
+testInvalidFilterRule("NaN in mat3.", "custom(my-filter, a mat2(NaN, 0, 0, 0, 1, 0, 0, 0, 1))");
+
+heading("Mat4 parameter tests.");
+testInvalidFilterRule("Empty mat4.", "custom(my-filter, a mat4())");
+testInvalidFilterRule("Too view arguments.", "custom(my-filter, a mat4(1, 0, 0, 0, 1, 0, 0, 0, 1))");
+testInvalidFilterRule("No arguments but commas.", "custom(my-filter, a mat4(,,,,,,,,,,,,,,,))");
+testInvalidFilterRule("Ending commas.", "custom(my-filter, a mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,,))");
+testInvalidFilterRule("Idents in mat4 function.", "custom(my-filter, a mat4(1, 0, 0, 0, 1, 0, 0, a, b))");
+testInvalidFilterRule("Too many arguments.", "custom(my-filter, a mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0))");
+testInvalidFilterRule("No commas.", "custom(my-filter, a mat4(1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1))");
+testInvalidFilterRule("Some commas.", "custom(my-filter, a mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0 0 0 0 1))");
+testInvalidFilterRule("Leading commas.", "custom(my-filter, a mat4(, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1))");
+testInvalidFilterRule("No length units.", "custom(my-filter, a mat4(1px, 0, 0, 0, 0, 1px, 0, 0, 0, 0, 1px, 0, 0, 0, 0, 1px))");
+testInvalidFilterRule("No degree units.", "custom(my-filter, a mat4(1deg, 0, 0, 0, 0, 1deg, 0, 0, 0, 0, 1deg, 0, 0, 0, 0, 1deg))");
+testInvalidFilterRule("NaN in mat4.", "custom(my-filter, a mat4(NaN, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1))");
+
+
 heading("Mixing parameter types.");
 testInvalidFilterRule("Number parameter with hex color.", "custom(my-filter, n1 1 2 #FF0000)");
 testInvalidFilterRule("Number parameter with color keyword.", "custom(my-filter, n1 1 2 red)");
@@ -90,4 +134,6 @@ testInvalidFilterRule("Color with number parameter.", "custom(my-filter, a rgb(2
 testInvalidFilterRule("Color in array.", "custom(my-filter, a array(0, rgb(255, 0, 0)))");
 testInvalidFilterRule("Color and array.", "custom(my-filter, a array(0, 0) rgb(255, 0, 0))");
 testInvalidFilterRule("Color with transform values.", "custom(my-filter, a rotate(45deg) rgb(255, 0, 0))");
-testInvalidFilterRule("Color with transform values.", "custom(my-filter, a rgb(255, 0, 0) rotate(45deg))");
\ No newline at end of file
+testInvalidFilterRule("Color with transform values.", "custom(my-filter, a rgb(255, 0, 0) rotate(45deg))");
+testInvalidFilterRule("Color with mat2.", "custom(my-filter, a rgb(255, 0, 0) mat2(0, 0, 0, 0))");
+testInvalidFilterRule("mat2 with mat3.", "custom(my-filter, a mat2(1, 0, 0, 1) mat3(0, 0, 0, 0, 0, 0, 0, 0, 0))");
index 1746fe2..71c5a0f 100644 (file)
@@ -119,7 +119,49 @@ testFilterProperty("Multiple array parameters.",
     "custom(my-filter, a1 array(1, -2.2, 3.14, 0.4, 5), a2 array(1, 2, 3))",
     "custom(my-filter, a1 array(1, -2.2, 3.14, 0.4, 5), a2 array(1, 2, 3))");
 
+heading("Mat2 parameter tests.");
+testFilterProperty("Mat2 parameter.",
+    "custom(my-filter, m mat2(1, 0, 0, 1))",
+    "custom(my-filter, m mat2(1, 0, 0, 1))");
+testFilterProperty("Mat2 parameter with negative values.",
+    "custom(my-filter, m mat2(-1, -1, -1, -1))",
+    "custom(my-filter, m mat2(-1, -1, -1, -1))");
+testFilterProperty("Mat2 parameter with negative and positive values.",
+    "custom(my-filter, m mat2(-1, 1, 1, -1))",
+    "custom(my-filter, m mat2(-1, 1, 1, -1))");
+testFilterProperty("Mat2 parameter with multiple signed floats.",
+    "custom(my-filter, m mat2(1, -2.2, 3.14, 0.4))",
+    "custom(my-filter, m mat2(1, -2.2, 3.14, 0.4))");
+
+heading("Mat3 parameter tests.");
+testFilterProperty("Mat3 parameter.",
+    "custom(my-filter, m mat3(1, 0, 0, 0, 1, 0, 0, 0, 1))",
+    "custom(my-filter, m mat3(1, 0, 0, 0, 1, 0, 0, 0, 1))");
+testFilterProperty("Mat3 parameter with negative values.",
+    "custom(my-filter, m mat3(-1, -1, -1, -1, -1, -1, -1, -1, -1))",
+    "custom(my-filter, m mat3(-1, -1, -1, -1, -1, -1, -1, -1, -1))");
+testFilterProperty("Mat3 parameter with negative and positive values.",
+    "custom(my-filter, m mat3(-1, 1, 1, -1, -1, 1, 1, -1, 1))",
+    "custom(my-filter, m mat3(-1, 1, 1, -1, -1, 1, 1, -1, 1))");
+testFilterProperty("Mat3 parameter with multiple signed floats.",
+    "custom(my-filter, m mat3(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1))",
+    "custom(my-filter, m mat3(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1))");
+
+heading("Mat4 parameter tests.");
+testFilterProperty("Mat4 parameter.",
+    "custom(my-filter, m mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1))",
+    "custom(my-filter, m mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1))");
+testFilterProperty("Mat4 parameter with negative values.",
+    "custom(my-filter, m mat4(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1))",
+    "custom(my-filter, m mat4(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1))");
+testFilterProperty("Mat4 parameter with negative and positive values.",
+    "custom(my-filter, m mat4(-1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1))",
+    "custom(my-filter, m mat4(-1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1))");
+testFilterProperty("Mat4 parameter with multiple signed floats.",
+    "custom(my-filter, m mat4(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4))",
+    "custom(my-filter, m mat4(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4))");
+
 heading("Combined parameter tests.");
-testFilterProperty("Number parameter, color parameter, transform parameter, and array parameter.",
-    "custom(my-filter, n 1, c rgb(0, 128, 0), t rotate(0deg), a array(1))",
-    "custom(my-filter, n 1, c rgb(0, 128, 0), t rotate(0deg), a array(1))");
+testFilterProperty("Number parameter, color parameter, transform parameter, matrix parameters and array parameter.",
+    "custom(my-filter, n 1, c rgb(0, 128, 0), t rotate(0deg), m1 mat2(1, 0, 0, 1), m2 mat3(1, 0, 0, 0, 1, 0, 0, 0, 1), m3 mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), a array(1))",
+    "custom(my-filter, n 1, c rgb(0, 128, 0), t rotate(0deg), m1 mat2(1, 0, 0, 1), m2 mat3(1, 0, 0, 0, 1, 0, 0, 0, 1), m3 mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), a array(1))");
index 86057f1..6adda15 100644 (file)
@@ -70,6 +70,48 @@ testInvalidParametersProperty("Invalid value unit 'px' in array.", "a array(1px)
 testInvalidParametersProperty("Invalid value unit 'deg' in array.", "a array(1deg)");
 testInvalidParametersProperty("Invalid value unit 'px' in array after valid values.", "a array(1, 2, 3, 4px)");
 
+heading("Mat2 parameter tests.");
+testInvalidParametersProperty("Empty mat2.", "a mat2()");
+testInvalidParametersProperty("Too view arguments.", "a mat2(0, 0, 0)");
+testInvalidParametersProperty("No arguments but commas.", "a mat2(,,,)");
+testInvalidParametersProperty("Ending commas.", "a mat2(0, 0,,)");
+testInvalidParametersProperty("Idents in mat2 function.", "a mat2(0, 0, a, b)");
+testInvalidParametersProperty("Too many arguments.", "a mat2(0, 0, 0, 0, 1)");
+testInvalidParametersProperty("No commas.", "a mat2(1 0 0 1)");
+testInvalidParametersProperty("Some commas.", "a mat2(1, 0, 0 1)");
+testInvalidParametersProperty("Leading commas.", "a mat2(, 0, 0, 1)");
+testInvalidParametersProperty("No length units.", "a mat2(1px, 0px, 0px, 1px)");
+testInvalidParametersProperty("No degree units.", "a mat2(1deg, 0deg, 0deg, 1deg)");
+testInvalidParametersProperty("NaN in mat2.", "a mat2(1, 0, 0, NaN)");
+
+heading("Mat3 parameter tests.");
+testInvalidParametersProperty("Empty mat3.", "a mat3()");
+testInvalidParametersProperty("Too view arguments.", "a mat3(0, 0, 0, 0)");
+testInvalidParametersProperty("No arguments but commas.", "a mat3(,,,,,,,,,,,,,,,)");
+testInvalidParametersProperty("Ending commas.", "a mat3(1, 0, 0, 0, 1, 0, 0,,)");
+testInvalidParametersProperty("Idents in mat3 function.", "a mat3(1, 0, 0, 0, 1, 0, 0, a, b)");
+testInvalidParametersProperty("Too many arguments.", "a mat3(1, 0, 0, 0, 1, 0, 0, 0, 1, 0)");
+testInvalidParametersProperty("No commas.", "a mat3(1 0 0 0 1 0 0 0 1)");
+testInvalidParametersProperty("Some commas.", "a mat3(1, 0, 0, 0, 1, 0 0 0 1)");
+testInvalidParametersProperty("Leading commas.", "a mat3(, 0, 0, 0, 1, 0, 0, 0, 1)");
+testInvalidParametersProperty("No length units.", "a mat3(1px, 0, 0, 0, 1px, 0, 0, 0, 1px)");
+testInvalidParametersProperty("No degree units.", "a mat3(1deg, 0, 0, 0, 1deg, 0, 0, 0, 1deg)");
+testInvalidParametersProperty("NaN in mat3.", "a mat2(NaN, 0, 0, 0, 1, 0, 0, 0, 1)");
+
+heading("Mat4 parameter tests.");
+testInvalidParametersProperty("Empty mat4.", "a mat4()");
+testInvalidParametersProperty("Too view arguments.", "a mat4(1, 0, 0, 0, 1, 0, 0, 0, 1)");
+testInvalidParametersProperty("No arguments but commas.", "a mat4(,,,,,,,,,,,,,,,)");
+testInvalidParametersProperty("Ending commas.", "a mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,,)");
+testInvalidParametersProperty("Idents in mat4 function.", "a mat4(1, 0, 0, 0, 1, 0, 0, a, b)");
+testInvalidParametersProperty("Too many arguments.", "a mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0)");
+testInvalidParametersProperty("No commas.", "a mat4(1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1)");
+testInvalidParametersProperty("Some commas.", "a mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0 0 0 0 1)");
+testInvalidParametersProperty("Leading commas.", "a mat4(, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)");
+testInvalidParametersProperty("No length units.", "a mat4(1px, 0, 0, 0, 0, 1px, 0, 0, 0, 0, 1px, 0, 0, 0, 0, 1px)");
+testInvalidParametersProperty("No degree units.", "a mat4(1deg, 0, 0, 0, 0, 1deg, 0, 0, 0, 0, 1deg, 0, 0, 0, 0, 1deg)");
+testInvalidParametersProperty("NaN in mat4.", "a mat4(NaN, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)");
+
 heading("Mixing parameter types.");
 testInvalidParametersProperty("Number parameter with hex color.", "n1 1 2 #FF0000");
 testInvalidParametersProperty("Number parameter with color keyword.", "n1 1 2 red");
@@ -79,4 +121,7 @@ testInvalidParametersProperty("Color in array.", "a array(0, rgb(255, 0, 0))");
 testInvalidParametersProperty("Color and array.", "a array(0, 0) rgb(255, 0, 0)");
 testInvalidParametersProperty("Color with transform values.", "a rotate(45deg) rgb(255, 0, 0)");
 testInvalidParametersProperty("Color with transform values.", "a rgb(255, 0, 0) rotate(45deg)");
+testInvalidParametersProperty("Color after array values.", "a array(0) rgb(255, 0, 0)");
+testInvalidParametersProperty("Color with mat2.", "a rgb(255, 0, 0) mat2(0, 0, 0, 0)");
+testInvalidParametersProperty("mat2 with mat3.", "a mat2(1, 0, 0, 1) mat3(0, 0, 0, 0, 0, 0, 0, 0, 0)");
 
index 8b6c0ff..f2940f6 100644 (file)
@@ -112,8 +112,62 @@ testParametersProperty("Color hsla function.",
     "c rgba(0, 255, 0, 0.2)",
     ["c rgba(0, 255, 0, 0.2)"]);
 
+heading("Mat2 parameter tests.");
+testParametersProperty("Mat2 parameter.",
+    "m mat2(1, 0, 0, 1)",
+    "m mat2(1, 0, 0, 1)",
+    ["m mat2(1, 0, 0, 1)"]);
+testParametersProperty("Mat2 parameter with negative values.",
+    "m mat2(-1, -1, -1, -1)",
+    "m mat2(-1, -1, -1, -1)",
+    ["m mat2(-1, -1, -1, -1)"]);
+testParametersProperty("Mat2 parameter with negative and positive values.",
+    "m mat2(-1, 1, 1, -1)",
+    "m mat2(-1, 1, 1, -1)",
+    ["m mat2(-1, 1, 1, -1)"]);
+testParametersProperty("Mat2 parameter with multiple signed floats.",
+    "m mat2(1, -2.2, 3.14, 0.4)",
+    "m mat2(1, -2.2, 3.14, 0.4)",
+    ["m mat2(1, -2.2, 3.14, 0.4)"]);
+
+heading("Mat3 parameter tests.");
+testParametersProperty("Mat3 parameter.",
+    "m mat3(1, 0, 0, 0, 1, 0, 0, 0, 1)",
+    "m mat3(1, 0, 0, 0, 1, 0, 0, 0, 1)",
+    ["m mat3(1, 0, 0, 0, 1, 0, 0, 0, 1)"]);
+testParametersProperty("Mat3 parameter with negative values.",
+    "m mat3(-1, -1, -1, -1, -1, -1, -1, -1, -1)",
+    "m mat3(-1, -1, -1, -1, -1, -1, -1, -1, -1)",
+    ["m mat3(-1, -1, -1, -1, -1, -1, -1, -1, -1)"]);
+testParametersProperty("Mat3 parameter with negative and positive values.",
+    "m mat3(-1, 1, 1, -1, -1, 1, 1, -1, 1)",
+    "m mat3(-1, 1, 1, -1, -1, 1, 1, -1, 1)",
+    ["m mat3(-1, 1, 1, -1, -1, 1, 1, -1, 1)"]);
+testParametersProperty("Mat3 parameter with multiple signed floats.",
+    "m mat3(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1)",
+    "m mat3(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1)",
+    ["m mat3(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1)"]);
+
+heading("Mat4 parameter tests.");
+testParametersProperty("Mat4 parameter.",
+    "m mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)",
+    "m mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)",
+    ["m mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)"]);
+testParametersProperty("Mat4 parameter with negative values.",
+    "m mat4(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)",
+    "m mat4(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)",
+    ["m mat4(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)"]);
+testParametersProperty("Mat4 parameter with negative and positive values.",
+    "m mat4(-1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1)",
+    "m mat4(-1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1)",
+    ["m mat4(-1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1)"]);
+testParametersProperty("Mat4 parameter with multiple signed floats.",
+    "m mat4(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4)",
+    "m mat4(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4)",
+    ["m mat4(1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4, 1, -2.2, 3.14, 0.4)"]);
+
 heading("Combined parameter tests.");
-testParametersProperty("Number parameter, color parameter, transform parameter and array parameter.",
-    "n 1, c rgb(0, 128, 0), t rotate(0deg), a array(1)",
-    "n 1, c rgb(0, 128, 0), t rotate(0deg), a array(1)",
-    ["n 1", "c rgb(0, 128, 0)", "t rotate(0deg)", "a array(1)"]);
\ No newline at end of file
+testParametersProperty("Number parameter, color parameter, transform parameter, matrix parameters and array parameter.",
+    "n 1, c rgb(0, 128, 0), t rotate(0deg), m1 mat2(1, 0, 0, 1), m2 mat3(1, 0, 0, 0, 1, 0, 0, 0, 1), m3 mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), a array(1)",
+    "n 1, c rgb(0, 128, 0), t rotate(0deg), m1 mat2(1, 0, 0, 1), m2 mat3(1, 0, 0, 0, 1, 0, 0, 0, 1), m3 mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), a array(1)",
+    ["n 1", "c rgb(0, 128, 0)", "t rotate(0deg)", "m1 mat2(1, 0, 0, 1)", "m2 mat3(1, 0, 0, 0, 1, 0, 0, 0, 1)", "m3 mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)", "a array(1)"]);
\ No newline at end of file
index 95221f2..a11a006 100644 (file)
@@ -1,3 +1,65 @@
+2013-04-21  Dirk Schulze  <krit@webkit.org>
+
+        [Part 4] Parse the custom() function in -webkit-filter: parse the matN() functions
+        https://bugs.webkit.org/show_bug.cgi?id=71444
+
+        Reviewed by Dean Jackson.
+
+        Custom filter parameters should support mat2 to mat4 value functions. Added parsing
+        and style resolving bits to support the matrix function values. A later patch will
+        add the matrices to the shader program.
+
+        https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html#custom-filter-parameters
+
+        Modified existing tests to cover changes.
+
+        * GNUmakefile.list.am: Added WebKitCSSMatFunctionValue to individual build systems.
+        * Target.pri:
+        * WebCore.vcproj/WebCore.vcproj:
+        * WebCore.vcxproj/WebCore.vcxproj:
+        * WebCore.vcxproj/WebCore.vcxproj.filters:
+        * WebCore.xcodeproj/project.pbxproj:
+        * css/CSSComputedStyleDeclaration.cpp:
+        (WebCore::valueForCustomFilterMatParameter):
+        (WebCore):
+        (WebCore::valueForCustomFilterParameter):
+        * css/CSSParser.cpp:
+        (WebCore::CSSParser::parseTransform):
+        (WebCore::CSSParser::parseMatValue):
+        (WebCore):
+        (WebCore::CSSParser::parseCustomFilterParameters):
+        * css/CSSParser.h:
+        (WebCore):
+        * css/CSSValue.cpp:
+        (WebCore::CSSValue::reportMemoryUsage):
+        (WebCore::CSSValue::equals):
+        (WebCore::CSSValue::cssText):
+        (WebCore::CSSValue::destroy):
+        (WebCore::CSSValue::cloneForCSSOM):
+        * css/CSSValue.h:
+        (WebCore::CSSValue::isWebKitCSSMatFunctionValue):
+        * css/StyleResolver.cpp:
+        (WebCore::StyleResolver::parseCustomFilterArrayParameter):
+        (WebCore::StyleResolver::parseCustomFilterParameter):
+        * css/StyleResolver.h:
+        (StyleResolver):
+        * css/WebKitCSSMatFunctionValue.cpp:
+        (WebCore::WebKitCSSMatFunctionValue::WebKitCSSMatFunctionValue):
+        (WebCore::WebKitCSSMatFunctionValue::customCssText):
+        (WebCore::WebKitCSSMatFunctionValue::cloneForCSSOM):
+        (WebCore::WebKitCSSMatFunctionValue::equals):
+        (WebCore::WebKitCSSMatFunctionValue::reportDescendantMemoryUsage):
+        * css/WebKitCSSMatFunctionValue.h:
+        (WebKitCSSMatFunctionValue):
+        (WebCore::WebKitCSSMatFunctionValue::create):
+        * platform/graphics/filters/CustomFilterArrayParameter.h:
+        (WebCore::CustomFilterArrayParameter::create):
+        (WebCore::CustomFilterArrayParameter::CustomFilterArrayParameter):
+        * platform/graphics/filters/CustomFilterParameter.h:
+        (CustomFilterParameter):
+        * platform/graphics/filters/CustomFilterRenderer.cpp:
+        (WebCore::CustomFilterRenderer::bindProgramParameters):
+
 2013-04-12  Balazs Kelemen  <kbalazs@webkit.org>
 
         [GStreamer] Media attribute preload="none" is not honored
index d233ee1..cc85b5c 100644 (file)
@@ -2784,6 +2784,8 @@ webcore_sources += \
        Source/WebCore/css/WebKitCSSKeyframesRule.h \
        Source/WebCore/css/WebKitCSSMatrix.cpp \
        Source/WebCore/css/WebKitCSSMatrix.h \
+       Source/WebCore/css/WebKitCSSMatFunctionValue.cpp \
+       Source/WebCore/css/WebKitCSSMatFunctionValue.h \
        Source/WebCore/css/WebKitCSSMixFunctionValue.cpp \
        Source/WebCore/css/WebKitCSSMixFunctionValue.h \
        Source/WebCore/css/WebKitCSSRegionRule.cpp \
index 27a60d2..a29bfe0 100644 (file)
@@ -351,6 +351,7 @@ SOURCES += \
     css/WebKitCSSKeyframeRule.cpp \
     css/WebKitCSSKeyframesRule.cpp \
     css/WebKitCSSMatrix.cpp \
+    css/WebKitCSSMatFunctionValue.cpp \
     css/WebKitCSSMixFunctionValue.cpp \
     css/WebKitCSSRegionRule.cpp \
     css/WebKitCSSSVGDocumentValue.cpp \
@@ -1592,6 +1593,7 @@ HEADERS += \
     css/WebKitCSSKeyframeRule.h \
     css/WebKitCSSKeyframesRule.h \
     css/WebKitCSSMatrix.h \
+    css/WebKitCSSMatFunctionValue.h \
     css/WebKitCSSMixFunctionValue.h \
     css/WebKitCSSRegionRule.h \
     css/WebKitCSSSVGDocumentValue.h \
index 3feff39..c273a13 100755 (executable)
                                >
                        </File>
                        <File
+                               RelativePath="..\css\WebKitCSSMatFunctionValue.cpp"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\css\WebKitCSSMatFunctionValue.h"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\css\WebKitCSSMixFunctionValue.cpp"
                                >
                        </File>
index aeccc1d..e6f8378 100644 (file)
     <ClCompile Include="..\css\WebKitCSSKeyframeRule.cpp" />
     <ClCompile Include="..\css\WebKitCSSKeyframesRule.cpp" />
     <ClCompile Include="..\css\WebKitCSSMatrix.cpp" />
+    <ClCompile Include="..\css\WebKitCSSMatFunctionValue.cpp" />
     <ClCompile Include="..\css\WebKitCSSMixFunctionValue.cpp" />
     <ClCompile Include="..\css\WebKitCSSRegionRule.cpp" />
     <ClCompile Include="..\css\WebKitCSSShaderValue.cpp" />
     <ClInclude Include="..\css\WebKitCSSKeyframeRule.h" />
     <ClInclude Include="..\css\WebKitCSSKeyframesRule.h" />
     <ClInclude Include="..\css\WebKitCSSMatrix.h" />
+    <ClInclude Include="..\css\WebKitCSSMatFunctionValue.h" />
     <ClInclude Include="..\css\WebKitCSSMixFunctionValue.h" />
     <ClInclude Include="..\css\WebKitCSSRegionRule.h" />
     <ClInclude Include="..\css\WebKitCSSShaderValue.h" />
index 3418f6c..1258031 100644 (file)
     <ClCompile Include="..\css\WebKitCSSMatrix.cpp">
       <Filter>css</Filter>
     </ClCompile>
+    <ClCompile Include="..\css\WebKitCSSMatFunctionValue.cpp">
+      <Filter>css</Filter>
+    </ClCompile>
     <ClCompile Include="..\css\WebKitCSSMixFunctionValue.cpp">
       <Filter>css</Filter>
     </ClCompile>
     <ClInclude Include="..\css\WebKitCSSMatrix.h">
       <Filter>css</Filter>
     </ClInclude>
+    <ClInclude Include="..\css\WebKitCSSMatFunctionValue.h">
+      <Filter>css</Filter>
+    </ClInclude>
     <ClInclude Include="..\css\WebKitCSSMixFunctionValue.h">
       <Filter>css</Filter>
     </ClInclude>
index e992b5e..e5be1af 100644 (file)
                FB484F4C171F821E00040755 /* TransformFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FB484F4A171F821E00040755 /* TransformFunctions.cpp */; };
                FB484F4D171F821E00040755 /* TransformFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = FB484F4B171F821E00040755 /* TransformFunctions.h */; };
                FB49C39D16784947007FFB5D /* CSSHostRule.h in Headers */ = {isa = PBXBuildFile; fileRef = FB49C39C16784947007FFB5D /* CSSHostRule.h */; };
+               FB719C3F17238CA80022DE34 /* WebKitCSSMatFunctionValue.h in Headers */ = {isa = PBXBuildFile; fileRef = FB0B75EF1723428500F05D2A /* WebKitCSSMatFunctionValue.h */; };
+               FB719C4017238CAE0022DE34 /* WebKitCSSMatFunctionValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FB0B75EE1723428500F05D2A /* WebKitCSSMatFunctionValue.cpp */; };
                FB78AD2E151BF5E600FE54D3 /* CSSParserMode.h in Headers */ = {isa = PBXBuildFile; fileRef = FB78AD2C151BF5D200FE54D3 /* CSSParserMode.h */; settings = {ATTRIBUTES = (Private, ); }; };
                FB91392416AE4C17001FE682 /* DOMPath.h in Headers */ = {isa = PBXBuildFile; fileRef = FB91392016AE4B0B001FE682 /* DOMPath.h */; };
                FB91392616AE4C2F001FE682 /* CanvasPathMethods.h in Headers */ = {isa = PBXBuildFile; fileRef = FB91391F16AE4B0B001FE682 /* CanvasPathMethods.h */; };
                FABE72FB1059C21100D999DD /* MathMLElementFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MathMLElementFactory.cpp; sourceTree = "<group>"; };
                FABE72FC1059C21100D999DD /* MathMLNames.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MathMLNames.cpp; sourceTree = "<group>"; };
                FB1A66D917225A6600BAA7AF /* CustomFilterColorParameter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CustomFilterColorParameter.h; path = filters/CustomFilterColorParameter.h; sourceTree = "<group>"; };
+               FB0B75EE1723428500F05D2A /* WebKitCSSMatFunctionValue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebKitCSSMatFunctionValue.cpp; sourceTree = "<group>"; };
+               FB0B75EF1723428500F05D2A /* WebKitCSSMatFunctionValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebKitCSSMatFunctionValue.h; sourceTree = "<group>"; };
                FB2C15C2165D64900039C9F8 /* CachedSVGDocumentReference.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CachedSVGDocumentReference.h; sourceTree = "<group>"; };
                FB3056C1169E5DAC0096A232 /* CSSGroupingRule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSGroupingRule.h; sourceTree = "<group>"; };
                FB484F4A171F821E00040755 /* TransformFunctions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TransformFunctions.cpp; sourceTree = "<group>"; };
                                31288E700E3005D6003619AE /* WebKitCSSKeyframesRule.cpp */,
                                31288E710E3005D6003619AE /* WebKitCSSKeyframesRule.h */,
                                316FE0920E6CCD7F00BF6088 /* WebKitCSSKeyframesRule.idl */,
+                               FB0B75EE1723428500F05D2A /* WebKitCSSMatFunctionValue.cpp */,
+                               FB0B75EF1723428500F05D2A /* WebKitCSSMatFunctionValue.h */,
                                498391550F1E776900C23782 /* WebKitCSSMatrix.cpp */,
                                498391560F1E776900C23782 /* WebKitCSSMatrix.h */,
                                498391570F1E776900C23782 /* WebKitCSSMatrix.idl */,
                                BE8EF045171C8FF9009B48C3 /* JSAudioTrackList.h in Headers */,
                                BE8EF04B171C9014009B48C3 /* JSVideoTrack.h in Headers */,
                                BE8EF04D171C9014009B48C3 /* JSVideoTrackList.h in Headers */,
+                               FB719C3F17238CA80022DE34 /* WebKitCSSMatFunctionValue.h in Headers */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                                BE6DF70D171CA2C500DD52B8 /* JSVideoTrackListCustom.cpp in Sources */,
                                BE6DF711171CA2DA00DD52B8 /* JSAudioTrackCustom.cpp in Sources */,
                                BE6DF713171CA2DA00DD52B8 /* JSAudioTrackListCustom.cpp in Sources */,
+                               FB719C4017238CAE0022DE34 /* WebKitCSSMatFunctionValue.cpp in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
index c10a65a..08f6909 100644 (file)
@@ -78,6 +78,7 @@
 #include "CustomFilterParameter.h"
 #include "CustomFilterTransformParameter.h"
 #include "WebKitCSSArrayFunctionValue.h"
+#include "WebKitCSSMatFunctionValue.h"
 #include "WebKitCSSMixFunctionValue.h"
 #endif
 
@@ -840,6 +841,14 @@ static PassRefPtr<CSSValue> valueForCustomFilterArrayParameter(const CustomFilte
     return arrayParameterValue.release();
 }
 
+static PassRefPtr<CSSValue> valueForCustomFilterMatParameter(const CustomFilterArrayParameter* matrixParameter)
+{
+    RefPtr<WebKitCSSMatFunctionValue> matrixParameterValue = WebKitCSSMatFunctionValue::create();
+    for (unsigned i = 0, size = matrixParameter->size(); i < size; ++i)
+        matrixParameterValue->append(cssValuePool().createValue(matrixParameter->valueAt(i), CSSPrimitiveValue::CSS_NUMBER));
+    return matrixParameterValue.release();
+}
+
 static PassRefPtr<CSSValue> valueForCustomFilterColorParameter(const CustomFilterColorParameter* colorParameter)
 {
     RefPtr<CSSValueList> colorParameterValue = CSSValueList::createSpaceSeparated();
@@ -873,6 +882,8 @@ static PassRefPtr<CSSValue> valueForCustomFilterParameter(const RenderObject* re
         return valueForCustomFilterArrayParameter(static_cast<const CustomFilterArrayParameter*>(parameter));
     case CustomFilterParameter::COLOR:
         return valueForCustomFilterColorParameter(static_cast<const CustomFilterColorParameter*>(parameter));
+    case CustomFilterParameter::MATRIX:
+        return valueForCustomFilterMatParameter(static_cast<const CustomFilterArrayParameter*>(parameter));
     case CustomFilterParameter::NUMBER:
         return valueForCustomFilterNumberParameter(static_cast<const CustomFilterNumberParameter*>(parameter));
     case CustomFilterParameter::TRANSFORM:
index a918450..16ea73c 100644 (file)
 
 #if ENABLE(CSS_SHADERS)
 #include "WebKitCSSArrayFunctionValue.h"
+#include "WebKitCSSMatFunctionValue.h"
 #include "WebKitCSSMixFunctionValue.h"
 #include "WebKitCSSShaderValue.h"
 #endif
@@ -8307,7 +8308,6 @@ PassRefPtr<CSSValueList> CSSParser::parseTransform()
 
     return list.release();
 }
-    
 
 PassRefPtr<CSSValue> CSSParser::parseTransformValue(CSSParserValue *value)
 {
@@ -8465,6 +8465,48 @@ PassRefPtr<WebKitCSSArrayFunctionValue> CSSParser::parseCustomFilterArrayFunctio
     return arrayFunction;
 }
 
+PassRefPtr<WebKitCSSMatFunctionValue> CSSParser::parseMatValue(CSSParserValue* value)
+{
+    if (value->unit != CSSParserValue::Function || !value->function)
+        return 0;
+
+    unsigned numberOfValues = 0;
+    if (equalIgnoringCase(value->function->name, "mat2("))
+        numberOfValues = 4;
+    else if (equalIgnoringCase(value->function->name, "mat3("))
+        numberOfValues = 9;
+    else if (equalIgnoringCase(value->function->name, "mat4("))
+        numberOfValues = 16;
+    else
+        return 0;
+
+    CSSParserValueList* args = value->function->args.get();
+    if (!args || args->size() != (numberOfValues * 2 - 1))
+        return 0;
+
+    RefPtr<WebKitCSSMatFunctionValue> matValueList = WebKitCSSMatFunctionValue::create();
+    CSSParserValue* arg = args->current();
+    while (arg) {
+        if (!validUnit(arg, FNumber, CSSStrictMode))
+            return 0;
+        matValueList->append(cssValuePool().createValue(arg->fValue, CSSPrimitiveValue::CSS_NUMBER));
+        arg = args->next();
+
+        if (!arg)
+            break;
+
+        if (!isComma(arg))
+            return 0;
+
+        arg = args->next();
+    }
+
+    if (!matValueList || matValueList->length() != numberOfValues)
+        return 0;
+
+    return matValueList.release();
+}
+
 PassRefPtr<WebKitCSSMixFunctionValue> CSSParser::parseMixFunction(CSSParserValue* value)
 {
     ASSERT(value->unit == CSSParserValue::Function && value->function);
@@ -8552,14 +8594,19 @@ PassRefPtr<CSSValueList> CSSParser::parseCustomFilterParameters(CSSParserValueLi
         if (arg->unit == CSSParserValue::Function && arg->function) {
             // FIXME: Implement parsing for the other parameter types.
             // textures: https://bugs.webkit.org/show_bug.cgi?id=71442
-            // mat2, mat3, mat4: https://bugs.webkit.org/show_bug.cgi?id=71444
             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 {
+                // Parse mat2, mat3 and mat4 functions.
+                parameterValue = parseMatValue(arg);
+                if (!parameterValue && arg)
+                    parameterValue = parseCustomFilterTransform(argsList);
+                else if (parameterValue)
+                    argsList->next();
+            }
         } else if (validUnit(arg, FNumber, CSSStrictMode)) {
             RefPtr<CSSValueList> paramValueList = CSSValueList::createSpaceSeparated();
             while (arg) {
index 79826db..003e360 100644 (file)
@@ -68,6 +68,7 @@ class StyledElement;
 
 #if ENABLE(CSS_SHADERS)
 class WebKitCSSArrayFunctionValue;
+class WebKitCSSMatFunctionValue;
 class WebKitCSSMixFunctionValue;
 class WebKitCSSShaderValue;
 #endif
@@ -246,6 +247,7 @@ public:
     PassRefPtr<CSSValueList> parseFilter();
     PassRefPtr<WebKitCSSFilterValue> parseBuiltinFilterArguments(CSSParserValueList*, WebKitCSSFilterValue::FilterOperationType);
 #if ENABLE(CSS_SHADERS)
+    PassRefPtr<WebKitCSSMatFunctionValue> parseMatValue(CSSParserValue*);
     PassRefPtr<WebKitCSSMixFunctionValue> parseMixFunction(CSSParserValue*);
     PassRefPtr<WebKitCSSArrayFunctionValue> parseCustomFilterArrayFunction(CSSParserValue*);
     PassRefPtr<CSSValueList> parseCustomFilterTransform(CSSParserValueList*);
index c8f9798..58f7656 100644 (file)
@@ -58,6 +58,7 @@
 #include "WebCoreMemoryInstrumentation.h"
 #include "WebKitCSSArrayFunctionValue.h"
 #include "WebKitCSSFilterValue.h"
+#include "WebKitCSSMatFunctionValue.h"
 #include "WebKitCSSMixFunctionValue.h"
 #include "WebKitCSSShaderValue.h"
 #include "WebKitCSSTransformValue.h"
@@ -233,6 +234,9 @@ void CSSValue::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
     case WebKitCSSArrayFunctionValueClass:
         static_cast<const WebKitCSSArrayFunctionValue*>(this)->reportDescendantMemoryUsage(memoryObjectInfo);
         return;
+    case WebKitCSSMatFunctionValueClass:
+        static_cast<const WebKitCSSMatFunctionValue*>(this)->reportDescendantMemoryUsage(memoryObjectInfo);
+        return;
     case WebKitCSSMixFunctionValueClass:
         static_cast<const WebKitCSSMixFunctionValue*>(this)->reportDescendantMemoryUsage(memoryObjectInfo);
         return;
@@ -351,6 +355,8 @@ bool CSSValue::equals(const CSSValue& other) const
 #if ENABLE(CSS_SHADERS)
         case WebKitCSSArrayFunctionValueClass:
             return compareCSSValues<WebKitCSSArrayFunctionValue>(*this, other);
+        case WebKitCSSMatFunctionValueClass:
+            return compareCSSValues<WebKitCSSMatFunctionValue>(*this, other);
         case WebKitCSSMixFunctionValueClass:
             return compareCSSValues<WebKitCSSMixFunctionValue>(*this, other);
         case WebKitCSSShaderClass:
@@ -449,6 +455,8 @@ String CSSValue::cssText() const
 #if ENABLE(CSS_SHADERS)
     case WebKitCSSArrayFunctionValueClass:
         return static_cast<const WebKitCSSArrayFunctionValue*>(this)->customCssText();
+    case WebKitCSSMatFunctionValueClass:
+        return static_cast<const WebKitCSSMatFunctionValue*>(this)->customCssText();
     case WebKitCSSMixFunctionValueClass:
         return static_cast<const WebKitCSSMixFunctionValue*>(this)->customCssText();
     case WebKitCSSShaderClass:
@@ -588,6 +596,9 @@ void CSSValue::destroy()
     case WebKitCSSArrayFunctionValueClass:
         delete static_cast<WebKitCSSArrayFunctionValue*>(this);
         return;
+    case WebKitCSSMatFunctionValueClass:
+        delete static_cast<WebKitCSSMatFunctionValue*>(this);
+        return;
     case WebKitCSSMixFunctionValueClass:
         delete static_cast<WebKitCSSMixFunctionValue*>(this);
         return;
@@ -632,6 +643,8 @@ PassRefPtr<CSSValue> CSSValue::cloneForCSSOM() const
 #if ENABLE(CSS_SHADERS)
     case WebKitCSSArrayFunctionValueClass:
         return static_cast<const WebKitCSSArrayFunctionValue*>(this)->cloneForCSSOM();
+    case WebKitCSSMatFunctionValueClass:
+        return static_cast<const WebKitCSSMatFunctionValue*>(this)->cloneForCSSOM();
     case WebKitCSSMixFunctionValueClass:
         return static_cast<const WebKitCSSMixFunctionValue*>(this)->cloneForCSSOM();
 #endif
index 8d5425d..beb5707 100644 (file)
@@ -95,6 +95,7 @@ public:
     bool isWebKitCSSFilterValue() const { return m_classType == WebKitCSSFilterClass; }
 #if ENABLE(CSS_SHADERS)
     bool isWebKitCSSArrayFunctionValue() const { return m_classType == WebKitCSSArrayFunctionValueClass; }
+    bool isWebKitCSSMatFunctionValue() const { return m_classType == WebKitCSSMatFunctionValueClass; }
     bool isWebKitCSSMixFunctionValue() const { return m_classType == WebKitCSSMixFunctionValueClass; }
     bool isWebKitCSSShaderValue() const { return m_classType == WebKitCSSShaderClass; }
 #endif
@@ -186,6 +187,7 @@ protected:
         WebKitCSSFilterClass,
 #if ENABLE(CSS_SHADERS)
         WebKitCSSArrayFunctionValueClass,
+        WebKitCSSMatFunctionValueClass,
         WebKitCSSMixFunctionValueClass,
 #endif
 #endif
index d4c49bf..eab3bed 100644 (file)
@@ -3679,9 +3679,9 @@ static bool sortParametersByNameComparator(const RefPtr<CustomFilterParameter>&
     return codePointCompareLessThan(a->name(), b->name());
 }
 
-PassRefPtr<CustomFilterParameter> StyleResolver::parseCustomFilterArrayParameter(const String& name, CSSValueList* values)
+PassRefPtr<CustomFilterParameter> StyleResolver::parseCustomFilterArrayParameter(const String& name, CSSValueList* values, bool isArray)
 {
-    RefPtr<CustomFilterArrayParameter> arrayParameter = CustomFilterArrayParameter::create(name);
+    RefPtr<CustomFilterArrayParameter> arrayParameter = CustomFilterArrayParameter::create(name, isArray ? CustomFilterArrayParameter::ARRAY : CustomFilterArrayParameter::MATRIX);
     for (unsigned i = 0, length = values->length(); i < length; ++i) {
         CSSValue* value = values->itemWithoutBoundsCheck(i);
         if (!value->isPrimitiveValue())
@@ -3742,7 +3742,10 @@ PassRefPtr<CustomFilterParameter> StyleResolver::parseCustomFilterParameter(cons
         return 0;
 
     if (parameterValue->isWebKitCSSArrayFunctionValue())
-        return parseCustomFilterArrayParameter(name, values);
+        return parseCustomFilterArrayParameter(name, values, true);
+
+    if (parameterValue->isWebKitCSSMatFunctionValue())
+        return parseCustomFilterArrayParameter(name, values, false);
 
     // If the first value of the list is a transform function,
     // then we could safely assume that all the remaining items
index c240321..ab2d7ba 100644 (file)
@@ -314,8 +314,8 @@ public:
     StyleShader* cachedOrPendingStyleShaderFromValue(WebKitCSSShaderValue*);
     bool parseCustomFilterParameterList(CSSValue*, CustomFilterParameterList&);
     PassRefPtr<CustomFilterParameter> parseCustomFilterParameter(const String& name, CSSValue*);
-    PassRefPtr<CustomFilterParameter> parseCustomFilterArrayParameter(const String& name, CSSValueList*);
     PassRefPtr<CustomFilterParameter> parseCustomFilterColorParameter(const String& name, CSSValueList*);
+    PassRefPtr<CustomFilterParameter> parseCustomFilterArrayParameter(const String& name, CSSValueList*, bool);
     PassRefPtr<CustomFilterParameter> parseCustomFilterNumberParameter(const String& name, CSSValueList*);
     PassRefPtr<CustomFilterParameter> parseCustomFilterTransformParameter(const String& name, CSSValueList*);
     PassRefPtr<CustomFilterOperation> createCustomFilterOperationWithAtRuleReferenceSyntax(WebKitCSSFilterValue*);
diff --git a/Source/WebCore/css/WebKitCSSMatFunctionValue.cpp b/Source/WebCore/css/WebKitCSSMatFunctionValue.cpp
new file mode 100644 (file)
index 0000000..d07d6af
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2013 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 "WebKitCSSMatFunctionValue.h"
+
+#include "WebCoreMemoryInstrumentation.h"
+
+#if ENABLE(CSS_SHADERS)
+
+namespace WebCore {
+
+WebKitCSSMatFunctionValue::WebKitCSSMatFunctionValue()
+    : CSSValueList(WebKitCSSMatFunctionValueClass, CommaSeparator)
+{
+}
+
+WebKitCSSMatFunctionValue::WebKitCSSMatFunctionValue(const WebKitCSSMatFunctionValue& cloneFrom)
+    : CSSValueList(cloneFrom)
+{
+}
+
+String WebKitCSSMatFunctionValue::customCssText() const
+{
+    StringBuilder builder;
+    if (length() == 4)
+        builder.append("mat2(");
+    else if (length() == 9)
+        builder.append("mat3(");
+    else if (length() == 16)
+        builder.append("mat4(");
+    else {
+        ASSERT_NOT_REACHED();
+        return String();
+    }
+
+    builder.append(CSSValueList::customCssText());
+    builder.append(')');
+    return builder.toString();
+}
+
+PassRefPtr<WebKitCSSMatFunctionValue> WebKitCSSMatFunctionValue::cloneForCSSOM() const
+{
+    return adoptRef(new WebKitCSSMatFunctionValue(*this));
+}
+
+bool WebKitCSSMatFunctionValue::equals(const WebKitCSSMatFunctionValue& other) const
+{
+    return CSSValueList::equals(other);
+}
+
+void WebKitCSSMatFunctionValue::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/WebKitCSSMatFunctionValue.h b/Source/WebCore/css/WebKitCSSMatFunctionValue.h
new file mode 100644 (file)
index 0000000..da22f4c
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2013 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 WebKitCSSMatFunctionValue_h
+#define WebKitCSSMatFunctionValue_h
+
+#if ENABLE(CSS_SHADERS)
+
+#include "CSSValueList.h"
+#include <wtf/PassRefPtr.h>
+
+namespace WebCore {
+
+class WebKitCSSMatFunctionValue : public CSSValueList {
+public:
+    static PassRefPtr<WebKitCSSMatFunctionValue> create()
+    {
+        return adoptRef(new WebKitCSSMatFunctionValue());
+    }
+
+    String customCssText() const;
+
+    PassRefPtr<WebKitCSSMatFunctionValue> cloneForCSSOM() const;
+
+    bool equals(const WebKitCSSMatFunctionValue&) const;
+
+    void reportDescendantMemoryUsage(MemoryObjectInfo*) const;
+
+private:
+    WebKitCSSMatFunctionValue();
+    WebKitCSSMatFunctionValue(const WebKitCSSMatFunctionValue& cloneFrom);
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(CSS_SHADERS)
+
+#endif
index 3050cb4..df690a0 100644 (file)
@@ -39,9 +39,9 @@ namespace WebCore {
 
 class CustomFilterArrayParameter : public CustomFilterParameter {
 public:
-    static PassRefPtr<CustomFilterArrayParameter> create(const String& name)
+    static PassRefPtr<CustomFilterArrayParameter> create(const String& name, CustomFilterParameter::ParameterType parameterType = CustomFilterParameter::ARRAY)
     {
-        return adoptRef(new CustomFilterArrayParameter(name));
+        return adoptRef(new CustomFilterArrayParameter(parameterType, name));
     }
 
     unsigned size() const { return m_data.size(); }
@@ -76,8 +76,8 @@ public:
     }
 
 private:
-    CustomFilterArrayParameter(const String& name)
-        : CustomFilterParameter(ARRAY, name)
+    CustomFilterArrayParameter(ParameterType parameterType, const String& name)
+        : CustomFilterParameter(parameterType, name)
     {
     }
 
index 45923b1..3bab2d8 100644 (file)
@@ -41,10 +41,10 @@ class CustomFilterParameter : public RefCounted<CustomFilterParameter> {
 public:
     // FIXME: Implement other parameters types:
     // textures: https://bugs.webkit.org/show_bug.cgi?id=71442
-    // mat2, mat3, mat4: https://bugs.webkit.org/show_bug.cgi?id=71444
     enum ParameterType {
         ARRAY,
         COLOR,
+        MATRIX,
         NUMBER,
         TRANSFORM
     };
index 40f4395..b7c78b5 100644 (file)
@@ -215,8 +215,9 @@ void CustomFilterRenderer::bindProgramParameters()
         case CustomFilterParameter::ARRAY:
             bindProgramArrayParameters(uniformLocation, static_cast<CustomFilterArrayParameter*>(parameter));
             break;
-        case CustomFilterParameter::COLOR:
-            // FIXME: Bind color to context.
+        case CustomFilterParameter::COLOR:        
+        case CustomFilterParameter::MATRIX:
+            // FIXME: Bind color and matrix to context.
             break;
         case CustomFilterParameter::NUMBER:
             bindProgramNumberParameters(uniformLocation, static_cast<CustomFilterNumberParameter*>(parameter));