diff --git a/packages/block-editor/src/components/block-tools/block-selection-button.js b/packages/block-editor/src/components/block-tools/block-selection-button.js index 8eb9a5b695068..c5d36b7fc1e6d 100644 --- a/packages/block-editor/src/components/block-tools/block-selection-button.js +++ b/packages/block-editor/src/components/block-tools/block-selection-button.js @@ -100,6 +100,7 @@ function BlockSelectionButton( { clientId, rootClientId, blockElement } ) { getMultiSelectedBlocksEndClientId, getPreviousBlockClientId, getNextBlockClientId, + isNavigationMode, } = useSelect( blockEditorStore ); const { selectBlock, @@ -157,7 +158,10 @@ function BlockSelectionButton( { clientId, rootClientId, blockElement } ) { selectedBlockClientId; } const startingBlockClientId = hasBlockMovingClientId(); - + if ( isEscape && isNavigationMode() ) { + clearSelectedBlock(); + event.preventDefault(); + } if ( isEscape && startingBlockClientId && ! event.defaultPrevented ) { setBlockMovingClientId( null ); event.preventDefault(); diff --git a/packages/e2e-tests/specs/editor/various/writing-flow.test.js b/packages/e2e-tests/specs/editor/various/writing-flow.test.js index 918a97218463c..9eb3aa42dafe9 100644 --- a/packages/e2e-tests/specs/editor/various/writing-flow.test.js +++ b/packages/e2e-tests/specs/editor/various/writing-flow.test.js @@ -13,7 +13,7 @@ import { const getActiveBlockName = async () => page.evaluate( - () => wp.data.select( 'core/block-editor' ).getSelectedBlock().name + () => wp.data.select( 'core/block-editor' ).getSelectedBlock()?.name ); const addParagraphsAndColumnsDemo = async () => { @@ -630,4 +630,24 @@ describe( 'Writing Flow', () => { ) ).toBe( 'Table' ); } ); + + it( 'Should unselect all blocks when hitting double escape', async () => { + // Add demo content. + await page.keyboard.press( 'Enter' ); + await page.keyboard.type( 'Random Paragraph' ); + + // Select a block. + let activeBlockName = await getActiveBlockName(); + expect( activeBlockName ).toBe( 'core/paragraph' ); + + // First escape enters navigaiton mode. + await page.keyboard.press( 'Escape' ); + activeBlockName = await getActiveBlockName(); + expect( activeBlockName ).toBe( 'core/paragraph' ); + + // Second escape unselects the blocks. + await page.keyboard.press( 'Escape' ); + activeBlockName = await getActiveBlockName(); + expect( activeBlockName ).toBe( undefined ); + } ); } );