Make WordPress Core


Ignore:
Timestamp:
12/22/2025 12:54:50 AM (10 months ago)
Author:
westonruter
Message:

Script Loader: Fix adding default version to script/style URL when args are supplied via enqueued handle.

Also fixes phpdoc for some member variables of WP_Scripts and WP_Styles.

Developed in ​https://github.com/WordPress/wordpress-develop/pull/10608

Follow-up to [61358].

Props westonruter, peterwilsoncc.
See #64224, #64238.
Fixes #64372.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/dependencies/scripts.php

    r61394 r61397  
    112112         *
    113113         * @ticket 11315
     114         * @ticket 64372
    114115         */
    115116        public function test_wp_enqueue_script() {
    … …  
    118119                wp_enqueue_script( 'no-deps-no-version', 'example.com', array() );
    119120                wp_enqueue_script( 'empty-deps-no-version', 'example.com' );
    120                 wp_enqueue_script( 'empty-deps-version', 'example.com', array(), 1.2 );
     121                wp_enqueue_script( 'empty-deps-version', 'example.com', array(), '1.2' );
    121122                wp_enqueue_script( 'empty-deps-null-version', 'example.com', array(), null );
     123                wp_enqueue_script( 'empty-deps-arg-in-handle-with-ver?arg1=foo&arg2=bar', 'https://example.com/test.js', array(), '2.0' );
     124                wp_enqueue_script( 'empty-deps-arg-in-handle-without-ver?arg1=foo&arg2=bar', 'https://example.com/test.js', array(), null );
     125                wp_register_script( 'registered-no-qs-handle-null-version-enqueued-with-qs', 'https://example.com/test.js' );
     126                wp_enqueue_script( 'registered-no-qs-handle-null-version-enqueued-with-qs?arg1=foo&arg2=bar' );
    122127
    123128                $expected  = "<script type='text/javascript' src='http://example.com?ver={$wp_version}' id='no-deps-no-version-js'></script>\n";
    … …  
    125130                $expected .= "<script type='text/javascript' src='http://example.com?ver=1.2' id='empty-deps-version-js'></script>\n";
    126131                $expected .= "<script type='text/javascript' src='http://example.com' id='empty-deps-null-version-js'></script>\n";
     132                $expected .= "<script type='text/javascript' src='https://example.com/test.js?ver=2.0&amp;arg1=foo&amp;arg2=bar' id='empty-deps-arg-in-handle-with-ver-js'></script>\n";
     133                $expected .= "<script type='text/javascript' src='https://example.com/test.js?arg1=foo&amp;arg2=bar' id='empty-deps-arg-in-handle-without-ver-js'></script>\n";
     134                $expected .= "<script type='text/javascript' src='https://example.com/test.js?ver={$wp_version}&amp;arg1=foo&amp;arg2=bar' id='registered-no-qs-handle-null-version-enqueued-with-qs-js'></script>\n";
    127135
    128136                $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    … …  
    565573/* ]]> */
    566574</script>
    567 <script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-not-async-without-dependency:%20script' id='blocking-not-async-without-dependency-js'></script>
     575<script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-not-async-without-dependency%3A+script' id='blocking-not-async-without-dependency-js'></script>
    568576<script id="blocking-not-async-without-dependency-js-after" type="text/javascript">
    569577/* <![CDATA[ */
    … …  
    578586/* ]]> */
    579587</script>
    580 <script type='text/javascript' src='https://example.com/external.js?script_event_log=async-with-blocking-dependency:%20script' id='async-with-blocking-dependency-js' data-wp-strategy='async'></script>
     588<script type='text/javascript' src='https://example.com/external.js?script_event_log=async-with-blocking-dependency%3A+script' id='async-with-blocking-dependency-js' data-wp-strategy='async'></script>
    581589<script id="async-with-blocking-dependency-js-after" type="text/javascript">
    582590/* <![CDATA[ */
    … …  
    614622/* ]]> */
    615623</script>
    616 <script type='text/javascript' src='https://example.com/external.js?script_event_log=async-no-dependency:%20script' id='async-no-dependency-js' data-wp-strategy='async'></script>
     624<script type='text/javascript' src='https://example.com/external.js?script_event_log=async-no-dependency%3A+script' id='async-no-dependency-js' data-wp-strategy='async'></script>
    617625<script id="async-no-dependency-js-after" type="text/javascript">
    618626/* <![CDATA[ */
    … …  
    627635/* ]]> */
    628636</script>
    629 <script type='text/javascript' src='https://example.com/external.js?script_event_log=async-one-async-dependency:%20script' id='async-one-async-dependency-js' data-wp-strategy='async'></script>
     637<script type='text/javascript' src='https://example.com/external.js?script_event_log=async-one-async-dependency%3A+script' id='async-one-async-dependency-js' data-wp-strategy='async'></script>
    630638<script id="async-one-async-dependency-js-after" type="text/javascript">
    631639/* <![CDATA[ */
    … …  
    640648/* ]]> */
    641649</script>
    642 <script type='text/javascript' src='https://example.com/external.js?script_event_log=async-two-async-dependencies:%20script' id='async-two-async-dependencies-js' data-wp-strategy='async'></script>
     650<script type='text/javascript' src='https://example.com/external.js?script_event_log=async-two-async-dependencies%3A+script' id='async-two-async-dependencies-js' data-wp-strategy='async'></script>
    643651<script id="async-two-async-dependencies-js-after" type="text/javascript">
    644652/* <![CDATA[ */
    … …  
    668676/* ]]> */
    669677</script>
    670 <script type='text/javascript' src='https://example.com/external.js?script_event_log=async-with-blocking-dependent:%20script' id='async-with-blocking-dependent-js' data-wp-strategy='async'></script>
     678<script type='text/javascript' src='https://example.com/external.js?script_event_log=async-with-blocking-dependent%3A+script' id='async-with-blocking-dependent-js' data-wp-strategy='async'></script>
    671679<script id="async-with-blocking-dependent-js-after" type="text/javascript">
    672680/* <![CDATA[ */
    … …  
    681689/* ]]> */
    682690</script>
    683 <script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-dependent-of-async:%20script' id='blocking-dependent-of-async-js'></script>
     691<script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-dependent-of-async%3A+script' id='blocking-dependent-of-async-js'></script>
    684692<script id="blocking-dependent-of-async-js-after" type="text/javascript">
    685693/* <![CDATA[ */
    … …  
    709717/* ]]> */
    710718</script>
    711 <script type='text/javascript' src='https://example.com/external.js?script_event_log=async-with-defer-dependent:%20script' id='async-with-defer-dependent-js' data-wp-strategy='async'></script>
     719<script type='text/javascript' src='https://example.com/external.js?script_event_log=async-with-defer-dependent%3A+script' id='async-with-defer-dependent-js' data-wp-strategy='async'></script>
    712720<script id="async-with-defer-dependent-js-after" type="text/javascript">
    713721/* <![CDATA[ */
    … …  
    722730/* ]]> */
    723731</script>
    724 <script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-async:%20script' id='defer-dependent-of-async-js' data-wp-strategy='defer'></script>
     732<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-async%3A+script' id='defer-dependent-of-async-js' data-wp-strategy='defer'></script>
    725733<script id="defer-dependent-of-async-js-after" type="text/javascript">
    726734/* <![CDATA[ */
    … …  
    765773/* ]]> */
    766774</script>
    767 <script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-blocking-bundle-of-none:%20script' id='defer-dependent-of-blocking-bundle-of-none-js' data-wp-strategy='defer'></script>
     775<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-blocking-bundle-of-none%3A+script' id='defer-dependent-of-blocking-bundle-of-none-js' data-wp-strategy='defer'></script>
    768776<script id="defer-dependent-of-blocking-bundle-of-none-js-after" type="text/javascript">
    769777/* <![CDATA[ */
    … …  
    799807/* ]]> */
    800808</script>
    801 <script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-bundle-member-one:%20script' id='blocking-bundle-member-one-js'></script>
     809<script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-bundle-member-one%3A+script' id='blocking-bundle-member-one-js'></script>
    802810<script id="blocking-bundle-member-one-js-after" type="text/javascript">
    803811/* <![CDATA[ */
    … …  
    812820/* ]]> */
    813821</script>
    814 <script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-bundle-member-two:%20script' id='blocking-bundle-member-two-js'></script>
     822<script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-bundle-member-two%3A+script' id='blocking-bundle-member-two-js'></script>
    815823<script id="blocking-bundle-member-two-js-after" type="text/javascript">
    816824/* <![CDATA[ */
    … …  
    825833/* ]]> */
    826834</script>
    827 <script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-blocking-bundle-of-two:%20script' id='defer-dependent-of-blocking-bundle-of-two-js' data-wp-strategy='defer'></script>
     835<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-blocking-bundle-of-two%3A+script' id='defer-dependent-of-blocking-bundle-of-two-js' data-wp-strategy='defer'></script>
    828836<script id="defer-dependent-of-blocking-bundle-of-two-js-after" type="text/javascript">
    829837/* <![CDATA[ */
    … …  
    870878/* ]]> */
    871879</script>
    872 <script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-defer-bundle-of-none:%20script' id='defer-dependent-of-defer-bundle-of-none-js' data-wp-strategy='defer'></script>
     880<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-defer-bundle-of-none%3A+script' id='defer-dependent-of-defer-bundle-of-none-js' data-wp-strategy='defer'></script>
    873881<script id="defer-dependent-of-defer-bundle-of-none-js-after" type="text/javascript">
    874882/* <![CDATA[ */
    … …  
    901909/* ]]> */
    902910</script>
    903 <script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-dependency-with-defer-following-dependency:%20script' id='blocking-dependency-with-defer-following-dependency-js'></script>
     911<script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-dependency-with-defer-following-dependency%3A+script' id='blocking-dependency-with-defer-following-dependency-js'></script>
    904912<script id="blocking-dependency-with-defer-following-dependency-js-after" type="text/javascript">
    905913/* <![CDATA[ */
    … …  
    914922/* ]]> */
    915923</script>
    916 <script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependency-with-blocking-preceding-dependency:%20script' id='defer-dependency-with-blocking-preceding-dependency-js' data-wp-strategy='defer'></script>
     924<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependency-with-blocking-preceding-dependency%3A+script' id='defer-dependency-with-blocking-preceding-dependency-js' data-wp-strategy='defer'></script>
    917925<script id="defer-dependency-with-blocking-preceding-dependency-js-after" type="text/javascript">
    918926/* <![CDATA[ */
    … …  
    927935/* ]]> */
    928936</script>
    929 <script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-blocking-and-defer-dependencies:%20script' id='defer-dependent-of-blocking-and-defer-dependencies-js' data-wp-strategy='defer'></script>
     937<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-blocking-and-defer-dependencies%3A+script' id='defer-dependent-of-blocking-and-defer-dependencies-js' data-wp-strategy='defer'></script>
    930938<script id="defer-dependent-of-blocking-and-defer-dependencies-js-after" type="text/javascript">
    931939/* <![CDATA[ */
    … …  
    958966/* ]]> */
    959967</script>
    960 <script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependency-with-blocking-following-dependency:%20script' id='defer-dependency-with-blocking-following-dependency-js' data-wp-strategy='defer'></script>
     968<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependency-with-blocking-following-dependency%3A+script' id='defer-dependency-with-blocking-following-dependency-js' data-wp-strategy='defer'></script>
    961969<script id="defer-dependency-with-blocking-following-dependency-js-after" type="text/javascript">
    962970/* <![CDATA[ */
    … …  
    971979/* ]]> */
    972980</script>
    973 <script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-dependency-with-defer-preceding-dependency:%20script' id='blocking-dependency-with-defer-preceding-dependency-js'></script>
     981<script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-dependency-with-defer-preceding-dependency%3A+script' id='blocking-dependency-with-defer-preceding-dependency-js'></script>
    974982<script id="blocking-dependency-with-defer-preceding-dependency-js-after" type="text/javascript">
    975983/* <![CDATA[ */
    … …  
    984992/* ]]> */
    985993</script>
    986 <script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-defer-and-blocking-dependencies:%20script' id='defer-dependent-of-defer-and-blocking-dependencies-js' data-wp-strategy='defer'></script>
     994<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-defer-and-blocking-dependencies%3A+script' id='defer-dependent-of-defer-and-blocking-dependencies-js' data-wp-strategy='defer'></script>
    987995<script id="defer-dependent-of-defer-and-blocking-dependencies-js-after" type="text/javascript">
    988996/* <![CDATA[ */
    … …  
    10121020/* ]]> */
    10131021</script>
    1014 <script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-with-async-dependent:%20script' id='defer-with-async-dependent-js' data-wp-strategy='defer'></script>
     1022<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-with-async-dependent%3A+script' id='defer-with-async-dependent-js' data-wp-strategy='defer'></script>
    10151023<script id="defer-with-async-dependent-js-after" type="text/javascript">
    10161024/* <![CDATA[ */
    … …  
    10251033/* ]]> */
    10261034</script>
    1027 <script type='text/javascript' src='https://example.com/external.js?script_event_log=async-dependent-of-defer:%20script' id='async-dependent-of-defer-js' data-wp-strategy='async'></script>
     1035<script type='text/javascript' src='https://example.com/external.js?script_event_log=async-dependent-of-defer%3A+script' id='async-dependent-of-defer-js' data-wp-strategy='async'></script>
    10281036<script id="async-dependent-of-defer-js-after" type="text/javascript">
    10291037/* <![CDATA[ */
    … …  
    10491057/* ]]> */
    10501058</script>
    1051 <script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-with-before-inline:%20script' id='defer-with-before-inline-js' defer='defer' data-wp-strategy='defer'></script>
     1059<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-with-before-inline%3A+script' id='defer-with-before-inline-js' defer='defer' data-wp-strategy='defer'></script>
    10521060HTML
    10531061                                ,
    … …  
    10611069                                },
    10621070                                'expected_markup' => <<<HTML
    1063 <script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-with-after-inline:%20script' id='defer-with-after-inline-js' data-wp-strategy='defer'></script>
     1071<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-with-after-inline%3A+script' id='defer-with-after-inline-js' data-wp-strategy='defer'></script>
    10641072<script id="defer-with-after-inline-js-after" type="text/javascript">
    10651073/* <![CDATA[ */
    … …  
    11071115                                },
    11081116                                'expected_markup' => <<<HTML
    1109 <script type='text/javascript' src='https://example.com/external.js?script_event_log=inner-bundle-member-one:%20script' id='inner-bundle-member-one-js' data-wp-strategy='defer'></script>
    1110 <script type='text/javascript' src='https://example.com/external.js?script_event_log=inner-bundle-member-two:%20script' id='inner-bundle-member-two-js' data-wp-strategy='defer'></script>
    1111 <script type='text/javascript' src='https://example.com/external.js?script_event_log=outer-bundle-leaf-member:%20script' id='outer-bundle-leaf-member-js'></script>
     1117<script type='text/javascript' src='https://example.com/external.js?script_event_log=inner-bundle-member-one%3A+script' id='inner-bundle-member-one-js' data-wp-strategy='defer'></script>
     1118<script type='text/javascript' src='https://example.com/external.js?script_event_log=inner-bundle-member-two%3A+script' id='inner-bundle-member-two-js' data-wp-strategy='defer'></script>
     1119<script type='text/javascript' src='https://example.com/external.js?script_event_log=outer-bundle-leaf-member%3A+script' id='outer-bundle-leaf-member-js'></script>
    11121120<script id="defer-dependent-of-nested-aliases-js-before" type="text/javascript">
    11131121/* <![CDATA[ */
    … …  
    11161124/* ]]> */
    11171125</script>
    1118 <script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-nested-aliases:%20script' id='defer-dependent-of-nested-aliases-js' data-wp-strategy='defer'></script>
     1126<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-nested-aliases%3A+script' id='defer-dependent-of-nested-aliases-js' data-wp-strategy='defer'></script>
    11191127<script id="defer-dependent-of-nested-aliases-js-after" type="text/javascript">
    11201128/* <![CDATA[ */
    … …  
    11401148                                },
    11411149                                'expected_markup' => <<<HTML
    1142 <script type='text/javascript' src='https://example.com/external.js?script_event_log=async1:%20script' id='async1-js' defer='defer' data-wp-strategy='async'></script>
    1143 <script type='text/javascript' src='https://example.com/external.js?script_event_log=async2:%20script' id='async2-js' defer='defer' data-wp-strategy='async'></script>
    1144 <script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-async-aliases:%20script' id='defer-dependent-of-async-aliases-js' defer='defer' data-wp-strategy='defer'></script>
     1150<script type='text/javascript' src='https://example.com/external.js?script_event_log=async1%3A+script' id='async1-js' defer='defer' data-wp-strategy='async'></script>
     1151<script type='text/javascript' src='https://example.com/external.js?script_event_log=async2%3A+script' id='async2-js' defer='defer' data-wp-strategy='async'></script>
     1152<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-async-aliases%3A+script' id='defer-dependent-of-async-aliases-js' defer='defer' data-wp-strategy='defer'></script>
    11451153HTML
    11461154                                ,
    … …  
    41584166                );
    41594167        }
     4168
     4169        /**
     4170         * Test query string on handle when enqueuing script directly.
     4171         *
     4172         * @ticket 64372
     4173         *
     4174         * @covers WP_Scripts::do_item
     4175         *
     4176         * @dataProvider data_varying_versions_handle_args
     4177         *
     4178         * @param mixed  $version               Version to pass when enqueuing.
     4179         * @param string $expected_query_string Expected query string portion of the script src URL.
     4180         */
     4181        public function test_varying_versions_added_to_handle_args_enqueued_scripts( $version, $expected_query_string ) {
     4182                wp_enqueue_script( 'test-script?qs1=q1&qs2=q2', '/test-script.js', array(), $version );
     4183                $markup = get_echo( 'wp_print_scripts' );
     4184
     4185                $expected = "<script type='text/javascript' src='/test-script.js?{$expected_query_string}' id='test-script-js'></script>";
     4186                $this->assertEqualHTML( $expected, $markup, '<body>', 'Expected equal snapshot for wp_print_scripts() with version ' . var_export( $version, true ) . ":\n$markup" );
     4187        }
     4188
     4189        /**
     4190         * Test query string on handle when registering then enqueuing script.
     4191         *
     4192         * @ticket 64372
     4193         *
     4194         * @covers WP_Scripts::do_item
     4195         *
     4196         * @dataProvider data_varying_versions_handle_args
     4197         *
     4198         * @param mixed  $version               Version to pass when enqueuing.
     4199         * @param string $expected_query_string Expected query string portion of the script src URL.
     4200         */
     4201        public function test_varying_versions_added_to_handle_args_registered_then_enqueued_scripts( $version, $expected_query_string ) {
     4202                wp_register_script( 'test-script', '/test-script.js', array(), $version );
     4203                wp_enqueue_script( 'test-script?qs1=q1&qs2=q2' );
     4204                $markup = get_echo( 'wp_print_scripts' );
     4205
     4206                $expected = "<script type='text/javascript' src='/test-script.js?{$expected_query_string}' id='test-script-js'></script>";
     4207                $this->assertEqualHTML( $expected, $markup, '<body>', 'Expected equal snapshot for wp_print_scripts() with version ' . var_export( $version, true ) . ":\n$markup" );
     4208        }
     4209
     4210        /**
     4211         * Data provider for:
     4212         * - test_varying_versions_added_to_handle_args_enqueued_scripts
     4213         * - test_varying_versions_added_to_handle_args_registered_then_enqueued_scripts
     4214         *
     4215         * @return array[] Data provider.
     4216         */
     4217        public function data_varying_versions_handle_args() {
     4218                $default_version = get_bloginfo( 'version' );
     4219
     4220                return array(
     4221                        'string'       => array(
     4222                                '1.0.0',
     4223                                'ver=1.0.0&amp;qs1=q1&amp;qs2=q2',
     4224                        ),
     4225                        'null'         => array(
     4226                                null,
     4227                                'qs1=q1&amp;qs2=q2',
     4228                        ),
     4229                        'false'        => array(
     4230                                false,
     4231                                "ver={$default_version}&amp;qs1=q1&amp;qs2=q2",
     4232                        ),
     4233                        'empty-string' => array(
     4234                                '',
     4235                                "ver={$default_version}&amp;qs1=q1&amp;qs2=q2",
     4236                        ),
     4237                        'zero-string'  => array(
     4238                                '0',
     4239                                "ver={$default_version}&amp;qs1=q1&amp;qs2=q2",
     4240                        ),
     4241                        'integer'      => array(
     4242                                123,
     4243                                'ver=123&amp;qs1=q1&amp;qs2=q2',
     4244                        ),
     4245                        'zero-integer' => array(
     4246                                0,
     4247                                "ver={$default_version}&amp;qs1=q1&amp;qs2=q2",
     4248                        ),
     4249                        'float'        => array(
     4250                                1.23,
     4251                                'ver=1.23&amp;qs1=q1&amp;qs2=q2',
     4252                        ),
     4253                        'zero-float'   => array(
     4254                                0.0,
     4255                                "ver={$default_version}&amp;qs1=q1&amp;qs2=q2",
     4256                        ),
     4257                );
     4258        }
    41604259}
Note: See TracChangeset for help on using the changeset viewer.