close
Skip to content

Fix image upload crashes #76707

Merged
adamsilverstein merged 27 commits into
trunkfrom
fix/image-upload-crash
May 20, 2026
Merged

Fix image upload crashes #76707
adamsilverstein merged 27 commits into
trunkfrom
fix/image-upload-crash

Conversation

@adamsilverstein
Copy link
Copy Markdown
Member

@adamsilverstein adamsilverstein commented Mar 19, 2026

Summary

Addresses several issues reported in #76706 with client-side media processing:

  • Disable vips operation cache: Set Cache.max(0) to prevent libvips from caching results of previous operations, which caused unbounded WASM memory growth and OOM crashes.
  • Worker recycling for OOM prevention: Track completed vips operations and terminate/recreate the worker after 50 operations to reclaim WASM linear memory (which can only grow, never shrink).
  • Fix stuck spinner on unsupported images: When a child sideload item (e.g. thumbnail) fails during vips processing, the parent upload item was stuck forever with a spinner. Two issues fixed:
    1. cancelItem now kicks pending items waiting on concurrency slots freed by the cancelled item, so remaining children actually get processed instead of sitting in queue forever.
    2. cancelItem now notifies the parent item to re-check its Finalize gate, so the parent completes once all children are done.
  • Suppress console noise: Redirect wasm-vips internal stdout/stderr to prevent confusing console errors during AVIF encoding/decoding. Output can still be captured via globalThis.__vipsDebug for debugging.
  • Performance benchmarking: Add media-upload.spec.js measuring end-to-end image upload + processing times for JPEG, PNG, large JPEG, and batch uploads (5 images).

Fixes #76706.

Test plan

  • Unit tests pass: npx wp-scripts test-unit-js --config test/unit/jest.config.js --testPathPattern='packages/(vips|upload-media)'
  • Upload a standard JPEG/PNG — verify upload completes with thumbnails generated
  • Upload an unsupported AVIF (e.g. AVIF profile 0 with bitstream 2.0) — verify the spinner goes away and the error is surfaced, not stuck indefinitely
  • Upload 10+ large images in succession — verify no OOM crash
  • Performance test: npm run test:performance -- test/performance/specs/media-upload.spec.js (requires wp-env)

Addresses console errors during AVIF processing by suppressing wasm-vips
internal stdout/stderr output. Adds defensive guards against HEIC/HEIF
input types that crash wasm-vips. Implements worker recycling after 50
image processing operations to prevent out-of-memory crashes from WASM
memory growth. Adds performance benchmarking test for image upload
processing times across formats and batch sizes.

Fixes #76706.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 19, 2026

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

Unlinked Accounts

The following contributors have not linked their GitHub and WordPress.org accounts: @kleisauke.

Contributors, please read how to link your accounts to ensure your work is properly credited in WordPress releases.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Unlinked contributors: kleisauke.

Co-authored-by: adamsilverstein <adamsilverstein@git.wordpress.org>
Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
Co-authored-by: swissspidy <swissspidy@git.wordpress.org>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@adamsilverstein adamsilverstein self-assigned this Mar 19, 2026
@adamsilverstein adamsilverstein added [Type] Bug An existing feature does not function as intended [Status] In Progress Tracking issues with work in progress [Feature] Client Side Media Media processing in the browser with WASM labels Mar 19, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 19, 2026

Size Change: +590 B (+0.01%)

Total Size: 7.97 MB

📦 View Changed
Filename Size Change
build/modules/vips/worker.min.js 4.56 MB +207 B (0%)
build/scripts/block-editor/index.min.js 346 kB +8 B (0%)
build/scripts/editor/index.min.js 431 kB +65 B (+0.02%)
build/scripts/upload-media/index.min.js 11.5 kB +310 B (+2.77%)
ℹ️ View Unchanged
Filename Size
build/modules/a11y/index.min.js 355 B
build/modules/abilities/index.min.js 42.3 kB
build/modules/block-editor/utils/fit-text-frontend.min.js 617 B
build/modules/block-library/accordion/view.min.js 595 B
build/modules/block-library/file/view.min.js 346 B
build/modules/block-library/form/view.min.js 528 B
build/modules/block-library/image/view.min.js 2.64 kB
build/modules/block-library/navigation/view.min.js 1.14 kB
build/modules/block-library/playlist/view.min.js 10.9 kB
build/modules/block-library/query/view.min.js 518 B
build/modules/block-library/search/view.min.js 498 B
build/modules/block-library/tabs/view.min.js 946 B
build/modules/boot/index.min.js 19.3 kB
build/modules/connectors/index.min.js 2.05 kB
build/modules/content-types/index.min.js 156 kB
build/modules/core-abilities/index.min.js 926 B
build/modules/edit-site-init/index.min.js 1.4 kB
build/modules/interactivity-router/full-page.min.js 451 B
build/modules/interactivity-router/index.min.js 11.6 kB
build/modules/interactivity/index.min.js 15.3 kB
build/modules/latex-to-mathml/index.min.js 56.5 kB
build/modules/latex-to-mathml/loader.min.js 131 B
build/modules/lazy-editor/index.min.js 14.1 kB
build/modules/route/index.min.js 25.2 kB
build/modules/vips/loader.min.js 127 B
build/modules/workflow/index.min.js 19.9 kB
build/scripts/a11y/index.min.js 1.1 kB
build/scripts/annotations/index.min.js 2.53 kB
build/scripts/api-fetch/index.min.js 2.86 kB
build/scripts/autop/index.min.js 2.21 kB
build/scripts/base-styles/index.min.js 146 B
build/scripts/blob/index.min.js 665 B
build/scripts/block-directory/index.min.js 10.3 kB
build/scripts/block-library/index.min.js 323 kB
build/scripts/block-serialization-default-parser/index.min.js 1.2 kB
build/scripts/block-serialization-spec-parser/index.min.js 3.12 kB
build/scripts/blocks/index.min.js 57.1 kB
build/scripts/commands/index.min.js 21 kB
build/scripts/components/index.min.js 267 kB
build/scripts/compose/index.min.js 11.1 kB
build/scripts/core-commands/index.min.js 4.37 kB
build/scripts/core-data/index.min.js 31.3 kB
build/scripts/customize-widgets/index.min.js 14.6 kB
build/scripts/data-controls/index.min.js 832 B
build/scripts/data/index.min.js 9.72 kB
build/scripts/date/index.min.js 23.7 kB
build/scripts/deprecated/index.min.js 784 B
build/scripts/dom-ready/index.min.js 502 B
build/scripts/dom/index.min.js 5.04 kB
build/scripts/edit-post/index.min.js 18.8 kB
build/scripts/edit-site/index.min.js 265 kB
build/scripts/edit-widgets/index.min.js 22.2 kB
build/scripts/element/index.min.js 5.2 kB
build/scripts/escape-html/index.min.js 622 B
build/scripts/format-library/index.min.js 13.1 kB
build/scripts/hooks/index.min.js 1.86 kB
build/scripts/html-entities/index.min.js 529 B
build/scripts/i18n/index.min.js 2.5 kB
build/scripts/is-shallow-equal/index.min.js 607 B
build/scripts/keyboard-shortcuts/index.min.js 1.65 kB
build/scripts/keycodes/index.min.js 1.6 kB
build/scripts/list-reusable-blocks/index.min.js 2.53 kB
build/scripts/media-utils/index.min.js 79.9 kB
build/scripts/notices/index.min.js 1.89 kB
build/scripts/nux/index.min.js 1.92 kB
build/scripts/patterns/index.min.js 8 kB
build/scripts/plugins/index.min.js 2.18 kB
build/scripts/preferences-persistence/index.min.js 2.19 kB
build/scripts/preferences/index.min.js 3.33 kB
build/scripts/primitives/index.min.js 1.05 kB
build/scripts/priority-queue/index.min.js 1.65 kB
build/scripts/private-apis/index.min.js 1.14 kB
build/scripts/react-i18n/index.min.js 868 B
build/scripts/redux-routine/index.min.js 3.4 kB
build/scripts/reusable-blocks/index.min.js 3.14 kB
build/scripts/rich-text/index.min.js 14 kB
build/scripts/router/index.min.js 5.99 kB
build/scripts/server-side-render/index.min.js 1.94 kB
build/scripts/shortcode/index.min.js 1.62 kB
build/scripts/style-engine/index.min.js 2.45 kB
build/scripts/sync/index.min.js 39.3 kB
build/scripts/theme/index.min.js 22.3 kB
build/scripts/token-list/index.min.js 767 B
build/scripts/undo-manager/index.min.js 954 B
build/scripts/url/index.min.js 4.02 kB
build/scripts/vendors/react-dom.min.js 43.3 kB
build/scripts/vendors/react-jsx-runtime.min.js 667 B
build/scripts/vendors/react.min.js 2.77 kB
build/scripts/viewport/index.min.js 1.25 kB
build/scripts/warning/index.min.js 482 B
build/scripts/widgets/index.min.js 7.84 kB
build/scripts/wordcount/index.min.js 1.07 kB
build/styles/base-styles/admin-schemes-rtl.css 1.71 kB
build/styles/base-styles/admin-schemes-rtl.min.css 775 B
build/styles/base-styles/admin-schemes.css 1.71 kB
build/styles/base-styles/admin-schemes.min.css 775 B
build/styles/block-directory/style-rtl.css 1.97 kB
build/styles/block-directory/style-rtl.min.css 1.06 kB
build/styles/block-directory/style.css 1.98 kB
build/styles/block-directory/style.min.css 1.06 kB
build/styles/block-editor/content-rtl.css 5.44 kB
build/styles/block-editor/content-rtl.min.css 4.01 kB
build/styles/block-editor/content.css 5.44 kB
build/styles/block-editor/content.min.css 4.01 kB
build/styles/block-editor/default-editor-styles-rtl.css 697 B
build/styles/block-editor/default-editor-styles-rtl.min.css 224 B
build/styles/block-editor/default-editor-styles.css 697 B
build/styles/block-editor/default-editor-styles.min.css 224 B
build/styles/block-editor/style-rtl.css 18.7 kB
build/styles/block-editor/style-rtl.min.css 15.9 kB
build/styles/block-editor/style.css 18.7 kB
build/styles/block-editor/style.min.css 15.9 kB
build/styles/block-library/accordion-heading/style-rtl.css 346 B
build/styles/block-library/accordion-heading/style-rtl.min.css 325 B
build/styles/block-library/accordion-heading/style.css 346 B
build/styles/block-library/accordion-heading/style.min.css 325 B
build/styles/block-library/accordion-item/style-rtl.css 239 B
build/styles/block-library/accordion-item/style-rtl.min.css 180 B
build/styles/block-library/accordion-item/style.css 238 B
build/styles/block-library/accordion-item/style.min.css 180 B
build/styles/block-library/accordion-panel/style-rtl.css 110 B
build/styles/block-library/accordion-panel/style-rtl.min.css 99 B
build/styles/block-library/accordion-panel/style.css 110 B
build/styles/block-library/accordion-panel/style.min.css 99 B
build/styles/block-library/accordion/style-rtl.css 69 B
build/styles/block-library/accordion/style-rtl.min.css 62 B
build/styles/block-library/accordion/style.css 69 B
build/styles/block-library/accordion/style.min.css 62 B
build/styles/block-library/archives/style-rtl.css 101 B
build/styles/block-library/archives/style-rtl.min.css 90 B
build/styles/block-library/archives/style.css 101 B
build/styles/block-library/archives/style.min.css 90 B
build/styles/block-library/audio/editor-rtl.css 166 B
build/styles/block-library/audio/editor-rtl.min.css 149 B
build/styles/block-library/audio/editor.css 166 B
build/styles/block-library/audio/editor.min.css 151 B
build/styles/block-library/audio/style-rtl.css 945 B
build/styles/block-library/audio/style-rtl.min.css 132 B
build/styles/block-library/audio/style.css 945 B
build/styles/block-library/audio/style.min.css 132 B
build/styles/block-library/audio/theme-rtl.css 967 B
build/styles/block-library/audio/theme-rtl.min.css 134 B
build/styles/block-library/audio/theme.css 967 B
build/styles/block-library/audio/theme.min.css 134 B
build/styles/block-library/avatar/editor-rtl.css 127 B
build/styles/block-library/avatar/editor-rtl.min.css 115 B
build/styles/block-library/avatar/editor.css 127 B
build/styles/block-library/avatar/editor.min.css 115 B
build/styles/block-library/avatar/style-rtl.css 117 B
build/styles/block-library/avatar/style-rtl.min.css 104 B
build/styles/block-library/avatar/style.css 117 B
build/styles/block-library/avatar/style.min.css 104 B
build/styles/block-library/breadcrumbs/style-rtl.css 233 B
build/styles/block-library/breadcrumbs/style-rtl.min.css 203 B
build/styles/block-library/breadcrumbs/style.css 233 B
build/styles/block-library/breadcrumbs/style.min.css 203 B
build/styles/block-library/button/editor-rtl.css 306 B
build/styles/block-library/button/editor-rtl.min.css 265 B
build/styles/block-library/button/editor.css 317 B
build/styles/block-library/button/editor.min.css 265 B
build/styles/block-library/button/style-rtl.css 651 B
build/styles/block-library/button/style-rtl.min.css 596 B
build/styles/block-library/button/style.css 662 B
build/styles/block-library/button/style.min.css 596 B
build/styles/block-library/buttons/editor-rtl.css 391 B
build/styles/block-library/buttons/editor-rtl.min.css 291 B
build/styles/block-library/buttons/editor.css 391 B
build/styles/block-library/buttons/editor.min.css 291 B
build/styles/block-library/buttons/style-rtl.css 452 B
build/styles/block-library/buttons/style-rtl.min.css 349 B
build/styles/block-library/buttons/style.css 453 B
build/styles/block-library/buttons/style.min.css 349 B
build/styles/block-library/calendar/style-rtl.css 271 B
build/styles/block-library/calendar/style-rtl.min.css 239 B
build/styles/block-library/calendar/style.css 271 B
build/styles/block-library/calendar/style.min.css 239 B
build/styles/block-library/categories/editor-rtl.css 171 B
build/styles/block-library/categories/editor-rtl.min.css 132 B
build/styles/block-library/categories/editor.css 170 B
build/styles/block-library/categories/editor.min.css 131 B
build/styles/block-library/categories/style-rtl.css 226 B
build/styles/block-library/categories/style-rtl.min.css 169 B
build/styles/block-library/categories/style.css 235 B
build/styles/block-library/categories/style.min.css 169 B
build/styles/block-library/classic-rtl.css 402 B
build/styles/block-library/classic-rtl.min.css 358 B
build/styles/block-library/classic.css 402 B
build/styles/block-library/classic.min.css 358 B
build/styles/block-library/code/editor-rtl.css 59 B
build/styles/block-library/code/editor-rtl.min.css 53 B
build/styles/block-library/code/editor.css 59 B
build/styles/block-library/code/editor.min.css 53 B
build/styles/block-library/code/style-rtl.css 158 B
build/styles/block-library/code/style-rtl.min.css 140 B
build/styles/block-library/code/style.css 178 B
build/styles/block-library/code/style.min.css 140 B
build/styles/block-library/code/theme-rtl.css 135 B
build/styles/block-library/code/theme-rtl.min.css 122 B
build/styles/block-library/code/theme.css 135 B
build/styles/block-library/code/theme.min.css 122 B
build/styles/block-library/columns/editor-rtl.css 119 B
build/styles/block-library/columns/editor-rtl.min.css 108 B
build/styles/block-library/columns/editor.css 119 B
build/styles/block-library/columns/editor.min.css 108 B
build/styles/block-library/columns/style-rtl.css 1.3 kB
build/styles/block-library/columns/style-rtl.min.css 421 B
build/styles/block-library/columns/style.css 1.3 kB
build/styles/block-library/columns/style.min.css 421 B
build/styles/block-library/comment-author-avatar/editor-rtl.css 136 B
build/styles/block-library/comment-author-avatar/editor-rtl.min.css 124 B
build/styles/block-library/comment-author-avatar/editor.css 136 B
build/styles/block-library/comment-author-avatar/editor.min.css 124 B
build/styles/block-library/comment-author-name/style-rtl.css 79 B
build/styles/block-library/comment-author-name/style-rtl.min.css 72 B
build/styles/block-library/comment-author-name/style.css 79 B
build/styles/block-library/comment-author-name/style.min.css 72 B
build/styles/block-library/comment-content/style-rtl.css 137 B
build/styles/block-library/comment-content/style-rtl.min.css 120 B
build/styles/block-library/comment-content/style.css 137 B
build/styles/block-library/comment-content/style.min.css 120 B
build/styles/block-library/comment-date/style-rtl.css 72 B
build/styles/block-library/comment-date/style-rtl.min.css 65 B
build/styles/block-library/comment-date/style.css 72 B
build/styles/block-library/comment-date/style.min.css 65 B
build/styles/block-library/comment-edit-link/style-rtl.css 77 B
build/styles/block-library/comment-edit-link/style-rtl.min.css 70 B
build/styles/block-library/comment-edit-link/style.css 77 B
build/styles/block-library/comment-edit-link/style.min.css 70 B
build/styles/block-library/comment-reply-link/style-rtl.css 78 B
build/styles/block-library/comment-reply-link/style-rtl.min.css 71 B
build/styles/block-library/comment-reply-link/style.css 78 B
build/styles/block-library/comment-reply-link/style.min.css 71 B
build/styles/block-library/comment-template/style-rtl.css 213 B
build/styles/block-library/comment-template/style-rtl.min.css 191 B
build/styles/block-library/comment-template/style.css 213 B
build/styles/block-library/comment-template/style.min.css 191 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.css 135 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.min.css 122 B
build/styles/block-library/comments-pagination-numbers/editor.css 144 B
build/styles/block-library/comments-pagination-numbers/editor.min.css 121 B
build/styles/block-library/comments-pagination/editor-rtl.css 184 B
build/styles/block-library/comments-pagination/editor-rtl.min.css 168 B
build/styles/block-library/comments-pagination/editor.css 184 B
build/styles/block-library/comments-pagination/editor.min.css 168 B
build/styles/block-library/comments-pagination/style-rtl.css 224 B
build/styles/block-library/comments-pagination/style-rtl.min.css 201 B
build/styles/block-library/comments-pagination/style.css 236 B
build/styles/block-library/comments-pagination/style.min.css 201 B
build/styles/block-library/comments-title/editor-rtl.css 83 B
build/styles/block-library/comments-title/editor-rtl.min.css 75 B
build/styles/block-library/comments-title/editor.css 83 B
build/styles/block-library/comments-title/editor.min.css 75 B
build/styles/block-library/comments/editor-rtl.css 968 B
build/styles/block-library/comments/editor-rtl.min.css 842 B
build/styles/block-library/comments/editor.css 968 B
build/styles/block-library/comments/editor.min.css 842 B
build/styles/block-library/comments/style-rtl.css 754 B
build/styles/block-library/comments/style-rtl.min.css 637 B
build/styles/block-library/comments/style.css 752 B
build/styles/block-library/comments/style.min.css 637 B
build/styles/block-library/common-rtl.css 2.48 kB
build/styles/block-library/common-rtl.min.css 1.12 kB
build/styles/block-library/common.css 2.5 kB
build/styles/block-library/common.min.css 1.12 kB
build/styles/block-library/cover/editor-rtl.css 1.05 kB
build/styles/block-library/cover/editor-rtl.min.css 631 B
build/styles/block-library/cover/editor.css 1.05 kB
build/styles/block-library/cover/editor.min.css 631 B
build/styles/block-library/cover/style-rtl.css 2.5 kB
build/styles/block-library/cover/style-rtl.min.css 1.82 kB
build/styles/block-library/cover/style.css 2.51 kB
build/styles/block-library/cover/style.min.css 1.81 kB
build/styles/block-library/details/editor-rtl.css 72 B
build/styles/block-library/details/editor-rtl.min.css 65 B
build/styles/block-library/details/editor.css 72 B
build/styles/block-library/details/editor.min.css 65 B
build/styles/block-library/details/style-rtl.css 97 B
build/styles/block-library/details/style-rtl.min.css 86 B
build/styles/block-library/details/style.css 97 B
build/styles/block-library/details/style.min.css 86 B
build/styles/block-library/editor-elements-rtl.css 117 B
build/styles/block-library/editor-elements-rtl.min.css 75 B
build/styles/block-library/editor-elements.css 117 B
build/styles/block-library/editor-elements.min.css 75 B
build/styles/block-library/editor-rtl.css 12.5 kB
build/styles/block-library/editor-rtl.min.css 10.3 kB
build/styles/block-library/editor.css 12.5 kB
build/styles/block-library/editor.min.css 10.3 kB
build/styles/block-library/elements-rtl.css 84 B
build/styles/block-library/elements-rtl.min.css 54 B
build/styles/block-library/elements.css 84 B
build/styles/block-library/elements.min.css 54 B
build/styles/block-library/embed/editor-rtl.css 391 B
build/styles/block-library/embed/editor-rtl.min.css 331 B
build/styles/block-library/embed/editor.css 390 B
build/styles/block-library/embed/editor.min.css 331 B
build/styles/block-library/embed/style-rtl.css 1.29 kB
build/styles/block-library/embed/style-rtl.min.css 448 B
build/styles/block-library/embed/style.css 1.29 kB
build/styles/block-library/embed/style.min.css 448 B
build/styles/block-library/embed/theme-rtl.css 967 B
build/styles/block-library/embed/theme-rtl.min.css 133 B
build/styles/block-library/embed/theme.css 967 B
build/styles/block-library/embed/theme.min.css 133 B
build/styles/block-library/file/editor-rtl.css 352 B
build/styles/block-library/file/editor-rtl.min.css 324 B
build/styles/block-library/file/editor.css 353 B
build/styles/block-library/file/editor.min.css 324 B
build/styles/block-library/file/style-rtl.css 318 B
build/styles/block-library/file/style-rtl.min.css 278 B
build/styles/block-library/file/style.css 331 B
build/styles/block-library/file/style.min.css 278 B
build/styles/block-library/footnotes/style-rtl.css 220 B
build/styles/block-library/footnotes/style-rtl.min.css 198 B
build/styles/block-library/footnotes/style.css 219 B
build/styles/block-library/footnotes/style.min.css 197 B
build/styles/block-library/form-input/editor-rtl.css 286 B
build/styles/block-library/form-input/editor-rtl.min.css 265 B
build/styles/block-library/form-input/editor.css 285 B
build/styles/block-library/form-input/editor.min.css 264 B
build/styles/block-library/form-input/style-rtl.css 467 B
build/styles/block-library/form-input/style-rtl.min.css 366 B
build/styles/block-library/form-input/style.css 467 B
build/styles/block-library/form-input/style.min.css 366 B
build/styles/block-library/form-submission-notification/editor-rtl.css 368 B
build/styles/block-library/form-submission-notification/editor-rtl.min.css 344 B
build/styles/block-library/form-submission-notification/editor.css 368 B
build/styles/block-library/form-submission-notification/editor.min.css 341 B
build/styles/block-library/form-submit-button/style-rtl.css 77 B
build/styles/block-library/form-submit-button/style-rtl.min.css 69 B
build/styles/block-library/form-submit-button/style.css 77 B
build/styles/block-library/form-submit-button/style.min.css 69 B
build/styles/block-library/freeform/editor-rtl.css 1.12 kB
build/styles/block-library/freeform/editor-rtl.min.css 288 B
build/styles/block-library/freeform/editor.css 1.12 kB
build/styles/block-library/freeform/editor.min.css 288 B
build/styles/block-library/gallery/editor-rtl.css 1.52 kB
build/styles/block-library/gallery/editor-rtl.min.css 615 B
build/styles/block-library/gallery/editor.css 1.52 kB
build/styles/block-library/gallery/editor.min.css 616 B
build/styles/block-library/gallery/style-rtl.css 2.84 kB
build/styles/block-library/gallery/style-rtl.min.css 1.84 kB
build/styles/block-library/gallery/style.css 2.84 kB
build/styles/block-library/gallery/style.min.css 1.84 kB
build/styles/block-library/gallery/theme-rtl.css 941 B
build/styles/block-library/gallery/theme-rtl.min.css 108 B
build/styles/block-library/gallery/theme.css 941 B
build/styles/block-library/gallery/theme.min.css 108 B
build/styles/block-library/group/editor-rtl.css 772 B
build/styles/block-library/group/editor-rtl.min.css 335 B
build/styles/block-library/group/editor.css 772 B
build/styles/block-library/group/editor.min.css 335 B
build/styles/block-library/group/style-rtl.css 120 B
build/styles/block-library/group/style-rtl.min.css 103 B
build/styles/block-library/group/style.css 120 B
build/styles/block-library/group/style.min.css 103 B
build/styles/block-library/group/theme-rtl.css 468 B
build/styles/block-library/group/theme-rtl.min.css 79 B
build/styles/block-library/group/theme.css 468 B
build/styles/block-library/group/theme.min.css 79 B
build/styles/block-library/heading/style-rtl.css 604 B
build/styles/block-library/heading/style-rtl.min.css 205 B
build/styles/block-library/heading/style.css 604 B
build/styles/block-library/heading/style.min.css 205 B
build/styles/block-library/html/editor-rtl.css 1.29 kB
build/styles/block-library/html/editor-rtl.min.css 464 B
build/styles/block-library/html/editor.css 1.3 kB
build/styles/block-library/html/editor.min.css 464 B
build/styles/block-library/icon/editor-rtl.css 776 B
build/styles/block-library/icon/editor-rtl.min.css 377 B
build/styles/block-library/icon/editor.css 776 B
build/styles/block-library/icon/editor.min.css 377 B
build/styles/block-library/icon/style-rtl.css 218 B
build/styles/block-library/icon/style-rtl.min.css 154 B
build/styles/block-library/icon/style.css 218 B
build/styles/block-library/icon/style.min.css 154 B
build/styles/block-library/image/editor-rtl.css 1.64 kB
build/styles/block-library/image/editor-rtl.min.css 782 B
build/styles/block-library/image/editor.css 1.64 kB
build/styles/block-library/image/editor.min.css 780 B
build/styles/block-library/image/style-rtl.css 2.92 kB
build/styles/block-library/image/style-rtl.min.css 1.86 kB
build/styles/block-library/image/style.css 2.92 kB
build/styles/block-library/image/style.min.css 1.85 kB
build/styles/block-library/image/theme-rtl.css 971 B
build/styles/block-library/image/theme-rtl.min.css 137 B
build/styles/block-library/image/theme.css 971 B
build/styles/block-library/image/theme.min.css 137 B
build/styles/block-library/latest-comments/style-rtl.css 392 B
build/styles/block-library/latest-comments/style-rtl.min.css 352 B
build/styles/block-library/latest-comments/style.css 390 B
build/styles/block-library/latest-comments/style.min.css 352 B
build/styles/block-library/latest-posts/editor-rtl.css 154 B
build/styles/block-library/latest-posts/editor-rtl.min.css 139 B
build/styles/block-library/latest-posts/editor.css 153 B
build/styles/block-library/latest-posts/editor.min.css 138 B
build/styles/block-library/latest-posts/style-rtl.css 1.36 kB
build/styles/block-library/latest-posts/style-rtl.min.css 520 B
build/styles/block-library/latest-posts/style.css 1.37 kB
build/styles/block-library/latest-posts/style.min.css 520 B
build/styles/block-library/list/style-rtl.css 498 B
build/styles/block-library/list/style-rtl.min.css 107 B
build/styles/block-library/list/style.css 498 B
build/styles/block-library/list/style.min.css 107 B
build/styles/block-library/loginout/style-rtl.css 68 B
build/styles/block-library/loginout/style-rtl.min.css 61 B
build/styles/block-library/loginout/style.css 68 B
build/styles/block-library/loginout/style.min.css 61 B
build/styles/block-library/math/editor-rtl.css 491 B
build/styles/block-library/math/editor-rtl.min.css 105 B
build/styles/block-library/math/editor.css 502 B
build/styles/block-library/math/editor.min.css 105 B
build/styles/block-library/math/style-rtl.css 70 B
build/styles/block-library/math/style-rtl.min.css 61 B
build/styles/block-library/math/style.css 70 B
build/styles/block-library/math/style.min.css 61 B
build/styles/block-library/media-text/editor-rtl.css 389 B
build/styles/block-library/media-text/editor-rtl.min.css 321 B
build/styles/block-library/media-text/editor.css 389 B
build/styles/block-library/media-text/editor.min.css 320 B
build/styles/block-library/media-text/style-rtl.css 873 B
build/styles/block-library/media-text/style-rtl.min.css 552 B
build/styles/block-library/media-text/style.css 901 B
build/styles/block-library/media-text/style.min.css 550 B
build/styles/block-library/more/editor-rtl.css 796 B
build/styles/block-library/more/editor-rtl.min.css 393 B
build/styles/block-library/more/editor.css 798 B
build/styles/block-library/more/editor.min.css 393 B
build/styles/block-library/navigation-link/editor-rtl.css 1.28 kB
build/styles/block-library/navigation-link/editor-rtl.min.css 710 B
build/styles/block-library/navigation-link/editor.css 1.27 kB
build/styles/block-library/navigation-link/editor.min.css 713 B
build/styles/block-library/navigation-link/style-rtl.css 579 B
build/styles/block-library/navigation-link/style-rtl.min.css 190 B
build/styles/block-library/navigation-link/style.css 579 B
build/styles/block-library/navigation-link/style.min.css 188 B
build/styles/block-library/navigation-overlay-close/style-rtl.css 260 B
build/styles/block-library/navigation-overlay-close/style-rtl.min.css 237 B
build/styles/block-library/navigation-overlay-close/style.css 260 B
build/styles/block-library/navigation-overlay-close/style.min.css 237 B
build/styles/block-library/navigation-submenu/editor-rtl.css 1.12 kB
build/styles/block-library/navigation-submenu/editor-rtl.min.css 295 B
build/styles/block-library/navigation-submenu/editor.css 1.12 kB
build/styles/block-library/navigation-submenu/editor.min.css 294 B
build/styles/block-library/navigation/editor-rtl.css 3.28 kB
build/styles/block-library/navigation/editor-rtl.min.css 2.28 kB
build/styles/block-library/navigation/editor.css 3.29 kB
build/styles/block-library/navigation/editor.min.css 2.28 kB
build/styles/block-library/navigation/style-rtl.css 3.59 kB
build/styles/block-library/navigation/style-rtl.min.css 2.52 kB
build/styles/block-library/navigation/style.css 3.59 kB
build/styles/block-library/navigation/style.min.css 2.5 kB
build/styles/block-library/nextpage/editor-rtl.css 799 B
build/styles/block-library/nextpage/editor-rtl.min.css 392 B
build/styles/block-library/nextpage/editor.css 800 B
build/styles/block-library/nextpage/editor.min.css 392 B
build/styles/block-library/page-list/editor-rtl.css 1.18 kB
build/styles/block-library/page-list/editor-rtl.min.css 356 B
build/styles/block-library/page-list/editor.css 1.18 kB
build/styles/block-library/page-list/editor.min.css 356 B
build/styles/block-library/page-list/style-rtl.css 207 B
build/styles/block-library/page-list/style-rtl.min.css 192 B
build/styles/block-library/page-list/style.css 207 B
build/styles/block-library/page-list/style.min.css 192 B
build/styles/block-library/paragraph/editor-rtl.css 315 B
build/styles/block-library/paragraph/editor-rtl.min.css 292 B
build/styles/block-library/paragraph/editor.css 314 B
build/styles/block-library/paragraph/editor.min.css 292 B
build/styles/block-library/paragraph/style-rtl.css 746 B
build/styles/block-library/paragraph/style-rtl.min.css 341 B
build/styles/block-library/paragraph/style.css 752 B
build/styles/block-library/paragraph/style.min.css 340 B
build/styles/block-library/playlist-track/style-rtl.css 453 B
build/styles/block-library/playlist-track/style-rtl.min.css 420 B
build/styles/block-library/playlist-track/style.css 453 B
build/styles/block-library/playlist-track/style.min.css 420 B
build/styles/block-library/playlist/editor-rtl.css 120 B
build/styles/block-library/playlist/editor-rtl.min.css 112 B
build/styles/block-library/playlist/editor.css 120 B
build/styles/block-library/playlist/editor.min.css 112 B
build/styles/block-library/playlist/style-rtl.css 1.52 kB
build/styles/block-library/playlist/style-rtl.min.css 1.42 kB
build/styles/block-library/playlist/style.css 1.52 kB
build/styles/block-library/playlist/style.min.css 1.42 kB
build/styles/block-library/post-author-biography/style-rtl.css 96 B
build/styles/block-library/post-author-biography/style-rtl.min.css 86 B
build/styles/block-library/post-author-biography/style.css 96 B
build/styles/block-library/post-author-biography/style.min.css 86 B
build/styles/block-library/post-author-name/style-rtl.css 76 B
build/styles/block-library/post-author-name/style-rtl.min.css 69 B
build/styles/block-library/post-author-name/style.css 76 B
build/styles/block-library/post-author-name/style.min.css 69 B
build/styles/block-library/post-author/editor-rtl.css 490 B
build/styles/block-library/post-author/editor-rtl.min.css 104 B
build/styles/block-library/post-author/editor.css 490 B
build/styles/block-library/post-author/editor.min.css 104 B
build/styles/block-library/post-author/style-rtl.css 213 B
build/styles/block-library/post-author/style-rtl.min.css 188 B
build/styles/block-library/post-author/style.css 214 B
build/styles/block-library/post-author/style.min.css 189 B
build/styles/block-library/post-comments-count/style-rtl.css 79 B
build/styles/block-library/post-comments-count/style-rtl.min.css 72 B
build/styles/block-library/post-comments-count/style.css 79 B
build/styles/block-library/post-comments-count/style.min.css 72 B
build/styles/block-library/post-comments-form/editor-rtl.css 104 B
build/styles/block-library/post-comments-form/editor-rtl.min.css 96 B
build/styles/block-library/post-comments-form/editor.css 104 B
build/styles/block-library/post-comments-form/editor.min.css 96 B
build/styles/block-library/post-comments-form/style-rtl.css 585 B
build/styles/block-library/post-comments-form/style-rtl.min.css 525 B
build/styles/block-library/post-comments-form/style.css 584 B
build/styles/block-library/post-comments-form/style.min.css 525 B
build/styles/block-library/post-comments-link/style-rtl.css 78 B
build/styles/block-library/post-comments-link/style-rtl.min.css 71 B
build/styles/block-library/post-comments-link/style.css 78 B
build/styles/block-library/post-comments-link/style.min.css 71 B
build/styles/block-library/post-content/style-rtl.css 68 B
build/styles/block-library/post-content/style-rtl.min.css 61 B
build/styles/block-library/post-content/style.css 68 B
build/styles/block-library/post-content/style.min.css 61 B
build/styles/block-library/post-date/style-rtl.css 69 B
build/styles/block-library/post-date/style-rtl.min.css 62 B
build/styles/block-library/post-date/style.css 69 B
build/styles/block-library/post-date/style.min.css 62 B
build/styles/block-library/post-excerpt/editor-rtl.css 78 B
build/styles/block-library/post-excerpt/editor-rtl.min.css 71 B
build/styles/block-library/post-excerpt/editor.css 78 B
build/styles/block-library/post-excerpt/editor.min.css 71 B
build/styles/block-library/post-excerpt/style-rtl.css 171 B
build/styles/block-library/post-excerpt/style-rtl.min.css 155 B
build/styles/block-library/post-excerpt/style.css 171 B
build/styles/block-library/post-excerpt/style.min.css 155 B
build/styles/block-library/post-featured-image/editor-rtl.css 1.14 kB
build/styles/block-library/post-featured-image/editor-rtl.min.css 719 B
build/styles/block-library/post-featured-image/editor.css 1.14 kB
build/styles/block-library/post-featured-image/editor.min.css 717 B
build/styles/block-library/post-featured-image/style-rtl.css 392 B
build/styles/block-library/post-featured-image/style-rtl.min.css 347 B
build/styles/block-library/post-featured-image/style.css 392 B
build/styles/block-library/post-featured-image/style.min.css 347 B
build/styles/block-library/post-navigation-link/style-rtl.css 234 B
build/styles/block-library/post-navigation-link/style-rtl.min.css 215 B
build/styles/block-library/post-navigation-link/style.css 245 B
build/styles/block-library/post-navigation-link/style.min.css 214 B
build/styles/block-library/post-template/style-rtl.css 1.27 kB
build/styles/block-library/post-template/style-rtl.min.css 441 B
build/styles/block-library/post-template/style.css 1.27 kB
build/styles/block-library/post-template/style.min.css 441 B
build/styles/block-library/post-terms/style-rtl.css 108 B
build/styles/block-library/post-terms/style-rtl.min.css 96 B
build/styles/block-library/post-terms/style.css 108 B
build/styles/block-library/post-terms/style.min.css 96 B
build/styles/block-library/post-time-to-read/style-rtl.css 77 B
build/styles/block-library/post-time-to-read/style-rtl.min.css 70 B
build/styles/block-library/post-time-to-read/style.css 77 B
build/styles/block-library/post-time-to-read/style.min.css 70 B
build/styles/block-library/post-title/style-rtl.css 175 B
build/styles/block-library/post-title/style-rtl.min.css 162 B
build/styles/block-library/post-title/style.css 175 B
build/styles/block-library/post-title/style.min.css 162 B
build/styles/block-library/preformatted/style-rtl.css 511 B
build/styles/block-library/preformatted/style-rtl.min.css 125 B
build/styles/block-library/preformatted/style.css 511 B
build/styles/block-library/preformatted/style.min.css 125 B
build/styles/block-library/pullquote/editor-rtl.css 146 B
build/styles/block-library/pullquote/editor-rtl.min.css 133 B
build/styles/block-library/pullquote/editor.css 146 B
build/styles/block-library/pullquote/editor.min.css 133 B
build/styles/block-library/pullquote/style-rtl.css 765 B
build/styles/block-library/pullquote/style-rtl.min.css 365 B
build/styles/block-library/pullquote/style.css 764 B
build/styles/block-library/pullquote/style.min.css 365 B
build/styles/block-library/pullquote/theme-rtl.css 195 B
build/styles/block-library/pullquote/theme-rtl.min.css 176 B
build/styles/block-library/pullquote/theme.css 195 B
build/styles/block-library/pullquote/theme.min.css 176 B
build/styles/block-library/query-pagination-numbers/editor-rtl.css 134 B
build/styles/block-library/query-pagination-numbers/editor-rtl.min.css 121 B
build/styles/block-library/query-pagination-numbers/editor.css 144 B
build/styles/block-library/query-pagination-numbers/editor.min.css 118 B
build/styles/block-library/query-pagination/editor-rtl.css 168 B
build/styles/block-library/query-pagination/editor-rtl.min.css 154 B
build/styles/block-library/query-pagination/editor.css 168 B
build/styles/block-library/query-pagination/editor.min.css 154 B
build/styles/block-library/query-pagination/style-rtl.css 254 B
build/styles/block-library/query-pagination/style-rtl.min.css 237 B
build/styles/block-library/query-pagination/style.css 265 B
build/styles/block-library/query-pagination/style.min.css 237 B
build/styles/block-library/query-title/style-rtl.css 71 B
build/styles/block-library/query-title/style-rtl.min.css 64 B
build/styles/block-library/query-title/style.css 71 B
build/styles/block-library/query-title/style.min.css 64 B
build/styles/block-library/query-total/style-rtl.css 71 B
build/styles/block-library/query-total/style-rtl.min.css 64 B
build/styles/block-library/query-total/style.css 71 B
build/styles/block-library/query-total/style.min.css 64 B
build/styles/block-library/query/editor-rtl.css 1.28 kB
build/styles/block-library/query/editor-rtl.min.css 438 B
build/styles/block-library/query/editor.css 1.28 kB
build/styles/block-library/query/editor.min.css 438 B
build/styles/block-library/quote/style-rtl.css 255 B
build/styles/block-library/quote/style-rtl.min.css 238 B
build/styles/block-library/quote/style.css 256 B
build/styles/block-library/quote/style.min.css 238 B
build/styles/block-library/quote/theme-rtl.css 253 B
build/styles/block-library/quote/theme-rtl.min.css 233 B
build/styles/block-library/quote/theme.css 254 B
build/styles/block-library/quote/theme.min.css 236 B
build/styles/block-library/read-more/style-rtl.css 146 B
build/styles/block-library/read-more/style-rtl.min.css 131 B
build/styles/block-library/read-more/style.css 146 B
build/styles/block-library/read-more/style.min.css 131 B
build/styles/block-library/reset-rtl.css 936 B
build/styles/block-library/reset-rtl.min.css 467 B
build/styles/block-library/reset.css 936 B
build/styles/block-library/reset.min.css 467 B
build/styles/block-library/rss/editor-rtl.css 144 B
build/styles/block-library/rss/editor-rtl.min.css 126 B
build/styles/block-library/rss/editor.css 144 B
build/styles/block-library/rss/editor.min.css 126 B
build/styles/block-library/rss/style-rtl.css 1.11 kB
build/styles/block-library/rss/style-rtl.min.css 284 B
build/styles/block-library/rss/style.css 1.12 kB
build/styles/block-library/rss/style.min.css 283 B
build/styles/block-library/search/editor-rtl.css 217 B
build/styles/block-library/search/editor-rtl.min.css 199 B
build/styles/block-library/search/editor.css 217 B
build/styles/block-library/search/editor.min.css 199 B
build/styles/block-library/search/style-rtl.css 1.1 kB
build/styles/block-library/search/style-rtl.min.css 665 B
build/styles/block-library/search/style.css 1.1 kB
build/styles/block-library/search/style.min.css 666 B
build/styles/block-library/search/theme-rtl.css 130 B
build/styles/block-library/search/theme-rtl.min.css 113 B
build/styles/block-library/search/theme.css 130 B
build/styles/block-library/search/theme.min.css 113 B
build/styles/block-library/separator/editor-rtl.css 106 B
build/styles/block-library/separator/editor-rtl.min.css 100 B
build/styles/block-library/separator/editor.css 106 B
build/styles/block-library/separator/editor.min.css 100 B
build/styles/block-library/separator/style-rtl.css 284 B
build/styles/block-library/separator/style-rtl.min.css 248 B
build/styles/block-library/separator/style.css 297 B
build/styles/block-library/separator/style.min.css 248 B
build/styles/block-library/separator/theme-rtl.css 226 B
build/styles/block-library/separator/theme-rtl.min.css 195 B
build/styles/block-library/separator/theme.css 226 B
build/styles/block-library/separator/theme.min.css 195 B
build/styles/block-library/shortcode/editor-rtl.css 1.1 kB
build/styles/block-library/shortcode/editor-rtl.min.css 286 B
build/styles/block-library/shortcode/editor.css 1.1 kB
build/styles/block-library/shortcode/editor.min.css 286 B
build/styles/block-library/site-logo/editor-rtl.css 1.12 kB
build/styles/block-library/site-logo/editor-rtl.min.css 696 B
build/styles/block-library/site-logo/editor.css 1.12 kB
build/styles/block-library/site-logo/editor.min.css 692 B
build/styles/block-library/site-logo/style-rtl.css 239 B
build/styles/block-library/site-logo/style-rtl.min.css 218 B
build/styles/block-library/site-logo/style.css 238 B
build/styles/block-library/site-logo/style.min.css 218 B
build/styles/block-library/site-tagline/editor-rtl.css 94 B
build/styles/block-library/site-tagline/editor-rtl.min.css 87 B
build/styles/block-library/site-tagline/editor.css 94 B
build/styles/block-library/site-tagline/editor.min.css 87 B
build/styles/block-library/site-tagline/style-rtl.css 72 B
build/styles/block-library/site-tagline/style-rtl.min.css 65 B
build/styles/block-library/site-tagline/style.css 72 B
build/styles/block-library/site-tagline/style.min.css 65 B
build/styles/block-library/site-title/editor-rtl.css 93 B
build/styles/block-library/site-title/editor-rtl.min.css 85 B
build/styles/block-library/site-title/editor.css 93 B
build/styles/block-library/site-title/editor.min.css 85 B
build/styles/block-library/site-title/style-rtl.css 153 B
build/styles/block-library/site-title/style-rtl.min.css 143 B
build/styles/block-library/site-title/style.css 153 B
build/styles/block-library/site-title/style.min.css 143 B
build/styles/block-library/social-link/editor-rtl.css 346 B
build/styles/block-library/social-link/editor-rtl.min.css 314 B
build/styles/block-library/social-link/editor.css 348 B
build/styles/block-library/social-link/editor.min.css 314 B
build/styles/block-library/social-links/editor-rtl.css 737 B
build/styles/block-library/social-links/editor-rtl.min.css 339 B
build/styles/block-library/social-links/editor.css 738 B
build/styles/block-library/social-links/editor.min.css 338 B
build/styles/block-library/social-links/style-rtl.css 1.57 kB
build/styles/block-library/social-links/style-rtl.min.css 1.51 kB
build/styles/block-library/social-links/style.css 1.57 kB
build/styles/block-library/social-links/style.min.css 1.51 kB
build/styles/block-library/spacer/editor-rtl.css 774 B
build/styles/block-library/spacer/editor-rtl.min.css 346 B
build/styles/block-library/spacer/editor.css 774 B
build/styles/block-library/spacer/editor.min.css 346 B
build/styles/block-library/spacer/style-rtl.css 55 B
build/styles/block-library/spacer/style-rtl.min.css 48 B
build/styles/block-library/spacer/style.css 55 B
build/styles/block-library/spacer/style.min.css 48 B
build/styles/block-library/style-rtl.css 21.5 kB
build/styles/block-library/style-rtl.min.css 18 kB
build/styles/block-library/style.css 21.6 kB
build/styles/block-library/style.min.css 18 kB
build/styles/block-library/tab-list/editor-rtl.css 107 B
build/styles/block-library/tab-list/editor-rtl.min.css 97 B
build/styles/block-library/tab-list/editor.css 107 B
build/styles/block-library/tab-list/editor.min.css 97 B
build/styles/block-library/tab-panel/style-rtl.css 238 B
build/styles/block-library/tab-panel/style-rtl.min.css 215 B
build/styles/block-library/tab-panel/style.css 238 B
build/styles/block-library/tab-panel/style.min.css 215 B
build/styles/block-library/tab-panels/style-rtl.css 76 B
build/styles/block-library/tab-panels/style-rtl.min.css 65 B
build/styles/block-library/tab-panels/style.css 76 B
build/styles/block-library/tab-panels/style.min.css 65 B
build/styles/block-library/tab/editor-rtl.css 160 B
build/styles/block-library/tab/editor-rtl.min.css 148 B
build/styles/block-library/tab/editor.css 160 B
build/styles/block-library/tab/editor.min.css 148 B
build/styles/block-library/tab/style-rtl.css 397 B
build/styles/block-library/tab/style-rtl.min.css 352 B
build/styles/block-library/tab/style.css 398 B
build/styles/block-library/tab/style.min.css 356 B
build/styles/block-library/table-of-contents/style-rtl.css 89 B
build/styles/block-library/table-of-contents/style-rtl.min.css 83 B
build/styles/block-library/table-of-contents/style.css 89 B
build/styles/block-library/table-of-contents/style.min.css 83 B
build/styles/block-library/table/editor-rtl.css 1.25 kB
build/styles/block-library/table/editor-rtl.min.css 394 B
build/styles/block-library/table/editor.css 1.25 kB
build/styles/block-library/table/editor.min.css 394 B
build/styles/block-library/table/style-rtl.css 1.06 kB
build/styles/block-library/table/style-rtl.min.css 641 B
build/styles/block-library/table/style.css 1.06 kB
build/styles/block-library/table/style.min.css 640 B
build/styles/block-library/table/theme-rtl.css 985 B
build/styles/block-library/table/theme-rtl.min.css 152 B
build/styles/block-library/table/theme.css 985 B
build/styles/block-library/table/theme.min.css 152 B
build/styles/block-library/tabs/style-rtl.css 64 B
build/styles/block-library/tabs/style-rtl.min.css 57 B
build/styles/block-library/tabs/style.css 64 B
build/styles/block-library/tabs/style.min.css 57 B
build/styles/block-library/tag-cloud/style-rtl.css 283 B
build/styles/block-library/tag-cloud/style-rtl.min.css 248 B
build/styles/block-library/tag-cloud/style.css 283 B
build/styles/block-library/tag-cloud/style.min.css 248 B
build/styles/block-library/template-part/editor-rtl.css 1.2 kB
build/styles/block-library/template-part/editor-rtl.min.css 368 B
build/styles/block-library/template-part/editor.css 1.2 kB
build/styles/block-library/template-part/editor.min.css 368 B
build/styles/block-library/template-part/theme-rtl.css 492 B
build/styles/block-library/template-part/theme-rtl.min.css 113 B
build/styles/block-library/template-part/theme.css 492 B
build/styles/block-library/template-part/theme.min.css 113 B
build/styles/block-library/term-count/style-rtl.css 70 B
build/styles/block-library/term-count/style-rtl.min.css 63 B
build/styles/block-library/term-count/style.css 70 B
build/styles/block-library/term-count/style.min.css 63 B
build/styles/block-library/term-description/style-rtl.css 138 B
build/styles/block-library/term-description/style-rtl.min.css 126 B
build/styles/block-library/term-description/style.css 138 B
build/styles/block-library/term-description/style.min.css 126 B
build/styles/block-library/term-name/style-rtl.css 69 B
build/styles/block-library/term-name/style-rtl.min.css 62 B
build/styles/block-library/term-name/style.css 69 B
build/styles/block-library/term-name/style.min.css 62 B
build/styles/block-library/term-template/editor-rtl.css 267 B
build/styles/block-library/term-template/editor-rtl.min.css 225 B
build/styles/block-library/term-template/editor.css 267 B
build/styles/block-library/term-template/editor.min.css 225 B
build/styles/block-library/term-template/style-rtl.css 124 B
build/styles/block-library/term-template/style-rtl.min.css 114 B
build/styles/block-library/term-template/style.css 124 B
build/styles/block-library/term-template/style.min.css 114 B
build/styles/block-library/text-columns/editor-rtl.css 481 B
build/styles/block-library/text-columns/editor-rtl.min.css 95 B
build/styles/block-library/text-columns/editor.css 481 B
build/styles/block-library/text-columns/editor.min.css 95 B
build/styles/block-library/text-columns/style-rtl.css 177 B
build/styles/block-library/text-columns/style-rtl.min.css 165 B
build/styles/block-library/text-columns/style.css 177 B
build/styles/block-library/text-columns/style.min.css 165 B
build/styles/block-library/theme-rtl.css 1.59 kB
build/styles/block-library/theme-rtl.min.css 715 B
build/styles/block-library/theme.css 1.6 kB
build/styles/block-library/theme.min.css 719 B
build/styles/block-library/verse/style-rtl.css 155 B
build/styles/block-library/verse/style-rtl.min.css 137 B
build/styles/block-library/verse/style.css 155 B
build/styles/block-library/verse/style.min.css 137 B
build/styles/block-library/video/editor-rtl.css 839 B
build/styles/block-library/video/editor-rtl.min.css 428 B
build/styles/block-library/video/editor.css 840 B
build/styles/block-library/video/editor.min.css 428 B
build/styles/block-library/video/style-rtl.css 1.02 kB
build/styles/block-library/video/style-rtl.min.css 202 B
build/styles/block-library/video/style.css 1.02 kB
build/styles/block-library/video/style.min.css 202 B
build/styles/block-library/video/theme-rtl.css 967 B
build/styles/block-library/video/theme-rtl.min.css 134 B
build/styles/block-library/video/theme.css 967 B
build/styles/block-library/video/theme.min.css 134 B
build/styles/commands/style-rtl.css 2.07 kB
build/styles/commands/style-rtl.min.css 1.17 kB
build/styles/commands/style.css 2.06 kB
build/styles/commands/style.min.css 1.17 kB
build/styles/components/style-rtl.css 17.5 kB
build/styles/components/style-rtl.min.css 14.3 kB
build/styles/components/style.css 17.6 kB
build/styles/components/style.min.css 14.3 kB
build/styles/customize-widgets/style-rtl.css 2.35 kB
build/styles/customize-widgets/style-rtl.min.css 1.44 kB
build/styles/customize-widgets/style.css 2.35 kB
build/styles/customize-widgets/style.min.css 1.44 kB
build/styles/edit-post/classic-rtl.css 1.29 kB
build/styles/edit-post/classic-rtl.min.css 425 B
build/styles/edit-post/classic.css 1.31 kB
build/styles/edit-post/classic.min.css 428 B
build/styles/edit-post/style-rtl.css 3.51 kB
build/styles/edit-post/style-rtl.min.css 2.21 kB
build/styles/edit-post/style.css 3.52 kB
build/styles/edit-post/style.min.css 2.21 kB
build/styles/edit-site/style-rtl.css 21.1 kB
build/styles/edit-site/style-rtl.min.css 17.2 kB
build/styles/edit-site/style.css 21.1 kB
build/styles/edit-site/style.min.css 17.2 kB
build/styles/edit-widgets/style-rtl.css 4.85 kB
build/styles/edit-widgets/style-rtl.min.css 3.52 kB
build/styles/edit-widgets/style.css 4.85 kB
build/styles/edit-widgets/style.min.css 3.52 kB
build/styles/editor/style-rtl.css 29.4 kB
build/styles/editor/style-rtl.min.css 24.8 kB
build/styles/editor/style.css 29.4 kB
build/styles/editor/style.min.css 24.8 kB
build/styles/format-library/style-rtl.css 735 B
build/styles/format-library/style-rtl.min.css 326 B
build/styles/format-library/style.css 746 B
build/styles/format-library/style.min.css 326 B
build/styles/list-reusable-blocks/style-rtl.css 1.07 kB
build/styles/list-reusable-blocks/style-rtl.min.css 250 B
build/styles/list-reusable-blocks/style.css 1.07 kB
build/styles/list-reusable-blocks/style.min.css 249 B
build/styles/media-utils/style-rtl.css 2.08 kB
build/styles/media-utils/style-rtl.min.css 1.17 kB
build/styles/media-utils/style.css 2.08 kB
build/styles/media-utils/style.min.css 1.17 kB
build/styles/nux/style-rtl.css 1.48 kB
build/styles/nux/style-rtl.min.css 622 B
build/styles/nux/style.css 1.5 kB
build/styles/nux/style.min.css 618 B
build/styles/patterns/style-rtl.css 1.46 kB
build/styles/patterns/style-rtl.min.css 611 B
build/styles/patterns/style.css 1.46 kB
build/styles/patterns/style.min.css 611 B
build/styles/preferences/style-rtl.css 1.26 kB
build/styles/preferences/style-rtl.min.css 415 B
build/styles/preferences/style.css 1.26 kB
build/styles/preferences/style.min.css 415 B
build/styles/reusable-blocks/style-rtl.css 1.11 kB
build/styles/reusable-blocks/style-rtl.min.css 275 B
build/styles/reusable-blocks/style.css 1.11 kB
build/styles/reusable-blocks/style.min.css 275 B
build/styles/widgets/style-rtl.css 2.05 kB
build/styles/widgets/style-rtl.min.css 1.16 kB
build/styles/widgets/style.css 2.06 kB
build/styles/widgets/style.min.css 1.16 kB

compressed-size-action

HEIC is already routed to server-side processing by prepareItem()
since it's not in CLIENT_SIDE_SUPPORTED_MIME_TYPES.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… asset path

Disable the libvips operation cache (Cache.max(0)) to prevent
out-of-memory crashes during repeated image processing. The cache
retains results from previous operations, accumulating WASM memory
over time. Fix suggested by @kleisauke (wasm-vips maintainer).

Also fix the E2E assets path in media processing performance tests
which had one too many parent directory traversals, causing ENOENT
errors when the tests run in the CI performance test environment.

Props kleisauke.
Fixes #76706 (issue 2).
The vips instance now disables the operation cache on init,
but the test mock was missing the Cache property, causing
a TypeError in CI.
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 25, 2026

Flaky tests detected in b8aee5c.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/26067542672
📝 Reported issues:

adamsilverstein and others added 6 commits April 2, 2026 10:02
Addresses console errors during AVIF processing by suppressing wasm-vips
internal stdout/stderr output. Adds defensive guards against HEIC/HEIF
input types that crash wasm-vips. Implements worker recycling after 50
image processing operations to prevent out-of-memory crashes from WASM
memory growth. Adds performance benchmarking test for image upload
processing times across formats and batch sizes.

Fixes #76706.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
HEIC is already routed to server-side processing by prepareItem()
since it's not in CLIENT_SIDE_SUPPORTED_MIME_TYPES.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… asset path

Disable the libvips operation cache (Cache.max(0)) to prevent
out-of-memory crashes during repeated image processing. The cache
retains results from previous operations, accumulating WASM memory
over time. Fix suggested by @kleisauke (wasm-vips maintainer).

Also fix the E2E assets path in media processing performance tests
which had one too many parent directory traversals, causing ENOENT
errors when the tests run in the CI performance test environment.

Props kleisauke.
Fixes #76706 (issue 2).
The vips instance now disables the operation cache on init,
but the test mock was missing the Cache property, causing
a TypeError in CI.
When a child sideload item (e.g. thumbnail) is cancelled due to a vips
error, the parent item was never notified to re-check its Finalize gate.
This left the parent stuck forever with a spinner because processItem
returned early at the hasPendingItemsByParentId check, and nobody called
processItem(parentId) again after the children were removed.

This mirrors the existing success path in processItem which already calls
dispatch.processItem(parentId) when the last child completes normally.
When cancelItem removes an item that was actively doing ResizeCrop,
Rotate, or Upload, the concurrency slot it held becomes available. But
unlike finishOperation, cancelItem wasn't triggering pending items that
were waiting for that slot. This caused remaining thumbnail children to
sit in the queue forever, keeping the parent stuck at Finalize.
@@ -0,0 +1,260 @@
/**
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@youknowriad I took another pass at e2e tests that actually upload images to time the "pipeline" an image must go thru. These don't seem to take as long as the previous version. I could reduce iterations or variations if needed, but as is I think this is taking just a few minutes.

Comment thread packages/vips/src/index.ts
When vips handles image processing client-side, the server doesn't need
to generate sub-sizes. Explicitly sending generate_sub_sizes: false tells
the server to skip its image-type support check, which otherwise rejects
formats like AVIF that the server's GD/Imagick can't process.
When all thumbnail children fail (e.g. unsupported AVIF profile), the
parent item was completing successfully via Finalize, leaving the block
showing an uploaded image that has no sub-sizes. Now when the last child
is cancelled and no children remain, the parent is also cancelled so the
block resets to its placeholder state.
Show 'This image cannot be processed. Convert it to JPEG or PNG before
uploading.' instead of the generic 'File could not be uploaded' when all
thumbnail children fail for an unsupported image format.
Copy link
Copy Markdown
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the follow-ups here, and also thanks for the patience! I'm still working through a (very) long review backlog.

In principle I like a lot of the fixes here and in the UI this feels much nicer than getting stuck on an endless spinner:

2026-04-17.16.56.43.mp4

However, one problem I ran into with testing this is that in the above case it looks to the user as though the upload failed in a graceful and atomic way — the image block goes back to its placeholder state.

But in this case, if I go to the media library, I see that the AVIF file I attempted to upload has been uploaded, it's in the media library:

Image

How should we handle that failure state? I imagine with the client-side processing architecture it's a tricky one to deal with because we're uploading the main image first before generating sub-sizes. Whereas as a user this looks to me like "the server rejected it so nothing was uploaded".

If that proves tricky to dig into, it might be worth splitting out the performance tests change from this PR into a separate PR, if it isn't too related to the upload crashes fixes?

Comment thread packages/upload-media/src/store/actions.ts Outdated
Comment thread packages/upload-media/src/store/actions.ts Outdated
Comment thread packages/upload-media/src/store/private-actions.ts Outdated
Await vipsPromise locally so Cache.max(0) can run on the resolved
instance. Adopt trunk's media-processing spec (#76792) and drop the
PR's E2E upload benchmarks; reporter metric names now match trunk's
mediaProcessingJpeg/Avif/JpegToAvif.
…/image-upload-crash

Unify the HEIC/JPEG client conversion branch with the explicit
generate_sub_sizes:false setting so vips-processed images skip the
server image-type support check. Union the performance-reporter
metric types so both trunk's mediaProcessing* and the PR's
uploadProcessing benchmarks are present.
The IMAGE_PROCESSING_ERROR message surfaced when client-side
sub-size processing fails is shown directly to the user, so it
should be translatable. Other UploadError messages in this
package are already translated; this one was missed when the
parent-cancellation path was added.
When client-side sub-size processing fails (e.g. an unsupported AVIF
profile that vips can't decode), the parent file has already been
uploaded to the server and an attachment has been created. Previously
we cancelled the parent item — resetting the block UI — but left the
attachment behind, where it appeared in the media library as a ghost
upload that looked successful from the user's perspective.

Add a mediaDelete callback to the upload-media Settings interface,
wired through editor/use-block-editor-settings to a thin apiFetch
DELETE on /wp/v2/media/:id?force=true. cancelItem now invokes it as
best-effort cleanup when cancelling a parent that has an attachment
ID, mirroring the existing mediaFinalize wiring pattern.
@github-actions github-actions Bot added [Package] Editor /packages/editor [Package] Block editor /packages/block-editor labels Apr 28, 2026
@adamsilverstein
Copy link
Copy Markdown
Member Author

Thanks @andrewserong — addressed the open feedback in the latest pushes:

  • Orphaned attachment in media library (your main concern): added in 9339469. When client-side sub-size processing fails after the parent has already uploaded, we now call a new mediaDelete Settings callback that issues a DELETE /wp/v2/media/:id?force=true, mirroring the existing mediaFinalize wiring pattern. The cleanup is best-effort (we still cancel the parent item even if the delete itself fails), but in the typical case the ghost attachment no longer lingers in the media library.
  • Translation wrap: done in 04488db.
  • generate_sub_sizes: false enforcement: replied inline — it's actually load-bearing for the AVIF case (it triggers the server-side mime-check bypass in class-gutenberg-rest-attachments-controller.php). Without it, AVIF would be rejected by wp_prevent_unsupported_mime_type_uploads.

Performance tests: I'd still like to keep them in this PR since they exercise the same end-to-end pipeline this fix targets, but happy to split them out if it's blocking review.

The parent-cancel branch in cancelItem fires whenever the last
in-flight child sideload fails — but the cause varies. vips
processing failures (IMAGE_TRANSCODING_ERROR, IMAGE_ROTATION_ERROR)
deserve the actionable 'convert to JPEG/PNG' hint, but a transient
network failure or server-side validation rejection during sideload
should surface its real message instead of misleading the user.

Branch on error.code: keep the existing message for vips failures,
otherwise propagate the underlying error.message (with a generic
fallback). Preserve the original error code on the parent so callers
can still distinguish failure types programmatically.
The parent-cancel branch in cancelItem fires when the last in-flight
child sideload fails. Previously this branch unconditionally deleted
the parent attachment and cancelled the parent — but 'no in-flight
children remain' is not the same as 'no child succeeded': successful
children are removed from the queue immediately, so 4-of-5 successes
followed by a single failure still landed in this branch and threw
away an attachment with 4 valid sub-sizes accumulated.

Branch on parentItem.subSizes: if any sub-size was already accumulated,
nudge the parent to advance past its Finalize gate and finalize with
what we have (matching WP core's best-effort behavior when individual
sub-size generation fails). Only fall through to the delete + cancel
path when no child succeeded.

Add four cancelItem tests covering the parent-cancel branch:
vips-failure path, network-failure path with original message
propagation, partial-success preservation, and the empty-message
fallback.
Copy link
Copy Markdown
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the follow-ups! The mediaDelete addition is consistent with the other methods we've exposed, and while it does add an extra one, I think it's important for the upload-media package to be responsible for its own cleanup, so it's a preferable way to do it rather than making consumers handle it, so this seems good to me.

In testing, uploading images and groups of images to gallery blocks is working as expected, and my avif file that should error out is erroring out as expected while not leaving any stray images in the file system or media library.

Left a couple of questions, but nothing blocking. When it comes to the performance tests, I don't mind their inclusion, but given there've been a few cases recently of the tests ballooning out in their runtime and blocking PR workflows, it'd be good to make sure they're as efficient as they can be. I left a comment about whether we could reduce the number of times we're creating a post for example, but this might be a bit nitpicky.

I reckon this is in pretty good shape, and overall a good idea to get in!

Comment thread test/performance/specs/media-upload.spec.js Outdated
Comment on lines +66 to +74
// Redirect wasm-vips internal stdout/stderr to prevent console errors
// (e.g. AVIF codec warnings that are not actionable for users).
// Set globalThis.__vipsDebug to a function to capture this output during development.
print: ( text: string ) => {
( globalThis as any ).__vipsDebug?.( text );
},
printErr: ( text: string ) => {
( globalThis as any ).__vipsDebug?.( text );
},
Copy link
Copy Markdown
Contributor

@andrewserong andrewserong Apr 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed that the error message is quite general now. Is that because of this change? Not a blocker, we can always tweak error messages separately.

Edit: I left a different comment, I think this change is unrelated. Feel free to ignore this one!

Copy link
Copy Markdown
Member Author

@adamsilverstein adamsilverstein Apr 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Acknowledged and happy to ignore as you noted. The vips message wording wasn't changed in this PR; the differentiation work in cancelItem only chooses which existing message to show. Happy to revisit the wording in a follow-up if it reads as too general.

Comment thread packages/upload-media/src/store/actions.ts Outdated
Comment on lines +236 to +247
// Total failure: no child succeeded. The parent file
// already uploaded — delete the orphaned attachment
// from the server so it doesn't appear in the media
// library.
const parentAttachmentId = parentItem.attachment?.id;
const { mediaDelete } = select.getSettings();
if ( parentAttachmentId && mediaDelete ) {
mediaDelete( parentAttachmentId ).catch( () => {
// Best-effort cleanup; surface nothing to the
// user if the delete itself fails.
} );
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When could this happen?

Is this a good user experience? If the failures aren't permanent, would it be worth retrying the processing?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When this fires: parent file uploaded successfully, but every child sub-size sideload failed (vips couldn't decode any size, or every sideload network call failed). If even one sub-size succeeded we now take the partial-success branch instead and keep the parent attachment.

Is this a good UX: the user still gets an error notice; deleting the orphan keeps the media library clean. The silent .catch() on mediaDelete is best-effort — if it fails the orphan stays but the error notice has already surfaced, so we don't pile a second notice on top.

Retries: agreed retry would be the better UX, but it's intentionally out of scope here. Producer-side auto-retry with eventual-failure is being built as a follow-up in #76765; this PR's job is to stop the spinner from hanging forever when retries don't yet exist.

adamsilverstein added a commit that referenced this pull request Apr 29, 2026
These benchmarks belong with the throwaway-detection work being landed
in #76707. Keep this PR focused on E2E coverage for the client-side
media processing pipeline.
Each variant previously called createNewPost on every iteration, forcing
~39 full editor reloads across the spec. Move createNewPost outside the
iteration loop, and reset state between iterations by removing the
inserted block and clearing media. Single-image variants share a
runUploadIterations helper to avoid duplication.
@adamsilverstein adamsilverstein changed the title Fix image upload crashes and add media processing benchmarks Fix image upload crashes Apr 29, 2026
After an image upload completes, browser DOM focus stays inside the
block (e.g., on figcaption), so `editor.selectBlocks` followed by
pressing Backspace does not delete the block. The leftover block then
causes a Playwright strict mode violation on the next iteration when
two `Block: Image` figures are present.

Replace the keyboard-based cleanup with a deterministic dispatch of
`resetBlocks([])`, the same pattern used elsewhere in perf-utils.
adamsilverstein added a commit that referenced this pull request May 6, 2026
* Add test image assets for media processing E2E

Adds image files covering format, transparency, EXIF
rotation, animation, and oversized dimensions for use
in client-side media processing E2E tests. Includes a
Node.js generation script for reproducibility.

* Add test plugins for image format conversion

Plugins for E2E tests: PNG-to-JPEG conversion,
JPEG-to-WebP conversion, and progressive/interlaced
image saving via WordPress filters.

* Add E2E tests for client-side media processing

Covers upload, compression, sub-size generation, batch
uploads, server fallback, error handling, browser
capabilities, MIME format conversion, EXIF rotation,
oversized scaling, and transparency preservation.

* Add performance benchmarks for media upload

Measures single image, large image with processing, and
multiple simultaneous upload timings. Adds new metrics
to the performance reporter.

* Fix lint and TypeScript errors in E2E and performance tests

- Remove unused `page` destructuring from test functions that access page via fixture
- Fix prettier formatting for single-line locator and path.join calls
- Add JSDoc type annotations to pushBits/bitsToBytes functions and bits variable
- Add eslint-enable directive for playwright/expect-expect in media-upload perf test
- Remove unused eslint-disable-next-line for playwright/no-skipped-test in fixture method

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix remaining lint and prettier formatting errors

- Add eslint-disable no-bitwise for binary file generator script
- Remove unused channels variable in createPNG
- Fix prettier formatting in generate-test-media-assets.mjs
- Fix JSDoc alignment, getSelectedBlockImageId formatting, and locator
  string formatting in client-side-media-processing E2E spec

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix E2E test assertions for CI environment compatibility

- Increase compression size tolerance from 3x to 5x for varying server configs
- Accept both original and converted MIME types for format conversion tests
- Accept both rotated and non-rotated dimensions for EXIF orientation test
- Fix error handling test to check both snackbar and notice components

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix server upload failure test to assert on block state

The test was waiting for a snackbar/error notice that never appears
due to a double-unwrapping bug in the error callback chain between
the editor and upload-media packages. Instead, assert that the upload
queue drains and the image block remains in placeholder state.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Skip flaky server upload failure test

The test cannot reliably intercept uploads made from within
the editor iframe's fetch context during client-side media
processing. Additionally, the error callback chain has a
double-unwrapping bug that prevents errors from surfacing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Add missing responsive lightbox asset to generator

The 3200x2400 responsive lightbox JPEG was committed as a
test asset but was not included in the generator script.

* Fix prettier formatting in generate-test-media-assets.mjs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Simplify E2E tests: reduce duplication and page loads

Address reviewer feedback by consolidating redundant tests:
- Merge duplicate JPEG tests (basic + MIME type + below threshold) into one
- Merge duplicate PNG tests (basic + MIME type) into one
- Merge 3 sub-size tests into one comprehensive test
- Merge gallery and batch completion tests
- Merge 3 browser capability tests into one
- Remove duplicate transparency test from Special handling section
- Remove unused image-interlaced-progressive.php plugin
- Remove generate-test-media-assets.mjs generator script
- Remove unused .webp and .avif test assets

Reduces from ~21 active tests to 12, cutting page loads significantly.

* Add WebP and AVIF upload tests for decode coverage

Add E2E tests that upload WebP and AVIF images to exercise the
wasm-vips decode path for these formats. Previously only JPEG,
PNG, and GIF uploads were tested. Include valid static test
assets generated from real pixel data.

* E2E: Tighten client-side media processing tests to assert CSM-specific behavior

Address review feedback on #75949: assertions were permissive enough to pass
whether CSM ran or the server-side path took over. The image and gallery
block e2es already cover the non-CSM path, so this spec should focus on
behavior that is only true when the CSM pipeline runs.

- Skip every test when CSM is not the active upload path (mirrors the
  `__clientSideMediaProcessing` + feature-detection gate used by the editor).
- Drop the "fall back to server-side" test; that path is covered elsewhere
  and the assertions duplicated existing image-block e2es.
- Drop the standalone "verify browser capabilities" test; the new skip helper
  enforces those preconditions for every test.
- Replace mime-type unions (`[A, B].toContain`) with exact `toBe` assertions:
  WebP stays WebP, AVIF stays AVIF, and filtered conversions must produce
  the configured target.
- Require thumbnail/medium/large sub-sizes (and assert the scaled main file's
  exact dimensions) instead of the previous "at least one size" check.
- Require the rotated dimensions for the EXIF-rotated asset rather than
  accepting the unrotated original.
- Extract the shared insert/upload/wait/fetch flow into a helper.

* E2E: Remove media upload performance tests

These benchmarks belong with the throwaway-detection work being landed
in #76707. Keep this PR focused on E2E coverage for the client-side
media processing pipeline.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
For unsupported sources (e.g. an AVIF profile wasm-vips can't
decode), the parent's threshold-resize step throws before any
child sideloads are queued. cancelItem then runs on the parent
itself, so the parent-cancellation branch — which carried the
'web server cannot generate' wording — was bypassed and the user
saw the raw 'File could not be uploaded' instead.

Move the actionable wording to its source in resizeCropItem and
rotateItem (where the vips failure is caught). Both paths now
end up with the same user-facing message: parent failing on its
own resize, or child sideload failing and propagating to parent.

The vips-specific branch in cancelItem becomes redundant; collapse
it to just propagate the underlying error's code and message.
@adamsilverstein
Copy link
Copy Markdown
Member Author

adamsilverstein commented May 6, 2026

Good catch @andrewserong — investigated and fixed in e119959.

Root cause: prepareItem queues [ResizeCrop (threshold), Upload, ThumbnailGeneration, Finalize] on the parent because bigImageSizeThreshold is set. For an AVIF that wasm-vips can't decode, the parent's own threshold-resize step throws before any child sideloads are even created — so cancelItem runs on the parent itself, and the parent-cancellation branch (which carried the actionable "web server cannot generate" wording) was bypassed entirely. You saw the raw IMAGE_TRANSCODING_ERROR message: 'File could not be uploaded'.

Fix: Move the actionable wording to its source in resizeCropItem and rotateItem. Both failure paths — parent failing directly on threshold-resize, or child sideload failing and propagating to parent — now end up with the same user-facing message: "The web server cannot generate responsive image sizes for this image. Convert it to JPEG or PNG before uploading."

The vips-specific message-rewriting branch in cancelItem becomes redundant and is collapsed to just propagate the underlying error's code and message (−2 net lines, simpler control flow).

Move the vips operation counter and threshold from private-actions.ts
into utils/index.ts (next to terminateVipsWorker) and expose a
maybeRecycleVipsWorker(activeCount) helper. Call it from cancelItem in
addition to finishOperation so that a long burst of vips failures (e.g.
a gallery of unsupported AVIFs) can't bypass the recycle budget and
grow WASM memory unbounded.

Also drop the vipsModulePromise/vipsModule reset in terminateVipsWorker:
worker recreation is driven by getWorkerAPI() inside @wordpress/vips/worker
clearing its own workerAPI reference, not by re-importing the module
(ES module imports are cached, so re-importing returns the same instance).
The reset was a no-op and the comment claiming it was "essential" was
misleading.
talldan pushed a commit that referenced this pull request May 8, 2026
* Add test image assets for media processing E2E

Adds image files covering format, transparency, EXIF
rotation, animation, and oversized dimensions for use
in client-side media processing E2E tests. Includes a
Node.js generation script for reproducibility.

* Add test plugins for image format conversion

Plugins for E2E tests: PNG-to-JPEG conversion,
JPEG-to-WebP conversion, and progressive/interlaced
image saving via WordPress filters.

* Add E2E tests for client-side media processing

Covers upload, compression, sub-size generation, batch
uploads, server fallback, error handling, browser
capabilities, MIME format conversion, EXIF rotation,
oversized scaling, and transparency preservation.

* Add performance benchmarks for media upload

Measures single image, large image with processing, and
multiple simultaneous upload timings. Adds new metrics
to the performance reporter.

* Fix lint and TypeScript errors in E2E and performance tests

- Remove unused `page` destructuring from test functions that access page via fixture
- Fix prettier formatting for single-line locator and path.join calls
- Add JSDoc type annotations to pushBits/bitsToBytes functions and bits variable
- Add eslint-enable directive for playwright/expect-expect in media-upload perf test
- Remove unused eslint-disable-next-line for playwright/no-skipped-test in fixture method

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix remaining lint and prettier formatting errors

- Add eslint-disable no-bitwise for binary file generator script
- Remove unused channels variable in createPNG
- Fix prettier formatting in generate-test-media-assets.mjs
- Fix JSDoc alignment, getSelectedBlockImageId formatting, and locator
  string formatting in client-side-media-processing E2E spec

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix E2E test assertions for CI environment compatibility

- Increase compression size tolerance from 3x to 5x for varying server configs
- Accept both original and converted MIME types for format conversion tests
- Accept both rotated and non-rotated dimensions for EXIF orientation test
- Fix error handling test to check both snackbar and notice components

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix server upload failure test to assert on block state

The test was waiting for a snackbar/error notice that never appears
due to a double-unwrapping bug in the error callback chain between
the editor and upload-media packages. Instead, assert that the upload
queue drains and the image block remains in placeholder state.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Skip flaky server upload failure test

The test cannot reliably intercept uploads made from within
the editor iframe's fetch context during client-side media
processing. Additionally, the error callback chain has a
double-unwrapping bug that prevents errors from surfacing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Add missing responsive lightbox asset to generator

The 3200x2400 responsive lightbox JPEG was committed as a
test asset but was not included in the generator script.

* Fix prettier formatting in generate-test-media-assets.mjs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Simplify E2E tests: reduce duplication and page loads

Address reviewer feedback by consolidating redundant tests:
- Merge duplicate JPEG tests (basic + MIME type + below threshold) into one
- Merge duplicate PNG tests (basic + MIME type) into one
- Merge 3 sub-size tests into one comprehensive test
- Merge gallery and batch completion tests
- Merge 3 browser capability tests into one
- Remove duplicate transparency test from Special handling section
- Remove unused image-interlaced-progressive.php plugin
- Remove generate-test-media-assets.mjs generator script
- Remove unused .webp and .avif test assets

Reduces from ~21 active tests to 12, cutting page loads significantly.

* Add WebP and AVIF upload tests for decode coverage

Add E2E tests that upload WebP and AVIF images to exercise the
wasm-vips decode path for these formats. Previously only JPEG,
PNG, and GIF uploads were tested. Include valid static test
assets generated from real pixel data.

* E2E: Tighten client-side media processing tests to assert CSM-specific behavior

Address review feedback on #75949: assertions were permissive enough to pass
whether CSM ran or the server-side path took over. The image and gallery
block e2es already cover the non-CSM path, so this spec should focus on
behavior that is only true when the CSM pipeline runs.

- Skip every test when CSM is not the active upload path (mirrors the
  `__clientSideMediaProcessing` + feature-detection gate used by the editor).
- Drop the "fall back to server-side" test; that path is covered elsewhere
  and the assertions duplicated existing image-block e2es.
- Drop the standalone "verify browser capabilities" test; the new skip helper
  enforces those preconditions for every test.
- Replace mime-type unions (`[A, B].toContain`) with exact `toBe` assertions:
  WebP stays WebP, AVIF stays AVIF, and filtered conversions must produce
  the configured target.
- Require thumbnail/medium/large sub-sizes (and assert the scaled main file's
  exact dimensions) instead of the previous "at least one size" check.
- Require the rotated dimensions for the EXIF-rotated asset rather than
  accepting the unrotated original.
- Extract the shared insert/upload/wait/fetch flow into a helper.

* E2E: Remove media upload performance tests

These benchmarks belong with the throwaway-detection work being landed
in #76707. Keep this PR focused on E2E coverage for the client-side
media processing pipeline.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Resolve types.ts conflict by keeping both changes: trunk's widened
mediaFinalize return type (srcset fix) and the new mediaDelete setting.
@adamsilverstein adamsilverstein merged commit ec86317 into trunk May 20, 2026
40 checks passed
@adamsilverstein adamsilverstein deleted the fix/image-upload-crash branch May 20, 2026 15:49
@github-actions github-actions Bot added this to the Gutenberg 23.3 milestone May 20, 2026
adamsilverstein added a commit that referenced this pull request May 21, 2026
…ision

Reflect four client-side media PRs merged after these docs were last revised,
keeping the architecture and how-to guides in sync with current behavior:

- #76707: document the disabled libvips operation cache (Cache.max(0)) and the
  50-operation worker recycling that bound WASM linear-memory growth, plus the
  globalThis.__vipsDebug hook for capturing the suppressed vips output.
- #74903: document the sideload endpoint's image-dimension validation and its
  400 error responses (rest_upload_dimension_mismatch and friends).
- #78359: note that the finalize endpoint returns the refreshed attachment,
  which the editor uses to keep the block URL (and front-end srcset) in sync.
- #78038: clarify that sub-size filenames derive from the original basename and
  only the scaled full-size copy carries the -scaled suffix.
const path = require( 'path' );
const fs = require( 'fs/promises' );
const os = require( 'os' );
const { v4: uuid } = require( 'uuid' );
Copy link
Copy Markdown
Member

@manzoorwanijk manzoorwanijk May 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We moved away from uuid to Node's built-in crypto.randomUUID() in #77960 because it causes issues with some builds when used in CJS modules because uuid dropped support for CJS in the latest versions and it's now ESM only.

Can we please do the same here?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Feature] Client Side Media Media processing in the browser with WASM [Package] Block editor /packages/block-editor [Package] Editor /packages/editor [Status] In Progress Tracking issues with work in progress [Type] Bug An existing feature does not function as intended

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Investigate and fix crashes and console errors during client-side image upload processing

4 participants