Submenu toggle does not open through screen-reader activation
Nobody has claimed this yet.
- Dominant language
- PHP
- Stars
- 306
- Forks
- 88
- Avg merge
- 2d 16h
- Merged PRs (30d)
- 12
Description
Summary
Dropdown submenu toggles can be reached and announced by screen readers, but activating them may not open the submenu even though mouse and physical-keyboard interaction works.
Expected behavior: Activating an announced submenu toggle through a screen reader opens or closes its submenu and exposes the current state.
Actual behavior: Reported activation with NVDA or TalkBack leaves the submenu closed.
Impact: Screen-reader users may be unable to reach links inside dropdown submenus.
Customer context
- Product / area: Neve primary navigation dropdown submenus
- Version: Not provided; repository inspection used Neve 4.2.8
- Environment: NVDA on Windows with Chrome and Firefox; TalkBack on an Android tablet
- Integration / third party: No plugin or third-party menu integration reported
- Reported error / symptom: The submenu control is announced and focusable, but screen-reader activation does not reveal the submenu
- Impact: Dropdown child links may be inaccessible through the reported assistive-technology workflow
Reproduction notes
Reported workflow:
- Configure a Neve primary navigation menu with a dropdown submenu.
- Navigate to the submenu toggle with NVDA in Chrome or Firefox on Windows, or with TalkBack on Android.
- Activate the announced toggle.
- Observe that the submenu reportedly remains closed; mouse and physical-keyboard operation reportedly succeeds.
Reproduction status: Not reproduced in an assistive-technology runtime. Source inspection confirms an incomplete desktop pseudo-button activation model consistent with the report. The Neve version, exact key/gesture, menu layout, and responsive state are missing.
Diagnosis
Conclusion
The inspected desktop submenu path contains a product accessibility defect consistent with the report. Neve renders a scripted div as the desktop submenu button, provides an Enter-only keydown handler, and maintains keyboard-open and click-open state through separate mechanisms. This does not provide a single activation model equivalent to a native button and leaves assistive-technology activation dependent on browser/platform event synthesis. The exact NVDA and TalkBack event sequences were not reproduced locally, so the source confirms the defective activation contract rather than every reported platform detail.
Where this likely occurs
- Primary navigation submenu control:
inc/views/nav_walker.php—Nav_Walker::add_caret()lines 99–179. Desktop menus receive adiv role="button"witharia-pressed; sidebar menus receive a nativebutton. Neither control exposes submenu state througharia-expandedin this path. - Desktop accessibility handler:
inc/views/nav_walker.php—Nav_Walker::enqueue_accessibility_menu_js()lines 381–416. It listens only forkeydown, accepts only numeric Enter key code 13, and toggles.wrap.activeplusaria-pressedthroughevent.target. - Shared click handler:
assets/js/src/frontend/navigation.js—handleMobileDropdowns()andopenCarrets()lines 90–102. Click activation independently togglesdropdown-openon the control and submenu without synchronizing the desktop handler'sactiveoraria-pressedstate. - Event registration utility:
assets/js/src/utils.js—addEvent()lines 42–46. It passes the registered caret separately from the event target, confirming that the click path and inline keyboard path use different target/state models. - The pseudo-button keyboard path originated in commit
35650c462and has shipped since Neve 3.4.8. Commit42a44f96fmoved visual keyboard state to the parent wrapper, and commit44c0eec2aaddedaria-pressedhandling for closed issue #3977. The inspected behavior remains present in tag 4.2.8.
Engineering notes
The desktop and sidebar variants differ materially. The desktop variant is the source-confirmed activation defect. The sidebar variant is a native button connected to the click handler, so repository inspection alone does not establish why TalkBack activation failed; its lack of exposed expanded/collapsed submenu state is a separate confirmed accessibility deficiency. The relevant behavior is in the free Neve theme. Search of the Pro add-on found no runtime override; its matching mega-menu e2e coverage invokes .caret-wrap through a mouse-style click.
The source contains two visual states: the desktop keydown path uses .wrap.active, while the shared click path uses .dropdown-open. Assistive technologies may synthesize events differently across browser and platform combinations; those external event semantics were not verified from a browser or screen-reader runtime during this investigation.
Test coverage status
e2e-tests/specs/accessibility/aria.spec.ts lines 3–66 checks aria-expanded only on the top-level mobile navigation opener, not submenu toggles. e2e-tests/specs/customizer/hfg/hfg-menu-item-alignment.spec.ts lines 15–34 and e2e-tests/cypress/integration/mega-menu/mega-menu-test.spec.ts lines 27–50 cover submenu opening through .click(). No relevant coverage was found during inspection for desktop submenu activation through accessibility APIs, Space activation, screen-reader-style activation, or submenu state announcements.
What to verify or explore next
- May be worth reproducing on a clean Neve 4.2.8 site with a primary menu containing one nested level, using NVDA with Chrome and Firefox.
- May be worth confirming whether Enter, Space, and the screen reader's dedicated activate gesture emit
keydown,click, both, or neither on the desktop pseudo-button. - May be worth repeating the sidebar workflow with TalkBack and recording whether a click event reaches
openCarrets(). - If reproducible, checking desktop and sidebar layouts separately would establish the exact scope.
- The focused Playwright suites are
e2e-tests/specs/accessibility/aria.spec.tsand the HFG menu specs; they require the repository's WordPress e2e environment.
Unknowns / follow-up
- The reporter did not provide the Neve version, menu configuration, responsive breakpoint, or whether the Android test used the sidebar variant.
- Runtime reproduction with NVDA and TalkBack was not available.
- Open issue #4425 broadly tracks accessibility requirements, but the available issue search did not establish that it includes this exact activation failure.
Confidence
Confidence: 88/100
The customer reports the same activation failure across multiple screen readers, and Neve 4.2.8 source shows a desktop pseudo-button with incomplete keyboard semantics plus separate, unsynchronized click and keyboard state paths. No existing issue found by the available GitHub search specifically tracks this screen-reader activation failure.
Source: HelpScout #3382553996
Generated by bug-report-triage (ID: bug-report-triage_6a50ded9832f83.27152498)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with Nav_Walker::add_caret() and enqueue_accessibility_menu_js() in inc/views/nav_walker.php, then compare their state handling with handleMobileDropdowns() and openCarrets() in assets/js/src/frontend/navigation.js. Run the focused accessibility and HFG menu suites in e2e-tests/specs/accessibility/aria.spec.ts and the related HFG specs. Done means submenu activation works for the reported controls and its expanded or collapsed state is exposed consistently.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript, php, wordpress
- Domain
- accessibility, frontend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100