Ticket #53232: 53232.6.diff
File 53232.6.diff, 16.3 KB (added by , 3 years ago) |
---|
-
src/wp-includes/media.php
diff --git src/wp-includes/media.php src/wp-includes/media.php index 2b46167afc..1ad96454c2 100644
function wp_get_attachment_image( $attachment_id, $size = 'thumbnail', $icon = f 1077 1077 } 1078 1078 } 1079 1079 1080 $attr['decoding'] = 'async'; 1081 1080 1082 /** 1081 1083 * Filters the list of attachment image attributes. 1082 1084 * … … function wp_filter_content_tags( $content, $context = null ) { 1854 1856 */ 1855 1857 $filtered_image = apply_filters( 'wp_content_img_tag', $filtered_image, $context, $attachment_id ); 1856 1858 1859 // Add 'decoding=async' attribute unless a 'decoding' attribute is already present. 1860 if ( false === strpos( $filtered_image, ' decoding=' ) ) { 1861 $filtered_image = wp_img_tag_add_decoding_async_attr( $filtered_image, $context ); 1862 } 1863 1857 1864 if ( $filtered_image !== $match[0] ) { 1858 1865 $content = str_replace( $match[0], $filtered_image, $content ); 1859 1866 } … … function wp_img_tag_add_loading_attr( $image, $context ) { 1934 1941 return $image; 1935 1942 } 1936 1943 1944 /** 1945 * Add `decoding` attribute to an `img` HTML tag. 1946 * 1947 * The `decoding` attribute allows developers to indicate whether the 1948 * browser can decode the image off the main thread (`async`), on the 1949 * main thread (`sync`) or as determined by the browser (`auto`). 1950 * 1951 * By default WordPress adds `decoding="async"` to images but developers 1952 * can use the {@see 'wp_img_tag_add_decoding_attr'} filter to modify this 1953 * to remove the attribute or set it to another accepted value. 1954 * 1955 * @since 6.0.0 1956 * 1957 * @param string $image The HTML `img` tag where the attribute should be added. 1958 * @param string $context Additional context to pass to the filters. 1959 * @return string Converted `img` tag with `decoding` attribute added. 1960 */ 1961 function wp_img_tag_add_decoding_async_attr( $image, $context ) { 1962 /** 1963 * Filters the `decoding` attribute value to add to an image. Default `async`. 1964 * 1965 * Returning `false` or an empty string will not add the attribute. 1966 * 1967 * @since 6.0.0 1968 * 1969 * @param string|bool $value The `decoding` attribute value. Returning a falsey value will result in 1970 * the attribute being omitted for the image. Otherwise, it may be: 1971 * 'async' (default), 'sync', or 'auto'. 1972 * @param string $image The HTML `img` tag to be filtered. 1973 * @param string $context Additional context about how the function was called or where the img tag is. 1974 */ 1975 $value = apply_filters( 'wp_img_tag_add_decoding_attr', 'async', $image, $context ); 1976 if ( in_array( $value, array( 'async', 'sync', 'auto' ), true ) ) { 1977 $image = str_replace( '<img ', '<img decoding="' . esc_attr( $value ) . '" ', $image ); 1978 } 1979 1980 return $image; 1981 } 1982 1937 1983 /** 1938 1984 * Adds `width` and `height` attributes to an `img` HTML tag. 1939 1985 * -
src/wp-includes/pluggable.php
diff --git src/wp-includes/pluggable.php src/wp-includes/pluggable.php index fdbfdea250..e13f05c2e5 100644
if ( ! function_exists( 'get_avatar' ) ) : 2694 2694 'force_display' => false, 2695 2695 'loading' => null, 2696 2696 'extra_attr' => '', 2697 'decoding' => 'async' 2697 2698 ); 2698 2699 2699 2700 if ( wp_lazy_loading_enabled( 'img', 'get_avatar' ) ) { 2700 2701 $defaults['loading'] = wp_get_loading_attr_default( 'get_avatar' ); 2701 2702 } 2702 2703 2704 if ( isset( $args['decoding'] ) && in_array( $args['decoding'], array( 'async', 'sync', 'auto' ) ) && ! preg_match( '/\bdecoding\s*=/', $extra_attr ) ) { 2705 if ( ! empty( $extra_attr ) ) { 2706 $extra_attr .= ' '; 2707 } 2708 $extra_attr .= "decoding='{$args['decoding']}'"; 2709 } 2710 2703 2711 if ( empty( $args ) ) { 2704 2712 $args = array(); 2705 2713 } … … if ( ! function_exists( 'get_avatar' ) ) : 2781 2789 $extra_attr .= "loading='{$loading}'"; 2782 2790 } 2783 2791 2792 if ( isset( $args['decoding'] ) && in_array( $args['decoding'], array( 'async', 'sync', 'auto' ) ) && ! preg_match( '/\bdecoding\s*=/', $extra_attr ) ) { 2793 if ( ! empty( $extra_attr ) ) { 2794 $extra_attr .= ' '; 2795 } 2796 $extra_attr .= "decoding='{$args['decoding']}'"; 2797 } 2798 2784 2799 $avatar = sprintf( 2785 2800 "<img alt='%s' src='%s' srcset='%s' class='%s' height='%d' width='%d' %s/>", 2786 2801 esc_attr( $args['alt'] ), -
tests/phpunit/tests/avatar.php
diff --git tests/phpunit/tests/avatar.php tests/phpunit/tests/avatar.php index 336ab611e2..026809b4a1 100644
class Tests_Avatar extends WP_UnitTestCase { 169 169 170 170 public function test_get_avatar() { 171 171 $img = get_avatar( 1 ); 172 $this->assertSame( preg_match( "|^<img alt='[^']*' src='[^']*' srcset='[^']*' class='[^']*' height='[^']*' width='[^']*' loading='lazy' />$|", $img ), 1 );172 $this->assertSame( preg_match( "|^<img alt='[^']*' src='[^']*' srcset='[^']*' class='[^']*' height='[^']*' width='[^']*' loading='lazy' decoding='async'/>$|", $img ), 1 ); 173 173 } 174 174 175 175 public function test_get_avatar_size() { -
tests/phpunit/tests/media.php
diff --git tests/phpunit/tests/media.php tests/phpunit/tests/media.php index 8f3340aaf7..999858206d 100644
EOF; 1474 1474 public function test_wp_get_attachment_image_defaults() { 1475 1475 $image = image_downsize( self::$large_id, 'thumbnail' ); 1476 1476 $expected = sprintf( 1477 '<img width="%1$d" height="%2$d" src="%3$s" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" />',1477 '<img width="%1$d" height="%2$d" src="%3$s" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" decoding="async" />', 1478 1478 $image[1], 1479 1479 $image[2], 1480 1480 $image[0] … … EOF; 1512 1512 1513 1513 $image = image_downsize( self::$large_id, 'thumbnail' ); 1514 1514 $expected = sprintf( 1515 '<img width="%1$d" height="%2$d" src="%3$s" class="attachment-thumbnail size-thumbnail" alt="Some very clever alt text" loading="lazy" />',1515 '<img width="%1$d" height="%2$d" src="%3$s" class="attachment-thumbnail size-thumbnail" alt="Some very clever alt text" loading="lazy" decoding="async" />', 1516 1516 $image[1], 1517 1517 $image[2], 1518 1518 $image[0] … … EOF; 2248 2248 $respimg_xhtml, 2249 2249 $respimg_html5 2250 2250 ); 2251 $content_filtered = wp_img_tag_add_decoding_async_attr( $content_filtered, 'the_content' ); 2251 2252 2252 2253 // Do not add width, height, and loading. 2253 2254 add_filter( 'wp_img_tag_add_width_and_height_attr', '__return_false' ); … … EOF; 2273 2274 public function test_wp_filter_content_tags_srcset_sizes_wrong() { 2274 2275 $img = get_image_tag( self::$large_id, '', '', '', 'medium' ); 2275 2276 $img = wp_img_tag_add_loading_attr( $img, 'test' ); 2277 $img = wp_img_tag_add_decoding_async_attr( $img, 'the_content' ); 2276 2278 2277 2279 // Replace the src URL. 2278 2280 $image_wrong_src = preg_replace( '|src="[^"]+"|', 'src="http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/foo.jpg"', $img ); … … EOF; 2287 2289 // Generate HTML and add a dummy srcset attribute. 2288 2290 $img = get_image_tag( self::$large_id, '', '', '', 'medium' ); 2289 2291 $img = wp_img_tag_add_loading_attr( $img, 'test' ); 2292 $img = wp_img_tag_add_decoding_async_attr( $img, 'the_content' ); 2290 2293 $img = preg_replace( '|<img ([^>]+) />|', '<img $1 ' . 'srcset="image2x.jpg 2x" />', $img ); 2291 2294 2292 2295 // The content filter should return the image unchanged. … … EOF; 2461 2464 $respimg_https, 2462 2465 $respimg_relative 2463 2466 ); 2467 $expected = wp_img_tag_add_decoding_async_attr( $expected, 'the_content' ); 2464 2468 2465 2469 $actual = wp_filter_content_tags( $unfiltered ); 2466 2470 … … EOF; 2605 2609 'src="' . $uploads_url . 'test-image-testsize-999x999.jpg" ' . 2606 2610 'class="attachment-testsize size-testsize" alt="" loading="lazy" ' . 2607 2611 'srcset="' . $uploads_url . 'test-image-testsize-999x999.jpg 999w, ' . $uploads_url . $basename . '-150x150.jpg 150w" ' . 2608 'sizes="(max-width: 999px) 100vw, 999px" />';2612 'sizes="(max-width: 999px) 100vw, 999px" decoding="async" />'; 2609 2613 2610 2614 $actual = wp_get_attachment_image( self::$large_id, 'testsize' ); 2611 2615 … … EOF; 2910 2914 %4$s'; 2911 2915 2912 2916 $content_unfiltered = sprintf( $content, $img, $img_no_width_height, $img_no_width, $img_no_height ); 2913 $content_filtered = sprintf( $content, $img, $respimg_no_width_height, $img_no_width, $img_no_height);2917 $content_filtered = wp_img_tag_add_decoding_async_attr( sprintf( $content, $img, $respimg_no_width_height, $img_no_width, $img_no_height ), 'the_content' ); 2914 2918 2915 2919 // Do not add loading, srcset, and sizes. 2916 2920 add_filter( 'wp_img_tag_add_loading_attr', '__return_false' ); … … EOF; 2968 2972 %8$s'; 2969 2973 2970 2974 $content_unfiltered = sprintf( $content, $img, $img_xhtml, $img_html5, $img_eager, $img_no_width_height, $iframe, $iframe_eager, $iframe_no_width_height ); 2971 $content_filtered = sprintf( $content, $lazy_img, $lazy_img_xhtml, $lazy_img_html5, $img_eager, $img_no_width_height, $lazy_iframe, $iframe_eager, $iframe_no_width_height);2975 $content_filtered = wp_img_tag_add_decoding_async_attr( sprintf( $content, $lazy_img, $lazy_img_xhtml, $lazy_img_html5, $img_eager, $img_no_width_height, $lazy_iframe, $iframe_eager, $iframe_no_width_height ), 'the_content' ); 2972 2976 2973 2977 // Do not add width, height, srcset, and sizes. 2974 2978 add_filter( 'wp_img_tag_add_width_and_height_attr', '__return_false' ); … … EOF; 2997 3001 %2$s'; 2998 3002 2999 3003 $content_unfiltered = sprintf( $content, $img, $iframe ); 3000 $content_filtered = sprintf( $content, $lazy_img, $lazy_iframe);3004 $content_filtered = sprintf( $content, wp_img_tag_add_decoding_async_attr( $lazy_img ), $lazy_iframe, 'the_content' ); 3001 3005 3002 3006 // Do not add srcset and sizes while testing. 3003 3007 add_filter( 'wp_img_tag_add_srcset_and_sizes_attr', '__return_false' ); … … EOF; 3015 3019 * @ticket 50756 3016 3020 */ 3017 3021 public function test_wp_filter_content_tags_loading_lazy_opted_out() { 3018 $img = get_image_tag( self::$large_id, '', '', '', 'medium' );3022 $img = wp_img_tag_add_decoding_async_attr( get_image_tag( self::$large_id, '', '', '', 'medium' ), 'the_content' ); 3019 3023 $iframe = '<iframe src="https://www.example.com" width="640" height="360"></iframe>'; 3020 3024 3021 3025 $content = ' … … EOF; 3479 3483 3480 3484 // Following the threshold of 2, the first two content media elements should not be lazy-loaded. 3481 3485 $content_unfiltered = $img1 . $iframe1 . $img2 . $img3 . $iframe2; 3482 $content_expected = $img1 . $iframe1 . $lazy_img2 . $lazy_img3 . $lazy_iframe2;3486 $content_expected = wp_img_tag_add_decoding_async_attr( $img1 . $iframe1 . $lazy_img2 . $lazy_img3 . $lazy_iframe2, 'the_content' ); 3483 3487 3484 3488 $wp_query = new WP_Query( array( 'post__in' => array( self::$post_ids['publish'] ) ) ); 3485 3489 $wp_the_query = $wp_query; -
tests/phpunit/tests/media/getAdjacentImageLink.php
diff --git tests/phpunit/tests/media/getAdjacentImageLink.php tests/phpunit/tests/media/getAdjacentImageLink.php index 735c0ff15c..1c4133d6e7 100644
class Tests_Media_GetAdjacentImageLink extends WP_Test_Adjacent_Image_Link_TestC 32 32 'when has previous link' => array( 33 33 'current_attachment_index' => 3, 34 34 'expected_attachment_index' => 2, 35 'expected' => '<a href=\'http://example.org/?attachment_id=%%ID%%\'><img width="1" height="1" src=" http://example.org/wp-content/uploads/image2.jpg" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" /></a>',35 'expected' => '<a href=\'http://example.org/?attachment_id=%%ID%%\'><img width="1" height="1" src="' . WP_CONTENT_URL . '/uploads/image2.jpg" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" decoding="async" /></a>', 36 36 ), 37 37 'with text when has previous link' => array( 38 38 'current_attachment_index' => 3, … … class Tests_Media_GetAdjacentImageLink extends WP_Test_Adjacent_Image_Link_TestC 43 43 'when has next link' => array( 44 44 'current_attachment_index' => 4, 45 45 'expected_attachment_index' => 5, 46 'expected' => '<a href=\'http://example.org/?attachment_id=%%ID%%\'><img width="1" height="1" src=" http://example.org/wp-content/uploads/image5.jpg" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" /></a>',46 'expected' => '<a href=\'http://example.org/?attachment_id=%%ID%%\'><img width="1" height="1" src="' . WP_CONTENT_URL . '/uploads/image5.jpg" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" decoding="async" /></a>', 47 47 'args' => array( 'prev' => false ), 48 48 ), 49 49 'with text when has next link' => array( -
tests/phpunit/tests/media/getNextImageLink.php
diff --git tests/phpunit/tests/media/getNextImageLink.php tests/phpunit/tests/media/getNextImageLink.php index 86a843cbfc..88ee51a434 100644
class Tests_Media_GetNextImageLink extends WP_Test_Adjacent_Image_Link_TestCase 31 31 'when has next link' => array( 32 32 'current_attachment_index' => 4, 33 33 'expected_attachment_index' => 5, 34 'expected' => '<a href=\'http://example.org/?attachment_id=%%ID%%\'><img width="1" height="1" src=" http://example.org/wp-content/uploads/image5.jpg" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" /></a>',34 'expected' => '<a href=\'http://example.org/?attachment_id=%%ID%%\'><img width="1" height="1" src="' . WP_CONTENT_URL . '/uploads/image5.jpg" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" decoding="async" /></a>', 35 35 ), 36 36 'with text when has next link' => array( 37 37 'current_attachment_index' => 4, -
tests/phpunit/tests/media/getPreviousImageLink.php
diff --git tests/phpunit/tests/media/getPreviousImageLink.php tests/phpunit/tests/media/getPreviousImageLink.php index 2d2d511e4f..d0eba54295 100644
class Tests_Media_GetPreviousImageLink extends WP_Test_Adjacent_Image_Link_TestC 31 31 'when has previous link' => array( 32 32 'current_attachment_index' => 3, 33 33 'expected_attachment_index' => 2, 34 'expected' => '<a href=\'http://example.org/?attachment_id=%%ID%%\'><img width="1" height="1" src=" http://example.org/wp-content/uploads/image2.jpg" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" /></a>',34 'expected' => '<a href=\'http://example.org/?attachment_id=%%ID%%\'><img width="1" height="1" src="' . WP_CONTENT_URL . '/uploads/image2.jpg" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" decoding="async" /></a>', 35 35 ), 36 36 'with text when has previous link' => array( 37 37 'current_attachment_index' => 3, -
tests/phpunit/tests/media/nextImageLink.php
diff --git tests/phpunit/tests/media/nextImageLink.php tests/phpunit/tests/media/nextImageLink.php index 7799779fa8..f6da4605ca 100644
class Tests_Media_NextImageLink extends WP_Test_Adjacent_Image_Link_TestCase { 30 30 'when has next link' => array( 31 31 'current_attachment_index' => 4, 32 32 'expected_attachment_index' => 5, 33 'expected' => '<a href=\'http://example.org/?attachment_id=%%ID%%\'><img width="1" height="1" src=" http://example.org/wp-content/uploads/image5.jpg" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" /></a>',33 'expected' => '<a href=\'http://example.org/?attachment_id=%%ID%%\'><img width="1" height="1" src="' . WP_CONTENT_URL . '/uploads/image5.jpg" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" decoding="async" /></a>', 34 34 ), 35 35 'with text when has next link' => array( 36 36 'current_attachment_index' => 4, -
tests/phpunit/tests/media/previousImageLink.php
diff --git tests/phpunit/tests/media/previousImageLink.php tests/phpunit/tests/media/previousImageLink.php index 11d6583d6a..de422e0379 100644
class Tests_Media_PreviousImageLink extends WP_Test_Adjacent_Image_Link_TestCase 30 30 'when has previous link' => array( 31 31 'current_attachment_index' => 3, 32 32 'expected_attachment_index' => 2, 33 'expected' => '<a href=\'http://example.org/?attachment_id=%%ID%%\'><img width="1" height="1" src=" http://example.org/wp-content/uploads/image2.jpg" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" /></a>',33 'expected' => '<a href=\'http://example.org/?attachment_id=%%ID%%\'><img width="1" height="1" src="' . WP_CONTENT_URL . '/uploads/image2.jpg" class="attachment-thumbnail size-thumbnail" alt="" loading="lazy" decoding="async" /></a>', 34 34 ), 35 35 'with text when has previous link' => array( 36 36 'current_attachment_index' => 3,