From a08d133c15951c5c19bfbb7c25d24276ec0f6825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s?= Date: Wed, 21 Oct 2020 13:27:54 +0200 Subject: [PATCH 01/10] Convert the global to a class property --- lib/class-wp-block-supports.php | 42 ++++++++++++++++++++++++++++----- lib/compat.php | 31 ------------------------ 2 files changed, 36 insertions(+), 37 deletions(-) diff --git a/lib/class-wp-block-supports.php b/lib/class-wp-block-supports.php index 8a65dc7464074..7c7cee2dd8161 100644 --- a/lib/class-wp-block-supports.php +++ b/lib/class-wp-block-supports.php @@ -19,6 +19,13 @@ class WP_Block_Supports { */ private $block_supports = array(); + /** + * Tracks the current block to be rendered. + * + * @var array + */ + private $block_to_render = null; + /** * Container for the main instance of the class. * @@ -49,6 +56,30 @@ public static function init() { $instance->register_attributes(); } + /** + * Callback hooked to the register_block_type_args filter. + * + * This hooks into block registration to wrap the render_callback + * of dynamic blocks with a closure that keeps track of the + * current block to be rendered. + * + * @param array $args Block attributes. + * @return void + */ + public static function track_current_block_to_render( $args ) { + if ( null !== $args['render_callback'] ) { + $block_render_callback = $args['render_callback']; + $args['render_callback'] = function( $attributes, $content, $block ) use ( $block_render_callback ) { + $parent_block = $this->block_to_render; + $this->block_to_render = $block->parsed_block; + $result = $block_render_callback( $attributes, $content, $block ); + $this->block_to_render = $parent_block; + return $result; + }; + } + return $args; + } + /** * Registers a block support. * @@ -67,13 +98,12 @@ public function register( $block_support_name, $block_support_config ) { * Generates an array of HTML attributes, such as classes, by applying to * the given block all of the features that the block supports. * - * @param array $parsed_block Block as parsed from content. * @return array Array of HTML attributes. */ - public function apply_block_supports( $parsed_block ) { - $block_attributes = $parsed_block['attrs']; + public function apply_block_supports() { + $block_attributes = $this->block_to_render['attrs']; $block_type = WP_Block_Type_Registry::get_instance()->get_registered( - $parsed_block['blockName'] + $this->block_to_render['blockName'] ); // If no render_callback, assume styles have been previously handled. @@ -144,8 +174,7 @@ private function register_attributes() { * @return string String of HTML classes. */ function get_block_wrapper_attributes( $extra_attributes = array() ) { - global $current_parsed_block; - $new_attributes = WP_Block_Supports::get_instance()->apply_block_supports( $current_parsed_block ); + $new_attributes = WP_Block_Supports::get_instance()->apply_block_supports(); if ( empty( $new_attributes ) && empty( $extra_attributes ) ) { return ''; @@ -192,3 +221,4 @@ function get_block_wrapper_attributes( $extra_attributes = array() ) { } add_action( 'init', array( 'WP_Block_Supports', 'init' ), 22 ); +add_filter( 'register_block_type_args', array( 'WP_Block_Supports', 'track_current_block_to_render' ) ); diff --git a/lib/compat.php b/lib/compat.php index 5779460ec61da..6dfa292e0f362 100644 --- a/lib/compat.php +++ b/lib/compat.php @@ -514,34 +514,3 @@ function gutenberg_override_reusable_block_post_type_labels() { 'blockName' => null, 'attributes' => null, ); - -/** - * Wraps the render_callback of dynamic blocks to keep track - * of the current block being rendered via a global variable - * called $current_parsed_block. - * - * This is for get_block_wrapper_attributes to get access - * to the runtime data of the block being rendered. - * - * This shim can be removed when the plugin requires WordPress 5.6. - * - * @since 9.2.1 - * - * @param array $args Block attributes. - * @return array Block attributes. - */ -function gutenberg_current_parsed_block_tracking( $args ) { - if ( null !== $args['render_callback'] ) { - $block_render_callback = $args['render_callback']; - $args['render_callback'] = function( $attributes, $content, $block ) use ( $block_render_callback ) { - global $current_parsed_block; - $parent_parsed_block = $current_parsed_block; - $current_parsed_block = $block->parsed_block; - $result = $block_render_callback( $attributes, $content, $block ); - $current_parsed_block = $parent_parsed_block; - return $result; - }; - } - return $args; -} -add_filter( 'register_block_type_args', 'gutenberg_current_parsed_block_tracking' ); From 886be87ca0a6c93868e3c85658a49be1403b7868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s?= Date: Wed, 21 Oct 2020 13:32:46 +0200 Subject: [PATCH 02/10] Rename and make it static --- lib/class-wp-block-supports.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/class-wp-block-supports.php b/lib/class-wp-block-supports.php index 7c7cee2dd8161..5154f80b5a870 100644 --- a/lib/class-wp-block-supports.php +++ b/lib/class-wp-block-supports.php @@ -24,7 +24,7 @@ class WP_Block_Supports { * * @var array */ - private $block_to_render = null; + private static $block_to_render = null; /** * Container for the main instance of the class. @@ -64,16 +64,16 @@ public static function init() { * current block to be rendered. * * @param array $args Block attributes. - * @return void + * @return array Block attributes. */ - public static function track_current_block_to_render( $args ) { + public static function track_block_to_render( $args ) { if ( null !== $args['render_callback'] ) { $block_render_callback = $args['render_callback']; $args['render_callback'] = function( $attributes, $content, $block ) use ( $block_render_callback ) { - $parent_block = $this->block_to_render; - $this->block_to_render = $block->parsed_block; + $parent_block = self::$block_to_render; + self::$block_to_render = $block->parsed_block; $result = $block_render_callback( $attributes, $content, $block ); - $this->block_to_render = $parent_block; + self::$block_to_render = $parent_block; return $result; }; } @@ -101,9 +101,9 @@ public function register( $block_support_name, $block_support_config ) { * @return array Array of HTML attributes. */ public function apply_block_supports() { - $block_attributes = $this->block_to_render['attrs']; + $block_attributes = self::$block_to_render['attrs']; $block_type = WP_Block_Type_Registry::get_instance()->get_registered( - $this->block_to_render['blockName'] + self::$block_to_render['blockName'] ); // If no render_callback, assume styles have been previously handled. @@ -221,4 +221,4 @@ function get_block_wrapper_attributes( $extra_attributes = array() ) { } add_action( 'init', array( 'WP_Block_Supports', 'init' ), 22 ); -add_filter( 'register_block_type_args', array( 'WP_Block_Supports', 'track_current_block_to_render' ) ); +add_filter( 'register_block_type_args', array( 'WP_Block_Supports', 'track_block_to_render' ) ); From fad54c09924246fb14602bf3ef1eba67a3239159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s?= Date: Wed, 21 Oct 2020 13:35:15 +0200 Subject: [PATCH 03/10] Remove use of $current_parsed_block --- lib/class-wp-block.php | 12 +++--------- lib/compat.php | 6 ------ 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/lib/class-wp-block.php b/lib/class-wp-block.php index d7788c1d614dc..cd02905074566 100644 --- a/lib/class-wp-block.php +++ b/lib/class-wp-block.php @@ -203,7 +203,6 @@ public function __get( $name ) { */ public function render( $options = array() ) { global $post; - global $current_parsed_block; $options = array_replace( array( 'dynamic' => true, @@ -217,14 +216,9 @@ public function render( $options = array() ) { if ( ! $options['dynamic'] || empty( $this->block_type->skip_inner_blocks ) ) { $index = 0; foreach ( $this->inner_content as $chunk ) { - if ( is_string( $chunk ) ) { - $block_content .= $chunk; - } else { - $parent_parsed_block = $current_parsed_block; - $current_parsed_block = $this->inner_blocks[ $index ]->parsed_block; - $block_content .= $this->inner_blocks[ $index++ ]->render(); - $current_parsed_block = $parent_parsed_block; - } + $block_content .= is_string( $chunk ) ? + $chunk : + $this->inner_blocks[ $index++ ]->render(); } } diff --git a/lib/compat.php b/lib/compat.php index 6dfa292e0f362..e63a7a5af514a 100644 --- a/lib/compat.php +++ b/lib/compat.php @@ -508,9 +508,3 @@ function gutenberg_override_reusable_block_post_type_labels() { ); } add_filter( 'post_type_labels_wp_block', 'gutenberg_override_reusable_block_post_type_labels', 10, 0 ); - -global $current_parsed_block; -$current_parsed_block = array( - 'blockName' => null, - 'attributes' => null, -); From 12067f6ada78d4ed5b203691937766ced2834c03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s?= Date: Wed, 21 Oct 2020 13:38:59 +0200 Subject: [PATCH 04/10] Remove use of $current_parsed_block --- phpunit/class-block-supported-styles-test.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/phpunit/class-block-supported-styles-test.php b/phpunit/class-block-supported-styles-test.php index 19765f6a2b661..b0292272bf218 100644 --- a/phpunit/class-block-supported-styles-test.php +++ b/phpunit/class-block-supported-styles-test.php @@ -94,11 +94,8 @@ private function get_content_from_block( $block ) { /** * Returns the rendered output for the current block. * - * @param array $block Block to render. */ - private function render_example_block( $block ) { - global $current_parsed_block; - $current_parsed_block = $block; + private function render_example_block() { $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => 'foo-bar-class', From 9b4c70f67fc225a1586ec1d89107d56eb9f9b25f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s?= Date: Wed, 21 Oct 2020 13:51:32 +0200 Subject: [PATCH 05/10] Make linter happy --- phpunit/class-block-supported-styles-test.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/phpunit/class-block-supported-styles-test.php b/phpunit/class-block-supported-styles-test.php index b0292272bf218..66bb01c143b83 100644 --- a/phpunit/class-block-supported-styles-test.php +++ b/phpunit/class-block-supported-styles-test.php @@ -93,10 +93,9 @@ private function get_content_from_block( $block ) { /** * Returns the rendered output for the current block. - * */ private function render_example_block() { - $wrapper_attributes = get_block_wrapper_attributes( + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => 'foo-bar-class', 'style' => 'test: style;', From d7bc1ceafca209d45130200916c4bf810f8ede8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s?= Date: Wed, 21 Oct 2020 18:33:09 +0200 Subject: [PATCH 06/10] Move track code out of the class --- lib/class-wp-block-supports.php | 52 ++++++++++++++++----------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/lib/class-wp-block-supports.php b/lib/class-wp-block-supports.php index 5154f80b5a870..db3a2b8916091 100644 --- a/lib/class-wp-block-supports.php +++ b/lib/class-wp-block-supports.php @@ -24,7 +24,7 @@ class WP_Block_Supports { * * @var array */ - private static $block_to_render = null; + public static $block_to_render = null; /** * Container for the main instance of the class. @@ -56,30 +56,6 @@ public static function init() { $instance->register_attributes(); } - /** - * Callback hooked to the register_block_type_args filter. - * - * This hooks into block registration to wrap the render_callback - * of dynamic blocks with a closure that keeps track of the - * current block to be rendered. - * - * @param array $args Block attributes. - * @return array Block attributes. - */ - public static function track_block_to_render( $args ) { - if ( null !== $args['render_callback'] ) { - $block_render_callback = $args['render_callback']; - $args['render_callback'] = function( $attributes, $content, $block ) use ( $block_render_callback ) { - $parent_block = self::$block_to_render; - self::$block_to_render = $block->parsed_block; - $result = $block_render_callback( $attributes, $content, $block ); - self::$block_to_render = $parent_block; - return $result; - }; - } - return $args; - } - /** * Registers a block support. * @@ -220,5 +196,29 @@ function get_block_wrapper_attributes( $extra_attributes = array() ) { return implode( ' ', $normalized_attributes ); } +/** + * Callback hooked to the register_block_type_args filter. + * + * This hooks into block registration to wrap the render_callback + * of dynamic blocks with a closure that keeps track of the + * current block to be rendered. + * + * @param array $args Block attributes. + * @return array Block attributes. + */ +function wp_block_supports_track_block_to_render( $args ) { + if ( null !== $args['render_callback'] ) { + $block_render_callback = $args['render_callback']; + $args['render_callback'] = function( $attributes, $content, $block ) use ( $block_render_callback ) { + $parent_block = WP_Block_Supports::$block_to_render; + WP_Block_Supports::$block_to_render = $block->parsed_block; + $result = $block_render_callback( $attributes, $content, $block ); + WP_Block_Supports::$block_to_render = $parent_block; + return $result; + }; + } + return $args; +} + add_action( 'init', array( 'WP_Block_Supports', 'init' ), 22 ); -add_filter( 'register_block_type_args', array( 'WP_Block_Supports', 'track_block_to_render' ) ); +add_filter( 'register_block_type_args', 'wp_block_supports_track_block_to_render' ); From 07b92149fdc6e784f710ef2addd22fc9106fcb19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s?= Date: Thu, 22 Oct 2020 10:40:06 +0200 Subject: [PATCH 07/10] Make linter happy --- lib/class-wp-block-supports.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/class-wp-block-supports.php b/lib/class-wp-block-supports.php index db3a2b8916091..45b6bd018920a 100644 --- a/lib/class-wp-block-supports.php +++ b/lib/class-wp-block-supports.php @@ -211,8 +211,8 @@ function wp_block_supports_track_block_to_render( $args ) { $block_render_callback = $args['render_callback']; $args['render_callback'] = function( $attributes, $content, $block ) use ( $block_render_callback ) { $parent_block = WP_Block_Supports::$block_to_render; - WP_Block_Supports::$block_to_render = $block->parsed_block; - $result = $block_render_callback( $attributes, $content, $block ); + WP_Block_Supports::$block_to_render = $block->parsed_block; + $result = $block_render_callback( $attributes, $content, $block ); WP_Block_Supports::$block_to_render = $parent_block; return $result; }; From 00f7e56a636ce046df1b21c6caf5b0078cb0312e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s?= Date: Thu, 22 Oct 2020 11:09:19 +0200 Subject: [PATCH 08/10] Fix test --- phpunit/class-block-supported-styles-test.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/phpunit/class-block-supported-styles-test.php b/phpunit/class-block-supported-styles-test.php index 66bb01c143b83..3e378ade9a574 100644 --- a/phpunit/class-block-supported-styles-test.php +++ b/phpunit/class-block-supported-styles-test.php @@ -93,8 +93,14 @@ private function get_content_from_block( $block ) { /** * Returns the rendered output for the current block. + * + * @param WP_Block $block Block to render. + * + * @return string Rendered output for the current block. */ - private function render_example_block() { + private function render_example_block( $block ) { + WP_Block_Supports::init(); + WP_Block_Supports::$block_to_render = $block; $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => 'foo-bar-class', From 7dffcdd21a11fc2874f4162a0f9b48bf3fdf8dce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s?= Date: Thu, 22 Oct 2020 11:16:27 +0200 Subject: [PATCH 09/10] Make linter happy --- phpunit/class-block-supported-styles-test.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/phpunit/class-block-supported-styles-test.php b/phpunit/class-block-supported-styles-test.php index 3e378ade9a574..5c60afaadec1b 100644 --- a/phpunit/class-block-supported-styles-test.php +++ b/phpunit/class-block-supported-styles-test.php @@ -93,15 +93,15 @@ private function get_content_from_block( $block ) { /** * Returns the rendered output for the current block. - * + * * @param WP_Block $block Block to render. - * + * * @return string Rendered output for the current block. */ private function render_example_block( $block ) { WP_Block_Supports::init(); WP_Block_Supports::$block_to_render = $block; - $wrapper_attributes = get_block_wrapper_attributes( + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => 'foo-bar-class', 'style' => 'test: style;', From ad18bb4193b754958adef9db84c81a6332cebf6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s?= Date: Thu, 22 Oct 2020 12:46:49 +0200 Subject: [PATCH 10/10] Remove tests, these are already migrated to core --- phpunit/class-block-supported-styles-test.php | 778 ------------------ 1 file changed, 778 deletions(-) delete mode 100644 phpunit/class-block-supported-styles-test.php diff --git a/phpunit/class-block-supported-styles-test.php b/phpunit/class-block-supported-styles-test.php deleted file mode 100644 index 5c60afaadec1b..0000000000000 --- a/phpunit/class-block-supported-styles-test.php +++ /dev/null @@ -1,778 +0,0 @@ -registered_block_names ) ) { - $block_name = array_pop( $this->registered_block_names ); - unregister_block_type( $block_name ); - } - } - - /** - * Registers a block type. - * - * @param string|WP_Block_Type $name Block type name including namespace, or alternatively a - * complete WP_Block_Type instance. In case a WP_Block_Type - * is provided, the $args parameter will be ignored. - * @param array $args { - * Optional. Array of block type arguments. Any arguments may be defined, however the - * ones described below are supported by default. Default empty array. - * - * @type callable $render_callback Callback used to render blocks of this block type. - * } - */ - protected function register_block_type( $name, $args ) { - register_block_type( $name, $args ); - - $this->registered_block_names[] = $name; - } - - /** - * Retrieves attribute such as 'class' or 'style' from the rendered block string. - * - * @param string $attribute Name of attribute to get. - * @param string $block String of rendered block to check. - */ - private function get_attribute_from_block( $attribute, $block ) { - $start_index = strpos( $block, $attribute . '="' ) + strlen( $attribute ) + 2; - $split_arr = substr( $block, $start_index ); - $end_index = strpos( $split_arr, '"' ); - return substr( $split_arr, 0, $end_index ); - } - - /** - * Retrieves block content from the rendered block string - * (i.e. what's wrapped by the block wrapper `
`). - * - * @param string $block String of rendered block to check. - */ - private function get_content_from_block( $block ) { - $start_index = strpos( $block, '>' ) + 1; // First occurrence of '>'. - $split_arr = substr( $block, $start_index ); - $end_index = strrpos( $split_arr, '<' ); // Last occurrence of '<'. - return substr( $split_arr, 0, $end_index ); // String between first '>' and last '<'. - } - - /** - * Block content to test with (i.e. what's wrapped by the block wrapper `
`). - * - * @var string - */ - const BLOCK_CONTENT = ' -

Test

-

äöü

-

ß

-

系の家庭に

-

Example <p>Test!</p>

- '; - - /** - * Returns the rendered output for the current block. - * - * @param WP_Block $block Block to render. - * - * @return string Rendered output for the current block. - */ - private function render_example_block( $block ) { - WP_Block_Supports::init(); - WP_Block_Supports::$block_to_render = $block; - $wrapper_attributes = get_block_wrapper_attributes( - array( - 'class' => 'foo-bar-class', - 'style' => 'test: style;', - ) - ); - return '
' . self::BLOCK_CONTENT . '
'; - } - - /** - * Runs assertions that the rendered output has expected class/style attrs. - * - * @param array $block Block to render. - * @param string $expected_classes Expected output class attr string. - * @param string $expected_styles Expected output styles attr string. - */ - private function assert_styles_and_classes_match( $block, $expected_classes, $expected_styles ) { - $styled_block = $this->render_example_block( $block ); - $class_list = $this->get_attribute_from_block( 'class', $styled_block ); - $style_list = $this->get_attribute_from_block( 'style', $styled_block ); - - $this->assertEquals( $expected_classes, $class_list ); - $this->assertEquals( $expected_styles, $style_list ); - } - - /** - * Runs assertions that the rendered output has expected content and class/style attrs. - * - * @param array $block Block to render. - * @param string $expected_classes Expected output class attr string. - * @param string $expected_styles Expected output styles attr string. - */ - private function assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ) { - $styled_block = $this->render_example_block( $block ); - - // Ensure blocks to not add extra whitespace. - $this->assertEquals( $styled_block, trim( $styled_block ) ); - - $content = $this->get_content_from_block( $styled_block ); - $class_list = $this->get_attribute_from_block( 'class', $styled_block ); - $style_list = $this->get_attribute_from_block( 'style', $styled_block ); - - $this->assertEquals( self::BLOCK_CONTENT, $content ); - $this->assertEqualSets( - explode( ' ', $expected_classes ), - explode( ' ', $class_list ) - ); - $this->assertEquals( - array_map( 'trim', explode( ';', $expected_styles ) ), - array_map( 'trim', explode( ';', $style_list ) ) - ); - } - - /** - * Tests color support for named color support for named colors. - */ - function test_named_color_support() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array( - 'color' => true, - ), - 'render_callback' => true, - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'textColor' => 'red', - 'backgroundColor' => 'black', - // The following should not be applied (subcatagories of color support). - 'gradient' => 'some-gradient', - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_classes = 'foo-bar-class wp-block-example has-text-color has-red-color has-background has-black-background-color'; - $expected_styles = 'test: style;'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests color support for custom colors. - */ - function test_custom_color_support() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array( - 'color' => true, - ), - 'render_callback' => true, - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'style' => array( - 'color' => array( - 'text' => '#000', - 'background' => '#fff', - // The following should not be applied (subcatagories of color support). - 'gradient' => 'some-gradient', - 'style' => array( 'color' => array( 'link' => '#fff' ) ), - ), - ), - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_styles = 'test: style; color: #000; background-color: #fff;'; - $expected_classes = 'foo-bar-class wp-block-example has-text-color has-background'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests link color support for named colors. - */ - function test_named_link_color_support() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array( - 'color' => array( - 'link' => true, - ), - ), - 'render_callback' => true, - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'style' => array( 'color' => array( 'link' => 'var:preset|color|red' ) ), - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_classes = 'foo-bar-class wp-block-example has-link-color'; - $expected_styles = 'test: style; --wp--style--color--link: var(--wp--preset--color--red);'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests link color support for custom colors. - */ - function test_custom_link_color_support() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array( - 'color' => array( - 'link' => true, - ), - ), - 'render_callback' => true, - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'style' => array( 'color' => array( 'link' => '#fff' ) ), - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_classes = 'foo-bar-class wp-block-example has-link-color'; - $expected_styles = 'test: style; --wp--style--color--link: #fff;'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests gradient color support for named gradients. - */ - function test_named_gradient_support() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array( - 'color' => array( - 'gradients' => true, - ), - ), - 'render_callback' => true, - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'gradient' => 'red', - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_classes = 'foo-bar-class wp-block-example has-background has-red-gradient-background'; - $expected_styles = 'test: style;'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests gradient color support for custom gradients. - */ - function test_custom_gradient_support() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array( - 'color' => array( - 'gradients' => true, - ), - ), - 'render_callback' => true, - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'style' => array( 'color' => array( 'gradient' => 'some-gradient-style' ) ), - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_classes = 'foo-bar-class wp-block-example has-background'; - $expected_styles = 'test: style; background: some-gradient-style;'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests that style attributes for colors are not applied without the support flag. - */ - function test_color_unsupported() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array(), - 'render_callback' => true, - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'textColor' => 'red', - 'backgroundColor' => 'black', - 'style' => array( - 'color' => array( - 'text' => '#000', - 'background' => '#fff', - 'link' => '#ggg', - 'gradient' => 'some-gradient', - ), - ), - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_classes = 'foo-bar-class wp-block-example'; - $expected_styles = 'test: style;'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests support for named font sizes. - */ - function test_named_font_size() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array( - 'fontSize' => true, - ), - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'fontSize' => 'large', - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_classes = 'foo-bar-class wp-block-example has-large-font-size'; - $expected_styles = 'test: style;'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests support for custom font sizes. - */ - function test_custom_font_size() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array( - 'fontSize' => true, - ), - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'style' => array( 'typography' => array( 'fontSize' => '10' ) ), - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_classes = 'foo-bar-class wp-block-example'; - $expected_styles = 'test: style; font-size: 10px;'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests that font size attributes are not applied without support flag. - */ - function test_font_size_unsupported() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array(), - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'fontSize' => 'large', - 'style' => array( 'typography' => array( 'fontSize' => '10' ) ), - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_classes = 'foo-bar-class wp-block-example'; - $expected_styles = 'test: style;'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests line height support. - */ - function test_line_height() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array( - 'lineHeight' => true, - ), - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'style' => array( 'typography' => array( 'lineHeight' => '10' ) ), - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_classes = 'foo-bar-class wp-block-example'; - $expected_styles = 'test: style; line-height: 10;'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests line height not applied without support flag. - */ - function test_line_height_unsupported() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array(), - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'style' => array( 'typography' => array( 'lineHeight' => '10' ) ), - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_classes = 'foo-bar-class wp-block-example'; - $expected_styles = 'test: style;'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests support for block alignment. - */ - function test_block_alignment() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array( - 'align' => true, - ), - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'align' => 'wide', - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_classes = 'foo-bar-class wp-block-example alignwide'; - $expected_styles = 'test: style;'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests block alignment requires support to be added. - */ - function test_block_alignment_unsupported() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array(), - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'align' => 'wide', - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_classes = 'foo-bar-class wp-block-example'; - $expected_styles = 'test: style;'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests all support flags together to ensure they work together as expected. - */ - function test_all_supported() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array( - 'color' => array( - 'gradients' => true, - 'link' => true, - ), - 'fontSize' => true, - 'lineHeight' => true, - 'align' => true, - ), - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'align' => 'wide', - 'style' => array( - 'color' => array( - 'text' => '#000', - 'background' => '#fff', - 'style' => array( 'color' => array( 'link' => '#fff' ) ), - ), - 'typography' => array( - 'lineHeight' => '20', - 'fontSize' => '10', - ), - ), - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_classes = 'foo-bar-class wp-block-example has-text-color has-background alignwide'; - $expected_styles = 'test: style; color: #000; background-color: #fff; font-size: 10px; line-height: 20;'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests that only styles for the supported flag are added. - * Verify one support enabled does not imply multiple supports enabled. - */ - function test_one_supported() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array( - 'fontSize' => true, - ), - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'align' => 'wide', - 'style' => array( - 'color' => array( - 'text' => '#000', - 'background' => '#fff', - 'gradient' => 'some-gradient', - 'style' => array( 'color' => array( 'link' => '#fff' ) ), - ), - 'typography' => array( - 'lineHeight' => '20', - 'fontSize' => '10', - ), - ), - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_classes = 'foo-bar-class wp-block-example'; - $expected_styles = 'test: style; font-size: 10px;'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests custom classname server-side block support. - */ - function test_custom_classnames_support() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array(), - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'className' => 'my-custom-classname', - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_styles = 'test: style;'; - $expected_classes = 'foo-bar-class wp-block-example my-custom-classname'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests custom classname server-side block support opt-out. - */ - function test_custom_classnames_support_opt_out() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array( - 'customClassName' => false, - ), - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array( - 'className' => 'my-custom-classname', - ), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_styles = 'test: style;'; - $expected_classes = 'foo-bar-class wp-block-example'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Tests generated classname server-side block support opt-out. - */ - function test_generatted_classnames_support_opt_out() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array( - 'className' => false, - ), - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array(), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - $expected_styles = 'test: style;'; - $expected_classes = 'foo-bar-class'; - - $this->assert_content_and_styles_and_classes_match( $block, $expected_classes, $expected_styles ); - } - - /** - * Ensures libxml_internal_errors is being used instead of @ warning suppression - */ - public function test_render_block_suppresses_warnings_without_at_suppression() { - $block_type_settings = array( - 'attributes' => array(), - 'supports' => array(), - ); - $this->register_block_type( 'core/example', $block_type_settings ); - - $block = array( - 'blockName' => 'core/example', - 'attrs' => array(), - 'innerBlock' => array(), - 'innerContent' => array(), - 'innerHTML' => array(), - ); - - // Custom error handler's see Warnings even if they are suppressed by the @ symbol. - $errors = array(); - set_error_handler( - function ( $errno = 0, $errstr = '' ) use ( &$errors ) { - $errors[] = $errstr; - return false; - } - ); - - // HTML5 elements like