Make WordPress Core

Changeset 55658


Ignore:
Timestamp:
04/19/2023 01:24:40 AM (18 months ago)
Author:
westonruter
Message:

Script Loader: Optimize performance of _wp_normalize_relative_css_links() by more than 2x.

  • Replace preg_match_all() and its secondary str_replace() call with preg_replace_callback().
  • Fix case where paths beginning with http and https (but not http: and https:) were erroneously not counted as relative.
  • Improve code style and readability by consolidating conditions and returning once.
  • Use str_starts_with() consistently instead of strpos().

Follow-up to [52036], [52695], and [52754].

Fixes #58069.
See #54243.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/script-loader.php

    r55628 r55658  
    29402940 */
    29412941function _wp_normalize_relative_css_links( $css, $stylesheet_url ) {
    2942     $has_src_results = preg_match_all( '#url\s*\(\s*[\'"]?\s*([^\'"\)]+)#', $css, $src_results );
    2943     if ( $has_src_results ) {
    2944         // Loop through the URLs to find relative ones.
    2945         foreach ( $src_results[1] as $src_index => $src_result ) {
    2946             // Skip if this is an absolute URL.
    2947             if ( 0 === strpos( $src_result, 'http' ) || 0 === strpos( $src_result, '//' ) ) {
    2948                 continue;
     2942    return preg_replace_callback(
     2943        '#(url\s*\(\s*[\'"]?\s*)([^\'"\)]+)#',
     2944        static function ( $matches ) use ( $stylesheet_url ) {
     2945            list( , $prefix, $url ) = $matches;
     2946
     2947            if ( ! (
     2948                str_starts_with( $url, 'http:' )
     2949                ||
     2950                str_starts_with( $url, 'https:' )
     2951                ||
     2952                str_starts_with( $url, '//' )
     2953                ||
     2954                str_starts_with( $url, '#' )
     2955                ||
     2956                str_starts_with( $url, 'data:' )
     2957            ) ) {
     2958                // Build the absolute URL.
     2959                $absolute_url = dirname( $stylesheet_url ) . '/' . $url;
     2960                $absolute_url = str_replace( '/./', '/', $absolute_url );
     2961
     2962                // Convert to URL related to the site root.
     2963                $url = wp_make_link_relative( $absolute_url );
    29492964            }
    29502965
    2951             // Skip if the URL is an HTML ID.
    2952             if ( str_starts_with( $src_result, '#' ) ) {
    2953                 continue;
    2954             }
    2955 
    2956             // Skip if the URL is a data URI.
    2957             if ( str_starts_with( $src_result, 'data:' ) ) {
    2958                 continue;
    2959             }
    2960 
    2961             // Build the absolute URL.
    2962             $absolute_url = dirname( $stylesheet_url ) . '/' . $src_result;
    2963             $absolute_url = str_replace( '/./', '/', $absolute_url );
    2964             // Convert to URL related to the site root.
    2965             $relative_url = wp_make_link_relative( $absolute_url );
    2966 
    2967             // Replace the URL in the CSS.
    2968             $css = str_replace(
    2969                 $src_results[0][ $src_index ],
    2970                 str_replace( $src_result, $relative_url, $src_results[0][ $src_index ] ),
    2971                 $css
    2972             );
    2973         }
    2974     }
    2975 
    2976     return $css;
     2966            return $prefix . $url;
     2967        },
     2968        $css
     2969    );
    29772970}
    29782971
  • trunk/tests/phpunit/tests/dependencies/styles.php

    r55368 r55658  
    241241                'expected' => 'img {mask-image: url(\'data:image/svg+xml;utf8,<svg></svg>\');}',
    242242            ),
     243            'URLs with path beginning with http'           => array(
     244                'css'      => 'p {background:url( "http-is-awesome.png" );}',
     245                'expected' => 'p {background:url( "/wp-content/themes/test/http-is-awesome.png" );}',
     246            ),
     247            'URLs with path beginning with https'          => array(
     248                'css'      => 'p {background:url( "https-is-more-awesome.png" );}',
     249                'expected' => 'p {background:url( "/wp-content/themes/test/https-is-more-awesome.png" );}',
     250            ),
    243251        );
    244252    }
Note: See TracChangeset for help on using the changeset viewer.