From fed68b1e61f3d598695c917655984905464bd626 Mon Sep 17 00:00:00 2001 From: ramon Date: Mon, 20 May 2024 14:03:02 -0700 Subject: [PATCH 01/13] First commit - sync global styles controller changes from https://github.com/WordPress/gutenberg/pull/61271 --- ...class-wp-rest-global-styles-controller.php | 40 +++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php index e9d5006d53b14..4a3140d586ba6 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php @@ -289,6 +289,8 @@ protected function prepare_item_for_database( $request ) { * Prepare a global styles config output for response. * * @since 5.9.0 + * @since 6.2.0 Handling of style.css was added to WP_Theme_JSON. + * @since 6.6.0 Added custom relative theme file URIs to `_links`. * * @param WP_Post $post Global Styles post object. * @param WP_REST_Request $request Request object. @@ -298,8 +300,10 @@ public function prepare_item_for_response( $post, $request ) { $raw_config = json_decode( $post->post_content, true ); $is_global_styles_user_theme_json = isset( $raw_config['isGlobalStylesUserThemeJSON'] ) && true === $raw_config['isGlobalStylesUserThemeJSON']; $config = array(); + $theme_json = null; if ( $is_global_styles_user_theme_json ) { - $config = ( new WP_Theme_JSON( $raw_config, 'custom' ) )->get_raw_data(); + $theme_json = new WP_Theme_JSON( $raw_config, 'custom' ); + $config = $theme_json->get_raw_data(); } // Base fields for every post. @@ -341,6 +345,15 @@ public function prepare_item_for_response( $post, $request ) { if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) { $links = $this->prepare_links( $post->ID ); + + // Only return resolved URIs for get requests to user theme JSON. + if ( $theme_json ) { + $resolved_theme_uris = WP_Theme_JSON_Resolver::get_resolved_theme_uris( $theme_json ); + if ( ! empty( $resolved_theme_uris ) ) { + $links['https://api.w.org/theme-file'] = $resolved_theme_uris; + } + } + $response->add_links( $links ); if ( ! empty( $links['self']['href'] ) ) { $actions = $this->get_available_actions( $post, $request ); @@ -515,6 +528,7 @@ public function get_theme_item_permissions_check( $request ) { * Returns the given theme global styles config. * * @since 5.9.0 + * @since 6.6.0 Added custom relative theme file URIs to `_links`. * * @param WP_REST_Request $request The request instance. * @return WP_REST_Response|WP_Error @@ -549,11 +563,15 @@ public function get_theme_item( $request ) { $response = rest_ensure_response( $data ); if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) { - $links = array( + $links = array( 'self' => array( 'href' => rest_url( sprintf( '%s/%s/themes/%s', $this->namespace, $this->rest_base, $request['stylesheet'] ) ), ), ); + $resolved_theme_uris = WP_Theme_JSON_Resolver::get_resolved_theme_uris( $theme ); + if ( ! empty( $resolved_theme_uris ) ) { + $links['https://api.w.org/theme-file'] = $resolved_theme_uris; + } $response->add_links( $links ); } @@ -591,6 +609,7 @@ public function get_theme_items_permissions_check( $request ) { * * @since 6.0.0 * @since 6.2.0 Returns parent theme variations, if they exist. + * @since 6.6.0 Added custom relative theme file URIs to `_links` for each item. * * @param WP_REST_Request $request The request instance. * @@ -606,9 +625,24 @@ public function get_theme_items( $request ) { ); } + $response = array(); $variations = WP_Theme_JSON_Resolver::get_style_variations(); - return rest_ensure_response( $variations ); + foreach ( $variations as $variation ) { + $variation_theme_json = new WP_Theme_JSON( $variation ); + $resolved_theme_uris = WP_Theme_JSON_Resolver::get_resolved_theme_uris( $variation_theme_json ); + $data = rest_ensure_response( $variation ); + if ( ! empty( $resolved_theme_uris ) ) { + $data->add_links( + array( + 'https://api.w.org/theme-file' => $resolved_theme_uris, + ) + ); + } + $response[] = $this->prepare_response_for_collection( $data ); + } + + return rest_ensure_response( $response ); } /** From 4aecb9e7afaadae944b53ba26086b7432502e73c Mon Sep 17 00:00:00 2001 From: ramon Date: Tue, 21 May 2024 18:30:29 -0700 Subject: [PATCH 02/13] Adding changes to revisions controller and wp_get_global_stylesheet --- .../class-wp-theme-json-resolver.php | 77 +++++++++++++++++++ ...est-global-styles-revisions-controller.php | 25 ++++-- 2 files changed, 95 insertions(+), 7 deletions(-) diff --git a/src/wp-includes/class-wp-theme-json-resolver.php b/src/wp-includes/class-wp-theme-json-resolver.php index 59c5f54b96e45..b8c040db3ac64 100644 --- a/src/wp-includes/class-wp-theme-json-resolver.php +++ b/src/wp-includes/class-wp-theme-json-resolver.php @@ -744,4 +744,81 @@ public static function get_style_variations() { } return $variations; } + + /** + * Resolves relative paths in theme.json styles to theme absolute paths + * and returns them in an array that can be embedded + * as the value of `_link` object in REST API responses. + * + * @since 6.6.0 + * + * @param WP_Theme_JSON_Gutenberg $theme_json A theme json instance. + * @return array An array of resolved paths. + */ + public static function get_resolved_theme_uris( $theme_json ) { + $resolved_theme_uris = array(); + + if ( ! $theme_json instanceof WP_Theme_JSON ) { + return $resolved_theme_uris; + } + + $theme_json_data = $theme_json->get_raw_data(); + + // Top level styles. + $background_image_url = isset( $theme_json_data['styles']['background']['backgroundImage']['url'] ) ? $theme_json_data['styles']['background']['backgroundImage']['url'] : null; + + /* + * The same file convention when registering web fonts. + * See: WP_Font_Face_Resolver:: to_theme_file_uri. + */ + $placeholder = 'file:./'; + if ( + isset( $background_image_url ) && + is_string( $background_image_url ) && + // Skip if the src doesn't start with the placeholder, as there's nothing to replace. + str_starts_with( $background_image_url, $placeholder ) ) { + $file_type = wp_check_filetype( $background_image_url ); + $src_url = str_replace( $placeholder, '', $background_image_url ); + $resolved_theme_uri = array( + 'name' => $background_image_url, + 'href' => sanitize_url( get_theme_file_uri( $src_url ) ), + 'target' => 'styles.background.backgroundImage.url', + ); + if ( isset( $file_type['type'] ) ) { + $resolved_theme_uri['type'] = $file_type['type']; + } + $resolved_theme_uris[] = $resolved_theme_uri; + } + + return $resolved_theme_uris; + } + + /** + * Resolves relative paths in theme.json styles to theme absolute paths + * and merges them with incoming theme JSON. + * + * @since 6.6.0 + * + * @param WP_Theme_JSON_Gutenberg $theme_json A theme json instance. + * @return WP_Theme_JSON_Gutenberg Theme merged with resolved paths, if any found. + */ + public static function resolve_theme_file_uris( $theme_json ) { + $resolved_urls = static::get_resolved_theme_uris( $theme_json ); + if ( empty( $resolved_urls ) ) { + return $theme_json; + } + + $resolved_theme_json_data = array( + 'version' => WP_Theme_JSON::LATEST_SCHEMA, + ); + + foreach ( $resolved_urls as $resolved_url ) { + $path = explode( '.', $resolved_url['target'] ); + _wp_array_set( $resolved_theme_json_data, $path, $resolved_url['href'] ); + } + + $theme_json->merge( new WP_Theme_JSON( $resolved_theme_json_data ) ); + + return $theme_json; + } } diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php index 4a37f28d370a4..0931b75be37dd 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php @@ -268,6 +268,7 @@ public function get_items( $request ) { * Prepares the revision for the REST response. * * @since 6.3.0 + * @since 6.6.0 Added resolved URI links to the response. * * @param WP_Post $post Post revision object. * @param WP_REST_Request $request Request object. @@ -281,11 +282,13 @@ public function prepare_item_for_response( $post, $request ) { return $global_styles_config; } - $fields = $this->get_fields_for_response( $request ); - $data = array(); + $fields = $this->get_fields_for_response( $request ); + $data = array(); + $theme_json = array(); if ( ! empty( $global_styles_config['styles'] ) || ! empty( $global_styles_config['settings'] ) ) { - $global_styles_config = ( new WP_Theme_JSON( $global_styles_config, 'custom' ) )->get_raw_data(); + $theme_json = new WP_Theme_JSON_Gutenberg( $global_styles_config, 'custom' ); + $global_styles_config = ( $theme_json )->get_raw_data(); if ( rest_is_field_included( 'settings', $fields ) ) { $data['settings'] = ! empty( $global_styles_config['settings'] ) ? $global_styles_config['settings'] : new stdClass(); } @@ -322,11 +325,19 @@ public function prepare_item_for_response( $post, $request ) { $data['parent'] = (int) $parent->ID; } - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + $response = rest_ensure_response( $data ); + $links = array(); + $resolved_theme_uris = WP_Theme_JSON_Resolver::get_resolved_theme_uris( $theme_json ); - return rest_ensure_response( $data ); + if ( ! empty( $resolved_theme_uris ) ) { + $links['https://api.w.org/theme-file'] = $resolved_theme_uris; + $response->add_links( $links ); + } + + return $response; } /** From 8a0c364be0a75e3ce3a17a4a8941797a409bf0da Mon Sep 17 00:00:00 2001 From: ramon Date: Mon, 27 May 2024 08:21:33 +1000 Subject: [PATCH 03/13] Starting on unit tests --- .../block-theme/assets/sugarloaf-mountain.jpg | Bin 0 -> 46269 bytes .../block-theme/styles/variation-b.json | 7 +++ .../rest-global-styles-controller.php | 40 +++++++++++++++--- 3 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 tests/phpunit/data/themedir1/block-theme/assets/sugarloaf-mountain.jpg diff --git a/tests/phpunit/data/themedir1/block-theme/assets/sugarloaf-mountain.jpg b/tests/phpunit/data/themedir1/block-theme/assets/sugarloaf-mountain.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fee025b86b3184f276c8d826da04fa928f304360 GIT binary patch literal 46269 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 2, - 'title' => 'variation-a', 'settings' => array( 'blocks' => array( 'core/paragraph' => array( @@ -146,12 +150,29 @@ public function test_get_theme_items() { ), ), ), + 'title' => 'variation-a', ), array( - 'version' => 2, - 'title' => 'variation-b', + 'version' => 2, +/* '_links' => array( + 'curies' => array( + array( + 'name' => 'wp', + 'href' => 'https://api.w.org/{rel}', + 'templated' => true, + ), + ), + 'wp:theme-file' => array( + array( + 'href' => 'http://localhost:8889/wp-content/themes/emptytheme/assets/sugarloaf-mountain.jpg', + 'name' => 'file:./assets/sugarloaf-mountain.jpg', + 'target' => 'styles.background.backgroundImage.url', + 'type' => 'image/jpeg', + ), + ), + ),*/ 'settings' => array( - 'blocks' => array( + 'blocks' => array( 'core/post-title' => array( 'color' => array( 'palette' => array( @@ -167,6 +188,14 @@ public function test_get_theme_items() { ), ), ), + /* 'styles' => array( + 'background' => array( + 'backgroundImage' => array( + 'url' => 'http://localhost:8889/wp-content/themes/block-theme/assets/sugarloaf-mountain.jpg', + ), + ), + ),*/ + 'title' => 'variation-b', ), array( 'version' => 2, @@ -196,9 +225,6 @@ public function test_get_theme_items() { ), ); - wp_recursive_ksort( $data ); - wp_recursive_ksort( $expected ); - $this->assertSameSets( $expected, $data ); } From f3e67540642e439282ce64a6724c23de8975ead7 Mon Sep 17 00:00:00 2001 From: ramon Date: Tue, 28 May 2024 14:33:30 +1000 Subject: [PATCH 04/13] Resolving theme file URIs in the global styles stylesheet --- src/wp-includes/global-styles-and-settings.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/global-styles-and-settings.php b/src/wp-includes/global-styles-and-settings.php index fd1890c53aba2..fbf4fe2c52c3e 100644 --- a/src/wp-includes/global-styles-and-settings.php +++ b/src/wp-includes/global-styles-and-settings.php @@ -139,6 +139,7 @@ function wp_get_global_styles( $path = array(), $context = array() ) { * * @since 5.9.0 * @since 6.1.0 Added 'base-layout-styles' support. + * @since 6.6.0 Resolves relative paths in theme.json styles to theme absolute paths. * * @param array $types Optional. Types of styles to load. * It accepts as values 'variables', 'presets', 'styles', 'base-layout-styles'. @@ -179,9 +180,9 @@ function wp_get_global_stylesheet( $types = array() ) { } } - $tree = WP_Theme_JSON_Resolver::get_merged_data(); - + $tree = WP_Theme_JSON_Resolver::resolve_theme_file_uris( WP_Theme_JSON_Resolver::get_merged_data() ); $supports_theme_json = wp_theme_has_theme_json(); + if ( empty( $types ) && ! $supports_theme_json ) { $types = array( 'variables', 'presets', 'base-layout-styles' ); } elseif ( empty( $types ) ) { From cc77f01ce6b45946c60418cb91ce527258b3520f Mon Sep 17 00:00:00 2001 From: ramon Date: Tue, 28 May 2024 14:37:41 +1000 Subject: [PATCH 05/13] El LINTO DEL DIABLO --- .../rest-global-styles-controller.php | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/tests/phpunit/tests/rest-api/rest-global-styles-controller.php b/tests/phpunit/tests/rest-api/rest-global-styles-controller.php index 246e025d4414c..630cdca928393 100644 --- a/tests/phpunit/tests/rest-api/rest-global-styles-controller.php +++ b/tests/phpunit/tests/rest-api/rest-global-styles-controller.php @@ -153,49 +153,49 @@ public function test_get_theme_items() { 'title' => 'variation-a', ), array( - 'version' => 2, -/* '_links' => array( - 'curies' => array( - array( - 'name' => 'wp', - 'href' => 'https://api.w.org/{rel}', - 'templated' => true, - ), - ), - 'wp:theme-file' => array( - array( - 'href' => 'http://localhost:8889/wp-content/themes/emptytheme/assets/sugarloaf-mountain.jpg', - 'name' => 'file:./assets/sugarloaf-mountain.jpg', - 'target' => 'styles.background.backgroundImage.url', - 'type' => 'image/jpeg', - ), - ), - ),*/ - 'settings' => array( - 'blocks' => array( - 'core/post-title' => array( - 'color' => array( - 'palette' => array( - 'theme' => array( - array( - 'slug' => 'light', - 'name' => 'Light', - 'color' => '#f1f1f1', + 'version' => 2, + /* '_links' => array( + 'curies' => array( + array( + 'name' => 'wp', + 'href' => 'https://api.w.org/{rel}', + 'templated' => true, + ), + ), + 'wp:theme-file' => array( + array( + 'href' => 'http://localhost:8889/wp-content/themes/emptytheme/assets/sugarloaf-mountain.jpg', + 'name' => 'file:./assets/sugarloaf-mountain.jpg', + 'target' => 'styles.background.backgroundImage.url', + 'type' => 'image/jpeg', + ), + ), + ),*/ + 'settings' => array( + 'blocks' => array( + 'core/post-title' => array( + 'color' => array( + 'palette' => array( + 'theme' => array( + array( + 'slug' => 'light', + 'name' => 'Light', + 'color' => '#f1f1f1', + ), + ), + ), + ), + ), + ), ), - ), - ), - ), - ), - ), - ), - /* 'styles' => array( + /* 'styles' => array( 'background' => array( 'backgroundImage' => array( 'url' => 'http://localhost:8889/wp-content/themes/block-theme/assets/sugarloaf-mountain.jpg', ), ), ),*/ - 'title' => 'variation-b', + 'title' => 'variation-b', ), array( 'version' => 2, From edbc18d034c01d40cd99b7b8641800d378dd3c77 Mon Sep 17 00:00:00 2001 From: ramon Date: Wed, 29 May 2024 12:28:59 +1000 Subject: [PATCH 06/13] Add resolver tests. --- .../rest-global-styles-controller.php | 2 +- .../tests/theme/wpThemeJsonResolver.php | 82 +++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/tests/phpunit/tests/rest-api/rest-global-styles-controller.php b/tests/phpunit/tests/rest-api/rest-global-styles-controller.php index 630cdca928393..8a7227742759a 100644 --- a/tests/phpunit/tests/rest-api/rest-global-styles-controller.php +++ b/tests/phpunit/tests/rest-api/rest-global-styles-controller.php @@ -121,7 +121,7 @@ public function test_context_param() { /** * @covers WP_REST_Global_Styles_Controller::get_theme_items - * @ticket + * @ticket 61273 * */ public function test_get_theme_items() { diff --git a/tests/phpunit/tests/theme/wpThemeJsonResolver.php b/tests/phpunit/tests/theme/wpThemeJsonResolver.php index 15e3a9a71dea6..ad9e6584ee773 100644 --- a/tests/phpunit/tests/theme/wpThemeJsonResolver.php +++ b/tests/phpunit/tests/theme/wpThemeJsonResolver.php @@ -103,6 +103,7 @@ public function set_up() { add_filter( 'theme_root', array( $this, 'filter_set_theme_root' ) ); add_filter( 'stylesheet_root', array( $this, 'filter_set_theme_root' ) ); add_filter( 'template_root', array( $this, 'filter_set_theme_root' ) ); + add_filter( 'theme_file_uri', array( $this, 'filter_theme_file_uri' ) ); $this->queries = array(); // Clear caches. wp_clean_themes_cache(); @@ -113,12 +114,23 @@ public function tear_down() { $GLOBALS['wp_theme_directories'] = $this->orig_theme_dir; wp_clean_themes_cache(); unset( $GLOBALS['wp_themes'] ); + remove_filter( 'theme_file_uri', array( $this, 'filter_theme_file_uri' ) ); // Reset data between tests. wp_clean_theme_json_cache(); parent::tear_down(); } + /* + * This filter callback normalizes the return value from `get_theme_file_uri` + * to guard against changes in test environments. + * The test suite otherwise returns full system dir path, e.g., + * /wordpress-phpunit/includes/../data/themedir1/default/example/img/image.png + */ + public function filter_theme_file_uri( $file ) { + return 'https://example.org/wp-content/themes/example-theme/example/' . explode( 'example/', $file )[1]; + } + public function filter_set_theme_root() { return $this->theme_root; } @@ -1176,4 +1188,74 @@ public function test_shadow_default_presets_value_for_block_and_classic_themes() $default_presets_for_block = $theme_json->get_settings()['shadow']['defaultPresets']; $this->assertTrue( $default_presets_for_block ); } + + /** + * Tests that relative paths are resolved and merged into the theme.json data. + * + * @covers WP_Theme_JSON_Resolver::resolve_theme_file_uris + * @ticket 61273 + */ + public function test_resolve_theme_file_uris() { + $theme_json = new WP_Theme_JSON( + array( + 'version' => WP_Theme_JSON::LATEST_SCHEMA, + 'styles' => array( + 'background' => array( + 'backgroundImage' => array( + 'url' => 'file:./example/img/image.png', + ), + ), + ), + ) + ); + + $expected_data = array( + 'version' => WP_Theme_JSON::LATEST_SCHEMA, + 'styles' => array( + 'background' => array( + 'backgroundImage' => array( + 'url' => 'https://example.org/wp-content/themes/example-theme/example/img/image.png', + ), + ), + ), + ); + + $actual = WP_Theme_JSON_Resolver::resolve_theme_file_uris( $theme_json ); + + $this->assertSame( $expected_data, $actual->get_raw_data() ); + } + + /** + * Tests that them uris are resolved and bundled with other metadata in an array. + * + * @covers WP_Theme_JSON_Resolver::get_resolved_theme_uris + * @ticket 61273 + */ + public function test_get_resolved_theme_uris() { + $theme_json = new WP_Theme_JSON( + array( + 'version' => WP_Theme_JSON::LATEST_SCHEMA, + 'styles' => array( + 'background' => array( + 'backgroundImage' => array( + 'url' => 'file:./example/img/image.png', + ), + ), + ), + ) + ); + + $expected_data = array( + array( + 'name' => 'file:./example/img/image.png', + 'href' => 'https://example.org/wp-content/themes/example-theme/example/img/image.png', + 'target' => 'styles.background.backgroundImage.url', + 'type' => 'image/png', + ), + ); + + $actual = WP_Theme_JSON_Resolver::get_resolved_theme_uris( $theme_json ); + + $this->assertSame( $expected_data, $actual ); + } } From 2e0f58a49850faee0172b2bcea9ce582aa320dfa Mon Sep 17 00:00:00 2001 From: ramon Date: Wed, 29 May 2024 13:17:45 +1000 Subject: [PATCH 07/13] Adding the filters to the tests --- .../rest-global-styles-controller.php | 100 +++++++++++------- .../tests/theme/wpThemeJsonResolver.php | 15 +-- 2 files changed, 68 insertions(+), 47 deletions(-) diff --git a/tests/phpunit/tests/rest-api/rest-global-styles-controller.php b/tests/phpunit/tests/rest-api/rest-global-styles-controller.php index 8a7227742759a..6160ce3cc6205 100644 --- a/tests/phpunit/tests/rest-api/rest-global-styles-controller.php +++ b/tests/phpunit/tests/rest-api/rest-global-styles-controller.php @@ -34,6 +34,12 @@ class WP_REST_Global_Styles_Controller_Test extends WP_Test_REST_Controller_Test public function set_up() { parent::set_up(); switch_theme( 'tt1-blocks' ); + add_filter( 'theme_file_uri', array( $this, 'filter_theme_file_uri' ) ); + } + + public function tear_down() { + remove_filter( 'theme_file_uri', array( $this, 'filter_theme_file_uri' ) ); + parent::tear_down(); } /** @@ -79,6 +85,17 @@ public static function wpTearDownAfterClass() { self::delete_user( self::$subscriber_id ); } + /* + * This filter callback normalizes the return value from `get_theme_file_uri` + * to guard against changes in test environments. + * The test suite otherwise returns full system dir path, e.g., + * /var/www/tests/phpunit/includes/../data/themedir1/block-theme/assets/sugarloaf-mountain.jpg + */ + public function filter_theme_file_uri( $file ) { + $file_name = substr( strrchr( $file, '/' ), 1 ); + return 'https://example.org/wp-content/themes/example-theme/assets/' . $file_name; + } + /** * @covers WP_REST_Global_Styles_Controller::register_routes * @ticket 54596 @@ -153,49 +170,49 @@ public function test_get_theme_items() { 'title' => 'variation-a', ), array( - 'version' => 2, - /* '_links' => array( - 'curies' => array( - array( - 'name' => 'wp', - 'href' => 'https://api.w.org/{rel}', - 'templated' => true, - ), - ), - 'wp:theme-file' => array( - array( - 'href' => 'http://localhost:8889/wp-content/themes/emptytheme/assets/sugarloaf-mountain.jpg', - 'name' => 'file:./assets/sugarloaf-mountain.jpg', - 'target' => 'styles.background.backgroundImage.url', - 'type' => 'image/jpeg', - ), - ), - ),*/ - 'settings' => array( - 'blocks' => array( - 'core/post-title' => array( - 'color' => array( - 'palette' => array( - 'theme' => array( - array( - 'slug' => 'light', - 'name' => 'Light', - 'color' => '#f1f1f1', - ), - ), - ), - ), - ), - ), + 'version' => 2, + 'settings' => array( + 'blocks' => array( + 'core/post-title' => array( + 'color' => array( + 'palette' => array( + 'theme' => array( + array( + 'slug' => 'light', + 'name' => 'Light', + 'color' => '#f1f1f1', ), - /* 'styles' => array( - 'background' => array( - 'backgroundImage' => array( - 'url' => 'http://localhost:8889/wp-content/themes/block-theme/assets/sugarloaf-mountain.jpg', + ), + ), ), ), - ),*/ - 'title' => 'variation-b', + ), + ), + 'styles' => array( + 'background' => array( + 'backgroundImage' => array( + 'url' => 'file:./assets/sugarloaf-mountain.jpg', + ), + ), + ), + 'title' => 'variation-b', + '_links' => array( + 'curies' => array( + array( + 'name' => 'wp', + 'href' => 'https://api.w.org/{rel}', + 'templated' => true, + ), + ), + 'wp:theme-file' => array( + array( + 'href' => 'https://example.org/wp-content/themes/example-theme/assets/sugarloaf-mountain.jpg', + 'name' => 'file:./assets/sugarloaf-mountain.jpg', + 'target' => 'styles.background.backgroundImage.url', + 'type' => 'image/jpeg', + ), + ), + ), ), array( 'version' => 2, @@ -225,6 +242,9 @@ public function test_get_theme_items() { ), ); + wp_recursive_ksort( $data ); + wp_recursive_ksort( $expected ); + $this->assertSameSets( $expected, $data ); } diff --git a/tests/phpunit/tests/theme/wpThemeJsonResolver.php b/tests/phpunit/tests/theme/wpThemeJsonResolver.php index ad9e6584ee773..52cd20641f45e 100644 --- a/tests/phpunit/tests/theme/wpThemeJsonResolver.php +++ b/tests/phpunit/tests/theme/wpThemeJsonResolver.php @@ -125,10 +125,11 @@ public function tear_down() { * This filter callback normalizes the return value from `get_theme_file_uri` * to guard against changes in test environments. * The test suite otherwise returns full system dir path, e.g., - * /wordpress-phpunit/includes/../data/themedir1/default/example/img/image.png + * /var/www/tests/phpunit/includes/../data/themedir1/block-theme/assets/sugarloaf-mountain.jpg */ public function filter_theme_file_uri( $file ) { - return 'https://example.org/wp-content/themes/example-theme/example/' . explode( 'example/', $file )[1]; + $file_name = substr( strrchr( $file, '/' ), 1 ); + return 'https://example.org/wp-content/themes/example-theme/assets/' . $file_name; } public function filter_set_theme_root() { @@ -1202,7 +1203,7 @@ public function test_resolve_theme_file_uris() { 'styles' => array( 'background' => array( 'backgroundImage' => array( - 'url' => 'file:./example/img/image.png', + 'url' => 'file:./assets/image.png', ), ), ), @@ -1214,7 +1215,7 @@ public function test_resolve_theme_file_uris() { 'styles' => array( 'background' => array( 'backgroundImage' => array( - 'url' => 'https://example.org/wp-content/themes/example-theme/example/img/image.png', + 'url' => 'https://example.org/wp-content/themes/example-theme/assets/image.png', ), ), ), @@ -1238,7 +1239,7 @@ public function test_get_resolved_theme_uris() { 'styles' => array( 'background' => array( 'backgroundImage' => array( - 'url' => 'file:./example/img/image.png', + 'url' => 'file:./assets/image.png', ), ), ), @@ -1247,8 +1248,8 @@ public function test_get_resolved_theme_uris() { $expected_data = array( array( - 'name' => 'file:./example/img/image.png', - 'href' => 'https://example.org/wp-content/themes/example-theme/example/img/image.png', + 'name' => 'file:./assets/image.png', + 'href' => 'https://example.org/wp-content/themes/example-theme/assets/image.png', 'target' => 'styles.background.backgroundImage.url', 'type' => 'image/png', ), From f507e66ce7ab2051513d1e68fc985dba64f2fa02 Mon Sep 17 00:00:00 2001 From: ramon Date: Wed, 29 May 2024 14:06:33 +1000 Subject: [PATCH 08/13] _Gutenberg removed :) --- .../class-wp-rest-global-styles-revisions-controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php index 0931b75be37dd..3d578536cfc4d 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php @@ -287,7 +287,7 @@ public function prepare_item_for_response( $post, $request ) { $theme_json = array(); if ( ! empty( $global_styles_config['styles'] ) || ! empty( $global_styles_config['settings'] ) ) { - $theme_json = new WP_Theme_JSON_Gutenberg( $global_styles_config, 'custom' ); + $theme_json = new WP_Theme_JSON( $global_styles_config, 'custom' ); $global_styles_config = ( $theme_json )->get_raw_data(); if ( rest_is_field_included( 'settings', $fields ) ) { $data['settings'] = ! empty( $global_styles_config['settings'] ) ? $global_styles_config['settings'] : new stdClass(); From 4f2b71c1253a34d66adb0704b4fe1f4cfab59fe6 Mon Sep 17 00:00:00 2001 From: ramon Date: Wed, 29 May 2024 16:27:39 +1000 Subject: [PATCH 09/13] Remove image, which is unnecessary for the tests --- .../block-theme/assets/sugarloaf-mountain.jpg | Bin 46269 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/phpunit/data/themedir1/block-theme/assets/sugarloaf-mountain.jpg diff --git a/tests/phpunit/data/themedir1/block-theme/assets/sugarloaf-mountain.jpg b/tests/phpunit/data/themedir1/block-theme/assets/sugarloaf-mountain.jpg deleted file mode 100644 index fee025b86b3184f276c8d826da04fa928f304360..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46269 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 Date: Thu, 30 May 2024 15:08:22 +1000 Subject: [PATCH 10/13] Update src/wp-includes/class-wp-theme-json-resolver.php Co-authored-by: Robert Anderson --- src/wp-includes/class-wp-theme-json-resolver.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/class-wp-theme-json-resolver.php b/src/wp-includes/class-wp-theme-json-resolver.php index b8c040db3ac64..7827bb0ec1e21 100644 --- a/src/wp-includes/class-wp-theme-json-resolver.php +++ b/src/wp-includes/class-wp-theme-json-resolver.php @@ -776,7 +776,8 @@ public static function get_resolved_theme_uris( $theme_json ) { isset( $background_image_url ) && is_string( $background_image_url ) && // Skip if the src doesn't start with the placeholder, as there's nothing to replace. - str_starts_with( $background_image_url, $placeholder ) ) { + str_starts_with( $background_image_url, $placeholder ) + ) { $file_type = wp_check_filetype( $background_image_url ); $src_url = str_replace( $placeholder, '', $background_image_url ); $resolved_theme_uri = array( From ce97301c3c627a37695a280dde53836ae085ebda Mon Sep 17 00:00:00 2001 From: Ramon Date: Thu, 30 May 2024 15:13:18 +1000 Subject: [PATCH 11/13] Apply suggestions from code review Co-authored-by: Robert Anderson --- src/wp-includes/class-wp-theme-json-resolver.php | 6 +++--- .../class-wp-rest-global-styles-revisions-controller.php | 2 +- .../tests/rest-api/rest-global-styles-controller.php | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/wp-includes/class-wp-theme-json-resolver.php b/src/wp-includes/class-wp-theme-json-resolver.php index 7827bb0ec1e21..db3a48c5c82f5 100644 --- a/src/wp-includes/class-wp-theme-json-resolver.php +++ b/src/wp-includes/class-wp-theme-json-resolver.php @@ -752,7 +752,7 @@ public static function get_style_variations() { * * @since 6.6.0 * - * @param WP_Theme_JSON_Gutenberg $theme_json A theme json instance. + * @param WP_Theme_JSON $theme_json A theme json instance. * @return array An array of resolved paths. */ public static function get_resolved_theme_uris( $theme_json ) { @@ -800,8 +800,8 @@ public static function get_resolved_theme_uris( $theme_json ) { * * @since 6.6.0 * - * @param WP_Theme_JSON_Gutenberg $theme_json A theme json instance. - * @return WP_Theme_JSON_Gutenberg Theme merged with resolved paths, if any found. + * @param WP_Theme_JSON $theme_json A theme json instance. + * @return WP_Theme_JSON Theme merged with resolved paths, if any found. */ public static function resolve_theme_file_uris( $theme_json ) { $resolved_urls = static::get_resolved_theme_uris( $theme_json ); diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php index 3d578536cfc4d..198238d032e48 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php @@ -288,7 +288,7 @@ public function prepare_item_for_response( $post, $request ) { if ( ! empty( $global_styles_config['styles'] ) || ! empty( $global_styles_config['settings'] ) ) { $theme_json = new WP_Theme_JSON( $global_styles_config, 'custom' ); - $global_styles_config = ( $theme_json )->get_raw_data(); + $global_styles_config = $theme_json->get_raw_data(); if ( rest_is_field_included( 'settings', $fields ) ) { $data['settings'] = ! empty( $global_styles_config['settings'] ) ? $global_styles_config['settings'] : new stdClass(); } diff --git a/tests/phpunit/tests/rest-api/rest-global-styles-controller.php b/tests/phpunit/tests/rest-api/rest-global-styles-controller.php index 6160ce3cc6205..6f920c9152bb4 100644 --- a/tests/phpunit/tests/rest-api/rest-global-styles-controller.php +++ b/tests/phpunit/tests/rest-api/rest-global-styles-controller.php @@ -137,9 +137,10 @@ public function test_context_param() { } /** + * Tests a GET request to the global styles variations endpoint. + * * @covers WP_REST_Global_Styles_Controller::get_theme_items * @ticket 61273 - * */ public function test_get_theme_items() { wp_set_current_user( self::$admin_id ); From ffc13054b8bbe1db47dd0e570e41dc93a00e9d12 Mon Sep 17 00:00:00 2001 From: ramon Date: Thu, 30 May 2024 15:23:13 +1000 Subject: [PATCH 12/13] Removing unrelated since annotation Simplifying links array building in revisions controller --- .../endpoints/class-wp-rest-global-styles-controller.php | 1 - .../class-wp-rest-global-styles-revisions-controller.php | 8 +++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php index 4a3140d586ba6..3b2caf88fe65b 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php @@ -289,7 +289,6 @@ protected function prepare_item_for_database( $request ) { * Prepare a global styles config output for response. * * @since 5.9.0 - * @since 6.2.0 Handling of style.css was added to WP_Theme_JSON. * @since 6.6.0 Added custom relative theme file URIs to `_links`. * * @param WP_Post $post Global Styles post object. diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php index 198238d032e48..ae15b19eff62b 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php @@ -329,12 +329,14 @@ public function prepare_item_for_response( $post, $request ) { $data = $this->add_additional_fields_to_object( $data, $request ); $data = $this->filter_response_by_context( $data, $context ); $response = rest_ensure_response( $data ); - $links = array(); $resolved_theme_uris = WP_Theme_JSON_Resolver::get_resolved_theme_uris( $theme_json ); if ( ! empty( $resolved_theme_uris ) ) { - $links['https://api.w.org/theme-file'] = $resolved_theme_uris; - $response->add_links( $links ); + $response->add_links( + array( + 'https://api.w.org/theme-file' => $resolved_theme_uris, + ) + ); } return $response; From e91746d64fb27259049113ea26a0cba0484de2c2 Mon Sep 17 00:00:00 2001 From: ramon Date: Thu, 30 May 2024 15:41:44 +1000 Subject: [PATCH 13/13] Set default var value of $theme_json to null to indicate that it needs to be set to something to be useful. --- .../class-wp-rest-global-styles-revisions-controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php index ae15b19eff62b..54285fa560bee 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php @@ -284,7 +284,7 @@ public function prepare_item_for_response( $post, $request ) { $fields = $this->get_fields_for_response( $request ); $data = array(); - $theme_json = array(); + $theme_json = null; if ( ! empty( $global_styles_config['styles'] ) || ! empty( $global_styles_config['settings'] ) ) { $theme_json = new WP_Theme_JSON( $global_styles_config, 'custom' );