├── 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 | Hidden Content Results - RAT 3 | 4 | 5 | 6 | 7 | 8 |

Hidden Content Results - RAT

9 | 10 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 35 | 37 | 38 | 39 | 41 | 42 | 43 | 45 | 46 | 47 | 49 | 50 | 51 | 53 | 54 | 55 | 57 | 58 |
Markup Expectations
is readableis visible
[aria-hidden] 32 |
[aria-hidden="true"] 36 |
[aria-hidden="false"] 40 |
[aria-hidden="nonsense"] 44 |
[hidden] 48 |
[hidden]
[aria-hidden="false"]
52 |
position: absolute;
clip: rect(0 0 0 0);
56 |
59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 75 | 76 | 77 | 79 | 80 | 81 | 83 | 84 | 85 | 87 | 88 | 89 | 91 | 92 | 93 | 95 | 96 | 97 | 99 | 100 |
VoiceOver 7
Chrome 60Firefox 53Safari 9
[aria-hidden] 74 |
[aria-hidden="true"] 78 |
[aria-hidden="false"] 82 |
[aria-hidden="nonsense"] 86 |
[hidden] 90 |
[hidden]
[aria-hidden="false"]
94 |
position: absolute;
clip: rect(0 0 0 0);
98 |
101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 118 | 119 | 120 | 122 | 123 | 124 | 126 | 127 | 128 | 130 | 131 | 132 | 134 | 135 | 136 | 138 | 139 | 140 | 142 | 143 |
NVDA 2015.3
Chrome 60Firefox 53Internet Explorer 11Edge 20
[aria-hidden] 117 |
[aria-hidden="true"] 121 |
[aria-hidden="false"] 125 |
[aria-hidden="nonsense"] 129 |
[hidden] 133 |
[hidden]
[aria-hidden="false"]
137 |
position: absolute;
clip: rect(0 0 0 0);
141 |
144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 161 | 162 | 163 | 165 | 166 | 167 | 169 | 170 | 171 | 173 | 174 | 175 | 177 | 178 | 179 | 181 | 182 | 183 | 185 | 186 |
JAWS 16
Chrome 60Firefox 53Internet Explorer 11Edge 20
[aria-hidden] 160 |
[aria-hidden="true"] 164 |
[aria-hidden="false"] 168 |
[aria-hidden="nonsense"] 172 |
[hidden] 176 |
[hidden]
[aria-hidden="false"]
180 |
position: absolute;
clip: rect(0 0 0 0);
184 |
187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 204 | 205 | 206 | 208 | 209 | 210 | 212 | 213 | 214 | 216 | 217 | 218 | 220 | 221 | 222 | 224 | 225 | 226 | 228 | 229 |
Narrator 10
Chrome 60Firefox 53Internet Explorer 11Edge 20
[aria-hidden] 203 |
[aria-hidden="true"] 207 |
[aria-hidden="false"] 211 |
[aria-hidden="nonsense"] 215 |
[hidden] 219 |
[hidden]
[aria-hidden="false"]
223 |
position: absolute;
clip: rect(0 0 0 0);
227 |
230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 247 | 248 | 249 | 251 | 252 | 253 | 255 | 256 | 257 | 259 | 260 | 261 | 263 | 264 | 265 | 267 | 268 | 269 | 271 | 272 |
Windows Eyes 9
Chrome 60Firefox 53Internet Explorer 11Edge 20
[aria-hidden] 246 |
[aria-hidden="true"] 250 |
[aria-hidden="false"] 254 |
[aria-hidden="nonsense"] 258 |
[hidden] 262 |
[hidden]
[aria-hidden="false"]
266 |
position: absolute;
clip: rect(0 0 0 0);
270 |
273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 288 | 289 | 290 | 292 | 293 | 294 | 296 | 297 | 298 | 300 | 301 | 302 | 304 | 305 | 306 | 308 | 309 | 310 | 312 | 313 |
ChromeVox
Mac OSWindows
[aria-hidden] 287 |
[aria-hidden="true"] 291 |
[aria-hidden="false"] 295 |
[aria-hidden="nonsense"] 299 |
[hidden] 303 |
[hidden]
[aria-hidden="false"]
307 |
position: absolute;
clip: rect(0 0 0 0);
311 |
314 | 315 |

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 | How to test Assistive Technology 3 | 4 | 5 | 6 | 7 | 8 |

How to test ATs

9 | 10 |
11 |

Virtual Machines

12 |

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 |
23 | 24 |
25 |

Browsers

26 |

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 |
42 | 43 |
44 |

Assistive Technologies

45 |

46 | To test VoiceOver for Mac OS, run the pre-installed application. 47 |

48 |

49 | To begin using VoiceOver on Mac OS, press Command + F5. 50 |

51 |

52 | When using VoiceOver with Chrome or Safari, you can enter the page by pressing Control + Options + Shift + Down. 53 | This will take you to the first readable item. 54 | To move around the page, hold Control + Option and press the left or right arrow keys. 55 | To move between individual words, hold Option and press the left or right arrow keys. 56 |

57 |

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 Control + Options + Shift + Down. 62 | This will take you to the first readable item. 63 | To move around the page, hold Control + Option and press the left or right arrow keys. 64 | To move between individual words, hold Option and press the left or right arrow keys. 65 |

66 |

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 |
76 | 77 | 78 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | RAT: Results from Assistive Technology 3 | 4 | 5 | 6 | 7 | 8 |

RAT

9 | 10 |

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 | Media Element Results - RAT 3 | 4 | 5 | 6 | 7 | 8 |

Media Element Results - RAT

9 | 10 | 18 | 19 |
20 |

<audio> without controls

21 |
<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 |

26 |
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 |
32 | 33 |
34 |

<audio> with controls

35 |
<audio src="" controls>
36 |
37 |

How it’s announced by Narrator:

38 | 49 |

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 |

52 |

53 | Narrator announces the slash in phrases like time elapsed / skip back. 54 |

55 |
56 |
57 |

How it’s announced by JAWS:

58 | 69 |

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 |

73 |
74 |
75 |

How it’s announced by VoiceOver:

76 | 88 |

89 | VoiceOver announces the current and remaining time as zero, zero zero and slash, seven, twenty-nine. 90 |

91 |

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 |

95 |
96 |
97 | 98 |
99 |

<video> without controls

100 |
<video src="">
101 |
102 |

103 | A <video> without controls is not announced by Narrator or JAWS. 104 | This is probably expected per HTML: Embedded content: User interface. 105 |

106 |
107 |
108 |

How it’s announced in VoiceOver:

109 | 113 |

114 | VoiceOver curiously announces <video src=""> as two toolbars with no content inside of them. 115 |

116 |
117 |
118 | 119 |
120 |

<video> with controls

121 |
<video src="" controls>
122 |
123 |

How it’s announced in Narrator:

124 | 136 |

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 |

139 |

140 | Narrator announces the slash in phrases like time elapsed / skip back. 141 |

142 |
143 |
144 |

How it’s announced in JAWS:

145 | 157 |

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 |

161 |
162 |
163 |

How it’s announced in VoiceOver:

164 | 178 |

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 |

184 |

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 |

188 |

189 | VoiceOver loses access to controls after they visually disappear upon entering fullscreen. 190 |

191 |
192 |
193 | 194 | 204 | 205 | 206 | -------------------------------------------------------------------------------- /tests/figure.html: -------------------------------------------------------------------------------- 1 | 2 | Test: Figure Content 3 | 4 | 5 | 6 | 7 | 46 | 47 |
48 | 49 |
50 | Photo by Jane Smith 51 | A beautiful photo. 52 |
53 |
54 | -------------------------------------------------------------------------------- /tests/hidden.html: -------------------------------------------------------------------------------- 1 | 2 | Test - Hidden Content 3 | 4 | 5 | 6 | 7 |

Test - Hidden Content

8 | 9 |

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 | 28 | 29 | 32 | 33 |

34 | Element is visibly hidden. 35 |

36 | -------------------------------------------------------------------------------- /tests/label.html: -------------------------------------------------------------------------------- 1 | 2 | Test: Inputs 3 | 4 | 5 | 6 | 7 |
8 |

9 | 10 | 11 |

12 | 56 | 57 |

58 | 59 | 60 |

61 | 82 | 83 |

84 | 85 | 86 |

87 | 130 | 131 |

132 | 133 | 134 |

135 | 178 | 179 |

180 | 181 | 182 |

183 | 219 | 220 |

221 | 222 | 223 |

224 | 260 |
261 | -------------------------------------------------------------------------------- /tests/media.html: -------------------------------------------------------------------------------- 1 | 2 | Test - Media Elements 3 | 4 | 5 | 6 | 7 |

Test - Media Elements

8 | 9 |

Audio Element without controls

10 | 11 | 12 | 13 |

Audio Element with controls

14 | 15 | 16 | 17 |

Video Element with controls

18 | 19 | 20 | 21 |

Video Element with controls

22 | 23 | 24 | --------------------------------------------------------------------------------