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

Iframed editor: support scripts #31873

Merged
merged 6 commits into from
May 19, 2021
Merged

Iframed editor: support scripts #31873

merged 6 commits into from
May 19, 2021

Conversation

ellatrix
Copy link
Member

@ellatrix ellatrix commented May 16, 2021

Description

Fixes #31873.

Adds support for scripts to the iframed editor. See https://developer.wordpress.org/block-editor/reference-guides/block-api/block-metadata/#script.

How has this been tested?

Created a block with a script (front-end and editor) https://developer.wordpress.org/block-editor/reference-guides/block-api/block-metadata/#script.

Screenshots

Types of changes

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR (please manually search all *.native.js files for terms that need renaming or removal).

@ellatrix ellatrix added this to the Gutenberg 10.7 milestone May 16, 2021
@ellatrix ellatrix requested a review from glendaviesnz May 16, 2021 19:44
@glendaviesnz
Copy link
Contributor

glendaviesnz commented May 17, 2021

This worked for me to add a script file for a simple block to the site editor iframe head. Although it worked on my local install a lot of react warnings were shown as the tag names in the asset list were uppercased:

Screen Shot 2021-05-17 at 2 54 44 PM

lowercasing the TagName string before using it fixed this.

Going to try it on an existing more complex block now as a second test, but that one isn't using block.json though, so might have to do some tinkering first to get it working.

@ellatrix
Copy link
Member Author

Ah yes, I’ll fix the warnings. Could you share a use case for not using block.json?

@glendaviesnz
Copy link
Contributor

glendaviesnz commented May 17, 2021

Could you share a use case for not using block.json?

It is a jetpack block, none of which currently use block.json. I think it is just because of the historical setup and the fact that jetpack has its own block loading mechanisms which will need to be refactored in order to move to block.json. It would make sense to look at this refactor at some point in the near future.

In the meantime, it looks like if we manually enqueue the resources before registering the block and add the asset handles to the block meta data script and style properties the assets get copied to the iframe as expected. This is just manually mimicking what is happening with register_block_script_handle and register_block_style_handle calls within register_block_type_from_metadata, and I think will give us a reasonable workaround while we look at the possibility of refactoring to use block.json. I think this is probably better than trying to add anything additional to the Gutenberg APIs to handle this use case.

@ellatrix
Copy link
Member Author

Yeah, that sounds like a good workaround!

@ellatrix ellatrix force-pushed the add/iframe-scripts branch from dfb3f47 to c8fdbfe Compare May 17, 2021 09:03
@ellatrix ellatrix changed the base branch from try/iframe-styles-compat-error to trunk May 17, 2021 09:04
@github-actions
Copy link

github-actions bot commented May 17, 2021

Size Change: +297 B (0%)

Total Size: 1.62 MB

Filename Size Change
build/block-editor/index.js 119 kB +338 B (0%)
build/edit-post/index.js 334 kB -22 B (0%)
build/edit-site/index.js 26 kB -19 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.12 kB 0 B
build/annotations/index.js 2.93 kB 0 B
build/api-fetch/index.js 2.42 kB 0 B
build/autop/index.js 2.28 kB 0 B
build/blob/index.js 673 B 0 B
build/block-directory/index.js 6.61 kB 0 B
build/block-directory/style-rtl.css 993 B 0 B
build/block-directory/style.css 995 B 0 B
build/block-editor/style-rtl.css 13 kB 0 B
build/block-editor/style.css 13 kB 0 B
build/block-library/blocks/archives/editor-rtl.css 61 B 0 B
build/block-library/blocks/archives/editor.css 60 B 0 B
build/block-library/blocks/audio/editor-rtl.css 58 B 0 B
build/block-library/blocks/audio/editor.css 58 B 0 B
build/block-library/blocks/audio/style-rtl.css 112 B 0 B
build/block-library/blocks/audio/style.css 112 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/button/style-rtl.css 601 B 0 B
build/block-library/blocks/button/style.css 600 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 315 B 0 B
build/block-library/blocks/buttons/editor.css 315 B 0 B
build/block-library/blocks/buttons/style-rtl.css 375 B 0 B
build/block-library/blocks/buttons/style.css 375 B 0 B
build/block-library/blocks/calendar/style-rtl.css 208 B 0 B
build/block-library/blocks/calendar/style.css 208 B 0 B
build/block-library/blocks/categories/editor-rtl.css 84 B 0 B
build/block-library/blocks/categories/editor.css 83 B 0 B
build/block-library/blocks/categories/style-rtl.css 79 B 0 B
build/block-library/blocks/categories/style.css 79 B 0 B
build/block-library/blocks/code/style-rtl.css 90 B 0 B
build/block-library/blocks/code/style.css 90 B 0 B
build/block-library/blocks/columns/editor-rtl.css 190 B 0 B
build/block-library/blocks/columns/editor.css 190 B 0 B
build/block-library/blocks/columns/style-rtl.css 422 B 0 B
build/block-library/blocks/columns/style.css 422 B 0 B
build/block-library/blocks/cover/editor-rtl.css 643 B 0 B
build/block-library/blocks/cover/editor.css 645 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.22 kB 0 B
build/block-library/blocks/cover/style.css 1.22 kB 0 B
build/block-library/blocks/embed/editor-rtl.css 486 B 0 B
build/block-library/blocks/embed/editor.css 486 B 0 B
build/block-library/blocks/embed/style-rtl.css 401 B 0 B
build/block-library/blocks/embed/style.css 400 B 0 B
build/block-library/blocks/file/editor-rtl.css 301 B 0 B
build/block-library/blocks/file/editor.css 300 B 0 B
build/block-library/blocks/file/frontend.js 771 B 0 B
build/block-library/blocks/file/style-rtl.css 255 B 0 B
build/block-library/blocks/file/style.css 255 B 0 B
build/block-library/blocks/freeform/editor-rtl.css 2.45 kB 0 B
build/block-library/blocks/freeform/editor.css 2.45 kB 0 B
build/block-library/blocks/gallery/editor-rtl.css 704 B 0 B
build/block-library/blocks/gallery/editor.css 705 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.06 kB 0 B
build/block-library/blocks/gallery/style.css 1.05 kB 0 B
build/block-library/blocks/group/editor-rtl.css 160 B 0 B
build/block-library/blocks/group/editor.css 160 B 0 B
build/block-library/blocks/group/style-rtl.css 57 B 0 B
build/block-library/blocks/group/style.css 57 B 0 B
build/block-library/blocks/heading/editor-rtl.css 129 B 0 B
build/block-library/blocks/heading/editor.css 129 B 0 B
build/block-library/blocks/heading/style-rtl.css 76 B 0 B
build/block-library/blocks/heading/style.css 76 B 0 B
build/block-library/blocks/home-link/style-rtl.css 259 B 0 B
build/block-library/blocks/home-link/style.css 259 B 0 B
build/block-library/blocks/html/editor-rtl.css 281 B 0 B
build/block-library/blocks/html/editor.css 281 B 0 B
build/block-library/blocks/image/editor-rtl.css 717 B 0 B
build/block-library/blocks/image/editor.css 716 B 0 B
build/block-library/blocks/image/style-rtl.css 481 B 0 B
build/block-library/blocks/image/style.css 485 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 281 B 0 B
build/block-library/blocks/latest-comments/style.css 282 B 0 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B 0 B
build/block-library/blocks/latest-posts/editor.css 137 B 0 B
build/block-library/blocks/latest-posts/style-rtl.css 523 B 0 B
build/block-library/blocks/latest-posts/style.css 522 B 0 B
build/block-library/blocks/legacy-widget/editor-rtl.css 557 B 0 B
build/block-library/blocks/legacy-widget/editor.css 557 B 0 B
build/block-library/blocks/list/style-rtl.css 63 B 0 B
build/block-library/blocks/list/style.css 63 B 0 B
build/block-library/blocks/media-text/editor-rtl.css 176 B 0 B
build/block-library/blocks/media-text/editor.css 176 B 0 B
build/block-library/blocks/media-text/style-rtl.css 492 B 0 B
build/block-library/blocks/media-text/style.css 489 B 0 B
build/block-library/blocks/more/editor-rtl.css 434 B 0 B
build/block-library/blocks/more/editor.css 434 B 0 B
build/block-library/blocks/navigation-link/editor-rtl.css 617 B 0 B
build/block-library/blocks/navigation-link/editor.css 619 B 0 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B 0 B
build/block-library/blocks/navigation-link/style.css 94 B 0 B
build/block-library/blocks/navigation/editor-rtl.css 1.54 kB 0 B
build/block-library/blocks/navigation/editor.css 1.54 kB 0 B
build/block-library/blocks/navigation/style-rtl.css 1.78 kB 0 B
build/block-library/blocks/navigation/style.css 1.78 kB 0 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B 0 B
build/block-library/blocks/nextpage/editor.css 395 B 0 B
build/block-library/blocks/page-list/editor-rtl.css 310 B 0 B
build/block-library/blocks/page-list/editor.css 311 B 0 B
build/block-library/blocks/page-list/style-rtl.css 233 B 0 B
build/block-library/blocks/page-list/style.css 233 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B 0 B
build/block-library/blocks/paragraph/editor.css 157 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 247 B 0 B
build/block-library/blocks/paragraph/style.css 248 B 0 B
build/block-library/blocks/post-author/editor-rtl.css 209 B 0 B
build/block-library/blocks/post-author/editor.css 209 B 0 B
build/block-library/blocks/post-author/style-rtl.css 183 B 0 B
build/block-library/blocks/post-author/style.css 184 B 0 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B 0 B
build/block-library/blocks/post-comments-form/style.css 140 B 0 B
build/block-library/blocks/post-comments/style-rtl.css 360 B 0 B
build/block-library/blocks/post-comments/style.css 359 B 0 B
build/block-library/blocks/post-content/editor-rtl.css 139 B 0 B
build/block-library/blocks/post-content/editor.css 139 B 0 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B 0 B
build/block-library/blocks/post-excerpt/editor.css 73 B 0 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B 0 B
build/block-library/blocks/post-excerpt/style.css 69 B 0 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B 0 B
build/block-library/blocks/post-featured-image/editor.css 338 B 0 B
build/block-library/blocks/post-featured-image/style-rtl.css 119 B 0 B
build/block-library/blocks/post-featured-image/style.css 119 B 0 B
build/block-library/blocks/post-title/style-rtl.css 60 B 0 B
build/block-library/blocks/post-title/style.css 60 B 0 B
build/block-library/blocks/preformatted/style-rtl.css 103 B 0 B
build/block-library/blocks/preformatted/style.css 103 B 0 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B 0 B
build/block-library/blocks/pullquote/editor.css 183 B 0 B
build/block-library/blocks/pullquote/style-rtl.css 318 B 0 B
build/block-library/blocks/pullquote/style.css 318 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 83 B 0 B
build/block-library/blocks/query-loop/editor.css 82 B 0 B
build/block-library/blocks/query-loop/style-rtl.css 315 B 0 B
build/block-library/blocks/query-loop/style.css 317 B 0 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B 0 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B 0 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B 0 B
build/block-library/blocks/query-pagination/editor.css 262 B 0 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B 0 B
build/block-library/blocks/query-pagination/style.css 168 B 0 B
build/block-library/blocks/query-title/editor-rtl.css 86 B 0 B
build/block-library/blocks/query-title/editor.css 86 B 0 B
build/block-library/blocks/query/editor-rtl.css 131 B 0 B
build/block-library/blocks/query/editor.css 132 B 0 B
build/block-library/blocks/quote/style-rtl.css 169 B 0 B
build/block-library/blocks/quote/style.css 169 B 0 B
build/block-library/blocks/rss/editor-rtl.css 201 B 0 B
build/block-library/blocks/rss/editor.css 202 B 0 B
build/block-library/blocks/rss/style-rtl.css 290 B 0 B
build/block-library/blocks/rss/style.css 290 B 0 B
build/block-library/blocks/search/editor-rtl.css 189 B 0 B
build/block-library/blocks/search/editor.css 189 B 0 B
build/block-library/blocks/search/style-rtl.css 359 B 0 B
build/block-library/blocks/search/style.css 362 B 0 B
build/block-library/blocks/separator/editor-rtl.css 99 B 0 B
build/block-library/blocks/separator/editor.css 99 B 0 B
build/block-library/blocks/separator/style-rtl.css 251 B 0 B
build/block-library/blocks/separator/style.css 251 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 512 B 0 B
build/block-library/blocks/shortcode/editor.css 512 B 0 B
build/block-library/blocks/site-logo/editor-rtl.css 440 B 0 B
build/block-library/blocks/site-logo/editor.css 441 B 0 B
build/block-library/blocks/site-logo/style-rtl.css 154 B 0 B
build/block-library/blocks/site-logo/style.css 154 B 0 B
build/block-library/blocks/social-link/editor-rtl.css 164 B 0 B
build/block-library/blocks/social-link/editor.css 165 B 0 B
build/block-library/blocks/social-links/editor-rtl.css 796 B 0 B
build/block-library/blocks/social-links/editor.css 795 B 0 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB 0 B
build/block-library/blocks/social-links/style.css 1.33 kB 0 B
build/block-library/blocks/spacer/editor-rtl.css 308 B 0 B
build/block-library/blocks/spacer/editor.css 308 B 0 B
build/block-library/blocks/spacer/style-rtl.css 48 B 0 B
build/block-library/blocks/spacer/style.css 48 B 0 B
build/block-library/blocks/table/editor-rtl.css 478 B 0 B
build/block-library/blocks/table/editor.css 478 B 0 B
build/block-library/blocks/table/style-rtl.css 485 B 0 B
build/block-library/blocks/table/style.css 485 B 0 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B 0 B
build/block-library/blocks/tag-cloud/editor.css 118 B 0 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B 0 B
build/block-library/blocks/tag-cloud/style.css 94 B 0 B
build/block-library/blocks/template-part/editor-rtl.css 551 B 0 B
build/block-library/blocks/template-part/editor.css 550 B 0 B
build/block-library/blocks/term-description/editor-rtl.css 90 B 0 B
build/block-library/blocks/term-description/editor.css 90 B 0 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B 0 B
build/block-library/blocks/text-columns/editor.css 95 B 0 B
build/block-library/blocks/text-columns/style-rtl.css 166 B 0 B
build/block-library/blocks/text-columns/style.css 166 B 0 B
build/block-library/blocks/verse/style-rtl.css 87 B 0 B
build/block-library/blocks/verse/style.css 87 B 0 B
build/block-library/blocks/video/editor-rtl.css 569 B 0 B
build/block-library/blocks/video/editor.css 570 B 0 B
build/block-library/blocks/video/style-rtl.css 169 B 0 B
build/block-library/blocks/video/style.css 169 B 0 B
build/block-library/common-rtl.css 1.26 kB 0 B
build/block-library/common.css 1.26 kB 0 B
build/block-library/editor-rtl.css 9.91 kB 0 B
build/block-library/editor.css 9.9 kB 0 B
build/block-library/index.js 146 kB 0 B
build/block-library/reset-rtl.css 506 B 0 B
build/block-library/reset.css 507 B 0 B
build/block-library/style-rtl.css 10.2 kB 0 B
build/block-library/style.css 10.3 kB 0 B
build/block-library/theme-rtl.css 692 B 0 B
build/block-library/theme.css 693 B 0 B
build/block-serialization-default-parser/index.js 1.29 kB 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/blocks/index.js 47.1 kB 0 B
build/components/index.js 188 kB 0 B
build/components/style-rtl.css 16.4 kB 0 B
build/components/style.css 16.3 kB 0 B
build/compose/index.js 9.94 kB 0 B
build/core-data/index.js 12.1 kB 0 B
build/customize-widgets/index.js 42.3 kB 0 B
build/customize-widgets/style-rtl.css 1.35 kB 0 B
build/customize-widgets/style.css 1.35 kB 0 B
build/data-controls/index.js 826 B 0 B
build/data/index.js 7.23 kB 0 B
build/date/index.js 31.8 kB 0 B
build/deprecated/index.js 739 B 0 B
build/dom-ready/index.js 577 B 0 B
build/dom/index.js 4.62 kB 0 B
build/edit-navigation/index.js 13.6 kB 0 B
build/edit-navigation/style-rtl.css 2.83 kB 0 B
build/edit-navigation/style.css 2.83 kB 0 B
build/edit-post/classic-rtl.css 454 B 0 B
build/edit-post/classic.css 454 B 0 B
build/edit-post/style-rtl.css 6.83 kB 0 B
build/edit-post/style.css 6.82 kB 0 B
build/edit-site/style-rtl.css 4.79 kB 0 B
build/edit-site/style.css 4.78 kB 0 B
build/edit-widgets/index.js 292 kB 0 B
build/edit-widgets/style-rtl.css 3.49 kB 0 B
build/edit-widgets/style.css 3.5 kB 0 B
build/editor/index.js 38.4 kB 0 B
build/editor/style-rtl.css 3.95 kB 0 B
build/editor/style.css 3.95 kB 0 B
build/element/index.js 3.44 kB 0 B
build/escape-html/index.js 739 B 0 B
build/format-library/index.js 5.67 kB 0 B
build/format-library/style-rtl.css 637 B 0 B
build/format-library/style.css 639 B 0 B
build/hooks/index.js 1.76 kB 0 B
build/html-entities/index.js 627 B 0 B
build/i18n/index.js 3.73 kB 0 B
build/is-shallow-equal/index.js 710 B 0 B
build/keyboard-shortcuts/index.js 1.65 kB 0 B
build/keycodes/index.js 1.43 kB 0 B
build/list-reusable-blocks/index.js 2.06 kB 0 B
build/list-reusable-blocks/style-rtl.css 629 B 0 B
build/list-reusable-blocks/style.css 628 B 0 B
build/media-utils/index.js 3.08 kB 0 B
build/navigation/index.js 2.85 kB 0 B
build/notices/index.js 1.07 kB 0 B
build/nux/index.js 2.31 kB 0 B
build/nux/style-rtl.css 718 B 0 B
build/nux/style.css 716 B 0 B
build/plugins/index.js 1.99 kB 0 B
build/primitives/index.js 1.03 kB 0 B
build/priority-queue/index.js 791 B 0 B
build/react-i18n/index.js 923 B 0 B
build/redux-routine/index.js 2.82 kB 0 B
build/reusable-blocks/index.js 2.54 kB 0 B
build/reusable-blocks/style-rtl.css 225 B 0 B
build/reusable-blocks/style.css 225 B 0 B
build/rich-text/index.js 10.7 kB 0 B
build/server-side-render/index.js 1.64 kB 0 B
build/shortcode/index.js 1.68 kB 0 B
build/token-list/index.js 846 B 0 B
build/url/index.js 1.95 kB 0 B
build/viewport/index.js 1.28 kB 0 B
build/warning/index.js 1.13 kB 0 B
build/widgets/index.js 1.66 kB 0 B
build/wordcount/index.js 1.24 kB 0 B

compressed-size-action

@glendaviesnz
Copy link
Contributor

glendaviesnz commented May 18, 2021

hmm, this is weird, did the js actually get loaded when you tested this change?

When I tested this again with the lower casing change the script is added to the iframe header as expected, but the browser never downloads and parses it. I tried with a css file and that still worked as expected. Removing the .toLowerCase() from the new version fixes it and the script is downloaded again - I can't see any obvious reason why this is happening 🤷

Before lowercase change (script is loaded and run twice, in main window and iframe):
script-before

After lowercase change (script is only loaded once in the main window, the addition to the iframe doesn't cause a second load):
script-after

@ellatrix
Copy link
Member Author

That's weird indeed. I also got it working without lowercasing, but didn't actually test after lowercasing. I'll investigate. I'll also add a basic integration test so we never have any regressions here.

@ellatrix
Copy link
Member Author

@glendaviesnz It should be fixed now.

@ellatrix ellatrix force-pushed the add/iframe-scripts branch 2 times, most recently from 844d442 to 6eed179 Compare May 18, 2021 17:17
lib/client-assets.php Outdated Show resolved Hide resolved
@ellatrix ellatrix force-pushed the add/iframe-scripts branch from f1365ab to 7245466 Compare May 19, 2021 11:37
@ellatrix
Copy link
Member Author

I addressed the feedback. I think we should get this in the RC. I'll add some integration tests later after the plugin release.

headHTML={ window.__editorStyles.html }
head={ <EditorStyles styles={ styles } /> }
Copy link
Contributor

Choose a reason for hiding this comment

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

Will Iframe's inputs be consolidated in the future? With this change, we now have:

  • head prop to pass settings.styles
  • a hard-coded <style>{ 'body{margin:0}' }</style> injected with the head prop
  • __editorAssets global to pass other styles and scripts

It shouldn't block this PR, but it seems like something to address at some point.

Copy link
Member Author

Choose a reason for hiding this comment

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

After this PR, we have one less? :) The hardcoded style was there before, it's the same a mini default stylesheet. settings.styles can be built-in in the future.

Comment on lines 710 to -711
function gutenberg_extend_block_editor_styles_html() {
$handles = array(
Copy link
Contributor

Choose a reason for hiding this comment

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

It feels important to either rename this function or split it up, as the name no longer reflects its purpose.

Copy link
Contributor

Choose a reason for hiding this comment

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

@ellatrix: there's still the function name: gutenberg_extend_block_editor_styles_html

@ellatrix ellatrix changed the base branch from trunk to try/iframe-styles-compat-error May 19, 2021 12:20
Base automatically changed from try/iframe-styles-compat-error to trunk May 19, 2021 15:07
Copy link
Contributor

@mcsf mcsf left a comment

Choose a reason for hiding this comment

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

Works for me, but there are things to polish.

Comment on lines 710 to -711
function gutenberg_extend_block_editor_styles_html() {
$handles = array(
Copy link
Contributor

Choose a reason for hiding this comment

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

@ellatrix: there's still the function name: gutenberg_extend_block_editor_styles_html

bubbleEvents( contentDocument );
setBodyClassName( contentDocument );
setIframeDocument( contentDocument );
clearerRef( documentElement );
clearerRef( body );

scripts.reduce(
( promise, script ) =>
promise.then( () => loadScript( contentDocument, script ) ),
Copy link
Contributor

Choose a reason for hiding this comment

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

This effectively serialises script loading, correct? Any reason for preferring this over parallel loading?

Copy link
Member Author

Choose a reason for hiding this comment

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

Yes, otherwise a script might load before a dependency has loaded? It would be nice to load in parallel, but evaluate in series. Not sure how that would work though.

I doesn't block rendering so it seems fine to me. We can polish this later on .

Copy link
Contributor

Choose a reason for hiding this comment

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

Yes, otherwise a script might load before a dependency has loaded?

Yeah, you're right. Parallelising isn't impossible, but we'd need a careful method to determine dependencies.

@youknowriad youknowriad merged commit 5ec1282 into trunk May 19, 2021
@youknowriad youknowriad deleted the add/iframe-scripts branch May 19, 2021 17:18
@ellatrix
Copy link
Member Author

Ah, was about to rename the PHP function, but I'll do it later then :)

@gziolo
Copy link
Member

gziolo commented May 19, 2021

When you rename the function, can you add a function_exists check so we can safely move it to WP Core?

@ellatrix
Copy link
Member Author

Wouldn't we remove the gutenberg_ prefix in core?

@gziolo
Copy link
Member

gziolo commented May 20, 2021

I see now that it gets applied with add_action, so it looks like we will have to find a way to echo it only once. Ues, we can totally leave gutenberg_ prefix here and use wp_ in core 👍🏻

@lkraav
Copy link

lkraav commented May 26, 2021

Hi all. I'm having trouble finding some central issue on what all "Iframed editor" means. Is it that we finally are getting full proper editor level IFRAME isolation from wp-admin and its chrome, or is it just that some more individual blocks can rendered themselves in IFRAMEs now, but editor DOM tree is still part of wp-admin?

@ellatrix
Copy link
Member Author

@lkraav This means full isolation of the content DOM from the rest of the admin.

@lkraav
Copy link

lkraav commented May 26, 2021

This means full isolation of the content DOM from the rest of the admin.

Wow, this sounds fantastic. Sounds like you can now load full web components and design frameworks without messing up wp-admin!

@ellatrix
Copy link
Member Author

Yes. The post editor hasn't been iframed yet however. Currently only the site editor and template editor have been iframed because they're new. For the post editor will face some backward compatibility challenges with existing blocks that are not compatible with being rendered in an iframe. Hopefully these will adapt and then we can iframe the post editor in WP 5.9.

@leeshadle
Copy link

leeshadle commented Jun 15, 2021

Is there currently, or going to be, a way to enqueue scripts/styles and add inline styles ( wp_add_inline_style ) in the iframed editor without registering a block?

I create a lot of plugins using only Block Filters and often times I'm needing to enqueue scripts/styles and inline styles to use with these enhanced blocks...

Screen Shot 2021-06-15 at 4 10 08 PM

@ellatrix
Copy link
Member Author

wp_add_inline_style is based on a handle, no? Doesn't it work if the handle is a dependency of the block? I haven't tested, but normally wp_styles()->do_items( $handles ) should handle this correctly.

@gziolo
Copy link
Member

gziolo commented Jun 16, 2021

I create a lot of plugins using only Block Filters and often times I'm needing to enqueue scripts/styles and inline styles to use with these enhanced blocks...

I think the direction that @aristath wants to take is that themes and plugins should be able to define multiple styles and scripts per block to ensure that you only use styles and scripts that are needed on the front-end. He started #32510 PR which would be a good starting point for the discussion of how it all should evolve. We could always package the low-level mechanics into a more ergonomic API that addresses the concerns that @leeshadle brought.

@leeshadle
Copy link

leeshadle commented Jun 16, 2021

wp_add_inline_style is based on a handle, no? Doesn't it work if the handle is a dependency of the block? I haven't tested, but normally wp_styles()->do_items( $handles ) should handle this correctly.

@ellatrix I tried inlining styles based on the 'wp-edit-blocks' handle ( I also tested this by registering a custom block and inlining styles to it's dependency handle ):

Screen Shot 2021-06-16 at 11 14 26 AM

It prints the style tag for the inline style, but doesn't print the style:

Screen Shot 2021-06-16 at 11 14 04 AM

I'm running this on the enqueue_block_editor_assets filter.

Also, if I'm inlining styles based on the 'wp-edit-blocks' handle, I'm assuming that the handle will always be a dependency in the iframed editor. What if it's not? I could register a custom block, but then in order to enqueue a script/stylesheet/add inline styles for a plugin that leverages only Block Filters - I have to register a custom block?

@ellatrix
Copy link
Member Author

Could you create a separate issue? I'll work on a fix for the empty style tag. Yes, we might have to add a separate filter for adding assets.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants