From 5d2801f00d96ac6cbc0df740054ba8a843b95437 Mon Sep 17 00:00:00 2001 From: Tetsuaki Hamano Date: Tue, 16 Aug 2022 22:42:10 +0900 Subject: [PATCH 1/7] KSES: Add support for rgba background-color. --- src/wp-includes/kses.php | 18 ++++++++++++++++++ tests/phpunit/tests/kses.php | 25 +++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/wp-includes/kses.php b/src/wp-includes/kses.php index b32df1beaa973..f65b2b6c28a7a 100644 --- a/src/wp-includes/kses.php +++ b/src/wp-includes/kses.php @@ -2395,6 +2395,14 @@ function safecss_filter_attr( $css, $deprecated = '' ) { 'list-style-image', ); + /* + * CSS attributes that accept rgba color data types. + * + */ + $css_rgba_color_data_types = array( + 'background-color', + ); + /* * CSS attributes that accept gradient data types. * @@ -2418,6 +2426,7 @@ function safecss_filter_attr( $css, $deprecated = '' ) { $css_test_string = $css_item; $found = false; $url_attr = false; + $rgba_attr = false; $gradient_attr = false; if ( strpos( $css_item, ':' ) === false ) { @@ -2430,9 +2439,11 @@ function safecss_filter_attr( $css, $deprecated = '' ) { $found = true; $url_attr = in_array( $css_selector, $css_url_data_types, true ); $gradient_attr = in_array( $css_selector, $css_gradient_data_types, true ); + $rgba_attr = in_array( $css_selector, $css_rgba_color_data_types, true ); } } + if ( $found && $url_attr ) { // Simplified: matches the sequence `url(*)`. preg_match_all( '/url\([^)]+\)/', $parts[1], $url_matches ); @@ -2466,6 +2477,13 @@ function safecss_filter_attr( $css, $deprecated = '' ) { } } + if ( $found && $rgba_attr ) { + $css_value = trim( $parts[1] ); + if ( preg_match( '/^rgba\((\d{1,3}%?),\s*(\d{1,3}%?),\s*(\d{1,3}%?),\s*(\d*(?:\.\d+)?)\)$/', $css_value ) ) { + $css_test_string = str_replace( $css_value, '', $css_test_string ); + } + } + if ( $found ) { // Allow CSS calc(). $css_test_string = preg_replace( '/calc\(((?:\([^()]*\)?|[^()])*)\)/', '', $css_test_string ); diff --git a/tests/phpunit/tests/kses.php b/tests/phpunit/tests/kses.php index e6cac09c3b77f..b26072a2b164a 100644 --- a/tests/phpunit/tests/kses.php +++ b/tests/phpunit/tests/kses.php @@ -1110,6 +1110,31 @@ public function data_test_safecss_filter_attr() { 'css' => 'height: expression( body.scrollTop + 50 + "px" )', 'expected' => '', ), + // RGBA background color are allowed. + array( + 'css' => 'background-color: rgba(0,0,0,0)', + 'expected' => 'background-color: rgba(0,0,0,0)', + ), + array( + 'css' => 'background-color: rgba(0, 0, 0, 0)', + 'expected' => 'background-color: rgba(0, 0, 0, 0)', + ), + array( + 'css' => 'background-color: rgba(100, 100, 100, 0)', + 'expected' => 'background-color: rgba(100, 100, 100, 0)', + ), + array( + 'css' => 'background-color: rgba(10%, 10%, 10%, 0)', + 'expected' => 'background-color: rgba(10%, 10%, 10%, 0)', + ), + array( + 'css' => 'background-color: rgba(0, 0, 0, 0.1)', + 'expected' => 'background-color: rgba(0, 0, 0, 0.1)', + ), + array( + 'css' => 'background-color: rgba(0, 0, 0, .1)', + 'expected' => 'background-color: rgba(0, 0, 0, .1)', + ), // RGB color values are not allowed. array( 'css' => 'color: rgb( 100, 100, 100 )', From 692f37a263225c6ba2816db674dde6f2f619a9ed Mon Sep 17 00:00:00 2001 From: Tetsuaki Hamano Date: Wed, 17 Aug 2022 00:44:17 +0900 Subject: [PATCH 2/7] Fix lint error --- src/wp-includes/kses.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/wp-includes/kses.php b/src/wp-includes/kses.php index f65b2b6c28a7a..8f573d7f70972 100644 --- a/src/wp-includes/kses.php +++ b/src/wp-includes/kses.php @@ -2443,7 +2443,6 @@ function safecss_filter_attr( $css, $deprecated = '' ) { } } - if ( $found && $url_attr ) { // Simplified: matches the sequence `url(*)`. preg_match_all( '/url\([^)]+\)/', $parts[1], $url_matches ); From c9b2fb585ae6b7a22008eeda1a8935f762312856 Mon Sep 17 00:00:00 2001 From: Tetsuaki Hamano Date: Wed, 17 Aug 2022 15:37:22 +0900 Subject: [PATCH 3/7] support rgb color --- src/wp-includes/kses.php | 20 +++++++--- tests/phpunit/tests/kses.php | 77 +++++++++++++++++++++++++++++------- 2 files changed, 76 insertions(+), 21 deletions(-) diff --git a/src/wp-includes/kses.php b/src/wp-includes/kses.php index 8f573d7f70972..e2bd5ff530637 100644 --- a/src/wp-includes/kses.php +++ b/src/wp-includes/kses.php @@ -2396,10 +2396,18 @@ function safecss_filter_attr( $css, $deprecated = '' ) { ); /* - * CSS attributes that accept rgba color data types. + * CSS attributes that accept rgb(a) color data types. * */ - $css_rgba_color_data_types = array( + $css_color_data_types = array( + 'color', + + 'border-color', + 'border-right-color', + 'border-bottom-color', + 'border-left-color', + 'border-top-color', + 'background-color', ); @@ -2426,7 +2434,7 @@ function safecss_filter_attr( $css, $deprecated = '' ) { $css_test_string = $css_item; $found = false; $url_attr = false; - $rgba_attr = false; + $color_attr = false; $gradient_attr = false; if ( strpos( $css_item, ':' ) === false ) { @@ -2439,7 +2447,7 @@ function safecss_filter_attr( $css, $deprecated = '' ) { $found = true; $url_attr = in_array( $css_selector, $css_url_data_types, true ); $gradient_attr = in_array( $css_selector, $css_gradient_data_types, true ); - $rgba_attr = in_array( $css_selector, $css_rgba_color_data_types, true ); + $color_attr = in_array( $css_selector, $css_color_data_types, true ); } } @@ -2476,9 +2484,9 @@ function safecss_filter_attr( $css, $deprecated = '' ) { } } - if ( $found && $rgba_attr ) { + if ( $found && $color_attr ) { $css_value = trim( $parts[1] ); - if ( preg_match( '/^rgba\((\d{1,3}%?),\s*(\d{1,3}%?),\s*(\d{1,3}%?),\s*(\d*(?:\.\d+)?)\)$/', $css_value ) ) { + if ( preg_match( '/^rgb[a]?\((\d{1,3}%?),\s?(\d{1,3}%?),\s?(\d{1,3}%?)(,\s?|\s\/\s)(\d*(?:\.\d+)?)\)$/', $css_value ) ) { $css_test_string = str_replace( $css_value, '', $css_test_string ); } } diff --git a/tests/phpunit/tests/kses.php b/tests/phpunit/tests/kses.php index b26072a2b164a..34cc5331ab637 100644 --- a/tests/phpunit/tests/kses.php +++ b/tests/phpunit/tests/kses.php @@ -1110,39 +1110,86 @@ public function data_test_safecss_filter_attr() { 'css' => 'height: expression( body.scrollTop + 50 + "px" )', 'expected' => '', ), - // RGBA background color are allowed. + // Allowed RGBA color. array( - 'css' => 'background-color: rgba(0,0,0,0)', - 'expected' => 'background-color: rgba(0,0,0,0)', + 'css' => 'color: rgb(0,0,0,0)', + 'expected' => 'color: rgb(0,0,0,0)', ), array( - 'css' => 'background-color: rgba(0, 0, 0, 0)', - 'expected' => 'background-color: rgba(0, 0, 0, 0)', + 'css' => 'border-color: rgba(0,0,0,0)', + 'expected' => 'border-color: rgba(0,0,0,0)', ), array( - 'css' => 'background-color: rgba(100, 100, 100, 0)', - 'expected' => 'background-color: rgba(100, 100, 100, 0)', + 'css' => 'border-right-color: rgba(0, 0, 0, 0)', + 'expected' => 'border-right-color: rgba(0, 0, 0, 0)', ), array( - 'css' => 'background-color: rgba(10%, 10%, 10%, 0)', - 'expected' => 'background-color: rgba(10%, 10%, 10%, 0)', + 'css' => 'border-bottom-color: rgba(100, 100, 100, 0)', + 'expected' => 'border-bottom-color: rgba(100, 100, 100, 0)', ), array( - 'css' => 'background-color: rgba(0, 0, 0, 0.1)', - 'expected' => 'background-color: rgba(0, 0, 0, 0.1)', + 'css' => 'border-left-color: rgba(10%, 10%, 10%, 0)', + 'expected' => 'border-left-color: rgba(10%, 10%, 10%, 0)', + ), + array( + 'css' => 'border-top-color: rgba(0, 0, 0, 0.1)', + 'expected' => 'border-top-color: rgba(0, 0, 0, 0.1)', ), array( 'css' => 'background-color: rgba(0, 0, 0, .1)', 'expected' => 'background-color: rgba(0, 0, 0, .1)', ), - // RGB color values are not allowed. array( - 'css' => 'color: rgb( 100, 100, 100 )', + 'css' => 'color: rgba(0, 0, 0,.1)', + 'expected' => 'color: rgba(0, 0, 0,.1)', + ), + array( + 'css' => 'border-color: rgba(0, 0, 0 / 0.1)', + 'expected' => 'border-color: rgba(0, 0, 0 / 0.1)', + ), + // Invalid RGBA color. + array( + 'css' => 'color: rg(0, 0, 0, 0)', 'expected' => '', ), - // RGBA color values are not allowed. array( - 'css' => 'color: rgb( 100, 100, 100, .4 )', + 'css' => 'text-decoration-color : rgba(0, 0, 0, 0)', + 'expected' => '', + ), + array( + 'css' => 'border-color: rgba(0 , 0, 0, 0)', + 'expected' => '', + ), + array( + 'css' => 'border-right-color: rgba(0, 0, 0, 0)', + 'expected' => '', + ), + array( + 'css' => 'border-bottom-color: rgba(0, 0, 0/ 0.1 )', + 'expected' => '', + ), + array( + 'css' => 'border-left-color: rgba(0, 0, 0 /0.1 )', + 'expected' => '', + ), + array( + 'css' => 'border-top-color: rgba(0, 0, 0 / 0.1 )', + 'expected' => '', + ), + array( + 'css' => 'background-color: rgba(red, 0, 0, 0)', + 'expected' => '', + ), + array( + 'css' => 'color: rgba(100px, 0, 0, 0)', + 'expected' => '', + ), + array( + 'css' => 'border-right-color: "rgba(0, 0, 0, 0)', + 'expected' => '', + ), + array( + 'css' => "border-bottom-color: 'rgba(0, 0, 0, 0)", 'expected' => '', ), ); From 08e1e31b93b6ceed8cbdfe2ff6a63fd45f922b3c Mon Sep 17 00:00:00 2001 From: Tetsuaki Hamano Date: Thu, 18 Aug 2022 23:53:28 +0900 Subject: [PATCH 4/7] Add missing supports --- src/wp-includes/kses.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/wp-includes/kses.php b/src/wp-includes/kses.php index e2bd5ff530637..64ae7a9f52f51 100644 --- a/src/wp-includes/kses.php +++ b/src/wp-includes/kses.php @@ -2402,12 +2402,18 @@ function safecss_filter_attr( $css, $deprecated = '' ) { $css_color_data_types = array( 'color', + 'border', 'border-color', + 'border-right', 'border-right-color', + 'border-bottom', 'border-bottom-color', + 'border-left', 'border-left-color', + 'border-top', 'border-top-color', + 'background', 'background-color', ); From 8d49e8fb9137e593d65d6e8aa8c58ada3406e970 Mon Sep 17 00:00:00 2001 From: Tetsuaki Hamano Date: Thu, 18 Aug 2022 23:54:05 +0900 Subject: [PATCH 5/7] Relaxed rules for regular expression --- src/wp-includes/kses.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/kses.php b/src/wp-includes/kses.php index 64ae7a9f52f51..d4dea748705c3 100644 --- a/src/wp-includes/kses.php +++ b/src/wp-includes/kses.php @@ -2492,7 +2492,7 @@ function safecss_filter_attr( $css, $deprecated = '' ) { if ( $found && $color_attr ) { $css_value = trim( $parts[1] ); - if ( preg_match( '/^rgb[a]?\((\d{1,3}%?),\s?(\d{1,3}%?),\s?(\d{1,3}%?)(,\s?|\s\/\s)(\d*(?:\.\d+)?)\)$/', $css_value ) ) { + if ( preg_match( '/^rgba?\([\s\d%\/.,]+\)$/', $css_value ) ) { $css_test_string = str_replace( $css_value, '', $css_test_string ); } } From af88ca50ec7d76965b581ade80d61c507132654a Mon Sep 17 00:00:00 2001 From: Tetsuaki Hamano Date: Fri, 19 Aug 2022 00:03:29 +0900 Subject: [PATCH 6/7] Update tests --- tests/phpunit/tests/kses.php | 64 ++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/tests/phpunit/tests/kses.php b/tests/phpunit/tests/kses.php index 34cc5331ab637..6ca8a30d17e96 100644 --- a/tests/phpunit/tests/kses.php +++ b/tests/phpunit/tests/kses.php @@ -1116,72 +1116,72 @@ public function data_test_safecss_filter_attr() { 'expected' => 'color: rgb(0,0,0,0)', ), array( - 'css' => 'border-color: rgba(0,0,0,0)', - 'expected' => 'border-color: rgba(0,0,0,0)', + 'css' => 'border: rgba(0,0,0,0)', + 'expected' => 'border: rgba(0,0,0,0)', ), array( - 'css' => 'border-right-color: rgba(0, 0, 0, 0)', - 'expected' => 'border-right-color: rgba(0, 0, 0, 0)', + 'css' => 'border-color: rgba(0, 0, 0, 0)', + 'expected' => 'border-color: rgba(0, 0, 0, 0)', ), array( - 'css' => 'border-bottom-color: rgba(100, 100, 100, 0)', - 'expected' => 'border-bottom-color: rgba(100, 100, 100, 0)', + 'css' => 'border-right: rgba(100, 100, 100, 0)', + 'expected' => 'border-right: rgba(100, 100, 100, 0)', ), array( - 'css' => 'border-left-color: rgba(10%, 10%, 10%, 0)', - 'expected' => 'border-left-color: rgba(10%, 10%, 10%, 0)', + 'css' => 'border-right-color: rgba(10%, 10%, 10%, 0)', + 'expected' => 'border-right-color: rgba(10%, 10%, 10%, 0)', ), array( - 'css' => 'border-top-color: rgba(0, 0, 0, 0.1)', - 'expected' => 'border-top-color: rgba(0, 0, 0, 0.1)', + 'css' => 'border-bottom: rgba(0, 0, 0, 0.1)', + 'expected' => 'border-bottom: rgba(0, 0, 0, 0.1)', ), array( - 'css' => 'background-color: rgba(0, 0, 0, .1)', - 'expected' => 'background-color: rgba(0, 0, 0, .1)', + 'css' => 'border-bottom-color: rgba(0, 0, 0, .1)', + 'expected' => 'border-bottom-color: rgba(0, 0, 0, .1)', ), array( - 'css' => 'color: rgba(0, 0, 0,.1)', - 'expected' => 'color: rgba(0, 0, 0,.1)', + 'css' => 'border-left: rgba(0, 0, 0,.1)', + 'expected' => 'border-left: rgba(0, 0, 0,.1)', ), array( - 'css' => 'border-color: rgba(0, 0, 0 / 0.1)', - 'expected' => 'border-color: rgba(0, 0, 0 / 0.1)', + 'css' => 'border-left-color: rgba(0, 0, 0 / 0.1)', + 'expected' => 'border-left-color: rgba(0, 0, 0 / 0.1)', ), - // Invalid RGBA color. array( - 'css' => 'color: rg(0, 0, 0, 0)', - 'expected' => '', + 'css' => 'border-top: rgba(0 , 0, 0, 0)', + 'expected' => 'border-top: rgba(0 , 0, 0, 0)', ), array( - 'css' => 'text-decoration-color : rgba(0, 0, 0, 0)', - 'expected' => '', + 'css' => 'border-top-color: rgba(0, 0, 0, 0)', + 'expected' => 'border-top-color: rgba(0, 0, 0, 0)', ), array( - 'css' => 'border-color: rgba(0 , 0, 0, 0)', - 'expected' => '', + 'css' => 'background: rgba(0, 0, 0/ 0.1 )', + 'expected' => 'background: rgba(0, 0, 0/ 0.1 )', ), array( - 'css' => 'border-right-color: rgba(0, 0, 0, 0)', - 'expected' => '', + 'css' => 'background-color: rgba(0, 0, 0 /0.1 )', + 'expected' => 'background-color: rgba(0, 0, 0 /0.1 )', ), array( - 'css' => 'border-bottom-color: rgba(0, 0, 0/ 0.1 )', - 'expected' => '', + 'css' => 'color: rgba(0, 0, 0 / 0.1 )', + 'expected' => 'color: rgba(0, 0, 0 / 0.1 )', ), + // Invalid RGBA color. array( - 'css' => 'border-left-color: rgba(0, 0, 0 /0.1 )', + 'css' => 'border: rg(0, 0, 0, 0)', 'expected' => '', ), array( - 'css' => 'border-top-color: rgba(0, 0, 0 / 0.1 )', + 'css' => 'text-decoration-color : rgba(0, 0, 0, 0)', 'expected' => '', ), array( - 'css' => 'background-color: rgba(red, 0, 0, 0)', + 'css' => 'border-color: rgba(red, 0, 0, 0)', 'expected' => '', ), array( - 'css' => 'color: rgba(100px, 0, 0, 0)', + 'css' => 'border-right: rgba(100px, 0, 0, 0)', 'expected' => '', ), array( @@ -1189,7 +1189,7 @@ public function data_test_safecss_filter_attr() { 'expected' => '', ), array( - 'css' => "border-bottom-color: 'rgba(0, 0, 0, 0)", + 'css' => "border-bottom: 'rgba(0, 0, 0, 0)", 'expected' => '', ), ); From 97fe09e734d9900bd2b92eff31df5b20ddfef45b Mon Sep 17 00:00:00 2001 From: Aki Hamano Date: Thu, 31 Jul 2025 18:33:12 +0900 Subject: [PATCH 7/7] Refactoring regular expressions and tests --- src/wp-includes/kses.php | 5 +- tests/phpunit/tests/kses.php | 150 ++++++++++++++++------------------- 2 files changed, 72 insertions(+), 83 deletions(-) diff --git a/src/wp-includes/kses.php b/src/wp-includes/kses.php index c0c8c5283646e..c58bb0dac4c47 100644 --- a/src/wp-includes/kses.php +++ b/src/wp-includes/kses.php @@ -2697,7 +2697,10 @@ function safecss_filter_attr( $css, $deprecated = '' ) { if ( $found && $color_attr ) { $css_value = trim( $parts[1] ); - if ( preg_match( '/^rgba?\([\s\d%\/.,]+\)$/', $css_value ) ) { + $comma_syntax = '/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i'; + $space_syntax = '/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i'; + + if ( preg_match( $comma_syntax, $css_value ) || preg_match( $space_syntax, $css_value ) ) { $css_test_string = str_replace( $css_value, '', $css_test_string ); } } diff --git a/tests/phpunit/tests/kses.php b/tests/phpunit/tests/kses.php index ca88e55318593..d1ea60490ab86 100644 --- a/tests/phpunit/tests/kses.php +++ b/tests/phpunit/tests/kses.php @@ -1178,88 +1178,7 @@ public function data_safecss_filter_attr() { 'css' => 'height: expression( body.scrollTop + 50 + "px" )', 'expected' => '', ), - // Allowed RGBA color. - array( - 'css' => 'color: rgb(0,0,0,0)', - 'expected' => 'color: rgb(0,0,0,0)', - ), - array( - 'css' => 'border: rgba(0,0,0,0)', - 'expected' => 'border: rgba(0,0,0,0)', - ), - array( - 'css' => 'border-color: rgba(0, 0, 0, 0)', - 'expected' => 'border-color: rgba(0, 0, 0, 0)', - ), - array( - 'css' => 'border-right: rgba(100, 100, 100, 0)', - 'expected' => 'border-right: rgba(100, 100, 100, 0)', - ), - array( - 'css' => 'border-right-color: rgba(10%, 10%, 10%, 0)', - 'expected' => 'border-right-color: rgba(10%, 10%, 10%, 0)', - ), - array( - 'css' => 'border-bottom: rgba(0, 0, 0, 0.1)', - 'expected' => 'border-bottom: rgba(0, 0, 0, 0.1)', - ), - array( - 'css' => 'border-bottom-color: rgba(0, 0, 0, .1)', - 'expected' => 'border-bottom-color: rgba(0, 0, 0, .1)', - ), - array( - 'css' => 'border-left: rgba(0, 0, 0,.1)', - 'expected' => 'border-left: rgba(0, 0, 0,.1)', - ), - array( - 'css' => 'border-left-color: rgba(0, 0, 0 / 0.1)', - 'expected' => 'border-left-color: rgba(0, 0, 0 / 0.1)', - ), - array( - 'css' => 'border-top: rgba(0 , 0, 0, 0)', - 'expected' => 'border-top: rgba(0 , 0, 0, 0)', - ), - array( - 'css' => 'border-top-color: rgba(0, 0, 0, 0)', - 'expected' => 'border-top-color: rgba(0, 0, 0, 0)', - ), - array( - 'css' => 'background: rgba(0, 0, 0/ 0.1 )', - 'expected' => 'background: rgba(0, 0, 0/ 0.1 )', - ), - array( - 'css' => 'background-color: rgba(0, 0, 0 /0.1 )', - 'expected' => 'background-color: rgba(0, 0, 0 /0.1 )', - ), - array( - 'css' => 'color: rgba(0, 0, 0 / 0.1 )', - 'expected' => 'color: rgba(0, 0, 0 / 0.1 )', - ), - // Invalid RGBA color. - array( - 'css' => 'border: rg(0, 0, 0, 0)', - 'expected' => '', - ), - array( - 'css' => 'text-decoration-color : rgba(0, 0, 0, 0)', - 'expected' => '', - ), - array( - 'css' => 'border-color: rgba(red, 0, 0, 0)', - 'expected' => '', - ), - array( - 'css' => 'border-right: rgba(100px, 0, 0, 0)', - 'expected' => '', - ), - array( - 'css' => 'border-right-color: "rgba(0, 0, 0, 0)', - 'expected' => '', - ), - array( - 'css' => "border-bottom: 'rgba(0, 0, 0, 0)", - 'expected' => '', - ), + // Allow min(). array( 'css' => 'width: min(50%, 400px)', @@ -1380,6 +1299,73 @@ public function data_safecss_filter_attr() { 'css' => 'gap: 10px;column-gap: 5px;row-gap: 20px', 'expected' => 'gap: 10px;column-gap: 5px;row-gap: 20px', ), + + // RGB color. + array( + 'css' => 'color: rgb(255, 0, 0)', + 'expected' => 'color: rgb(255, 0, 0)', + ), + array( + 'css' => 'color: rgb(255 0 0)', + 'expected' => 'color: rgb(255 0 0)', + ), + array( + 'css' => 'color: rgb(100%, 0%, 50%)', + 'expected' => 'color: rgb(100%, 0%, 50%)', + ), + array( + 'css' => 'color: rgb(255, 50%, 0)', + 'expected' => 'color: rgb(255, 50%, 0)', + ), + // RGBA color. + array( + 'css' => 'color: rgba(255, 128, 0, 0.5)', + 'expected' => 'color: rgba(255, 128, 0, 0.5)', + ), + array( + 'css' => 'color: rgb(255 128 0 / 50%)', + 'expected' => 'color: rgb(255 128 0 / 50%)', + ), + // RGB color with extra whitespace. + array( + 'css' => 'color: rgb( 255 , 128 , 0 )', + 'expected' => 'color: rgb( 255 , 128 , 0 )', + ), + // RGB background color. + array( + 'css' => 'background-color: rgb(200, 100, 50)', + 'expected' => 'background-color: rgb(200, 100, 50)', + ), + // RGBA border color. + array( + 'css' => 'border-color: rgba(100, 200, 300, 0.8)', + 'expected' => 'border-color: rgba(100, 200, 300, 0.8)', + ), + // Malformed RGB color, invalid number of values. + array( + 'css' => 'color: rgb(255, 128, 0, 0.5, 100)', + 'expected' => '', + ), + array( + 'css' => 'color: rgb(255, 128)', + 'expected' => '', + ), + // Malformed RGB color, non-numeric values. + array( + 'css' => 'color: rgb(red, green, blue)', + 'expected' => '', + ), + // Malformed RGB color, unmatched parentheses. + array( + 'css' => 'color: rgb(255, 128, 0', + 'expected' => '', + ), + // Malformed RGB color, empty values. + array( + 'css' => 'color: rgb(, , )', + 'expected' => '', + ), + // Margin and padding logical properties introduced in 6.1. array( 'css' => 'margin-block-start: 1px;margin-block-end: 2px;margin-inline-start: 3px;margin-inline-end: 4px;',