Make WordPress Core

Changeset 60920


Ignore:
Timestamp:
10/10/2025 04:17:22 AM (10 months ago)
Author:
westonruter
Message:

Script Loader: Use original stylesheet URL for sourceURL when inlined.

For inline styles which had been inlined from registered external stylesheets via wp_maybe_inline_styles(), this defers to using the original stylesheet URL for the sourceURL as opposed to fabricating one from the stylesheet handle. This makes the sourceURL much more useful for debugging, as it indicates where the stylesheet is located. This allows a developer to make a change to the CSS more easily.

Developed in https://github.com/WordPress/wordpress-develop/pull/10177.

Follow-up to [50836].

Props westonruter, mukesh27, gziolo.
See #50328, #52620.
Fixes #63887.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-styles.php

    r60719 r60920  
    334334                $output = $this->get_data( $handle, 'after' );
    335335
    336                 if ( empty( $output ) ) {
     336                if ( empty( $output ) || ! is_array( $output ) ) {
    337337                        return false;
    338338                }
    339339
    340340                if ( ! $this->do_concat ) {
     341
     342                        // Obtain the original `src` for a stylesheet possibly inlined by wp_maybe_inline_styles().
     343                        $inlined_src = $this->get_data( $handle, 'inlined_src' );
     344
     345                        // If there's only one `after` inline style, and that inline style had been inlined, then use the $inlined_src
     346                        // as the sourceURL. Otherwise, if there is more than one inline `after` style associated with the handle,
     347                        // then resort to using the handle to construct the sourceURL since there isn't a single source.
     348                        if ( count( $output ) === 1 && is_string( $inlined_src ) && strlen( $inlined_src ) > 0 ) {
     349                                $source_url = esc_url_raw( $inlined_src );
     350                        } else {
     351                                $source_url = rawurlencode( "{$handle}-inline-css" );
     352                        }
     353
    341354                        $output[] = sprintf(
    342355                                '/*# sourceURL=%s */',
    343                                 rawurlencode( "{$handle}-inline-css" )
     356                                $source_url
    344357                        );
    345358                }
  • trunk/src/wp-includes/script-loader.php

    r60719 r60920  
    31173117                        $style['css'] = _wp_normalize_relative_css_links( $style['css'], $style['src'] );
    31183118
     3119                        // Keep track of the original `src` for the style that was inlined so that the `sourceURL` comment can be added.
     3120                        $wp_styles->add_data( $style['handle'], 'inlined_src', $style['src'] );
     3121
    31193122                        // Set `src` to `false` and add styles inline.
    31203123                        $wp_styles->registered[ $style['handle'] ]->src = false;
  • trunk/tests/phpunit/tests/dependencies/styles.php

    r60719 r60920  
    525525        /**
    526526         * @ticket 58394
     527         * @ticket 63887
    527528         *
    528529         * @covers ::wp_maybe_inline_styles
    529          */
    530         public function test_wp_maybe_inline_styles() {
    531                 wp_register_style( 'test-handle', '/' . WPINC . '/css/classic-themes.css' );
    532                 wp_style_add_data( 'test-handle', 'path', ABSPATH . WPINC . '/css/classic-themes.css' );
    533 
    534                 wp_enqueue_style( 'test-handle' );
     530         * @covers ::wp_add_inline_style
     531         * @covers ::wp_print_styles
     532         * @covers WP_Styles::do_items
     533         * @covers WP_Styles::do_item
     534         * @covers WP_Styles::print_inline_style
     535         *
     536         * @dataProvider data_provider_test_wp_maybe_inline_styles
     537         */
     538        public function test_wp_maybe_inline_styles( ?string $additional_inline_style, ?int $styles_inline_size_limit ) {
     539                $rel_path = 'css/classic-themes.css';
     540                $src_url  = includes_url( $rel_path );
     541                $src_path = ABSPATH . WPINC . '/' . $rel_path;
     542                $css      = file_get_contents( $src_path );
     543                $handle   = 'test-handle';
     544
     545                if ( isset( $styles_inline_size_limit ) ) {
     546                        add_filter(
     547                                'styles_inline_size_limit',
     548                                static function () use ( $styles_inline_size_limit ): int {
     549                                        return $styles_inline_size_limit;
     550                                }
     551                        );
     552                }
     553                wp_register_style( $handle, $src_url, array(), null );
     554                wp_style_add_data( $handle, 'path', $src_path );
     555                if ( isset( $additional_inline_style ) ) {
     556                        wp_add_inline_style( $handle, $additional_inline_style );
     557                }
     558                wp_enqueue_style( $handle );
    535559
    536560                wp_maybe_inline_styles();
    537561
    538                 $this->assertFalse( $GLOBALS['wp_styles']->registered['test-handle']->src, 'Source of style should be reset to false' );
    539 
    540                 $css = file_get_contents( ABSPATH . WPINC . '/css/classic-themes.css' );
    541                 $this->assertSameSets( $GLOBALS['wp_styles']->registered['test-handle']->extra['after'], array( $css ), 'Source of style should set to after property' );
     562                $expected_after = array();
     563                if ( ! isset( $styles_inline_size_limit ) || strlen( $css ) <= $styles_inline_size_limit ) {
     564                        $expected_after[] = $css;
     565                        $this->assertFalse( wp_styles()->registered[ $handle ]->src, 'Source of style should be reset to false' );
     566                        $this->assertArrayHasKey( 'inlined_src', wp_styles()->registered[ $handle ]->extra );
     567                        $this->assertSame( $src_url, wp_styles()->registered[ $handle ]->extra['inlined_src'] );
     568                } else {
     569                        $this->assertArrayNotHasKey( 'inlined_src', wp_styles()->registered[ $handle ]->extra );
     570                }
     571
     572                if ( isset( $additional_inline_style ) ) {
     573                        $expected_after[] = $additional_inline_style;
     574                }
     575
     576                $after = wp_styles()->get_data( $handle, 'after' );
     577                if ( false === $after ) {
     578                        $after = array();
     579                }
     580                $this->assertSameSets( $after, $expected_after, 'Source of style should set to after property' );
     581
     582                $printed_styles = get_echo( 'wp_print_styles', array( $handle ) );
     583                $processor      = new WP_HTML_Tag_Processor( $printed_styles );
     584
     585                if ( isset( $styles_inline_size_limit ) && strlen( $css ) > $styles_inline_size_limit ) {
     586                        $this->assertTrue( $processor->next_tag() );
     587                        $this->assertSame( 'LINK', $processor->get_tag() );
     588                        $this->assertSame( 'stylesheet', $processor->get_attribute( 'rel' ) );
     589                        $this->assertSame( $src_url, $processor->get_attribute( 'href' ) );
     590                }
     591
     592                if ( count( $expected_after ) > 0 ) {
     593                        $this->assertTrue( $processor->next_tag() );
     594                        $this->assertSame( 'STYLE', $processor->get_tag() );
     595                        $this->assertSame( $handle . '-inline-css', $processor->get_attribute( 'id' ) );
     596                        $this->assertSame( 'text/css', $processor->get_attribute( 'type' ) );
     597
     598                        $expected_inline_styles = $expected_after;
     599                        if ( isset( $additional_inline_style ) ) {
     600                                $source_url = $handle . '-inline-css';
     601                        } else {
     602                                $source_url = $src_url;
     603                        }
     604                        $expected_inline_styles[] = "/*# sourceURL=$source_url */";
     605
     606                        $expected_text = "\n" . implode( "\n", $expected_inline_styles ) . "\n";
     607                        $this->assertSame( $expected_text, $processor->get_modifiable_text() );
     608                }
     609
     610                $this->assertFalse( $processor->next_tag() );
     611        }
     612
     613        /**
     614         * Data provider for test_wp_maybe_inline_styles.
     615         *
     616         * @see self::test_wp_maybe_inline_styles()
     617         * @return array<string, array{additional_inline_style: string|null, styles_inline_size_limit: int|null}>
     618         */
     619        public static function data_provider_test_wp_maybe_inline_styles(): array {
     620                return array(
     621                        'regular_limit_without_additional_inline_styles' => array(
     622                                'additional_inline_style'  => null,
     623                                'styles_inline_size_limit' => null,
     624                        ),
     625                        'regular_limit_with_additional_inline_style' => array(
     626                                'additional_inline_style'  => '/* additional inline style */',
     627                                'styles_inline_size_limit' => null,
     628                        ),
     629                        'zero_limit_without_additional_inline_style' => array(
     630                                'additional_inline_style'  => null,
     631                                'styles_inline_size_limit' => 0,
     632                        ),
     633                        'zero_limit_with_additional_inline_style'    => array(
     634                                'additional_inline_style'  => '/* additional inline style */',
     635                                'styles_inline_size_limit' => 0,
     636                        ),
     637                );
    542638        }
    543639
Note: See TracChangeset for help on using the changeset viewer.