Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Space Bar in <summary> element #24558

Closed
wants to merge 2 commits into from
Closed

Conversation

georgeh
Copy link
Contributor

@georgeh georgeh commented Aug 13, 2020

Description

This fixes an issue in Firefox where the if you create a RichText component with tagName="summary" the spacebar event won't register.

This does not address the issue where the details element opens/closes with the spacebar keyUp event. That can be handled with preventDefault() and event handlers.

How has this been tested?

This was tested in Firefox, Chrome, and Safari in #23940

Here's some example code that exposes the issue, without the change the space character won't be added to a RichText
const summaryRef = useRef( null );
const [ summaryContent, setSummary ] = useState( null );

const keyUpListener = ( e ) => {
	if ( e.keyCode === SPACE ) {
		e.preventDefault();
	}
};

const clickListener = ( e ) => e.preventDefault();

useEffect( () => {
	if ( ! summaryRef.current ) {
		return;
	}

	summaryRef.current.addEventListener( 'keyup', keyUpListener );
	summaryRef.current.addEventListener( 'click', clickListener );
	return () => {
		summaryRef.current.removeEventListener( 'keyup', keyUpListener );
		summaryRef.current.removeEventListener( 'click', clickListener );
	};
}, [ summaryRef.current ] );


return <details>
<RichText
	tagName="summary"
	value={ summaryContent }
	onChange={ setSummary }
	ref={ summaryRef }
	placeholder={ __( 'Write a summary…' ) }
/>
</details>

Types of changes

Bug fix (non-breaking change which fixes an issue)

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • My code has proper inline documentation.
  • I've updated all React Native files affected by any refactorings/renamings in this PR.

@github-actions
Copy link

github-actions bot commented Aug 13, 2020

Size Change: -475 B (0%)

Total Size: 1.16 MB

Filename Size Change
build/block-directory/index.js 7.97 kB +1 B
build/block-editor/index.js 125 kB +142 B (0%)
build/block-library/index.js 132 kB -88 B (0%)
build/components/index.js 200 kB -665 B (0%)
build/components/style-rtl.css 15.7 kB +55 B (0%)
build/components/style.css 15.7 kB +56 B (0%)
build/compose/index.js 9.68 kB +1 B
build/core-data/index.js 11.8 kB +1 B
build/data/index.js 8.56 kB +1 B
build/date/index.js 5.38 kB -1 B
build/edit-navigation/index.js 10.9 kB -3 B (0%)
build/edit-post/index.js 304 kB +1 B
build/edit-site/index.js 17 kB -7 B (0%)
build/edit-widgets/index.js 11.7 kB -1 B
build/editor/index.js 45.3 kB -3 B (0%)
build/element/index.js 4.65 kB +2 B (0%)
build/format-library/index.js 7.72 kB +2 B (0%)
build/list-reusable-blocks/index.js 3.11 kB -3 B (0%)
build/media-utils/index.js 5.33 kB -2 B (0%)
build/plugins/index.js 2.56 kB -1 B
build/rich-text/index.js 13.9 kB +39 B (0%)
build/token-list/index.js 1.27 kB -2 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.67 kB 0 B
build/api-fetch/index.js 3.44 kB 0 B
build/autop/index.js 2.82 kB 0 B
build/blob/index.js 620 B 0 B
build/block-directory/style-rtl.css 953 B 0 B
build/block-directory/style.css 952 B 0 B
build/block-editor/style-rtl.css 10.6 kB 0 B
build/block-editor/style.css 10.6 kB 0 B
build/block-library/editor-rtl.css 8.36 kB 0 B
build/block-library/editor.css 8.36 kB 0 B
build/block-library/style-rtl.css 7.49 kB 0 B
build/block-library/style.css 7.49 kB 0 B
build/block-library/theme-rtl.css 729 B 0 B
build/block-library/theme.css 730 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.1 kB 0 B
build/blocks/index.js 48.4 kB 0 B
build/data-controls/index.js 1.29 kB 0 B
build/deprecated/index.js 772 B 0 B
build/dom-ready/index.js 568 B 0 B
build/dom/index.js 3.23 kB 0 B
build/edit-navigation/style-rtl.css 1.08 kB 0 B
build/edit-navigation/style.css 1.08 kB 0 B
build/edit-post/style-rtl.css 5.63 kB 0 B
build/edit-post/style.css 5.63 kB 0 B
build/edit-site/style-rtl.css 3.06 kB 0 B
build/edit-site/style.css 3.06 kB 0 B
build/edit-widgets/style-rtl.css 2.45 kB 0 B
build/edit-widgets/style.css 2.45 kB 0 B
build/editor/editor-styles-rtl.css 537 B 0 B
build/editor/editor-styles.css 539 B 0 B
build/editor/style-rtl.css 3.8 kB 0 B
build/editor/style.css 3.79 kB 0 B
build/escape-html/index.js 733 B 0 B
build/format-library/style-rtl.css 547 B 0 B
build/format-library/style.css 548 B 0 B
build/hooks/index.js 2.13 kB 0 B
build/html-entities/index.js 621 B 0 B
build/i18n/index.js 3.56 kB 0 B
build/is-shallow-equal/index.js 711 B 0 B
build/keyboard-shortcuts/index.js 2.52 kB 0 B
build/keycodes/index.js 1.94 kB 0 B
build/list-reusable-blocks/style-rtl.css 476 B 0 B
build/list-reusable-blocks/style.css 476 B 0 B
build/notices/index.js 1.79 kB 0 B
build/nux/index.js 3.4 kB 0 B
build/nux/style-rtl.css 671 B 0 B
build/nux/style.css 668 B 0 B
build/primitives/index.js 1.41 kB 0 B
build/priority-queue/index.js 789 B 0 B
build/redux-routine/index.js 2.85 kB 0 B
build/server-side-render/index.js 2.71 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/url/index.js 4.06 kB 0 B
build/viewport/index.js 1.85 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.17 kB 0 B

compressed-size-action

@ZebulanStanphill ZebulanStanphill added [Feature] Rich Text Related to the Rich Text component that allows developers to render a contenteditable [Package] Rich text /packages/rich-text [Type] Bug An existing feature does not function as intended labels Aug 14, 2020
Co-authored-by: Zebulan Stanphill <[email protected]>
@ZebulanStanphill
Copy link
Member

This code definitely works, but I'm not sure I understand the code well enough to feel confident that it's solving it the right way. Requesting a technical review from @ellatrix.

@jasmussen jasmussen requested a review from a team September 18, 2020 07:39
@etoledom etoledom removed their request for review December 8, 2020 16:38
@@ -527,6 +527,12 @@ function RichText( {
function handleSpace( event ) {
const { keyCode, shiftKey, altKey, metaKey, ctrlKey } = event;

// Allow space characters to be typed in a <summary>.
if ( keyCode === SPACE && TagName === 'summary' ) {
handleChange( insert( createRecord(), ' ' ) );
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think RichText should be responsible for inserting characters, because this varies by keyboards and language and user settings. If the browser is blocking spaces to be inserted because of some other behaviour, the behaviour should be prevented some other way.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for looking at this! Are you saying that the fix for this issue belongs somewhere else, or that we should be smarter about the locale of the character we are inserting on line 532? I want to do it the right way, and would appreciate your help understanding what that is.

I spent a lot of time on #23940 looking for a way to fix this at the block level but couldn't get it to work without any luck. Something about the way that Firefox handles the spacebar in a <summary contenteditable> element eats the space character, so the two solutions I came up with were:

  1. Add this space inserter
  2. Make the RichText a div child of the <summary> element, which means either rendering that on the client side or having separate CSS for the editor and client

I appreciate any pointers on how to make this better, and thanks again for the feedback.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know honestly. First, since this is a problem only with the summary element, we should fix it in the block and not in rich text imo. Maybe you can prevent default the event? Not sure. If the only way is to insert the character ourselves, maybe have a look at the data property in the event and insert that data?

Base automatically changed from master to trunk March 1, 2021 15:43
@ellatrix
Copy link
Member

Fixed in #30244.

@ellatrix ellatrix closed this Aug 12, 2021
@ellatrix ellatrix deleted the fix/rich-text-summary branch August 12, 2021 15:00
@jasmussen
Copy link
Contributor

🔥

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Rich Text Related to the Rich Text component that allows developers to render a contenteditable [Package] Rich text /packages/rich-text [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants