Skip to content

Commit b5db129

Browse files
committed
Remove aria-controls from Service Navigation rendered toggle
This avoids the button to be listed in VoiceOver's rotor if JavaScript doesn't run. https://bugs.webkit.org/show_bug.cgi?id=300899
1 parent 71a2677 commit b5db129

File tree

4 files changed

+20
-7
lines changed

4 files changed

+20
-7
lines changed

packages/govuk-frontend/src/govuk/components/service-navigation/service-navigation.mjs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,13 @@ export class ServiceNavigation extends Component {
4949
return this
5050
}
5151

52-
const menuId = $menuButton.getAttribute('aria-controls')
52+
const menuId = $menuButton.getAttribute('data-aria-controls')
53+
5354
if (!menuId) {
5455
throw new ElementError({
5556
component: ServiceNavigation,
5657
identifier:
57-
'Navigation button (`<button class="govuk-js-service-navigation-toggle">`) attribute (`aria-controls`)'
58+
'Navigation button (`<button class="govuk-js-service-navigation-toggle">`) attribute (`data-aria-controls`)'
5859
})
5960
}
6061

@@ -69,6 +70,7 @@ export class ServiceNavigation extends Component {
6970

7071
this.$menu = $menu
7172
this.$menuButton = $menuButton
73+
this.$menuButton.setAttribute('aria-controls', this.$menu.id)
7274

7375
this.setupResponsiveChecks()
7476

packages/govuk-frontend/src/govuk/components/service-navigation/service-navigation.puppeteer.test.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,9 @@ describe('/components/service-navigation', () => {
109109
await expect(
110110
render(page, 'service-navigation', examples.default, {
111111
beforeInitialisation($root, { selector }) {
112-
$root.querySelector(selector).removeAttribute('aria-controls')
112+
$root
113+
.querySelector(selector)
114+
.removeAttribute('data-aria-controls')
113115
},
114116
context: {
115117
selector: toggleButtonSelector
@@ -119,7 +121,7 @@ describe('/components/service-navigation', () => {
119121
cause: {
120122
name: 'ElementError',
121123
message:
122-
'govuk-service-navigation: Navigation button (`<button class="govuk-js-service-navigation-toggle">`) attribute (`aria-controls`) not found'
124+
'govuk-service-navigation: Navigation button (`<button class="govuk-js-service-navigation-toggle">`) attribute (`data-aria-controls`) not found'
123125
}
124126
})
125127
})
@@ -175,6 +177,15 @@ describe('/components/service-navigation', () => {
175177

176178
expect(toggleExpandedAttribute).toBe('false')
177179
})
180+
181+
it('adds the `aria-controls` attribute to the toggle', async () => {
182+
const toggleExpandedAttribute = await page.$eval(
183+
toggleButtonSelector,
184+
(el) => el.getAttribute('aria-controls')
185+
)
186+
187+
expect(toggleExpandedAttribute).toBe('navigation')
188+
})
178189
})
179190

180191
describe('when toggle button is clicked once', () => {

packages/govuk-frontend/src/govuk/components/service-navigation/template.njk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ data-module="govuk-service-navigation"
3737
{% if navigationItems | length or params.slots.navigationStart or params.slots.navigationEnd %}
3838
<nav aria-label="{{ params.navigationLabel | default(menuButtonText, true) }}" class="govuk-service-navigation__wrapper {%- if params.navigationClasses %} {{ params.navigationClasses }}{% endif %}">
3939
{% if collapseNavigationOnMobile %}
40-
<button type="button" class="govuk-service-navigation__toggle govuk-js-service-navigation-toggle" aria-controls="{{ navigationId }}" {%- if params.menuButtonLabel and params.menuButtonLabel != menuButtonText %} aria-label="{{ params.menuButtonLabel }}"{% endif %} hidden>
40+
<button type="button" class="govuk-service-navigation__toggle govuk-js-service-navigation-toggle" data-aria-controls="{{ navigationId }}" {%- if params.menuButtonLabel and params.menuButtonLabel != menuButtonText %} aria-label="{{ params.menuButtonLabel }}"{% endif %} hidden>
4141
{{ menuButtonText }}
4242
</button>
4343
{% endif %}

packages/govuk-frontend/src/govuk/components/service-navigation/template.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ describe('Service Navigation', () => {
8585
const navId = $nav.attr('id')
8686

8787
expect(navId).toBe('navigation')
88-
expect($navToggle.attr('aria-controls')).toBe(navId)
88+
expect($navToggle.attr('data-aria-controls')).toBe(navId)
8989
})
9090

9191
it('omits empty items from the navigation', () => {
@@ -158,7 +158,7 @@ describe('Service Navigation', () => {
158158
const navId = $nav.attr('id')
159159

160160
expect(navId).toBe('main-nav')
161-
expect($navToggle.attr('aria-controls')).toBe(navId)
161+
expect($navToggle.attr('data-aria-controls')).toBe(navId)
162162
})
163163
})
164164

0 commit comments

Comments
 (0)