Show HN: Visualization of website accessibility tree
272 points
2 months ago
| 13 comments
| chromewebstore.google.com
| HN
When COVID-19 started I needed something to get busy to not go crazy. I happened to work on our app WCAG compliance for a few months at the time and was frustrated by the state of of accessibility-related tools for developers.

I've spend two months delivering a tool that is easy to understand and helps catching accessibility issues on my apps. A few years later it's pretty popular despite being mostly abandoned.

I will be happy to work on this further but honestly lost my enthusiasm some time ago. I'd love to get in touch with some company in the accessibility testing space and discuss how to improve it.

yreg
2 months ago
[-]
Thank you, this looks great!

Could you please run it inside iframes as well? Being able to use this in the Storybook/Playroom would be awesome.

---

Firefox link: https://addons.mozilla.org/en-US/firefox/addon/aria-devtools...

reply
ziolko
2 months ago
[-]
I am super glad you like it! The primary reason I haven't introduced support for iframes is that it requires much wider permissions (instead of just access to the current tab after clicking the "ARIA DevTools" icon you'd need to grant access to all data on every website you visit). I will research if things changed since I last checked, though.
reply
InvisGhost
2 months ago
[-]
I wonder if you're able to open the iframe in a new tab and then use the extension on it?
reply
dimal
2 months ago
[-]
Yes, that’s possible with StoryBook. It’s one of the tiny buttons on the top right, I think.
reply
yreg
2 months ago
[-]
Mhm, also works in Playroom: Preview -> Open
reply
notjustanymike
2 months ago
[-]
A very handy tool for spot checking, but also training. My benefit from this visualization will be demonstrating to non-technical how to people to think about accessibility (specifically screen readers). Half the challenge with WCAG is getting our stakeholders to think beyond ticking boxes for compliance.
reply
Muromec
2 months ago
[-]
"but it's already a text, can't screenreader read the text?"
reply
notjustanymike
2 months ago
[-]
I've dealt with this one, fun trick is to turn off or cover their monitor.
reply
_bin_
2 months ago
[-]
this kind of makes sense though? if 98% of your users can use a non-accessible site just fine - which, since heavy computer users are mostly young, is realistic - why would you go beyond checkboxes? it's a negative EV move.
reply
notjustanymike
2 months ago
[-]
You have to be careful with that line of reasoning; I could rephrase it as "Why bother worrying about minorities?"

People with disabilities cannot be treated like legacy browsers. They have no other option, and there are times when viewing the content is mandatory. Consider content for school, medical, financial, governmental; in those cases we have a responsibility to create an equal experience in both law (WCAG 2.2 compliance, ticking boxes) and spirit (ensuring they can access the information needed to live their life).

reply
kilian
2 months ago
[-]
Very cool. I recently implemented my own accessibility tree visualization [1] Yours is very interesting, getting away from the tree itself to a visualization more focused on grouping discrete units.

My thinking was to show the entire structure and through that help people focus on a logical flow through the page. Flipping that around and thinking of the tree as a set of discrete blocks, where the cohesion inside each block is more important, is very interesting.

Happy to chat if you want to compare notes!

[1] https://polypane.app/blog/polypane-20-1-the-accessibility-tr...

reply
vladde
2 months ago
[-]
Looks neat, and way more clean than https://wave.webaim.org/
reply
ziolko
2 months ago
[-]
Thank you! I really think there's a lot of potential in ARIA DevTools. It's quite popular (at least for my standards) but I never had any connection with people that live and breathe web accessibility. And the devil is in the details here so to be fully fair, WAVE is most probably more accurate.
reply
InvisGhost
2 months ago
[-]
Definitely more accurate however it's UX is awful and doesn't do a good job of prioritizing issues. It sucks that you basically have to install a screen reader app to get the most accurate idea of how screen readers see your site.
reply
afloatboat
2 months ago
[-]
Pretty clean, I like it.

I tested it out on a page I'm developing that has some meta data on a TV show. One of the elements is a set of divs each containing span with an `aria-label` describing the contents. With MacOs' VO this gets called out correctly, and Chrome's Accessibility Tree also picks this up, but this tool doesn't show the `aria-label`, it just shows the separate values as strings one after another.

It also picked up a `::before { content: ", " / ""; }` as `, value`, but that's not supported very well in general.

reply
ziolko
2 months ago
[-]
Is there a chance to get a link to the page? I'd love to try it out and fix.
reply
afloatboat
2 months ago
[-]
I can't link the page, but this is a cleaned up DOM output (the extra spans/divs are components):

`<div><div><span aria-label="IMDb rating" title="IMDb rating">IMDb 8.2</span></div><div><span aria-label="Parental guidance" title="Parental guidance">12+</span></div><div><span aria-label="Production year" title="Production year">2007</span></div><ul aria-label="Genre"><li><div><span>Romance</span></div><li><div><span>Comedy</span></div></ul></div><section><div><h2 id=":r1j:-cast">Cast:</h2><ul aria-labelledby=":r1j:-cast"><li><span>ABC</span><li><span>DEF</span><li><span>GHI</span></ul></div></section>`

`section ul { margin: 0; padding: 0; list-style: none; li { display: inline; &:not(:first-child)::before { content: ", " / ""; } } }`

reply
extra88
2 months ago
[-]
Adding a name to an element without a role, like span or div, is technically invalid; in this example, only the <ul> elements have valid names added to them, because they implicitly have the role of "list."

Also, aria-label and aria-labelledby replace the contents of an element when the contents would otherwise be the name; if the <span> elements where <p> instead (which has an implicit role), screen readers would only read "IMDb rating" and not "IMDb 8.2."

What might be happening is the aria-label attributes are ignored but the title attributes are used as a description after the contents. For some elements `title` can be used as an element description; I think descriptions are also invalid without a role but they may get used anyway.

I think it's best for a visualizing tool to not display attribute information that won't be used by screen readers.

reply
afloatboat
2 months ago
[-]
That's some good feedback and I honestly think this should have been an definition list from the start.

I was interested about how it would change if I replaced those `span` with `p` and it still reads the entire block for me with VoiceOver.

- Parental guidance, group

- [arrow right]

- end of, Parental guidance, group

- [arrow right]

- 14+

- [arrow right]

- Production Year, group

- …

When I look at the Chrome Accessibility Tree it shows

heading "Tags"

  paragraph "Parental guidance"

    StaticText "14+"

  paragraph "Production year"

    StaticText "2016"

When I revert back to the span the `paragraph` is replaced by `generic`. I only have hands on experience with VO so I imagine that JAWS/NVDA might yield different results.

I do believe you're right that this shouldn't be a `aria-label` and I will replace it with `aria-description`, but I don't think that we can say that `aria-label` should only be used to fully replace the contents, as a landmark container would also be named by aria-label: https://www.w3.org/WAI/ARIA/apg/patterns/landmarks/examples/...

Edit: I just tested this but `aria-description` is not read at all. And https://developer.mozilla.org/en-US/docs/Web/Accessibility/A... seems to indicate that aria-label should still be ok, but the div does have a `role="application"`

reply
extra88
2 months ago
[-]
Be aware that the vast majority of people who rely on VoiceOver use Safari as their browser; on mobile devices, they have no choice. There are some ways in which Chrome for Mac does a better job of managing its accessibility tree than Safari but there are a bunch of other issues.

Accessible Name and Description Computation is complicated, some elements can get their name from their contents and some can't; frankly, I can't keep it all straight in my head.

https://www.w3.org/TR/accname-1.2/

Additionally, there's what the specs say and what browsers and screen readers actually do.

VoiceOver doesn't support the `aria-description` attribute yet. The `title` attribute is often computed as an element's description, when it's not computed as its name (it's not a good choice for naming elements, except <iframe>).

https://a11ysupport.io/tech/aria/aria-description_attribute

`role="application"` isn't a good role for static content and should only be used when letting a screen reader used its keyboard shortcuts would interfere with the user operating interactive controls (which should rarely be the case).

https://www.w3.org/TR/wai-aria-1.2/#application

reply
afloatboat
2 months ago
[-]
Don’t get me wrong, I was just making an observation about a ‘role’ being specified. Not suggesting the role=“application” should be used here.

Ultimately in my case I’m leaning to either replacing the production year, parental guidance and IMDb rating with a dl or prepending sr-only titles to the individual tags.

I tested the page with VO on Safari and got the same results as on Chrome. So the good thing is that in practice the current setup appears to be accessible, but it’s frustrating that the theory seems to be different and just not clearly defined.

reply
ziolko
2 months ago
[-]
That's super helpful. I will get this fixed soon :)
reply
ChrisMarshallNY
2 months ago
[-]
Good stuff!

I'm big on accessibility support.

Web sites aren't really my deal, anymore, but I always used to make sure that my sites were very accessible, when it was my deal.

reply
ximm
2 months ago
[-]
One thing we I wish we would do with these tools is separate all the aria logic from the UI. We should put all that complex aria stuff into a library and then build different UIs on top of a shared, well tested code base.

Shameless plug: https://github.com/xi/aria-api

reply
Someone
2 months ago
[-]
How does this compare to Chrome’s built-in tooling (https://developer.chrome.com/docs/devtools/accessibility/ref...)?
reply
ziolko
2 months ago
[-]
When I designed the tool I've tried to mirror the experience of screen readers users instead of only displaying ARIA roles and properties.

For example you have to navigate the page with your keyboard only. If a dropdown isn't accessible - it's instantly clear for the user. Another example are tables. They present only one cell + their headers at the time. I think it's super close to the actual experience of screen reader users.

reply
freetonik
2 months ago
[-]
Great idea and implementation, thank you, I’ll definitely use it for my side project. Coincidentally, I just watched a talk by Mandy Michael [1] about HTML performance and accessibility, and was wondering if there is a tool nicer than browser’s built in accessibility tree viewer.

1. https://youtu.be/cghb0VpCJqM?si=5pWNrkPOyUsohyGJ

reply
danng87
2 months ago
[-]
Awesome tool!

I've been diving more into accessibility lately, especially trying to improve the experience for screen reader users. For those with more experience, has anyone tested this tool on more complex scenarios like extensive forms or dynamic tables? I'd love to hear how it compares to other accessibility tools in those cases.

Any tips or insights would be appreciated!

reply
Evan-Purkhiser
2 months ago
[-]
I’ve been using this for years now thank you so much for building this!!
reply
ziolko
2 months ago
[-]
I am glad to see a happy user here! :)
reply
antriani_
2 months ago
[-]
Does it offer any additional features compared to the accessibility view in Chrome DevTools?
reply
Leimi
2 months ago
[-]
Super useful, great job.
reply