From d95ef3ccbdebaf3532f39f23c4668b12e60c5e28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ella=20van=C2=A0Durpe?= <4710635+ellatrix@users.noreply.github.com> Date: Wed, 14 Jul 2021 20:18:08 +0300 Subject: [PATCH 01/13] Rich text: run input rules after composition end (#33416) --- .../components/rich-text/use-input-rules.js | 6 ++++-- .../__snapshots__/rich-text.test.js.snap | 6 ++++++ .../specs/editor/various/rich-text.test.js | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/packages/block-editor/src/components/rich-text/use-input-rules.js b/packages/block-editor/src/components/rich-text/use-input-rules.js index 8715960ba32f44..7e770d5f55ac90 100644 --- a/packages/block-editor/src/components/rich-text/use-input-rules.js +++ b/packages/block-editor/src/components/rich-text/use-input-rules.js @@ -60,7 +60,7 @@ export function useInputRules( props ) { } function onInput( event ) { - const { inputType } = event; + const { inputType, type } = event; const { value, onChange, @@ -69,7 +69,7 @@ export function useInputRules( props ) { } = propsRef.current; // Only run input rules when inserting text. - if ( inputType !== 'insertText' ) { + if ( inputType !== 'insertText' && type !== 'compositionend' ) { return; } @@ -99,8 +99,10 @@ export function useInputRules( props ) { } element.addEventListener( 'input', onInput ); + element.addEventListener( 'compositionend', onInput ); return () => { element.removeEventListener( 'input', onInput ); + element.removeEventListener( 'compositionend', onInput ); }; }, [] ); } diff --git a/packages/e2e-tests/specs/editor/various/__snapshots__/rich-text.test.js.snap b/packages/e2e-tests/specs/editor/various/__snapshots__/rich-text.test.js.snap index 873b1e305b39b3..bb3517f9c28324 100644 --- a/packages/e2e-tests/specs/editor/various/__snapshots__/rich-text.test.js.snap +++ b/packages/e2e-tests/specs/editor/various/__snapshots__/rich-text.test.js.snap @@ -110,6 +110,12 @@ exports[`RichText should return focus when pressing formatting button 1`] = ` " `; +exports[`RichText should run input rules after composition end 1`] = ` +" +
a
a
diff --git a/packages/e2e-tests/specs/editor/various/rich-text.test.js b/packages/e2e-tests/specs/editor/various/rich-text.test.js index 39e38297d5bdee..33e0bc64317efd 100644 --- a/packages/e2e-tests/specs/editor/various/rich-text.test.js +++ b/packages/e2e-tests/specs/editor/various/rich-text.test.js @@ -451,4 +451,23 @@ describe( 'RichText', () => { await page.keyboard.press( 'ArrowLeft' ); expect( await page.$( blockToolbarSelector ) ).toBe( null ); } ); + + it( 'should run input rules after composition end', async () => { + await clickBlockAppender(); + // Puppeteer doesn't support composition, so emulate it by inserting + // text in the DOM directly, setting selection in the right place, and + // firing `compositionend`. + // See https://github.com/puppeteer/puppeteer/issues/4981. + await page.evaluate( () => { + document.activeElement.textContent = '`a`'; + const selection = window.getSelection(); + selection.selectAllChildren( document.activeElement ); + selection.collapseToEnd(); + document.activeElement.dispatchEvent( + new CompositionEvent( 'compositionend' ) + ); + } ); + + expect( await getEditedPostContent() ).toMatchSnapshot(); + } ); } ); From 1c2092339426e116da9d227ac525f1d03cd896b5 Mon Sep 17 00:00:00 2001 From: George Mamadashvili1
+ + + +2
+" +`; + +exports[`Multi-block selection should select all from empty selection 2`] = `""`; + exports[`Multi-block selection should set attributes for multiple paragraphs 1`] = ` "1
diff --git a/packages/e2e-tests/specs/editor/various/multi-block-selection.test.js b/packages/e2e-tests/specs/editor/various/multi-block-selection.test.js index 8eef794c3f5a8a..fded2c6d7e9146 100644 --- a/packages/e2e-tests/specs/editor/various/multi-block-selection.test.js +++ b/packages/e2e-tests/specs/editor/various/multi-block-selection.test.js @@ -636,4 +636,27 @@ describe( 'Multi-block selection', () => { '[data-type="core/paragraph"].is-multi-selected' ); } ); + + it( 'should select all from empty selection', async () => { + await clickBlockAppender(); + + await page.keyboard.type( '1' ); + await page.keyboard.press( 'Enter' ); + await page.keyboard.type( '2' ); + + // Confirm setup. + expect( await getEditedPostContent() ).toMatchSnapshot(); + + // Clear the selected block. + const paragraph = await page.$( '[data-type="core/paragraph"]' ); + const box = await paragraph.boundingBox(); + await page.mouse.click( box.x - 1, box.y ); + + await pressKeyWithModifier( 'primary', 'a' ); + + await page.keyboard.press( 'Backspace' ); + + // Expect both paragraphs to be deleted. + expect( await getEditedPostContent() ).toMatchSnapshot(); + } ); } ); diff --git a/packages/edit-post/src/components/visual-editor/index.js b/packages/edit-post/src/components/visual-editor/index.js index c8f6898ffaed7e..9718bbaad697a4 100644 --- a/packages/edit-post/src/components/visual-editor/index.js +++ b/packages/edit-post/src/components/visual-editor/index.js @@ -57,13 +57,14 @@ function MaybeIframe( { return ( <>' . get_the_excerpt( $block->context['postId'] ); - if ( ! isset( $attributes['showMoreOnNewLine'] ) || $attributes['showMoreOnNewLine'] ) { + $content = '
' . get_the_excerpt( $block->context['postId'] ); + $show_more_on_new_line = ! isset( $attributes['showMoreOnNewLine'] ) || $attributes['showMoreOnNewLine']; + if ( $show_more_on_new_line && ! empty( $more_text ) ) { $content .= '
' . $more_text . '
'; } else { $content .= " $more_text"; } - - remove_filter( - 'excerpt_length', - $filter_excerpt_length - ); - + remove_filter( 'excerpt_more', $filter_excerpt_more ); return sprintf( '