Make WordPress Core


Ignore:
Timestamp:
06/09/2022 05:29:57 AM (2 years ago)
Author:
peterwilsoncc
Message:

Media: Add decoding="async" to image attributes.

Dynamically add decoding="async" to image tags on the front end of a site to instruct browsers to download them in parallel.

Modifies wp_get_attachment_image(), get_avatar() to include the attribute by default. Modifies wp_filter_content_tags() to add the attribute during the front-end render of the site.

Introduces wp_img_tag_add_decoding_attr() to take an image tag and modify it to include the attribute. Introduces the filter wp_img_tag_add_decoding_attr used to define the default value for the attribute.

Props adamsilverstein, ayeshrajans, costdev, flixos90, hellofromtonya, isaumya, michaelbourne, mihai2u, mitogh, sergiomdgomes, spacedmonkey, westonruter, peterwilsoncc.
Fixes #53232.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/media.php

    r53465 r53480  
    14751475        $image    = image_downsize( self::$large_id, 'thumbnail' );
    14761476        $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="" decoding="async" loading="lazy" />',
    14781478            $image[1],
    14791479            $image[2],
     
    15131513        $image    = image_downsize( self::$large_id, 'thumbnail' );
    15141514        $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" decoding="async" loading="lazy" />',
    15161516            $image[1],
    15171517            $image[2],
     
    22482248            $respimg_html5
    22492249        );
     2250        $content_filtered = wp_img_tag_add_decoding_attr( $content_filtered, 'the_content' );
    22502251
    22512252        // Do not add width, height, and loading.
     
    22732274        $img = get_image_tag( self::$large_id, '', '', '', 'medium' );
    22742275        $img = wp_img_tag_add_loading_attr( $img, 'test' );
     2276        $img = wp_img_tag_add_decoding_attr( $img, 'the_content' );
    22752277
    22762278        // Replace the src URL.
     
    22872289        $img = get_image_tag( self::$large_id, '', '', '', 'medium' );
    22882290        $img = wp_img_tag_add_loading_attr( $img, 'test' );
     2291        $img = wp_img_tag_add_decoding_attr( $img, 'the_content' );
    22892292        $img = preg_replace( '|<img ([^>]+) />|', '<img $1 ' . 'srcset="image2x.jpg 2x" />', $img );
    22902293
     
    23342337    public function test_wp_filter_content_tags_filter_with_identical_image_tags_custom_attributes() {
    23352338        $img     = get_image_tag( self::$large_id, '', '', '', 'large' );
    2336         $img     = str_replace( '<img ', '<img srcset="custom" sizes="custom" loading="custom" ', $img );
     2339        $img     = str_replace( '<img ', '<img srcset="custom" sizes="custom" loading="custom" decoding="custom"', $img );
    23372340        $content = "$img\n$img";
    23382341
     
    23592362        add_filter( 'wp_img_tag_add_width_and_height_attr', '__return_false' );
    23602363        add_filter( 'wp_img_tag_add_srcset_and_sizes_attr', '__return_false' );
     2364        add_filter( 'wp_img_tag_add_decoding_attr', '__return_false' );
    23612365
    23622366        add_filter(
     
    24612465            $respimg_relative
    24622466        );
     2467        $expected = wp_img_tag_add_decoding_attr( $expected, 'the_content' );
    24632468
    24642469        $actual = wp_filter_content_tags( $unfiltered );
     
    26032608        $expected = '<img width="999" height="999" ' .
    26042609            'src="' . $uploads_url . 'test-image-testsize-999x999.jpg" ' .
    2605             'class="attachment-testsize size-testsize" alt="" loading="lazy" ' .
     2610            'class="attachment-testsize size-testsize" alt="" decoding="async" loading="lazy" ' .
    26062611            'srcset="' . $uploads_url . 'test-image-testsize-999x999.jpg 999w, ' . $uploads_url . $basename . '-150x150.jpg 150w" ' .
    26072612            'sizes="(max-width: 999px) 100vw, 999px" />';
     
    29102915
    29112916        $content_unfiltered = sprintf( $content, $img, $img_no_width_height, $img_no_width, $img_no_height );
    2912         $content_filtered   = sprintf( $content, $img, $respimg_no_width_height, $img_no_width, $img_no_height );
     2917        $content_filtered   = wp_img_tag_add_decoding_attr( sprintf( $content, $img, $respimg_no_width_height, $img_no_width, $img_no_height ), 'the_content' );
    29132918
    29142919        // Do not add loading, srcset, and sizes.
     
    29682973
    29692974        $content_unfiltered = sprintf( $content, $img, $img_xhtml, $img_html5, $img_eager, $img_no_width_height, $iframe, $iframe_eager, $iframe_no_width_height );
    2970         $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_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' );
    29712976
    29722977        // Do not add width, height, srcset, and sizes.
     
    29973002
    29983003        $content_unfiltered = sprintf( $content, $img, $iframe );
    2999         $content_filtered   = sprintf( $content, $lazy_img, $lazy_iframe );
     3004        $content_filtered   = sprintf( $content, wp_img_tag_add_decoding_attr( $lazy_img, 'the_content' ), $lazy_iframe, 'the_content' );
    30003005
    30013006        // Do not add srcset and sizes while testing.
     
    30153020     */
    30163021    public function test_wp_filter_content_tags_loading_lazy_opted_out() {
    3017         $img    = get_image_tag( self::$large_id, '', '', '', 'medium' );
     3022        $img    = wp_img_tag_add_decoding_attr( get_image_tag( self::$large_id, '', '', '', 'medium' ), 'the_content' );
    30183023        $iframe = '<iframe src="https://www.example.com" width="640" height="360"></iframe>';
    30193024
     
    34793484        // Following the threshold of 2, the first two content media elements should not be lazy-loaded.
    34803485        $content_unfiltered = $img1 . $iframe1 . $img2 . $img3 . $iframe2;
    3481         $content_expected   = $img1 . $iframe1 . $lazy_img2 . $lazy_img3 . $lazy_iframe2;
     3486        $content_expected   = wp_img_tag_add_decoding_attr( $img1 . $iframe1 . $lazy_img2 . $lazy_img3 . $lazy_iframe2, 'the_content' );
    34823487
    34833488        $wp_query     = new WP_Query( array( 'post__in' => array( self::$post_ids['publish'] ) ) );
Note: See TracChangeset for help on using the changeset viewer.