WordPress.org

Make WordPress Core

Ticket #14853: 14853.5.diff

File 14853.5.diff, 12.1 KB (added by swissspidy, 3 years ago)
  • src/wp-includes/class.wp-scripts.php

    diff --git src/wp-includes/class.wp-scripts.php src/wp-includes/class.wp-scripts.php
    index 5d8fb17..64bbafb 100644
    class WP_Scripts extends WP_Dependencies { 
    2525        public $concat_version = '';
    2626        public $do_concat = false;
    2727        public $print_html = '';
     28        public $print_html_before = '';
    2829        public $print_code = '';
    2930        public $ext_handles = '';
    3031        public $ext_version = '';
    class WP_Scripts extends WP_Dependencies { 
    144145                        $cond_after = "<![endif]-->\n";
    145146                }
    146147
     148                $before_handle = $this->print_inline_script( $handle, 'before', false );
     149                $after_handle = $this->print_inline_script( $handle, 'after', false );
     150
     151                if ( $before_handle ) {
     152                        $before_handle = sprintf( "<script type='text/javascript'>\n%s\n</script>\n", $before_handle );
     153                }
     154
     155                if ( $after_handle ) {
     156                        $after_handle = sprintf( "<script type='text/javascript'>\n%s\n</script>\n", $after_handle );
     157                }
     158
    147159                if ( $this->do_concat ) {
    148160                        /**
    149161                         * Filter the script loader source.
    class WP_Scripts extends WP_Dependencies { 
    154166                         * @param string $handle Script handle.
    155167                         */
    156168                        $srce = apply_filters( 'script_loader_src', $src, $handle );
    157                         if ( $this->in_default_dir( $srce ) && ! $conditional ) {
     169
     170                        if ( $before_handle && ! $conditional ) {
     171                                $this->print_html_before .= $before_handle;
     172                        }
     173
     174                        if ( $this->in_default_dir( $srce ) && ! $conditional && ! $after_handle ) {
    158175                                $this->print_code .= $this->print_extra_script( $handle, false );
    159176                                $this->concat .= "$handle,";
    160177                                $this->concat_version .= "$handle$ver";
    class WP_Scripts extends WP_Dependencies { 
    195212                if ( ! $src )
    196213                        return true;
    197214
    198                 $tag = "{$cond_before}<script type='text/javascript' src='$src'></script>\n{$cond_after}";
     215                $tag = "{$cond_before}{$before_handle}<script type='text/javascript' src='$src'></script>\n{$after_handle}{$cond_after}";
    199216
    200217                /**
    201218                 * Filter the HTML script tag of an enqueued script.
    class WP_Scripts extends WP_Dependencies { 
    209226                $tag = apply_filters( 'script_loader_tag', $tag, $handle, $src );
    210227
    211228                if ( $this->do_concat ) {
    212                         $this->print_html .= $tag;
     229                        if ( $after_handle ) {
     230                                $this->print_html_before .= $tag;
     231                        } else {
     232                                $this->print_html .= $tag;
     233                        }
    213234                } else {
    214235                        echo $tag;
    215236                }
    class WP_Scripts extends WP_Dependencies { 
    218239        }
    219240
    220241        /**
     242         * Add extra code to a registered script.
     243         *
     244         * @since 4.5.0
     245         *
     246         * @param string $handle   Name of the script to add the inline script to. Must be lowercase.
     247         * @param string $data     String containing the javascript to be added.
     248         * @param string $position Optional. Whether to add the inline script before the handle
     249         *                         or after. Default 'after'.
     250         *
     251         * @return bool True on success, false on failure.
     252         */
     253        public function add_inline_script( $handle, $data, $position = 'after' ) {
     254                if ( ! $data ) {
     255                        return false;
     256                }
     257
     258                if ( 'after' !== $position ) {
     259                        $position = 'before';
     260                }
     261
     262                $script   = (array) $this->get_data( $handle, $position );
     263                $script[] = $data;
     264
     265                return $this->add_data( $handle, $position, $script );
     266        }
     267
     268        /**
     269         * Print inline scripts registered for a specific handle.
     270         *
     271         * @param string $handle   Name of the script to add the inline script to. Must be lowercase.
     272         * @param string $position Optional. Whether to add the inline script before the handle
     273         *                         or after. Default 'after'.
     274         * @param bool $echo       Optional. Whether to echo the script instead of just returning it.
     275         *                         Default true.
     276         * @return string|bool Script on success, false otherwise.
     277         */
     278        public function print_inline_script( $handle, $position = 'after', $echo = true ) {
     279                $output = $this->get_data( $handle, $position );
     280
     281                if ( empty( $output ) ) {
     282                        return false;
     283                }
     284
     285                $output = trim( implode( "\n", $output ), "\n" );
     286
     287                if ( $echo ) {
     288                        printf( "<script type='text/javascript'>\n%s\n</script>\n", $output );
     289                }
     290
     291                return $output;
     292        }
     293
     294        /**
    221295         * Localizes a script, only if the script has already been added
    222296         *
    223297         * @param string $handle
    class WP_Scripts extends WP_Dependencies { 
    339413                $this->concat = '';
    340414                $this->concat_version = '';
    341415                $this->print_html = '';
     416                $this->print_html_before = '';
    342417                $this->ext_version = '';
    343418                $this->ext_handles = '';
    344419        }
  • src/wp-includes/functions.wp-scripts.php

    diff --git src/wp-includes/functions.wp-scripts.php src/wp-includes/functions.wp-scripts.php
    index c83a9d1..6741e07 100644
    function wp_print_scripts( $handles = false ) { 
    8686}
    8787
    8888/**
     89 * Add extra code to a registered script.
     90 *
     91 * Code will only be added if the script in already in the queue.
     92 * Accepts a string $data containing the Code. If two or more code blocks
     93 * are added to the same script $handle, they will be printed in the order
     94 * they were added, i.e. the latter added code can redeclare the previous.
     95 *
     96 * @since 4.5.0
     97 *
     98 * @see WP_Scripts::add_inline_script()
     99 *
     100 * @param string $handle   Name of the script to add the inline script to. Must be lowercase.
     101 * @param string $data     String containing the javascript to be added.
     102 * @param string $position Optional. Whether to add the inline script before the handle
     103 *                         or after. Default 'after'.
     104 * @return bool True on success, false on failure.
     105 */
     106function wp_add_inline_script( $handle, $data, $position = 'after' ) {
     107        _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );
     108
     109        if ( false !== stripos( $data, '</script>' ) ) {
     110                _doing_it_wrong( __FUNCTION__, __( 'Do not pass script tags to wp_add_inline_script().' ), '4.5.0' );
     111                $data = trim( preg_replace( '#<script[^>]*>(.*)</script>#is', '$1', $data ) );
     112        }
     113
     114        return wp_scripts()->add_inline_script( $handle, $data, $position );
     115}
     116
     117
     118/**
    89119 * Register a new script.
    90120 *
    91121 * Registers a script to be linked later using the wp_enqueue_script() function.
  • src/wp-includes/script-loader.php

    diff --git src/wp-includes/script-loader.php src/wp-includes/script-loader.php
    index 826e2ac..86c0661 100644
    function _print_scripts() { 
    992992                        echo "</script>\n";
    993993                }
    994994
     995                if ( ! empty( $wp_scripts->print_html_before ) ) {
     996                        echo $wp_scripts->print_html_before;
     997                }
     998
    995999                $concat = str_split( $concat, 128 );
    9961000                $concat = 'load%5B%5D=' . implode( '&load%5B%5D=', $concat );
    9971001
  • tests/phpunit/tests/dependencies/scripts.php

    diff --git tests/phpunit/tests/dependencies/scripts.php tests/phpunit/tests/dependencies/scripts.php
    index d7ba263..0eca849 100644
    class Tests_Dependencies_Scripts extends WP_UnitTestCase { 
    266266                $this->assertEquals( $expected_header, $header );
    267267                $this->assertEquals( $expected_footer, $footer );
    268268        }
     269
     270        /**
     271         * @ticket 14853
     272         */
     273        function test_wp_add_inline_script_returns_bool() {
     274                $this->assertFalse( wp_add_inline_script( 'test-example', 'console.log("before");', 'before' ) );
     275                wp_enqueue_script( 'test-example', 'example.com', array(), null );
     276                $this->assertTrue( wp_add_inline_script( 'test-example', 'console.log("before");', 'before' ) );
     277        }
     278
     279        /**
     280         * @ticket 14853
     281         */
     282        function test_wp_add_inline_script_unknown_handle() {
     283                $this->assertFalse( wp_add_inline_script( 'test-invalid', 'console.log("before");', 'before' ) );
     284                $this->assertEquals( '', get_echo( 'wp_print_scripts' ) );
     285        }
     286
     287        /**
     288         * @ticket 14853
     289         */
     290        function test_wp_add_inline_script_before() {
     291                wp_enqueue_script( 'test-example', 'example.com', array(), null );
     292                wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
     293
     294                $expected = "<script type='text/javascript'>\nconsole.log(\"before\");\n</script>\n";
     295                $expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
     296
     297                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     298        }
     299
     300        /**
     301         * @ticket 14853
     302         */
     303        function test_wp_add_inline_script_after() {
     304                wp_enqueue_script( 'test-example', 'example.com', array(), null );
     305                wp_add_inline_script( 'test-example', 'console.log("after");' );
     306
     307                $expected = "<script type='text/javascript' src='http://example.com'></script>\n";
     308                $expected .= "<script type='text/javascript'>\nconsole.log(\"after\");\n</script>\n";
     309
     310                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     311        }
     312
     313        /**
     314         * @ticket 14853
     315         */
     316        function test_wp_add_inline_script_before_and_after() {
     317                wp_enqueue_script( 'test-example', 'example.com', array(), null );
     318                wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
     319                wp_add_inline_script( 'test-example', 'console.log("after");' );
     320
     321                $expected = "<script type='text/javascript'>\nconsole.log(\"before\");\n</script>\n";
     322                $expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
     323                $expected .= "<script type='text/javascript'>\nconsole.log(\"after\");\n</script>\n";
     324
     325                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     326        }
     327
     328        /**
     329         * @ticket 14853
     330         */
     331        function test_wp_add_inline_script_multiple() {
     332                wp_enqueue_script( 'test-example', 'example.com', array(), null );
     333                wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
     334                wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
     335                wp_add_inline_script( 'test-example', 'console.log("after");' );
     336                wp_add_inline_script( 'test-example', 'console.log("after");' );
     337
     338                $expected = "<script type='text/javascript'>\nconsole.log(\"before\");\nconsole.log(\"before\");\n</script>\n";
     339                $expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
     340                $expected .= "<script type='text/javascript'>\nconsole.log(\"after\");\nconsole.log(\"after\");\n</script>\n";
     341
     342                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     343        }
     344
     345        /**
     346         * @ticket 14853
     347         */
     348        function test_wp_add_inline_script_localized_data_is_added_first() {
     349                wp_enqueue_script( 'test-example', 'example.com', array(), null );
     350                wp_localize_script( 'test-example', 'testExample', array( 'foo' => 'bar' ) );
     351                wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
     352                wp_add_inline_script( 'test-example', 'console.log("after");' );
     353
     354                $expected = "<script type='text/javascript'>\n/* <![CDATA[ */\nvar testExample = {\"foo\":\"bar\"};\n/* ]]> */\n</script>\n";
     355                $expected .= "<script type='text/javascript'>\nconsole.log(\"before\");\n</script>\n";
     356                $expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
     357                $expected .= "<script type='text/javascript'>\nconsole.log(\"after\");\n</script>\n";
     358
     359                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     360        }
     361
     362        /**
     363         * @ticket 14853
     364         */
     365        public function test_wp_add_inline_script_concat() {
     366                global $wp_scripts;
     367
     368                $wp_scripts->do_concat = true;
     369                $wp_scripts->default_dirs = array('/wp-admin/js/', '/wp-includes/js/'); // Default dirs as in wp-includes/script-loader.php
     370
     371                $expected_localized = "<!--[if gte IE 9]>\n";
     372                $expected_localized .= "<script type='text/javascript'>\n/* <![CDATA[ */\nvar testExample = {\"foo\":\"bar\"};\n/* ]]> */\n</script>\n";
     373                $expected_localized .= "<![endif]-->\n";
     374
     375                $expected = "<!--[if gte IE 9]>\n";
     376                $expected .= "<script type='text/javascript'>\nconsole.log(\"before\");\n</script>\n";
     377                $expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
     378                $expected .= "<script type='text/javascript'>\nconsole.log(\"after\");\n</script>\n";
     379                $expected .= "<![endif]-->\n";
     380
     381                wp_enqueue_script( 'test-example', 'example.com', array(), null );
     382                wp_localize_script( 'test-example', 'testExample', array( 'foo' => 'bar' ) );
     383                wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
     384                wp_add_inline_script( 'test-example', 'console.log("after");' );
     385                wp_script_add_data( 'test-example', 'conditional', 'gte IE 9' );
     386
     387                $this->assertEquals( $expected_localized, get_echo( 'wp_print_scripts' ) );
     388                $this->assertEquals( $expected, $wp_scripts->print_html_before );
     389                $this->assertEquals( '', $wp_scripts->print_html );
     390        }
    269391}