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

Block Bindings: rely on broader context instead of requiring direct block context #60826

Closed
wants to merge 1 commit into from

Conversation

ellatrix
Copy link
Member

What?

This PR removes the need for bound block to have the context that a binding needs. Instead we can look at the broader context. I've opted to require a binding source to declare the context it needs, just to avoid passing all context down to the callbacks (not absolutely required though). This is very similar to how a block needs to declare what context it needs.

Why?

Block bindings shouldn't have to affect the block registration, instead we can add the right context just in time.

I could see Bits work similarly: it can declare what context it needs without requiring the parent block to consume the context as well.

How?

Testing Instructions

Testing Instructions for Keyboard

Screenshots or screencast

Copy link

github-actions bot commented Apr 17, 2024

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

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

Co-authored-by: ellatrix <[email protected]>
Co-authored-by: youknowriad <[email protected]>
Co-authored-by: SantosGuillamot <[email protected]>
Co-authored-by: gziolo <[email protected]>
Co-authored-by: artemiomorales <[email protected]>
Co-authored-by: cbravobernal <[email protected]>

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

@ellatrix ellatrix requested a review from youknowriad April 17, 2024 14:45
@ellatrix ellatrix added the [Type] Code Quality Issues or PRs that relate to code quality label Apr 17, 2024
Copy link

github-actions bot commented Apr 17, 2024

Size Change: +92 B (0%)

Total Size: 1.74 MB

Filename Size Change
build/block-editor/index.min.js 256 kB +67 B (0%)
build/blocks/index.min.js 51.7 kB +11 B (0%)
build/editor/index.min.js 80.3 kB +14 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.27 kB
build/api-fetch/index.min.js 2.32 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 578 B
build/block-directory/index.min.js 7.26 kB
build/block-directory/style-rtl.css 1.03 kB
build/block-directory/style.css 1.03 kB
build/block-editor/content-rtl.css 4.43 kB
build/block-editor/content.css 4.43 kB
build/block-editor/default-editor-styles-rtl.css 395 B
build/block-editor/default-editor-styles.css 395 B
build/block-editor/style-rtl.css 15.4 kB
build/block-editor/style.css 15.4 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 133 B
build/block-library/blocks/audio/theme.css 133 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 415 B
build/block-library/blocks/button/editor.css 414 B
build/block-library/blocks/button/style-rtl.css 627 B
build/block-library/blocks/button/style.css 626 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 671 B
build/block-library/blocks/cover/editor.css 674 B
build/block-library/blocks/cover/style-rtl.css 1.7 kB
build/block-library/blocks/cover/style.css 1.69 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 86 B
build/block-library/blocks/details/style.css 86 B
build/block-library/blocks/embed/editor-rtl.css 312 B
build/block-library/blocks/embed/editor.css 312 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 133 B
build/block-library/blocks/embed/theme.css 133 B
build/block-library/blocks/file/editor-rtl.css 326 B
build/block-library/blocks/file/editor.css 327 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.min.js 324 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/form-input/editor-rtl.css 227 B
build/block-library/blocks/form-input/editor.css 227 B
build/block-library/blocks/form-input/style-rtl.css 343 B
build/block-library/blocks/form-input/style.css 343 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 340 B
build/block-library/blocks/form-submission-notification/editor.css 340 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/form/view.min.js 471 B
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 956 B
build/block-library/blocks/gallery/editor.css 960 B
build/block-library/blocks/gallery/style-rtl.css 1.72 kB
build/block-library/blocks/gallery/style.css 1.72 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 394 B
build/block-library/blocks/group/editor.css 394 B
build/block-library/blocks/group/style-rtl.css 103 B
build/block-library/blocks/group/style.css 103 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 189 B
build/block-library/blocks/heading/style.css 189 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 878 B
build/block-library/blocks/image/editor.css 878 B
build/block-library/blocks/image/style-rtl.css 1.6 kB
build/block-library/blocks/image/style.css 1.59 kB
build/block-library/blocks/image/theme-rtl.css 133 B
build/block-library/blocks/image/theme.css 133 B
build/block-library/blocks/image/view.min.js 1.54 kB
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 306 B
build/block-library/blocks/media-text/editor.css 305 B
build/block-library/blocks/media-text/style-rtl.css 505 B
build/block-library/blocks/media-text/style.css 503 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 668 B
build/block-library/blocks/navigation-link/editor.css 669 B
build/block-library/blocks/navigation-link/style-rtl.css 193 B
build/block-library/blocks/navigation-link/style.css 192 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.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.26 kB
build/block-library/blocks/navigation/style.css 2.25 kB
build/block-library/blocks/navigation/view.min.js 1.03 kB
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 377 B
build/block-library/blocks/page-list/editor.css 377 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 235 B
build/block-library/blocks/paragraph/editor.css 235 B
build/block-library/blocks/paragraph/style-rtl.css 335 B
build/block-library/blocks/paragraph/style.css 335 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-content/editor-rtl.css 74 B
build/block-library/blocks/post-content/editor.css 74 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 734 B
build/block-library/blocks/post-featured-image/editor.css 732 B
build/block-library/blocks/post-featured-image/style-rtl.css 342 B
build/block-library/blocks/post-featured-image/style.css 342 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 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 409 B
build/block-library/blocks/post-template/style.css 408 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 354 B
build/block-library/blocks/pullquote/style.css 353 B
build/block-library/blocks/pullquote/theme-rtl.css 174 B
build/block-library/blocks/pullquote/theme.css 174 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 486 B
build/block-library/blocks/query/editor.css 486 B
build/block-library/blocks/query/view.min.js 958 B
build/block-library/blocks/quote/style-rtl.css 237 B
build/block-library/blocks/quote/style.css 237 B
build/block-library/blocks/quote/theme-rtl.css 233 B
build/block-library/blocks/quote/theme.css 235 B
build/block-library/blocks/read-more/style-rtl.css 140 B
build/block-library/blocks/read-more/style.css 140 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 184 B
build/block-library/blocks/search/editor.css 184 B
build/block-library/blocks/search/style-rtl.css 690 B
build/block-library/blocks/search/style.css 689 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 478 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 239 B
build/block-library/blocks/separator/style.css 239 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 805 B
build/block-library/blocks/site-logo/editor.css 805 B
build/block-library/blocks/site-logo/style-rtl.css 204 B
build/block-library/blocks/site-logo/style.css 204 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 676 B
build/block-library/blocks/social-links/editor.css 675 B
build/block-library/blocks/social-links/style-rtl.css 1.48 kB
build/block-library/blocks/social-links/style.css 1.48 kB
build/block-library/blocks/spacer/editor-rtl.css 350 B
build/block-library/blocks/spacer/editor.css 350 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 395 B
build/block-library/blocks/table/editor.css 395 B
build/block-library/blocks/table/style-rtl.css 639 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 152 B
build/block-library/blocks/table/theme.css 152 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 431 B
build/block-library/blocks/template-part/editor.css 431 B
build/block-library/blocks/template-part/theme-rtl.css 107 B
build/block-library/blocks/template-part/theme.css 107 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 133 B
build/block-library/blocks/video/theme.css 133 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 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.2 kB
build/block-library/editor.css 12.2 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 218 kB
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14.8 kB
build/block-library/style.css 14.8 kB
build/block-library/theme-rtl.css 707 B
build/block-library/theme.css 713 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/commands/index.min.js 15.2 kB
build/commands/style-rtl.css 953 B
build/commands/style.css 951 B
build/components/index.min.js 220 kB
build/components/style-rtl.css 11.9 kB
build/components/style.css 11.9 kB
build/compose/index.min.js 12.8 kB
build/core-commands/index.min.js 2.77 kB
build/core-data/index.min.js 72.5 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.36 kB
build/customize-widgets/style.css 1.36 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 9 kB
build/date/index.min.js 17.9 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.65 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 578 B
build/edit-post/index.min.js 16.9 kB
build/edit-post/style-rtl.css 4.08 kB
build/edit-post/style.css 4.07 kB
build/edit-site/index.min.js 224 kB
build/edit-site/style-rtl.css 13.7 kB
build/edit-site/style.css 13.7 kB
build/edit-widgets/index.min.js 17.6 kB
build/edit-widgets/style-rtl.css 4.17 kB
build/edit-widgets/style.css 4.16 kB
build/editor/style-rtl.css 7.21 kB
build/editor/style.css 7.21 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.07 kB
build/format-library/style-rtl.css 493 B
build/format-library/style.css 492 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/debug.min.js 16.2 kB
build/interactivity/file.min.js 447 B
build/interactivity/image.min.js 1.67 kB
build/interactivity/index.min.js 13 kB
build/interactivity/navigation.min.js 1.17 kB
build/interactivity/query.min.js 740 B
build/interactivity/router.min.js 2.79 kB
build/interactivity/search.min.js 618 B
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.3 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.11 kB
build/list-reusable-blocks/style-rtl.css 851 B
build/list-reusable-blocks/style.css 851 B
build/media-utils/index.min.js 2.92 kB
build/modules/importmap-polyfill.min.js 12.2 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 1.57 kB
build/nux/style-rtl.css 748 B
build/nux/style.css 744 B
build/patterns/index.min.js 6.47 kB
build/patterns/style-rtl.css 595 B
build/patterns/style.css 595 B
build/plugins/index.min.js 1.8 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/index.min.js 2.85 kB
build/preferences/style-rtl.css 710 B
build/preferences/style.css 712 B
build/primitives/index.min.js 975 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 1 kB
build/react-i18n/index.min.js 623 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.78 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.73 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10 kB
build/router/index.min.js 1.88 kB
build/server-side-render/index.min.js 1.96 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 2.03 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.74 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.7 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 957 B
build/warning/index.min.js 249 B
build/widgets/index.min.js 7.23 kB
build/widgets/style-rtl.css 1.17 kB
build/widgets/style.css 1.17 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

@youknowriad
Copy link
Contributor

This PR is interesting, should we be doing the same for the backend as well? Or maybe it's already the case?

@@ -12,6 +12,7 @@ import { store as editorStore } from '../store';
export default {
name: 'core/post-meta',
label: _x( 'Post Meta', 'block bindings source' ),
usesContext: [ 'postId', 'postType' ],
Copy link
Contributor

Choose a reason for hiding this comment

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

Where do we add these today (to block registration). I was expecting some code to be removed in this PR no?

Copy link
Member Author

Choose a reason for hiding this comment

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

We add the context to the block type registration server side, so it will have to be removed there. I'm not sure if it's needed there or also added right in time. My understanding is that it can be adjusted too to not rely on the block type, cc @SantosGuillamot #58554 (comment)

Copy link
Contributor

Choose a reason for hiding this comment

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

Right now, we are updating the uses_context when a source is registered: link. We did it that way to ensure the context was available in both the server and the editor, even when the binding was added afterward.

However, with this new approach, the editor side is solved, so I'd like to revisit it because that might not be necessary anymore.

Copy link
Contributor

Choose a reason for hiding this comment

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

We need to do the same for backend sources. Fetch the actual global variable of the context or something like that. then we'd be able to remove the hook. It's too bad that it's not a "named hook" so we can't really unhook it from Gutenberg and we'd need to make the change on Core.

Copy link
Contributor

Choose a reason for hiding this comment

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

I've been taking a look at the server part, and I believe we could add the following logic to the bindings processing here.

if ( ! empty( $block_binding_source->uses_context ) ) {
	foreach ( $block_binding_source->uses_context as $context_name ) {
		if ( array_key_exists( $context_name, $this->available_context ) ) {
			$this->context[ $context_name ] = $this->available_context[ $context_name ];
		}
	}
}

If we do that, we could get rid of the old method that changes uses_context when the source is registered.

I've tested it, and it seems to work fine. And it only adds the context to the blocks with bindings.

Is that what you had in mind?

Copy link
Member

Choose a reason for hiding this comment

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

We considered both approaches in the WordPress 6.5 release cycle. We ended up going with the approach that exposes context for every block that might need it to work with the potentially established connections with block binding sources. It was a simpler approach as we didn't have to apply any changes on the client. The downside is that there is often context exposed even when it's not needed.

As before, I think the revised approach is also viable and presents different challenges. The biggest unknown exists on the server because the whole context for the current block gets computed in the constructor of the WP_Block:

https://github.com/WordPress/wordpress-develop/blob/66b5d25be2b5e69833bacfe8f64de660ffc2bfa9/src/wp-includes/class-wp-block.php#L132-L153

It happens inside render_block, which is during the rendering phase, so that could have a positive impact on the block registration and editor's bootstrap. On the other hand, it's going to get processed for every individual block that gets rendered on the front end. The key question is if we can have a good strategy for getting the list of registered block sources and their expected context names.

Copy link
Contributor

Choose a reason for hiding this comment

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

I've created a pull request with what I had in mind to change in core: WordPress/wordpress-develop#6456

The idea is to extend the context during the bindings processing by accessing the available_context. This way, the code only runs when the block has bindings and gets the needed context. The downside would be that it doesn't run in the editor, but that part is handled by this PR in Gutenberg.

I've tested it, and it seems to work.

Copy link
Member

Choose a reason for hiding this comment

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

This is interesting. I haven't seen this idea before:

https://github.com/WordPress/wordpress-develop/blob/13a63f2730e032967a13eb84081bfc9a9e45bb7a/src/wp-includes/class-wp-block.php#L268-L275

// Add the necessary context defined by the source.
if ( ! empty( $block_binding_source->uses_context ) ) {
	foreach ( $block_binding_source->uses_context as $context_name ) {
		if ( array_key_exists( $context_name, $this->available_context ) ) {
			$this->context[ $context_name ] = $this->available_context[ $context_name ];
		}
	}
}

So that would only happen for existing block binding connections locally just before the moment the final values gets computer. That seems very performant.

Copy link
Contributor

Choose a reason for hiding this comment

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

I tried to replicate what this PR does in the server and it's the closest thing I could think of. I also agree that it seems much more performant than the previous implementation.

Copy link
Member

Choose a reason for hiding this comment

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

The more I think about it, the more I like it. Great teamwork with the proposed refactoring. It seems like it should be considered as progressive enhancement since the useContext is correctly set on block types on the server in WP 6.5, so any changes applied in the Gutenberg plugin won't change much which is great. In WP 6.6, when the block types aren't fed with the same useContext from the block binding sources all the time no matter if the context is consumed, then we will seamlessly move that handling to the WP_Block class. We might not even need to change anything in the back compat layer in the Gutenberg plugin.

for ( const key of source.usesContext ) {
context[ key ] = blockContext[ key ];
}
}
Copy link
Member Author

Choose a reason for hiding this comment

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

Worth noting that we do the exact same for blocks basically:

const context = useMemo( () => {
return blockType && blockType.usesContext
? Object.fromEntries(
Object.entries( blockContext ).filter( ( [ key ] ) =>
blockType.usesContext.includes( key )
)
)
: DEFAULT_BLOCK_CONTEXT;
}, [ blockType, blockContext ] );

Base automatically changed from try/block-bindings-without-hooks to trunk April 17, 2024 18:58
@SantosGuillamot SantosGuillamot force-pushed the try/block-binding-remove-block-context branch from 0d34203 to 800c96b Compare April 30, 2024 07:33
Copy link
Contributor

@SantosGuillamot SantosGuillamot left a comment

Choose a reason for hiding this comment

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

This PR looks good to me 🙂

As discussed here, it only handles the context in the editor. It should be complemented with this other pull request in core that does the same in the server. Until that PR gets merged, everything will keep working with the downside that we extend the context whenever a source is registered, making it accessible even when the block is not using bindings.

Copy link
Member

@gziolo gziolo left a comment

Choose a reason for hiding this comment

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

Good job figuring out and convincing for an alternative approach regarding the handling for the additional block context coming as a requirement from Block Binding source. More on that in #60826 (comment).

One remaining open question - not a blocker for this PR - is how we share use_context to the client so we don't have to repeat the definition it when registering handlers on the client. Basically, I'm talking about the line that @youknowriad points in https://github.com/WordPress/gutenberg/pull/60826/files#r1569275101.

@SantosGuillamot
Copy link
Contributor

I've been looking at exposing the uses_context defined by the source in the server to the client, so we don't have to repeat the definition, and it is compatible with existing sources that rely only in the server definition.

The idea is to expose it through the editor settings: link. And consume that in the client with getEditorSettings. I got it working with something like this:

const { __experimentalBlockBindings: serverBindingsConfig } =
  select("core/editor").getEditorSettings();

const serverUsesContext = new Set(
  serverBindingsConfig?.[source.name]?.usesContext
);
const editorUsesContext = new Set(source.usesContext);
const mergedUsesContext = Array.from(
  serverUsesContext.union(editorUsesContext)
);
for (const key of mergedUsesContext) {
  context[key] = blockContext[key];
}

What I had in mind was to:

  • Reuse the uses_context keys defined in the server.
  • Merge the uses_context keys defined in the client in case any source needs it.

What do you think about it @ellatrix @gziolo ? If we consider it a proper solution I'm happy to push the commit to this PR or create a new one after merging this.

@gziolo
Copy link
Member

gziolo commented May 15, 2024

I've been looking at exposing the uses_context defined by the source in the server to the client, so we don't have to repeat the definition, and it is compatible with existing sources that rely only in the server definition.

The idea is to expose it through the editor settings: link.

That should work correctly when the source gets registered in the server and the client. What about the case when the source is only registered on the server? The API on the client is still private so we need to account for the fact that custom block bindings sources are registered only on the server. I think it's still a viable approach to read these editor settings, but we would have to cover it explicitly. The alternative, would be registering data exposed from the server as initial sources and then enhancing them with what gets registered on the client. That's quite similar to how we handle block types.

@SantosGuillamot
Copy link
Contributor

What about the case when the source is only registered on the server? The API on the client is still private so we need to account for the fact that custom block bindings sources are registered only on the server.

Right now, as the editor APIs are private, and they can't use the getValue/setValue functions, they don't actually consume any context. It's true that they could have their own implementation for the editor, though.

I like the idea of registering data exposed from the server as initial sources and enhancing them in the client if they have been registered as well. Although I believe we could handle that in another PR.

@gziolo
Copy link
Member

gziolo commented May 16, 2024

I like the idea of registering data exposed from the server as initial sources and enhancing them in the client if they have been registered as well. Although I believe we could handle that in another PR.

This PR alone is safe to land after rebasing it with the latest changes from trunk. The server-side changes proposed in WordPress/wordpress-develop#6456 need to be introduced with extreme care due to the reason I explained in my previous comment: the necessary context will no longer be present for individual block types on the client, so any custom code that depends on it will stop working. I don't have insight into whether it's actually a real issue, so that might require contacting plugin authors using block bindings.

@SantosGuillamot
Copy link
Contributor

Now that we are starting to work on 6.7 release, I wanted to revisit the proposal to improve how we handle the context in block bindings, to see if it can be addressed in this release cycle. Let's do a recap and discuss a potential path forward.

I wasn't sure where to have this discussion, here or in the core PR.

How it works right now in trunk

At this moment, block bindings sources define the context they need when they are registered in PHP: link. From there, in the WP_Block_Bindings_Registry class, we are extending the block type usesContext using a filter: link.

This ensures that the context is available in the server processing and in the client. Even when a new binding is created directly in the editor.

However, it exposes the context in all the supported blocks, regardless whether they are using bindings or not.

Proposed solution

What we are trying to achieve is to expose the context ONLY when a specific block attribute is connected to the relevant source. There are three main aspects to consider here:

How to handle that in the server?

We have been exploring this in this pull request.

During the bindings processing in the server, we can access the available context and extend the block context: link. That would ensure that the context is only used when a source is used.

How to handle that in the client?

It's basically what this pull request is doing.

Similar to the server, we can access the block context during bindings processing and use it to extend the context: link.

How to reuse the server registration in the client?

With the existing solution in trunk, sources might be relying on the server registration to access the context in the client as well, so we should probably provide a way to reuse the server registration of uses_context before changing the server processing.

For that, we discussed creating a new blockBindings editor setting, exposing usesContext and potentially other properties that we could reuse, like label: link.

This way, sources will just need to add the uses_context property to the server registration. We could still keep the property in the client registration that extends it.

There are two outstanding questions for me with this approach:

  • Is it okay to use the editor settings for this? It seems we are using the same approach for other editor features.
  • With the existing implementation, external sources could rely on the exposed context even when there isn't a binding created. With the proposed solution, context would only be available when the binding to the specific source is created. This is expected, but I am not sure if it'd be a problem.

Potential path forward

If we agree this is the correct approach, I believe we could push the existing pull request forward:

  • (Optional) Rebase this pull request and merge it. If I am not mistaken, it wouldn't have any impact until the core logic is changed because the context is already exposed with the existing implementation.
  • Address the comments in the core pull request and merge it.
  • Create another pull request in Gutenberg to add some compatibility code to replicate the new logic and use the editor settings exposed.

@artemiomorales
Copy link
Contributor

artemiomorales commented Jul 1, 2024

With the existing implementation, external sources could rely on the exposed context even when there isn't a binding created. With the proposed solution, context would only be available when the binding to the specific source is created. This is expected, but I am not sure if it'd be a problem.

In addition to contacting plugin authors as mentioned in this comment, could it be worth doing some tests with external sources to see if we glean any insight?

@SantosGuillamot
Copy link
Contributor

could it be worth doing some tests with external sources to see if we glean any insight?

Do you have any examples in mind? Theoretically, blocks shouldn't need the context until the binding to the specific source is created. Use cases where context is needed without the binding could be considered "unexpected".

@artemiomorales
Copy link
Contributor

Do you have any examples in mind? Theoretically, blocks shouldn't need the context until the binding to the specific source is created. Use cases where context is needed without the binding could be considered "unexpected".

I’ve brainstormed a bit and nothing comes to mind that would be realistic or pressing. I guess we’d have to imagine that an author would define an external source then want to use say the postID or postType to perform some logic for all the blocks of a particular type in a post or template, but even in that scenario, it seems creating a custom block rather than relying on the core ones would make most sense, which would take that beyond the scope of block bindings (at least as they’re envisioned right now).

@cbravobernal
Copy link
Contributor

I think we should close this PR and do this option:

  • Create another pull request in Gutenberg to add some compatibility code to replicate the new logic and use the editor settings exposed.

@gziolo
Copy link
Member

gziolo commented Jul 8, 2024

I don't think this is the most important task on its own as the block context is correctly handled today. It's mostly a code quality change that can be done over time.

I think we should close this PR and do this option:

Create another pull request in Gutenberg to add some compatibility code to replicate the new logic and use the editor settings exposed.

I agree with the reasoning. We could use that as an opportunity to expose all the registered sources on the server to the client. This way, we will be able to share the label and usesContext with the editor on the client. By focusing on it, we will have a better understanding on the client about currently registered sources and show proper names in the sidebar panel when presenting a custom source that will never need to be registered on the client.

We have a similar use case for block types, where we bootstrap block types registered on the server before registering the rest of the settings on the client with:

/**
* Add bootstrapped block type metadata to the store. These metadata usually come from
* the `block.json` file and are either statically boostrapped from the server, or
* passed as the `metadata` parameter to the `registerBlockType` function.
*
* @param {string} name Block name.
* @param {WPBlockType} blockType Block type metadata.
*/
export function addBootstrappedBlockType( name, blockType ) {
return {
type: 'ADD_BOOTSTRAPPED_BLOCK_TYPE',
name,
blockType,
};
}

The settings passed from the server always take precedence over the settings set on the client because the server is always considered a source of truth because WP filters allow modifying values.

The remaining refactoring that changes how the context is exposed to the binding sources could get postponed to WP 6.8 or later.

@SantosGuillamot
Copy link
Contributor

As suggested, I started a new pull request trying to handle this. It is built on top of #63470 (which is on top of #63117) which exposes the properties the source defines in the server and let us reuse the usesContext property.

I'm reusing the code from this pull request, apart from other changes, so I'm happy to rebase this pull request and push whatever is necessary if you feel that'd be better. If not, I guess we could close this one and continue the work there. Whatever you prefer it's fine to me.

I don't think this is the most important task on its own as the block context is correctly handled today. It's mostly a code quality change that can be done over time. ... The remaining refactoring that changes how the context is exposed to the binding sources could get postponed to WP 6.8 or later.

Regarding this, I still believe refactoring how the context is exposed is important. The way it works right now, it extends the context for all the supported blocks when the source is defined. This means that if a source is registered with uses_context: [ 'postId', 'postType' ], postId and postType would be available to all the supported blocks independently whether they use bindings or not.

Maybe it is not a big issue at this moment because we only support four core blocks and there aren't too many sources extending the context. But I can expect more sources once the editor APIs are open and the idea is to extend the list of blocks supported at some point. It could become a problem if this "bug" is not solved soon.

Additionally, all the pieces are there and (apparently) working, so I'd like to land them for 6.7.

@SantosGuillamot
Copy link
Contributor

The code in this pull request was included as part of Block Bindings: Improve how the context needed by sources is extended in the editor. Should we close this one?

@artemiomorales
Copy link
Contributor

The code in this pull request was included as part of #63513. Should we close this one?

I think that sounds good. I'll go ahead and close this — please anyone feel free to reopen 🙏

@gziolo gziolo deleted the try/block-binding-remove-block-context branch July 25, 2024 20:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Block bindings [Type] Code Quality Issues or PRs that relate to code quality
Projects
No open projects
Status: Done
Development

Successfully merging this pull request may close these issues.

6 participants