Skip to content

Commit 753ca46

Browse files
Merge pull request #2682 from johanrd/false_positive/template-no-duplicate-landmark-elements
Post-merge-review: Fix template-no-duplicate-landmark-elements false positive on dynamic aria-label
2 parents 750a0f0 + c461e9a commit 753ca46

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

lib/rules/template-no-duplicate-landmark-elements.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,15 @@ module.exports = {
157157
isInsideSectioningElement()
158158
);
159159
if (landmarkRole) {
160+
// Dynamic aria-label / aria-labelledby — can't statically determine whether
161+
// this landmark duplicates a sibling, so skip registering it entirely.
162+
const labelAttr =
163+
node.attributes?.find((attr) => attr.name === 'aria-label') ||
164+
node.attributes?.find((attr) => attr.name === 'aria-labelledby');
165+
if (labelAttr && labelAttr.value?.type !== 'GlimmerTextNode') {
166+
return;
167+
}
168+
160169
const landmarks = currentLandmarks();
161170
if (!landmarks.has(landmarkRole)) {
162171
landmarks.set(landmarkRole, []);

tests/lib/rules/template-no-duplicate-landmark-elements.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ ruleTester.run('template-no-duplicate-landmark-elements', rule, {
2222
'<template><nav></nav><dialog><nav></nav></dialog></template>',
2323
// Dynamic role values — can't determine role statically
2424
'<template><div role={{this.role}}></div><div role={{this.role}}></div></template>',
25+
// Dynamic aria-label on one landmark — can't infer whether it duplicates a sibling
26+
'<template><form></form><form aria-label={{this.formLabel}}></form></template>',
27+
'<template><nav></nav><nav aria-label={{this.navLabel}}></nav></template>',
2528
],
2629

2730
invalid: [
@@ -80,6 +83,9 @@ hbsRuleTester.run('template-no-duplicate-landmark-elements (hbs)', rule, {
8083
// Dynamic aria-label values are treated as unique (can't statically determine duplicates)
8184
'<nav aria-label={{siteNavigation}}></nav><nav aria-label={{siteNavigation}}></nav>',
8285
'<nav aria-label="primary navigation"></nav><nav aria-label={{this.something}}></nav>',
86+
// Dynamic aria-label on one landmark sibling of an unlabeled landmark — can't infer duplication
87+
'<form></form><form aria-label={{this.formLabel}}></form>',
88+
'<nav></nav><nav aria-label={{this.navLabel}}></nav>',
8389
// header/footer inside sectioning elements lose their landmark role
8490
"<main><header><h1>Main Page Header</h1></header><button commandfor='my-dialog'>Open Dialog</button></main><dialog id='my-dialog'><header><h1>Dialog Header</h1></header></dialog>",
8591
"<main><header><h1>Main Page Header</h1></header><button commandfor='my-dialog'>Open Dialog</button></main><div popover id='my-dialog'><header><h1>Dialog Header</h1></header></div>",

0 commit comments

Comments
 (0)