Skip to content

feat(aria-roles): add sectionheader and sectionfooter roles - #5238

Merged
straker merged 3 commits into
developfrom
chut/4734-sectionheader
Jul 29, 2026
Merged

feat(aria-roles): add sectionheader and sectionfooter roles#5238
straker merged 3 commits into
developfrom
chut/4734-sectionheader

Conversation

@chutchins25

Copy link
Copy Markdown
Contributor

Adds the new ARIA 1.3 sectionheader and sectionfooter roles to axe-core's standards data.

What & why

Per w3c/aria#1931 (merged into the ARIA spec main), sectionheader and sectionfooter are new concrete structural roles with superclass section. axe-core did not recognize them, so role="sectionheader" / role="sectionfooter" were flagged as invalid roles.

Definitions were grounded directly against the spec source (w3c/aria main):

  • roleInfo.jsparentRoles: ["section"], no required / prohibited / local (non-global) properties.
  • index.html characteristics table — Is Abstract: no (concrete), Name From: author (so no nameFromContent), Accessible Name Required: no.

They are modeled on the existing blockquote precedent (type: 'structure', superclassRole: ['section']).

Note on scope — bundling sectionfooter

The issue (#4734) names only sectionheader, but the spec introduced sectionheader and sectionfooter together and there is no separate sectionfooter issue. They are bundled here as one cohesive "ARIA 1.3 section header/footer roles" change.

Out of scope / follow-up

The updated HTML-AAM implicit-role mapping (<header> / <footer> scoped inside sectioning content → implicit sectionheader / sectionfooter) is not included here — it has a much larger blast radius (landmark/region computations, aria-allowed-role) and will be tracked as a separate issue.

Tests

  • aria-roles integration HTML/JSON — pass cases for both roles.
  • aria-roles virtual-rule — pass cases for both roles.
  • Verified abstractrole / fallbackrole / unsupportedrole / aria-allowed-role check suites still pass.

Closes #4734

Adds the ARIA 1.3 sectionheader and sectionfooter roles (w3c/aria#1931)
as concrete structural roles with superclass section.

Closes #4734

@straker straker left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks good, just the one thing below.

Comment on lines +76 to +101

it('should pass for the sectionheader role', () => {
const results = axe.runVirtualRule('aria-roles', {
nodeName: 'div',
attributes: {
role: 'sectionheader'
}
});

assert.lengthOf(results.passes, 1);
assert.lengthOf(results.violations, 0);
assert.lengthOf(results.incomplete, 0);
});

it('should pass for the sectionfooter role', () => {
const results = axe.runVirtualRule('aria-roles', {
nodeName: 'div',
attributes: {
role: 'sectionfooter'
}
});

assert.lengthOf(results.passes, 1);
assert.lengthOf(results.violations, 0);
assert.lengthOf(results.incomplete, 0);
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

These aren't needed

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Removed — role validity is already covered by the aria-roles integration tests.

…-rule cases

Address review feedback: role validity is already covered by the
aria-roles integration tests.
@straker
straker dismissed their stale review July 27, 2026 19:52

Resolved

@straker
straker marked this pull request as ready for review July 27, 2026 19:53
@straker
straker requested a review from a team as a code owner July 27, 2026 19:53
Garbee
Garbee previously requested changes Jul 28, 2026

@Garbee Garbee left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Talking about the commit reference internally before merging.

@chutchins25
chutchins25 force-pushed the chut/4734-sectionheader branch from 0690106 to 5d60aab Compare July 29, 2026 15:10
@straker
straker merged commit c36c109 into develop Jul 29, 2026
23 checks passed
@straker
straker deleted the chut/4734-sectionheader branch July 29, 2026 19:43
WilcoFiers added a commit that referenced this pull request Aug 5, 2026
All notable changes to this project will be documented in this file. See
[commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version)
for commit guidelines.

##
[4.13.0](v4.12.1...v4.13.0)
(2026-08-05)

### Features

- **aria-actions:** add aria-actions to allowed ARIA attributes
([#5200](#5200))
([029655d](029655d)),
closes [#4584](#4584)
[#5199](#5199), references
[#5215](#5215)
[#5215](#5215)
- **aria-allowed-attr:** flag deprecated ARIA attributes as needs-review
([#5246](#5246))
([518f3cc](518f3cc)),
closes [#3341](#3341)
- **aria-prohibited-attr:** allow many elements to be named and disallow
label and body from being named
([#5259](#5259))
([d8b1ea5](d8b1ea5))
- **aria-roles:** add sectionheader and sectionfooter roles
([#5238](#5238))
([c36c109](c36c109)),
closes [#4734](#4734),
references [#4734](#4734)
- **aria/get-aria-value:** new function to get aria values of a node
([#5109](#5109))
([a7d8f3e](a7d8f3e)),
references [#5042](#5042)
- **aria/has-attr-value:** new function to check if node has aria value
([#5136](#5136))
([61f2624](61f2624)),
references [#5109](#5109)
- **aria:** support role=image as equivalent to role=img
([#5248](#5248))
([5aa8aaf](5aa8aaf)),
closes [#4656](#4656),
references [#5272](#5272)
- **checks/aria:** support ARIA element internals properties
([#5172](#5172))
([9b7f754](9b7f754))
- **checks/label:** support ARIA element internals properties
([#5170](#5170))
([21c5f8b](21c5f8b))
- **checks/navigation:** support ARIA element internals properties
([#5167](#5167))
([2c3a98f](2c3a98f))
- **commons/aria:** support ARIA element internals properties
([#5171](#5171))
([31f09e7](31f09e7))
- **commons/dom:** support ARIA element internals properties
([#5163](#5163))
([f0a12cf](f0a12cf))
- **commons/forms:** support ARIA element internals properties
([#5165](#5165))
([27a4686](27a4686))
- **commons/matches/fromPrimative:** deprecate in favor of correct
spelling ([#5270](#5270))
([31cfb2e](31cfb2e))
- **commons/text:** support ARIA element internals properties
([#5169](#5169))
([e841a33](e841a33))
- **commons/text:** support form-associated labels via element internals
([#5182](#5182))
([57cfe0a](57cfe0a)),
closes [#5045](#5045),
references [#5170](#5170)
[#5039](#5039)
[#5151](#5151)
[#5039](#5039)
- **dom/getResolvedRefs:** new function to get the resolved virtual
nodes of idrefs
([#5151](#5151))
([489cdea](489cdea)),
references [#5109](#5109)
- **element-internals:** enable ElementInternals by default
([#5284](#5284))
([2740d42](2740d42)),
closes [#5277](#5277)
- **i18n:** Add Swedish locale
([#5190](#5190))
([dcd13f2](dcd13f2)),
references [#5189](#5189)
- **matches:** add inSectioningContent, hasChild, and
isSummaryForDetails matches
([#5262](#5262))
([c47cdcd](c47cdcd))
- **rules:** support ARIA element internals properties
([#5168](#5168))
([065baf7](065baf7))
- **standards/ariaAttrs:** add caseInsensitive property for attributes
([#5224](#5224))
([bcd791c](bcd791c))

### Bug Fixes

- **aria-allowed-role:** allow roles on a non-details summary
([#5242](#5242))
([3bd9875](3bd9875)),
closes [#3911](#3911),
references [#3443](#3443)
[#3911](#3911)
- **aria-allowed-role:** restrict figure roles with child figcaption
([#5240](#5240))
([178a635](178a635)),
closes [#3443](#3443)
- **aria-prohibited-attr:** visible aria-labelledby requires review only
([#5285](#5285))
([fd6fa9f](fd6fa9f))
- **axe.d.ts:** make enabled property of RuleMetadata optional
([#5129](#5129))
([90fce18](90fce18))
- **color-contrast:** fix various stacking context bugs
([#5214](#5214))
([d5e5b04](d5e5b04)),
references [#8](#8)
[#5213](#5213)
- **gather-internals:** handle non-HTMLElement nodes
([#5161](#5161))
([06e84c3](06e84c3))
- **get-selector:** escape control characters in attribute selectors
([#5273](#5273))
([4b60ac5](4b60ac5)),
closes [#5204](#5204)
[#5204](#5204)
- **image-alt:** allow whitespace alt on presentational images
([#5218](#5218))
([c5dd0ef](c5dd0ef)),
closes [#5216](#5216)
- **landmark-unique:** exclude section/form with non-landmark roles from
landmark match
([#5085](#5085))
([c5fd013](c5fd013)),
closes [#4722](#4722)
[#5064](#5064)
- name the image role in role-img-alt and svg-img-alt metadata
([#5279](#5279))
([995a269](995a269)),
closes [#5272](#5272),
references [#5248](#5248)
[#5248](#5248)
- **standards:** update aria-errormessage and aria-details to be idrefs
([#5157](#5157))
([fb94f8a](fb94f8a))

This PR was opened by a robot 🤖 🎉
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add new sectionheader role

3 participants