From fd24e21d1c512c08ea806fe3e608eb165b10786b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Greg=20Zi=C3=B3=C5=82kowski?= Date: Fri, 26 Feb 2021 08:04:35 +0100 Subject: [PATCH] Blocks: Ensure that metadata registered on the server for core block is preserved on the client (try 2) (#29302) * Revert "Revert "Blocks: Ensure that metadata registered on the server for core block is preserved on the client (#29213)" (#29279)" This reverts commit 535ac5b3d04bec185d60a88babaaa4404859f08f. * Add polyfill for apiVersion when not set on the server --- packages/blocks/src/api/registration.js | 17 +++++++++ packages/blocks/src/api/test/registration.js | 37 +++++++++++++++++++ .../plugins/register-block-type-hooks.php | 28 ++++++++++++++ .../plugins/register-block-type-hooks.test.js | 32 ++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 packages/e2e-tests/plugins/register-block-type-hooks.php create mode 100644 packages/e2e-tests/specs/editor/plugins/register-block-type-hooks.test.js diff --git a/packages/blocks/src/api/registration.js b/packages/blocks/src/api/registration.js index af0dd733cf7410..c0153a703785ba 100644 --- a/packages/blocks/src/api/registration.js +++ b/packages/blocks/src/api/registration.js @@ -160,6 +160,23 @@ export const serverSideBlockDefinitions = {}; // eslint-disable-next-line camelcase export function unstable__bootstrapServerSideBlockDefinitions( definitions ) { for ( const blockName of Object.keys( definitions ) ) { + // Don't overwrite if already set. It covers the case when metadata + // was initialized from the server. + if ( serverSideBlockDefinitions[ blockName ] ) { + // We still need to polyfill `apiVersion` for WordPress version + // lower than 5.7. If it isn't present in the definition shared + // from the server, we try to fallback to the definition passed. + // @see https://github.com/WordPress/gutenberg/pull/29279 + if ( + serverSideBlockDefinitions[ blockName ].apiVersion === + undefined && + definitions[ blockName ].apiVersion + ) { + serverSideBlockDefinitions[ blockName ].apiVersion = + definitions[ blockName ].apiVersion; + } + continue; + } serverSideBlockDefinitions[ blockName ] = mapKeys( pickBy( definitions[ blockName ], ( value ) => ! isNil( value ) ), ( value, key ) => camelCase( key ) diff --git a/packages/blocks/src/api/test/registration.js b/packages/blocks/src/api/test/registration.js index 917d27f3a0fe34..3ef1c4713f8149 100644 --- a/packages/blocks/src/api/test/registration.js +++ b/packages/blocks/src/api/test/registration.js @@ -385,6 +385,43 @@ describe( 'blocks', () => { } ); } ); + // This test can be removed once the polyfill for apiVersion gets removed. + it( 'should apply apiVersion on the client when not set on the server', () => { + const blockName = 'core/test-block-back-compat'; + unstable__bootstrapServerSideBlockDefinitions( { + [ blockName ]: { + category: 'widgets', + }, + } ); + unstable__bootstrapServerSideBlockDefinitions( { + [ blockName ]: { + apiVersion: 2, + category: 'ignored', + }, + } ); + + const blockType = { + title: 'block title', + }; + registerBlockType( blockName, blockType ); + expect( getBlockType( blockName ) ).toEqual( { + apiVersion: 2, + name: blockName, + save: expect.any( Function ), + title: 'block title', + category: 'widgets', + icon: { + src: blockIcon, + }, + attributes: {}, + providesContext: {}, + usesContext: [], + keywords: [], + supports: {}, + styles: [], + } ); + } ); + it( 'should validate the icon', () => { const blockType = { save: noop, diff --git a/packages/e2e-tests/plugins/register-block-type-hooks.php b/packages/e2e-tests/plugins/register-block-type-hooks.php new file mode 100644 index 00000000000000..39709110c6270e --- /dev/null +++ b/packages/e2e-tests/plugins/register-block-type-hooks.php @@ -0,0 +1,28 @@ + 'widgets' ) + ); +} + +add_filter( 'block_type_metadata', 'gutenberg_test_block_type_metadata' ); diff --git a/packages/e2e-tests/specs/editor/plugins/register-block-type-hooks.test.js b/packages/e2e-tests/specs/editor/plugins/register-block-type-hooks.test.js new file mode 100644 index 00000000000000..d623dac3833f8f --- /dev/null +++ b/packages/e2e-tests/specs/editor/plugins/register-block-type-hooks.test.js @@ -0,0 +1,32 @@ +/** + * WordPress dependencies + */ +import { + activatePlugin, + createNewPost, + deactivatePlugin, + openGlobalBlockInserter, +} from '@wordpress/e2e-test-utils'; + +describe( 'Register block type hooks', () => { + beforeEach( async () => { + await activatePlugin( 'gutenberg-test-register-block-type-hooks' ); + await createNewPost(); + } ); + + afterEach( async () => { + await deactivatePlugin( 'gutenberg-test-register-block-type-hooks' ); + } ); + + it( 'has a custom category for Paragraph block', async () => { + await openGlobalBlockInserter(); + + const widgetsCategory = await page.$( + '.block-editor-block-types-list[aria-label="Widgets"]' + ); + + expect( + await widgetsCategory.$( '.editor-block-list-item-paragraph' ) + ).toBeDefined(); + } ); +} );