WordPress.org

Make WordPress Core

Ticket #49270: 49270.4.diff

File 49270.4.diff, 4.5 KB (added by spacedmonkey, 6 months ago)
  • src/wp-includes/rest-api.php

    diff --git a/src/wp-includes/rest-api.php b/src/wp-includes/rest-api.php
    index 8fbf4b1342..d517916fbe 100644
    a b function rest_parse_date( $date, $force_utc = false ) { 
    966966        return strtotime( $date );
    967967}
    968968
     969/**
     970 * Parses an 3 or 6 digit hex color (with #).
     971 *
     972 * @since 5.4.0
     973 *
     974 * @param string $color 3 or 6 digit hex color (with #).
     975 * @return string|boolean
     976 */
     977function rest_parse_hex_color( $color ) {
     978        $regex = '|^#([A-Fa-f0-9]{3}){1,2}$|';
     979        if ( ! preg_match( $regex, $color, $matches ) ) {
     980                return false;
     981        }
     982
     983        return $color;
     984}
     985
    969986/**
    970987 * Parses a date into both its local and UTC equivalent, in MySQL datetime format.
    971988 *
    function rest_validate_value_from_schema( $value, $args, $param = '' ) { 
    13141331
    13151332        if ( isset( $args['format'] ) ) {
    13161333                switch ( $args['format'] ) {
     1334                        case 'hex-color':
     1335                                if ( ! rest_parse_hex_color( $value ) ) {
     1336                                        return new WP_Error( 'rest_invalid_color', __( 'Invalid color.' ) );
     1337                                }
     1338                                break;
     1339
    13171340                        case 'date-time':
    13181341                                if ( ! rest_parse_date( $value ) ) {
    13191342                                        return new WP_Error( 'rest_invalid_date', __( 'Invalid date.' ) );
    function rest_sanitize_value_from_schema( $value, $args ) { 
    14701493
    14711494        if ( isset( $args['format'] ) ) {
    14721495                switch ( $args['format'] ) {
     1496                        case 'hex-color':
     1497                                return sanitize_hex_color( $value );
     1498
    14731499                        case 'date-time':
    14741500                                return sanitize_text_field( $value );
    14751501
  • tests/phpunit/tests/rest-api/rest-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-controller.php b/tests/phpunit/tests/rest-api/rest-controller.php
    index 91e1d0c5b7..5ab9e2b56b 100644
    a b class WP_Test_REST_Controller extends WP_Test_REST_TestCase { 
    2727                                        'somestring'  => array(
    2828                                                'type' => 'string',
    2929                                        ),
     30                                        'somehex'     => array(
     31                                                'type'   => 'string',
     32                                                'format' => 'hex-color',
     33                                        ),
    3034                                        'someenum'    => array(
    3135                                                'type' => 'string',
    3236                                                'enum' => array( 'a' ),
    class WP_Test_REST_Controller extends WP_Test_REST_TestCase { 
    166170                );
    167171        }
    168172
     173        /**
     174         * @ticket 49270
     175         */
     176        public function test_validate_schema_format_hex_color() {
     177
     178                $this->assertTrue(
     179                        rest_validate_request_arg( '#000000', $this->request, 'somehex' )
     180                );
     181
     182                $this->assertErrorResponse(
     183                        'rest_invalid_color',
     184                        rest_validate_request_arg( 'wibble', $this->request, 'somehex' )
     185                );
     186        }
     187
    169188        public function test_validate_schema_format_date_time() {
    170189
    171190                $this->assertTrue(
    class WP_Test_REST_Controller extends WP_Test_REST_TestCase { 
    218237                                'someurl',
    219238                                'somedate',
    220239                                'someemail',
     240                                'somehex',
    221241                                'someenum',
    222242                                'someargoptions',
    223243                                'somedefault',
    class WP_Test_REST_Controller extends WP_Test_REST_TestCase { 
    247267                                        'someurl',
    248268                                        'somedate',
    249269                                        'someemail',
     270                                        'somehex',
    250271                                        'someenum',
    251272                                        'someargoptions',
    252273                                        'somedefault',
  • tests/phpunit/tests/rest-api/rest-schema-validation.php

    diff --git a/tests/phpunit/tests/rest-api/rest-schema-validation.php b/tests/phpunit/tests/rest-api/rest-schema-validation.php
    index 9c18a846dc..f581510a07 100644
    a b class WP_Test_REST_Schema_Validation extends WP_UnitTestCase { 
    7272                $this->assertWPError( rest_validate_value_from_schema( 'email', $schema ) );
    7373        }
    7474
     75        /**
     76         * @ticket 45098
     77         */
     78        public function test_format_hex_color() {
     79                $schema = array(
     80                        'type'   => 'string',
     81                        'format' => 'hex-color',
     82                );
     83                $this->assertTrue( rest_validate_value_from_schema( '#000000', $schema ) );
     84                $this->assertTrue( rest_validate_value_from_schema( '#FFF', $schema ) );
     85                $this->assertWPError( rest_validate_value_from_schema( 'WordPress', $schema ) );
     86        }
     87
    7588        public function test_format_date_time() {
    7689                $schema = array(
    7790                        'type'   => 'string',
  • tests/phpunit/tests/rest-api/rest-test-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-test-controller.php b/tests/phpunit/tests/rest-api/rest-test-controller.php
    index b79e7cf59b..a06800c3ce 100644
    a b class WP_REST_Test_Controller extends WP_REST_Controller { 
    6464                                        'format'  => 'email',
    6565                                        'context' => array( 'view' ),
    6666                                ),
     67                                'somehex'        => array(
     68                                        'type'    => 'string',
     69                                        'format'  => 'hex-color',
     70                                        'context' => array( 'view' ),
     71                                ),
    6772                                'someenum'       => array(
    6873                                        'type'    => 'string',
    6974                                        'enum'    => array( 'a', 'b', 'c' ),