Repository navigation
Media: Add timeout and size guardrails to client-side GIF to video conversion - #80379
Conversation
Conversion cost is roughly proportional to width x height x frame count; pathological GIFs (e.g. 2554x1676 x 800 frames) have been observed converting for half an hour. Reject over-budget GIFs up front, before any encoding work, so callers can skip the conversion gracefully via the Unsupported-prefixed message contract. Part of #80376
Race the conversion against a configurable timeout (default 30 seconds) and cancel the worker-side operation when it fires, keeping only the uploaded GIF. Both the timeout and the total-pixel budget are exposed as TranscodeGif operation args; skips are logged as SCRIPT_DEBUG diagnostics, with no user-facing error. Part of #80376
A busy vips worker is synchronously blocked inside a wasm call and cannot answer the cancellation RPC until every operation already queued in the worker finishes. Awaiting the best-effort cancels in cancelItem therefore left cancelled items stuck in the queue - and the parent attachment unfinalized - for minutes when a large animated GIF was grinding through sub-size generation. Nothing downstream depends on the cancel results, so fire them without awaiting. Also log each operation start as a SCRIPT_DEBUG diagnostic, which is how this was diagnosed. Part of #80376
|
Size Change: +537 B (+0.01%) Total Size: 7.73 MB 📦 View Changed
|
|
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 If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message. To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook. |
|
Size Change: +535 B (+0.01%) Total Size: 7.73 MB 📦 View Changed
|
andrewserong
left a comment
There was a problem hiding this comment.
Just giving this a tentative approval as I really like the guards that it adds! In practice while testing it I'm still getting the hanging issue that will be resolved by #80268. I.e. stuck in this state:
Am I right in assuming that it's expected that this PR will still be hanging because it's still taking ages to process all the source frames, so the timeout and guards in this PR won't be applying yet as we're stuck in a different part of the pipeline? My assumption is that once that other PR lands, then the guards here will work.
In the interest of time, and since the code looks good to me, I'll give this the ✅ as I'm nearing my weekend 😄
So, once #80268 lands, feel free to merge this if it fixes the issue for you. If you'd like further testing before landing, happy to give this another look next week!
thats right. This adds guards that protect against overly long GIF->Video conversion. With your test image, that only takes <10 seconds though for me - the thing that seems to hang the process is converting the GIF into all of the subsizes and re-encoding animation for each of those subsizes. Maybe on the other ticket where I am proposing enabling this conversion with a filter we should consider showing progress in the snackbar when this is enabled "Generating sub-size x of y" since it can take so long.
I'll merge 80268 first then this one. |
…sion-guardrails # Conflicts: # packages/video-conversion/CHANGELOG.md
|
There was a conflict while trying to cherry-pick the commit to the wp/7.1 branch. Please resolve the conflict manually and create a PR to the wp/7.1 branch. PRs to wp/7.1 are similar to PRs to trunk, but you should base your PR on the wp/7.1 branch instead of trunk. |
|
Flaky tests detected in db82d82. 🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/29559214925
|
|
@adamsilverstein, Can you backport this PR manually to the |
|
There was a conflict while trying to cherry-pick the commit to the wp/7.1 branch. Please resolve the conflict manually and create a PR to the wp/7.1 branch. PRs to wp/7.1 are similar to PRs to trunk, but you should base your PR on the wp/7.1 branch instead of trunk. |
…nversion (#80379) Co-authored-by: adamsilverstein <adamsilverstein@git.wordpress.org> Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
yes, will do. |
|
Removing the |
…nversion (#80379) Co-authored-by: adamsilverstein <adamsilverstein@git.wordpress.org> Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
…nversion (#80379) Co-authored-by: adamsilverstein <adamsilverstein@git.wordpress.org> Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
…nversion (#80420) * Media: Add timeout and size guardrails to client-side GIF to video conversion (#80379) Co-authored-by: adamsilverstein <adamsilverstein@git.wordpress.org> Co-authored-by: andrewserong <andrewserong@git.wordpress.org> * Merge duplicate Bug Fixes changelog headings to match trunk --------- Co-authored-by: adamsilverstein <adamsilverstein@git.wordpress.org> Co-authored-by: andrewserong <andrewserong@git.wordpress.org> Co-authored-by: t-hamano <wildworks@git.wordpress.org>
|
This PR was manually backported to |
…nversion (#80420) * Media: Add timeout and size guardrails to client-side GIF to video conversion (#80379) Co-authored-by: adamsilverstein <adamsilverstein@git.wordpress.org> Co-authored-by: andrewserong <andrewserong@git.wordpress.org> * Merge duplicate Bug Fixes changelog headings to match trunk --------- Co-authored-by: adamsilverstein <adamsilverstein@git.wordpress.org> Co-authored-by: andrewserong <andrewserong@git.wordpress.org> Co-authored-by: t-hamano <wildworks@git.wordpress.org>
This updates the pinned commit hash of the Gutenberg repository from `2872d71cde528d82675f14862a1b84e2b8abbaea` to `5a0417990a9404cc2562cdd35e3054cb0d3e546e` (version `23.7.0`). A full list of changes included in this commit can be found on GitHub: https://github.com/WordPress/gutenberg/compare/2872d71cde528d82675f14862a1b84e2b8abbaea..v23.7.0. - Release: Fix cherry-pick success detection (WordPress/gutenberg#80249) - Add Table of Contents e2e user story coverage (WordPress/gutenberg#80199) - Only include icon library SVGs listed as `public` in the Zip file published to GitHub Container Registry for `wordpress-develop` (WordPress/gutenberg#79338) - fix: set dataviews popover hover text color (WordPress/gutenberg#80105) - added missing doc (WordPress/gutenberg#80172) - DataViews: Fix the unintended gap between `list` layout items when `groupBy` is set (WordPress/gutenberg#80254) - Social Link: Fix stray closing tag in Tumblr icon markup (WordPress/gutenberg#80257) - DataViews: Fix the `list` layout ignoring some settings when `groupBy` is set (WordPress/gutenberg#80255) - Icon block: Show text and background color controls by default. (WordPress/gutenberg#80251) - DataViews: Add shift-click range selection (WordPress/gutenberg#80046) - UI: Remove unused direction factor CSS property (WordPress/gutenberg#80269) - theme: Disallow src in published package (WordPress/gutenberg#80213) - Fix: stale post edit message in modal (WordPress/gutenberg#79997) - Icons: Validate SVG icons include viewBox (WordPress/gutenberg#80273) - Remove obsolete __unstable-large size props (WordPress/gutenberg#80081) - Responsive Editing: support editing pattern styles (WordPress/gutenberg#80233) - Tab List: Add toolbar buttons to reorder tabs (WordPress/gutenberg#80107) - Move image editor styles to the block editor package (WordPress/gutenberg#80165) - Cover/Accordion: Exit on Enter (WordPress/gutenberg#77301) - Hide color controls for Navigation and Social Icons when viewport states are active (WordPress/gutenberg#80289) - Icons: Fix collection unregister not removing icons after core added its own registry (WordPress/gutenberg#80292) - Widget Dashboard: collapse inline attribute controls into a dropdown (WordPress/gutenberg#80208) - Notes: increase contrast between avatar border colors (WordPress/gutenberg#80285) - Playlist: Fix track insertion (WordPress/gutenberg#80200) - Fix: Allow icon labels to wrap with word breaks and no ellipsis (WordPress/gutenberg#80256) - Dedupe deprecated prop types in composite components (WordPress/gutenberg#80277) - Core Abilities: Restore the ready promise and lazy-load via dynamic import (WordPress/gutenberg#79155) - Notes: Replace blur-deselect bookkeeping with useFocusOutside (WordPress/gutenberg#80222) - UI: Hook Popover into the wp compat overlay slot (WordPress/gutenberg#80278) - Playlist: Update @SInCE tags to 7.1.0 (WordPress/gutenberg#80317) - Remove unused useDeprecated36pxDefaultSizeProp helper. (WordPress/gutenberg#80311) - fix playlist block Dimensions Design (WordPress/gutenberg#80312) - UI: Keep the compat overlay slot accessible inside Modal (WordPress/gutenberg#80310) - Theme: Add typography token showcase (WordPress/gutenberg#80212) - Cover: Create the initial paragraph when the block gains a background (WordPress/gutenberg#80028) - Notes: Arm the mention kses allowance on REST note creation (WordPress/gutenberg#80221) - Check for post lock modal and text, not specific title and button (WordPress/gutenberg#79979) - Worker threads: reject pending RPC calls on worker failure or termination (WordPress/gutenberg#79955) - RTC: Fix empty revision from peer autosave (WordPress/gutenberg#79911) - Client Side Media: Honor image_strip_meta and image_max_bit_depth on the client upload path (WordPress/gutenberg#80218) - Vips/upload-media: consolidate optional params into options objects (WordPress/gutenberg#80330) - Editor: allow selecting which block styles to apply globally (WordPress/gutenberg#79839) - Global Styles: Reject non-string custom CSS in the REST controller (WordPress/gutenberg#80338) - Open inspector sidebar when toggling responsive editing (WordPress/gutenberg#80307) - Fix upload hang when converting long animated GIFs: decode only the first frame for still outputs (WordPress/gutenberg#80260) - Fix: Critical error related to simple-git (WordPress/gutenberg#80102) - Hide block style variations when state is enabled in global styles (WordPress/gutenberg#80341) - Media REST API: Fix sideload and finalize for EXIF rotated images (WordPress/gutenberg#80295) - Fix upload snackbar stuck in uploading state on server-side uploads (WordPress/gutenberg#80345) - Try fixing responsive layout in Nav block (WordPress/gutenberg#80305) - tools: Remove redundant parseArgs arguments (WordPress/gutenberg#80327) - Responsive styles: Use viewport dropdown to control states for in-editor global styles sidebar (WordPress/gutenberg#80339) - Use Add track instead of only Add (WordPress/gutenberg#80336) - Interactivity API: refactor directives into self-registering modules (WordPress/gutenberg#79975) - Fix: Critical error websocket-driver fix (WordPress/gutenberg#80348) - Release: Resolve commander from the test file in the release CLI test (WordPress/gutenberg#80357) - Release: Extract npm release lifecycle (WordPress/gutenberg#80190) - Fix multiple MP3 playlist uploads (WordPress/gutenberg#80101) - Table of Contents: render front-end list from current post headings (WordPress/gutenberg#80318) - UI: improve component code readability in Storybook by using arrays for children (WordPress/gutenberg#80352) - Infra: Use devEngines in root package.json and pin npm version in CI (WordPress/gutenberg#80188) - Automated Testing: Skip type-checking in bundle size comparison build (WordPress/gutenberg#80366) - Theme: Update colorjs.io dependency and drop bug workaround (WordPress/gutenberg#80272) - RichTextControl: Replace DOM focus tracking with a single React-tree focus boundary (WordPress/gutenberg#80324) - Notes: Finish WPDS treatment for mention chips (WordPress/gutenberg#80300) - Notes: Add placeholders to the RichText fields (WordPress/gutenberg#80296) - Fix flaky test in `tabs.spec.js` (WordPress/gutenberg#80373) - Packages: Update exports to avoid deprecated folder export syntax (WordPress/gutenberg#80270) - Theme: Widen peer dependency ranges to support new versions of Vite, ESBuild, and Stylelint (WordPress/gutenberg#80267) - Components: Skip polymorphism prop typings on intersection (WordPress/gutenberg#80364) - Post Content: Use the default block appender for empty content (WordPress/gutenberg#80026) - Device preview dropdown: use active color for device icon when responsive styles are active (WordPress/gutenberg#80346) - Fix default aspect ratio for lazy loaded Featured image (WordPress/gutenberg#80386) - Docs: Add client-side media processing documentation (WordPress/gutenberg#75895) - Autocompleters: Don't pre-encode mention search terms (WordPress/gutenberg#80377) - Animated GIF uploads: generate sub-sizes from the first frame, matching core (WordPress/gutenberg#80268) - Media: Add timeout and size guardrails to client-side GIF to video conversion (WordPress/gutenberg#80379) - Widget Primitives: Ship as a script module (WordPress/gutenberg#80149) - SearchControl: Render the suffix only if there's one. (WordPress/gutenberg#80356) - Custom CSS: Fix cascade order against block style variations (WordPress/gutenberg#80340) - React 19: add e2e compat test for boolean inert attribute (WordPress/gutenberg#80397) - Fix post excerpt rendering to conditionally include space before more… (WordPress/gutenberg#70217) - Add wp-theme as a style dependency of wp-components (WordPress/gutenberg#80362) - Dashboard Widgets: declarative actions in the widget schema (WordPress/gutenberg#80363) - @wordpress/ui: Add Button Storybook example for keyboard shortcut composition (WordPress/gutenberg#80353) - SlotFill: Validate cross-document SCSS module styles (WordPress/gutenberg#80384) - Components: migrate ConfirmDialog to SCSS module (WordPress/gutenberg#80394) - SearchControl: Remove redundant conditional and prop. (WordPress/gutenberg#80406) - Tools: resolve dependencies independently of the node_modules layout (WordPress/gutenberg#80414) - Components: Migrate ToggleGroupControl to SCSS Modules (WordPress/gutenberg#80381) - Rich Text: Restore the selection when focus returns to the editable (WordPress/gutenberg#80396) - RTC: Use requestAnimationFrame for awareness cursor resize redraws (WordPress/gutenberg#79685) - Remove __shouldNotWarnDeprecated36pxSize internal prop (WordPress/gutenberg#80323) - Fix upload snackbar double-counting a single HEIC upload in Safari (WordPress/gutenberg#80371) - Fix Root `.prettierrc.js` override issue (WordPress/gutenberg#80422) - Fix Color Picker Cursor Shaking Issue (WordPress/gutenberg#80205) - Storybook: pre-bundle CJS deps (WordPress/gutenberg#80426) - ContentEditableControl: fix invalid label association with contenteditable div (WordPress/gutenberg#80344) - Writing flow: use isMultiSelecting for shift+click (WordPress/gutenberg#80286) - Added Missing Global Documentation (WordPress/gutenberg#80442) - Editor: Disable canvas resizing while zoomed out (WordPress/gutenberg#80391) - Misc fixes for WordPress-Develop 7.0 merges (WordPress/gutenberg#75985) - RTC: Preserve collaborators' unsaved edits when another user saves (WordPress/gutenberg#79936) - RTC: Disable Quick Edit while a post is being edited (WordPress/gutenberg#80016) - Storybook: build the resolve specifier as a URL-style string (WordPress/gutenberg#80416) - Style Book: Restore live global styles updates on the styles route (WordPress/gutenberg#80459) - Editor: Restore fixed device preview height for mobile and tablet (WordPress/gutenberg#80271) - Block Supports: Handle nested array block gap values properly (WordPress/gutenberg#80464) - Block Editor: Guard against non-string spacing preset values (WordPress/gutenberg#80467) - Move real-time collaboration code to lib/experimental/collaboration (WordPress/gutenberg#80469) - RTC: Fix deleted-user test on multisite (WordPress/gutenberg#80463) - Build: add independent react-18 vendor package (WordPress/gutenberg#80367) - Fix `useHomeEnd` on tabs in mac testing (WordPress/gutenberg#80374) - Block Editor: Reflect inherited Global Styles values in block inspector controls (WordPress/gutenberg#77894) - Media: Remove the redundant __heicUploadSupport flag (WordPress/gutenberg#80452) - Writing flow: fully select the ancestor when a text selection crosses a nesting boundary (WordPress/gutenberg#80462) - fix: show add block button when editing a template part inside a template (WordPress/gutenberg#78427) - Autocomplete: Reference the suggestions list with `aria-controls` and `aria-haspopup` (WordPress/gutenberg#80403) - Dashboard Widgets: Sanitize help link hrefs. (WordPress/gutenberg#80409) - State control - avoid tertiary variant on toggle to match style of other dropdown toggles (WordPress/gutenberg#80505) - Widget Dashboard: measure the header fit and document the chrome (WordPress/gutenberg#80423) - DataViews/Font Library: Give search fields a fixed width to stop layout shift (WordPress/gutenberg#80315) - Fix crashes when manipulating locked blocks (WordPress/gutenberg#80509) - RTC: Use str_contains() in WP_Sync_Config type parsing (WordPress/gutenberg#80476) - Table of Contents: Use str_contains() instead of strpos() check (WordPress/gutenberg#80418) - Build: Handle project paths containing spaces in dev script (WordPress/gutenberg#80519) - Components: migrate SearchControl to SCSS module (WordPress/gutenberg#80474) - Icons: Store the sanitized SVG content when registering an icon (WordPress/gutenberg#80508) - Resolve Prettier explicitly for isolated layout (WordPress/gutenberg#80529) - Playlist: Fix playback of tracks served without CORS headers (WordPress/gutenberg#80533) - Remove unnecessary __next40pxDefaultSize props from form controls (WordPress/gutenberg#80540) - GitHub workflows: Fix changelog checks for forked PRs (WordPress/gutenberg#80538) - Redirect editing events to extension handlers under editableRoot (WordPress/gutenberg#80287) - Writing flow: fully select the items when a selection extends down into a nested item (WordPress/gutenberg#80492) - Global Styles panels: fix wrong preset committed and shown when two color presets share a hex (WordPress/gutenberg#80497) - Replaces the `title` attributes used by revision inline diff annotations with `aria-describedby` (WordPress/gutenberg#80440) - Account for non-lowercase VIDEO tag in render_block filter (WordPress/gutenberg#80537) - Components: migrate FormTokenField to SCSS module (WordPress/gutenberg#80472) - Revisions: Specify block level diff status via aria-label (WordPress/gutenberg#77779) - Notes: Remove "Add note" from the inline styles dropdown (WordPress/gutenberg#80531) - Global Styles: Resolve per-level heading element styles in block inspector controls (WordPress/gutenberg#80495) - Notes: Render @ mentions as span chips and narrow the kses class allowance (WordPress/gutenberg#80528) - Backport from Core: improve icon name unit tests (WordPress/gutenberg#80552) - Read the contentEditable attribute in ownsSelection, not isContentEditable (WordPress/gutenberg#80549) - Device type preview: fix collapsing to content height (WordPress/gutenberg#80553) - Wrap notices in ThemeProvider with 0 corner radius (WordPress/gutenberg#79523) - Perf Tests: Fix 'Selecting blocks' metric reporting 0 ms (WordPress/gutenberg#80524) - Global Styles: Limit the inherited value treatment to the Gutenberg plugin (WordPress/gutenberg#80555) - RTC: Use array_any() for newer-compaction check in polling sync server (WordPress/gutenberg#80522) - Fix: Update webpack-dev-server to ^5.2.1 to help with dep alerts (WordPress/gutenberg#80347) - Notes: align floating threads with their inline marker (WordPress/gutenberg#79877) - WP Build: avoid infinite worker build loop (WordPress/gutenberg#80361) - Update view config API versioning (WordPress/gutenberg#80319) - Docs: Update plugin release docs for GitHub's Release label UI (WordPress/gutenberg#80567) - Release: Require a working GitHub CLI for cherry-picking (WordPress/gutenberg#80568) - Improve the various Alignment controls props handling (WordPress/gutenberg#63696) - Reduce duplicated preset utility implementations (WordPress/gutenberg#80245) - Dashboard Widgets: harden action `href` sanitization (WordPress/gutenberg#80510) - Notes: Register the inline note format at import time (WordPress/gutenberg#80576) - Fix preset round-trip test imports after preset utils consolidation (WordPress/gutenberg#80589) - ExternalLink: Use shared focus ring mixin (WordPress/gutenberg#80573) - Combobox, Select, SelectControl: Add Group and GroupLabel (WordPress/gutenberg#80574) - Query Loop: Add translation context to the 'Offset' setting label (WordPress/gutenberg#80582) - Media: Stop forcing crossorigin on IMG tags in media templates (WordPress/gutenberg#80532) - GradientPicker: select by slug so two presets sharing a gradient keep their identity (WordPress/gutenberg#80554) - Media Editor: Show a loading state while the cropped file loads (WordPress/gutenberg#80460) - Remove default paragraph from tab-panel template (WordPress/gutenberg#80565) - Global Styles: Resolve link element styles in block inspector controls for blocks that are links (WordPress/gutenberg#80607) - Math: Use ValidatedTextareaControl for LaTeX input (WordPress/gutenberg#80500) - Navigation: Fixes `aria-expanded` not updating on hover submenu inside overlay (WordPress/gutenberg#77563) - Core Data: Move EntitiesSavedState component out of editor (rebase of WordPress/gutenberg#71948) (WordPress/gutenberg#80485) - Fix: Pullquote custom line height in the editor. (WordPress/gutenberg#80586) - Block Tools: Fix empty block appender position inside blocks that capture toolbars (WordPress/gutenberg#80592) - Editor: Avoid unnecessary term re-fetches in FlatTermSelector (WordPress/gutenberg#80623) - DependencyExtractionWebpackPlugin: Include extracted styles in the asset version hash (WordPress/gutenberg#80601) - Base styles: Allow overriding focus ring color in outset-ring__focus (WordPress/gutenberg#80587) - UI: Add Autocomplete.Row primitive (WordPress/gutenberg#80490) - Site Editor: Add E2E coverage for view config extensibility (WordPress/gutenberg#80577) - View config: reject shape-mismatched merges, define empty-array semantics, strip nulls from appended members (WordPress/gutenberg#80571) - Theme: Update Storybook admin color scheme examples (WordPress/gutenberg#80569) - Detach core's note mention kses filter in the baseline strip test (WordPress/gutenberg#80656) - Media REST API: Backport sideload from url path upload size check (WordPress/gutenberg#80659) - Rich text: remove tabIndex from editable elements again to fix shift+click selection (WordPress/gutenberg#80651) - Storybook: Remove Emotion as JSX import source (WordPress/gutenberg#80647) - Gallery: make dynamic mode conversion a single undo level (WordPress/gutenberg#80665) - Docs: Update iframe guidance for Gutenberg 23.6 (WordPress/gutenberg#80629) - Background image control: Remove duplicated focus ring (WordPress/gutenberg#80671) - DataViewsPicker: Add Shift+Click range selection to the `picker-table`, `picker-grid`, and `picker-activity` layouts (WordPress/gutenberg#80413) - Docs: Require view config filter callbacks to return the container (WordPress/gutenberg#80642) - Duotone: Dedupe duotone utils into global-styles-engine (WordPress/gutenberg#80598) - Input: Hide native spin controls for `type="number"` (WordPress/gutenberg#80646) - Make `useSelectionProps` hook layout agnostic (WordPress/gutenberg#80677) - Remove redundant @jest-environment jsdom pragma and lint against it (WordPress/gutenberg#80676) - Base Styles: Remove accent color parameter from input-control (WordPress/gutenberg#80595) - wp-build: sync the page template preload field list with core-data (WordPress/gutenberg#80648) - Add progressive-discovery pattern for agent instructions and skills and general guidelines (WordPress/gutenberg#80650) - Writing flow: extend block selections with shift+arrow when there is no native selection (WordPress/gutenberg#80687) - Fix cursor position during forward delete of empty blocks (WordPress/gutenberg#77525) - Global Styles: Extract shared preset management from shadows and font sizes (WordPress/gutenberg#79810) - Notes: Capture the target block before saving a block-level note (WordPress/gutenberg#80690) - Rename unit tests, removing `spec.js` to match the convention. (WordPress/gutenberg#80711) - Used @link for url in inline documentation (WordPress/gutenberg#80716) - Block Library: Guards against error throwing attribute values (WordPress/gutenberg#80558) - Theme JSON: Level block-level preset class specificity with :where() (WordPress/gutenberg#80657) - Notes: Sync the sidebar selection to the inline marker under the caret (WordPress/gutenberg#80610) - Page List: Use null coalescing operator for parentPageID attribute (WordPress/gutenberg#80728) - Fix font library navigation page select font size to match DataViews. (WordPress/gutenberg#80617) - Meta boxes: Match heading styles with Gutenberg panels (WordPress/gutenberg#80670) - Edit Site: Replace Theme usage in canvas loader with CSS (WordPress/gutenberg#80688) - Jest: Fix ignore patterns with dots (WordPress/gutenberg#80737) - Components: Migrate Disabled to SCSS module (WordPress/gutenberg#80643) - Enhance sandbox component to accept sandbox prop (WordPress/gutenberg#69617) - Docs: Expand the back-porting to WP Core guide (WordPress/gutenberg#80593) - Add nvm use instructions to AGENTS.md (WordPress/gutenberg#80755) - Docs: Clarify agent guidance discovery (WordPress/gutenberg#80753) - Block Editor: Fix floated blocks overlapping sticky blocks (WordPress/gutenberg#80749) - Shorten playlist track toolbar button label (WordPress/gutenberg#80759) - Block supports: Return from layout support before resolving global settings (WordPress/gutenberg#80771) - Notes: Report save success consistently from note actions (WordPress/gutenberg#80748) - Dynamic Gallery: Rename toolbar button to Detach and add a modal explaining what will happen (WordPress/gutenberg#80727) - Docs: Clarify getBlock behavior with inner block controllers (WordPress/gutenberg#80773) - Update docs for server-side view config filters (WordPress/gutenberg#80744) - createInterpolateElement: handle unmatched closing tags gracefully (WordPress/gutenberg#80618) - Components: Remove private Theme component (WordPress/gutenberg#80691) - Block Editor: Refactor 'URLInput' to function component (WordPress/gutenberg#80721) - UI: add Dialog vs Drawer design guidance (WordPress/gutenberg#80783) - Packages: Update date-fns to 4.4.0 (WordPress/gutenberg#80763) - Theme: Update Color.js to 0.7.1 (WordPress/gutenberg#80762) - ESLint: Add missing not-recommended components to denylist (WordPress/gutenberg#80754) - Jest: Update to v30 (breaking) (WordPress/gutenberg#80767) - Packages: Update memize to 2.1.1 (WordPress/gutenberg#80764) - ToolsPanel: Migrate styles to an SCSS Module (WordPress/gutenberg#80445) - RTC: Prevent controlled block synchronization from intercepting undo (WordPress/gutenberg#80503) - Build Plugin ZIP: don't abort when changelog can't be generated (WordPress/gutenberg#80791) - RTC: Compact during serialization (WordPress/gutenberg#80707) - DataForm: Stop card and details validation from hijacking focus (WordPress/gutenberg#80685) - Only use Flakiness.io in canonical Gutenberg repo. (WordPress/gutenberg#80816) - Global Styles: Put the inheritance UI behind a Gutenberg experiment (WordPress/gutenberg#80815) - Add a responsiveEditingEnabled editor setting to hide the Responsive styles option (WordPress/gutenberg#80814) - iOS: remove jumping hack, add typewriter (WordPress/gutenberg#74596) - Writing flow: stop the page scrolling on caret moves within blocks taller than the viewport (WordPress/gutenberg#80708) - List Block: Preserve ordered type on indent (WordPress/gutenberg#75353) - Block Editor: Try to fix typing performance regression (WordPress/gutenberg#80507) - Notes: Cancel in-flight hover highlight when focus leaves a note thread (WordPress/gutenberg#80752) - Make editableRoot a private block setting Symbol, not a public support (WordPress/gutenberg#80820) - Editor: leave undo to the browser in fields that handle their own undo (WordPress/gutenberg#80768) - Improve pre-flight npm access checks (WordPress/gutenberg#80334) Fixes #66065. Built from https://develop.svn.wordpress.org/trunk@63533 git-svn-id: http://core.svn.wordpress.org/trunk@62709 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This updates the pinned commit hash of the Gutenberg repository from `2872d71cde528d82675f14862a1b84e2b8abbaea` to `5a0417990a9404cc2562cdd35e3054cb0d3e546e` (version `23.7.0`). A full list of changes included in this commit can be found on GitHub: https://github.com/WordPress/gutenberg/compare/2872d71cde528d82675f14862a1b84e2b8abbaea..v23.7.0. - Release: Fix cherry-pick success detection (WordPress/gutenberg#80249) - Add Table of Contents e2e user story coverage (WordPress/gutenberg#80199) - Only include icon library SVGs listed as `public` in the Zip file published to GitHub Container Registry for `wordpress-develop` (WordPress/gutenberg#79338) - fix: set dataviews popover hover text color (WordPress/gutenberg#80105) - added missing doc (WordPress/gutenberg#80172) - DataViews: Fix the unintended gap between `list` layout items when `groupBy` is set (WordPress/gutenberg#80254) - Social Link: Fix stray closing tag in Tumblr icon markup (WordPress/gutenberg#80257) - DataViews: Fix the `list` layout ignoring some settings when `groupBy` is set (WordPress/gutenberg#80255) - Icon block: Show text and background color controls by default. (WordPress/gutenberg#80251) - DataViews: Add shift-click range selection (WordPress/gutenberg#80046) - UI: Remove unused direction factor CSS property (WordPress/gutenberg#80269) - theme: Disallow src in published package (WordPress/gutenberg#80213) - Fix: stale post edit message in modal (WordPress/gutenberg#79997) - Icons: Validate SVG icons include viewBox (WordPress/gutenberg#80273) - Remove obsolete __unstable-large size props (WordPress/gutenberg#80081) - Responsive Editing: support editing pattern styles (WordPress/gutenberg#80233) - Tab List: Add toolbar buttons to reorder tabs (WordPress/gutenberg#80107) - Move image editor styles to the block editor package (WordPress/gutenberg#80165) - Cover/Accordion: Exit on Enter (WordPress/gutenberg#77301) - Hide color controls for Navigation and Social Icons when viewport states are active (WordPress/gutenberg#80289) - Icons: Fix collection unregister not removing icons after core added its own registry (WordPress/gutenberg#80292) - Widget Dashboard: collapse inline attribute controls into a dropdown (WordPress/gutenberg#80208) - Notes: increase contrast between avatar border colors (WordPress/gutenberg#80285) - Playlist: Fix track insertion (WordPress/gutenberg#80200) - Fix: Allow icon labels to wrap with word breaks and no ellipsis (WordPress/gutenberg#80256) - Dedupe deprecated prop types in composite components (WordPress/gutenberg#80277) - Core Abilities: Restore the ready promise and lazy-load via dynamic import (WordPress/gutenberg#79155) - Notes: Replace blur-deselect bookkeeping with useFocusOutside (WordPress/gutenberg#80222) - UI: Hook Popover into the wp compat overlay slot (WordPress/gutenberg#80278) - Playlist: Update @SInCE tags to 7.1.0 (WordPress/gutenberg#80317) - Remove unused useDeprecated36pxDefaultSizeProp helper. (WordPress/gutenberg#80311) - fix playlist block Dimensions Design (WordPress/gutenberg#80312) - UI: Keep the compat overlay slot accessible inside Modal (WordPress/gutenberg#80310) - Theme: Add typography token showcase (WordPress/gutenberg#80212) - Cover: Create the initial paragraph when the block gains a background (WordPress/gutenberg#80028) - Notes: Arm the mention kses allowance on REST note creation (WordPress/gutenberg#80221) - Check for post lock modal and text, not specific title and button (WordPress/gutenberg#79979) - Worker threads: reject pending RPC calls on worker failure or termination (WordPress/gutenberg#79955) - RTC: Fix empty revision from peer autosave (WordPress/gutenberg#79911) - Client Side Media: Honor image_strip_meta and image_max_bit_depth on the client upload path (WordPress/gutenberg#80218) - Vips/upload-media: consolidate optional params into options objects (WordPress/gutenberg#80330) - Editor: allow selecting which block styles to apply globally (WordPress/gutenberg#79839) - Global Styles: Reject non-string custom CSS in the REST controller (WordPress/gutenberg#80338) - Open inspector sidebar when toggling responsive editing (WordPress/gutenberg#80307) - Fix upload hang when converting long animated GIFs: decode only the first frame for still outputs (WordPress/gutenberg#80260) - Fix: Critical error related to simple-git (WordPress/gutenberg#80102) - Hide block style variations when state is enabled in global styles (WordPress/gutenberg#80341) - Media REST API: Fix sideload and finalize for EXIF rotated images (WordPress/gutenberg#80295) - Fix upload snackbar stuck in uploading state on server-side uploads (WordPress/gutenberg#80345) - Try fixing responsive layout in Nav block (WordPress/gutenberg#80305) - tools: Remove redundant parseArgs arguments (WordPress/gutenberg#80327) - Responsive styles: Use viewport dropdown to control states for in-editor global styles sidebar (WordPress/gutenberg#80339) - Use Add track instead of only Add (WordPress/gutenberg#80336) - Interactivity API: refactor directives into self-registering modules (WordPress/gutenberg#79975) - Fix: Critical error websocket-driver fix (WordPress/gutenberg#80348) - Release: Resolve commander from the test file in the release CLI test (WordPress/gutenberg#80357) - Release: Extract npm release lifecycle (WordPress/gutenberg#80190) - Fix multiple MP3 playlist uploads (WordPress/gutenberg#80101) - Table of Contents: render front-end list from current post headings (WordPress/gutenberg#80318) - UI: improve component code readability in Storybook by using arrays for children (WordPress/gutenberg#80352) - Infra: Use devEngines in root package.json and pin npm version in CI (WordPress/gutenberg#80188) - Automated Testing: Skip type-checking in bundle size comparison build (WordPress/gutenberg#80366) - Theme: Update colorjs.io dependency and drop bug workaround (WordPress/gutenberg#80272) - RichTextControl: Replace DOM focus tracking with a single React-tree focus boundary (WordPress/gutenberg#80324) - Notes: Finish WPDS treatment for mention chips (WordPress/gutenberg#80300) - Notes: Add placeholders to the RichText fields (WordPress/gutenberg#80296) - Fix flaky test in `tabs.spec.js` (WordPress/gutenberg#80373) - Packages: Update exports to avoid deprecated folder export syntax (WordPress/gutenberg#80270) - Theme: Widen peer dependency ranges to support new versions of Vite, ESBuild, and Stylelint (WordPress/gutenberg#80267) - Components: Skip polymorphism prop typings on intersection (WordPress/gutenberg#80364) - Post Content: Use the default block appender for empty content (WordPress/gutenberg#80026) - Device preview dropdown: use active color for device icon when responsive styles are active (WordPress/gutenberg#80346) - Fix default aspect ratio for lazy loaded Featured image (WordPress/gutenberg#80386) - Docs: Add client-side media processing documentation (WordPress/gutenberg#75895) - Autocompleters: Don't pre-encode mention search terms (WordPress/gutenberg#80377) - Animated GIF uploads: generate sub-sizes from the first frame, matching core (WordPress/gutenberg#80268) - Media: Add timeout and size guardrails to client-side GIF to video conversion (WordPress/gutenberg#80379) - Widget Primitives: Ship as a script module (WordPress/gutenberg#80149) - SearchControl: Render the suffix only if there's one. (WordPress/gutenberg#80356) - Custom CSS: Fix cascade order against block style variations (WordPress/gutenberg#80340) - React 19: add e2e compat test for boolean inert attribute (WordPress/gutenberg#80397) - Fix post excerpt rendering to conditionally include space before more… (WordPress/gutenberg#70217) - Add wp-theme as a style dependency of wp-components (WordPress/gutenberg#80362) - Dashboard Widgets: declarative actions in the widget schema (WordPress/gutenberg#80363) - @wordpress/ui: Add Button Storybook example for keyboard shortcut composition (WordPress/gutenberg#80353) - SlotFill: Validate cross-document SCSS module styles (WordPress/gutenberg#80384) - Components: migrate ConfirmDialog to SCSS module (WordPress/gutenberg#80394) - SearchControl: Remove redundant conditional and prop. (WordPress/gutenberg#80406) - Tools: resolve dependencies independently of the node_modules layout (WordPress/gutenberg#80414) - Components: Migrate ToggleGroupControl to SCSS Modules (WordPress/gutenberg#80381) - Rich Text: Restore the selection when focus returns to the editable (WordPress/gutenberg#80396) - RTC: Use requestAnimationFrame for awareness cursor resize redraws (WordPress/gutenberg#79685) - Remove __shouldNotWarnDeprecated36pxSize internal prop (WordPress/gutenberg#80323) - Fix upload snackbar double-counting a single HEIC upload in Safari (WordPress/gutenberg#80371) - Fix Root `.prettierrc.js` override issue (WordPress/gutenberg#80422) - Fix Color Picker Cursor Shaking Issue (WordPress/gutenberg#80205) - Storybook: pre-bundle CJS deps (WordPress/gutenberg#80426) - ContentEditableControl: fix invalid label association with contenteditable div (WordPress/gutenberg#80344) - Writing flow: use isMultiSelecting for shift+click (WordPress/gutenberg#80286) - Added Missing Global Documentation (WordPress/gutenberg#80442) - Editor: Disable canvas resizing while zoomed out (WordPress/gutenberg#80391) - Misc fixes for WordPress-Develop 7.0 merges (WordPress/gutenberg#75985) - RTC: Preserve collaborators' unsaved edits when another user saves (WordPress/gutenberg#79936) - RTC: Disable Quick Edit while a post is being edited (WordPress/gutenberg#80016) - Storybook: build the resolve specifier as a URL-style string (WordPress/gutenberg#80416) - Style Book: Restore live global styles updates on the styles route (WordPress/gutenberg#80459) - Editor: Restore fixed device preview height for mobile and tablet (WordPress/gutenberg#80271) - Block Supports: Handle nested array block gap values properly (WordPress/gutenberg#80464) - Block Editor: Guard against non-string spacing preset values (WordPress/gutenberg#80467) - Move real-time collaboration code to lib/experimental/collaboration (WordPress/gutenberg#80469) - RTC: Fix deleted-user test on multisite (WordPress/gutenberg#80463) - Build: add independent react-18 vendor package (WordPress/gutenberg#80367) - Fix `useHomeEnd` on tabs in mac testing (WordPress/gutenberg#80374) - Block Editor: Reflect inherited Global Styles values in block inspector controls (WordPress/gutenberg#77894) - Media: Remove the redundant __heicUploadSupport flag (WordPress/gutenberg#80452) - Writing flow: fully select the ancestor when a text selection crosses a nesting boundary (WordPress/gutenberg#80462) - fix: show add block button when editing a template part inside a template (WordPress/gutenberg#78427) - Autocomplete: Reference the suggestions list with `aria-controls` and `aria-haspopup` (WordPress/gutenberg#80403) - Dashboard Widgets: Sanitize help link hrefs. (WordPress/gutenberg#80409) - State control - avoid tertiary variant on toggle to match style of other dropdown toggles (WordPress/gutenberg#80505) - Widget Dashboard: measure the header fit and document the chrome (WordPress/gutenberg#80423) - DataViews/Font Library: Give search fields a fixed width to stop layout shift (WordPress/gutenberg#80315) - Fix crashes when manipulating locked blocks (WordPress/gutenberg#80509) - RTC: Use str_contains() in WP_Sync_Config type parsing (WordPress/gutenberg#80476) - Table of Contents: Use str_contains() instead of strpos() check (WordPress/gutenberg#80418) - Build: Handle project paths containing spaces in dev script (WordPress/gutenberg#80519) - Components: migrate SearchControl to SCSS module (WordPress/gutenberg#80474) - Icons: Store the sanitized SVG content when registering an icon (WordPress/gutenberg#80508) - Resolve Prettier explicitly for isolated layout (WordPress/gutenberg#80529) - Playlist: Fix playback of tracks served without CORS headers (WordPress/gutenberg#80533) - Remove unnecessary __next40pxDefaultSize props from form controls (WordPress/gutenberg#80540) - GitHub workflows: Fix changelog checks for forked PRs (WordPress/gutenberg#80538) - Redirect editing events to extension handlers under editableRoot (WordPress/gutenberg#80287) - Writing flow: fully select the items when a selection extends down into a nested item (WordPress/gutenberg#80492) - Global Styles panels: fix wrong preset committed and shown when two color presets share a hex (WordPress/gutenberg#80497) - Replaces the `title` attributes used by revision inline diff annotations with `aria-describedby` (WordPress/gutenberg#80440) - Account for non-lowercase VIDEO tag in render_block filter (WordPress/gutenberg#80537) - Components: migrate FormTokenField to SCSS module (WordPress/gutenberg#80472) - Revisions: Specify block level diff status via aria-label (WordPress/gutenberg#77779) - Notes: Remove "Add note" from the inline styles dropdown (WordPress/gutenberg#80531) - Global Styles: Resolve per-level heading element styles in block inspector controls (WordPress/gutenberg#80495) - Notes: Render @ mentions as span chips and narrow the kses class allowance (WordPress/gutenberg#80528) - Backport from Core: improve icon name unit tests (WordPress/gutenberg#80552) - Read the contentEditable attribute in ownsSelection, not isContentEditable (WordPress/gutenberg#80549) - Device type preview: fix collapsing to content height (WordPress/gutenberg#80553) - Wrap notices in ThemeProvider with 0 corner radius (WordPress/gutenberg#79523) - Perf Tests: Fix 'Selecting blocks' metric reporting 0 ms (WordPress/gutenberg#80524) - Global Styles: Limit the inherited value treatment to the Gutenberg plugin (WordPress/gutenberg#80555) - RTC: Use array_any() for newer-compaction check in polling sync server (WordPress/gutenberg#80522) - Fix: Update webpack-dev-server to ^5.2.1 to help with dep alerts (WordPress/gutenberg#80347) - Notes: align floating threads with their inline marker (WordPress/gutenberg#79877) - WP Build: avoid infinite worker build loop (WordPress/gutenberg#80361) - Update view config API versioning (WordPress/gutenberg#80319) - Docs: Update plugin release docs for GitHub's Release label UI (WordPress/gutenberg#80567) - Release: Require a working GitHub CLI for cherry-picking (WordPress/gutenberg#80568) - Improve the various Alignment controls props handling (WordPress/gutenberg#63696) - Reduce duplicated preset utility implementations (WordPress/gutenberg#80245) - Dashboard Widgets: harden action `href` sanitization (WordPress/gutenberg#80510) - Notes: Register the inline note format at import time (WordPress/gutenberg#80576) - Fix preset round-trip test imports after preset utils consolidation (WordPress/gutenberg#80589) - ExternalLink: Use shared focus ring mixin (WordPress/gutenberg#80573) - Combobox, Select, SelectControl: Add Group and GroupLabel (WordPress/gutenberg#80574) - Query Loop: Add translation context to the 'Offset' setting label (WordPress/gutenberg#80582) - Media: Stop forcing crossorigin on IMG tags in media templates (WordPress/gutenberg#80532) - GradientPicker: select by slug so two presets sharing a gradient keep their identity (WordPress/gutenberg#80554) - Media Editor: Show a loading state while the cropped file loads (WordPress/gutenberg#80460) - Remove default paragraph from tab-panel template (WordPress/gutenberg#80565) - Global Styles: Resolve link element styles in block inspector controls for blocks that are links (WordPress/gutenberg#80607) - Math: Use ValidatedTextareaControl for LaTeX input (WordPress/gutenberg#80500) - Navigation: Fixes `aria-expanded` not updating on hover submenu inside overlay (WordPress/gutenberg#77563) - Core Data: Move EntitiesSavedState component out of editor (rebase of WordPress/gutenberg#71948) (WordPress/gutenberg#80485) - Fix: Pullquote custom line height in the editor. (WordPress/gutenberg#80586) - Block Tools: Fix empty block appender position inside blocks that capture toolbars (WordPress/gutenberg#80592) - Editor: Avoid unnecessary term re-fetches in FlatTermSelector (WordPress/gutenberg#80623) - DependencyExtractionWebpackPlugin: Include extracted styles in the asset version hash (WordPress/gutenberg#80601) - Base styles: Allow overriding focus ring color in outset-ring__focus (WordPress/gutenberg#80587) - UI: Add Autocomplete.Row primitive (WordPress/gutenberg#80490) - Site Editor: Add E2E coverage for view config extensibility (WordPress/gutenberg#80577) - View config: reject shape-mismatched merges, define empty-array semantics, strip nulls from appended members (WordPress/gutenberg#80571) - Theme: Update Storybook admin color scheme examples (WordPress/gutenberg#80569) - Detach core's note mention kses filter in the baseline strip test (WordPress/gutenberg#80656) - Media REST API: Backport sideload from url path upload size check (WordPress/gutenberg#80659) - Rich text: remove tabIndex from editable elements again to fix shift+click selection (WordPress/gutenberg#80651) - Storybook: Remove Emotion as JSX import source (WordPress/gutenberg#80647) - Gallery: make dynamic mode conversion a single undo level (WordPress/gutenberg#80665) - Docs: Update iframe guidance for Gutenberg 23.6 (WordPress/gutenberg#80629) - Background image control: Remove duplicated focus ring (WordPress/gutenberg#80671) - DataViewsPicker: Add Shift+Click range selection to the `picker-table`, `picker-grid`, and `picker-activity` layouts (WordPress/gutenberg#80413) - Docs: Require view config filter callbacks to return the container (WordPress/gutenberg#80642) - Duotone: Dedupe duotone utils into global-styles-engine (WordPress/gutenberg#80598) - Input: Hide native spin controls for `type="number"` (WordPress/gutenberg#80646) - Make `useSelectionProps` hook layout agnostic (WordPress/gutenberg#80677) - Remove redundant @jest-environment jsdom pragma and lint against it (WordPress/gutenberg#80676) - Base Styles: Remove accent color parameter from input-control (WordPress/gutenberg#80595) - wp-build: sync the page template preload field list with core-data (WordPress/gutenberg#80648) - Add progressive-discovery pattern for agent instructions and skills and general guidelines (WordPress/gutenberg#80650) - Writing flow: extend block selections with shift+arrow when there is no native selection (WordPress/gutenberg#80687) - Fix cursor position during forward delete of empty blocks (WordPress/gutenberg#77525) - Global Styles: Extract shared preset management from shadows and font sizes (WordPress/gutenberg#79810) - Notes: Capture the target block before saving a block-level note (WordPress/gutenberg#80690) - Rename unit tests, removing `spec.js` to match the convention. (WordPress/gutenberg#80711) - Used @link for url in inline documentation (WordPress/gutenberg#80716) - Block Library: Guards against error throwing attribute values (WordPress/gutenberg#80558) - Theme JSON: Level block-level preset class specificity with :where() (WordPress/gutenberg#80657) - Notes: Sync the sidebar selection to the inline marker under the caret (WordPress/gutenberg#80610) - Page List: Use null coalescing operator for parentPageID attribute (WordPress/gutenberg#80728) - Fix font library navigation page select font size to match DataViews. (WordPress/gutenberg#80617) - Meta boxes: Match heading styles with Gutenberg panels (WordPress/gutenberg#80670) - Edit Site: Replace Theme usage in canvas loader with CSS (WordPress/gutenberg#80688) - Jest: Fix ignore patterns with dots (WordPress/gutenberg#80737) - Components: Migrate Disabled to SCSS module (WordPress/gutenberg#80643) - Enhance sandbox component to accept sandbox prop (WordPress/gutenberg#69617) - Docs: Expand the back-porting to WP Core guide (WordPress/gutenberg#80593) - Add nvm use instructions to AGENTS.md (WordPress/gutenberg#80755) - Docs: Clarify agent guidance discovery (WordPress/gutenberg#80753) - Block Editor: Fix floated blocks overlapping sticky blocks (WordPress/gutenberg#80749) - Shorten playlist track toolbar button label (WordPress/gutenberg#80759) - Block supports: Return from layout support before resolving global settings (WordPress/gutenberg#80771) - Notes: Report save success consistently from note actions (WordPress/gutenberg#80748) - Dynamic Gallery: Rename toolbar button to Detach and add a modal explaining what will happen (WordPress/gutenberg#80727) - Docs: Clarify getBlock behavior with inner block controllers (WordPress/gutenberg#80773) - Update docs for server-side view config filters (WordPress/gutenberg#80744) - createInterpolateElement: handle unmatched closing tags gracefully (WordPress/gutenberg#80618) - Components: Remove private Theme component (WordPress/gutenberg#80691) - Block Editor: Refactor 'URLInput' to function component (WordPress/gutenberg#80721) - UI: add Dialog vs Drawer design guidance (WordPress/gutenberg#80783) - Packages: Update date-fns to 4.4.0 (WordPress/gutenberg#80763) - Theme: Update Color.js to 0.7.1 (WordPress/gutenberg#80762) - ESLint: Add missing not-recommended components to denylist (WordPress/gutenberg#80754) - Jest: Update to v30 (breaking) (WordPress/gutenberg#80767) - Packages: Update memize to 2.1.1 (WordPress/gutenberg#80764) - ToolsPanel: Migrate styles to an SCSS Module (WordPress/gutenberg#80445) - RTC: Prevent controlled block synchronization from intercepting undo (WordPress/gutenberg#80503) - Build Plugin ZIP: don't abort when changelog can't be generated (WordPress/gutenberg#80791) - RTC: Compact during serialization (WordPress/gutenberg#80707) - DataForm: Stop card and details validation from hijacking focus (WordPress/gutenberg#80685) - Only use Flakiness.io in canonical Gutenberg repo. (WordPress/gutenberg#80816) - Global Styles: Put the inheritance UI behind a Gutenberg experiment (WordPress/gutenberg#80815) - Add a responsiveEditingEnabled editor setting to hide the Responsive styles option (WordPress/gutenberg#80814) - iOS: remove jumping hack, add typewriter (WordPress/gutenberg#74596) - Writing flow: stop the page scrolling on caret moves within blocks taller than the viewport (WordPress/gutenberg#80708) - List Block: Preserve ordered type on indent (WordPress/gutenberg#75353) - Block Editor: Try to fix typing performance regression (WordPress/gutenberg#80507) - Notes: Cancel in-flight hover highlight when focus leaves a note thread (WordPress/gutenberg#80752) - Make editableRoot a private block setting Symbol, not a public support (WordPress/gutenberg#80820) - Editor: leave undo to the browser in fields that handle their own undo (WordPress/gutenberg#80768) - Improve pre-flight npm access checks (WordPress/gutenberg#80334) Fixes #66065. git-svn-id: https://develop.svn.wordpress.org/trunk@63533 602fd350-edb4-49c9-b593-d223f7449a82
What?
Fixes #80376.
Adds two guardrails to client-side GIF → video conversion so pathological GIFs degrade gracefully instead of churning the CPU, plus a queue fix discovered while verifying them against a real-world problem GIF:
convertGifToVideoin@wordpress/video-conversionnow rejects GIFs whose total decoded pixels (width × height × frame count) exceed a budget (default 300 megapixels, exported asDEFAULT_MAX_TOTAL_PIXELS) before any encoding work. The rejection reuses theUnsupportedmessage-prefix contract, so callers take the existing graceful-skip path: the GIF uploads normally, no companion video, no user-facing error.@wordpress/upload-mediaraces the conversion against a timeout. On expiry the worker-side operation is cancelled and only the uploaded GIF is kept.cancelItemno longer awaits worker cancellations. A busy vips worker is synchronously blocked inside a wasm call and cannot answer a cancellation RPC until everything already queued in the worker finishes. Awaiting the best-effort cancels left cancelled items stuck in the queue — and the parent attachment unfinalized — for minutes. They are now fire-and-forget.Both knobs are configurable via the
TranscodeGifoperation args (timeout,maxTotalPixels;0disables). Skips are logged asSCRIPT_DEBUGdiagnostics (via the existingdebug()helper), andprocessItemnow logs each operation start underSCRIPT_DEBUGfor easier pipeline debugging.Why?
During testing on #80260, uploads of large screen-recording GIFs appeared to hang (report, test files): one conversion ran for 30 minutes on a MacBook Air. The companion video is a progressive enhancement — when it is expensive, the right move is to skip or abandon it silently.
Debugging findings (the
2026-07-10 14.44.24.giftest image)That GIF is 2554×1676 with 800 frames (3.42 gigapixels total, 20 MB file). Measurements with wasm-vips and a store tracer in the editor:
[n=-1], gifsave)Two distinct problems compound into the observed "stuck uploading" state:
medium_large/large/1536x1536/2048x2048chain takes tens of minutes, and in one run the tab crashed outright. The conversion itself (the thing this PR bounds) took only ~10 s by comparison. Client-side media: generate animated image sub-sizes from the first frame only, matching core #80268 fixes that side by generating animated sub-sizes from the first frame only, matching core; with both PRs this GIF uploads in seconds.PROCESSING—cancelItemwas awaiting a cancellation RPC that the busy vips worker could not answer. That is fix 3 above, proven by a unit test where the worker never responds.How?
packages/video-conversion: budget check right afterdecoder.tracks.ready, using a cheap first-frame decode to learn dimensions (track metadata does not expose them). NewSIZE_LIMIT_ERROR_PREFIXandDEFAULT_MAX_TOTAL_PIXELSexports.packages/upload-media:Promise.racetimeout around the worker call inconvertGifToVideo, cancelling the worker-side operation on expiry; newisSizeLimitConversionError/isConversionTimeoutErrorhelpers mirroring the existing message-prefix contract; graceful skip +SCRIPT_DEBUGdiagnostics intranscodeGifItem; fire-and-forget worker cancels incancelItem.Testing Instructions
animated_videometadata / the GIF variation transform on the block).2026-07-10 14.44.24.gif(2554×1676 × 800 frames). WithSCRIPT_DEBUGenabled the console logs[upload-media] Skipping GIF to video conversion: Unsupported: GIF exceeds maximum conversion size (2554x1676 x 800 frames = 3424403200 pixels; limit is 300000000)almost immediately, and the queue item is cancelled right away instead of lingering. The GIF itself uploads fine.npm run test:unit -- packages/video-conversion packages/upload-mediaNotes