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

Update URLPopover role and focus return #61313

Merged
merged 6 commits into from
Jul 4, 2024

Conversation

talldan
Copy link
Contributor

@talldan talldan commented May 2, 2024

What?

Fixes a few a11y things for the social links block (that I noticed when working on it recently) and media placeholders

Social Links:

  • The social links block uses a URLPopover, which didn't have a role (I think it should be role="dialog") and the opener button also didn't have aria-haspopup specified, so I've added it with the value 'dialog'.
  • The URLPopover is now labelled. I'm open to feedback on the labelling.
  • The URLPopover in the social links block doesn't return focus to the opener button when it's closed. This PR makes it do that.
  • If you press backspace too many times in the url popover, it deletes the block, which I found unusual, and it feels like a bug, so I've removed that behavior. Input should be constrained in the popover. I think this is probably a hangover from a past implementation where the URLPopover used to automatically open.

Media Placeholder (e.g. on the image block):

  • The 'Insert from URL' button had similar issues, it opens a URLPopover with no role, and there's no aria-haspopup on the opener button. This is fixed.
  • There was also a focus loss when closing the popover using escape, now fixed. Submitting causes an image to load, so that's a little trickier, I might have to draw the line on fixing that one as this PR has already spiralled. 😄
  • The URLPopover is now labelled.

Testing Instructions

(use a screenreader)

Social links

  1. Add a social links block
  2. Navigate to the 'Add block' button in the social links block and select it
  3. Add a WordPress block
  4. Arrow down until the 'WordPress' button (I noticed that this could have better labelling). It should be announced as a 'dialog pop-up button' or similar. Select it
  5. Focus should be transferred to what's now announced as a dialog
  6. Press escape or type in a url and hit enter to submit
  7. Focus should be transferred back to the button.
  8. Reopen the dialog and press delete - focus should remain in the popover and the block isn't deleted

Media placeholder

  1. Insert an image block
  2. Tab to the 'Insert from URL' button. It should be announced as a 'dialog pop-up button' or similar. Select it.
  3. Focus should be transferred to what's now announced as a dialog
  4. Press escape, focus should return back to the button

@talldan talldan added [Type] Bug An existing feature does not function as intended [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). [Feature] Media Anything that impacts the experience of managing media [Block] Social Affects the Social Block - used to display Social Media accounts labels May 2, 2024
@talldan talldan requested a review from afercia May 2, 2024 08:58
@talldan talldan self-assigned this May 2, 2024
@talldan talldan requested review from ellatrix and ajitbohra as code owners May 2, 2024 08:58
@Mamaduka
Copy link
Member

Mamaduka commented May 2, 2024

If you press backspace too many times in the url popover, it deletes the block, which I found unusual, and it feels like a bug, so I've removed that behavior. Input should be constrained in the popover. I think this is probably a hangover from a past implementation where the URLPopover used to automatically open.

The behavior was implemented in #50903.

Copy link

github-actions bot commented May 2, 2024

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: talldan <[email protected]>
Co-authored-by: ntsekouras <[email protected]>
Co-authored-by: alexstine <[email protected]>
Co-authored-by: Mamaduka <[email protected]>
Co-authored-by: afercia <[email protected]>
Co-authored-by: ciampo <[email protected]>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

Copy link

github-actions bot commented May 2, 2024

Size Change: +98 B (+0.01%)

Total Size: 1.76 MB

Filename Size Change
build/block-editor/index.min.js 252 kB -29 B (-0.01%)
build/block-library/index.min.js 219 kB +127 B (+0.06%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 951 B
build/annotations/index.min.js 2.26 kB
build/api-fetch/index.min.js 2.31 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
build/block-directory/index.min.js 7.31 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/content-rtl.css 4.58 kB
build/block-editor/content.css 4.58 kB
build/block-editor/default-editor-styles-rtl.css 394 B
build/block-editor/default-editor-styles.css 394 B
build/block-editor/style-rtl.css 15.9 kB
build/block-editor/style.css 15.9 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 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 149 B
build/block-library/blocks/audio/editor.css 151 B
build/block-library/blocks/audio/style-rtl.css 132 B
build/block-library/blocks/audio/style.css 132 B
build/block-library/blocks/audio/theme-rtl.css 134 B
build/block-library/blocks/audio/theme.css 134 B
build/block-library/blocks/avatar/editor-rtl.css 115 B
build/block-library/blocks/avatar/editor.css 115 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/button/editor-rtl.css 310 B
build/block-library/blocks/button/editor.css 310 B
build/block-library/blocks/button/style-rtl.css 538 B
build/block-library/blocks/button/style.css 538 B
build/block-library/blocks/buttons/editor-rtl.css 336 B
build/block-library/blocks/buttons/editor.css 336 B
build/block-library/blocks/buttons/style-rtl.css 328 B
build/block-library/blocks/buttons/style.css 328 B
build/block-library/blocks/calendar/style-rtl.css 240 B
build/block-library/blocks/calendar/style.css 240 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 122 B
build/block-library/blocks/code/theme.css 122 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 420 B
build/block-library/blocks/columns/style.css 420 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 124 B
build/block-library/blocks/comment-author-avatar/editor.css 124 B
build/block-library/blocks/comment-content/style-rtl.css 90 B
build/block-library/blocks/comment-content/style.css 90 B
build/block-library/blocks/comment-template/style-rtl.css 200 B
build/block-library/blocks/comment-template/style.css 199 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 221 B
build/block-library/blocks/comments-pagination/editor.css 211 B
build/block-library/blocks/comments-pagination/style-rtl.css 234 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 832 B
build/block-library/blocks/comments/editor.css 832 B
build/block-library/blocks/comments/style-rtl.css 632 B
build/block-library/blocks/comments/style.css 631 B
build/block-library/blocks/cover/editor-rtl.css 668 B
build/block-library/blocks/cover/editor.css 669 B
build/block-library/blocks/cover/style-rtl.css 1.62 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 86 B
build/block-library/blocks/details/style.css 86 B
build/block-library/blocks/embed/editor-rtl.css 314 B
build/block-library/blocks/embed/editor.css 314 B
build/block-library/blocks/embed/style-rtl.css 419 B
build/block-library/blocks/embed/style.css 419 B
build/block-library/blocks/embed/theme-rtl.css 133 B
build/block-library/blocks/embed/theme.css 133 B
build/block-library/blocks/file/editor-rtl.css 326 B
build/block-library/blocks/file/editor.css 326 B
build/block-library/blocks/file/style-rtl.css 278 B
build/block-library/blocks/file/style.css 279 B
build/block-library/blocks/file/view.min.js 324 B
build/block-library/blocks/footnotes/style-rtl.css 198 B
build/block-library/blocks/footnotes/style.css 197 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 229 B
build/block-library/blocks/form-input/style-rtl.css 342 B
build/block-library/blocks/form-input/style.css 342 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 344 B
build/block-library/blocks/form-submission-notification/editor.css 341 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/form/view.min.js 470 B
build/block-library/blocks/freeform/editor-rtl.css 2.6 kB
build/block-library/blocks/freeform/editor.css 2.6 kB
build/block-library/blocks/gallery/editor-rtl.css 958 B
build/block-library/blocks/gallery/editor.css 962 B
build/block-library/blocks/gallery/style-rtl.css 1.71 kB
build/block-library/blocks/gallery/style.css 1.71 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 402 B
build/block-library/blocks/group/editor.css 402 B
build/block-library/blocks/group/style-rtl.css 103 B
build/block-library/blocks/group/style.css 103 B
build/block-library/blocks/group/theme-rtl.css 79 B
build/block-library/blocks/group/theme.css 79 B
build/block-library/blocks/heading/style-rtl.css 188 B
build/block-library/blocks/heading/style.css 188 B
build/block-library/blocks/html/editor-rtl.css 346 B
build/block-library/blocks/html/editor.css 347 B
build/block-library/blocks/image/editor-rtl.css 845 B
build/block-library/blocks/image/editor.css 843 B
build/block-library/blocks/image/style-rtl.css 1.54 kB
build/block-library/blocks/image/style.css 1.54 kB
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/image/view.min.js 1.54 kB
build/block-library/blocks/latest-comments/style-rtl.css 355 B
build/block-library/blocks/latest-comments/style.css 354 B
build/block-library/blocks/latest-posts/editor-rtl.css 204 B
build/block-library/blocks/latest-posts/editor.css 204 B
build/block-library/blocks/latest-posts/style-rtl.css 509 B
build/block-library/blocks/latest-posts/style.css 510 B
build/block-library/blocks/list/style-rtl.css 104 B
build/block-library/blocks/list/style.css 104 B
build/block-library/blocks/media-text/editor-rtl.css 304 B
build/block-library/blocks/media-text/editor.css 303 B
build/block-library/blocks/media-text/style-rtl.css 516 B
build/block-library/blocks/media-text/style.css 515 B
build/block-library/blocks/more/editor-rtl.css 427 B
build/block-library/blocks/more/editor.css 427 B
build/block-library/blocks/navigation-link/editor-rtl.css 663 B
build/block-library/blocks/navigation-link/editor.css 664 B
build/block-library/blocks/navigation-link/style-rtl.css 192 B
build/block-library/blocks/navigation-link/style.css 191 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 295 B
build/block-library/blocks/navigation-submenu/editor.css 294 B
build/block-library/blocks/navigation/editor-rtl.css 2.2 kB
build/block-library/blocks/navigation/editor.css 2.21 kB
build/block-library/blocks/navigation/style-rtl.css 2.26 kB
build/block-library/blocks/navigation/style.css 2.25 kB
build/block-library/blocks/navigation/view.min.js 1.03 kB
build/block-library/blocks/nextpage/editor-rtl.css 392 B
build/block-library/blocks/nextpage/editor.css 392 B
build/block-library/blocks/page-list/editor-rtl.css 378 B
build/block-library/blocks/page-list/editor.css 378 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 236 B
build/block-library/blocks/paragraph/editor.css 236 B
build/block-library/blocks/paragraph/style-rtl.css 341 B
build/block-library/blocks/paragraph/style.css 340 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/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 506 B
build/block-library/blocks/post-comments-form/style.css 506 B
build/block-library/blocks/post-content/editor-rtl.css 74 B
build/block-library/blocks/post-content/editor.css 74 B
build/block-library/blocks/post-date/style-rtl.css 62 B
build/block-library/blocks/post-date/style.css 62 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 729 B
build/block-library/blocks/post-featured-image/editor.css 726 B
build/block-library/blocks/post-featured-image/style-rtl.css 341 B
build/block-library/blocks/post-featured-image/style.css 341 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 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-template/style-rtl.css 399 B
build/block-library/blocks/post-template/style.css 398 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 70 B
build/block-library/blocks/post-time-to-read/style.css 70 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 134 B
build/block-library/blocks/pullquote/editor.css 134 B
build/block-library/blocks/pullquote/style-rtl.css 342 B
build/block-library/blocks/pullquote/style.css 342 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 121 B
build/block-library/blocks/query-pagination-numbers/editor.css 118 B
build/block-library/blocks/query-pagination/editor-rtl.css 220 B
build/block-library/blocks/query-pagination/editor.css 208 B
build/block-library/blocks/query-pagination/style-rtl.css 287 B
build/block-library/blocks/query-pagination/style.css 283 B
build/block-library/blocks/query-title/style-rtl.css 64 B
build/block-library/blocks/query-title/style.css 64 B
build/block-library/blocks/query/editor-rtl.css 502 B
build/block-library/blocks/query/editor.css 502 B
build/block-library/blocks/query/view.min.js 958 B
build/block-library/blocks/quote/style-rtl.css 238 B
build/block-library/blocks/quote/style.css 238 B
build/block-library/blocks/quote/theme-rtl.css 221 B
build/block-library/blocks/quote/theme.css 225 B
build/block-library/blocks/read-more/style-rtl.css 138 B
build/block-library/blocks/read-more/style.css 138 B
build/block-library/blocks/rss/editor-rtl.css 101 B
build/block-library/blocks/rss/editor.css 101 B
build/block-library/blocks/rss/style-rtl.css 288 B
build/block-library/blocks/rss/style.css 287 B
build/block-library/blocks/search/editor-rtl.css 183 B
build/block-library/blocks/search/editor.css 183 B
build/block-library/blocks/search/style-rtl.css 672 B
build/block-library/blocks/search/style.css 671 B
build/block-library/blocks/search/theme-rtl.css 113 B
build/block-library/blocks/search/theme.css 113 B
build/block-library/blocks/search/view.min.js 475 B
build/block-library/blocks/separator/editor-rtl.css 100 B
build/block-library/blocks/separator/editor.css 100 B
build/block-library/blocks/separator/style-rtl.css 248 B
build/block-library/blocks/separator/style.css 248 B
build/block-library/blocks/separator/theme-rtl.css 195 B
build/block-library/blocks/separator/theme.css 195 B
build/block-library/blocks/shortcode/editor-rtl.css 286 B
build/block-library/blocks/shortcode/editor.css 286 B
build/block-library/blocks/site-logo/editor-rtl.css 806 B
build/block-library/blocks/site-logo/editor.css 803 B
build/block-library/blocks/site-logo/style-rtl.css 218 B
build/block-library/blocks/site-logo/style.css 218 B
build/block-library/blocks/site-tagline/editor-rtl.css 87 B
build/block-library/blocks/site-tagline/editor.css 87 B
build/block-library/blocks/site-title/editor-rtl.css 123 B
build/block-library/blocks/site-title/editor.css 123 B
build/block-library/blocks/site-title/style-rtl.css 71 B
build/block-library/blocks/site-title/style.css 71 B
build/block-library/blocks/social-link/editor-rtl.css 338 B
build/block-library/blocks/social-link/editor.css 338 B
build/block-library/blocks/social-links/editor-rtl.css 676 B
build/block-library/blocks/social-links/editor.css 675 B
build/block-library/blocks/social-links/style-rtl.css 1.51 kB
build/block-library/blocks/social-links/style.css 1.5 kB
build/block-library/blocks/spacer/editor-rtl.css 346 B
build/block-library/blocks/spacer/editor.css 346 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 394 B
build/block-library/blocks/table/editor.css 394 B
build/block-library/blocks/table/style-rtl.css 640 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 152 B
build/block-library/blocks/table/theme.css 152 B
build/block-library/blocks/tag-cloud/style-rtl.css 266 B
build/block-library/blocks/tag-cloud/style.css 265 B
build/block-library/blocks/template-part/editor-rtl.css 393 B
build/block-library/blocks/template-part/editor.css 393 B
build/block-library/blocks/template-part/theme-rtl.css 113 B
build/block-library/blocks/template-part/theme.css 113 B
build/block-library/blocks/term-description/style-rtl.css 108 B
build/block-library/blocks/term-description/style.css 108 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 165 B
build/block-library/blocks/text-columns/style.css 165 B
build/block-library/blocks/verse/style-rtl.css 98 B
build/block-library/blocks/verse/style.css 98 B
build/block-library/blocks/video/editor-rtl.css 553 B
build/block-library/blocks/video/editor.css 554 B
build/block-library/blocks/video/style-rtl.css 192 B
build/block-library/blocks/video/style.css 192 B
build/block-library/blocks/video/theme-rtl.css 134 B
build/block-library/blocks/video/theme.css 134 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.9 kB
build/block-library/editor.css 11.9 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14.6 kB
build/block-library/style.css 14.6 kB
build/block-library/theme-rtl.css 702 B
build/block-library/theme.css 707 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 52.2 kB
build/commands/index.min.js 15.2 kB
build/commands/style-rtl.css 955 B
build/commands/style.css 952 B
build/components/index.min.js 227 kB
build/components/style-rtl.css 12.1 kB
build/components/style.css 12.1 kB
build/compose/index.min.js 12.9 kB
build/core-commands/index.min.js 2.77 kB
build/core-data/index.min.js 72.6 kB
build/customize-widgets/index.min.js 10.9 kB
build/customize-widgets/style-rtl.css 1.35 kB
build/customize-widgets/style.css 1.35 kB
build/data-controls/index.min.js 641 B
build/data/index.min.js 8.98 kB
build/date/index.min.js 18 kB
build/deprecated/index.min.js 458 B
build/dom-ready/index.min.js 325 B
build/dom/index.min.js 4.65 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 580 B
build/edit-post/index.min.js 12.5 kB
build/edit-post/style-rtl.css 2.34 kB
build/edit-post/style.css 2.33 kB
build/edit-site/index.min.js 208 kB
build/edit-site/posts-rtl.css 6.51 kB
build/edit-site/posts.css 6.52 kB
build/edit-site/style-rtl.css 11.7 kB
build/edit-site/style.css 11.7 kB
build/edit-widgets/index.min.js 17.6 kB
build/edit-widgets/style-rtl.css 4.18 kB
build/edit-widgets/style.css 4.18 kB
build/editor/index.min.js 98.4 kB
build/editor/style-rtl.css 9.15 kB
build/editor/style.css 9.15 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.07 kB
build/format-library/style-rtl.css 494 B
build/format-library/style.css 493 B
build/hooks/index.min.js 1.54 kB
build/html-entities/index.min.js 445 B
build/i18n/index.min.js 3.58 kB
build/interactivity/debug.min.js 16.5 kB
build/interactivity/file.min.js 447 B
build/interactivity/image.min.js 1.68 kB
build/interactivity/index.min.js 13.4 kB
build/interactivity/navigation.min.js 1.16 kB
build/interactivity/query.min.js 742 B
build/interactivity/router.min.js 2.8 kB
build/interactivity/search.min.js 615 B
build/is-shallow-equal/index.min.js 526 B
build/keyboard-shortcuts/index.min.js 1.31 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.17 kB
build/list-reusable-blocks/style-rtl.css 846 B
build/list-reusable-blocks/style.css 846 B
build/media-utils/index.min.js 2.92 kB
build/modules/importmap-polyfill.min.js 12.3 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.58 kB
build/nux/style-rtl.css 749 B
build/nux/style.css 745 B
build/patterns/index.min.js 7.35 kB
build/patterns/style-rtl.css 687 B
build/patterns/style.css 685 B
build/plugins/index.min.js 1.81 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/index.min.js 2.9 kB
build/preferences/style-rtl.css 578 B
build/preferences/style.css 578 B
build/primitives/index.min.js 829 B
build/priority-queue/index.min.js 1.54 kB
build/private-apis/index.min.js 1.01 kB
build/react-i18n/index.min.js 630 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.76 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.73 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.1 kB
build/router/index.min.js 1.96 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 2.01 kB
build/token-list/index.min.js 581 B
build/url/index.min.js 3.85 kB
build/vendors/react-dom.min.js 42.8 kB
build/vendors/react-jsx-runtime.min.js 560 B
build/vendors/react.min.js 2.65 kB
build/viewport/index.min.js 965 B
build/warning/index.min.js 250 B
build/widgets/index.min.js 7.19 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

Copy link

github-actions bot commented May 2, 2024

Flaky tests detected in 79b16c1.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/9558372990
📝 Reported issues:

@talldan
Copy link
Contributor Author

talldan commented May 2, 2024

The behavior was implemented in #50903.

Thanks for finding that, that's quite recent, so it surprises me.

I don't think there was any inconsistency though. If anything it creates more inconistency. Try the following:

  1. Insert a buttons block
  2. Open the link popover on a button
  3. Press delete - note that the button block isn't removed

Same with other blocks that have link/url popovers.

Another inconsistency is that you can focus the button within the social link block (focusing the button inside the block is different to focusing the wrapper of the block), hit delete and nothing happens.

cc @richtabor @ntsekouras

@ntsekouras
Copy link
Contributor

I don't think there was any inconsistency though. If anything it creates more inconistency. Try the following:

  1. Insert a buttons block
  2. Open the link popover on a button
  3. Press delete - note that the button block isn't removed

I think that's a bit different because in social icons we can only have links and therefore we have to open the link popover. I think it's more comparable to pressing backspace in an empty button, which deletes the button block.. I have no strong opinions on this one, but personally I feel it fine..

Another inconsistency is that you can focus the button within the social link block (focusing the button inside the block is different to focusing the wrapper of the block), hit delete and nothing happens.

I agree that this is not ideal, but I think we should fix this, instead of removing the other behavior.

@talldan
Copy link
Contributor Author

talldan commented May 3, 2024

I think that's a bit different because in social icons we can only have links and therefore we have to open the link popover. I think it's more comparable to pressing backspace in an empty button, which deletes the button block.. I have no strong opinions on this one, but personally I feel it fine..

I disagree, but that's ok. I think I'll remove it from this PR to unblock it and we can discuss it on an issue.

To go into more detail, I don't agree that it's the same as the button block, text content is different to a url. An input within a dialog is also very different to rich text content.

When the user inserts a button block, the caret is by default within the text content and in many blocks deleting all text content results in the removal of the block, so it's an expected behavior.

For URLs in both the button and social link block, the user has to carry out a specific action to open the link dialog, clicking on a button. At this point the user understands they're in a dialog, so they would expect it to behave just like any other dialog, with all their input constrained. In no other dialog does deleting all the text remove the block.

@alexstine
Copy link
Contributor

I agree with @talldan here. Backspacing inside a dialog should not remove a block. I'm not even sure how you make a case for good UX on something like that...

@talldan
Copy link
Contributor Author

talldan commented May 3, 2024

I've split out that change into another PR, so hopefully it fully unblocks this one - #61344.

@afercia
Copy link
Contributor

afercia commented May 3, 2024

A couple questions:

  • To my understanding, the URLPopover component is planned to be replaced by the LinkControl, is that correct? Cc @richtabor
  • By adding a role="dialog" and not hiding from assistive technology the content outside the URLPopover, this will basically become a non-modal dialog. While tabbing is constrained within the URLPopover, screen reader users can exit the URLPopover by using any of the several screen reader shortcuts to navigate content e.g. to jump to headings and I think with NVDA and JAWS they can also exit the URLPopover by simply arrowing. Are we OK with this @alexstine ? It wouldn't be a 100% compliant implementation.

@alexstine
Copy link
Contributor

@afercia It tests well for me.

<div class="components-popover block-editor-url-popover is-positioned is-alternate" data-wp-c16t="true" data-wp-component="Popover" role="dialog" aria-label="Edit social link" tabindex="-1" style="position: absolute; top: 0px; left: 0px; transform: translateX(294px) translateY(186px) translateZ(0px);">

Unless aria-modal="false" is set, it gets true by default so the content outside is indeed restricted.

https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-modal

Thanks.

Copy link
Contributor

@alexstine alexstine left a comment

Choose a reason for hiding this comment

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

@talldan Giving this an approve. Do these blocks have any type of E2E tests currently? If so, might be worth adding some basic focus tests.

@afercia
Copy link
Contributor

afercia commented May 23, 2024

Unless aria-modal="false" is set, it gets true by default so the content outside is indeed restricted.

@alexstine I'm not sure that's correct. Actually, the default value of aria-modal is false. Of course, when aria-modal is entirely omitted, there's no value and that should be treated as false by screen readers.

I'm guessing the fact a dialog content is restricted anyways by some screen readers when they find a role="dialog" with no explicit aria-modal="true" set may come from some internal implementation of the screen reader, which I would argue doesn't fully follow the specification.

By checking the Accessibility tab in the Chrome dev tools, it clearly shows the value of the modal property is false in this PR. Here's the values the browser exposes:

ARIA Attributes:

  • role: dialog
  • aria-label: Edit social link

Computer Properties

  • Name: Edit social link
  • Role: dialogf
  • modal: false

Screenshot:

Screenshot 2024-05-23 at 10 56 35

As such, I still think we should make a decision on whether to add an explicit aria-modal attribute or not.

  • If we want this popover to be 'modal', then it should have an aria-modal="true' attribute.
  • Otherwise, it can be omitted but it would be best to set an explicit aria-modal="false' IMHO.

One more question: should this semantics be added also to other popovers to insert links e.g. the LinkControl component?

@alexstine
Copy link
Contributor

@afercia Yeah, it's a fair point. It looks like NVDA anyway treats role="dialog" always as a modal dialog even if you set aria-modal="false". I just can't imagine screen readers pay this too much attention though because having to manually set aria-modal="true" is not something I've seen around the web often. I guess according to the MDN link, it is indeed false by default but I misread it. Screen reader support varies though, have a look.

https://a11ysupport.io/tech/aria/aria-modal_attribute#age-of-results

I say this gets merged, doesn't look like this would hurt anything. Just not sure it really does anything at this point.

Thanks.

@afercia
Copy link
Contributor

afercia commented May 24, 2024

Screen reader support varies though, have a look.

Yes, aria-modal isn't fully supported by VoiceOver and it was even more buggy when the Modal component was implemented a few years ago. At that time, aria-modal made the content itself of the modal dialog hidden from assistive technologies. See #6261 (comment)

That is the reason why the Modal component does not use aria-modal. Instead, it uses a small helper to hide all the rest of the page by the means of aria-hidden="true".

Regardless my question is still: Do we want this Popover to be 'modal'?
In that case, using only aria-modal="true" wouldn't be sufficient.
Otherwise, if we want this URLPopover to be a non-modal dialog, it can ship as is.

I still think that making the link editing experience is important so if role="dialog" is added to this popover, it should be added to all the other similar UIs to edit links e.g. the LinkControl and others, if any.

@talldan
Copy link
Contributor Author

talldan commented Jun 18, 2024

Apologies for not following up on this one for a while. It's been a busy time. I have more time for code contributions now, so following up on some older PRs.

Do we want this Popover to be 'modal'?

While tab navigation is constrained, I don't think other parts of the UI are made inert. It seems like both aria-modal true and false would both be wrong based on the description on MDN, as it seems to require those qualities to be both true or false (https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-modal).

I personally felt that an important aspect of the PR is for the user to be aware the opener button will send focus to a popover context with constrained focus and that there affordances like escape to close the dialog, as without it I imagine it can be quite confusing. There aren't too many implementations like this across the codebase fortunately, I think the LinkControl and the color controls in the inspector are two that I can see.

For a lot of these popovers, they seem to sit in a grey area where they're closer semantically to menus, but not quite 😬

@afercia
Copy link
Contributor

afercia commented Jun 18, 2024

While tab navigation is constrained, I don't think other parts of the UI are made inert. It seems like both aria-modal true and false would both be wrong based on the description on MDN, as it seems to require those qualities to be both true or false

Not sure I follow. Disclaimer: It could be because of the 33 Celsius (91 Fahrenheit) temeprature right now in my city.

@talldan
Copy link
Contributor Author

talldan commented Jun 19, 2024

Not sure I follow. Disclaimer: It could be because of the 33 Celsius (91 Fahrenheit) temeprature right now in my city.

😅

In the MDN article it says "If a dialog is not modal — there is no inert background and focus isn't confined to the dialog — either include aria-modal="false" or omit the attribute altogether."

In the case of URLPopover, focus is confined but the background isn't inert (at least it didn't seem to be when I checked), so perhaps it doesn't meet the criteria for aria-modal being false or true. My interpretation is that popovers like URLPopover and LinkControl should be making the background inert the same way that modals do.

Perhaps it's bad wording in the MDN article, the actual spec doesn't seem to clarify exactly what aria-modal="false" means, only that aria-modal="true" requires an inert background and confined focus when focus moves automatically into the popover (https://w3c.github.io/aria/#aria-modal).

@afercia
Copy link
Contributor

afercia commented Jun 19, 2024

Thanks @talldan for clarifying. Yes that wording could be improved.
My point is that, as you also pointed out, these popovers are sort of 'mixed' behaviors as in: they do implement constrained tabbing but they aren't really 'modal'.

  • Keyboard users who don't use a screen reader are actually 'constrained' when tabbing.
  • Screen reader users are not, because screen readers provide many ways to navigate a page that is not tabbing.

So basically there's an inconsistent user experience for keyboard users and screen reader users. That is why I asked if we want to make these popovers be really 'modal' for everyone and provide a consistent experience.

@talldan
Copy link
Contributor Author

talldan commented Jun 19, 2024

I think we're on the same page, and I have the same question. I can do some research into what it would take to make them have modal like behavior. I also wonder now whether dropdown menus should also be modal too.

@alexstine
Copy link
Contributor

alexstine commented Jun 19, 2024

@talldan @afercia Let's go ahead and add aria-modal="true". There is no way with NVDA for example to navigate outside of these popovers when role="dialog" exists. Other screen readers may differ but even via special object type navigation, there is no way to access the content outside. I believe popover should contain the same ARIA support the modal component uses. It may be visually different but not different at all to assistive tech users.

The aria-modal attribute is used to indicate that the presence of a "modal" element precludes usage of other content on the page. For example, when a modal dialog is displayed, it is expected that the user's interaction is limited to the contents of the dialog, until the modal dialog loses focus or is no longer displayed.
When a modal element is displayed, assistive technologies SHOULD navigate to the element unless focus has explicitly been set elsewhere. Assistive technologies MAY limit navigation to the modal element's contents. If focus moves to an element outside the modal element, assistive technologies SHOULD NOT limit navigation to the modal element.
When a modal element is displayed, authors MUST ensure the interface can be controlled using only descendants of the modal element. In other words, if a modal dialog has a close button, the button should be a descendant of the dialog. When a modal element is displayed, authors SHOULD mark all other contents as inert (such as "inert subtrees" in HTML) if the ability to do so exists in the host language.

Worth noting, inert is not required by this attribute in the 1.2 version.

When a modal element is displayed, authors SHOULD mark all other contents as inert (such as "inert subtrees" in HTML) if the ability to do so exists in the host language.

I do not think the word "should" is equal to the word "required".

Docs: https://www.w3.org/TR/wai-aria-1.2/#aria-modal

EDIT: If we do decide to mark the content inert, let's simply copy how the modal component does this already.

Thanks.

@afercia
Copy link
Contributor

afercia commented Jun 20, 2024

EDIT: If we do decide to mark the content inert, let's simply copy how the modal component does this already.

Ideally, it would be nice to go a little further.
This entire conversation surfaces the need to have a modal behavior that can be attached to components, not only to the modal dialog. In conversations with @ciampo during the recent WordCamp Europe, I heard there are plans to make a new version of the modal dialog component that is a composite component. It would be worth considering to abstract the 'modal' logic that makes the rest of the content inert from the modal dialog component and make it availanle for use in other components. However, I think such an approach would ork only for components that are rendered a direct children of the body (e..g so called 'portals').

@talldan talldan force-pushed the fix/url-popover-role-and-focus-return branch from 79b16c1 to 4483baa Compare July 4, 2024 09:33
@ciampo
Copy link
Contributor

ciampo commented Jul 4, 2024

Thank you for the ping!

We are indeed in the process of rewriting a bunch of components (using ariakit for the underlying implementation). After reworking TabPanel (and introducing its successor, Tabs), we've been focussing on CustomSelectControl and DropdownMenu. Next up, we'll probably be looking at ComboboxControl and potentially Modal (which will likely see the introduction of a new, better-named, successor component — Dialog).
The medium-term vision is to refactor all popover-based components to use ariakit under the hood, which should bring several advantages, including better handling of modality (ariakit already offers a prop to toggle modality of its popovers) and better z-layering (without the need for hardcoded z-indexes). It will take time, because we need to make sure that the changes that we introduce are backwards (and forwards) compatible, but those are our intentions.

And bonus — here's an article that I find as a useful reference when discussing popovers, dialogs and modality: https://hidde.blog/dialog-modal-popover-differences/

@talldan
Copy link
Contributor Author

talldan commented Jul 4, 2024

I've added aria-modal="true" to URLPopover and will merge the PR 👍

@talldan talldan merged commit 2f00bfd into trunk Jul 4, 2024
61 checks passed
@talldan talldan deleted the fix/url-popover-role-and-focus-return branch July 4, 2024 10:09
@github-actions github-actions bot added this to the Gutenberg 18.8 milestone Jul 4, 2024
carstingaxion pushed a commit to carstingaxion/gutenberg that referenced this pull request Jul 18, 2024
* Return focus from URLPopover in social link block

* Fix media-placeholder focus return and aria-haspopup

* Label the URL Popover

* Adjust labelling

* Revert "Avoid deleting the block when pressing delete key one too many times in URLPopover"

This reverts commit 78a8521.

* Add `aria-modal="true"` to URLPopover

----

Co-authored-by: talldan <[email protected]>
Co-authored-by: ntsekouras <[email protected]>
Co-authored-by: alexstine <[email protected]>
Co-authored-by: Mamaduka <[email protected]>
Co-authored-by: afercia <[email protected]>
Co-authored-by: ciampo <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Social Affects the Social Block - used to display Social Media accounts [Feature] Media Anything that impacts the experience of managing media [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.

6 participants