diff --git a/backport-changelog/6.8/8274.md b/backport-changelog/6.8/8274.md new file mode 100644 index 00000000000000..f841a6f010d6d3 --- /dev/null +++ b/backport-changelog/6.8/8274.md @@ -0,0 +1,3 @@ +https://github.com/WordPress/wordpress-develop/pull/8274 + +* https://github.com/WordPress/gutenberg/pull/69096 diff --git a/lib/block-supports/aria-label.php b/lib/block-supports/aria-label.php new file mode 100644 index 00000000000000..062ff027bf5947 --- /dev/null +++ b/lib/block-supports/aria-label.php @@ -0,0 +1,63 @@ +attributes ) { + $block_type->attributes = array(); + } + + if ( ! array_key_exists( 'ariaLabel', $block_type->attributes ) ) { + $block_type->attributes['ariaLabel'] = array( + 'type' => 'string', + ); + } +} + +/** + * Add the aria-label to the output. + * + * @param WP_Block_Type $block_type Block Type. + * @param array $block_attributes Block attributes. + * + * @return array Block aria-label. + */ +function gutenberg_apply_aria_label_support( $block_type, $block_attributes ) { + if ( ! $block_attributes ) { + return array(); + } + + $has_aria_label_support = block_has_support( $block_type, array( 'ariaLabel' ), false ); + if ( ! $has_aria_label_support ) { + return array(); + } + + $has_aria_label = array_key_exists( 'ariaLabel', $block_attributes ); + if ( ! $has_aria_label ) { + return array(); + } + return array( 'aria-label' => $block_attributes['ariaLabel'] ); +} + +// Register the block support. +WP_Block_Supports::get_instance()->register( + 'aria-label', + array( + 'register_attribute' => 'gutenberg_register_aria_label_support', + 'apply' => 'gutenberg_apply_aria_label_support', + ) +); diff --git a/lib/load.php b/lib/load.php index 769066111fb95a..25b5189010909d 100644 --- a/lib/load.php +++ b/lib/load.php @@ -178,6 +178,7 @@ function gutenberg_is_experiment_enabled( $name ) { require __DIR__ . '/block-supports/shadow.php'; require __DIR__ . '/block-supports/background.php'; require __DIR__ . '/block-supports/block-style-variations.php'; +require __DIR__ . '/block-supports/aria-label.php'; // Data views. require_once __DIR__ . '/experimental/data-views.php'; diff --git a/phpunit/block-supports/aria-label-test.php b/phpunit/block-supports/aria-label-test.php new file mode 100644 index 00000000000000..52b14edd5b67ca --- /dev/null +++ b/phpunit/block-supports/aria-label-test.php @@ -0,0 +1,85 @@ +test_block_name = null; + } + + public function tear_down() { + unregister_block_type( $this->test_block_name ); + $this->test_block_name = null; + parent::tear_down(); + } + + /** + * Registers a new block for testing aria-label support. + * + * @param string $block_name Name for the test block. + * @param array $supports Array defining block support configuration. + * + * @return WP_Block_Type The block type for the newly registered test block. + */ + private function register_aria_label_block_with_support( $block_name, $supports = array() ) { + $this->test_block_name = $block_name; + register_block_type( + $this->test_block_name, + array( + 'api_version' => 3, + 'supports' => $supports, + ) + ); + $registry = WP_Block_Type_Registry::get_instance(); + + return $registry->get_registered( $this->test_block_name ); + } + + /** + * Tests that position block support works as expected. + * + * @dataProvider data_aria_label_block_support + * + * @param boolean|array $support Aria label block support configuration. + * @param string $value Aria label value for attribute object. + * @param array $expected Expected aria label block support styles. + */ + public function test_gutenberg_apply_aria_label_support( $support, $value, $expected ) { + $block_type = self::register_aria_label_block_with_support( + 'test/aria-label-block', + array( 'ariaLabel' => $support ) + ); + $block_attrs = array( 'ariaLabel' => $value ); + $actual = gutenberg_apply_aria_label_support( $block_type, $block_attrs ); + + $this->assertSame( $expected, $actual ); + } + + /** + * Data provider. + * + * @return array + */ + public function data_aria_label_block_support() { + return array( + 'aria-label attribute is applied' => array( + 'support' => true, + 'value' => 'Label', + 'expected' => array( 'aria-label' => 'Label' ), + ), + 'aria-label attribute is not applied if block does not support it' => array( + 'support' => false, + 'value' => 'Label', + 'expected' => array(), + ), + ); + } +}