WordPress.org

Make WordPress Core

Ticket #14853: 14853.2.diff

File 14853.2.diff, 10.5 KB (added by swissspidy, 4 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 298eda7..1fc0eff 100644
    class WP_Scripts extends WP_Dependencies { 
    154154                         * @param string $handle Script handle.
    155155                         */
    156156                        $srce = apply_filters( 'script_loader_src', $src, $handle );
     157
    157158                        if ( $this->in_default_dir( $srce ) && ! $conditional ) {
    158159                                $this->print_code .= $this->print_extra_script( $handle, false );
    159160                                $this->concat .= "$handle,";
    class WP_Scripts extends WP_Dependencies { 
    163164                                $this->ext_handles .= "$handle,";
    164165                                $this->ext_version .= "$handle$ver";
    165166                        }
     167
    166168                }
    167169
    168170                $has_conditional_data = $conditional && $this->get_data( $handle, 'data' );
    class WP_Scripts extends WP_Dependencies { 
    190192                if ( ! $src )
    191193                        return true;
    192194
    193                 $tag = "{$cond_before}<script type='text/javascript' src='$src'></script>\n{$cond_after}";
     195                $before_handle = $this->print_inline_script( $handle, 'before', false );
     196                if ( $before_handle ) {
     197                        $before_handle = sprintf( "<script type='text/javascript'>\n%s\n</script>\n", $before_handle );
     198                }
     199                $after_handle = $this->print_inline_script( $handle, 'after', false );
     200                if ( $after_handle ) {
     201                        $after_handle = sprintf( "<script type='text/javascript'>\n%s\n</script>\n", $after_handle );
     202                }
     203
     204                $tag = "{$cond_before}{$before_handle}<script type='text/javascript' src='$src'></script>\n{$after_handle}{$cond_after}";
    194205
    195206                /**
    196207                 * Filter the HTML script tag of an enqueued script.
    class WP_Scripts extends WP_Dependencies { 
    213224        }
    214225
    215226        /**
     227         * Add extra code to a registered script.
     228         *
     229         * @since 4.5.0
     230         *
     231         * @param string $handle   Name of the script to add the inline script to. Must be lowercase.
     232         * @param string $data     String containing the javascript to be added.
     233         * @param string $position Optional. Whether to add the inline script before the handle
     234         *                         or after. Default 'after'.
     235         *
     236         * @return bool True on success, false on failure.
     237         */
     238        public function add_inline_script( $handle, $data, $position = 'after' ) {
     239                if ( ! $data ) {
     240                        return false;
     241                }
     242
     243                if ( 'after' !== $position ) {
     244                        $position = 'before';
     245                }
     246
     247                $script   = (array) $this->get_data( $handle, $position );
     248                $script[] = $data;
     249
     250                return $this->add_data( $handle, $position, $script );
     251        }
     252
     253        /**
     254         * Print inline scripts registered for a specific handle.
     255         *
     256         * @param string $handle   Name of the script to add the inline script to. Must be lowercase.
     257         * @param string $position Optional. Whether to add the inline script before the handle
     258         *                         or after. Default 'after'.
     259         * @param bool $echo       Optional. Whether to echo the script instead of just returning it.
     260         *                         Default true.
     261         * @return string|bool Script on success, false otherwise.
     262         */
     263        public function print_inline_script( $handle, $position = 'after', $echo = true ) {
     264                $output = $this->get_data( $handle, $position );
     265
     266                if ( empty( $output ) ) {
     267                        return false;
     268                }
     269
     270                $output = trim( implode( "\n", $output ), "\n" );
     271
     272                if ( $echo ) {
     273                        printf( "<script type='text/javascript'>\n%s\n</script>\n", $output );
     274                }
     275
     276                return $output;
     277        }
     278
     279        /**
    216280         * Localizes a script, only if the script has already been added
    217281         *
    218282         * @param string $handle
  • 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.
  • tests/phpunit/tests/dependencies/scripts.php

    diff --git tests/phpunit/tests/dependencies/scripts.php tests/phpunit/tests/dependencies/scripts.php
    index 73680df..61b238e 100644
    class Tests_Dependencies_Scripts extends WP_UnitTestCase { 
    166166        $this->assertFalse( wp_register_script( 'duplicate-handler', 'http://example.com' ) );
    167167    }
    168168
     169        /**
     170         * @ticket 14853
     171         */
     172        function test_wp_add_inline_script_returns_bool() {
     173                $this->assertFalse( wp_add_inline_script( 'test-example', 'console.log("before");', 'before' ) );
     174                wp_enqueue_script( 'test-example', 'example.com', array(), null );
     175                $this->assertTrue( wp_add_inline_script( 'test-example', 'console.log("before");', 'before' ) );
     176        }
     177
     178        /**
     179         * @ticket 14853
     180         */
     181        function test_wp_add_inline_script_unknown_handle() {
     182                $this->assertFalse( wp_add_inline_script( 'test-invalid', 'console.log("before");', 'before' ) );
     183                $this->assertEquals( '', get_echo( 'wp_print_scripts' ) );
     184        }
     185
     186        /**
     187         * @ticket 14853
     188         */
     189        function test_wp_add_inline_script_before() {
     190                wp_enqueue_script( 'test-example', 'example.com', array(), null );
     191                wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
     192
     193                $expected = "<script type='text/javascript'>\nconsole.log(\"before\");\n</script>\n";
     194                $expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
     195
     196                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     197        }
     198
     199        /**
     200         * @ticket 14853
     201         */
     202        function test_wp_add_inline_script_after() {
     203                wp_enqueue_script( 'test-example', 'example.com', array(), null );
     204                wp_add_inline_script( 'test-example', 'console.log("after");' );
     205
     206                $expected = "<script type='text/javascript' src='http://example.com'></script>\n";
     207                $expected .= "<script type='text/javascript'>\nconsole.log(\"after\");\n</script>\n";
     208
     209                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     210        }
     211
     212        /**
     213         * @ticket 14853
     214         */
     215        function test_wp_add_inline_script_before_and_after() {
     216                wp_enqueue_script( 'test-example', 'example.com', array(), null );
     217                wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
     218                wp_add_inline_script( 'test-example', 'console.log("after");' );
     219
     220                $expected = "<script type='text/javascript'>\nconsole.log(\"before\");\n</script>\n";
     221                $expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
     222                $expected .= "<script type='text/javascript'>\nconsole.log(\"after\");\n</script>\n";
     223
     224                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     225        }
     226
     227        /**
     228         * @ticket 14853
     229         */
     230        function test_wp_add_inline_script_multiple() {
     231                wp_enqueue_script( 'test-example', 'example.com', array(), null );
     232                wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
     233                wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
     234                wp_add_inline_script( 'test-example', 'console.log("after");' );
     235                wp_add_inline_script( 'test-example', 'console.log("after");' );
     236
     237                $expected = "<script type='text/javascript'>\nconsole.log(\"before\");\nconsole.log(\"before\");\n</script>\n";
     238                $expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
     239                $expected .= "<script type='text/javascript'>\nconsole.log(\"after\");\nconsole.log(\"after\");\n</script>\n";
     240
     241                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     242        }
     243
     244        /**
     245         * @ticket 14853
     246         */
     247        function test_wp_add_inline_script_localized_data_is_added_first() {
     248                wp_enqueue_script( 'test-example', 'example.com', array(), null );
     249                wp_localize_script( 'test-example', 'testExample', array( 'foo' => 'bar' ) );
     250                wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
     251                wp_add_inline_script( 'test-example', 'console.log("after");' );
     252
     253                $expected = "<script type='text/javascript'>\n/* <![CDATA[ */\nvar testExample = {\"foo\":\"bar\"};\n/* ]]> */\n</script>\n";
     254                $expected .= "<script type='text/javascript'>\nconsole.log(\"before\");\n</script>\n";
     255                $expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
     256                $expected .= "<script type='text/javascript'>\nconsole.log(\"after\");\n</script>\n";
     257
     258                $this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
     259        }
     260
     261        /**
     262         * @ticket 14853
     263         */
     264        public function test_wp_add_inline_script_concat() {
     265                global $wp_scripts;
     266
     267                $wp_scripts->do_concat = true;
     268                $wp_scripts->default_dirs = array('/wp-admin/js/', '/wp-includes/js/'); // Default dirs as in wp-includes/script-loader.php
     269
     270                $expected_localized = "<!--[if gte IE 9]>\n";
     271                $expected_localized .= "<script type='text/javascript'>\n/* <![CDATA[ */\nvar testExample = {\"foo\":\"bar\"};\n/* ]]> */\n</script>\n";
     272                $expected_localized .= "<![endif]-->\n";
     273
     274                $expected = "<!--[if gte IE 9]>\n";
     275                $expected .= "<script type='text/javascript'>\nconsole.log(\"before\");\n</script>\n";
     276                $expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
     277                $expected .= "<script type='text/javascript'>\nconsole.log(\"after\");\n</script>\n";
     278                $expected .= "<![endif]-->\n";
     279
     280                wp_enqueue_script( 'test-example', 'example.com', array(), null );
     281                wp_localize_script( 'test-example', 'testExample', array( 'foo' => 'bar' ) );
     282                wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
     283                wp_add_inline_script( 'test-example', 'console.log("after");' );
     284                wp_script_add_data( 'test-example', 'conditional', 'gte IE 9' );
     285
     286                $this->assertEquals( $expected_localized, get_echo( 'wp_print_scripts' ) );
     287                $this->assertEquals( $expected, $wp_scripts->print_html );
     288        }
    169289}