Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Fix Image block lightbox missing alt attribute and improve accessibility #55010

Merged
merged 15 commits into from
Oct 6, 2023

Conversation

afercia
Copy link
Contributor

@afercia afercia commented Oct 3, 2023

Addresses part of the issues from #54971

What?

  • Fixes retrieval of the image alt attribute.
  • Move the button to open the Lightboz after the image.
  • Better labelling for the Lightbox modal dialog: it must describe the dialog purpose, not the image itself.
  • Removes aria-hidden from the closed modal dialog. This appears to be redundant as the closed modal dialog is already hidden from assistiv technology by the means of the visibility: hidden CSS property.
  • Sets the aria-modal attribute dynamically instead of hardcoding on hte PHP side. This is also consistent with similar code in the navigation block.
  • Sets the aria-label attribute dynamically.
  • Increases the target size of the modal dialog Close button to be at least 40 by 40 pixels.
  • Avoids to render an empty role="" attribute.
  • Avoids to render an empty src="" attribute. A small base64 encoded gif is now used as 'placeholder' for the enlarged image.
  • Minor docblocks improvements.

Why?

  • The retrieval of the image alt attribute to be added to the button to open the modal dialog was broken. Adding context to the button helps screen reader users understand what the button is about.
  • Gaving the button before the image was not ideal for users who perceive content in a linearized way.
  • The modal dialog labelling was set to the image alt text (if any) or the string 'Image' otherwise. This wasn not ideal, as the modal dialog labelling must explaiin what the dialog is about and not describe the image.
  • Rendering incorrect or unnecessary aria=* attributes and role whren the modal dialog is closed is either invalid HTML or not ideal.
  • The target size od the close button was really too small and dependent on inherited styles.

How?

See description above.

Testing Instructions

  • Create a post and add two images: one with alt attribute and the other one without.
  • Set both images to open in the Ligthbox.
  • Publish and see the front end.
  • Inspect the source and make sure the button to open the modal dialog is labelled:
    • Enlarge image for the image without alt attribute.
    • Enlarge image: {image alt text here} for the image with alt attribute.
  • Observe the button to open the modal dialog is now after the image in the DOM order.
  • Open the modal dialog and observe the dialog is labelled Enlarged image.
  • Observe the X close button size is not at least 40 by 40 pixels.

Additionally:

  • After first page load and when the modal dialog is still closed, observe the modal dialog markup:
    • Does not have a role attribute.
    • Does not have an aria-modal attribute.
    • Does not have an aria-hidden attribute.
    • Does not have an aria-label attribute.
    • The src attribute of the enlarged image is a base64 encoded image.
  • Open the modal dialog and observe that the dialog markup:
    • Does have a role="dialog" attribute.
    • Does have an aria-modal="true" attribute.
    • Does not have an aria-hidden attribute.
    • Does have an aria-label="Enlarged image" attribute.
    • The src attribute of the enlarged image is now the one of the actual enlarged image.

Testing Instructions for Keyboard

Screenshots or screencast

@afercia afercia 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). [Block] Image Affects the Image Block labels Oct 3, 2023
@github-actions
Copy link

github-actions bot commented Oct 3, 2023

This pull request has changed or added PHP files. Please confirm whether these changes need to be synced to WordPress Core, and therefore featured in the next release of WordPress.

If so, it is recommended to create a new Trac ticket and submit a pull request to the WordPress Core Github repository soon after this pull request is merged.

If you're unsure, you can always ask for help in the #core-editor channel in WordPress Slack.

Thank you! ❤️

View changed files
❔ lib/block-supports/behaviors.php
❔ lib/load.php

@gziolo gziolo added the [Feature] Interactivity API API to add frontend interactivity to blocks. label Oct 3, 2023
@github-actions
Copy link

github-actions bot commented Oct 3, 2023

Size Change: +343 B (0%)

Total Size: 1.65 MB

Filename Size Change
build/block-library/blocks/image/style-rtl.css 1.48 kB +35 B (+2%)
build/block-library/blocks/image/style.css 1.47 kB +34 B (+2%)
build/block-library/blocks/image/view.min.js 1.91 kB +73 B (+4%)
build/block-library/index.min.js 211 kB +3 B (0%)
build/block-library/style-rtl.css 14.4 kB +24 B (0%)
build/block-library/style.css 14.4 kB +22 B (0%)
build/components/index.min.js 248 kB +97 B (0%)
build/core-data/index.min.js 70.6 kB +25 B (0%)
build/edit-site/index.min.js 203 kB +30 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 964 B
build/annotations/index.min.js 2.71 kB
build/api-fetch/index.min.js 2.29 kB
build/autop/index.min.js 2.11 kB
build/blob/index.min.js 461 B
build/block-directory/index.min.js 7.07 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.28 kB
build/block-editor/content.css 4.27 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-editor/index.min.js 218 kB
build/block-editor/style-rtl.css 15.6 kB
build/block-editor/style.css 15.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 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 104 B
build/block-library/blocks/avatar/style.css 104 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 633 B
build/block-library/blocks/button/style.css 632 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 421 B
build/block-library/blocks/columns/style.css 421 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 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.7 kB
build/block-library/blocks/cover/style.css 1.69 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 98 B
build/block-library/blocks/details/style.css 98 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 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 311 B
build/block-library/blocks/file/style.css 312 B
build/block-library/blocks/file/view.min.js 321 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 228 B
build/block-library/blocks/form-input/style-rtl.css 343 B
build/block-library/blocks/form-input/style.css 343 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 343 B
build/block-library/blocks/form-submission-notification/editor.css 342 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 452 B
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 957 B
build/block-library/blocks/gallery/editor.css 962 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 189 B
build/block-library/blocks/heading/style.css 189 B
build/block-library/blocks/html/editor-rtl.css 340 B
build/block-library/blocks/html/editor.css 341 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 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 505 B
build/block-library/blocks/media-text/style.css 503 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 671 B
build/block-library/blocks/navigation-link/editor.css 672 B
build/block-library/blocks/navigation-link/style-rtl.css 103 B
build/block-library/blocks/navigation-link/style.css 103 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.26 kB
build/block-library/blocks/navigation/editor.css 2.26 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.01 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 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 235 B
build/block-library/blocks/paragraph/editor.css 235 B
build/block-library/blocks/paragraph/style-rtl.css 335 B
build/block-library/blocks/paragraph/style.css 335 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 508 B
build/block-library/blocks/post-comments-form/style.css 508 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 345 B
build/block-library/blocks/post-featured-image/style.css 345 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 409 B
build/block-library/blocks/post-template/style.css 408 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 125 B
build/block-library/blocks/preformatted/style.css 125 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 168 B
build/block-library/blocks/pullquote/theme.css 168 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 486 B
build/block-library/blocks/query/editor.css 486 B
build/block-library/blocks/query/style-rtl.css 375 B
build/block-library/blocks/query/style.css 372 B
build/block-library/blocks/query/view.min.js 609 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 184 B
build/block-library/blocks/search/editor.css 184 B
build/block-library/blocks/search/style-rtl.css 613 B
build/block-library/blocks/search/style.css 613 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 471 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 760 B
build/block-library/blocks/site-logo/editor.css 760 B
build/block-library/blocks/site-logo/style-rtl.css 204 B
build/block-library/blocks/site-logo/style.css 204 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 682 B
build/block-library/blocks/social-links/editor.css 681 B
build/block-library/blocks/social-links/style-rtl.css 1.45 kB
build/block-library/blocks/social-links/style.css 1.45 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 432 B
build/block-library/blocks/table/editor.css 432 B
build/block-library/blocks/table/style-rtl.css 646 B
build/block-library/blocks/table/style.css 645 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 403 B
build/block-library/blocks/template-part/editor.css 403 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/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 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 191 B
build/block-library/blocks/video/style.css 191 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.11 kB
build/block-library/common.css 1.11 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12.4 kB
build/block-library/editor.css 12.4 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/theme-rtl.css 700 B
build/block-library/theme.css 705 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51.5 kB
build/commands/index.min.js 15.5 kB
build/commands/style-rtl.css 947 B
build/commands/style.css 942 B
build/components/style-rtl.css 11.9 kB
build/components/style.css 11.9 kB
build/compose/index.min.js 12.7 kB
build/core-commands/index.min.js 2.72 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.51 kB
build/customize-widgets/style.css 1.5 kB
build/data-controls/index.min.js 651 B
build/data/index.min.js 8.78 kB
build/date/index.min.js 17.9 kB
build/deprecated/index.min.js 462 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.68 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 35.6 kB
build/edit-post/style-rtl.css 7.89 kB
build/edit-post/style.css 7.88 kB
build/edit-site/style-rtl.css 14.1 kB
build/edit-site/style.css 14.1 kB
build/edit-widgets/index.min.js 17 kB
build/edit-widgets/style-rtl.css 4.84 kB
build/edit-widgets/style.css 4.84 kB
build/editor/index.min.js 45.9 kB
build/editor/style-rtl.css 3.58 kB
build/editor/style.css 3.58 kB
build/element/index.min.js 4.87 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.79 kB
build/format-library/style-rtl.css 577 B
build/format-library/style.css 577 B
build/hooks/index.min.js 1.57 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.61 kB
build/interactivity/index.min.js 11.4 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.76 kB
build/keycodes/index.min.js 1.9 kB
build/list-reusable-blocks/index.min.js 2.21 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.92 kB
build/notices/index.min.js 964 B
build/nux/index.min.js 2.01 kB
build/nux/style-rtl.css 775 B
build/nux/style.css 771 B
build/patterns/index.min.js 3.57 kB
build/patterns/style-rtl.css 325 B
build/patterns/style.css 325 B
build/plugins/index.min.js 1.81 kB
build/preferences-persistence/index.min.js 1.85 kB
build/preferences/index.min.js 1.26 kB
build/primitives/index.min.js 994 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 972 B
build/react-i18n/index.min.js 631 B
build/react-refresh-entry/index.min.js 9.46 kB
build/react-refresh-runtime/index.min.js 6.78 kB
build/redux-routine/index.min.js 2.71 kB
build/reusable-blocks/index.min.js 2.73 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 10.2 kB
build/router/index.min.js 1.79 kB
build/server-side-render/index.min.js 1.96 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 1.98 kB
build/token-list/index.min.js 587 B
build/url/index.min.js 3.84 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 967 B
build/warning/index.min.js 259 B
build/widgets/index.min.js 7.18 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

Copy link
Member

@dmsnell dmsnell left a comment

Choose a reason for hiding this comment

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

I know it's early, but there are a few small nudges here w.r.t. the Tag Processor. happy to help with them if there's anything confusing about the comments or how to use it.

$alt_attribute = $processor->get_attribute( 'alt' );

// An empty alt attribute `alt=""` is valid for decorative images.
Copy link
Member

Choose a reason for hiding this comment

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

excellent comment, and excellent fix above. one small note: null indicates that the alt attribute is missing, but an empty value would be '' or if it's only present as a name like src="…" alt loading=eager then the value would be true

if ( is_string( $alt_attribute ) ) {

this might be more appropriate, as it ensures that that we're dealing with an alt=something situation

Copy link
Contributor Author

Choose a reason for hiding this comment

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

In a way, the check is a bit redundant in the first place. As far as I know, WordPress enforces at least an empty alt="" attribute everywhere. I'd agree to check for string anyways, just in case.

if ( $alt_attribute ) {
/* translators: %s: Image alt text. */
$aria_label = sprintf( __( 'Enlarge image: %s', 'gutenberg' ), $alt_attribute );
}
$content = $processor->get_updated_html();

$processor = new WP_HTML_Tag_Processor( $block_content );
Copy link
Member

Choose a reason for hiding this comment

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

is this line a mistake here? I think we still have the processor above in line 83

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I'm not familiar with the processor inner workings. To my understanding, after the next_tag( 'img' ) the processor points to the image and not to the entire chunk of HTML. Would get_updated_html(); work anyways. Or am I supposed to create a new instance of the processor? I see several instances od the processor being created, I assumed for this reason. Also, the instances are assigner to variables that I'd argue could be better named. Variable names like $w, $m, $q are very confusing and aren't sekf-explanatory. While those short variable names used to be broadely adopted in the early ages of WordPress, I thought that is nwo considered a non-ideal practice. Certainly doesn't help beginners understand how the processor is supposed ot be used.

Copy link
Contributor

Choose a reason for hiding this comment

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

Would get_updated_html(); work anyways. Or am I supposed to create a new instance of the processor?

Good catch — we no longer need $content here, and we we're not modifying any HTML yet, so we don't need to do the $processor->get_updated_html() call either.

I see several instances od the processor being created, I assumed for this reason.

Also, the instances are assigner to variables that I'd argue could be better named. Variable names like $w, $m, $q are very confusing and aren't sekf-explanatory.

The other instances of the processor are created because we need to do different processing on the figure and img elements for each instance.

Note: We create new instances of the processor for these three scenarios because the processor is unable to back up or reverse.

There is an exception to that though — we could create a bookmark for the figure element and use that to refactor the code for clarity, removing the need for the different instances and cutting down on the variable names if you think that would be clearer. I believe that should work.

Another option: We could rename the $w, $m, and $q variables to $lightbox_container_processor, $initial_image_processor, and $enlarged_image_processor, or something along those lines.

In either case, we can just use $block_content for the new instance(s) rather than $content — which is no longer necessary — and that should help make the code clearer as well.

Copy link
Member

Choose a reason for hiding this comment

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

I see several instances od the processor being created, I assumed for this reason. Also, the instances are assigner to variables that I'd argue could be better named. Variable names like $w, $m, $q are very confusing and aren't sekf-explanatory. While those short variable names used to be broadely adopted in the early ages of WordPress, I thought that is nwo considered a non-ideal practice. Certainly doesn't help beginners understand how the processor is supposed ot be used.

Yeah this code is ripe for refactoring. Maybe next week @artemiomorales and I can try and do that. The names, the duplicate processors, they can all be improved.

Would get_updated_html(); work anyways.

@afercia get_updated_html() will always return the full HTML document. if nothing has been modified it will be identical to what was passed in when creating the Tag Processor. if modifications have been made, it will return the result of applying all requested changes to that document.

Copy link
Contributor

Choose a reason for hiding this comment

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

@dmsnell Sure, we can do that 👍

$content = $processor->get_updated_html();

$processor = new WP_HTML_Tag_Processor( $block_content );
$content = $processor->get_updated_html();
Copy link
Member

Choose a reason for hiding this comment

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

if we don't have any calls to set_attribute() or other functions that modify the content, then this line isn't necessary. it should be equivalent to setting $content = $block_content;

am I missing some lines where we set the alt attribute or aria label before this line?

Copy link
Contributor Author

@afercia afercia Oct 4, 2023

Choose a reason for hiding this comment

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

I'm not sure I understand how the processor is used in this file. If that's true, then why creating one more instance at line 111 and assigning it to $z? Is the content modified in any way before that point?

Copy link
Contributor

Choose a reason for hiding this comment

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

if we don't have any calls to set_attribute() or other functions that modify the content, then this line isn't necessary. it should be equivalent to setting $content = $block_content;

am I missing some lines where we set the alt attribute or aria label before this line?

It looks like this line is no longer necessary and was from an earlier implementation — we can remove this.

I'm not sure I understand how the processor is used in this file. If that's true, then why creating one more instance at line 111 and assigning it to $z? Is the content modified in any way before that point?

This new instance also looks like it is not necessary — it can be removed and we can reuse the first instance.

$alt_attribute = $processor->get_attribute( 'alt' );

// An empty alt attribute `alt=""` is valid for decorative images.
Copy link
Member

Choose a reason for hiding this comment

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

see above comment about is_string()

$content = $processor->get_updated_html();

$processor = new WP_HTML_Tag_Processor( $block_content );
$content = $processor->get_updated_html();
Copy link
Member

Choose a reason for hiding this comment

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

see above comments about recreating the processor and getting unmodified contents.

@github-actions
Copy link

github-actions bot commented Oct 4, 2023

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

@afercia afercia changed the title Fix lightbox missing alt and improve accessibility Fix lightbox missing alt attribute and improve accessibility Oct 4, 2023
@afercia afercia marked this pull request as ready for review October 4, 2023 12:29
@afercia afercia force-pushed the fix/lightbox-missing-alt-and-accessibility branch from 87538f8 to 82ade8e Compare October 4, 2023 12:31
@afercia
Copy link
Contributor Author

afercia commented Oct 5, 2023

A few notes:

  • I'm not sure whether all the markup changes need to be applied also to the lib/block-supports/behaviors.php file. So far, I made only a few changes there.
  • It's still not fully clear to me how the tag processor is supposed to be used. Currently, the class WP_HTML_Tag_Processor is instantiated 6 times in the image block index.php file and 5 times in the behaviors.php file. That seems a bit too much to me. Some help would be greatly appreciated @dmsnell
  • Regarding the aria-label I could use the same approach taken in Add aria-label attribute to navigation block only when it is open #54816 for consistency, even though in this case the element is hidden and does not impact accessibility.

@afercia afercia changed the title Fix lightbox missing alt attribute and improve accessibility Fix Image block lightbox missing alt attribute and improve accessibility Oct 5, 2023
@afercia afercia force-pushed the fix/lightbox-missing-alt-and-accessibility branch from 82ade8e to b887286 Compare October 5, 2023 11:27
@artemiomorales
Copy link
Contributor

artemiomorales commented Oct 5, 2023

@afercia Tbanks for opening this PR! Here are some notes:

I'm not sure whether all the markup changes need to be applied also to the lib/block-supports/behaviors.php file. So far, I made only a few changes there.

All the changes would need to be applied to the behaviors.php as well.

It's still not fully clear to me how the tag processor is supposed to be used. Currently, the class WP_HTML_Tag_Processor is instantiated 6 times in the image block index.php file and 5 times in the behaviors.php file. That seems a bit too much to me. Some help would be greatly appreciated @dmsnell

I left comments here and here on the usage of the processor. In short, 1.) some of the code is outdated and can be removed, and 2.) we could make use of a bookmark to cut down on instantiating new Tag Processor instances if that would help with readability.

Copy link
Contributor

@artemiomorales artemiomorales left a comment

Choose a reason for hiding this comment

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

@afercia I followed the test instructions and everything seems to be working.

I pushed up a change removing some obsolete code that should hopefully make the usage of the Tag Processor clearer.

I also added some changes to block-support/behaviors.php, and also added its inclusion in load.php, which was apparently mistakenly removed at some point.

Note: I'm finding the block supports hard to test since we no longer use it for any part of the image or lightbox. Since we fire a _deprecated_function() call that breaks the layout on the front end anyway, it makes me think that keeping the behaviors.php up-to-date is actually not strictly necessary, but I'm happy to hear other thoughts on this.

I can approve this PR pending a decision on how to handle code cleanup on the multiple instances of the Tag Processor. Thanks! 🙏

@artemiomorales
Copy link
Contributor

Regarding the aria-label I could use the same approach taken in #54816 for consistency, even though in this case the element is hidden and does not impact accessibility.

@afercia As of this writing, what's in this PR at the moment for the aria-label looks good to me 👍

@artemiomorales artemiomorales added the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Oct 5, 2023
@dmsnell
Copy link
Member

dmsnell commented Oct 5, 2023

It seems fitting to me to let this slide through without addressing all the Tag Processor issues. We can hit those up in a single pass after updating the alt attributes. This is the exact reason the existing uses haven't been cleaned up, because I didn't want to distract the lightbox work, but I think the time is right to circle back and address them.

@artemiomorales
Copy link
Contributor

It seems fitting to me to let this slide through without addressing all the Tag Processor issues. We can hit those up in a single pass after updating the alt attributes. This is the exact reason the existing uses haven't been cleaned up, because I didn't want to distract the lightbox work, but I think the time is right to circle back and address them.

This actually sounds good to me, as there's already a fair amount happening in this PR. I'll go ahead and approve it.

@dmsnell
Copy link
Member

dmsnell commented Oct 5, 2023

Thanks both of you!

@afercia
Copy link
Contributor Author

afercia commented Oct 6, 2023

Thanks everyone for your feedback and clarifications.

@afercia afercia merged commit 15ece32 into trunk Oct 6, 2023
51 checks passed
@afercia afercia deleted the fix/lightbox-missing-alt-and-accessibility branch October 6, 2023 12:10
@github-actions github-actions bot added this to the Gutenberg 16.9 milestone Oct 6, 2023
mikachan pushed a commit that referenced this pull request Oct 9, 2023
…ity (#55010)

* Move lightbox open button after the image.

* Fix getting the lightbox image alt attribute.

* Improve docblocks.

* Do not render empty role attribute.

* Remove unnecessary aria-hidden attribute.

* Set aria-modal attribute dynamically.

* More meaningful and simpler modal dialog aria-label.

* Increase Close button target size.

* Add enlarged image base64 encoded placeholder.

* Better check for alt attribute as a string.

* Update changelog.

* Move changelog entry to the block library changelog.

* Set lightbox dialog aria-label dynamically.

* Hide background scrim container from assistive technology.

* Remove obsolete code

---------

Co-authored-by: Ricardo Artemio Morales <ric.morales22@gmail.com>
# Conflicts:
#	packages/block-library/CHANGELOG.md
@mikachan mikachan removed the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Oct 9, 2023
@mikachan
Copy link
Member

mikachan commented Oct 9, 2023

I just cherry-picked this PR to the 6.4-beta3 branch to get it included in the next release: 89f5e33

karmatosed pushed a commit that referenced this pull request Oct 9, 2023
* Add clearer labels and context to BlockPatternsSyncFilter (#54838)

* Add help text & clearer labeling

* Theme & Plugins

* Font Library: use snake_case instead of camelCase on fontFamilies endpoint param (#54977)

* use snake_case instead of camelCase on endpoint param

* updating test

* Fix output of Navigation block classnames in the editor. (#54992)

* Block Editor: Avoid double-wrapping selectors when transforming the styles (#54981)

* Block Editor: Avoid double-wrapping selectors when transforming the styles
* Include space in the check

* Don't display the navigation section in template parts details when a menu is missing (#54993)

* Scripts: Properly use CommonJS for default Playwright config (#54988)

* Fix path to `globalSetup` in default Playwright config

Oversight from #54856

* `module.exports`

* Fix default export usage

* Add template replace flow to template inspector (#54609)

* Add a modal to allow template switching

* fetch template info

* Allow switching to different patterns

* Allow switching to different patterns

* Add columns

* move availble templates to the actions

* filter for the correct templates

* create the right data structure in the use select

* move to a hook

* inject theme attribute into pattern again

* put the overlay over the top of the dropdown

* fix the pattern to templates hook

* set the template on click

* Also set the blocks

* remove calls to set template with the current template, since setting blocks correctly updates the content in the editor

* serialize blocks so that we have correctly processed template parts

* remove duplicated code

* Remove unnecessary mapping

* refactor

* memoize the patterns

* combine the useSelect

* Update packages/edit-site/src/components/sidebar-edit-mode/page-panels/hooks.js

Co-authored-by: Andrei Draganescu <me@andreidraganescu.info>

* Fix ESLint error

* Only show the button is there is more than 1 pattern

* Copy update

* Move the hook to a subdir

* check that there are patterns

* move the check

* remove useCallback

* change condition to show the button

* change condition

* move to use editEntityRecord

* combine filters

* add comments

* Update packages/edit-site/src/components/sidebar-edit-mode/template-panel/replace-template-button.js

Co-authored-by: Andrei Draganescu <me@andreidraganescu.info>

---------

Co-authored-by: Andrei Draganescu <andrei.draganescu@automattic.com>
Co-authored-by: Andrei Draganescu <me@andreidraganescu.info>
Co-authored-by: George Mamadashvili <georgemamadashvili@gmail.com>

* List View: Fix performance issue when selecting all blocks (#54900)

* List View: Fix performance issue when selecting all blocks within the editor canvas in long posts

* Add a comment, rename const

* Move block focus to be performed only once at the root of the list view, instead of within each block

* Fix left and right aligmnent in children of Post Template (#54997)

* Fix left and right aligmnent in children of Post Template

* Add align center styles

* Fix image placeholder disappearing

* Site Editor: Avoid stale navigation block values when parsing entity record (#54996)

* Removed unwanted space from the string (#54654)

* Update styles.js

Removed unwanted space with translation

* Update deleted-navigation-warning.js

Unwanted space at the end of the string shows translation warning.

* Update inspector-controls.js

Unwanted space at the end of the string shows translation warning

* Fix Deleted Navigation Menu warning string (#55033)

* [Inserter]: Fix reset of registered media categories (#55012)

* [Inserter]: Fix reset of registered media categories

* convert `useInserterMediaCategories` to selector and make private

* Try fixing the flaky 'Toolbar roving tabindex' e2e test (#54785)

* Try fixing the flaky 'Toolbar roving tabindex' e2e test
* Add a link in the comment

* Fallback to Twitter provider when embedding X URLs (#54876)

* Fallback to Twitter provider when embedding X URLs

* Avoid processing empty urls when trying a different provider

* Update `react-native-editor` changelog
# Conflicts:
#	packages/react-native-editor/CHANGELOG.md

* Based on the efforts in #51761, remove caps case from Template Part and prefer sentence case. As all instances of this string are stand alone, it's okay to have Template capitalized as it's the start of a sentence. (#54709)

* Update pattern import menu item (#54782)

* Update pattern import menuitem

* Revert label

* Image Block: Fix browser console error when clicking "Expand on Click" (#54938)

* Patterns: Remove category description in inserter panel? (#54894)

* Media & Text: Fix React warning (#55038)

* Block Style: Display default style labels correctly in the block sidebar (#55008)

* Site Editor: Do not display 'trashed' navigation menus in Sidebar (#55072)

* Site Editor: Do not display 'trashed' navigation menus in Sidebar

* Extract selector into a hook

Co-authored-by: Aaron Robertshaw <60436221+aaronrobertshaw@users.noreply.github.com>

---------

Co-authored-by: Aaron Robertshaw <60436221+aaronrobertshaw@users.noreply.github.com>

* Image: Fix Lightbox display bug in Classic Themes. (#54837)

* If current theme is not a block theme add a default value for $background_color and $close_button_color.

* Set lightbox buttons' background & border to none on hover & focus

* Change logic to support lightbox in classic themes

* Update logic to avoid unnecessary calls

* Add style fixes

* Remove unnecessary code

* Fix close button color

---------

Co-authored-by: Mario Santos <santosguillamot@gmail.com>
Co-authored-by: Ricardo Artemio Morales <ric.morales22@gmail.com>

* Latest Posts: add screen reader title text to Read more links and use alternative to excerpt_more filter (#55029)

* In the editor: adds a screen reader text span with the post title in the i18n interpolator
In the frontend: removes excerpt_more filter so we don't override themes and also replaces the default ellipsis with an accessible read more link

* Removing "of" preposition in favour of a semi-colon.
"Read more" is already translated so using a specifier to add it to the string

* Fix Image block lightbox missing alt attribute and improve accessibility (#55010)

* Move lightbox open button after the image.

* Fix getting the lightbox image alt attribute.

* Improve docblocks.

* Do not render empty role attribute.

* Remove unnecessary aria-hidden attribute.

* Set aria-modal attribute dynamically.

* More meaningful and simpler modal dialog aria-label.

* Increase Close button target size.

* Add enlarged image base64 encoded placeholder.

* Better check for alt attribute as a string.

* Update changelog.

* Move changelog entry to the block library changelog.

* Set lightbox dialog aria-label dynamically.

* Hide background scrim container from assistive technology.

* Remove obsolete code

---------

Co-authored-by: Ricardo Artemio Morales <ric.morales22@gmail.com>
# Conflicts:
#	packages/block-library/CHANGELOG.md

* Patterns: Add category selector to pattern creation modal (#55024)



---------

Co-authored-by: Kai Hao <kai@kaihao.dev>

* Iframe: Fix positioning when dragging over an iframe (#55150)

* Site Editor: Fix template part area listing when a template has no edits (#55115)

* Alternative: Fix template part area listing when a template has no edits
* Fix typos

---------

Co-authored-by: Rich Tabor <hi@richtabor.com>
Co-authored-by: Matias Benedetto <matias.benedetto@gmail.com>
Co-authored-by: tellthemachines <tellthemachines@users.noreply.github.com>
Co-authored-by: George Mamadashvili <georgemamadashvili@gmail.com>
Co-authored-by: Pascal Birchler <pascalb@google.com>
Co-authored-by: Ben Dwyer <ben@scruffian.com>
Co-authored-by: Andrei Draganescu <andrei.draganescu@automattic.com>
Co-authored-by: Andrei Draganescu <me@andreidraganescu.info>
Co-authored-by: Andrew Serong <14988353+andrewserong@users.noreply.github.com>
Co-authored-by: mujuonly <muju.only@yahoo.in>
Co-authored-by: Dave Smith <getdavemail@gmail.com>
Co-authored-by: Nik Tsekouras <ntsekouras@outlook.com>
Co-authored-by: Carlos Garcia <fluiddot@gmail.com>
Co-authored-by: Ramon <ramonjd@users.noreply.github.com>
Co-authored-by: James Koster <james@jameskoster.co.uk>
Co-authored-by: Aki Hamano <54422211+t-hamano@users.noreply.github.com>
Co-authored-by: Aaron Robertshaw <60436221+aaronrobertshaw@users.noreply.github.com>
Co-authored-by: Michal <mmczaplinski@gmail.com>
Co-authored-by: Mario Santos <santosguillamot@gmail.com>
Co-authored-by: Ricardo Artemio Morales <ric.morales22@gmail.com>
Co-authored-by: Andrea Fercia <a.fercia@gmail.com>
Co-authored-by: Glen Davies <glendaviesnz@users.noreply.github.com>
Co-authored-by: Kai Hao <kai@kaihao.dev>
@getdave
Copy link
Contributor

getdave commented Jan 23, 2024

✅ I updated the PHP Sync Tracking Issue for WP 6.5 to note this PR does not require a backport for WP 6.5 as it seems to have been cherry picked into WP 6.4 by @mikachan.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Image Affects the Image Block [Feature] Interactivity API API to add frontend interactivity to blocks. [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.

Image: Lightbox buggy retrieval of alt attribute and insufficient accessibility
6 participants