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

Iframe enqueuing: add editorStyle and warning #50091

Merged
merged 5 commits into from
May 31, 2023

Conversation

ellatrix
Copy link
Member

@ellatrix ellatrix commented Apr 26, 2023

What?

Previously: #49655.
Fixes: #37947.

I previously thought editorStyle handles didn't need to be added to the iframe because I mistakenly thought these would contain styles for editor UI. It turns out this API is almost exclusively used for editor-only styles targeting blocks, so they must be added to the iframe.

Note: they are currently enqueuing, but incorrectly through the compat layer.

This PR also logs a warning when styles are added through that compat layer. Now that enqueue_block_assets can be used, there should always be a way to add styles correctly.

Why?

How?

Testing Instructions

The easiest way, I think, is to cherry-pick the change to packages/block-editor/src/components/iframe/index.js into trunk and load an iframed editor. You'll see warnings logged for incorrectly added styles. Now checkout the whole PR and these warnings should be gone.

Testing Instructions for Keyboard

Screenshots or screencast

@ellatrix ellatrix added [Type] Bug An existing feature does not function as intended [Package] Block editor /packages/block-editor labels Apr 26, 2023
@ellatrix ellatrix requested a review from oandregal April 26, 2023 09:02
@ellatrix ellatrix requested a review from spacedmonkey as a code owner April 26, 2023 09:02
@github-actions
Copy link

github-actions bot commented Apr 26, 2023

Size Change: +82 B (0%)

Total Size: 1.39 MB

Filename Size Change
build/block-editor/index.min.js 194 kB +82 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.05 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.23 kB
build/block-editor/content.css 4.23 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/style-rtl.css 14.9 kB
build/block-editor/style.css 14.9 kB
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 91 B
build/block-library/blocks/avatar/style.css 91 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/button/style-rtl.css 624 B
build/block-library/blocks/button/style.css 623 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 409 B
build/block-library/blocks/columns/style.css 409 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/cover/style-rtl.css 1.61 kB
build/block-library/blocks/cover/style.css 1.6 kB
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 159 B
build/block-library/blocks/details/style.css 159 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/interactivity.min.js 395 B
build/block-library/blocks/file/style-rtl.css 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/file/view.min.js 375 B
build/block-library/blocks/freeform/editor-rtl.css 2.58 kB
build/block-library/blocks/freeform/editor.css 2.58 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/interactivity.min.js 783 B
build/block-library/blocks/image/style-rtl.css 1.07 kB
build/block-library/blocks/image/style.css 1.07 kB
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/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 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/editor-rtl.css 2.33 kB
build/block-library/blocks/navigation/editor.css 2.33 kB
build/block-library/blocks/navigation/interactivity.min.js 976 B
build/block-library/blocks/navigation/style-rtl.css 2.21 kB
build/block-library/blocks/navigation/style.css 2.2 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 438 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 281 B
build/block-library/blocks/post-template/style.css 281 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 103 B
build/block-library/blocks/preformatted/style.css 103 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/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 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 288 B
build/block-library/blocks/query-pagination/style.css 284 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/style-rtl.css 434 B
build/block-library/blocks/search/style.css 432 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 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/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
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/editor-rtl.css 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 645 B
build/block-library/blocks/table/style.css 644 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/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 174 B
build/block-library/blocks/video/style.css 174 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/editor-rtl.css 12.1 kB
build/block-library/editor.css 12.1 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 200 kB
build/block-library/interactivity/runtime.min.js 2.69 kB
build/block-library/interactivity/vendors.min.js 8.2 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 13.1 kB
build/block-library/style.css 13.1 kB
build/block-library/theme-rtl.css 686 B
build/block-library/theme.css 691 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 50.3 kB
build/commands/index.min.js 14.9 kB
build/commands/style-rtl.css 827 B
build/commands/style.css 827 B
build/components/index.min.js 231 kB
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.8 kB
build/compose/index.min.js 12.1 kB
build/core-commands/index.min.js 1.74 kB
build/core-data/index.min.js 15.7 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.38 kB
build/customize-widgets/style.css 1.38 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.24 kB
build/date/index.min.js 40.4 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.63 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 33.9 kB
build/edit-post/style-rtl.css 7.57 kB
build/edit-post/style.css 7.56 kB
build/edit-site/index.min.js 65.8 kB
build/edit-site/style-rtl.css 10.9 kB
build/edit-site/style.css 10.9 kB
build/edit-widgets/index.min.js 16.8 kB
build/edit-widgets/style-rtl.css 4.53 kB
build/edit-widgets/style.css 4.53 kB
build/editor/index.min.js 44.6 kB
build/editor/style-rtl.css 3.54 kB
build/editor/style.css 3.53 kB
build/element/index.min.js 4.8 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.57 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/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.71 kB
build/keycodes/index.min.js 1.84 kB
build/list-reusable-blocks/index.min.js 2.13 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/plugins/index.min.js 1.84 kB
build/preferences-persistence/index.min.js 1.84 kB
build/preferences/index.min.js 1.24 kB
build/primitives/index.min.js 941 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 939 B
build/react-i18n/index.min.js 696 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.21 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 10.7 kB
build/router/index.min.js 1.77 kB
build/server-side-render/index.min.js 2.02 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 1.42 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.57 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 1.04 kB
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

@github-actions
Copy link

github-actions bot commented Apr 26, 2023

Flaky tests detected in 0522400b4c672ddd0f872df53c7c9b94c7e00e03.
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/4807099223
📝 Reported issues:

@Mamaduka
Copy link
Member

Closes: #37947.

@ellatrix ellatrix force-pushed the fix/iframe-enqueuing-and-warn branch from 0522400 to 083f79f Compare April 26, 2023 12:24

if ( current_theme_supports( 'wp-block-styles' ) ) {
wp_enqueue_style( 'wp-block-library-theme' );
}
Copy link
Member Author

Choose a reason for hiding this comment

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

I discovered that both wp-edit-site and wp-block-library-theme were also not correctly enqueued (compat warning).

Copy link
Member

Choose a reason for hiding this comment

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

@ellatrix I see wp-block-library-theme is already a dependency of wp-edit-blocks in both core and gutenberg. Why would we need to enqueue it explicitely?

Copy link
Member

Choose a reason for hiding this comment

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

Actually. I don't see wp-block-library-theme enqueued anywhere (post or site editor).

Copy link
Member

Choose a reason for hiding this comment

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

Upon the init action, gutenberg_reregister_core_block_types is called, which then calls gutenberg_register_core_block_assets, which dequeues wp-block-library-theme under some scenarios. A note for later to investigate. I need to look to another thing first.

Copy link
Member Author

Choose a reason for hiding this comment

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

I don't see it listed there as a dependency:

$wp_edit_blocks_dependencies = array(
'wp-components',
// This need to be added before the block library styles,
// The block library styles override the "reset" styles.
'wp-reset-editor-styles',
'wp-block-library',
'wp-reusable-blocks',
// Until #37466, we can't specifically add them as editor styles yet,
// so we must hard-code it here as a dependency.
'wp-block-editor-content',
);

Copy link
Member

Choose a reason for hiding this comment

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

It's a bit below, as a conditional depending upon wp-block-styles support: gutenberg, core.

Copy link
Member

@oandregal oandregal May 31, 2023

Choose a reason for hiding this comment

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

I tested a bit how wp-block-library-theme works and this is what I see:

  1. If the theme doesn't declare theme support for wp-block-styles it is not loaded. Can be tested using TwentyTwentyThree.
  2. If the theme declares support for wp-block-styles but doesn't load editor styles via add_editor_styles is loaded as a dependency of wp-edit-blocks. I tested this by using TwentyTwentyTwo and removing support for editor styles.
  3. If the theme declares support for wp-block-styles and loads editor styles via add_editor_styles it is loaded, just not as a dependency of wp-edit-blocks. Can be tested using TwentyTwentyTwo.

As core currently stands, this PR works as expected. The iframe cannot depend on wp-block-styles being enqueued as a dependency because of scenario 3 and checking for wp-block-styles support is fine. The wp-block-library-theme stylesheet loads for the scenarios 2 and 3 but not for 1. We can move forward with this PR.


A question I have that is separate from this PR is: why is there a need for separate scenarios 2 and 3? Isn't it the same as loading wp-block-library-theme stylesheet when the theme declares support for wp-block-styles? Pinging @aristath @gziolo and @ntsekouras as people that I see in the git blames for that area, in case they have thoughts.

Copy link
Member Author

Choose a reason for hiding this comment

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

Thanks for investigating, let's continue this conversation in a separate issue or PR. :)

@@ -197,6 +197,10 @@ Like scripts, you can enqueue your block's styles using the `block.json` file.

Use the `editorStyle` property to a CSS file you want to load in the editor view, and use the `style` property for a CSS file you want to load on the frontend when the block is used.

It is worth noting that, if the editor content is iframed, both of these will
Copy link
Member

Choose a reason for hiding this comment

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

Do we have any other documentation that could get linked where folks can learn about the iframed editor concept?

Aside, the included code example doesn't do a great job explaining the purpose of defining editorStyle. Maybe, we could test whether we can use a selector like .wp-block-gutenberg-examples-example-02-stylesheets.is-selected to show that it's directly related to the editing UI.

@ellatrix ellatrix requested review from ntwb and nerrad as code owners April 26, 2023 16:42
@kevin940726
Copy link
Member

It seems like it's causing some tests to be flaky with the following ouput:

    expect(jest.fn()).not.toHaveWarned(expected)

    Expected mock function not to be called but it was called with:
    ["wp-block-library-theme-css was added to the iframe incorrectly. Please use block.json or enqueue_block_assets to add styles to the iframe. JSHandle@node"],["wp-block-library-theme-css was added to the iframe incorrectly. Please use block.json or enqueue_block_assets to add styles to the iframe. JSHandle@node"]

I don't know why this is only happening on some attempts but not all though. Will be nice to resolve this before merging 🙂 .

@gziolo
Copy link
Member

gziolo commented Apr 27, 2023

#50122 - I have a fix ready for the @wordpress/warning that isn't working correctly.

@ellatrix
Copy link
Member Author

ellatrix commented May 9, 2023

Note to self: check if this fixes #50246. It does not.

@ellatrix ellatrix force-pushed the fix/iframe-enqueuing-and-warn branch from 1ffec94 to 6fc6bc4 Compare May 11, 2023 07:38
@ellatrix ellatrix requested a review from ndiego as a code owner May 11, 2023 07:38
@ellatrix ellatrix force-pushed the fix/iframe-enqueuing-and-warn branch from 6fc6bc4 to 85704f4 Compare May 11, 2023 09:02
@oandregal
Copy link
Member

So, one of the goals of this PR is that editorStyles are always present in the iframe, and not only when they have .wp-block classes (compat layer). I've tested this by creating a plugin that has front & editor styles with no .wp-block-* classes. This is working as expected.

Once the test plugin was activated and the block added to the editor, I tested that:

  • trunk only has the front-end styles in the iframed editor (create-block-blockjson-styles-no-block-class-style-css stylesheet).
  • this branch has front-end & editor styles in the iframed editor (create-block-blockjson-styles-no-block-class-style-css and create-block-blockjson-styles-no-block-class-editor-style-css stylesheets, respectively)

I'll look into the other code changes and compare what's the stylesheet footprint (before/after).

wp_enqueue_script( 'wp-polyfill' );
// Enqueue the `editorStyle` handles for all core block, and dependencies.
wp_enqueue_style( 'wp-edit-blocks' );
Copy link
Member

Choose a reason for hiding this comment

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

Documenting what I see.

wp-edit-blocks corresponds with the editor styles of the core blocks (core, gutenberg). wp-block-editor-content and wp-block-library are dependencies of it, so no need to enqueue them explicity, hence we remove them.

By marking wp-reset-editor-styles as "done", they won't be enqueue despite also being a dependency.

@oandregal
Copy link
Member

@ellatrix I've noticed that we are running the same logic twice for setting __unstableResolvedAssets #51100 Would you mind reviewing that one (and merge it first) so we know that _gutenberg_get_iframed_editor_assets is the only place that resolves the styles?

@oandregal
Copy link
Member

For the warning, I tested by using this plugin which adds styles with and without .wp-block class using both enqueue_block_assets and enqueue_block_editor_assets. Installing and activating the plugin results in a warning being thrown for the stylesheet enqueue_block_editor_assets_style_wp_block, which is added via the enqueue_block_editor_assets hook and contains the .wp-block class. So, works as expected.

@oandregal
Copy link
Member

This is the stylesheet footprint for this PR compared to trunk. TLDR: everything seems fine.

Trunk Branch Status
dashicons-css dashicons-css =
wp-components-css wp-components-css =
wp-block-library-css sooner than trunk
wp-block-editor-content-css later than trunk
wp-reusable-blocks-css new in branch (wp-edit-blocks dependency)
wp-block-library-css sooner than trunk
wp-block-editor-content-css later than trunk
wp-edit-blocks-css sooner than trunk
block.json style (with and without .wp-block class) block.json style (with and without .wp-block class) =
enqueue_block_assets (with and without .wp-block class) enqueue_block_assets (with and without .wp-block class) =
wp-fonts-local later than trunk
wp-edit-blocks-css sooner than trunk (now loaded in the server instead of using the compat layer )
block.json editorStyle (with .wp-block class) block.json editorStyle (with .wp-block class) It's now loaded in the server instead of using the compat layer.
block.json editorStyle (without .wp-block class) new in branch: what we missed in trunk. Loaded in the server.
wp-fonts-local later than trunk
enqueue_block_editor_assets (with .wp-block class) enqueue_block_editor_assets (with .wp-block class) =

@ellatrix ellatrix force-pushed the fix/iframe-enqueuing-and-warn branch from 2233c4b to 3eeddb6 Compare May 31, 2023 18:53
@ellatrix ellatrix enabled auto-merge (squash) May 31, 2023 19:13
@ellatrix ellatrix merged commit dde096e into trunk May 31, 2023
@ellatrix ellatrix deleted the fix/iframe-enqueuing-and-warn branch May 31, 2023 21:18
@github-actions github-actions bot added this to the Gutenberg 16.0 milestone May 31, 2023
@ellatrix
Copy link
Member Author

ellatrix commented Jun 1, 2023

Thanks for the review, @oandregal!

@ska-dev-1
Copy link

I'm getting these warnings.

was added to the iframe incorrectly. Please use block.json or enqueue_block_assets to add styles to the iframe. <style>​…​

Also for core styles:

image

Also for my theme style.css (enqueued via add_editor_style('style.css')).


@ellatrix

Now that enqueue_block_assets can be used, there should always be a way to add styles correctly.

What about dynamic styles?

My requirements are:

  1. Add <style> tag with dynamic content for every block that needs it. Currently using BlockList.__unstableElementContext context to add the tag using createPortal() (this method is used in core so it seems to be the way to go about it). This places them to the end of .editor-styles-wrapper (with latest Gutenberg, when going from non-iframe to iframe mode (by previewing in tablet for example), it duplicates the styles to head as well and prints the warning added in this PR).
  2. Add <style> to <head>. For example I query the current template, if that template contains a Container block I limit the .editor-styles-wrapper to appropriate width. If the template is changed, the style needs to change dynamically too. Furthermore the width of the container can be edited in settings, in fact, anything about it can be changed, padding, border, any CSS property, so it can't really be done with static css/variables and body classes.
  3. Add <style> tag in the <head> before other styles, it's a reset, it has variables, it has filters, it's dynamic.

1 is very volatile and there can be hundreds of them, so running them through EditorStyles API, causing EditorStyles to re-render and re-transform everything when 1 block has a minor change, it would be very taxing.

Good solution for me would be to add slots to <EditorStyles />.
A slot before and a slot after.

return (
<>
{ /* Use an empty style element to have a document reference,
but this could be any element. */ }
<style ref={ useDarkThemeBodyClassName( stylesArray ) } />
{ transformedStyles.map( ( css, index ) => (
<style key={ index }>{ css }</style>
) ) }
<SVG
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 0 0"
width="0"
height="0"
role="none"
style={ {
visibility: 'hidden',
position: 'absolute',
left: '-9999px',
overflow: 'hidden',
} }
dangerouslySetInnerHTML={ { __html: transformedSvgs } }
/>
</>
);

Or the slots could be even more generic, for the start and end of the <head> tag, because one might want to add anything (dynamic) to the head, and currently it's a hassle with editors changing from non-iframe to iframe, and multiple contexts like the block preview/example popovers.

BlockList.__unstableElementContext could also be replaced with a slot, so in the block Edit component, along with InspectorControls and BlockControls you could use something like (Dynamic/Raw)BlockStyles, instead of useContext and createPortal:

const element = useContext( BlockList.__unstableElementContext );
return (
<>
{ styles &&
element &&
createPortal(
<style
dangerouslySetInnerHTML={ {
__html: styles,
} }
/>,
element
) }
<BlockListBlock
{ ...props }
className={
props.attributes.style?.elements
? classnames(
props.className,
blockElementsContainerIdentifier
)
: props.className
}
/>
</>
);
},

@ellatrix
Copy link
Member Author

Yes, that's a good point. How are you doing these things in a non iframed editor?

@ska-dev-1
Copy link

Whether the editor is iframed or not, I have a HOC for every block (inefficient but I can't think of other ways) using the editor.BlockEdit filter. The HOC uses useContext(BlockList.__unstableElementContext) to capture the ref to the BlockList node and keep every unique one in a global store.

Then I have registered a @wordpress/plugins plugin, that renders something like:

return <>
    <PluginSidebarMoreMenuItem ... />
    <PluginSidebar ... />
    <MyRenderStyles ... /> // this component renders everywhere
</>

And in MyRenderStyles component I use the nodes from the global store, filter out ones that are not isConnected, find the heads with .ownerDocument.querySelector('head') and use that to portal styles where I need them. So it works for every unique instance, such as the main editor, iframed responsive previews, popover previews, etc.

Would be much more simple if in MyRenderStyles I could use slot fills:

return <>
    <Fill name='blockEditor.head.start'>
        <style id="my-reset">
            {`.editor-styles-wrapper { margin: 0; background: ${defaultBackground}; }`}
        </style>
    </Fill>
    {currentTemplateHasContainer && (
        <Fill name='blockEditor.head.end'>
            <style id="my-styles">
                {`.editor-styles-wrapper { max-width: ${containerWidth}px; margin: 0 auto; }`}
            </style>
        </Fill>
    )}
</>

@ellatrix
Copy link
Member Author

You add a HoC to every block? And your styles are just some dynamic "global" styles, right? A slot indeed seems to be the best solution. What styles are you resetting? Why do you need to reset styles?

@ska-dev-1
Copy link

What styles are you resetting?

I have a theme/plugin combo that uses Tailwind, so I use Tailwind preflight CSS reset. Plugin options allow to modify Tailwind config which regenerates the preflight (via a web worker similar to play.tailwindcss.com). There are also configurable Tailwind plugins used that can extend what the preflight contains (forms for example).

For example the prelight includes:

h1,
h2,
h3,
h4,
h5,
h6 {
	font-size: inherit;
	font-weight: inherit;
}

blockquote,
dl,
dd,
h1,
h2,
h3,
h4,
h5,
h6,
hr,
figure,
p,
pre {
	margin: 0;
}

But in my theme style.css I style headings:

h1, h2, h3, h4, h5, h6 {
	margin-top: 2rem;
	margin-bottom: 1rem;
}

and in theme.json I might have:

"styles": {
	"elements": {
		"h1": {
			"typography": {
				"fontSize": "3rem",
				"lineHeight": "1"
			}
		},

so it's paramount that the reset comes first.

I do run that CSS through @wordpress/block-editor transformStyles() of course.

Along with the preflight I also have dynamic CSS variables there. Not entirely sure if they need to be early in the head, but I think so. What if you want to override one in theme style.css, but the original vars are loaded after it?

This is why I think it's important to not only have the ability to add dynamic CSS to head, but also have some control about where it's placed.


Why do you need to reset styles?

I have it on the front end, having it in the back end helps iron out any inconsistencies. If it had to be static I could probably make it work but it being dynamic really simplifies things for me.

While there is wp-includes/css/dist/block-library/reset.css which resets most of the things, such as the styles that wp-admin/css/common.css adds, the preflight also adds things like

border-width: 0;
border-style: solid;
border-color: theme('borderColor.DEFAULT', currentColor);

which is needed for borders to work correctly with Tailwind classes.


But talking about dynamic, the example in my previous post:

{currentTemplateHasContainer && (
	<Fill name='blockEditor.head.end'>
		<style id="my-styles">
			{`.editor-styles-wrapper { max-width: ${containerWidth}px; margin: 0 auto; }`}
		</style>
	</Fill>
)}

is oversimplified, if I'm only setting max-width why don't I just use a CSS variable? In reality I'm applying the CSS generated from Tailwind class names px-4 sm:px-6 md:px-8 mx-auto w-full max-w-wp-content which is editable in the plugin options and by the nature of it being dynamic I can provide a live preview of the results.

For blog posts I apply mx-auto w-full prose prose-base sm:[main>&]:prose-lg prose-a:text-link which is a whole heap of CSS. And if I want to style something, the core/code block for example, I can add prose-pre:shadow-2xl (or [&_.wp-block-code]:shadow-2xl) and observe the change instantly which is very neat.


I do hope I've made a good enough case for the dynamic styles/slots/more control. Thanks for reading!

@ellatrix
Copy link
Member Author

@ska-dev-1 Thinking more about this, you should be using the block editor settings to add styles dynamically. This already has the flexibility of appending or prepending styles. Unfortunately, it's broken right now, but my PR #52767 should fix it. Could you have look and give you feedback?

@ska-dev-1
Copy link

Styles look promising, how about fonts?

Currently I also render dynamic fonts the same way I do styles so I can add/remove/swap fonts with live preview

const url = `//fonts.googleapis.com/css2?family=${font.replaceAll(' ', '+')}${variantsQueryString}&display=swap`
return <link id={`ska-font-${id}`} href={url} rel='stylesheet' />

There seems to be a method for svgs:

{
assets: svgs,
__unstableType: 'svg',
isGlobalStyles: true,
},

Something similar could work for <link>s. A slot in the head would also work.

@ellatrix
Copy link
Member Author

Could you use CSS imports?

@ska-dev-1
Copy link

Ah, yes, absolutely, didn't even cross my mind. Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Block editor /packages/block-editor [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add back warning for incorrectly enqueue styles in post editor iframe
6 participants