Script Loader: Fix protocol-relative URLs for the `preconnect` relation type.

`wp_resource_hints()` parses the URL for the `preconnect` and `dns-prefetch` relation types to ensure correct values for both. While protocol-relative URLs are supported for `dns-prefetch`, the double slash was lost for `preconnect`.

Props swissspidy, peterwilsoncc.
Props azaozz for review.
Fixes #37652.

git-svn-id: https://develop.svn.wordpress.org/trunk@38255 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Dominik Schilling 2016-08-13 18:34:12 +00:00
parent 19a85950ad
commit a0aba9dc44
2 changed files with 69 additions and 4 deletions

View File

@ -2839,12 +2839,11 @@ function wp_resource_hints() {
continue;
}
if ( 'dns-prefetch' === $relation_type ) {
$url = '//' . $parsed['host'];
} else if ( ! empty( $parsed['scheme'] ) ) {
if ( 'preconnect' === $relation_type && ! empty( $parsed['scheme'] ) ) {
$url = $parsed['scheme'] . '://' . $parsed['host'];
} else {
$url = $parsed['host'];
// Use protocol-relative URLs for dns-prefetch or if scheme is missing.
$url = '//' . $parsed['host'];
}
}

View File

@ -66,6 +66,37 @@ class Tests_WP_Resource_Hints extends WP_UnitTestCase {
return $hints;
}
/**
* @ticket 37652
*/
function test_preconnect() {
$expected = "<link rel='dns-prefetch' href='//s.w.org'>\n" .
"<link rel='preconnect' href='//wordpress.org'>\n" .
"<link rel='preconnect' href='https://make.wordpress.org'>\n" .
"<link rel='preconnect' href='http://google.com'>\n" .
"<link rel='preconnect' href='http://w.org'>\n";
add_filter( 'wp_resource_hints', array( $this, '_add_preconnect_domains' ), 10, 2 );
$actual = get_echo( 'wp_resource_hints' );
remove_filter( 'wp_resource_hints', array( $this, '_add_preconnect_domains' ) );
$this->assertEquals( $expected, $actual );
}
function _add_preconnect_domains( $hints, $method ) {
if ( 'preconnect' === $method ) {
$hints[] = '//wordpress.org';
$hints[] = 'https://make.wordpress.org';
$hints[] = 'htps://example.com'; // Invalid URLs should be skipped.
$hints[] = 'http://google.com';
$hints[] = 'w.org';
}
return $hints;
}
function test_prerender() {
$expected = "<link rel='dns-prefetch' href='//s.w.org'>\n" .
"<link rel='prerender' href='https://make.wordpress.org/great-again'>\n" .
@ -176,4 +207,39 @@ class Tests_WP_Resource_Hints extends WP_UnitTestCase {
$actual = get_echo( 'wp_resource_hints' );
$this->assertEquals( $expected, $actual );
}
/**
* @ticket 37652
*/
function test_malformed_urls() {
$expected = "<link rel='dns-prefetch' href='//s.w.org'>\n";
// Errant colon.
add_filter( 'wp_resource_hints', array( $this, '_add_malformed_url_errant_colon' ), 10, 2 );
$actual = get_echo( 'wp_resource_hints' );
remove_filter( 'wp_resource_hints', array( $this, '_add_malformed_url_errant_colon' ) );
$this->assertEquals( $expected, $actual );
// Unsupported Scheme.
add_filter( 'wp_resource_hints', array( $this, '_add_malformed_url_unsupported_scheme' ), 10, 2 );
$actual = get_echo( 'wp_resource_hints' );
remove_filter( 'wp_resource_hints', array( $this, '_add_malformed_url_unsupported_scheme' ) );
$this->assertEquals( $expected, $actual );
}
function _add_malformed_url_errant_colon( $hints, $method ) {
if ( 'preconnect' === $method ) {
$hints[] = '://core.trac.wordpress.org/ticket/37652';
}
return $hints;
}
function _add_malformed_url_unsupported_scheme( $hints, $method ) {
if ( 'preconnect' === $method ) {
$hints[] = 'git://develop.git.wordpress.org/';
}
return $hints;
}
}