├── README.md ├── assets ├── script.js └── style.css ├── hidden.html ├── howto.html ├── index.html ├── media.html └── tests ├── figure.html ├── hidden.html ├── label.html └── media.html /README.md: -------------------------------------------------------------------------------- 1 | # RAT 2 | 3 | **RAT** (Results from Assistive Technology) is a collection of markup patterns and how they are handled by different assistive technology. 4 | 5 | [Visit site](http://jonathantneal.github.io/rat/) 6 | -------------------------------------------------------------------------------- /assets/script.js: -------------------------------------------------------------------------------- 1 | var forEach = Array.prototype.forEach; 2 | var tables = document.querySelectorAll('table'); 3 | 4 | forEach.call(tables, function (table) { 5 | var ths = table.tHead.rows[0].cells; 6 | var trs = table.tBodies[0].rows; 7 | 8 | forEach.call(trs, function (tr) { 9 | forEach.call(tr.cells, function (td, index) { 10 | if (ths[index].lastChild) { 11 | var name = ths[index].lastChild.nodeValue.trim(); 12 | 13 | td.setAttribute('data-name', name); 14 | td.setAttribute('role', 'gridcell'); 15 | } 16 | }); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /assets/style.css: -------------------------------------------------------------------------------- 1 | * { 2 | color: inherit; 3 | font-size: inherit; 4 | font-weight: inherit; 5 | line-height: inherit; 6 | text-decoration: none; 7 | } 8 | 9 | html { 10 | font: 300 20px/1.5 ".SFNSText-Regular", ".HelveticaNeueDeskInterface", ".LucidaGrandeUI", "Ubuntu", "Segoe UI", Helvetica, sans-serif; 11 | -ms-overflow-style: -ms-autohiding-scrollbar; 12 | text-rendering: optimizeLegibility; 13 | text-size-adjust: 100%; 14 | } 15 | 16 | body { 17 | margin: 0 1rem 5rem; 18 | padding: 0 calc(50% - (880px / 2)); 19 | } 20 | 21 | caption, td, th { 22 | padding: .5rem .75rem; 23 | } 24 | 25 | h2, table { 26 | margin: 3em 0 0; 27 | } 28 | 29 | section h3 { 30 | box-shadow: inset 0 -1px 0 0 #cccccc; 31 | margin-top: 2em; 32 | padding-bottom: .25em; 33 | } 34 | 35 | caption, h2 { 36 | font-size: 125%; 37 | font-weight: bold; 38 | text-align: left; 39 | } 40 | 41 | key, 42 | tbody th { 43 | font-family: Menlo, Monaco, Consolas, monospace; 44 | } 45 | 46 | h1 { 47 | font-size: 200%; 48 | font-weight: bold; 49 | } 50 | 51 | h1 + p { 52 | margin: -1em 0; 53 | } 54 | 55 | a { 56 | border-bottom: 1px solid; 57 | padding-bottom: 1px; 58 | color: #66D; 59 | } 60 | 61 | a:hover, 62 | a:focus { 63 | color: #900; 64 | } 65 | 66 | a:active { 67 | color: #000; 68 | } 69 | 70 | ul { 71 | padding-left: 2em; 72 | } 73 | 74 | li { 75 | margin: 0 0 1em; 76 | } 77 | 78 | blockquote { 79 | background-color: #ffc; 80 | border-radius: 1em; 81 | box-shadow: 0 0 5px 0 #88c; 82 | padding: .75em 2em; 83 | margin: 1em 0; 84 | } 85 | 86 | footer nav { 87 | margin: 5em 0; 88 | } 89 | 90 | nav ul { 91 | padding-left: 0; 92 | } 93 | 94 | nav li { 95 | display: inline-block; 96 | margin-right: 1em; 97 | } 98 | 99 | strong { 100 | font-weight: bold; 101 | } 102 | 103 | small { 104 | font-size: 80%; 105 | opacity: .675; 106 | } 107 | 108 | key { 109 | background-color: #f5f5f5; 110 | border-radius: .25em; 111 | color: #393; 112 | padding: .25em; 113 | font-size: 75%; 114 | } 115 | 116 | table { 117 | box-shadow: 0 1px 0 0 rgba(0,0,0,.05); 118 | border-collapse: collapse; 119 | width: 100%; 120 | } 121 | 122 | caption { 123 | margin-bottom: -2rem; 124 | } 125 | 126 | thead th { 127 | font-size: 80%; 128 | } 129 | 130 | tbody tr:nth-child(even) > * { 131 | background-color: rgba(0,0,64,.0375); 132 | } 133 | 134 | tbody th { 135 | font-size: 80%; 136 | text-align: left; 137 | width: 1%; 138 | white-space: nowrap; 139 | } 140 | 141 | tbody td { 142 | box-shadow: inset 1px 0 0 0 #FFF; 143 | font-weight: bold; 144 | text-align: center; 145 | } 146 | 147 | [aria-label="pass"]::after { 148 | color: #393; 149 | content: "✔"; 150 | } 151 | 152 | [aria-label="fail"]::after { 153 | color: #C33; 154 | content: "✖"; 155 | } 156 | 157 | [aria-label="yes"]::after { 158 | color: #393; 159 | content: "☑"; 160 | font-size: 1rem; 161 | } 162 | 163 | [aria-label="no"]::after { 164 | color: #C33; 165 | content: "☐"; 166 | font-size: 1rem; 167 | } 168 | 169 | @media screen and (max-width: 40em) { 170 | table, caption, tbody, tbody th, tbody td, tr { 171 | display: block; 172 | } 173 | 174 | caption { 175 | margin: 0; 176 | } 177 | 178 | thead { 179 | display: none; 180 | } 181 | 182 | tbody th { 183 | font-size: 60%; 184 | padding: 1em 1em 0; 185 | width: auto; 186 | } 187 | 188 | tbody td { 189 | padding: .5em 1em; 190 | text-align: right; 191 | } 192 | 193 | tbody td::before { 194 | content: attr(data-name); 195 | display: inline-block; 196 | font-size: 70%; 197 | font-weight: normal; 198 | margin-right: 1em; 199 | text-align: right; 200 | } 201 | 202 | tbody td::after { 203 | display: inline-block; 204 | width: 1em; 205 | } 206 | } 207 | 208 | p code, pre { 209 | background-color: #f5f5f5; 210 | border-radius: .25em; 211 | font-family: "Courier", "Consolas", monospace; 212 | } 213 | 214 | p code { 215 | display: inline-block; 216 | padding: .125em .25em; 217 | } 218 | 219 | pre { 220 | padding: .75em; 221 | } 222 | 223 | .announced { 224 | background-color: black; 225 | color: white; 226 | } 227 | 228 | ul.announced { 229 | border-radius: .25em; 230 | padding: .5em 2em; 231 | } 232 | 233 | ul.announced ~ p { 234 | padding: 0 .75rem; 235 | } 236 | 237 | q.announced { 238 | padding: .125em .25em; 239 | } 240 | 241 | q.announced::before, q.announced::after { 242 | content: ""; 243 | } 244 | 245 | .announced p, .announced li { 246 | margin: .25em 0; 247 | } 248 | -------------------------------------------------------------------------------- /hidden.html: -------------------------------------------------------------------------------- 1 | 2 |
is readable | 25 |is visible | 26 ||
---|---|---|
[aria-hidden] | 31 |32 | | |
[aria-hidden="true"] | 35 |36 | | |
[aria-hidden="false"] | 39 |40 | | |
[aria-hidden="nonsense"] | 43 |44 | | |
[hidden] | 47 |48 | | |
[hidden] [aria-hidden="false"] |
51 | 52 | | |
position: absolute; clip: rect(0 0 0 0); |
55 | 56 | |
65 | | Chrome 60 | 66 |Firefox 53 | 67 |Safari 9 | 68 |
---|---|---|---|
[aria-hidden] | 73 |74 | | ||
[aria-hidden="true"] | 77 |78 | | ||
[aria-hidden="false"] | 81 |82 | | ||
[aria-hidden="nonsense"] | 85 |86 | | ||
[hidden] | 89 |90 | | ||
[hidden] [aria-hidden="false"] |
93 | 94 | | ||
position: absolute; clip: rect(0 0 0 0); |
97 | 98 | |
107 | | Chrome 60 | 108 |Firefox 53 | 109 |Internet Explorer 11 | 110 |Edge 20 | 111 |
---|---|---|---|---|
[aria-hidden] | 116 |117 | | |||
[aria-hidden="true"] | 120 |121 | | |||
[aria-hidden="false"] | 124 |125 | | |||
[aria-hidden="nonsense"] | 128 |129 | | |||
[hidden] | 132 |133 | | |||
[hidden] [aria-hidden="false"] |
136 | 137 | | |||
position: absolute; clip: rect(0 0 0 0); |
140 | 141 | |
150 | | Chrome 60 | 151 |Firefox 53 | 152 |Internet Explorer 11 | 153 |Edge 20 | 154 |
---|---|---|---|---|
[aria-hidden] | 159 |160 | | |||
[aria-hidden="true"] | 163 |164 | | |||
[aria-hidden="false"] | 167 |168 | | |||
[aria-hidden="nonsense"] | 171 |172 | | |||
[hidden] | 175 |176 | | |||
[hidden] [aria-hidden="false"] |
179 | 180 | | |||
position: absolute; clip: rect(0 0 0 0); |
183 | 184 | |
193 | | Chrome 60 | 194 |Firefox 53 | 195 |Internet Explorer 11 | 196 |Edge 20 | 197 |
---|---|---|---|---|
[aria-hidden] | 202 |203 | | |||
[aria-hidden="true"] | 206 |207 | | |||
[aria-hidden="false"] | 210 |211 | | |||
[aria-hidden="nonsense"] | 214 |215 | | |||
[hidden] | 218 |219 | | |||
[hidden] [aria-hidden="false"] |
222 | 223 | | |||
position: absolute; clip: rect(0 0 0 0); |
226 | 227 | |
236 | | Chrome 60 | 237 |Firefox 53 | 238 |Internet Explorer 11 | 239 |Edge 20 | 240 |
---|---|---|---|---|
[aria-hidden] | 245 |246 | | |||
[aria-hidden="true"] | 249 |250 | | |||
[aria-hidden="false"] | 253 |254 | | |||
[aria-hidden="nonsense"] | 257 |258 | | |||
[hidden] | 261 |262 | | |||
[hidden] [aria-hidden="false"] |
265 | 266 | | |||
position: absolute; clip: rect(0 0 0 0); |
269 | 270 | |
279 | | Mac OS | 280 |Windows | 281 |
---|---|---|
[aria-hidden] | 286 |287 | | |
[aria-hidden="true"] | 290 |291 | | |
[aria-hidden="false"] | 294 |295 | | |
[aria-hidden="nonsense"] | 298 |299 | | |
[hidden] | 302 |303 | | |
[hidden] [aria-hidden="false"] |
306 | 307 | | |
position: absolute; clip: rect(0 0 0 0); |
310 | 311 | |
316 | The Mac OS and Windows flagship browsers pass all tests with at least one AT. 317 |
318 | 319 |320 | While limited to Chrome, ChromeVox may be the only cross-platform AT, and it passes all tests. 321 |
322 | 323 |324 | VoiceOver for iOS appears to produce the same results as VoiceOver for Mac OS. 325 |
326 | 327 |328 | At this time, JAWS does not work with Edge. 329 |
330 | 331 | 341 | 342 | 343 | -------------------------------------------------------------------------------- /howto.html: -------------------------------------------------------------------------------- 1 | 2 |13 | To test across multiple operating systems, a virtual machine monitor may be required. 14 | If this is the case, download and run the VirtualBox installer. 15 |
16 |17 | To test Mac OS from another operating system, review this guide to installing Mac OS as a Virtual Machine. 18 |
19 |20 | To test Windows from another operating system, download one of the many free Windows virtual machines from Microsoft. 21 |
22 |27 | To test Safari for Mac OS, run the pre-installed application. 28 |
29 |30 | To test Edge or Internet Explorer for Windows, run one of the pre-installed applications. 31 |
32 |33 | To test Chrome from any operating system, download the Chrome installer. 34 |
35 |36 | To test Firefox for any operating system, download the Firefox installer. 37 |
38 |39 | To test Opera for any operating system, download the Opera installer. 40 |
41 |46 | To test VoiceOver for Mac OS, run the pre-installed application. 47 |
48 |
49 | To begin using VoiceOver on Mac OS, press
52 | When using VoiceOver with Chrome or Safari, you can enter the page by pressing
58 | To test with JAWS for Windows, download and run the JAWS installer. 59 |
60 |
61 | When using JAWS with Edge, you can enter the page by pressing
67 | To test with NVDA for Windows, download and run the NVDA installer. 68 |
69 |70 | To test with Windows Eyes for Windows, download and run the Windows Eyes installer. 71 |
72 |73 | When using JAWS, NVDA, or Windows Eyes, load the page and it should be read aloud to you. 74 |
75 |11 | RAT (Results from Assistive Technology) is a collection of markup patterns and how they are handled by different assistive technology. 12 |
13 | 14 | 21 | 22 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /media.html: -------------------------------------------------------------------------------- 1 | 2 |<audio>
without controls
<audio src="">22 |
23 | An <audio>
without controls is not announced in any browser.
24 | This is expected per HTML: Embedded content: User interface, which states;
25 |
27 |28 | This user interface should include features to begin playback, pause playback, seek to an arbitrary position in the content (if the content supports arbitrary seeking), change the volume, change the display of closed captions or embedded sign-language tracks, select different audio tracks or turn on audio descriptions, and show the media content in manners more suitable to the user (e.g., fullscreen video or in an independent resizable window). 29 | Other controls may also be made available. 30 |
31 |
<audio>
with controls
<audio src="" controls>36 |
50 | Narrator announces space
and M
because they are keyboard controls to play or pause the audio, and to mute or unmute the audio.
51 |
53 | Narrator announces the slash
in phrases like time elapsed / skip back
.
54 |
70 | JAWS curiously announces period
and semicolon
, yet they are not keyboard controls.
71 | JAWS announces M
because it is a keyboard control to mute or unmute the audio.
72 |
in audio toolbar, 6 items 79 |
89 | VoiceOver announces the current and remaining time as zero, zero zero
and slash, seven, twenty-nine
.
90 |
92 | VoiceOver navigation cannot access volume controls.
93 | However, volume controls may be tabbed into, and then they are announced as 1, audio control
, where 1
is the audio volume on a scale of 0
to 1
.
94 |
<video>
without controls
<video src="">101 |
103 | A <video>
without controls is not announced by Narrator or JAWS.
104 | This is probably expected per HTML: Embedded content: User interface.
105 |
114 | VoiceOver curiously announces <video src="">
as two toolbars with no content inside of them.
115 |
<video>
with controls
<video src="" controls>122 |
137 | Narrator announces space
and M
because they are keyboard controls to play or pause the video, and to mute or unmute the audio.
138 |
140 | Narrator announces the slash
in phrases like time elapsed / skip back
.
141 |
158 | JAWS curiously announces period
and semicolon
, yet they are not keyboard controls.
159 | JAWS announces M
because it is a keyboard control to mute or unmute the audio.
160 |
in video toolbar, 6 items 168 |
179 | VoiceOver curious announces the video canvas as a toolbar with no content inside of it. 180 |
181 |
182 | VoiceOver announces the current and remaining time as zero, zero zero
and slash, seven, twenty-nine
.
183 |
185 | VoiceOver navigation cannot access volume controls.
186 | However, volume controls may be tabbed into, and then they are announced as 1, audio control
, where 1
is the audio volume on a scale of 0
to 1
.
187 |
189 | VoiceOver loses access to controls after they visually disappear upon entering fullscreen. 190 |
191 |10 | ARIA hidden has no value. 11 |
12 | 13 | 16 | 17 |18 | ARIA hidden is false. 19 |
20 | 21 |22 | ARIA hidden is nonsense. 23 |
24 | 25 |26 | Hidden is defined. 27 |
28 | 29 |30 | ARIA hidden is false and hidden is defined. 31 |
32 | 33 |34 | Element is visibly hidden. 35 |
36 | -------------------------------------------------------------------------------- /tests/label.html: -------------------------------------------------------------------------------- 1 | 2 |