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

Replace clipboard.js with native Clipboard API — second try #37810

Open
wants to merge 7 commits into
base: trunk
Choose a base branch
from

Conversation

ciampo
Copy link
Contributor

@ciampo ciampo commented Jan 9, 2022

Description

Closes #37700

This is the second attempt, after the original PR #37713 got reverted

Changes in this PR:

  • rewrite the useCopyToClipboard and the (deprecated) useCopyOnClick hooks in @wordpress/compose so that they use the native Clipboard API
  • note that the previous version had some code to handle text selection clearance and the focus management, which shouldn't be necessary when using the native Clipboard APIs
  • remove the clipboard dependency from the project's list of dependencies (saving 2.55 kB (23%) for the @wordpress/compose package)
  • add unit tests for both hooks

How has this been tested?

  • Project builds correctly
  • Test pass (including the ones added in this PR)
  • Usages of the useCopyToClipboard hook work as expected (same as production) — see screenshots below for a few examples

In particular, check that the issues flagged by @jorgefilipecosta in #37779 can't be reproduced

Screenshots

"Copy" menu item when editing any block in the editor:

copy-clipboard-refactor.mp4

"Copy URL to clipboard" button when viewing an attachment details in the media library:

image

"Copy URL" button when editing an attachment in the File block:

image

"Copy" button when reviewing a post's info after publishing it:

image

Types of changes

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • N/A I've updated all React Native files affected by any refactorings/renamings in this PR (please manually search all *.native.js files for terms that need renaming or removal).

@ciampo ciampo added [Package] Components /packages/components [Feature] Component System WordPress component system labels Jan 9, 2022
@ciampo ciampo requested a review from ajitbohra as a code owner January 9, 2022 19:02
@ciampo ciampo self-assigned this Jan 9, 2022
@ciampo ciampo changed the title Refactor/use native clipboard api try 2 Replace clipboard.js with native Clipboard API — second try Jan 9, 2022
@github-actions
Copy link

github-actions bot commented Jan 9, 2022

Size Change: -2.65 kB (0%)

Total Size: 1.13 MB

Filename Size Change
build/block-library/blocks/latest-posts/editor-rtl.css 199 B +62 B (+45%) 🚨
build/block-library/blocks/latest-posts/editor.css 198 B +61 B (+45%) 🚨
build/block-library/blocks/latest-posts/style-rtl.css 447 B -81 B (-15%) 👏
build/block-library/blocks/latest-posts/style.css 446 B -81 B (-15%) 👏
build/block-library/blocks/post-template/style-rtl.css 323 B +18 B (+6%) 🔍
build/block-library/blocks/post-template/style.css 323 B +18 B (+6%) 🔍
build/block-library/editor-rtl.css 10.1 kB +23 B (0%)
build/block-library/editor.css 10.1 kB +24 B (0%)
build/block-library/index.min.js 166 kB -3 B (0%)
build/block-library/style-rtl.css 10.8 kB -46 B (0%)
build/block-library/style.css 10.8 kB -45 B (0%)
build/compose/index.min.js 8.58 kB -2.6 kB (-23%) 🎉
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 960 B
build/admin-manifest/index.min.js 1.1 kB
build/annotations/index.min.js 2.75 kB
build/api-fetch/index.min.js 2.21 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.28 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/index.min.js 141 kB
build/block-editor/style-rtl.css 14.6 kB
build/block-editor/style.css 14.6 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 470 B
build/block-library/blocks/button/editor.css 470 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.22 kB
build/block-library/blocks/cover/style.css 1.22 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 965 B
build/block-library/blocks/gallery/editor.css 967 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.6 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 810 B
build/block-library/blocks/image/editor.css 809 B
build/block-library/blocks/image/style-rtl.css 507 B
build/block-library/blocks/image/style.css 511 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 649 B
build/block-library/blocks/navigation-link/editor.css 650 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.99 kB
build/block-library/blocks/navigation/editor.css 2 kB
build/block-library/blocks/navigation/style-rtl.css 1.85 kB
build/block-library/blocks/navigation/style.css 1.84 kB
build/block-library/blocks/navigation/view.min.js 2.81 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 402 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/style-rtl.css 446 B
build/block-library/blocks/post-comments-form/style.css 446 B
build/block-library/blocks/post-comments/style-rtl.css 521 B
build/block-library/blocks/post-comments/style.css 521 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 389 B
build/block-library/blocks/pullquote/style.css 388 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 245 B
build/block-library/blocks/separator/style.css 245 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 744 B
build/block-library/blocks/site-logo/editor.css 744 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 670 B
build/block-library/blocks/social-links/editor.css 669 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB
build/block-library/blocks/social-links/style.css 1.32 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 214 B
build/block-library/blocks/tag-cloud/style.css 215 B
build/block-library/blocks/template-part/editor-rtl.css 560 B
build/block-library/blocks/template-part/editor.css 559 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 908 B
build/block-library/common.css 905 B
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/theme-rtl.css 672 B
build/block-library/theme.css 676 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 46.4 kB
build/components/index.min.js 214 kB
build/components/style-rtl.css 15.5 kB
build/components/style.css 15.5 kB
build/core-data/index.min.js 13.3 kB
build/customize-widgets/index.min.js 11.4 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 631 B
build/data/index.min.js 7.49 kB
build/date/index.min.js 31.9 kB
build/deprecated/index.min.js 485 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.5 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 29.6 kB
build/edit-post/style-rtl.css 7.15 kB
build/edit-post/style.css 7.14 kB
build/edit-site/index.min.js 37.7 kB
build/edit-site/style-rtl.css 6.85 kB
build/edit-site/style.css 6.84 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.17 kB
build/edit-widgets/style.css 4.17 kB
build/editor/index.min.js 38.4 kB
build/editor/style-rtl.css 3.71 kB
build/editor/style.css 3.71 kB
build/element/index.min.js 3.29 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 6.58 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.63 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.75 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.8 kB
build/keycodes/index.min.js 1.39 kB
build/list-reusable-blocks/index.min.js 1.72 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 925 B
build/nux/index.min.js 2.08 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.84 kB
build/primitives/index.min.js 924 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.65 kB
build/reusable-blocks/index.min.js 2.22 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11 kB
build/server-side-render/index.min.js 1.58 kB
build/shortcode/index.min.js 1.49 kB
build/token-list/index.min.js 639 B
build/url/index.min.js 1.9 kB
build/viewport/index.min.js 1.05 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.15 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@ciampo
Copy link
Contributor Author

ciampo commented Jan 9, 2022

@jorgefilipecosta I tested again on my local machine and the "copy block" and "copy all content" buttons seem to work:

Z00ySe.mp4

Would you be able to check yourself, since you reported the issue when reverting the original PR ?

@alexstine
Copy link
Contributor

@ciampo Where in the editor can I give this a test? I'd like to quickly check it over for accessibility to ensure focus management is no longer needed. I'd say you are probably correct given how Clipboard.js works, but just want to be safe.

note that the previous version had some code to handle text selection clearance and the focus management, which shouldn't be necessary when using the native Clipboard APIs

Thanks!

@ciampo
Copy link
Contributor Author

ciampo commented Jan 10, 2022

Hey @alexstine thank you for helping out!

Where in the editor can I give this a test? I'd like to quickly check it over for accessibility to ensure focus management is no longer needed. I'd say you are probably correct given how Clipboard.js works, but just want to be safe.

The 2 main places that were reported broken when last attempting this refactor are the "Copy" and "Copy all content" buttons in the editor (you can see them being clicked in the video posted in the comment above).

You can also refer to the "Screenshots" section in this PR's description, where I've added more examples of where in Gutenberg you can tests for these changes.

Hope this helps, let me know if you need more guidance!

@alexstine
Copy link
Contributor

@ciampo A list of steps to navigate to these buttons would help. I can't see the videos/images so doesn't really help out here. Can you try to give me some context on how to find one of these buttons?

Thanks.

@ciampo
Copy link
Contributor Author

ciampo commented Jan 10, 2022

Hey @alexstine , sorry if I assumed that a video would give you enough context.

In order to navigate to the "Copy block" button:

  1. Open the block editor (for example, by adding a new post or by editing an existing post)
  2. Add a new block (for example, a paragraph)
  3. In the "Block Tools" toolbar for the selected block, click on the "Options" item to open a dropdown menu
  4. In the "Options" dropdown menu, navigate to and click the "Copy" button
  5. A toast should appear with the text "Copied Paragraph to the Clipboard" (not sure if this is announced to assistive technology)
  6. Creating a new block and pasting the clipboard's contents should successfully paste a copy of the block that was copied previously

In order to navigate to the "Copy all content" button:

  1. Open the block editor (for example, by adding a new post or by editing an existing post)
  2. Add some content to the page
  3. In the "Editor top bar"'s region, click on the "Options" button to open a dropdown menu
  4. In the "Options" dropdown menu, navigate to and click the "Copy all content" button
  5. A toast should appear with the text "All content copied" (not sure if this is announced to assistive technology)
  6. Creating a new block and pasting the clipboard's contents should successfully paste a new copy of the page's content

On a separate note, while preparing the written instructions above, I noticed that the changes in this PR work when tested locally, but seem to error when tested on a gutenberg.run staging link (in a similar fashion to @jorgefilipecosta 's initial report). I will look more into it in the next days, and try to understand what may be the cause of the failure.

@alexstine
Copy link
Contributor

@ciampo The Copy in both Options menus did not work for me. Nothing was written to the clipboard. I did find this error if it helps.

Uncaught RangeError: invalid array length

@ciampo
Copy link
Contributor Author

ciampo commented Jan 11, 2022

@ciampo The Copy in both Options menus did not work for me. Nothing was written to the clipboard. I did find this error if it helps.

Thank you for the feedback, @alexstine — it's very much appreciated. I will circle back once I have updates on the issue!

@jorgefilipecosta
Copy link
Member

Hey @alexstine , sorry if I assumed that a video would give you enough context.

In order to navigate to the "Copy block" button:

  1. Open the block editor (for example, by adding a new post or by editing an existing post)
  2. Add a new block (for example, a paragraph)
  3. In the "Block Tools" toolbar for the selected block, click on the "Options" item to open a dropdown menu
  4. In the "Options" dropdown menu, navigate to and click the "Copy" button
  5. A toast should appear with the text "Copied Paragraph to the Clipboard" (not sure if this is announced to assistive technology)
  6. Creating a new block and pasting the clipboard's contents should successfully paste a copy of the block that was copied previously

In order to navigate to the "Copy all content" button:

  1. Open the block editor (for example, by adding a new post or by editing an existing post)
  2. Add some content to the page
  3. In the "Editor top bar"'s region, click on the "Options" button to open a dropdown menu
  4. In the "Options" dropdown menu, navigate to and click the "Copy all content" button
  5. A toast should appear with the text "All content copied" (not sure if this is announced to assistive technology)
  6. Creating a new block and pasting the clipboard's contents should successfully paste a new copy of the page's content

On a separate note, while preparing the written instructions above, I noticed that the changes in this PR work when tested locally, but seem to error when tested on a gutenberg.run staging link (in a similar fashion to @jorgefilipecosta 's initial report). I will look more into it in the next days, and try to understand what may be the cause of the failure.

Hi @ciampo the issue still persists on this PR. If I press Copy all content nothing happens. The domain may be relevant I'm not using localhost or 127.0.0.1 on my development machine I use a test domain so that may explain why the issue happens for me and on gutenberg.run.

@ciampo
Copy link
Contributor Author

ciampo commented Jan 19, 2022

the issue still persists on this PR. If I press Copy all content nothing happens. The domain may be relevant I'm not using localhost or 127.0.0.1 on my development machine I use a test domain so that may explain why the issue happens for me and on gutenberg.run.

Thank you for the feedback and the potential insight, I'll take a look and update this PR once I can find a more robust solution!

@ciampo ciampo force-pushed the refactor/use-native-clipboard-api-try-2 branch from 22d5e41 to 1f268d4 Compare January 21, 2022 10:00
@ciampo
Copy link
Contributor Author

ciampo commented Jan 21, 2022

I think I've found the potential issue — the native Clipboard API is only available when in a secure context (i.e. HTTPS) (which makes sense, given that the user may copy/paste sentitive information). That's why it works on localhost but it doesn't on gutenberg.run (which is on HTTP).

I thought of 2 potential approaches:

  1. A solution here could be to add a window.isSecureContext check. Ideally, that check would happen directly in the useCopyToClipboard and useCopyOnClick hooks, and then each hook could return that value. That way, a consumer of the hook could hide/disable their copy buttons in case the check is false. The issue is that both hooks currently return a single value, and therefore we'd be introducing a breaking change.

  2. A less refined approach could be to still add the window.isSecureContext, but handle the failure internally to the hook — e.g. when the copy button is called, display an error message (via toast, or dialog...) letting the user know that the operation could not be performed.

Any thoughts?

@alexstine
Copy link
Contributor

@ciampo Possible to fallback to clipboard.js when HTTP or is the goal to completely remove? Seems like not a good idea to just break it for HTTP sites. We couldn't even test this properly on wp-env.

Just my thoughts. Thanks.

@ciampo
Copy link
Contributor Author

ciampo commented Jan 21, 2022

Hey @alexstine , thank you for sharing your thoughts — it's very appreciated!

Possible to fallback to clipboard.js when HTTP or is the goal to completely remove?

For me, the goal of this PR was to remove clipboard.js as a dependency, since all evergreen browsers now support the native Web Platform APIs. This means that we'd be shipping less code to our users, and that our implementation would be more secure and robust (coming directly from the browser, instead of relying on 3rd party code).

If we were to keep clipboard.js, then I'd argue that we may as well keep the current implementation (and abandon this PR).

We couldn't even test this properly on wp-env.

In what sense you weren't able to test properly? I was personally able to test this PR on my local machine by running npm run wp-env start and visiting http://localhost:8888 as per the docs. This should be working fine, since localhost should be treated by the browser as a local resource Edit: I meant "secure context"

Seems like not a good idea to just break it for HTTP sites.

I'm not personally up to date on this, but it would be good to know how many WordPress websites still run on HTTP instead of HTTPS? I would hope that the percentage is small (and shrinking every day).

Finally, the fact that the native APIs only work in a secure context should also make us wonder if, by currently allowing users to read/write to the clipboard while on a HTTP connection, we're not potentially exposing any sensitive information that a user may copy/paste.

@alexstine
Copy link
Contributor

@ciampo Is there a way to connect via HTTPS on wp-env? That is what I mean by not testable. I can't see if it works or not over HTTP.

I understand the reasoning for the PR. I just want to make sure this can get a fair test.

Thanks.

@noahtallen
Copy link
Member

I'm not personally up to date on this, but it would be good to know how many WordPress websites still run on HTTP instead of HTTPS? I would hope that the percentage is small (and shrinking every day).

I think this is the best path forward, in my opinion. :) I think if we need to support copy in HTTP environments, we can't move forward with this PR. If we don't, then I think option 1 would be a better approach. (Disabling the button seems better than a notice, especially if this hook is used outside of gutenberg.)

Is there a way to connect via HTTPS on wp-env

I believe it's possible, but it's not well-documented or supported, unfortunately... I haven't done it myself so I can't give much advice. It's unfortunate that gutenberg.run doesn't support HTTPS; that seems like the ideal place to test this!

@ciampo
Copy link
Contributor Author

ciampo commented Jan 24, 2022

@ciampo Is there a way to connect via HTTPS on wp-env? That is what I mean by not testable. I can't see if it works or not over HTTP.

Not sure if it's possible to test locally over HTTPS, but testing locally is possible because localhost is also a Secure Context.

I think this is the best path forward, in my opinion. :) I think if we need to support copy in HTTP environments, we can't move forward with this PR. If we don't, then I think option 1 would be a better approach. (Disabling the button seems better than a notice, especially if this hook is used outside of gutenberg.)

Yeah, I agree. To recap:

  • If supporting copy/paste on HTTP is mandatory, then we can abandon this PR
  • If we're ok with dropping copy/paste functionality on HTTP, then we can continue the exploration, with option 1 from this comment being the preferred approach (despite potentially being a breaking change).

Not sure who would be in a well-informed to help making this choice — maybe @gziolo can help?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Component System WordPress component system [Package] Components /packages/components
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Use native clipboard API instead of a 3rd party dependency
4 participants