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

Focus submenu button when clicked #55198

Merged
merged 12 commits into from Oct 18, 2023
Merged

Conversation

SantosGuillamot
Copy link
Contributor

@SantosGuillamot SantosGuillamot commented Oct 10, 2023

What?

This pull request adds some JavaScript logic to ensure focus the submenu button when it is clicked. It solves this issue: #54991

It also adds a fix for closing the submenu overlay on a click outside the submenu on iOS.

Why?

It seems that Safari doesn't place the focus on the button element but on a parent div, which causes some issues with the directives assuming the focus is on the button. We can see the difference between Chrome and Safari:

Chrome

Comparing.trunk.fix_navigation-submenu-on-safari.WordPress_gutenberg.-.10.October.2023.mp4

Safari

test64.-.10.October.2023.mp4

How?

I added some JavaScript logic that, when the submenu button is clicked, it focuses it. It'd be great if someone from the accessibility team could double-check if this approach is correct or if it will break something I am unaware of. cc: @afercia, @alexstine , @jeryj , @joedolson

Testing Instructions

  1. Add a navigation block with an item with submenu.
  2. In the block settings, enable the "Show arrow" setting.
  3. Open the site in Safari.
  4. Click on the arrow to open the submenu.
  5. Check that the activeElement is the arrow button.
  6. Click outside of the submenu and check it is closed.
  7. Open the submenu again by clicking the arrow.
  8. Press the ESC key and check that the submenu is closed.

On iOS:

  1. Click on the arrow to open the submenu.
  2. Click on the arrow to close the submenu.
  3. Click on the arrow to open the submenu.
  4. Click on the body to close the submenu.

@SantosGuillamot SantosGuillamot added [Type] Bug An existing feature does not function as intended [Block] Navigation Affects the Navigation Block Backport to WP Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta labels Oct 10, 2023
@github-actions
Copy link

github-actions bot commented Oct 10, 2023

Size Change: +6.71 kB (0%)

Total Size: 1.66 MB

Filename Size Change
build/block-directory/index.min.js 7.25 kB +188 B (+3%)
build/block-editor/index.min.js 219 kB +256 B (0%)
build/block-editor/style-rtl.css 15.6 kB +15 B (0%)
build/block-editor/style.css 15.6 kB +15 B (0%)
build/block-library/blocks/image/style-rtl.css 1.54 kB +65 B (+4%)
build/block-library/blocks/image/style.css 1.54 kB +65 B (+4%)
build/block-library/blocks/image/view.min.js 2 kB +73 B (+4%)
build/block-library/blocks/navigation/view.min.js 1.07 kB +51 B (+5%) 🔍
build/block-library/blocks/query/style-rtl.css 312 B -63 B (-17%) 👏
build/block-library/blocks/query/style.css 308 B -64 B (-17%) 👏
build/block-library/index.min.js 211 kB +179 B (0%)
build/block-library/style-rtl.css 14.4 kB +63 B (0%)
build/block-library/style.css 14.4 kB +61 B (0%)
build/commands/index.min.js 15.5 kB +1 B (0%)
build/components/index.min.js 250 kB +1.39 kB (+1%)
build/components/style-rtl.css 11.9 kB +30 B (0%)
build/components/style.css 11.9 kB +30 B (0%)
build/core-commands/index.min.js 2.72 kB +3 B (0%)
build/core-data/index.min.js 70.9 kB +338 B (0%)
build/customize-widgets/index.min.js 12 kB -1 B (0%)
build/data/index.min.js 8.87 kB +87 B (+1%)
build/edit-post/index.min.js 35.7 kB +70 B (0%)
build/edit-post/style-rtl.css 7.88 kB -5 B (0%)
build/edit-post/style.css 7.88 kB -5 B (0%)
build/edit-site/index.min.js 205 kB +2.82 kB (+1%)
build/edit-site/style-rtl.css 14.3 kB +98 B (+1%)
build/edit-site/style.css 14.3 kB +99 B (+1%)
build/edit-widgets/style-rtl.css 4.85 kB +4 B (0%)
build/edit-widgets/style.css 4.84 kB +3 B (0%)
build/editor/index.min.js 45.9 kB -2 B (0%)
build/format-library/index.min.js 7.82 kB +19 B (0%)
build/patterns/index.min.js 4.51 kB +809 B (+22%) 🚨
build/private-apis/index.min.js 988 B +16 B (+2%)
build/reusable-blocks/index.min.js 2.73 kB +1 B (0%)
build/rich-text/index.min.js 10.2 kB +10 B (0%)
build/url/index.min.js 3.83 kB -12 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/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-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/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/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/style-rtl.css 947 B
build/commands/style.css 942 B
build/compose/index.min.js 12.7 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/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-widgets/index.min.js 17 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/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/style-rtl.css 518 B
build/patterns/style.css 517 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/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/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
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/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
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.

@SantosGuillamot Thanks for the PR.

From what I can tell, this is at least a partial fix. I tested on Windows 10 with NVDA in Google Chrome and Firefox. I tested on Mac Big Sur with Voiceover and Safari. This seems like a solid fix across OS platforms.

I can however not test the click behavior with the mouse, this is only a test done with the keyboard. I would wait for one more approve on this one.

Copy link
Contributor

@jeryj jeryj left a comment

Choose a reason for hiding this comment

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

This is testing well for keyboard interactions. The test steps also work correctly in safari with a mouse click. I noticed one regression from trunk.

  1. Open the site in Safari.
  2. Click on the arrow to open the submenu.
  3. Click on the arrow to close the submenu.
  4. The submenu stays open, when it should close as it does on Trunk and in Chrome.

Copy link
Contributor

@tellthemachines tellthemachines 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 fixing this! It's working well for me on both Safari and the iPad simulator.

@luisherranz
Copy link
Member

Thanks a lot for testing this.

We are trying to avoid changing the focus programmatically to avoid introducing bugs like this so we are now experimenting with a different fix that uses tabindex="-1" in the <li> element to make Safari move the focus to that li element instead of to the top container.

It seems to work fine, but before committing to it, we want to make sure that that behavior is consistent across all the different Safari versions and devices. We'll test it out with BrowserStack, and we'll let you know as soon as possible.

@luisherranz luisherranz linked an issue Oct 11, 2023 that may be closed by this pull request
@luisherranz
Copy link
Member

@SantosGuillamot and I have been testing the tabindex fix using BrowserStack (real iPhone and iPad devices) and it looks like it fixes all the issues.

Could you please check again? Thank you 🙏

@github-actions
Copy link

github-actions bot commented Oct 11, 2023

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

@tellthemachines
Copy link
Contributor

I'm not able to test this on Windows because gutenberg.run seems to be failing for this PR. Testing on macOS/Safari both mouse and keyboard interaction are working fine. I tested opening and closing submenus and nested submenus and don't think I missed anything this time 😄

Copy link
Contributor

@jeryj jeryj left a comment

Choose a reason for hiding this comment

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

Sorry to keep blocking this :/

The good news: It does work! I can't break it using TT3 theme.
The odd news... the tabindex isn't always consistent in the value in relation to the state. I can get the menu to be open, and not have a tabindex value by:

  • Tab to a dropdown chevron
  • Press Enter: tabindex -1 is applied body tag
  • Press Shift + Tab to go back to the chevron: tabindex is removed from the body tag

It can also arrive in the "wrong" state with hovering/clicks:

Screen.Recording.2023-10-13.at.8.46.32.AM.mov

It also allows the focus to be placed on the <li> in some instances on Safari and Chrome.

  • Tab focus to a link with a dropdown
  • Hover the link
  • Hover off the link
  • Focus ring is wrapped around both the anchor and chevron
  • document.activeElement reports the <li>
Screen.Recording.2023-10-13.at.8.54.08.AM.mov

Overall, I'm not sure what's going on with it, but it seems inconsistent. I'm really interested in why this fix works. Since I can get the body to not have a tabindex in Safari, I thought the bug of not being able to click the page to close the menu would still be there... But it isn't... This code works to address that.

If we can isolate exactly what is allowing it to work in Safari, then we can use that to provide a fix that will work without potentially introducing odd states like the ones above.

So, sorry for the long text and for keeping this blocked. I'm super curious to find out more!

@@ -20,6 +20,9 @@ const openMenu = ( store, menuOpenedOn ) => {
if ( context.core.navigation.type === 'overlay' ) {
// Add a `has-modal-open` class to the <html> root.
document.documentElement.classList.add( 'has-modal-open' );
} else {
// Ensure that Safari on iOS/iPadOS trigger the mouseleave events.
document.body.setAttribute( 'tabindex', '-1' );
Copy link
Contributor

Choose a reason for hiding this comment

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

Do we know why this works? I'm not saying we can't do this, but I'm hesitant to do this since it could have far-reaching effects. I'd love to learn more about it as I didn't know this would trigger mouseleave events for Safari.

Copy link
Contributor

Choose a reason for hiding this comment

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

Yes, I don't like this. I would never set this on the <body>.

@luisherranz
Copy link
Member

The current implementation is coupled with how the focus is positioned in Chrome, so it's difficult to make it work in Safari because the focus position is totally different. Using tabindex="-1" was an attempt to get Safari to function in a manner similar to Chrome, but this may not be the best solution.

The problem is that the ideal solution would be to change the implementation so it doesn't depend on the focus position, but this would require a complete refactoring of the logic, and it might be a bit late in the WP 6.4 release cycle for such a big change.

We can keep trying to fix it for WP 6.4 with tabindex or ref.focus(), even if it's not ideal, and refactor the logic in Gutenberg, but I think it would be easier if we had direct help from an accessibility expert because I'm afraid we don't fully understand how tabindex is supposed to work, at least in relation to how it's expected to work in Chrome, why it's so different in Safari, and how it's expected to work in Safari.

@jeryj, would there be any chance we could pair program with you to see if we can find the best solution together?

@alexstine
Copy link
Contributor

@luisherranz I'll give +1 to just setting focus via the ref. That seemed to work.

@luisherranz
Copy link
Member

Thanks, Alex. I've talked with @jeryj and we'll meet tomorrow to keep iterating this 🙂

@joedolson
Copy link
Contributor

Safari doesn't set focus on buttons, links, or non-text inputs; so activeElement won't reliably return a valid value if focus is expected on one of those items. Safari doesn't consider this a bug, it's a design choice, so it has to be worked around. I haven't looked at this PR yet, but that's an important weird behavior to be aware of with Safari. Relevant reading: Fixing Focus for Safari

@jeryj
Copy link
Contributor

jeryj commented Oct 17, 2023

We tried to use ref.focus() manually instead of the tabindex="-1" in the li element, but it breaks the closing of the menu.

I played around with this too. I accidentally stumbled upon using both tabindex="-1" in the li element AND using ref.focus() seems to work well. I think it's because the tabindex="-1" n the li prevents Safari from sending focus to the parent navigation wrapper. Combining this with a event.relatedTarget === null check on the handleMenuFocusout seems to prevent the submenus from being closed and also allows a click outside the menu to close the submenu. I didn't test on iPhone or iPad proper, so there's a chance all my work was for nothing 😅

I added some checks to verify focus on the frontend interactivity tests as well, and added directives to run it in Safari. I spent the last hour debugging why it's flaky though. I believe it's an issue with the test set-up in Safari though. Checking it manually with the same steps consistently works. If we need to remove the Tab keypresses that keep breaking it or write them in a way that tests what we need to while being consistent, I'm fine with that.

🤞🏻 it all works!

@jeryj
Copy link
Contributor

jeryj commented Oct 17, 2023

Tests pass, but they are flaky, as indicated by #51552. To run the tests locally, you can do: npm run test:e2e:playwright -- --project=webkit --repeat-each=10 -g "Submenu interactions". You may need to first do npx playwright install webkit to get the webkit browser to work with Playwright.

@SantosGuillamot
Copy link
Contributor Author

Thanks a lot for your help and the tests improvements 🙂

I didn't test on iPhone or iPad proper, so there's a chance all my work was for nothing 😅

I've been testing the latest changes in iPhone and iPad, and unfortunately, it doesn't seem to work there 😞 If I open a submenu, it is not closed by clicking outside. Adding the empty click event listener seems to fix the issue. Going back to Luis' fix everything seems to work fine as well.

Authored by Luis Herranz <luisherranz@gmail.com>. I'm just re-applying the change.
jeryj
jeryj previously approved these changes Oct 18, 2023
Tab keypreses on webkit playwright are really flakey (or it's something in our code that we haven't isolated) so I've split out the webkit tests to test everything I can without using a tab keypress.
@jeryj
Copy link
Contributor

jeryj commented Oct 18, 2023

I approved the changes since there wasn't a way for me to dismiss my own review. I think it needs a review from someone else now since I've made code updates.

@scruffian scruffian dismissed jeryj’s stale review October 18, 2023 14:25

jerry asked me to!

@SantosGuillamot SantosGuillamot merged commit ab2589d into trunk Oct 18, 2023
50 checks passed
@SantosGuillamot SantosGuillamot deleted the fix/navigation-submenu-on-safari branch October 18, 2023 16:33
@github-actions github-actions bot added this to the Gutenberg 16.9 milestone Oct 18, 2023
@luisherranz
Copy link
Member

For reference, this is the implementation that was finally merged:

  • We used a global event listener to force Safari in iOS/iPadOS to trigger the focusout event when a submenu is opened and the user taps away.
  • We used a combination of tabindex and ref.focus() to manually position the focus on the button when the user clicks it. This only affects Safari. Chrome and Firefox keep working as they were.

So this should now be a fully working solution.

We still want to investigate an alternative overlay-based solution at some point, though.

Thanks to everyone for their help with code and/or reviews 🙂

SiobhyB pushed a commit that referenced this pull request Oct 19, 2023
* Focus element manually when open submenu on click

* Try using `tabindex="-1"`

* Use `tabindex="-1"` also in body when a submenu is opened

* Replace tabindex with event listener

* Explain the tabindex on <li>

* Don't store the element on hover to restore the focus later

* Improve explanations

* Add tests to cover webkit frontend menu interactions

Safari doesn't place focus on a clicked button as expected. These tests verify that when a submenu chevron button is clicked, focus is correctly placed on that button. It also verifies that the click on the body correctly closes any open submenus, which was failing in Safari.

* Focus clicked button on Safari

Combining the tabindex -1 on the parent li and focusing the button on Safari, and also checking that the relatedTarget is null inside the handleMenuFocusout seems to contain the focus within the menu to not fire the handleMenuFocusout as often, and still works to click on the body to close the menu.

* Added the document.addEventListener body click back in

Authored by Luis Herranz <luisherranz@gmail.com>. I'm just re-applying the change.

* Remove tab keypresses from webkit menu interaction tests

Tab keypreses on webkit playwright are really flakey (or it's something in our code that we haven't isolated) so I've split out the webkit tests to test everything I can without using a tab keypress.

* Use body click instead for consistency across environments

---------

Co-authored-by: Luis Herranz <luisherranz@gmail.com>
Co-authored-by: Jerry Jones <jones.jeremydavid@gmail.com>
@SiobhyB
Copy link
Contributor

SiobhyB commented Oct 19, 2023

I've gone ahead to cherry-pick this change for inclusion in 6.4's RC2: 042dfed

@SiobhyB SiobhyB removed the Backport to WP Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Oct 19, 2023
SiobhyB added a commit that referenced this pull request Oct 23, 2023
* Focus submenu button when clicked (#55198)

* Focus element manually when open submenu on click

* Try using `tabindex="-1"`

* Use `tabindex="-1"` also in body when a submenu is opened

* Replace tabindex with event listener

* Explain the tabindex on <li>

* Don't store the element on hover to restore the focus later

* Improve explanations

* Add tests to cover webkit frontend menu interactions

Safari doesn't place focus on a clicked button as expected. These tests verify that when a submenu chevron button is clicked, focus is correctly placed on that button. It also verifies that the click on the body correctly closes any open submenus, which was failing in Safari.

* Focus clicked button on Safari

Combining the tabindex -1 on the parent li and focusing the button on Safari, and also checking that the relatedTarget is null inside the handleMenuFocusout seems to contain the focus within the menu to not fire the handleMenuFocusout as often, and still works to click on the body to close the menu.

* Added the document.addEventListener body click back in

Authored by Luis Herranz <luisherranz@gmail.com>. I'm just re-applying the change.

* Remove tab keypresses from webkit menu interaction tests

Tab keypreses on webkit playwright are really flakey (or it's something in our code that we haven't isolated) so I've split out the webkit tests to test everything I can without using a tab keypress.

* Use body click instead for consistency across environments

---------

Co-authored-by: Luis Herranz <luisherranz@gmail.com>
Co-authored-by: Jerry Jones <jones.jeremydavid@gmail.com>

* Make layout support compatible with enhanced pagination (#55416)

* Make layout supports compatible with enhanced pagination

* Use sanitize_title and add `layout` to the class name

* Update default fullscreen icon for lightbox trigger (#55463)

* Make duotone compatible with enhanced pagination (#55415)

* Patterns: fix capabilities settings for pattern categories (#55379)

Co-authored-by: Daniel Richards <daniel.richards@automattic.com>

* Revert "Patterns: fix capabilities settings for pattern categories (#55379)"

This reverts commit 6f83c92.

* Image block: wrap images with hrefs in an A tag (#55470)

* This commit sees what happens when we wrap the image element in an A tag in the editor.
This is to ensure any inherited styles from the link element, such as border color, apply to the image.

* Removing duplicate <a href /> wrapper
Adding disabled onClick and aria attribute

* Image: Improve focus management in lightbox (#55428)

* Improve focus management

This commit removes the logic to set focus differently
based on event.pointerType and instead sets focus on the
dialog itself when the lightbox opens, and on the lightbox
trigger when the lightbox closes.

* Add delay before focusing when closing lightbox

* Put focus back on close button when opening lightbox

It turns out that placing focus on the modal was causing
inconsistent behavior in Safari, so I've put the focus back
on the close button when the lightbox opens, which
performs predictably.

I've also added a tabindex to the image, which prevents
the focus ring from erroneously showing when opening the lightbox
with a mouse in Chrome and Firefox.

* Move focus to the dialog when opening the lightbox.

* Fix SVG markup.

* Consistent indentation with spaces.

* Remove unnecessary tabindex

---------

Co-authored-by: Andrea Fercia <a.fercia@gmail.com>

* Fix: - Update the title when using enhanced pagination

---------

Co-authored-by: Mario Santos <34552881+SantosGuillamot@users.noreply.github.com>
Co-authored-by: Luis Herranz <luisherranz@gmail.com>
Co-authored-by: Jerry Jones <jones.jeremydavid@gmail.com>
Co-authored-by: Artemio Morales <artemio.morales@a8c.com>
Co-authored-by: Glen Davies <glendaviesnz@users.noreply.github.com>
Co-authored-by: Daniel Richards <daniel.richards@automattic.com>
Co-authored-by: Ramon <ramonjd@users.noreply.github.com>
Co-authored-by: Andrea Fercia <a.fercia@gmail.com>
@Mamaduka
Copy link
Member

Mamaduka commented Nov 8, 2023

I've noticed that Overlay menu interactions in Safari test introduced here become flaky recently - #55816.

@SantosGuillamot
Copy link
Contributor Author

I've noticed that Overlay menu interactions in Safari test introduced here become flaky recently - #55816.

@jeryj Any idea why this could happen or how we can solve it?

@krokodok
Copy link
Contributor

krokodok commented Jan 4, 2024

There's a problem with closing the menu when clicking inside the debugger or address bar, stemming from this PR and described in this ticket: https://core.trac.wordpress.org/ticket/60192

@Mamaduka
Copy link
Member

Mamaduka commented Jan 5, 2024

@krokodok, a similar issue was reported recently. I don't think that's a bug; it's how most dialogs/popovers behave. See: #56094 (comment)

@krokodok
Copy link
Contributor

krokodok commented Jan 5, 2024

Didn't know about that debugging option, good to know!

Still I am wondering: Is this standardized best-practive behaviour? Is there a consensus on how such elements should behave? I am finding all different kinds of examples.

@krokodok
Copy link
Contributor

krokodok commented Jan 5, 2024

From my own personal view I think it is a benefit being able to open a state and then leaving the browser, maybe checking some related stuff on another monitor, and then returning to the browser and finding the exact same state that I left. When the state changes that feels sudden and confusing.

As I said, the implementations differ from website to website. Google for example, on their home search page, do it like it is done in WordPress right now, regarding the user profile menu.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Navigation Affects the Navigation Block [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Navigation Block submenus not closing properly on iPad
9 participants