Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix crash by moving editor style logic into a hook with useMemo #53596

Merged
merged 4 commits into from
Aug 15, 2023

Conversation

noahtallen
Copy link
Member

@noahtallen noahtallen commented Aug 11, 2023

What?

Follow-up to #52767 which optimizes the editor style calculation with useMemo to prevent possible infinite render loops.

Why?

After installing Gutenberg 16.4 on a large multisite instance (WordPress.com), we began noticing editor crashes, with React giving the "maximum update depth exceeded". After debugging and git bisect, I tracked this to #52767, and reverting that PR fixes the issue.

After some experimentation, I found that the issue is prevented when we avoid creating new styles arrays on every useSelect call.

From what I can tell, this crash happens in two scenarios:

  1. The theme does not support theme styles
  2. The theme does support theme styles, but every single styles in editorSettings.styles matches style.__unstableType && style.__unstableType !== 'theme'

In either of those cases, the array with an unstable reference is returned and the editor crashes.

@ellatrix, can you verify that this makes sense and I'm not breaking anything?

How?

I moved the styles logic to its own hook and used useMemo to maintain array references. Some of the logic was adjusted to make that easier (such as using array filter for the presetStyles array, and basing hasThemeStyles on whether every style is a preset or not).

Testing Instructions

I don't know how to reproduce this outside of our environment, but I have verified the fix there. So I think this will follow the same testing steps as #52767, which is that the e2e test passes. (Which it is!)

Testing Instructions for Keyboard

Screenshots or screencast

@noahtallen noahtallen self-assigned this Aug 11, 2023
@noahtallen noahtallen added [Type] Bug An existing feature does not function as intended [Priority] High Used to indicate top priority items that need quick attention [Type] Performance Related to performance efforts [Package] Edit Post /packages/edit-post labels Aug 11, 2023
@github-actions
Copy link

github-actions bot commented Aug 11, 2023

Size Change: +2.1 kB (0%)

Total Size: 1.51 MB

Filename Size Change
build/block-editor/index.min.js 212 kB +1.31 kB (+1%)
build/block-editor/style-rtl.css 14.9 kB +13 B (0%)
build/block-editor/style.css 14.9 kB +11 B (0%)
build/block-library/blocks/button/style-rtl.css 629 B +5 B (+1%)
build/block-library/blocks/button/style.css 628 B +5 B (+1%)
build/block-library/blocks/cover/style-rtl.css 1.63 kB +22 B (+1%)
build/block-library/blocks/cover/style.css 1.62 kB +23 B (+1%)
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB +2 B (0%)
build/block-library/blocks/image/style-rtl.css 1.42 kB -3 B (0%)
build/block-library/blocks/image/style.css 1.41 kB -9 B (-1%)
build/block-library/blocks/image/view-interactivity.min.js 1.83 kB +368 B (+25%) 🚨
build/block-library/blocks/media-text/style-rtl.css 505 B -2 B (0%)
build/block-library/blocks/media-text/style.css 503 B -2 B (0%)
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB +1 B (0%)
build/block-library/blocks/navigation/editor.css 2.26 kB +1 B (0%)
build/block-library/blocks/pullquote/theme-rtl.css 168 B +1 B (+1%)
build/block-library/blocks/pullquote/theme.css 168 B +1 B (+1%)
build/block-library/blocks/search/style-rtl.css 607 B -1 B (0%)
build/block-library/blocks/search/style.css 607 B -1 B (0%)
build/block-library/blocks/social-links/style-rtl.css 1.44 kB +1 B (0%)
build/block-library/blocks/social-links/style.css 1.43 kB +1 B (0%)
build/block-library/blocks/table/editor-rtl.css 432 B -1 B (0%)
build/block-library/blocks/table/editor.css 432 B -1 B (0%)
build/block-library/blocks/table/style-rtl.css 639 B -6 B (-1%)
build/block-library/blocks/table/style.css 639 B -5 B (-1%)
build/block-library/editor-rtl.css 12.1 kB +2 B (0%)
build/block-library/editor.css 12.1 kB +1 B (0%)
build/block-library/index.min.js 203 kB +3 B (0%)
build/block-library/style-rtl.css 13.8 kB +31 B (0%)
build/block-library/style.css 13.8 kB +24 B (0%)
build/block-library/theme-rtl.css 688 B +2 B (0%)
build/block-library/theme.css 693 B +2 B (0%)
build/commands/index.min.js 15.3 kB +4 B (0%)
build/components/index.min.js 245 kB +92 B (0%)
build/components/style-rtl.css 11.8 kB -1 B (0%)
build/components/style.css 11.8 kB -1 B (0%)
build/core-commands/index.min.js 2.58 kB +141 B (+6%) 🔍
build/edit-post/index.min.js 35.8 kB +78 B (0%)
build/edit-post/style-rtl.css 7.61 kB +18 B (0%)
build/edit-post/style.css 7.6 kB +18 B (0%)
build/edit-site/index.min.js 91.1 kB +25 B (0%)
build/edit-site/style-rtl.css 13.2 kB -17 B (0%)
build/edit-site/style.css 13.2 kB -19 B (0%)
build/edit-widgets/index.min.js 16.9 kB +8 B (0%)
build/edit-widgets/style-rtl.css 4.53 kB +1 B (0%)
build/edit-widgets/style.css 4.53 kB +1 B (0%)
build/editor/index.min.js 45.5 kB +9 B (0%)
build/editor/style-rtl.css 3.53 kB -28 B (-1%)
build/editor/style.css 3.52 kB -28 B (-1%)
build/private-apis/index.min.js 958 B +7 B (+1%)
build/reusable-blocks/index.min.js 2.7 kB -9 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.69 kB
build/api-fetch/index.min.js 2.28 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 451 B
build/block-directory/index.min.js 7.01 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.26 kB
build/block-editor/content.css 4.25 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 421 B
build/block-library/blocks/columns/style.css 421 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 98 B
build/block-library/blocks/details/style.css 98 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 280 B
build/block-library/blocks/file/style.css 281 B
build/block-library/blocks/file/view-interactivity.min.js 317 B
build/block-library/blocks/file/view.min.js 375 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 712 B
build/block-library/blocks/navigation-link/editor.css 711 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/style-rtl.css 2.23 kB
build/block-library/blocks/navigation/style.css 2.22 kB
build/block-library/blocks/navigation/view-interactivity.min.js 988 B
build/block-library/blocks/navigation/view-modal.min.js 2.85 kB
build/block-library/blocks/navigation/view.min.js 469 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 508 B
build/block-library/blocks/post-comments-form/style.css 508 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 319 B
build/block-library/blocks/post-featured-image/style.css 319 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 314 B
build/block-library/blocks/post-template/style.css 314 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 302 B
build/block-library/blocks/query-pagination/style.css 299 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 631 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 185 B
build/block-library/blocks/video/style.css 185 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51.2 kB
build/commands/style-rtl.css 863 B
build/commands/style.css 857 B
build/compose/index.min.js 12.1 kB
build/core-data/index.min.js 16.8 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.46 kB
build/customize-widgets/style.css 1.45 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.38 kB
build/date/index.min.js 17.8 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.64 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/element/index.min.js 4.82 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.59 kB
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/index.min.js 10.4 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.64 kB
build/keycodes/index.min.js 1.87 kB
build/list-reusable-blocks/index.min.js 2.2 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 1.99 kB
build/nux/style-rtl.css 735 B
build/nux/style.css 732 B
build/patterns/index.min.js 2.7 kB
build/patterns/style-rtl.css 240 B
build/patterns/style.css 240 B
build/plugins/index.min.js 1.79 kB
build/preferences-persistence/index.min.js 1.84 kB
build/preferences/index.min.js 1.24 kB
build/primitives/index.min.js 943 B
build/priority-queue/index.min.js 1.52 kB
build/react-i18n/index.min.js 615 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 11 kB
build/router/index.min.js 1.78 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 1.85 kB
build/sync/index.min.js 53.8 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.73 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 958 B
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

@noahtallen noahtallen changed the title Move editor style logic into a hook whith useMemo Fix crash by moving editor style logic into a hook with useMemo Aug 11, 2023
@Mamaduka
Copy link
Member

I was thinking that maybe we should call ‘mapSelect’ a second time in dev-mode and compare with latest value. This would help us catch bugs like this early in the development.

Happy to push draft PR next week of this.

Cc @jsnajdr, @youknowriad

@noahtallen noahtallen removed the [Type] Performance Related to performance efforts label Aug 12, 2023
@youknowriad youknowriad added the Backport to WP Minor Release Pull request that needs to be backported to a WordPress minor release label Aug 12, 2023
@jsnajdr
Copy link
Member

jsnajdr commented Aug 14, 2023

I was thinking that maybe we should call ‘mapSelect’ a second time in dev-mode and compare with latest value.

Yes, this looks like a good idea and I'm curious how many Gutenberg bugs it will catch once implemented.

React's own useSyncExternalStore does the same check, calling the user-supplied getSnapshot function twice in dev mode:

https://github.com/facebook/react/blob/1a001dac6220a64d98ae33a28e89dde78100d6c5/packages/react-reconciler/src/ReactFiberHooks.js#L1494-L1504

But useSelect memoizes the return value of mapSelect, and guarantees that the React warning is never triggered. It would be a bug in useSelect implementation otherwise.

Copy link
Member

@tyxla tyxla left a comment

Choose a reason for hiding this comment

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

The fix looks good and works well 👍

packages/edit-post/src/components/layout/index.js Outdated Show resolved Hide resolved
@tellthemachines
Copy link
Contributor

tellthemachines commented Aug 15, 2023

Hey peeps, would be good to get this merged soon so it can go into 6.3.1. There's been reports of the editor crashing with 6.3 here which may be related to the bug fixed by this PR.

@Mamaduka
Copy link
Member

The feedback should be addressed now. It would be great to get a re-review since I moved the whole logic inside the useMemo for bugfix and simplicity.

@Mamaduka Mamaduka requested review from jsnajdr and tyxla August 15, 2023 06:48
Copy link
Member

@jsnajdr jsnajdr left a comment

Choose a reason for hiding this comment

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

Yes, this looks good now. The problem with push disappeared when defaultEditorStyles became once again a local variable, this time inside the useMemo callback 👍

@Mamaduka Mamaduka merged commit a7327a1 into trunk Aug 15, 2023
51 checks passed
@Mamaduka Mamaduka deleted the try/stable-reference-for-editor-styles branch August 15, 2023 10:16
@github-actions github-actions bot added this to the Gutenberg 16.5 milestone Aug 15, 2023
tellthemachines pushed a commit that referenced this pull request Aug 16, 2023
* Move editor style logic into a hook whith useMemo

* Remove unnecessary useMemo

* Move the  whole logic inside the 'useMemo'

* Add missing useSelect dep

---------

Co-authored-by: George Mamadashvili <georgemamadashvili@gmail.com>
@tellthemachines tellthemachines removed the Backport to WP Minor Release Pull request that needs to be backported to a WordPress minor release label Aug 16, 2023
tellthemachines added a commit that referenced this pull request Aug 16, 2023
* Footnotes: Fix recursion into updating attributes when attributes is not an object (#53257)

* Fix crash by moving editor style logic into a hook with useMemo (#53596)

* Move editor style logic into a hook whith useMemo

* Remove unnecessary useMemo

* Move the  whole logic inside the 'useMemo'

* Add missing useSelect dep

---------

Co-authored-by: George Mamadashvili <georgemamadashvili@gmail.com>

* Adding an is_array check before using count in case $footnotes is not countable (#53660)

* Footnotes: fix accidental  override (#53663)

* Footnotes: fix accidental  override

* Remove double quotes

* Footnotes: autosave is not slashing JSON (#53664)

* Footnotes: autosave saves decoded JSON

* wp_slash

* Curly quote

* Slash on save and restore

* Ensure the preview dropdown popover closes (<16.3) for e2e tests

---------

Co-authored-by: Andrew Serong <14988353+andrewserong@users.noreply.github.com>
Co-authored-by: Noah Allen <noahtallen@gmail.com>
Co-authored-by: George Mamadashvili <georgemamadashvili@gmail.com>
Co-authored-by: Ramon <ramonjd@users.noreply.github.com>
Co-authored-by: Ella <4710635+ellatrix@users.noreply.github.com>
Co-authored-by: ramon <ramonjd@gmail.com>
@RealAct
Copy link

RealAct commented Aug 26, 2023

I believe the bug I'm experiencing is related to this same issue. Do you guys have an idea when a patch will be released?

TypeError: Cannot read properties of undefined (reading 'length') at a.value (https://domain.com/wp-content/plugins/seo-by-rank-math/assets/admin/js/gutenberg.js?ver=1.0.122:1:52086) at Jr (https://domain.com/wp-includes/js/dist/vendor/react-dom.min.js?ver=18.2.0:10:80813) at Zr (https://domain.com/wp-includes/js/dist/vendor/react-dom.min.js?ver=18.2.0:10:80489) at Gr (https://domain.com/wp-includes/js/dist/vendor/react-dom.min.js?ver=18.2.0:10:80023) at https://domain.com/wp-includes/js/dist/vendor/react-dom.min.js?ver=18.2.0:10:91526 at xl (https://domain.com/wp-includes/js/dist/vendor/react-dom.min.js?ver=18.2.0:10:92039) at fl (https://domain.com/wp-includes/js/dist/vendor/react-dom.min.js?ver=18.2.0:10:85808) at Nn (https://domain.com/wp-includes/js/dist/vendor/react-dom.min.js?ver=18.2.0:10:32474) at https://domain.com/wp-includes/js/dist/vendor/react-dom.min.js?ver=18.2.0:10:83226

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Edit Post /packages/edit-post [Priority] High Used to indicate top priority items that need quick attention [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants