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

fix(landmark-unique): follow spec, aside -> landmark #4469

Open
wants to merge 4 commits into
base: develop
Choose a base branch
from

Conversation

gabalafou
Copy link

@gabalafou gabalafou commented May 21, 2024

Update the landmark-unique rule matcher for aside elements so that they are treated as landmarks using the same criteria specified in Sections 3.4.8 and 3.4.9 of the HTML Accessibility API Mappings 1.0.

Closes: #4460

@gabalafou gabalafou requested a review from a team as a code owner May 21, 2024 08:43
@CLAassistant
Copy link

CLAassistant commented May 21, 2024

CLA assistant check
All committers have signed the CLA.

lib/rules/landmark-unique-matches.js Show resolved Hide resolved
@@ -128,6 +124,51 @@ describe('landmark-unique-matches', function () {
});
});

describe('aside should not match when scoped to a sectioning content element unless it has an accessible name', function () {
Copy link
Author

@gabalafou gabalafou May 21, 2024

Choose a reason for hiding this comment

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

If you look at the rest of the test file, this newly added code is nearly copy-paste of the header and footer tests. Is that preferred, or should I attempt to reduce the repetition?

function isAsideLandmark(asideElement) {
return (
!closest(
asideElement.parent, // closest() can match self, which we do not want, so start at parent element
Copy link
Author

Choose a reason for hiding this comment

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

Wouldn't have caught this without tests

!closest(
asideElement.parent, // closest() can match self, which we do not want, so start at parent element
sectioningContentSelector
) || !!accessibleTextVirtual(asideElement)
Copy link
Author

Choose a reason for hiding this comment

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

I'm not 100% sure that this function, accessibleTextVirtual(), is 100% equivalent to the "accessible name" requirement of the specification (Section 3.4.9)

@gabalafou gabalafou changed the title Update landmark-unique-matches for aside fix(landmark-unique): follow spec, aside -> landmark May 21, 2024
@straker
Copy link
Contributor

straker commented May 21, 2024

Thanks for being willing to take on a pr for this. Unfortunately I don't think this is the correct place for the change.

We have a file implicit-html-roles that dictates what the role of an element is when it has no role attribute. In there we assign aside the role of complimentary. Instead what we need to do is figure is two things:

  1. Is the aside part of a sectioning content. We can determine this using the code from footer and header. If it's not part of a sectioning content then the function should return complementary
  2. Does the aside have an accessible name. Again, we can determine this by using the local hasAccessibleName function similar to how the from role works. If it does then return complementary, otherwise return null to signify no implicit role.

Fixing that should then fix the landmark unique issue as the aside will no longer be determined to have a complementary role.

@gabalafou
Copy link
Author

gabalafou commented May 21, 2024

Oh that's great. Putting this aside-complementary logic in the landmark-unique matcher felt off to me, but I was patterning off of what was already there. Given what you wrote, I think the isHeaderFooterLandmark() function is redundant. In fact, I just checked and if I comment it out, then run npm run build && npm run test, all the tests pass.

Would you like me to update this pull request?

@straker
Copy link
Contributor

straker commented May 21, 2024

Yep, that'd be great.

Copy link
Author

@gabalafou gabalafou left a comment

Choose a reason for hiding this comment

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

self review

@@ -42,7 +25,3 @@ function isLandmarkVirtual(vNode) {

return landmarkRoles.indexOf(role) >= 0 || role === 'region';
}

function isHeaderFooterLandmark(headerFooterElement) {
Copy link
Author

Choose a reason for hiding this comment

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

As mentioned in a previous comment, this function has apparently been redundant ever since the implicit role mapping was introduced/updated.

lib/commons/standards/implicit-html-roles.js Outdated Show resolved Hide resolved
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.

landmark-unique does not reflect latest HTML-role mappings
3 participants