From d7c12c03476ed2c37a202c577e852fa0a941c5b9 Mon Sep 17 00:00:00 2001 From: Andrew Duthie Date: Mon, 27 Apr 2020 08:52:28 -0400 Subject: [PATCH 1/5] Block API: Block Context: Remove block render filtering --- lib/compat.php | 4 +++- packages/block-library/src/post-title/index.php | 6 +++--- phpunit/class-block-context-test.php | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/compat.php b/lib/compat.php index 0f4ea78a7618ee..2956b0dcbacf11 100644 --- a/lib/compat.php +++ b/lib/compat.php @@ -208,4 +208,6 @@ function gutenberg_render_block_with_assigned_block_context( $pre_render, $parse /** This filter is documented in src/wp-includes/blocks.php */ return apply_filters( 'render_block', $block->render(), $parsed_block ); } -add_filter( 'pre_render_block', 'gutenberg_render_block_with_assigned_block_context', 9, 2 ); +// TODO: Normally, commented code would not be left lingering. However, due to +// time constraints, this was the most direct approach for a last-minute revert. +// add_filter( 'pre_render_block', 'gutenberg_render_block_with_assigned_block_context', 9, 2 ); diff --git a/packages/block-library/src/post-title/index.php b/packages/block-library/src/post-title/index.php index 700d8ea968546f..d6218034553f32 100644 --- a/packages/block-library/src/post-title/index.php +++ b/packages/block-library/src/post-title/index.php @@ -11,12 +11,12 @@ * @return string Returns the filtered post title for the current post wrapped inside "h1" tags. */ function render_block_core_post_title() { - global $_experimental_block; - if ( ! isset( $_experimental_block->context['postId'] ) ) { + $post = gutenberg_get_post_from_context(); + if ( ! $post ) { return ''; } - return '

' . get_the_title( $_experimental_block->context['postId'] ) . '

'; + return '

' . get_the_title( $post ) . '

'; } /** diff --git a/phpunit/class-block-context-test.php b/phpunit/class-block-context-test.php index 52a4048a64bfa5..769b0e02429168 100644 --- a/phpunit/class-block-context-test.php +++ b/phpunit/class-block-context-test.php @@ -67,6 +67,8 @@ protected function register_block_type( $name, $args ) { * its inner blocks. */ function test_provides_block_context() { + $this->markTestSkipped(); + $provided_context = array(); $this->register_block_type( From c9b5c67a197b6b6320d0b1a10f3415f7aa0290cb Mon Sep 17 00:00:00 2001 From: Andrew Duthie Date: Mon, 27 Apr 2020 09:08:37 -0400 Subject: [PATCH 2/5] E2E Tests: Remove verification of server-side context rendering --- packages/e2e-tests/plugins/block-context.php | 13 +--------- .../editor/plugins/block-context.test.js | 26 +------------------ 2 files changed, 2 insertions(+), 37 deletions(-) diff --git a/packages/e2e-tests/plugins/block-context.php b/packages/e2e-tests/plugins/block-context.php index 9b1b4c27cdc3c2..380660f6f08ef9 100644 --- a/packages/e2e-tests/plugins/block-context.php +++ b/packages/e2e-tests/plugins/block-context.php @@ -47,18 +47,7 @@ function gutenberg_test_register_context_blocks() { register_block_type( 'gutenberg/test-context-consumer', array( - 'context' => array( 'gutenberg/recordId' ), - 'render_callback' => function() { - global $_experimental_block; - - $record_id = $_experimental_block->context['gutenberg/recordId']; - - if ( ! is_int( $record_id ) ) { - throw new Exception( 'Expected numeric recordId' ); - } - - return 'The record ID is: ' . filter_var( $record_id, FILTER_VALIDATE_INT ); - }, + 'context' => array( 'gutenberg/recordId' ), ) ); } diff --git a/packages/e2e-tests/specs/editor/plugins/block-context.test.js b/packages/e2e-tests/specs/editor/plugins/block-context.test.js index d7536b20f7166a..a12a47d6c1c330 100644 --- a/packages/e2e-tests/specs/editor/plugins/block-context.test.js +++ b/packages/e2e-tests/specs/editor/plugins/block-context.test.js @@ -11,7 +11,6 @@ import { createNewPost, deactivatePlugin, insertBlock, - saveDraft, } from '@wordpress/e2e-test-utils'; async function openPreviewPage( editorPage ) { @@ -76,33 +75,10 @@ describe( 'Block context', () => { const previewPage = await openPreviewPage( editorPage ); // Check default context values are populated. - let content = await previewPage.$eval( + const content = await previewPage.$eval( '.entry-content', ( contentWrapper ) => contentWrapper.textContent.trim() ); expect( content ).toBe( 'The record ID is: 0' ); - - // Return to editor to change context value to non-default. - await editorPage.bringToFront(); - await editorPage.focus( - '[data-type="gutenberg/test-context-provider"] input' - ); - await editorPage.keyboard.press( 'ArrowRight' ); - await editorPage.keyboard.type( '123' ); - await editorPage.waitForSelector( '.editor-post-save-draft' ); // Not entirely clear why it's asynchronous, but likely React scheduling prioritizing keyboard event and deferring the UI update. - await saveDraft(); - - // Check non-default context values are populated. - await previewPage.bringToFront(); - await previewPage.reload(); - content = await previewPage.$eval( - '.entry-content', - ( contentWrapper ) => contentWrapper.textContent.trim() - ); - expect( content ).toBe( 'The record ID is: 123' ); - - // Clean up - await editorPage.bringToFront(); - await previewPage.close(); } ); } ); From d609102f914162c6d032a3dd4832d9a469e6b76d Mon Sep 17 00:00:00 2001 From: Andrew Duthie Date: Mon, 27 Apr 2020 09:10:32 -0400 Subject: [PATCH 3/5] Block API: Block Context: Remove block filter --- lib/compat.php | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/lib/compat.php b/lib/compat.php index 2956b0dcbacf11..e38f339030cb5b 100644 --- a/lib/compat.php +++ b/lib/compat.php @@ -175,39 +175,3 @@ function gutenberg_get_post_from_context() { } return get_post(); } - -/** - * Shim that hooks into `pre_render_block` so as to override `render_block` with - * a function that assigns block context. - * - * This can be removed when plugin support requires WordPress 5.5.0+. - * - * @see (TBD Trac Link) - * - * @param string|null $pre_render The pre-rendered content. Defaults to null. - * @param array $parsed_block The parsed block being rendered. - * - * @return string String of rendered HTML. - */ -function gutenberg_render_block_with_assigned_block_context( $pre_render, $parsed_block ) { - global $post; - - // If a non-null value is provided, a filter has run at an earlier priority - // and has already handled custom rendering and should take precedence. - if ( null !== $pre_render ) { - return $pre_render; - } - - $source_block = $parsed_block; - - /** This filter is documented in src/wp-includes/blocks.php */ - $parsed_block = apply_filters( 'render_block_data', $parsed_block, $source_block ); - $context = array( 'postId' => $post->ID ); - $block = new WP_Block( $parsed_block, $context ); - - /** This filter is documented in src/wp-includes/blocks.php */ - return apply_filters( 'render_block', $block->render(), $parsed_block ); -} -// TODO: Normally, commented code would not be left lingering. However, due to -// time constraints, this was the most direct approach for a last-minute revert. -// add_filter( 'pre_render_block', 'gutenberg_render_block_with_assigned_block_context', 9, 2 ); From 2c91a59615a1cd4605ec683840d7a3cf71e29b46 Mon Sep 17 00:00:00 2001 From: Andrew Duthie Date: Mon, 27 Apr 2020 09:42:11 -0400 Subject: [PATCH 4/5] E2E Tests: Block Context: Remove preview test case --- .../editor/plugins/block-context.test.js | 39 ------------------- 1 file changed, 39 deletions(-) diff --git a/packages/e2e-tests/specs/editor/plugins/block-context.test.js b/packages/e2e-tests/specs/editor/plugins/block-context.test.js index a12a47d6c1c330..66d82bd734e52c 100644 --- a/packages/e2e-tests/specs/editor/plugins/block-context.test.js +++ b/packages/e2e-tests/specs/editor/plugins/block-context.test.js @@ -1,8 +1,3 @@ -/** - * External dependencies - */ -import { last } from 'lodash'; - /** * WordPress dependencies */ @@ -13,27 +8,6 @@ import { insertBlock, } from '@wordpress/e2e-test-utils'; -async function openPreviewPage( editorPage ) { - let openTabs = await browser.pages(); - const expectedTabsCount = openTabs.length + 1; - await editorPage.click( '.block-editor-post-preview__button-toggle' ); - await editorPage.waitFor( '.edit-post-header-preview__button-external' ); - await editorPage.click( '.edit-post-header-preview__button-external' ); - - // Wait for the new tab to open. - while ( openTabs.length < expectedTabsCount ) { - await editorPage.waitFor( 1 ); - openTabs = await browser.pages(); - } - - const previewPage = last( openTabs ); - // Wait for the preview to load. We can't do interstitial detection here, - // because it might load too quickly for us to pick up, so we wait for - // the preview to load by waiting for the content to appear. - await previewPage.waitForSelector( '.entry-content' ); - return previewPage; -} - describe( 'Block context', () => { beforeAll( async () => { await activatePlugin( 'gutenberg-test-block-context' ); @@ -68,17 +42,4 @@ describe( 'Block context', () => { ); expect( innerBlockText ).toBe( 'The record ID is: 123' ); } ); - - test( 'Block context is reflected in the preview', async () => { - await insertBlock( 'Test Context Provider' ); - const editorPage = page; - const previewPage = await openPreviewPage( editorPage ); - - // Check default context values are populated. - const content = await previewPage.$eval( - '.entry-content', - ( contentWrapper ) => contentWrapper.textContent.trim() - ); - expect( content ).toBe( 'The record ID is: 0' ); - } ); } ); From e77a452bbdfba888616b490ae37f804ce2288622 Mon Sep 17 00:00:00 2001 From: Andrew Duthie Date: Mon, 27 Apr 2020 09:44:17 -0400 Subject: [PATCH 5/5] E2E Tests: Block Context: Skip preview test --- .../editor/plugins/block-context.test.js | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/packages/e2e-tests/specs/editor/plugins/block-context.test.js b/packages/e2e-tests/specs/editor/plugins/block-context.test.js index 66d82bd734e52c..9f933f8150cf6e 100644 --- a/packages/e2e-tests/specs/editor/plugins/block-context.test.js +++ b/packages/e2e-tests/specs/editor/plugins/block-context.test.js @@ -1,3 +1,8 @@ +/** + * External dependencies + */ +import { last } from 'lodash'; + /** * WordPress dependencies */ @@ -6,8 +11,30 @@ import { createNewPost, deactivatePlugin, insertBlock, + saveDraft, } from '@wordpress/e2e-test-utils'; +async function openPreviewPage( editorPage ) { + let openTabs = await browser.pages(); + const expectedTabsCount = openTabs.length + 1; + await editorPage.click( '.block-editor-post-preview__button-toggle' ); + await editorPage.waitFor( '.edit-post-header-preview__button-external' ); + await editorPage.click( '.edit-post-header-preview__button-external' ); + + // Wait for the new tab to open. + while ( openTabs.length < expectedTabsCount ) { + await editorPage.waitFor( 1 ); + openTabs = await browser.pages(); + } + + const previewPage = last( openTabs ); + // Wait for the preview to load. We can't do interstitial detection here, + // because it might load too quickly for us to pick up, so we wait for + // the preview to load by waiting for the content to appear. + await previewPage.waitForSelector( '.entry-content' ); + return previewPage; +} + describe( 'Block context', () => { beforeAll( async () => { await activatePlugin( 'gutenberg-test-block-context' ); @@ -42,4 +69,45 @@ describe( 'Block context', () => { ); expect( innerBlockText ).toBe( 'The record ID is: 123' ); } ); + + // Disable reason: Block context PHP implementation is temporarily reverted. + // This will be unskipped once the implementation is restored. Skipping was + // the most direct option for revert given time constraints. + + /* eslint-disable-next-line jest/no-disabled-tests */ + test.skip( 'Block context is reflected in the preview', async () => { + await insertBlock( 'Test Context Provider' ); + const editorPage = page; + const previewPage = await openPreviewPage( editorPage ); + + // Check default context values are populated. + let content = await previewPage.$eval( + '.entry-content', + ( contentWrapper ) => contentWrapper.textContent.trim() + ); + expect( content ).toBe( 'The record ID is: 0' ); + + // Return to editor to change context value to non-default. + await editorPage.bringToFront(); + await editorPage.focus( + '[data-type="gutenberg/test-context-provider"] input' + ); + await editorPage.keyboard.press( 'ArrowRight' ); + await editorPage.keyboard.type( '123' ); + await editorPage.waitForSelector( '.editor-post-save-draft' ); // Not entirely clear why it's asynchronous, but likely React scheduling prioritizing keyboard event and deferring the UI update. + await saveDraft(); + + // Check non-default context values are populated. + await previewPage.bringToFront(); + await previewPage.reload(); + content = await previewPage.$eval( + '.entry-content', + ( contentWrapper ) => contentWrapper.textContent.trim() + ); + expect( content ).toBe( 'The record ID is: 123' ); + + // Clean up + await editorPage.bringToFront(); + await previewPage.close(); + } ); } );