<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[59238] trunk: Editor: Bootstrap block binding sources with inline script from server</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/59238">59238</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/59238","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>gziolo</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2024-10-15 08:50:08 +0000 (Tue, 15 Oct 2024)</dd>
</dl>
<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Editor: Bootstrap block binding sources with inline script from server
Bootstrap block bindings sources earlier in the process through an inline script to ensure they are available when developers want to extend them in the client. Following the same pattern other APIs like registering block types are doing.
Props santosguillamot, cbravobernal, gziolo.
Fixes <a href="https://core.trac.wordpress.org/ticket/6225">#6225</a>.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadmineditformblocksphp">trunk/src/wp-admin/edit-form-blocks.php</a></li>
<li><a href="#trunksrcwpadminsiteeditorphp">trunk/src/wp-admin/site-editor.php</a></li>
<li><a href="#trunksrcwpadminwidgetsformblocksphp">trunk/src/wp-admin/widgets-form-blocks.php</a></li>
<li><a href="#trunksrcwpincludesblockeditorphp">trunk/src/wp-includes/block-editor.php</a></li>
<li><a href="#trunksrcwpincludesclasswpcustomizewidgetsphp">trunk/src/wp-includes/class-wp-customize-widgets.php</a></li>
<li><a href="#trunktestsphpunittestsblockseditorphp">trunk/tests/phpunit/tests/blocks/editor.php</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadmineditformblocksphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/edit-form-blocks.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/edit-form-blocks.php 2024-10-15 00:26:49 UTC (rev 59237)
+++ trunk/src/wp-admin/edit-form-blocks.php 2024-10-15 08:50:08 UTC (rev 59238)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -106,6 +106,24 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings() ) . ');'
</span><span class="cx" style="display: block; padding: 0 10px"> );
</span><span class="cx" style="display: block; padding: 0 10px">
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+// Preload server-registered block bindings sources.
+$registered_sources = get_all_registered_block_bindings_sources();
+if ( ! empty( $registered_sources ) ) {
+ $filtered_sources = array();
+ foreach ( $registered_sources as $source ) {
+ $filtered_sources[] = array(
+ 'name' => $source->name,
+ 'label' => $source->label,
+ 'usesContext' => $source->uses_context,
+ );
+ }
+ $script = sprintf( 'for ( const source of %s ) { wp.blocks.registerBlockBindingsSource( source ); }', wp_json_encode( $filtered_sources ) );
+ wp_add_inline_script(
+ 'wp-blocks',
+ $script
+ );
+}
+
</ins><span class="cx" style="display: block; padding: 0 10px"> // Get admin url for handling meta boxes.
</span><span class="cx" style="display: block; padding: 0 10px"> $meta_box_url = admin_url( 'post.php' );
</span><span class="cx" style="display: block; padding: 0 10px"> $meta_box_url = add_query_arg(
</span></span></pre></div>
<a id="trunksrcwpadminsiteeditorphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/site-editor.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/site-editor.php 2024-10-15 00:26:49 UTC (rev 59237)
+++ trunk/src/wp-admin/site-editor.php 2024-10-15 08:50:08 UTC (rev 59238)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -135,6 +135,24 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings() ) . ');'
</span><span class="cx" style="display: block; padding: 0 10px"> );
</span><span class="cx" style="display: block; padding: 0 10px">
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+// Preload server-registered block bindings sources.
+$registered_sources = get_all_registered_block_bindings_sources();
+if ( ! empty( $registered_sources ) ) {
+ $filtered_sources = array();
+ foreach ( $registered_sources as $source ) {
+ $filtered_sources[] = array(
+ 'name' => $source->name,
+ 'label' => $source->label,
+ 'usesContext' => $source->uses_context,
+ );
+ }
+ $script = sprintf( 'for ( const source of %s ) { wp.blocks.registerBlockBindingsSource( source ); }', wp_json_encode( $filtered_sources ) );
+ wp_add_inline_script(
+ 'wp-blocks',
+ $script
+ );
+}
+
</ins><span class="cx" style="display: block; padding: 0 10px"> wp_add_inline_script(
</span><span class="cx" style="display: block; padding: 0 10px"> 'wp-blocks',
</span><span class="cx" style="display: block; padding: 0 10px"> sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( isset( $editor_settings['blockCategories'] ) ? $editor_settings['blockCategories'] : array() ) ),
</span></span></pre></div>
<a id="trunksrcwpadminwidgetsformblocksphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/widgets-form-blocks.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/widgets-form-blocks.php 2024-10-15 00:26:49 UTC (rev 59237)
+++ trunk/src/wp-admin/widgets-form-blocks.php 2024-10-15 08:50:08 UTC (rev 59238)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -51,6 +51,24 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings() ) . ');'
</span><span class="cx" style="display: block; padding: 0 10px"> );
</span><span class="cx" style="display: block; padding: 0 10px">
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+// Preload server-registered block bindings sources.
+$registered_sources = get_all_registered_block_bindings_sources();
+if ( ! empty( $registered_sources ) ) {
+ $filtered_sources = array();
+ foreach ( $registered_sources as $source ) {
+ $filtered_sources[] = array(
+ 'name' => $source->name,
+ 'label' => $source->label,
+ 'usesContext' => $source->uses_context,
+ );
+ }
+ $script = sprintf( 'for ( const source of %s ) { wp.blocks.registerBlockBindingsSource( source ); }', wp_json_encode( $filtered_sources ) );
+ wp_add_inline_script(
+ 'wp-blocks',
+ $script
+ );
+}
+
</ins><span class="cx" style="display: block; padding: 0 10px"> wp_add_inline_script(
</span><span class="cx" style="display: block; padding: 0 10px"> 'wp-blocks',
</span><span class="cx" style="display: block; padding: 0 10px"> sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $block_editor_context ) ) ),
</span></span></pre></div>
<a id="trunksrcwpincludesblockeditorphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/block-editor.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/block-editor.php 2024-10-15 00:26:49 UTC (rev 59237)
+++ trunk/src/wp-includes/block-editor.php 2024-10-15 08:50:08 UTC (rev 59238)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -648,23 +648,6 @@
</span><span class="cx" style="display: block; padding: 0 10px"> $editor_settings['postContentAttributes'] = $post_content_block_attributes;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // Expose block bindings sources in the editor settings.
- $registered_block_bindings_sources = get_all_registered_block_bindings_sources();
- if ( ! empty( $registered_block_bindings_sources ) ) {
- // Initialize array.
- $editor_settings['blockBindingsSources'] = array();
- foreach ( $registered_block_bindings_sources as $source_name => $source_properties ) {
- // Add source with the label to editor settings.
- $editor_settings['blockBindingsSources'][ $source_name ] = array(
- 'label' => $source_properties->label,
- );
- // Add `usesContext` property if exists.
- if ( ! empty( $source_properties->uses_context ) ) {
- $editor_settings['blockBindingsSources'][ $source_name ]['usesContext'] = $source_properties->uses_context;
- }
- }
- }
-
</del><span class="cx" style="display: block; padding: 0 10px"> $editor_settings['canUpdateBlockBindings'] = current_user_can( 'edit_block_binding', $block_editor_context );
</span><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span></span></pre></div>
<a id="trunksrcwpincludesclasswpcustomizewidgetsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/class-wp-customize-widgets.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-customize-widgets.php 2024-10-15 00:26:49 UTC (rev 59237)
+++ trunk/src/wp-includes/class-wp-customize-widgets.php 2024-10-15 08:50:08 UTC (rev 59238)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -866,6 +866,24 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings() ) . ');'
</span><span class="cx" style="display: block; padding: 0 10px"> );
</span><span class="cx" style="display: block; padding: 0 10px">
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Preload server-registered block bindings sources.
+ $registered_sources = get_all_registered_block_bindings_sources();
+ if ( ! empty( $registered_sources ) ) {
+ $filtered_sources = array();
+ foreach ( $registered_sources as $source ) {
+ $filtered_sources[] = array(
+ 'name' => $source->name,
+ 'label' => $source->label,
+ 'usesContext' => $source->uses_context,
+ );
+ }
+ $script = sprintf( 'for ( const source of %s ) { wp.blocks.registerBlockBindingsSource( source ); }', wp_json_encode( $filtered_sources ) );
+ wp_add_inline_script(
+ 'wp-blocks',
+ $script
+ );
+ }
+
</ins><span class="cx" style="display: block; padding: 0 10px"> wp_add_inline_script(
</span><span class="cx" style="display: block; padding: 0 10px"> 'wp-blocks',
</span><span class="cx" style="display: block; padding: 0 10px"> sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $block_editor_context ) ) ),
</span></span></pre></div>
<a id="trunktestsphpunittestsblockseditorphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/blocks/editor.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/blocks/editor.php 2024-10-15 00:26:49 UTC (rev 59237)
+++ trunk/tests/phpunit/tests/blocks/editor.php 2024-10-15 08:50:08 UTC (rev 59238)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -720,38 +720,4 @@
</span><span class="cx" style="display: block; padding: 0 10px"> ),
</span><span class="cx" style="display: block; padding: 0 10px"> );
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-
- /**
- * @ticket 61641
- */
- public function test_get_block_editor_settings_block_bindings_sources() {
- $block_editor_context = new WP_Block_Editor_Context();
- register_block_bindings_source(
- 'test/source-one',
- array(
- 'label' => 'Source One',
- 'get_value_callback' => function () {},
- 'uses_context' => array( 'postId' ),
- )
- );
- register_block_bindings_source(
- 'test/source-two',
- array(
- 'label' => 'Source Two',
- 'get_value_callback' => function () {},
- )
- );
- $settings = get_block_editor_settings( array(), $block_editor_context );
- $exposed_sources = $settings['blockBindingsSources'];
- unregister_block_bindings_source( 'test/source-one' );
- unregister_block_bindings_source( 'test/source-two' );
- // It is expected to have 4 sources: the 2 registered sources in the test, and the 2 core sources.
- $this->assertCount( 4, $exposed_sources );
- $source_one = $exposed_sources['test/source-one'];
- $this->assertSame( 'Source One', $source_one['label'] );
- $this->assertSameSets( array( 'postId' ), $source_one['usesContext'] );
- $source_two = $exposed_sources['test/source-two'];
- $this->assertSame( 'Source Two', $source_two['label'] );
- $this->assertArrayNotHasKey( 'usesContext', $source_two );
- }
</del><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre>
</div>
</div>
</body>
</html>