From a27c61f7c259197f0ba009403a12c9d965ad90bd Mon Sep 17 00:00:00 2001 From: Dominik Schilling Date: Tue, 12 Jul 2016 11:31:58 +0000 Subject: [PATCH] Resource Hints: Remove schemes from `dns-prefetch` resource hint outputs. "wordpress.org", "!http://wordpress.org", and "!https://wordpress.org" should all have the same DNS lookup. Also, replace `\r\n` with `\n` and ensure that invalid URLs are skipped. Props niallkennedy, peterwilsoncc. Fixes #37240. git-svn-id: https://develop.svn.wordpress.org/trunk@38036 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/general-template.php | 20 ++++++++--- tests/phpunit/tests/general/resourceHints.php | 34 +++++++++++-------- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/wp-includes/general-template.php b/src/wp-includes/general-template.php index bf0614bd22..2bcdb43801 100644 --- a/src/wp-includes/general-template.php +++ b/src/wp-includes/general-template.php @@ -2815,25 +2815,37 @@ function wp_resource_hints() { * @param string $relation_type The relation type the URLs are printed for, e.g. 'preconnect' or 'prerender'. */ $urls = apply_filters( 'wp_resource_hints', $urls, $relation_type ); - $urls = array_unique( $urls ); - foreach ( $urls as $url ) { + foreach ( $urls as $key => $url ) { $url = esc_url( $url, array( 'http', 'https' ) ); + if ( ! $url ) { + unset( $urls[ $key ] ); + continue; + } if ( in_array( $relation_type, array( 'preconnect', 'dns-prefetch' ) ) ) { $parsed = wp_parse_url( $url ); if ( empty( $parsed['host'] ) ) { + unset( $urls[ $key ] ); continue; } - if ( ! empty( $parsed['scheme'] ) ) { + if ( 'dns-prefetch' === $relation_type ) { + $url = '//' . $parsed['host']; + } else if ( ! empty( $parsed['scheme'] ) ) { $url = $parsed['scheme'] . '://' . $parsed['host']; } else { $url = $parsed['host']; } } - printf( "\r\n", $relation_type, $url ); + $urls[ $key ] = $url; + } + + $urls = array_unique( $urls ); + + foreach ( $urls as $url ) { + printf( "\n", $relation_type, $url ); } } } diff --git a/tests/phpunit/tests/general/resourceHints.php b/tests/phpunit/tests/general/resourceHints.php index 351e6df917..7041a6130e 100644 --- a/tests/phpunit/tests/general/resourceHints.php +++ b/tests/phpunit/tests/general/resourceHints.php @@ -31,7 +31,7 @@ class Tests_WP_Resource_Hints extends WP_UnitTestCase { } function test_should_have_defaults_on_frontend() { - $expected = "\r\n"; + $expected = "\n"; $this->expectOutputString( $expected ); @@ -39,10 +39,10 @@ class Tests_WP_Resource_Hints extends WP_UnitTestCase { } function test_dns_prefetching() { - $expected = "\r\n" . - "\r\n" . - "\r\n" . - "\r\n"; + $expected = "\n" . + "\n" . + "\n" . + "\n"; add_filter( 'wp_resource_hints', array( $this, '_add_dns_prefetch_domains' ), 10, 2 ); @@ -56,18 +56,21 @@ class Tests_WP_Resource_Hints extends WP_UnitTestCase { function _add_dns_prefetch_domains( $hints, $method ) { if ( 'dns-prefetch' === $method ) { $hints[] = 'http://wordpress.org'; + $hints[] = 'https://wordpress.org'; + $hints[] = 'htps://wordpress.org'; // Invalid URLs should be skipped. $hints[] = 'https://google.com'; $hints[] = '//make.wordpress.org'; + $hints[] = 'https://wordpress.org/plugins/'; } return $hints; } function test_prerender() { - $expected = "\r\n" . - "\r\n" . - "\r\n" . - "\r\n"; + $expected = "\n" . + "\n" . + "\n" . + "\n"; add_filter( 'wp_resource_hints', array( $this, '_add_prerender_urls' ), 10, 2 ); @@ -83,14 +86,15 @@ class Tests_WP_Resource_Hints extends WP_UnitTestCase { $hints[] = 'https://make.wordpress.org/great-again'; $hints[] = 'http://jobs.wordpress.net'; $hints[] = '//core.trac.wordpress.org'; + $hints[] = 'htps://wordpress.org'; // Invalid URLs should be skipped. } return $hints; } function test_parse_url_dns_prefetch() { - $expected = "\r\n" . - "\r\n"; + $expected = "\n" . + "\n"; add_filter( 'wp_resource_hints', array( $this, '_add_dns_prefetch_long_urls' ), 10, 2 ); @@ -110,8 +114,8 @@ class Tests_WP_Resource_Hints extends WP_UnitTestCase { } function test_dns_prefetch_styles() { - $expected = "\r\n" . - "\r\n"; + $expected = "\n" . + "\n"; $args = array( 'family' => 'Open+Sans:400', @@ -129,8 +133,8 @@ class Tests_WP_Resource_Hints extends WP_UnitTestCase { } function test_dns_prefetch_scripts() { - $expected = "\r\n" . - "\r\n"; + $expected = "\n" . + "\n"; $args = array( 'family' => 'Open+Sans:400',