<!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>[49310] trunk: Block Editor: Fix WP_Block_Supports class compatibility with Gutenberg-provided class.</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/49310">49310</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/49310","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>youknowriad</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2020-10-26 08:29:04 +0000 (Mon, 26 Oct 2020)</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'>Block Editor: Fix WP_Block_Supports class compatibility with Gutenberg-provided class.

When using WordPress trunk with Gutenberg master, there's an incompatibility causing 
the dynamic block generated classes to be omitted.
This commit refactors the block supports to fix that problem.

Props nosolosw.
Fixes <a href="https://core.trac.wordpress.org/ticket/51606">#51606</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpincludesblocksphp">trunk/src/wp-includes/blocks.php</a></li>
<li><a href="#trunksrcwpincludesclasswpblocksupportsphp">trunk/src/wp-includes/class-wp-block-supports.php</a></li>
<li><a href="#trunksrcwpincludesclasswpblockphp">trunk/src/wp-includes/class-wp-block.php</a></li>
<li><a href="#trunktestsphpunitincludestestcaseblocksupportsphp">trunk/tests/phpunit/includes/testcase-block-supports.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpincludesblocksphp"></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/blocks.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/blocks.php  2020-10-26 02:23:24 UTC (rev 49309)
+++ trunk/src/wp-includes/blocks.php    2020-10-26 08:29:04 UTC (rev 49310)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -648,23 +648,10 @@
</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">- * Block currently being parsed.
- *
- * @type array
-*/
-global $current_parsed_block;
-
-$current_parsed_block = array(
-       'blockName'  => null,
-       'attributes' => null,
-);
-
-/**
</del><span class="cx" style="display: block; padding: 0 10px">  * Renders a single block into a HTML string.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 5.0.0
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @global array    $current_parsed_block Block currently being parsed.
</del><span class="cx" style="display: block; padding: 0 10px">  * @global WP_Post  $post                 The post to edit.
</span><span class="cx" style="display: block; padding: 0 10px">  * @global WP_Query $wp_query             WordPress Query object.
</span><span class="cx" style="display: block; padding: 0 10px">  * @global WP_Query $wp_query             WordPress Query object.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -673,7 +660,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @return string String of rendered HTML.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function render_block( $parsed_block ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        global $post, $wp_query, $current_parsed_block;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ global $post, $wp_query;
</ins><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">         * Allows render_block() to be short-circuited, by returning a non-null value.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -688,8 +675,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $pre_render;
</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">-        $current_parsed_block = $parsed_block;
-
</del><span class="cx" style="display: block; padding: 0 10px">         $source_block = $parsed_block;
</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="trunksrcwpincludesclasswpblocksupportsphp"></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-block-supports.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-block-supports.php 2020-10-26 02:23:24 UTC (rev 49309)
+++ trunk/src/wp-includes/class-wp-block-supports.php   2020-10-26 08:29:04 UTC (rev 49310)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -24,6 +24,13 @@
</span><span class="cx" style="display: block; padding: 0 10px">        private $block_supports = array();
</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">+         * Tracks the current block to be rendered.
+        *
+        * @var array
+        */
+       public static $block_to_render = null;
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * Container for the main instance of the class.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @var WP_Block_Supports|null
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -72,7 +79,6 @@
</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">-
</del><span class="cx" style="display: block; padding: 0 10px">         /**
</span><span class="cx" style="display: block; padding: 0 10px">         * Generates an array of HTML attributes, such as classes, by applying to
</span><span class="cx" style="display: block; padding: 0 10px">         * the given block all of the features that the block supports.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -79,13 +85,12 @@
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 5.6.0
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @param  array $parsed_block Block as parsed from content.
</del><span class="cx" style="display: block; padding: 0 10px">          * @return array               Array of HTML attributes.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public function apply_block_supports( $parsed_block ) {
-               $block_attributes = $parsed_block['attrs'];
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ public function apply_block_supports() {
+               $block_attributes = self::$block_to_render['attrs'];
</ins><span class="cx" style="display: block; padding: 0 10px">                 $block_type       = WP_Block_Type_Registry::get_instance()->get_registered(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $parsed_block['blockName']
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 self::$block_to_render['blockName']
</ins><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">                // If no render_callback, assume styles have been previously handled.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -155,15 +160,12 @@
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 5.6.0
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @global array    $current_parsed_block Block currently being parsed.
- *
</del><span class="cx" style="display: block; padding: 0 10px">  * @param array $extra_attributes Optional. Extra attributes to render on the block wrapper.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @return string String of HTML classes.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function get_block_wrapper_attributes( $extra_attributes = array() ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        global $current_parsed_block;
-       $new_attributes = WP_Block_Supports::get_instance()->apply_block_supports( $current_parsed_block );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $new_attributes = WP_Block_Supports::get_instance()->apply_block_supports();
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( empty( $new_attributes ) && empty( $extra_attributes ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                return '';
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -208,4 +210,3 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        return implode( ' ', $normalized_attributes );
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-
</del></span></pre></div>
<a id="trunksrcwpincludesclasswpblockphp"></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-block.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-block.php  2020-10-26 02:23:24 UTC (rev 49309)
+++ trunk/src/wp-includes/class-wp-block.php    2020-10-26 08:29:04 UTC (rev 49310)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -192,7 +192,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * @return string Rendered block output.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public function render( $options = array() ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                global $post, $current_parsed_block;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         global $post;
</ins><span class="cx" style="display: block; padding: 0 10px">                 $options = wp_parse_args(
</span><span class="cx" style="display: block; padding: 0 10px">                        $options,
</span><span class="cx" style="display: block; padding: 0 10px">                        array(
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -206,20 +206,18 @@
</span><span class="cx" style="display: block; padding: 0 10px">                if ( ! $options['dynamic'] || empty( $this->block_type->skip_inner_blocks ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $index = 0;
</span><span class="cx" style="display: block; padding: 0 10px">                        foreach ( $this->inner_content as $chunk ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                if ( is_string( $chunk ) ) {
-                                       $block_content .= $chunk;
-                               } else {
-                                       $parent_parsed_block  = $current_parsed_block;
-                                       $current_parsed_block = $this->inner_blocks[ $index ]->parsed_block;
-                                       $block_content       .= $this->inner_blocks[ $index++ ]->render();
-                                       $current_parsed_block = $parent_parsed_block;
-                               }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         $block_content .= is_string( $chunk ) ?
+                                       $chunk :
+                                       $this->inner_blocks[ $index++ ]->render();
</ins><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><span class="cx" style="display: block; padding: 0 10px">                if ( $is_dynamic ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $global_post   = $post;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        $parent = WP_Block_Supports::$block_to_render;
+                       WP_Block_Supports::$block_to_render = $this->parsed_block;
</ins><span class="cx" style="display: block; padding: 0 10px">                         $block_content = (string) call_user_func( $this->block_type->render_callback, $this->attributes, $block_content, $this );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        WP_Block_Supports::$block_to_render = $parent;
</ins><span class="cx" style="display: block; padding: 0 10px">                         $post          = $global_post;
</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="trunktestsphpunitincludestestcaseblocksupportsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/includes/testcase-block-supports.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/includes/testcase-block-supports.php  2020-10-26 02:23:24 UTC (rev 49309)
+++ trunk/tests/phpunit/includes/testcase-block-supports.php    2020-10-26 08:29:04 UTC (rev 49310)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -96,11 +96,13 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * Returns the rendered output for the current block.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @param array $block Block to render.
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         *
+        * @return string Rendered output for the current block.
</ins><span class="cx" style="display: block; padding: 0 10px">          */
</span><span class="cx" style="display: block; padding: 0 10px">        private function render_example_block( $block ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                global $current_parsed_block;
-               $current_parsed_block = $block;
-               $wrapper_attributes   = get_block_wrapper_attributes(
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         WP_Block_Supports::init();
+               WP_Block_Supports::$block_to_render = $block;
+               $wrapper_attributes                 = get_block_wrapper_attributes(
</ins><span class="cx" style="display: block; padding: 0 10px">                         array(
</span><span class="cx" style="display: block; padding: 0 10px">                                'class' => 'foo-bar-class',
</span><span class="cx" style="display: block; padding: 0 10px">                                'style' => 'test: style;',
</span></span></pre>
</div>
</div>

</body>
</html>