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

List view: Refactor ARIA attributes #48461

Merged
merged 26 commits into from
Apr 14, 2023
Merged

Conversation

alexstine
Copy link
Contributor

What?

This PR attempts to remove aria-hidden="true" from the links in the list view.

Why?

This was a hack to get around block selection bugs in list view. I think I found a way to make it no longer necessary. There is a little extra screen reader verbosity, but I do not think this is a bad thing since the selection announcement will now take priority with aria-live="assertive".

How?

Changes multiple ARIA attributes and ensure speak() function gets assertive argument.

Testing Instructions

  1. Start a screen reader such as NVDA or Voiceover.
  2. Open a post or page.
  3. Insert different types of blocks and be sure to create inner blocks/child blocks.
  4. Open the list view with alt+shift+o on Windows.
  5. Notice how the screen reader still reliably reads the items.
  6. Notice how the screen reader still announces expanded/collapsed states for inner blocks on the parent.
  7. Notice how the default screen reader verbosity for links is restored.
  8. Start selecting blocks. You should hear the number of blocks selected. Still may play around with the verbosity a bit.

Testing Instructions for Keyboard

Provided above.

Screenshots or screencast

@alexstine alexstine added [Type] Enhancement A suggestion for improvement. [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). Needs Accessibility Feedback Need input from accessibility [Feature] List View Menu item in the top toolbar to select blocks from a list of links. [Package] Block editor /packages/block-editor labels Feb 26, 2023
@alexstine alexstine self-assigned this Feb 26, 2023
@github-actions
Copy link

github-actions bot commented Feb 26, 2023

Size Change: +49 B (0%)

Total Size: 1.37 MB

Filename Size Change
build/block-editor/index.min.js 203 kB -17 B (0%)
build/block-editor/style-rtl.css 14.6 kB +25 B (0%)
build/block-editor/style.css 14.6 kB +28 B (0%)
build/components/index.min.js 208 kB +13 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.11 kB
build/block-editor/content.css 4.1 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
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 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 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 124 B
build/block-library/blocks/code/theme.css 124 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 409 B
build/block-library/blocks/columns/style.css 409 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 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/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 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 649 B
build/block-library/blocks/cover/editor.css 651 B
build/block-library/blocks/cover/style-rtl.css 1.61 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details-summary/editor-rtl.css 65 B
build/block-library/blocks/details-summary/editor.css 65 B
build/block-library/blocks/details-summary/style-rtl.css 61 B
build/block-library/blocks/details-summary/style.css 61 B
build/block-library/blocks/details/style-rtl.css 54 B
build/block-library/blocks/details/style.css 54 B
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 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 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 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/file/view.min.js 353 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 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 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 654 B
build/block-library/blocks/group/editor.css 654 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 76 B
build/block-library/blocks/heading/style.css 76 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 830 B
build/block-library/blocks/image/editor.css 829 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 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 507 B
build/block-library/blocks/media-text/style.css 505 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 716 B
build/block-library/blocks/navigation-link/editor.css 715 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 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/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.21 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 B
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 401 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 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 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 501 B
build/block-library/blocks/post-comments-form/style.css 501 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 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 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 322 B
build/block-library/blocks/post-featured-image/style.css 322 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/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-template/style-rtl.css 281 B
build/block-library/blocks/post-template/style.css 281 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 69 B
build/block-library/blocks/post-time-to-read/style.css 69 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 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 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 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 463 B
build/block-library/blocks/query/editor.css 463 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 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 408 B
build/block-library/blocks/search/style.css 406 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 329 B
build/block-library/blocks/shortcode/editor.css 329 B
build/block-library/blocks/site-logo/editor-rtl.css 489 B
build/block-library/blocks/site-logo/editor.css 489 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 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 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 359 B
build/block-library/blocks/spacer/editor.css 359 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 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 404 B
build/block-library/blocks/template-part/editor.css 404 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 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.12 kB
build/block-library/common.css 1.12 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.6 kB
build/block-library/editor.css 11.6 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 204 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.8 kB
build/block-library/style.css 12.8 kB
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 51.1 kB
build/commands/index.min.js 14.8 kB
build/commands/style-rtl.css 1.1 kB
build/commands/style.css 1.09 kB
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.4 kB
build/core-data/index.min.js 16.3 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 718 B
build/data/index.min.js 8.68 kB
build/date/index.min.js 40.4 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.72 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 35 kB
build/edit-post/style-rtl.css 7.59 kB
build/edit-post/style.css 7.58 kB
build/edit-site/index.min.js 64.3 kB
build/edit-site/style-rtl.css 10.1 kB
build/edit-site/style.css 10.1 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.56 kB
build/edit-widgets/style.css 4.56 kB
build/editor/index.min.js 45.9 kB
build/editor/style-rtl.css 3.49 kB
build/editor/style.css 3.48 kB
build/element/index.min.js 4.95 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.26 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.94 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 942 B
build/react-i18n/index.min.js 702 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.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.55 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.74 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.3 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@alexstine
Copy link
Contributor Author

@afercia Can you give this one a test on Mac and provide any necessary feedback? I think this will lead to a much better experience. I also opened #48462 to help deal with the deselection bug I found.

My big concern around this was the links adding extra verbosity. I think I made it less of an issue by forcing the selection announcement to happen as assertive, but not sure if it is good enough. It would be nice if I could somehow disable the link announcement while selection is happening but I think aria-presentation will not work for links. If you check a web app such as Outlook, I do not think they use links in the list of messages for this very verbosity reason. Just not sure what else can be done to communicate to users that they can click/activate the item. Is it implied? I think maybe not.

Thanks.

@alexstine
Copy link
Contributor Author

Related PR: #39272

Maybe conditionally adding aria-hidden is an okay idea. I just cannot remember where we decided to remove the conditional attribute. I obviously did not catch it via code review I guess. Maybe it changed when @talldan was trying to get screen readers to quit switching modes on Windows? That could be likely. Then the role="application" was introduced fixing this problem since the long running NVDA bug does not appear it will be fixed ever.

Thanks.

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Thanks for the ping @alexstine! I'm happy to take your and @afercia's lead on what works best here in terms of where the aria attributes are placed in the list view. From reading this PR, my understanding is that we can remove the aria-hidden attribute by shifting most of the aria attributes to the link, so that the attributes that are announced are consolidated around the link, rather than the cell. That seems like good logic to me!

I've added a couple of questions just to make sure that I'm following along correctly. From a code perspective, the only issue I ran into is the removal of an if check that I think might still need to be there, since it was included a while back to fix a bug.

@@ -112,20 +111,13 @@ function ListViewBlock( {
level
);

let blockAriaLabel = __( 'Link' );
if ( blockInformation ) {
Copy link
Contributor

Choose a reason for hiding this comment

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

I notice that the condition to check if blockInformation is truthy has been removed. From a little digging, I think the check was added back in #38775 to deal with an issue with useSelect where it's possible that blockInformation will be null in some circumstances. So, I'm not too sure, but it might be necessary to keep the condition around. Just pinging @talldan who originally implemented the fix.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

If that is the case, please check the variable directly below this line. It was not included in this conditional and still used blockInformation to get the title for building the options aria-label.

Copy link
Contributor

Choose a reason for hiding this comment

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

In the case of the below settingsAriaLabel it's doing a check for blockInformation within its ternary before attempting to access blockInformation.title, so it didn't need to be included in the if block. For blockAriaLabel both outcomes of the ternary are accessing properties of blockInformation, so if blockInformation were to be null then an error would be thrown.

Copy link
Contributor

Choose a reason for hiding this comment

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

I'm not too sure if that check is still needed, though, but because #38775 introduced the check, it'd probaly be good to verify before removing the check.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Ah, yeah, I totally missed that sneaky conditional on that line. NVM.

@github-actions
Copy link

github-actions bot commented Feb 27, 2023

Flaky tests detected in cffe7d1.
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/4623025067
📝 Reported issues:

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Just took this for another spin. I like the idea of this change — is there anything I can do to help progress this PR?

I noticed there's a failing e2e test, and it seems we can fix it up by changing a couple of lines.

In the test should multi-select in the ListView component with shift + click we need to update this line to use the link role, and for the name to be Paragraph. For example:

		const navButtons = listView.getByRole( 'link', {
			name: 'Paragraph',
		} );

Then, further down in that test, where it checks that the third link is focused, because navButtons will be a list of links, we can remove the .getByRole call. So this line would become:

await expect( navButtons.nth( 3 ) ).toBeFocused();

Let me know if you'd like me to commit to this branch, and I can push a fix.

@alexstine alexstine added the [Package] Components /packages/components label Apr 4, 2023
Copy link
Contributor Author

@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.

@andrewserong Notes below. This is ready for another review round now that I finally fixed all the screen reader bugs.

One thing that stands out to me, the ListView has a lot of properties no longer used from the looks of it. Should create a follow-up issue to figure out if we're passing stuff around that is doing nothing. Makes the code so hard to understand what is doing what. Each iteration only makes it worse.

@afercia Would still appreciate your review on this since it is a fairly large refactor.

@@ -35,6 +35,9 @@ function ListViewBlockSelectButton(
onDragStart,
onDragEnd,
draggable,
isExpanded,
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Not sure why this component was no longer receiving this prop.

packages/block-editor/src/components/list-view/block.js Outdated Show resolved Hide resolved
@@ -277,9 +249,10 @@ function ListViewBlock( {
currentlyEditingBlockInCanvas ? 0 : tabIndex
}
onFocus={ onFocus }
isExpanded={ isExpanded }
isExpanded={ canExpand ? isExpanded : undefined }
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Changed to match the others.

@@ -144,7 +144,7 @@ export default function useBlockSelection() {
}

if ( label ) {
speak( label );
speak( label, 'assertive' );
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Unrelated to this PR but this required a fix.

@@ -28,7 +29,7 @@ function UnforwardedTreeGridRow(
aria-level={ level }
aria-posinset={ positionInSet }
aria-setsize={ setSize }
aria-expanded={ isExpanded }
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is the best area to explain this. The reason why this needs to exist is as follows.

  1. If aria-expanded exists on the tr and the link, it is announced twice when it is toggled.
  2. If it only exists on the row, it is announced when toggled but not after that.
  3. If it exists on the link only, it works fine when toggled and after.
  4. Had to figure out how to eliminate it off the tr.
  5. The better way about this may be to add data-expanded directly here and pass the value from the ListView. Something like this.
aria-expanded={ disableAriaExpanded ? undefined : isExpanded }
data-expanded={ disableAriaExpanded ? isExpanded : undefined }

One of these attributes is required for the keyboard functionality. Not pretty, but it works.

@alexstine
Copy link
Contributor Author

@andrewserong Added a fallback for the possible title bug.

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Thanks for all the updates @alexstine and for refining this PR! From a code quality standpoint, I think this is in a good place to land 👍

Nice work tidying up the use of blockTitle, too, and overall I like the way this PR now uses the data-expanded attribute for the styling rules and as a fallback within the tree grid component. I think that creates a useful bit of separation between the data we're passing around for behaviour and styling, and where we deliberately flag values for accessibility.

In terms of accessibility, the removal of aria-hidden and moving the label, description, and expanded values to the button level all sound good to me.

You might like to get another review, too, before landing, but I've retested that the list view is still working the same as on trunk via keyboard and mouse. I'll be AFK until mid-next week, but if there's any more follow-up, I'm happy to help out then.

LGTM, and great work again! ✨

@annezazu
Copy link
Contributor

annezazu commented Apr 6, 2023

@getdave @scruffian I see you have some recent PRs working on list view. Mind giving this a review as well?

@andrewserong andrewserong requested a review from a team April 14, 2023 04:31
@andrewserong
Copy link
Contributor

I think this would be a good PR to get in. I've just added a wider ping in case we can get some extra eyes on it. I notice there's a branch conflict with packages/components/CHANGELOG.md, but otherwise all the other changes appears to be up to date.

@alexstine
Copy link
Contributor Author

I can refresh it soon. Just can be really aggravating at times. Seems like people try to avoid reviewing my PRs excluding @andrewserong of course. 👍 I am fairly certain this will be a decent change for screen reader UX but getting any further testing time seems to be near impossible. Even mentioned it in a meeting.

@andrewserong
Copy link
Contributor

Thanks for the update, Alex! I think once the changelog is updated, it might be worth us trying out merging the PR, if we don't hear back from anyone. Sometimes folks might be cautious about reviewing a particular area of the code base if they aren't too familiar with it. Once the PR's merged, if there's any pushback or follow-up issues, I'm happy to help debug or revert if need be, in case that helps us get this one over the line!

I'm wrapping up for the week now, but can jump back in to help next week. Thanks again for all your work improving the accessibility here.

@alexstine alexstine merged commit 6f96394 into trunk Apr 14, 2023
@alexstine alexstine deleted the update/list-view-aria-attributes branch April 14, 2023 16:05
@github-actions github-actions bot added this to the Gutenberg 15.7 milestone Apr 14, 2023
@alexstine
Copy link
Contributor Author

Merged. We can make follow-ups if necessary. Next task, migrate this work to the other editors. 👍

@joedolson
Copy link
Contributor

This works well in NVDA for me; and it's a significant improvement in JAWS.

@getdave
Copy link
Contributor

getdave commented Apr 17, 2023

@getdave @scruffian I see you have some recent PRs working on list view. Mind giving this a review as well?

@alexstine Apologies I couldn't get to this as I was AFK

@ciampo
Copy link
Contributor

ciampo commented Apr 27, 2023

Apologies @alexstine for the delay in the review — I haven't been able to contribute to Gutenberg for a couple of weeks, and I'm slowly catching up.

Just can be really aggravating at times. Seems like people try to avoid reviewing my PRs

As Andrew also mentioned, not everyone may be comfortable reviewing this part of the repository and/or have valuable feedback on this particular feature — although I can guarantee you that no one is trying to avoid reviewing your PRs. I also wanted to express again my gratitude for the work that you, @joedolson and other folks do daily for improving the accessibility of this project.

@ciampo
Copy link
Contributor

ciampo commented Apr 27, 2023

To fix this, I added the following CSS to list-view/style.scss from line 18 (just inside .block-editor-list-view-leaf):

@andrewserong , do you think we could look for an alternative approach here? We shouldn't really be using internal component's classnames.

Could we find a way to improve the Button component to support better this usecase? Or at lease, could we pass a new classname to Button specific for this scenario, and use it to add those styles?

@alexstine
Copy link
Contributor Author

@ciampo Understood but it can be very hard to move these things forward without feedback. There will be much bigger, much messier changes to come so I hope when that time is here, I will see a little more community involvement. I got the accessibility part covered but I am very new to React and never totally sure that I am doing things the correct way. This is a learning experience for all of us.

Hope you enjoyed your time away, we all need that for sure. 👍

@andrewserong
Copy link
Contributor

@andrewserong , do you think we could look for an alternative approach here? We shouldn't really be using internal component's classnames. ... Or at lease, could we pass a new classname to Button specific for this scenario, and use it to add those styles?

Oh, good idea! Yes, I'm happy to open up a quick follow-up PR, we should be able to use the block-editor-list-view-block-select-button classname instead. The list view's styling requirements are slightly different to the Button component's so for now, I think it probably makes sense to keep this rule within the List View.

I haven't been able to contribute to Gutenberg for a couple of weeks, and I'm slowly catching up.

No worries @ciampo, and thanks for following up — it's never too late for good feedback! 🙂

@andrewserong
Copy link
Contributor

I have a tiny PR in #50155 to swap out the usage of components-button that this PR introduced — I haven't swapped out the other earlier usages of that classname just yet, as that'd take a little longer to figure out since the rules predate this PR, but I'm happy to dig into that separately.

@ciampo
Copy link
Contributor

ciampo commented Apr 28, 2023

I have a tiny PR in #50155 to swap out the usage of components-button that this PR introduced

Thank you! I'll take a look :)

I haven't swapped out the other earlier usages of that classname just yet, as that'd take a little longer to figure out since the rules predate this PR, but I'm happy to dig into that separately.

That makes a lot of sense. It would be great if you managed to work on that at some point, but no immediate rush :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] List View Menu item in the top toolbar to select blocks from a list of links. [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). Needs Accessibility Feedback Need input from accessibility [Package] Block editor /packages/block-editor [Package] Components /packages/components [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants