From 8e7a242ca5e01eecf5893f2fd147352b0ea4cd93 Mon Sep 17 00:00:00 2001 From: Adam Silverstein Date: Mon, 1 Feb 2021 08:25:09 -0700 Subject: [PATCH 1/9] Patch from ticket. --- src/wp-includes/functions.php | 120 ++++++++++++++++ .../tests/functions/wpInlineScriptTag.php | 119 ++++++++++++++++ .../functions/wpSanitizeScriptAttributes.php | 130 ++++++++++++++++++ tests/phpunit/tests/functions/wpScriptTag.php | 94 +++++++++++++ 4 files changed, 463 insertions(+) create mode 100644 tests/phpunit/tests/functions/wpInlineScriptTag.php create mode 100644 tests/phpunit/tests/functions/wpSanitizeScriptAttributes.php create mode 100644 tests/phpunit/tests/functions/wpScriptTag.php diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php index 536f195b14875..a6c63681f8be2 100644 --- a/src/wp-includes/functions.php +++ b/src/wp-includes/functions.php @@ -7781,3 +7781,123 @@ function is_php_version_compatible( $required ) { function wp_fuzzy_number_match( $expected, $actual, $precision = 1 ) { return abs( (float) $expected - (float) $actual ) <= $precision; } + +/** + * Sanitizes an attributes array into an attributes string to be placed inside a `\n", wp_sanitize_script_attributes( $attributes ) ); +} + +/** + * Prints formatted `\n", wp_sanitize_script_attributes( $attributes ), $javascript ); +} + +/** + * Prints inline JavaScript wrapped in `\n", + wp_get_inline_script_tag( + $this->event_handler, + array( + 'type' => 'application/javascript', + 'async' => false, + 'nomodule' => true, + ) + ) + ); + + remove_theme_support( 'html5' ); + + $this->assertSame( + '\n", + wp_get_inline_script_tag( + $this->event_handler, + array( + 'type' => 'application/javascript', + 'async' => false, + 'nomodule' => true, + ) + ) + ); + } + + function test_get_inline_script_tag_type_not_set() { + add_theme_support( 'html5', array( 'script' ) ); + + $this->assertSame( + "\n", + wp_get_inline_script_tag( + $this->event_handler, + array( + 'async' => false, + 'nomodule' => true, + ) + ) + ); + + remove_theme_support( 'html5' ); + } + + function test_get_inline_script_tag_unescaped_src() { + add_theme_support( 'html5', array( 'script' ) ); + + $this->assertSame( + "\n", + wp_get_inline_script_tag( $this->event_handler ) + ); + + remove_theme_support( 'html5' ); + } + + function test_print_script_tag_prints_get_inline_script_tag() { + add_filter( + 'wp_script_attributes', + function ( $attributes ) { + if ( isset( $attributes['id'] ) && 'utils-js-extra' === $attributes['id'] ) { + $attributes['async'] = true; + } + return $attributes; + } + ); + + add_theme_support( 'html5', array( 'script' ) ); + + $attributes = array( + 'id' => 'utils-js-before', + 'nomodule' => true, + ); + + $this->assertSame( + wp_get_inline_script_tag( $this->event_handler, $attributes ), + get_echo( + 'wp_print_inline_script_tag', + array( + $this->event_handler, + $attributes, + ) + ) + ); + + remove_theme_support( 'html5' ); + + $this->assertSame( + wp_get_inline_script_tag( $this->event_handler, $attributes ), + get_echo( + 'wp_print_inline_script_tag', + array( + $this->event_handler, + $attributes, + ) + ) + ); + } +} diff --git a/tests/phpunit/tests/functions/wpSanitizeScriptAttributes.php b/tests/phpunit/tests/functions/wpSanitizeScriptAttributes.php new file mode 100644 index 0000000000000..dd060ebd5daf4 --- /dev/null +++ b/tests/phpunit/tests/functions/wpSanitizeScriptAttributes.php @@ -0,0 +1,130 @@ +assertSame( + ' type="application/javascript" src="https://DOMAIN.TLD/PATH/FILE.js" nomodule', + wp_sanitize_script_attributes( + array( + 'type' => 'application/javascript', + 'src' => 'https://DOMAIN.TLD/PATH/FILE.js', + 'async' => false, + 'nomodule' => true, + ) + ) + ); + + remove_theme_support( 'html5' ); + + $this->assertSame( + ' src="https://DOMAIN.TLD/PATH/FILE.js" type="application/javascript" nomodule="nomodule"', + wp_sanitize_script_attributes( + array( + 'src' => 'https://DOMAIN.TLD/PATH/FILE.js', + 'type' => 'application/javascript', + 'async' => false, + 'nomodule' => true, + ) + ) + ); + } + + function test_sanitize_script_attributes_type_not_set() { + add_theme_support( 'html5', array( 'script' ) ); + + $this->assertSame( + ' src="https://DOMAIN.TLD/PATH/FILE.js" nomodule', + wp_sanitize_script_attributes( + array( + 'src' => 'https://DOMAIN.TLD/PATH/FILE.js', + 'async' => false, + 'nomodule' => true, + ) + ) + ); + + remove_theme_support( 'html5' ); + + $this->assertSame( + ' src="https://DOMAIN.TLD/PATH/FILE.js" nomodule="nomodule"', + wp_sanitize_script_attributes( + array( + 'src' => 'https://DOMAIN.TLD/PATH/FILE.js', + 'async' => false, + 'nomodule' => true, + ) + ) + ); + } + + + function test_sanitize_script_attributes_no_attributes() { + add_theme_support( 'html5', array( 'script' ) ); + + $this->assertSame( + '', + wp_sanitize_script_attributes( array() ) + ); + + remove_theme_support( 'html5' ); + } + + function test_sanitize_script_attributes_relative_src() { + add_theme_support( 'html5', array( 'script' ) ); + + $this->assertSame( + ' src="PATH/FILE.js" nomodule', + wp_sanitize_script_attributes( + array( + 'src' => 'PATH/FILE.js', + 'async' => false, + 'nomodule' => true, + ) + ) + ); + + remove_theme_support( 'html5' ); + } + + + function test_sanitize_script_attributes_only_false_boolean_attributes() { + add_theme_support( 'html5', array( 'script' ) ); + + $this->assertSame( + '', + wp_sanitize_script_attributes( + array( + 'async' => false, + 'nomodule' => false, + ) + ) + ); + + remove_theme_support( 'html5' ); + } + + function test_sanitize_script_attributes_only_true_boolean_attributes() { + add_theme_support( 'html5', array( 'script' ) ); + + $this->assertSame( + ' async nomodule', + wp_sanitize_script_attributes( + array( + 'async' => true, + 'nomodule' => true, + ) + ) + ); + + remove_theme_support( 'html5' ); + } + +} diff --git a/tests/phpunit/tests/functions/wpScriptTag.php b/tests/phpunit/tests/functions/wpScriptTag.php new file mode 100644 index 0000000000000..3c451f5359cad --- /dev/null +++ b/tests/phpunit/tests/functions/wpScriptTag.php @@ -0,0 +1,94 @@ +assertSame( + '' . "\n", + wp_get_script_tag( + array( + 'type' => 'application/javascript', + 'src' => 'https://localhost/PATH/FILE.js', + 'async' => false, + 'nomodule' => true, + ) + ) + ); + + remove_theme_support( 'html5' ); + + $this->assertSame( + '' . "\n", + wp_get_script_tag( + array( + 'src' => 'https://localhost/PATH/FILE.js', + 'type' => 'application/javascript', + 'async' => false, + 'nomodule' => true, + ) + ) + ); + } + + function test_get_script_tag_type_not_set() { + add_theme_support( 'html5', array( 'script' ) ); + + $this->assertSame( + '' . "\n", + wp_get_script_tag( + array( + 'src' => 'https://localhost/PATH/FILE.js', + 'async' => false, + 'nomodule' => true, + ) + ) + ); + + remove_theme_support( 'html5' ); + } + + function test_print_script_tag_prints_get_script_tag() { + add_filter( + 'wp_script_attributes', + function ( $attributes ) { + if ( isset( $attributes['id'] ) && 'utils-js-extra' === $attributes['id'] ) { + $attributes['async'] = true; + } + return $attributes; + } + ); + + add_theme_support( 'html5', array( 'script' ) ); + + $attributes = array( + 'src' => 'https://localhost/PATH/FILE.js', + 'id' => 'utils-js-extra', + 'nomodule' => true, + ); + + $this->assertSame( + wp_get_script_tag( $attributes ), + get_echo( + 'wp_print_script_tag', + array( $attributes ) + ) + ); + + remove_theme_support( 'html5' ); + + $this->assertSame( + wp_get_script_tag( $attributes ), + get_echo( + 'wp_print_script_tag', + array( $attributes ) + ) + ); + } +} From 76c2fc93ea11d8c9c030f74dc06917c5a3f872e9 Mon Sep 17 00:00:00 2001 From: Adam Silverstein Date: Mon, 1 Feb 2021 08:38:59 -0700 Subject: [PATCH 2/9] Cleanup; docblocks. --- src/wp-includes/functions.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php index a6c63681f8be2..c32d8c3227e58 100644 --- a/src/wp-includes/functions.php +++ b/src/wp-includes/functions.php @@ -7788,7 +7788,7 @@ function wp_fuzzy_number_match( $expected, $actual, $precision = 1 ) { * Automatically injects type attribute if needed. * Used by {@see wp_get_script_tag()} and {@see wp_get_inline_script_tag()}. * - * @since 5.6.0 + * @since 5.7.0 * * @param array $attributes Key-value pairs representing `