Make WordPress Core

Changeset 54349


Ignore:
Timestamp:
09/28/2022 05:31:53 PM (4 years ago)
Author:
SergeyBiryukov
Message:

Code Modernization: Use correct default value for JavaScript translations path.

The $path parameter of load_script_textdomain() had a default value of null, but would be passed onto the untrailingslashit() function without any input validation, even though the latter explicitly only expects/supports a string input.

This commit changes the default value for $path to an empty string, and adds an is_string() check before passing the value to untrailingslashit() to fix the issue at the point where the invalid input is incorrectly (not) validated.

Note: Changing the untrailingslashit() function is outside the scope of this commit.

Includes:

  • Adding a dedicated unit test for this issue.
  • Correcting the default value for $path from null to an empty string in a few related methods and functions:
    • WP_Dependency::set_translations()
    • WP_Scripts::set_translations()
    • wp_set_script_translations()
    • load_script_textdomain()

This fix also allows to remove a couple of calls to expectDeprecation() in unrelated tests.

Fixes an error when running the test suite:

4) Tests_Dependencies_Scripts::test_wp_external_wp_i18n_print_order
rtrim(): Passing null to parameter #1 ($string) of type string is deprecated

/var/www/src/wp-includes/formatting.php:2782
/var/www/src/wp-includes/l10n.php:1068
/var/www/src/wp-includes/class.wp-scripts.php:605
/var/www/src/wp-includes/class.wp-scripts.php:320
/var/www/src/wp-includes/class.wp-dependencies.php:136
/var/www/src/wp-includes/functions.wp-scripts.php:109
/var/www/tests/phpunit/tests/dependencies/scripts.php:1505
/var/www/tests/phpunit/includes/utils.php:436
/var/www/tests/phpunit/tests/dependencies/scripts.php:1507
/var/www/vendor/bin/phpunit:123

Follow-up to [44169], [44607], [51968].

Props jrf, ocean90, Chouby, swissspidy, lovor, iviweb, meysamnorouzi, DarkoG, oneearth27, SergeyBiryukov.
Fixes #55967. See #55656.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/l10n.php

    r54210 r54349  
    10591059 *                      false if the script textdomain could not be loaded.
    10601060 */
    1061 function load_script_textdomain( $handle, $domain = 'default', $path = null ) {
     1061function load_script_textdomain( $handle, $domain = 'default', $path = '' ) {
    10621062        $wp_scripts = wp_scripts();
    10631063
     
    10661066        }
    10671067
    1068         $path   = untrailingslashit( $path );
     1068        if ( is_string( $path ) ) {
     1069                $path = untrailingslashit( $path );
     1070        }
     1071
    10691072        $locale = determine_locale();
    10701073
  • trunk/tests/phpunit/tests/dependencies/scripts.php

    r54289 r54349  
    722722                $wp_scripts->do_concat = true;
    723723
    724                 if ( PHP_VERSION_ID >= 80100 ) {
    725                         /*
    726                          * For the time being, ignoring PHP 8.1 "null to non-nullable" deprecations coming in
    727                          * via hooked in filter functions until a more structural solution to the
    728                          * "missing input validation" conundrum has been architected and implemented.
    729                          */
    730                         $this->expectDeprecation();
    731                         $this->expectDeprecationMessageMatches( '`Passing null to parameter \#[0-9]+ \(\$[^\)]+\) of type [^ ]+ is deprecated`' );
    732                 }
    733 
    734724                $ver       = get_bloginfo( 'version' );
    735725                $suffix    = wp_scripts_get_suffix();
     
    783773                $wp_scripts->base_url  = '';
    784774                $wp_scripts->do_concat = true;
    785 
    786                 if ( PHP_VERSION_ID >= 80100 ) {
    787                         /*
    788                          * For the time being, ignoring PHP 8.1 "null to non-nullable" deprecations coming in
    789                          * via hooked in filter functions until a more structural solution to the
    790                          * "missing input validation" conundrum has been architected and implemented.
    791                          */
    792                         $this->expectDeprecation();
    793                         $this->expectDeprecationMessageMatches( '`Passing null to parameter \#[0-9]+ \(\$[^\)]+\) of type [^ ]+ is deprecated`' );
    794                 }
    795775
    796776                $expected_tail  = "<script type='text/javascript' src='/customize-dependency.js' id='customize-dependency-js'></script>\n";
  • trunk/tests/phpunit/tests/l10n/loadScriptTextdomain.php

    r53866 r54349  
    132132                return $relative;
    133133        }
     134
     135        /**
     136         * Tests that PHP 8.1 "passing null to non-nullable" deprecation notice
     137         * is not thrown when passing the default `$path` to untrailingslashit() in the function.
     138         *
     139         * The notice that we should not see:
     140         * `Deprecated: rtrim(): Passing null to parameter #1 ($string) of type string is deprecated`.
     141         *
     142         * @ticket 55967
     143         */
     144        public function test_does_not_throw_deprecation_notice_for_rtrim_with_default_parameters() {
     145                $handle = 'test-example-root';
     146                $src    = '/wp-includes/js/script.js';
     147
     148                wp_enqueue_script( $handle, $src );
     149
     150                $expected = file_get_contents( DIR_TESTDATA . '/languages/en_US-813e104eb47e13dd4cc5af844c618754.json' );
     151                $this->assertSame( $expected, load_script_textdomain( $handle ) );
     152        }
    134153}
Note: See TracChangeset for help on using the changeset viewer.