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 Copy block button focus loss and try to remove the visually hidden textarea #24022

Merged
merged 2 commits into from
Jul 20, 2020

Conversation

afercia
Copy link
Contributor

@afercia afercia commented Jul 17, 2020

closes #23994

Description

This PR seeks to solve two issues with the Clipboard.js-powered "Copy" block button.

  1. Focus loss when pressing the button
  2. The visually hidden textarea used by Clipboard.js is added within the button and stays there: thus, there's an additional, unexpected, tab stop and the textarea is announced by screen readers

For more details, please see the related issue #23994

Notes

These behaviors are Clipboard.js bugs (or "features") that produce a sub-optimal experience for keyboard users and assistive technology users.

While working on recent changes in WordPress core I stumbled upon the same issues. See:
https://core.trac.wordpress.org/changeset/48233
https://core.trac.wordpress.org/changeset/48232

I also reported these two issues upstream:
zenorocha/clipboard.js#680
zenorocha/clipboard.js#684

In the meantime, I guess they can be fixed in our implementation.

1
The focus loss is fixed by explicitly setting the focus back on the button. See also similar fixes used in the core changesets linked above.

2
I'd greatly appreciate some help to fix the second issue.
Ideally, the visually hidden textarea should be removed on the copy action success. This is why I fixed it in core. Worth noting Clipboard.js re-adds the textarea at any click so removing it on success looks safe.

However, I couldn't find a nice way to use the fix used in core also in useCopyOnClick.

As far as I see, clipboard.current.destroy(); is used in the useEffect cleanup but that's not enough.
It should be called on success. I couldn't find a way to make it work other than adding one more timeout which I guess isn't ideal. Any help would be greatly appreciated.

@afercia afercia added the [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). label Jul 17, 2020
@afercia
Copy link
Contributor Author

afercia commented Jul 17, 2020

Fixes #23994

@github-actions
Copy link

Size Change: +12 B (0%)

Total Size: 1.15 MB

Filename Size Change
build/compose/index.min.js 9.68 kB +12 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.min.js 1.14 kB 0 B
build/annotations/index.min.js 3.67 kB 0 B
build/api-fetch/index.min.js 3.43 kB 0 B
build/autop/index.min.js 2.82 kB 0 B
build/blob/index.min.js 620 B 0 B
build/block-directory/index.min.js 7.63 kB 0 B
build/block-directory/style-rtl.css 944 B 0 B
build/block-directory/style.css 945 B 0 B
build/block-editor/index.min.js 125 kB 0 B
build/block-editor/style-rtl.css 10.8 kB 0 B
build/block-editor/style.css 10.8 kB 0 B
build/block-library/editor-rtl.css 7.58 kB 0 B
build/block-library/editor.css 7.57 kB 0 B
build/block-library/index.min.js 132 kB 0 B
build/block-library/style-rtl.css 7.77 kB 0 B
build/block-library/style.css 7.77 kB 0 B
build/block-library/theme-rtl.css 728 B 0 B
build/block-library/theme.css 729 B 0 B
build/block-serialization-default-parser/index.min.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.min.js 3.1 kB 0 B
build/blocks/index.min.js 48.3 kB 0 B
build/components/index.min.js 200 kB 0 B
build/components/style-rtl.css 15.6 kB 0 B
build/components/style.css 15.6 kB 0 B
build/core-data/index.min.js 11.5 kB 0 B
build/data-controls/index.min.js 1.29 kB 0 B
build/data/index.min.js 8.45 kB 0 B
build/date/index.min.js 5.38 kB 0 B
build/deprecated/index.min.js 772 B 0 B
build/dom-ready/index.min.js 568 B 0 B
build/dom/index.min.js 3.23 kB 0 B
build/edit-navigation/index.min.js 10.8 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/index.min.js 304 kB 0 B
build/edit-post/style-rtl.css 5.61 kB 0 B
build/edit-post/style.css 5.61 kB 0 B
build/edit-site/index.min.js 16.8 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/index.min.js 9.35 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/index.min.js 45.2 kB 0 B
build/editor/style-rtl.css 3.78 kB 0 B
build/editor/style.css 3.78 kB 0 B
build/element/index.min.js 4.65 kB 0 B
build/escape-html/index.min.js 733 B 0 B
build/format-library/index.min.js 7.72 kB 0 B
build/format-library/style-rtl.css 547 B 0 B
build/format-library/style.css 548 B 0 B
build/hooks/index.min.js 2.13 kB 0 B
build/html-entities/index.min.js 621 B 0 B
build/i18n/index.min.js 3.56 kB 0 B
build/is-shallow-equal/index.min.js 711 B 0 B
build/keyboard-shortcuts/index.min.js 2.51 kB 0 B
build/keycodes/index.min.js 1.94 kB 0 B
build/list-reusable-blocks/index.min.js 3.12 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/media-utils/index.min.js 5.32 kB 0 B
build/notices/index.min.js 1.79 kB 0 B
build/nux/index.min.js 3.4 kB 0 B
build/nux/style-rtl.css 671 B 0 B
build/nux/style.css 668 B 0 B
build/plugins/index.min.js 2.56 kB 0 B
build/primitives/index.min.js 1.4 kB 0 B
build/priority-queue/index.min.js 789 B 0 B
build/redux-routine/index.min.js 2.85 kB 0 B
build/rich-text/index.min.js 13.9 kB 0 B
build/server-side-render/index.min.js 2.71 kB 0 B
build/shortcode/index.min.js 1.7 kB 0 B
build/token-list/index.min.js 1.27 kB 0 B
build/url/index.min.js 4.06 kB 0 B
build/viewport/index.min.js 1.85 kB 0 B
build/warning/index.min.js 1.14 kB 0 B
build/wordcount/index.min.js 1.17 kB 0 B

compressed-size-action

@ZebulanStanphill ZebulanStanphill added [a11y] Keyboard & Focus [Type] Bug An existing feature does not function as intended labels Jul 17, 2020
@afercia
Copy link
Contributor Author

afercia commented Jul 18, 2020

To clarify: I did try to call clipboard.current.destroy() in the success callback but that doesn't seem to work unless using a setTimeout().

@afercia
Copy link
Contributor Author

afercia commented Jul 18, 2020

Question:
Is there the need to add the visually hidden textarea within the button in the first place? See:
container: ref.current,

Now that the implementation is based on useEffect, seems to me it would be safe to remove container: ref.current, and let Clipboard.js append the visually hidden textarea to the body. I tested it a bit and seems to me this way the textarea is removed after copying. Also, the useEffect cleanup makes sure the textarea is removed when the component unmounts, correct? Am I missing something?

Pinging @ellatrix and @gziolo as I saw you worked on this bit of code.

@youknowriad youknowriad added the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Jul 20, 2020
Copy link
Contributor

@youknowriad youknowriad left a comment

Choose a reason for hiding this comment

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

This fix is looking good for me. I don't know about the other suggestion. Hopefully, someone will chime in.

@youknowriad youknowriad merged commit f1915cb into master Jul 20, 2020
@youknowriad youknowriad deleted the fix/copy-block-button-focus-loss branch July 20, 2020 14:34
@github-actions github-actions bot added this to the Gutenberg 8.6 milestone Jul 20, 2020
@ellatrix
Copy link
Member

@afercia Could you open a separate issue with the remaining problems? The clipboard is removed after unmount, yes.

@afercia
Copy link
Contributor Author

afercia commented Jul 20, 2020

I can open a separate issue, but that requires time. My time is very, very, limited. I'd appreciate if next time an issue gets closed when all the problems reported are actually fixed...

@ellatrix
Copy link
Member

@afercia So is everyone's...

@afercia
Copy link
Contributor Author

afercia commented Jul 21, 2020

I just wanted to note that closing issues and merging PRs that don't fully solve the reported bugs don't help in spending our time in the best way.

@youknowriad youknowriad removed the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Jul 22, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

The new "copy block" action triggers a focus loss
4 participants