diff --git a/src/wp-includes/class-wp-scripts.php b/src/wp-includes/class-wp-scripts.php index b1e4c76c73d43..c19efd9790393 100644 --- a/src/wp-includes/class-wp-scripts.php +++ b/src/wp-includes/class-wp-scripts.php @@ -222,6 +222,11 @@ public function print_extra_script( $handle, $display = true ) { return; } + $output .= sprintf( + "\n//# sourceURL=inline:%s", + rawurlencode( "{$handle}-js-extra" ) + ); + if ( ! $display ) { return $output; } @@ -521,6 +526,11 @@ public function get_inline_script_data( $handle, $position = 'after' ) { return ''; } + $data[] = sprintf( + '//# sourceURL=inline:%s', + rawurlencode( "{$handle}-js-{$position}" ) + ); + return trim( implode( "\n", $data ), "\n" ); } diff --git a/src/wp-includes/class-wp-styles.php b/src/wp-includes/class-wp-styles.php index e64378be5fc8d..de498cc9814c7 100644 --- a/src/wp-includes/class-wp-styles.php +++ b/src/wp-includes/class-wp-styles.php @@ -337,6 +337,11 @@ public function print_inline_style( $handle, $display = true ) { return false; } + $output[] = sprintf( + '/*# sourceURL=inline:%s */', + rawurlencode( "{$handle}-inline-css" ) + ); + $output = implode( "\n", $output ); if ( ! $display ) { diff --git a/tests/phpunit/tests/blocks/editor.php b/tests/phpunit/tests/blocks/editor.php index 97d18d89529e3..f962a175b617b 100644 --- a/tests/phpunit/tests/blocks/editor.php +++ b/tests/phpunit/tests/blocks/editor.php @@ -762,6 +762,7 @@ public function test_ensure_preload_data_script_tag_closes() { HTML; diff --git a/tests/phpunit/tests/dependencies/scripts.php b/tests/phpunit/tests/dependencies/scripts.php index 2cd51aad6ab70..c40c922ffa99d 100644 --- a/tests/phpunit/tests/dependencies/scripts.php +++ b/tests/phpunit/tests/dependencies/scripts.php @@ -116,11 +116,11 @@ public function data_provider_delayed_strategies() { */ public function test_after_inline_script_with_delayed_main_script( $strategy ) { wp_enqueue_script( 'ms-isa-1', 'http://example.org/ms-isa-1.js', array(), null, compact( 'strategy' ) ); - wp_add_inline_script( 'ms-isa-1', 'console.log("after one");', 'after' ); + wp_add_inline_script( 'ms-isa-1', 'console.log(\'after one\');', 'after' ); $output = get_echo( 'wp_print_scripts' ); $expected = "\n"; $expected .= wp_get_inline_script_tag( - 'console.log("after one");', + "console.log('after one');\n//# sourceURL=inline:ms-isa-1-js-after", array( 'id' => 'ms-isa-1-js-after', ) @@ -143,12 +143,12 @@ public function test_after_inline_script_with_delayed_main_script( $strategy ) { */ public function test_after_inline_script_with_blocking_main_script() { wp_enqueue_script( 'ms-insa-3', 'http://example.org/ms-insa-3.js', array(), null ); - wp_add_inline_script( 'ms-insa-3', 'console.log("after one");', 'after' ); + wp_add_inline_script( 'ms-insa-3', 'console.log(\'after one\');', 'after' ); $output = get_echo( 'wp_print_scripts' ); $expected = "\n"; $expected .= wp_get_inline_script_tag( - 'console.log("after one");', + "console.log('after one');\n//# sourceURL=inline:ms-insa-3-js-after", array( 'id' => 'ms-insa-3-js-after', ) @@ -174,15 +174,15 @@ public function test_after_inline_script_with_blocking_main_script() { */ public function test_before_inline_scripts_with_delayed_main_script( $strategy ) { wp_enqueue_script( 'ds-i1-1', 'http://example.org/ds-i1-1.js', array(), null, compact( 'strategy' ) ); - wp_add_inline_script( 'ds-i1-1', 'console.log("before first");', 'before' ); + wp_add_inline_script( 'ds-i1-1', 'console.log(\'before first\');', 'before' ); wp_enqueue_script( 'ds-i1-2', 'http://example.org/ds-i1-2.js', array(), null, compact( 'strategy' ) ); wp_enqueue_script( 'ds-i1-3', 'http://example.org/ds-i1-3.js', array(), null, compact( 'strategy' ) ); wp_enqueue_script( 'ms-i1-1', 'http://example.org/ms-i1-1.js', array( 'ds-i1-1', 'ds-i1-2', 'ds-i1-3' ), null, compact( 'strategy' ) ); - wp_add_inline_script( 'ms-i1-1', 'console.log("before last");', 'before' ); + wp_add_inline_script( 'ms-i1-1', 'console.log(\'before last\');', 'before' ); $output = get_echo( 'wp_print_scripts' ); $expected = wp_get_inline_script_tag( - 'console.log("before first");', + "console.log('before first');\n//# sourceURL=inline:ds-i1-1-js-before", array( 'id' => 'ds-i1-1-js-before', ) @@ -191,7 +191,7 @@ public function test_before_inline_scripts_with_delayed_main_script( $strategy ) $expected .= "\n"; $expected .= "\n"; $expected .= wp_get_inline_script_tag( - 'console.log("before last");', + "console.log('before last');\n//# sourceURL=inline:ms-i1-1-js-before", array( 'id' => 'ms-i1-1-js-before', 'type' => 'text/javascript', @@ -513,23 +513,27 @@ public function data_provider_to_test_various_strategy_dependency_chains() { HTML @@ -558,34 +562,40 @@ public function data_provider_to_test_various_strategy_dependency_chains() { HTML @@ -606,23 +616,27 @@ public function data_provider_to_test_various_strategy_dependency_chains() { HTML @@ -643,23 +657,27 @@ public function data_provider_to_test_various_strategy_dependency_chains() { HTML @@ -683,22 +701,26 @@ public function data_provider_to_test_various_strategy_dependency_chains() { HTML @@ -725,34 +747,40 @@ public function data_provider_to_test_various_strategy_dependency_chains() { HTML @@ -778,22 +806,26 @@ public function data_provider_to_test_various_strategy_dependency_chains() { HTML @@ -817,34 +849,40 @@ public function data_provider_to_test_various_strategy_dependency_chains() { HTML @@ -868,34 +906,40 @@ public function data_provider_to_test_various_strategy_dependency_chains() { HTML @@ -916,23 +960,27 @@ public function data_provider_to_test_various_strategy_dependency_chains() { HTML @@ -949,6 +997,7 @@ public function data_provider_to_test_various_strategy_dependency_chains() { @@ -967,6 +1016,7 @@ public function data_provider_to_test_various_strategy_dependency_chains() { HTML @@ -1014,12 +1064,14 @@ public function data_provider_to_test_various_strategy_dependency_chains() { HTML @@ -1618,7 +1670,7 @@ public function test_wp_script_add_data_with_data_key() { // Enqueue and add data. wp_enqueue_script( 'test-only-data', 'example.com', array(), null ); wp_script_add_data( 'test-only-data', 'data', 'testing' ); - $expected = "\n"; + $expected = "\n"; $expected .= "\n"; // Go! @@ -1656,7 +1708,7 @@ public function test_wp_script_add_data_with_data_and_conditional_keys() { wp_enqueue_script( 'test-conditional-with-data', 'example.com', array(), null ); wp_script_add_data( 'test-conditional-with-data', 'data', 'testing' ); wp_script_add_data( 'test-conditional-with-data', 'conditional', 'lt IE 9' ); - $expected = "\n"; + $expected = "\n"; $expected .= "\n"; $expected = str_replace( "'", '"', $expected ); @@ -1880,6 +1932,7 @@ public function test_wp_add_inline_script_before() { HTML; @@ -1900,6 +1953,7 @@ public function test_wp_add_inline_script_after() { HTML; @@ -1915,9 +1969,9 @@ public function test_wp_add_inline_script_before_and_after() { wp_add_inline_script( 'test-example', 'console.log("before");', 'before' ); wp_add_inline_script( 'test-example', 'console.log("after");' ); - $expected = "\n"; + $expected = "\n"; $expected .= "\n"; - $expected .= "\n"; + $expected .= "\n"; $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) ); } @@ -1930,7 +1984,7 @@ public function test_wp_add_inline_script_before_for_handle_without_source() { wp_enqueue_script( 'test-example' ); wp_add_inline_script( 'test-example', 'console.log("before");', 'before' ); - $expected = "\n"; + $expected = "\n"; $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) ); } @@ -1943,7 +1997,7 @@ public function test_wp_add_inline_script_after_for_handle_without_source() { wp_enqueue_script( 'test-example' ); wp_add_inline_script( 'test-example', 'console.log("after");' ); - $expected = "\n"; + $expected = "\n"; $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) ); } @@ -1957,8 +2011,8 @@ public function test_wp_add_inline_script_before_and_after_for_handle_without_so wp_add_inline_script( 'test-example', 'console.log("before");', 'before' ); wp_add_inline_script( 'test-example', 'console.log("after");' ); - $expected = "\n"; - $expected .= "\n"; + $expected = "\n"; + $expected .= "\n"; $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) ); } @@ -1973,9 +2027,9 @@ public function test_wp_add_inline_script_multiple() { wp_add_inline_script( 'test-example', 'console.log("after");' ); wp_add_inline_script( 'test-example', 'console.log("after");' ); - $expected = "\n"; + $expected = "\n"; $expected .= "\n"; - $expected .= "\n"; + $expected .= "\n"; $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) ); } @@ -1989,10 +2043,10 @@ public function test_wp_add_inline_script_localized_data_is_added_first() { wp_add_inline_script( 'test-example', 'console.log("before");', 'before' ); wp_add_inline_script( 'test-example', 'console.log("after");' ); - $expected = "\n"; - $expected .= "\n"; + $expected = "\n"; + $expected .= "\n"; $expected .= "\n"; - $expected .= "\n"; + $expected .= "\n"; $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) ); } @@ -2013,9 +2067,9 @@ public function test_wp_add_inline_script_before_with_concat() { wp_add_inline_script( 'one', 'console.log("before one");', 'before' ); wp_add_inline_script( 'two', 'console.log("before two");', 'before' ); - $expected = "\n"; + $expected = "\n"; $expected .= "\n"; - $expected .= "\n"; + $expected .= "\n"; $expected .= "\n"; $expected .= "\n"; @@ -2037,7 +2091,7 @@ public function test_wp_add_inline_script_before_with_concat2() { wp_add_inline_script( 'one', 'console.log("before one");', 'before' ); - $expected = "\n"; + $expected = "\n"; $expected .= "\n"; $expected .= "\n"; $expected .= "\n"; @@ -2064,9 +2118,9 @@ public function test_wp_add_inline_script_after_with_concat() { $expected = "\n"; $expected .= "\n"; - $expected .= "\n"; + $expected .= "\n"; $expected .= "\n"; - $expected .= "\n"; + $expected .= "\n"; $expected .= "\n"; $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) ); @@ -2082,14 +2136,14 @@ public function test_wp_add_inline_script_after_and_before_with_concat_and_condi $wp_scripts->default_dirs = array( '/wp-admin/js/', '/wp-includes/js/' ); // Default dirs as in wp-includes/script-loader.php. $expected_localized = "\n"; $expected_localized = str_replace( "'", '"', $expected_localized ); $expected = "\n"; $expected = str_replace( "'", '"', $expected ); @@ -2117,7 +2171,7 @@ public function test_wp_add_inline_script_after_with_concat_and_core_dependency( $expected = "\n"; $expected .= "\n"; - $expected .= "\n"; + $expected .= "\n"; wp_enqueue_script( 'test-example', 'http://example.com', array( 'jquery' ), null ); wp_add_inline_script( 'test-example', 'console.log("after");' ); @@ -2142,7 +2196,7 @@ public function test_wp_add_inline_script_after_with_concat_and_conditional_and_ $expected = "\n"; $expected .= "\n"; wp_enqueue_script( 'test-example', 'http://example.com', array( 'jquery' ), null ); @@ -2168,7 +2222,7 @@ public function test_wp_add_inline_script_before_with_concat_and_core_dependency $wp_scripts->do_concat = true; $expected = "\n"; - $expected .= "\n"; + $expected .= "\n"; $expected .= "\n"; wp_enqueue_script( 'test-example', 'http://example.com', array( 'jquery' ), null ); @@ -2193,18 +2247,18 @@ public function test_wp_add_inline_script_before_after_concat_with_core_dependen $wp_scripts->do_concat = true; $expected = "\n"; - $expected .= "\n"; + $expected .= "\n"; $expected .= "\n"; $expected .= "\n"; $expected .= "\n"; $expected .= "\n"; $expected .= "\n"; - $expected .= "\n"; - + $expected .= "\n"; wp_enqueue_script( 'test-example', 'http://example.com', array( 'jquery' ), null ); wp_add_inline_script( 'test-example', 'console.log("before");', 'before' ); wp_enqueue_script( 'test-example2', 'http://example2.com', array( 'wp-a11y' ), null ); @@ -2248,6 +2302,7 @@ public function test_wp_add_inline_script_customize_dependency() { $expected_tail .= "\n"; @@ -2283,7 +2338,7 @@ public function test_wp_add_inline_script_after_for_core_scripts_with_concat_is_ wp_enqueue_script( 'four', '/wp-includes/js/script4.js' ); $expected = "\n"; - $expected .= "\n"; + $expected .= "\n"; $expected .= "\n"; $expected .= "\n"; $expected .= "\n"; @@ -2307,7 +2362,7 @@ public function test_wp_add_inline_script_before_third_core_script_prints_two_co wp_enqueue_script( 'four', '/wp-includes/js/script4.js' ); $expected = "\n"; - $expected .= "\n"; + $expected .= "\n"; $expected .= "\n"; $expected .= "\n"; @@ -2327,8 +2382,8 @@ public function data_provider_to_test_get_inline_script() { '/*before foo 1*/', ), 'delayed' => false, - 'expected_data' => '/*before foo 1*/', - 'expected_tag' => "\n", + 'expected_data' => "/*before foo 1*/\n//# sourceURL=inline:foo-js-before", + 'expected_tag' => "\n", ), 'after-blocking' => array( 'position' => 'after', @@ -2337,8 +2392,8 @@ public function data_provider_to_test_get_inline_script() { '/*after foo 2*/', ), 'delayed' => false, - 'expected_data' => "/*after foo 1*/\n/*after foo 2*/", - 'expected_tag' => "\n", + 'expected_data' => "/*after foo 1*/\n/*after foo 2*/\n//# sourceURL=inline:foo-js-after", + 'expected_tag' => "\n", ), 'before-delayed' => array( 'position' => 'before', @@ -2346,8 +2401,8 @@ public function data_provider_to_test_get_inline_script() { '/*before foo 1*/', ), 'delayed' => true, - 'expected_data' => '/*before foo 1*/', - 'expected_tag' => "\n", + 'expected_data' => "/*before foo 1*/\n//# sourceURL=inline:foo-js-before", + 'expected_tag' => "\n", ), 'after-delayed' => array( 'position' => 'after', @@ -2356,8 +2411,8 @@ public function data_provider_to_test_get_inline_script() { '/*after foo 2*/', ), 'delayed' => true, - 'expected_data' => "/*after foo 1*/\n/*after foo 2*/", - 'expected_tag' => "\n", + 'expected_data' => "/*after foo 1*/\n/*after foo 2*/\n//# sourceURL=inline:foo-js-after", + 'expected_tag' => "\n", ), ); } @@ -2999,7 +3054,7 @@ public function test_wp_localize_script_data_formats( $l10n_data, $expected ) { wp_enqueue_script( 'test-example', 'example.com', array(), null ); wp_localize_script( 'test-example', 'testExample', $l10n_data ); - $expected = "\n"; + $expected = "\n"; $expected .= "\n"; $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) ); @@ -3568,4 +3623,26 @@ private function _scripts_from_package_json() { $provider = array(); return $data['dependencies']; } + + /** + * @ticket 63887 + */ + public function test_source_url_encoding() { + $this->add_html5_script_theme_support(); + + $handle = '# test/ #'; + wp_enqueue_script( $handle, '/example.js', array(), '0.0' ); + wp_add_inline_script( $handle, '"ok";' ); + + $expected = << + + +HTML; + + $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) ); + } } diff --git a/tests/phpunit/tests/dependencies/styles.php b/tests/phpunit/tests/dependencies/styles.php index 9cb6283c488d5..bb00ced62e3e9 100644 --- a/tests/phpunit/tests/dependencies/styles.php +++ b/tests/phpunit/tests/dependencies/styles.php @@ -150,6 +150,7 @@ public function test_inline_styles() { $expected = "\n"; $expected .= "\n"; wp_enqueue_style( 'handle', 'http://example.com', array(), 1 ); @@ -179,6 +180,7 @@ public function test_inline_styles_concat() { $expected = "\n"; $expected .= "\n"; wp_enqueue_style( 'handle', 'http://example.com', array(), 1 ); @@ -274,6 +276,7 @@ public function test_multiple_inline_styles() { $expected .= "\n"; wp_enqueue_style( 'handle', 'http://example.com', array(), 1 ); @@ -292,18 +295,19 @@ public function test_multiple_inline_styles() { */ public function test_plugin_doing_inline_styles_wrong() { - $style = "'; + $style .= '}'; $expected = "\n"; + $expected .= "\n"; wp_enqueue_style( 'handle', 'http://example.com', array(), 1 ); - wp_add_inline_style( 'handle', $style ); + wp_add_inline_style( 'handle', "" ); $this->assertSame( $expected, get_echo( 'wp_print_styles' ) ); } @@ -332,6 +336,7 @@ public function test_conditional_inline_styles_are_also_conditional() { @@ -363,6 +368,7 @@ public function test_wp_add_inline_style_for_handle_without_source() { $expected .= "\n"; $expected .= "\n"; wp_register_style( 'handle-one', 'http://example.com', array(), 1 ); @@ -632,4 +638,24 @@ public function test_wp_maybe_inline_styles_no_path() { $this->assertSame( $GLOBALS['wp_styles']->registered['test-handle']->src, $url ); } + + /** + * @ticket 63887 + */ + public function test_source_url_encoding() { + $handle = '# test/ #'; + wp_enqueue_style( $handle, '/example.css', array(), '0.0' ); + wp_add_inline_style( $handle, 'custom-el { content: "ok"; }' ); + + $expected = << + + +HTML; + + $this->assertEqualHTML( $expected, get_echo( 'wp_print_styles' ) ); + } } diff --git a/tests/phpunit/tests/dependencies/wpLocalizeScript.php b/tests/phpunit/tests/dependencies/wpLocalizeScript.php index a57754973cf40..a6477ee8f4f9b 100644 --- a/tests/phpunit/tests/dependencies/wpLocalizeScript.php +++ b/tests/phpunit/tests/dependencies/wpLocalizeScript.php @@ -56,7 +56,7 @@ public function test_wp_localize_script_outputs_safe_json() { $output = get_echo( 'wp_print_scripts' ); - $expected = "\n"; + $expected = "\n"; $expected .= "\n"; $this->assertEqualHTML( $expected, $output );