From 513be382507802baf4816c8e2df8012a549ea481 Mon Sep 17 00:00:00 2001 From: adamsilverstein Date: Tue, 17 Mar 2026 09:18:50 -0700 Subject: [PATCH] Media: Make client-side supported MIME types configurable Add a `client_side_supported_mime_types` filter and REST API index field so plugins can customize which image formats are processed client-side via WebAssembly-based vips. The default list includes JPEG, PNG, GIF, WebP, and AVIF. Also updates the preload paths in the post editor and site editor to include the new field, ensuring the preloaded URL matches the JavaScript request. Props adamsilverstein. See https://github.com/WordPress/gutenberg/pull/76549. --- src/wp-admin/edit-form-blocks.php | 1 + src/wp-admin/site-editor.php | 1 + src/wp-includes/rest-api/class-wp-rest-server.php | 15 +++++++++++++++ tests/qunit/fixtures/wp-api-generated.js | 7 +++++++ 4 files changed, 24 insertions(+) diff --git a/src/wp-admin/edit-form-blocks.php b/src/wp-admin/edit-form-blocks.php index 2237fc69ce293..55fd4e88abc4b 100644 --- a/src/wp-admin/edit-form-blocks.php +++ b/src/wp-admin/edit-form-blocks.php @@ -98,6 +98,7 @@ static function ( $classes ) { 'jpeg_interlaced', 'png_interlaced', 'gif_interlaced', + 'client_side_supported_mime_types', 'name', 'site_icon', 'site_icon_url', diff --git a/src/wp-admin/site-editor.php b/src/wp-admin/site-editor.php index 9a8268c3392d7..657b3ce57495a 100644 --- a/src/wp-admin/site-editor.php +++ b/src/wp-admin/site-editor.php @@ -224,6 +224,7 @@ static function ( $classes ) { 'jpeg_interlaced', 'png_interlaced', 'gif_interlaced', + 'client_side_supported_mime_types', 'name', 'site_icon', 'site_icon_url', diff --git a/src/wp-includes/rest-api/class-wp-rest-server.php b/src/wp-includes/rest-api/class-wp-rest-server.php index 704a990298826..b1f80df89ebbe 100644 --- a/src/wp-includes/rest-api/class-wp-rest-server.php +++ b/src/wp-includes/rest-api/class-wp-rest-server.php @@ -1394,6 +1394,21 @@ public function get_index( $request ) { $available['png_interlaced'] = (bool) apply_filters( 'image_save_progressive', false, 'image/png' ); /** This filter is documented in wp-includes/class-wp-image-editor-gd.php */ $available['gif_interlaced'] = (bool) apply_filters( 'image_save_progressive', false, 'image/gif' ); + + /** + * Filters the MIME types supported by client-side media processing. + * + * Allows plugins to add or remove MIME types from the list of formats + * that can be processed client-side using WebAssembly-based vips. + * + * @since 7.0.0 + * + * @param string[] $mime_types Array of MIME type strings. + */ + $available['client_side_supported_mime_types'] = apply_filters( + 'client_side_supported_mime_types', + array( 'image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/avif' ) + ); } $response = new WP_REST_Response( $available ); diff --git a/tests/qunit/fixtures/wp-api-generated.js b/tests/qunit/fixtures/wp-api-generated.js index 4f925d35c82f6..4ec2877667eb2 100644 --- a/tests/qunit/fixtures/wp-api-generated.js +++ b/tests/qunit/fixtures/wp-api-generated.js @@ -12920,6 +12920,13 @@ mockedApiResponse.Schema = { "jpeg_interlaced": false, "png_interlaced": false, "gif_interlaced": false, + "client_side_supported_mime_types": [ + "image/jpeg", + "image/png", + "image/gif", + "image/webp", + "image/avif" + ], "site_logo": 0, "site_icon": 0, "site_icon_url": ""