diff --git a/packages/block-editor/src/components/writing-flow/use-arrow-nav.js b/packages/block-editor/src/components/writing-flow/use-arrow-nav.js index ea3e1888ce310..2734ba69a65bb 100644 --- a/packages/block-editor/src/components/writing-flow/use-arrow-nav.js +++ b/packages/block-editor/src/components/writing-flow/use-arrow-nav.js @@ -17,7 +17,7 @@ import { useRefEffect } from '@wordpress/compose'; /** * Internal dependencies */ -import { getBlockClientId } from '../../utils/dom'; +import { getBlockClientId, isInSameBlock } from '../../utils/dom'; import { store as blockEditorStore } from '../../store'; /** @@ -101,6 +101,16 @@ export function getClosestTabbable( } function isTabCandidate( node ) { + // Skip if there's only one child that is content editable (and thus a + // better candidate). + if ( + node.children.length === 1 && + isInSameBlock( node, node.firstElementChild ) && + node.firstElementChild.getAttribute( 'contenteditable' ) === 'true' + ) { + return; + } + // Not a candidate if the node is not tabbable. if ( ! focus.tabbable.isTabbableIndex( node ) ) { return false; diff --git a/packages/block-library/src/list-item/edit.js b/packages/block-library/src/list-item/edit.js index 329d541917a01..a076ee3e2e821 100644 --- a/packages/block-library/src/list-item/edit.js +++ b/packages/block-library/src/list-item/edit.js @@ -65,6 +65,7 @@ export default function ListItemEdit( { const blockProps = useBlockProps( { ref: useCopy( clientId ) } ); const innerBlocksProps = useInnerBlocksProps( blockProps, { allowedBlocks: [ 'core/list' ], + renderAppender: false, } ); const useEnterRef = useEnter( { content, clientId } ); const useSpaceRef = useSpace( clientId ); diff --git a/packages/e2e-tests/specs/editor/plugins/inner-blocks-allowed-blocks.test.js b/packages/e2e-tests/specs/editor/plugins/inner-blocks-allowed-blocks.test.js index e5e1854cc1708..3eb1ee4775f74 100644 --- a/packages/e2e-tests/specs/editor/plugins/inner-blocks-allowed-blocks.test.js +++ b/packages/e2e-tests/specs/editor/plugins/inner-blocks-allowed-blocks.test.js @@ -77,7 +77,6 @@ describe( 'Allowed Blocks Setting on InnerBlocks', () => { await insertButton.click(); // Select the list wrapper so the image is inserable. await page.keyboard.press( 'ArrowUp' ); - await page.keyboard.press( 'ArrowUp' ); await insertBlock( 'Image' ); await closeGlobalBlockInserter(); await page.waitForSelector( '.product[data-number-of-children="2"]' ); diff --git a/packages/e2e-tests/specs/editor/various/block-switcher.test.js b/packages/e2e-tests/specs/editor/various/block-switcher.test.js index d4029557e5120..6e5c192a758ad 100644 --- a/packages/e2e-tests/specs/editor/various/block-switcher.test.js +++ b/packages/e2e-tests/specs/editor/various/block-switcher.test.js @@ -19,7 +19,6 @@ describe( 'Block Switcher', () => { await insertBlock( 'List' ); await page.keyboard.type( 'List content' ); await page.keyboard.press( 'ArrowUp' ); - await page.keyboard.press( 'ArrowUp' ); await pressKeyWithModifier( 'alt', 'F10' ); // Verify the block switcher exists. @@ -47,7 +46,6 @@ describe( 'Block Switcher', () => { await insertBlock( 'List' ); await page.keyboard.type( 'List content' ); await page.keyboard.press( 'ArrowUp' ); - await page.keyboard.press( 'ArrowUp' ); await pressKeyWithModifier( 'alt', 'F10' ); // Verify the block switcher exists. @@ -81,7 +79,6 @@ describe( 'Block Switcher', () => { await insertBlock( 'List' ); await page.keyboard.type( 'List content' ); await page.keyboard.press( 'ArrowUp' ); - await page.keyboard.press( 'ArrowUp' ); await pressKeyWithModifier( 'alt', 'F10' ); // Verify the block switcher exists. @@ -96,7 +93,6 @@ describe( 'Block Switcher', () => { await insertBlock( 'List' ); await page.keyboard.type( 'List content' ); await page.keyboard.press( 'ArrowUp' ); - await page.keyboard.press( 'ArrowUp' ); await insertBlock( 'Heading' ); await page.keyboard.type( 'I am a header' ); await page.keyboard.down( 'Shift' ); @@ -110,7 +106,6 @@ describe( 'Block Switcher', () => { await insertBlock( 'List' ); await page.keyboard.type( 'List content' ); await page.keyboard.press( 'ArrowUp' ); - await page.keyboard.press( 'ArrowUp' ); await insertBlock( 'Heading' ); await page.keyboard.type( 'I am a header' ); await page.keyboard.press( 'Enter' ); diff --git a/packages/e2e-tests/specs/editor/various/splitting-merging.test.js b/packages/e2e-tests/specs/editor/various/splitting-merging.test.js index c3c47706af9c2..16dda56ccf8b5 100644 --- a/packages/e2e-tests/specs/editor/various/splitting-merging.test.js +++ b/packages/e2e-tests/specs/editor/various/splitting-merging.test.js @@ -235,7 +235,7 @@ describe( 'splitting and merging blocks', () => { await page.keyboard.type( 'item 1' ); await page.keyboard.press( 'Enter' ); await page.keyboard.type( 'item 2' ); - await pressKeyTimes( 'ArrowUp', 5 ); + await pressKeyTimes( 'ArrowUp', 3 ); await page.keyboard.press( 'Delete' ); // Carret should be in the first block and at the proper position. await page.keyboard.type( '-' ); @@ -257,7 +257,6 @@ describe( 'splitting and merging blocks', () => { await page.keyboard.press( 'Enter' ); await page.keyboard.type( 'item 2' ); await page.keyboard.press( 'ArrowUp' ); - await page.keyboard.press( 'ArrowUp' ); await pressKeyTimes( 'ArrowLeft', 6 ); await page.keyboard.press( 'Backspace' ); // Carret should be in the first block and at the proper position. diff --git a/test/e2e/specs/editor/blocks/list.spec.js b/test/e2e/specs/editor/blocks/list.spec.js index 051cf18c107aa..d014402327e15 100644 --- a/test/e2e/specs/editor/blocks/list.spec.js +++ b/test/e2e/specs/editor/blocks/list.spec.js @@ -333,7 +333,7 @@ test.describe( 'List', () => { await page.keyboard.press( 'Enter' ); await editor.clickBlockToolbarButton( 'Indent' ); await page.keyboard.type( 'two' ); - await pageUtils.pressKeyTimes( 'ArrowUp', 5 ); + await pageUtils.pressKeyTimes( 'ArrowUp', 4 ); await editor.transformBlockTo( 'core/paragraph' ); await expect.poll( editor.getEditedPostContent ).toBe( @@ -419,7 +419,6 @@ test.describe( 'List', () => { await page.keyboard.press( 'Enter' ); await page.keyboard.type( 'two' ); await page.keyboard.press( 'ArrowUp' ); - await page.keyboard.press( 'ArrowUp' ); await page.keyboard.press( 'Enter' ); await expect.poll( editor.getEditedPostContent ).toBe( @@ -493,7 +492,6 @@ test.describe( 'List', () => { await page.keyboard.press( 'Enter' ); await page.keyboard.type( 'two' ); await page.keyboard.press( 'ArrowUp' ); - await page.keyboard.press( 'ArrowUp' ); await page.keyboard.press( 'Enter' ); await page.keyboard.press( 'Enter' ); @@ -682,7 +680,7 @@ test.describe( 'List', () => { // To do: investigate why the toolbar is not showing up right after // outdenting. - await page.keyboard.press( 'ArrowUp' ); + await page.keyboard.press( 'ArrowLeft' ); await editor.clickBlockToolbarButton( 'Outdent' ); await expect.poll( editor.getEditedPostContent ).toBe( @@ -782,7 +780,6 @@ test.describe( 'List', () => { await page.keyboard.press( 'Enter' ); await page.keyboard.type( 'c' ); await page.keyboard.press( 'ArrowUp' ); - await page.keyboard.press( 'ArrowUp' ); await pageUtils.pressKeyWithModifier( 'shift', 'Enter' ); await expect.poll( editor.getEditedPostContent ).toBe( @@ -924,7 +921,7 @@ test.describe( 'List', () => { await page.keyboard.type( '* 1' ); await page.keyboard.press( 'Enter' ); await page.keyboard.type( ' a' ); - await pageUtils.pressKeyTimes( 'ArrowUp', 3 ); + await pageUtils.pressKeyTimes( 'ArrowUp', 2 ); await page.keyboard.press( 'Enter' ); // The caret should land in the second item. await page.keyboard.type( '2' ); @@ -1025,6 +1022,7 @@ test.describe( 'List', () => { // Again create a new paragraph. await page.keyboard.press( 'Enter' ); + await page.keyboard.press( 'Enter' ); // Move to the end of the list. await page.keyboard.press( 'ArrowLeft' ); @@ -1058,7 +1056,6 @@ test.describe( 'List', () => { await page.keyboard.press( 'Enter' ); await page.keyboard.type( '2' ); await page.keyboard.press( 'ArrowUp' ); - await page.keyboard.press( 'ArrowUp' ); await page.keyboard.press( 'Backspace' ); await page.keyboard.press( 'Backspace' );