From ab638a3236391c3d024f5c790d74e4e806658713 Mon Sep 17 00:00:00 2001 From: Jonny Harris Date: Mon, 24 Jun 2024 17:53:35 +0100 Subject: [PATCH] Improve performance of `compute_style_properties` method. (#62522) * Improve performance of `compute_style_properties` method. Improve logic in compute_style_properties to improve performance. This commit fixes a number of performance issues including. - Expensive repeated call to `str_starts_with`. - Return easy if not array. - Repeated call to `strlen`. - Move call to `get_property_value` where it is needed. - Move call to implode to after empty check. * Fix lint. * Apply suggestions from code review Co-authored-by: Joe McGill <801097+joemcgill@users.noreply.github.com> --------- Co-authored-by: Jonny Harris Co-authored-by: Joe McGill <801097+joemcgill@users.noreply.github.com> --- lib/class-wp-theme-json-gutenberg.php | 48 +++++++++++++++------------ 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/lib/class-wp-theme-json-gutenberg.php b/lib/class-wp-theme-json-gutenberg.php index b9fc4204ee08c..13639c178a525 100644 --- a/lib/class-wp-theme-json-gutenberg.php +++ b/lib/class-wp-theme-json-gutenberg.php @@ -2255,43 +2255,37 @@ protected static function flatten_tree( $tree, $prefix = '', $token = '--' ) { * @return array Returns the modified $declarations. */ protected static function compute_style_properties( $styles, $settings = array(), $properties = null, $theme_json = null, $selector = null, $use_root_padding = null ) { - if ( null === $properties ) { - $properties = static::PROPERTIES_METADATA; - } - - $declarations = array(); if ( empty( $styles ) ) { - return $declarations; + return array(); } + if ( null === $properties ) { + $properties = static::PROPERTIES_METADATA; + } + $declarations = array(); $root_variable_duplicates = array(); + $root_style_length = strlen( '--wp--style--root--' ); foreach ( $properties as $css_property => $value_path ) { - $value = static::get_property_value( $styles, $value_path, $theme_json ); + if ( ! is_array( $value_path ) ) { + continue; + } - if ( str_starts_with( $css_property, '--wp--style--root--' ) && ( static::ROOT_BLOCK_SELECTOR !== $selector || ! $use_root_padding ) ) { + $is_root_style = str_starts_with( $css_property, '--wp--style--root--' ); + if ( $is_root_style && ( static::ROOT_BLOCK_SELECTOR !== $selector || ! $use_root_padding ) ) { continue; } + + $value = static::get_property_value( $styles, $value_path, $theme_json ); + // Root-level padding styles don't currently support strings with CSS shorthand values. // This may change: https://github.com/WordPress/gutenberg/issues/40132. if ( '--wp--style--root--padding' === $css_property && is_string( $value ) ) { continue; } - if ( str_starts_with( $css_property, '--wp--style--root--' ) && $use_root_padding ) { - $root_variable_duplicates[] = substr( $css_property, strlen( '--wp--style--root--' ) ); - } - - // Look up protected properties, keyed by value path. - // Skip protected properties that are explicitly set to `null`. - if ( is_array( $value_path ) ) { - $path_string = implode( '.', $value_path ); - if ( - isset( static::PROTECTED_PROPERTIES[ $path_string ] ) && - _wp_array_get( $settings, static::PROTECTED_PROPERTIES[ $path_string ], null ) === null - ) { - continue; - } + if ( $is_root_style && $use_root_padding ) { + $root_variable_duplicates[] = substr( $css_property, $root_style_length ); } // Processes background styles. @@ -2306,6 +2300,16 @@ protected static function compute_style_properties( $styles, $settings = array() continue; } + // Look up protected properties, keyed by value path. + // Skip protected properties that are explicitly set to `null`. + $path_string = implode( '.', $value_path ); + if ( + isset( static::PROTECTED_PROPERTIES[ $path_string ] ) && + _wp_array_get( $settings, static::PROTECTED_PROPERTIES[ $path_string ], null ) === null + ) { + continue; + } + // Calculates fluid typography rules where available. if ( 'font-size' === $css_property ) { /*