Skip to content

Commit 6794550

Browse files
authored
Merge pull request #175 from elidakirigo/aria-detect
2 parents 3724492 + 0b32d9f commit 6794550

9 files changed

Lines changed: 1065 additions & 21 deletions

File tree

checka11y-warnings.css

Lines changed: 466 additions & 0 deletions
Large diffs are not rendered by default.

checka11y-warnings.min.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

checka11y.css

Lines changed: 466 additions & 0 deletions
Large diffs are not rendered by default.

checka11y.min.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

codes.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,3 +151,6 @@ A list of every Checka11y.css error & warning code with details on what the issu
151151

152152
- ### W0016
153153
The `viewport` meta tag contains a property that disables the zoom and/or the viewport scale. Such a property may prevent users from interacting with the web page, and make it more difficult to view the content.
154+
155+
- ### W0017
156+
The highlighted element is an interactive element with `aria-hidden="true"`. This means the interactive element is inaccessible to assistive technologies. Either remove the `aria-hidden="true"`, or restructure the HTML in cases where the element is ment for decoration purposes or its a duplicate. [Read more about this here](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-hidden).

cypress/e2e/aria_hidden_spec.cy.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
describe("[aria-hidden]", () => {
2+
beforeEach(() => {
3+
cy.visit("/test/index.html")
4+
})
5+
6+
it("should contain border-color rgb(255, 255, 102)", () => {
7+
const interactiveSelectors = ['[role="button"]', '[role="combobox"]', '[role="link"]', '[role="menuitem"]', '[role="menuitemcheckbox"]', '[role="menuitemradio"]', '[role="option"]', '[role="scrollbar"]', '[role="searchbox"]', '[role="slider"]', '[role="spinbutton"]', '[role="switch"]', '[role="tab"]', '[role="radio"]', '[role="textbox"]', '[role="treeitem"]', "a", "button", "summary", '[role="separator"][aria-valuenow]', '[role="separator"][aria-valuemin]', '[role="separator"][aria-valuemax]', "iframe"]
8+
9+
interactiveSelectors.forEach((selector) => {
10+
cy.get(`${selector}[aria-hidden="true"]`).each((element) => {
11+
cy.wrap(element).after("border-color").should("eq", "rgb(255, 255, 102)")
12+
})
13+
})
14+
15+
cy.get(`#interactive-elements input[aria-hidden="true"], #interactive-elements video[controls][aria-hidden="true"], #interactive-elements area[aria-hidden="true"], #interactive-elements audio[controls][aria-hidden="true"], #interactive-elements iframe[aria-hidden="true"], #interactive-elements select[aria-hidden="true"], #interactive-elements textarea[aria-hidden="true"], #interactive-elements video[controls][aria-hidden="true"]`).each((element) => {
16+
cy.wrap(element).should("have.css", "border-color", "rgb(255, 255, 102)")
17+
})
18+
})
19+
20+
it("should contain warning content", () => {
21+
cy.get(`#interactive-elements div[aria-hidden="true"], #interactive-elements a[aria-hidden="true"], #interactive-elements button[aria-hidden="true"], #interactive-elements summary[aria-hidden="true"]`).each((element) => {
22+
cy.get(element).after("content").should("eq", "WARNING (W0017): Interactive element containing aria-hidden")
23+
})
24+
})
25+
})

features.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,4 @@ A list of every a11y concern Checka11y.css will check for and highlight with lin
4343
- [W0014](./codes.md#W0014): Checks for anchor tags that contain a link to content site.
4444
- [W0015](./codes.md#W0015): Checks for images with the `longdesc` attribute.
4545
- [W0016](./codes.md#W0016): Checks for zoom/scale being disabled in the meta `viewport`.
46+
- [W0017](./codes.md#W0017): Checks if interactive elements contain `aria-hidden="true"`.

src/warnings/features/_aria-hidden.scss

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,46 @@
33
/* W0009: Elements with aria-hidden should not have focusable descendants. */
44

55
[aria-hidden="true"] {
6-
a,
7-
button,
8-
summary {
9-
&::after {
10-
@include contentMessage(warning, "W0009", "Focusable element in a aria-hidden element.");
11-
}
12-
}
13-
14-
area,
15-
audio[controls],
16-
iframe,
17-
input,
18-
select,
19-
textarea,
20-
video[controls] {
21-
@include vectorMessage(warning, "W0009", 350, "Focusable", "element in a aria-hidden element.");
22-
}
6+
a,
7+
button,
8+
summary {
9+
&::after {
10+
@include contentMessage(warning, "W0009", "Focusable element in a aria-hidden element.");
11+
}
12+
}
13+
14+
area,
15+
audio[controls],
16+
iframe,
17+
input,
18+
select,
19+
textarea,
20+
video[controls] {
21+
@include vectorMessage(warning, "W0009", 350, "Focusable", "element in a aria-hidden element.");
22+
}
23+
}
24+
25+
/* W0017: Interactive Elements should not have aria-hidden */
26+
$interactive-elements: ("a", "button", "summary", '[role="separator"][aria-valuenow]', '[role="separator"][aria-valuemin]', '[role="separator"][aria-valuemax]');
27+
28+
@each $el in $interactive-elements {
29+
#{$el}[aria-hidden="true"]::after {
30+
@include contentMessage(warning, "W0017", "Interactive element containing aria-hidden");
31+
}
32+
}
33+
34+
$interactive-tags: ("area", "audio[controls]", "iframe", "input", "select", "textarea", "video[controls]");
35+
36+
@each $tag in $interactive-tags {
37+
#{$tag}[aria-hidden="true"] {
38+
@include vectorMessage(warning, "W0017", 350, "Interactive", "element containing aria-hidden");
39+
}
40+
}
41+
42+
$interactive-roles: ("button", "combobox", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "scrollbar", "searchbox", "slider", "spinbutton", "switch", "tab", "radio", "textbox", "treeitem");
43+
44+
@each $role in $interactive-roles {
45+
[role="#{$role}"][aria-hidden="true"]::after {
46+
@include contentMessage(warning, "W0017", "Interactive element containing aria-hidden");
47+
}
2348
}

test/index.html

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ <h6></h6>
273273
</section>
274274
<section>
275275
<h2>Headings: reachable by assistive technologies</h2>
276-
<p>Headings should be reachable by assistive technologies (do not use <code>aria-hidden</code> or similars on a heading).</code></p>
276+
<p>Headings should be reachable by assistive technologies (do not use <code>aria-hidden</code> or similars on a heading)</p>
277277
<h1 aria-hidden="true">H1 with aria-hidden="true"</h1>
278278
<h2 aria-hidden="true">H2 with aria-hidden="true"</h2>
279279
<h3 aria-hidden="true">H3 with aria-hidden="true"</h3>
@@ -336,7 +336,7 @@ <h2>Avoid using mouse event handlers without the appropriate keyboard alternativ
336336
<div>
337337
<div onclick="">A div with onclick</div>
338338
<div onclick="" onkeydown="">A div with onclick and onkeydown</div>
339-
<div onclick="" onkeydown="" role="button">A div with with onclick, onkeydown and role=button</div>
339+
<div onclick="" onkeydown="" role="button">A div with onclick, onkeydown and role=button</div>
340340
<div onclick="" onkeydown="" role="button" tabindex="-1">A div with onclick, onkeydown, role=button and tabindex=-1</div>
341341
</div>
342342
</section>
@@ -425,5 +425,63 @@ <h2>A <code>&lt;a&gt;</code> has an <code>href</code> linking to a content site
425425
<li><a href="https://spotify.com/en/">Spotify Link</a></li>
426426
</ul>
427427
</section>
428+
<section id='interactive-elements'>
429+
<h2>Interactive Elements: not reachable by assistive technologies</h2>
430+
<p>Interactive Elements should be reachable by assistive technologies (do not use <code>aria-hidden</code> on a Interactive Elements.) </p>
431+
<a aria-hidden="true" href='https://github.com/jackdomleo7/Checka11y.css'>Anchor for Interactive purposes</a>
432+
<map name="workmap" aria-hidden="true">
433+
<area shape="rect" coords="34,44,270,350" alt="Clickable area" href="https://checka11y.jackdomleo.dev"/>
434+
</map>
435+
436+
<map name="workmap" >
437+
<area shape="rect" coords="34,44,270,350" alt="Clickable area" href="https://checka11y.jackdomleo.dev" aria-hidden="true"/>
438+
</map>
439+
440+
<audio aria-hidden="true" controls></audio>
441+
442+
<button aria-hidden="true">Button</button>
443+
444+
<iframe aria-hidden="true" src="https://checka11y.jackdomleo.dev" title="Checka11y.css website"></iframe>
445+
446+
<input aria-hidden="true" type="text" />
447+
448+
<select aria-hidden="true"><option>Option</option></select>
449+
450+
<details >Interactive details element<summary aria-hidden="true">Summary</summary></details>
451+
452+
<textarea aria-hidden="true">textarea</textarea>
453+
454+
<video aria-hidden="true" controls></video>
455+
456+
<div aria-hidden='true' role='button'>interactive custom button</div>
457+
<div role="link" aria-hidden="true">Custom Link</div>
458+
<div role="combobox" aria-hidden="true">ComboBox</div>
459+
460+
<ul role="menu">
461+
<li role="menuitem" aria-hidden="true">Menu Item 1</li>
462+
<li role="menuitem" tabindex="0">Menu Item 2</li>
463+
</ul>
464+
465+
<div role="menuitemcheckbox" aria-hidden="true">Menu Checkbox</div>
466+
<div role="menuitemradio" aria-hidden="true">Menu Radio</div>
467+
<div role="option" aria-hidden="true">Option</div>
468+
<div role="radio" aria-hidden="true">Radio Button</div>
469+
<div role="scrollbar" aria-hidden="true">Scroll Bar</div>
470+
<div role="searchbox" aria-hidden="true">Search Box</div>
471+
<div role="separator" aria-valuenow aria-hidden="true">Separator with aria-valuenow</div>
472+
<div role="separator" aria-valuemax aria-hidden="true">Separator with aria-valuemax</div>
473+
<div role="separator" aria-valuemin aria-hidden="true">Separator with aria-valuemin</div>
474+
<div role="slider" aria-hidden="true">Slider</div>
475+
<div role="spinbutton" aria-hidden="true">Spin Button</div>
476+
<div role="switch" aria-hidden="true">Switch</div>
477+
478+
<div role="tablist">
479+
<div role="tab" aria-selected="true">Tab 1</div>
480+
<div role="tab" aria-hidden='true'>Tab 2</div>
481+
</div>
482+
483+
<div role="textbox" aria-hidden="true">Text Box</div>
484+
<div role="treeitem" aria-hidden="true">Tree Item</div>
485+
</section>
428486
</body>
429487
</html>

0 commit comments

Comments
 (0)